summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/DocBook/80211.tmpl371
-rw-r--r--Documentation/DocBook/Makefile2
-rw-r--r--Documentation/DocBook/mac80211.tmpl337
-rw-r--r--Documentation/arm/00-INDEX2
-rw-r--r--Documentation/arm/SA1100/FreeBird4
-rw-r--r--Documentation/arm/swp_emulation27
-rw-r--r--Documentation/kernel-parameters.txt2
-rw-r--r--Documentation/x86/x86_64/kernel-stacks6
-rw-r--r--MAINTAINERS63
-rw-r--r--arch/arm/Makefile3
-rw-r--r--arch/arm/configs/omap_4430sdp_defconfig3
-rw-r--r--arch/arm/configs/tegra_defconfig1095
-rw-r--r--arch/arm/include/asm/assembler.h13
-rw-r--r--arch/arm/include/asm/cacheflush.h9
-rw-r--r--arch/arm/include/asm/domain.h31
-rw-r--r--arch/arm/include/asm/futex.h9
-rw-r--r--arch/arm/include/asm/pgtable.h29
-rw-r--r--arch/arm/include/asm/ptrace.h17
-rw-r--r--arch/arm/include/asm/smp_plat.h4
-rw-r--r--arch/arm/include/asm/tlbflush.h12
-rw-r--r--arch/arm/include/asm/traps.h2
-rw-r--r--arch/arm/include/asm/uaccess.h16
-rw-r--r--arch/arm/include/asm/unistd.h1
-rw-r--r--arch/arm/kernel/Makefile1
-rw-r--r--arch/arm/kernel/calls.S1
-rw-r--r--arch/arm/kernel/entry-armv.S4
-rw-r--r--arch/arm/kernel/fiq.c5
-rw-r--r--arch/arm/kernel/kgdb.c2
-rw-r--r--arch/arm/kernel/swp_emulate.c260
-rw-r--r--arch/arm/kernel/traps.c14
-rw-r--r--arch/arm/lib/getuser.S13
-rw-r--r--arch/arm/lib/putuser.S29
-rw-r--r--arch/arm/lib/uaccess.S83
-rw-r--r--arch/arm/mach-aaec2000/core.c2
-rw-r--r--arch/arm/mach-at91/at91rm9200_time.c2
-rw-r--r--arch/arm/mach-at91/at91sam926x_time.c2
-rw-r--r--arch/arm/mach-bcmring/core.c2
-rw-r--r--arch/arm/mach-clps711x/time.c2
-rw-r--r--arch/arm/mach-cns3xxx/core.c2
-rw-r--r--arch/arm/mach-davinci/devices.c13
-rw-r--r--arch/arm/mach-ebsa110/core.c2
-rw-r--r--arch/arm/mach-ep93xx/core.c8
-rw-r--r--arch/arm/mach-footbridge/dc21285-timer.c2
-rw-r--r--arch/arm/mach-footbridge/isa-timer.c2
-rw-r--r--arch/arm/mach-h720x/cpu-h7201.c2
-rw-r--r--arch/arm/mach-h720x/cpu-h7202.c2
-rw-r--r--arch/arm/mach-imx/Kconfig9
-rw-r--r--arch/arm/mach-imx/Makefile1
-rw-r--r--arch/arm/mach-imx/mach-imx27_visstrim_m10.c263
-rw-r--r--arch/arm/mach-integrator/integrator_ap.c2
-rw-r--r--arch/arm/mach-ixp2000/core.c2
-rw-r--r--arch/arm/mach-ixp23xx/core.c2
-rw-r--r--arch/arm/mach-ixp4xx/common.c2
-rw-r--r--arch/arm/mach-kirkwood/common.c6
-rw-r--r--arch/arm/mach-lh7a40x/time.c2
-rw-r--r--arch/arm/mach-mmp/time.c2
-rw-r--r--arch/arm/mach-mx25/eukrea_mbimxsd-baseboard.c2
-rw-r--r--arch/arm/mach-mx25/mach-cpuimx25.c4
-rw-r--r--arch/arm/mach-mx3/clock-imx31.c4
-rw-r--r--arch/arm/mach-mx3/clock-imx35.c4
-rw-r--r--arch/arm/mach-mx3/devices.c4
-rw-r--r--arch/arm/mach-mx3/eukrea_mbimxsd-baseboard.c2
-rw-r--r--arch/arm/mach-mx3/mach-cpuimx35.c4
-rw-r--r--arch/arm/mach-netx/time.c2
-rw-r--r--arch/arm/mach-ns9xxx/irq.c3
-rw-r--r--arch/arm/mach-ns9xxx/time-ns9360.c2
-rw-r--r--arch/arm/mach-nuc93x/time.c2
-rw-r--r--arch/arm/mach-omap1/devices.c26
-rw-r--r--arch/arm/mach-omap1/time.c2
-rw-r--r--arch/arm/mach-omap1/timer32k.c2
-rw-r--r--arch/arm/mach-omap2/Makefile1
-rw-r--r--arch/arm/mach-omap2/board-n8x0.c49
-rw-r--r--arch/arm/mach-omap2/board-omap4panda.c2
-rw-r--r--arch/arm/mach-omap2/board-rx51-peripherals.c13
-rw-r--r--arch/arm/mach-omap2/board-zoom2.c28
-rw-r--r--arch/arm/mach-omap2/clock3xxx_data.c14
-rw-r--r--arch/arm/mach-omap2/devices.c39
-rw-r--r--arch/arm/mach-omap2/id.c2
-rw-r--r--arch/arm/mach-omap2/include/mach/board-zoom.h2
-rw-r--r--arch/arm/mach-omap2/include/mach/entry-macro.S6
-rw-r--r--arch/arm/mach-omap2/mux.c2
-rw-r--r--arch/arm/mach-omap2/omap-iommu.c2
-rw-r--r--arch/arm/mach-omap2/omap-smp.c3
-rw-r--r--arch/arm/mach-omap2/pm34xx.c4
-rw-r--r--arch/arm/mach-omap2/timer-gp.c2
-rw-r--r--arch/arm/mach-pnx4008/time.c2
-rw-r--r--arch/arm/mach-pxa/devices.c25
-rw-r--r--arch/arm/mach-pxa/devices.h6
-rw-r--r--arch/arm/mach-pxa/pxa27x.c4
-rw-r--r--arch/arm/mach-pxa/pxa3xx.c5
-rw-r--r--arch/arm/mach-pxa/time.c2
-rw-r--r--arch/arm/mach-pxa/zylonite.c11
-rw-r--r--arch/arm/mach-s3c64xx/dev-audio.c13
-rw-r--r--arch/arm/mach-s3c64xx/dev-ts.c61
-rw-r--r--arch/arm/mach-s3c64xx/mach-smdk6410.c6
-rw-r--r--arch/arm/mach-sa1100/time.c2
-rw-r--r--arch/arm/mach-shark/core.c2
-rw-r--r--arch/arm/mach-shmobile/Makefile2
-rw-r--r--arch/arm/mach-shmobile/board-ap4evb.c52
-rw-r--r--arch/arm/mach-shmobile/clock-sh7372.c8
-rw-r--r--arch/arm/mach-shmobile/pm_runtime.c169
-rw-r--r--arch/arm/mach-u300/timer.c2
-rw-r--r--arch/arm/mach-w90x900/time.c2
-rw-r--r--arch/arm/mm/Kconfig43
-rw-r--r--arch/arm/mm/cache-l2x0.c15
-rw-r--r--arch/arm/mm/copypage-v4mc.c2
-rw-r--r--arch/arm/mm/copypage-v6.c2
-rw-r--r--arch/arm/mm/copypage-xscale.c2
-rw-r--r--arch/arm/mm/dma-mapping.c6
-rw-r--r--arch/arm/mm/fault-armv.c8
-rw-r--r--arch/arm/mm/flush.c46
-rw-r--r--arch/arm/mm/mmu.c20
-rw-r--r--arch/arm/mm/proc-macros.S7
-rw-r--r--arch/arm/mm/proc-v7.S9
-rw-r--r--arch/arm/plat-iop/time.c2
-rw-r--r--arch/arm/plat-mxc/audmux-v2.c4
-rw-r--r--arch/arm/plat-mxc/include/mach/eukrea-baseboards.h4
-rw-r--r--arch/arm/plat-mxc/time.c2
-rw-r--r--arch/arm/plat-omap/gpio.c4
-rw-r--r--arch/arm/plat-omap/include/plat/mcbsp.h7
-rw-r--r--arch/arm/plat-omap/include/plat/smp.h7
-rw-r--r--arch/arm/plat-s3c24xx/devs.c30
-rw-r--r--arch/arm/plat-samsung/include/plat/devs.h2
-rw-r--r--arch/arm/plat-samsung/time.c2
-rw-r--r--arch/arm/plat-versatile/timer-sp.c2
-rw-r--r--arch/blackfin/include/asm/bitops.h17
-rw-r--r--arch/blackfin/kernel/time-ts.c6
-rw-r--r--arch/blackfin/mach-bf527/boards/ezkit.c2
-rw-r--r--arch/blackfin/mach-bf537/boards/stamp.c2
-rw-r--r--arch/ia64/kernel/time.c2
-rw-r--r--arch/m68k/include/asm/ide.h13
-rw-r--r--arch/m68knommu/kernel/process.c10
-rw-r--r--arch/microblaze/Kconfig17
-rw-r--r--arch/microblaze/include/asm/page.h3
-rw-r--r--arch/microblaze/include/asm/prom.h1
-rw-r--r--arch/microblaze/include/asm/seccomp.h16
-rw-r--r--arch/microblaze/include/asm/setup.h6
-rw-r--r--arch/microblaze/include/asm/thread_info.h20
-rw-r--r--arch/microblaze/kernel/entry.S23
-rw-r--r--arch/microblaze/kernel/exceptions.c8
-rw-r--r--arch/microblaze/kernel/kgdb.c3
-rw-r--r--arch/microblaze/kernel/setup.c6
-rw-r--r--arch/microblaze/kernel/timer.c2
-rw-r--r--arch/microblaze/platform/generic/system.dts1
-rw-r--r--arch/parisc/kernel/irq.c2
-rw-r--r--arch/powerpc/boot/dts/mpc8610_hpcd.dts1
-rw-r--r--arch/powerpc/include/asm/fsl_guts.h (renamed from arch/powerpc/include/asm/immap_86xx.h)111
-rw-r--r--arch/powerpc/platforms/cell/interrupt.c5
-rw-r--r--arch/sh/Kconfig5
-rw-r--r--arch/sh/boards/Kconfig16
-rw-r--r--arch/sh/boards/Makefile2
-rw-r--r--arch/sh/boards/board-sh2007.c133
-rw-r--r--arch/sh/boards/board-sh7757lcr.c374
-rw-r--r--arch/sh/configs/sh2007_defconfig1357
-rw-r--r--arch/sh/configs/sh7757lcr_defconfig1126
-rw-r--r--arch/sh/drivers/dma/dma-api.c4
-rw-r--r--arch/sh/drivers/pci/pci-sh7751.c2
-rw-r--r--arch/sh/drivers/pci/pci-sh7780.c2
-rw-r--r--arch/sh/drivers/pci/pcie-sh7786.c2
-rw-r--r--arch/sh/include/asm/Kbuild2
-rw-r--r--arch/sh/include/asm/elf.h27
-rw-r--r--arch/sh/include/asm/fixmap.h4
-rw-r--r--arch/sh/include/asm/irq.h2
-rw-r--r--arch/sh/include/asm/kprobes.h1
-rw-r--r--arch/sh/include/asm/processor_32.h3
-rw-r--r--arch/sh/include/asm/processor_64.h3
-rw-r--r--arch/sh/include/asm/ptrace.h169
-rw-r--r--arch/sh/include/asm/ptrace_32.h83
-rw-r--r--arch/sh/include/asm/ptrace_64.h20
-rw-r--r--arch/sh/include/asm/system_32.h13
-rw-r--r--arch/sh/include/asm/tlbflush.h2
-rw-r--r--arch/sh/include/asm/unistd_32.h5
-rw-r--r--arch/sh/include/asm/unistd_64.h5
-rw-r--r--arch/sh/include/cpu-sh4/cpu/sh7757.h301
-rw-r--r--arch/sh/include/mach-common/mach/sh2007.h117
-rw-r--r--arch/sh/kernel/Makefile2
-rw-r--r--arch/sh/kernel/cpu/sh4/probe.c2
-rw-r--r--arch/sh/kernel/cpu/sh4a/clock-sh7757.c199
-rw-r--r--arch/sh/kernel/cpu/sh4a/pinmux-sh7757.c1582
-rw-r--r--arch/sh/kernel/cpu/sh4a/setup-sh7724.c66
-rw-r--r--arch/sh/kernel/cpu/sh4a/setup-sh7757.c222
-rw-r--r--arch/sh/kernel/kprobes.c100
-rw-r--r--arch/sh/kernel/process_32.c3
-rw-r--r--arch/sh/kernel/ptrace.c33
-rw-r--r--arch/sh/kernel/ptrace_32.c27
-rw-r--r--arch/sh/kernel/ptrace_64.c79
-rw-r--r--arch/sh/kernel/reboot.c4
-rw-r--r--arch/sh/kernel/syscalls_32.S3
-rw-r--r--arch/sh/kernel/syscalls_64.S3
-rw-r--r--arch/sh/mm/consistent.c3
-rw-r--r--arch/sh/mm/init.c52
-rw-r--r--arch/sh/mm/nommu.c4
-rw-r--r--arch/sh/mm/tlbflush_32.c16
-rw-r--r--arch/sh/mm/tlbflush_64.c5
-rw-r--r--arch/sh/tools/mach-types2
-rw-r--r--arch/sparc/include/asm/fb.h4
-rw-r--r--arch/sparc/include/asm/unistd.h5
-rw-r--r--arch/sparc/kernel/sys32.S9
-rw-r--r--arch/sparc/kernel/systbls_32.S3
-rw-r--r--arch/sparc/kernel/systbls_64.S6
-rw-r--r--arch/x86/Kconfig2
-rw-r--r--arch/x86/Kconfig.debug10
-rw-r--r--arch/x86/include/asm/apb_timer.h1
-rw-r--r--arch/x86/include/asm/cpu.h1
-rw-r--r--arch/x86/include/asm/irq.h12
-rw-r--r--arch/x86/include/asm/module.h7
-rw-r--r--arch/x86/include/asm/page_32_types.h4
-rw-r--r--arch/x86/include/asm/pci.h6
-rw-r--r--arch/x86/kernel/apb_timer.c2
-rw-r--r--arch/x86/kernel/apic/io_apic.c12
-rw-r--r--arch/x86/kernel/cpu/amd.c2
-rw-r--r--arch/x86/kernel/cpu/common.c2
-rw-r--r--arch/x86/kernel/cpu/intel.c2
-rw-r--r--arch/x86/kernel/i387.c7
-rw-r--r--arch/x86/kernel/irq_32.c8
-rw-r--r--arch/x86/kernel/kgdb.c2
-rw-r--r--arch/x86/kernel/process.c1
-rw-r--r--arch/x86/kernel/reboot.c2
-rw-r--r--arch/x86/kernel/setup.c1
-rw-r--r--arch/x86/kernel/setup_percpu.c2
-rw-r--r--arch/x86/kernel/time.c2
-rw-r--r--arch/x86/kvm/i8254.c2
-rw-r--r--arch/x86/kvm/x86.c4
-rw-r--r--arch/x86/mm/k8topology_64.c6
-rw-r--r--arch/xtensa/Kconfig17
-rw-r--r--arch/xtensa/Makefile5
-rw-r--r--arch/xtensa/boot/Makefile1
-rw-r--r--arch/xtensa/include/asm/coprocessor.h9
-rw-r--r--arch/xtensa/include/asm/io.h40
-rw-r--r--arch/xtensa/include/asm/irq.h7
-rw-r--r--arch/xtensa/include/asm/serial.h12
-rw-r--r--arch/xtensa/include/asm/uaccess.h2
-rw-r--r--arch/xtensa/kernel/Makefile4
-rw-r--r--arch/xtensa/kernel/time.c2
-rw-r--r--arch/xtensa/platforms/xtavnet/Makefile10
-rw-r--r--arch/xtensa/platforms/xtavnet/include/platform/hardware.h85
-rw-r--r--arch/xtensa/platforms/xtavnet/include/platform/lcd.h22
-rw-r--r--arch/xtensa/platforms/xtavnet/include/platform/serial.h1
-rw-r--r--arch/xtensa/platforms/xtavnet/lcd.c79
-rw-r--r--arch/xtensa/platforms/xtavnet/setup.c269
-rw-r--r--block/blk-core.c2
-rw-r--r--crypto/Kconfig8
-rw-r--r--crypto/ahash.c7
-rw-r--r--crypto/algboss.c8
-rw-r--r--crypto/testmgr.c4
-rw-r--r--drivers/Makefile3
-rw-r--r--drivers/ata/libata-core.c54
-rw-r--r--drivers/ata/libata-eh.c4
-rw-r--r--drivers/ata/libata-sff.c37
-rw-r--r--drivers/ata/pata_bf54x.c2
-rw-r--r--drivers/ata/sata_dwc_460ex.c4
-rw-r--r--drivers/ata/sata_fsl.c8
-rw-r--r--drivers/ata/sata_mv.c25
-rw-r--r--drivers/ata/sata_nv.c57
-rw-r--r--drivers/atm/iphase.c2
-rw-r--r--drivers/base/core.c2
-rw-r--r--drivers/block/Kconfig16
-rw-r--r--drivers/block/Makefile1
-rw-r--r--drivers/block/aoe/aoecmd.c8
-rw-r--r--drivers/block/rbd.c1844
-rw-r--r--drivers/block/rbd_types.h73
-rw-r--r--drivers/char/hw_random/n2-drv.c2
-rw-r--r--drivers/char/keyboard.c37
-rw-r--r--drivers/char/vt.c11
-rw-r--r--drivers/clocksource/sh_cmt.c15
-rw-r--r--drivers/clocksource/sh_mtu2.c3
-rw-r--r--drivers/clocksource/sh_tmu.c3
-rw-r--r--drivers/cpufreq/cpufreq.c4
-rw-r--r--drivers/dma/Kconfig8
-rw-r--r--drivers/dma/Makefile1
-rw-r--r--drivers/dma/amba-pl08x.c2025
-rw-r--r--drivers/dma/shdma.c3
-rw-r--r--drivers/firewire/net.c13
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c2
-rw-r--r--drivers/hid/Kconfig6
-rw-r--r--drivers/hid/Makefile1
-rw-r--r--drivers/hid/hid-apple.c7
-rw-r--r--drivers/hid/hid-cherry.c7
-rw-r--r--drivers/hid/hid-core.c6
-rw-r--r--drivers/hid/hid-cypress.c9
-rw-r--r--drivers/hid/hid-egalax.c9
-rw-r--r--drivers/hid/hid-elecom.c7
-rw-r--r--drivers/hid/hid-ids.h3
-rw-r--r--drivers/hid/hid-input.c4
-rw-r--r--drivers/hid/hid-kye.c7
-rw-r--r--drivers/hid/hid-lg.c9
-rw-r--r--drivers/hid/hid-microsoft.c7
-rw-r--r--drivers/hid/hid-monterey.c7
-rw-r--r--drivers/hid/hid-ortek.c7
-rw-r--r--drivers/hid/hid-petalynx.c7
-rw-r--r--drivers/hid/hid-picolcd.c4
-rw-r--r--drivers/hid/hid-prodikeys.c7
-rw-r--r--drivers/hid/hid-samsung.c20
-rw-r--r--drivers/hid/hid-sony.c7
-rw-r--r--drivers/hid/hid-sunplus.c7
-rw-r--r--drivers/hid/hid-uclogic.c404
-rw-r--r--drivers/hid/hid-zydacron.c7
-rw-r--r--drivers/hid/usbhid/hid-quirks.c3
-rw-r--r--drivers/hid/usbhid/hiddev.c11
-rw-r--r--drivers/hwmon/ads7871.c12
-rw-r--r--drivers/hwmon/coretemp.c1
-rw-r--r--drivers/i2c/busses/i2c-sh_mobile.c23
-rw-r--r--drivers/ieee1394/eth1394.c16
-rw-r--r--drivers/ieee1394/ohci1394.c2
-rw-r--r--drivers/infiniband/hw/cxgb4/cm.c2
-rw-r--r--drivers/infiniband/hw/cxgb4/cq.c4
-rw-r--r--drivers/infiniband/hw/cxgb4/mem.c2
-rw-r--r--drivers/infiniband/hw/cxgb4/qp.c6
-rw-r--r--drivers/infiniband/hw/nes/nes_verbs.c12
-rw-r--r--drivers/input/misc/twl4030-vibra.c4
-rw-r--r--drivers/isdn/hisax/hfc_sx.c13
-rw-r--r--drivers/isdn/mISDN/dsp_cmx.c1
-rw-r--r--drivers/isdn/mISDN/l1oip_core.c2
-rw-r--r--drivers/media/video/zoran/videocodec.h2
-rw-r--r--drivers/mfd/twl-core.c6
-rw-r--r--drivers/mfd/twl4030-codec.c8
-rw-r--r--drivers/net/Kconfig14
-rw-r--r--drivers/net/Makefile1
-rw-r--r--drivers/net/amd8111e.c4
-rw-r--r--drivers/net/arm/am79c961a.c35
-rw-r--r--drivers/net/arm/am79c961a.h1
-rw-r--r--drivers/net/bmac.c7
-rw-r--r--drivers/net/bnx2x/bnx2x_cmn.c20
-rw-r--r--drivers/net/bnx2x/bnx2x_cmn.h9
-rw-r--r--drivers/net/bnx2x/bnx2x_link.c10
-rw-r--r--drivers/net/bnx2x/bnx2x_main.c26
-rw-r--r--drivers/net/cnic.c2
-rw-r--r--drivers/net/cpmac.c35
-rw-r--r--drivers/net/depca.c2
-rw-r--r--drivers/net/eepro.c8
-rw-r--r--drivers/net/ehea/ehea_main.c4
-rw-r--r--drivers/net/enic/enic.h2
-rw-r--r--drivers/net/enic/enic_main.c19
-rw-r--r--drivers/net/enic/vnic_dev.c25
-rw-r--r--drivers/net/enic/vnic_devcmd.h12
-rw-r--r--drivers/net/enic/vnic_enet.h2
-rw-r--r--drivers/net/enic/vnic_resource.h13
-rw-r--r--drivers/net/enic/vnic_rq.c6
-rw-r--r--drivers/net/enic/vnic_vic.c7
-rw-r--r--drivers/net/enic/vnic_wq.c6
-rw-r--r--drivers/net/fec_mpc52xx.c6
-rw-r--r--drivers/net/gianfar.c2
-rw-r--r--drivers/net/hamradio/scc.c3
-rw-r--r--drivers/net/igb/igb_main.c2
-rw-r--r--drivers/net/irda/irda-usb.c9
-rw-r--r--drivers/net/irda/mcs7780.c2
-rw-r--r--drivers/net/macvtap.c99
-rw-r--r--drivers/net/mlx4/alloc.c2
-rw-r--r--drivers/net/mlx4/en_rx.c2
-rw-r--r--drivers/net/mlx4/profile.c2
-rw-r--r--drivers/net/myri10ge/myri10ge.c4
-rw-r--r--drivers/net/niu.c4
-rw-r--r--drivers/net/pasemi_mac_ethtool.c16
-rw-r--r--drivers/net/pcmcia/3c574_cs.c13
-rw-r--r--drivers/net/pcmcia/axnet_cs.c13
-rw-r--r--drivers/net/pcmcia/ibmtr_cs.c13
-rw-r--r--drivers/net/pcmcia/pcnet_cs.c100
-rw-r--r--drivers/net/ps3_gelic_net.c4
-rw-r--r--drivers/net/qlcnic/qlcnic.h32
-rw-r--r--drivers/net/qlcnic/qlcnic_ctx.c125
-rw-r--r--drivers/net/qlcnic/qlcnic_ethtool.c40
-rw-r--r--drivers/net/qlcnic/qlcnic_hdr.h5
-rw-r--r--drivers/net/qlcnic/qlcnic_hw.c1
-rw-r--r--drivers/net/qlcnic/qlcnic_main.c223
-rw-r--r--drivers/net/r6040.c34
-rw-r--r--drivers/net/sc92031.c11
-rw-r--r--drivers/net/skfp/hwt.c2
-rw-r--r--drivers/net/skfp/skfddi.c2
-rw-r--r--drivers/net/tulip/pnic2.c2
-rw-r--r--drivers/net/tulip/xircom_cb.c15
-rw-r--r--drivers/net/usb/hso.c9
-rw-r--r--drivers/net/usb/kaweth.c9
-rw-r--r--drivers/net/vbus-enet.c1560
-rw-r--r--drivers/net/virtio_net.c14
-rw-r--r--drivers/net/vxge/vxge-main.c10
-rw-r--r--drivers/net/wan/c101.c2
-rw-r--r--drivers/net/wan/n2.c2
-rw-r--r--drivers/net/wan/pci200syn.c2
-rw-r--r--drivers/net/wireless/airo.c5
-rw-r--r--drivers/net/wireless/at76c50x-usb.c7
-rw-r--r--drivers/net/wireless/ath/ar9170/main.c31
-rw-r--r--drivers/net/wireless/ath/ath5k/ani.c6
-rw-r--r--drivers/net/wireless/ath/ath5k/ath5k.h7
-rw-r--r--drivers/net/wireless/ath/ath5k/attach.c8
-rw-r--r--drivers/net/wireless/ath/ath5k/base.c111
-rw-r--r--drivers/net/wireless/ath/ath5k/dma.c4
-rw-r--r--drivers/net/wireless/ath/ath5k/eeprom.c4
-rw-r--r--drivers/net/wireless/ath/ath5k/pcu.c32
-rw-r--r--drivers/net/wireless/ath/ath5k/phy.c15
-rw-r--r--drivers/net/wireless/ath/ath5k/reg.h2
-rw-r--r--drivers/net/wireless/ath/ath5k/reset.c24
-rw-r--r--drivers/net/wireless/ath/ath5k/rfbuffer.h4
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_mac.c2
-rw-r--r--drivers/net/wireless/ath/ath9k/ath9k.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/beacon.c7
-rw-r--r--drivers/net/wireless/ath/ath9k/calib.c109
-rw-r--r--drivers/net/wireless/ath/ath9k/calib.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/common.c36
-rw-r--r--drivers/net/wireless/ath/ath9k/eeprom.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/eeprom_9287.c7
-rw-r--r--drivers/net/wireless/ath/ath9k/hif_usb.c8
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_init.c1
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_main.c8
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_txrx.c15
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c19
-rw-r--r--drivers/net/wireless/ath/ath9k/reg.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c18
-rw-r--r--drivers/net/wireless/ath/debug.h2
-rw-r--r--drivers/net/wireless/b43/main.c30
-rw-r--r--drivers/net/wireless/b43/phy_n.c62
-rw-r--r--drivers/net/wireless/b43legacy/main.c5
-rw-r--r--drivers/net/wireless/hostap/hostap_ioctl.c2
-rw-r--r--drivers/net/wireless/ipw2x00/ipw2100.c23
-rw-r--r--drivers/net/wireless/ipw2x00/ipw2200.c12
-rw-r--r--drivers/net/wireless/iwlwifi/Makefile1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-1000.c9
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-3945.c4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-4965.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-5000.c24
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-6000.c37
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-tt.c696
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-tt.h129
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-tx.c16
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c130
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-commands.h5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c128
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h20
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h9
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-power.c638
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-power.h93
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-scan.c12
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-sta.c24
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-tx.c9
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c109
-rw-r--r--drivers/net/wireless/iwmc3200wifi/rx.c7
-rw-r--r--drivers/net/wireless/libertas/cfg.c62
-rw-r--r--drivers/net/wireless/libertas/decl.h13
-rw-r--r--drivers/net/wireless/libertas/if_cs.c130
-rw-r--r--drivers/net/wireless/libertas/if_sdio.c171
-rw-r--r--drivers/net/wireless/libertas/if_sdio.h4
-rw-r--r--drivers/net/wireless/libertas/if_spi.c150
-rw-r--r--drivers/net/wireless/libertas/if_spi.h5
-rw-r--r--drivers/net/wireless/libertas/if_usb.c60
-rw-r--r--drivers/net/wireless/libertas/if_usb.h1
-rw-r--r--drivers/net/wireless/libertas/main.c105
-rw-r--r--drivers/net/wireless/libertas_tf/if_usb.c57
-rw-r--r--drivers/net/wireless/mac80211_hwsim.c7
-rw-r--r--drivers/net/wireless/p54/Kconfig1
-rw-r--r--drivers/net/wireless/p54/eeprom.c21
-rw-r--r--drivers/net/wireless/p54/fwio.c6
-rw-r--r--drivers/net/wireless/p54/main.c9
-rw-r--r--drivers/net/wireless/p54/p54spi_eeprom.h2
-rw-r--r--drivers/net/wireless/p54/txrx.c17
-rw-r--r--drivers/net/wireless/prism54/isl_ioctl.c2
-rw-r--r--drivers/net/wireless/ray_cs.c16
-rw-r--r--drivers/net/wireless/rt2x00/rt2400pci.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2500pci.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2500usb.c6
-rw-r--r--drivers/net/wireless/rt2x00/rt2800.h27
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c132
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.h15
-rw-r--r--drivers/net/wireless/rt2x00/rt2800pci.c119
-rw-r--r--drivers/net/wireless/rt2x00/rt2800usb.c54
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00.h16
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00config.c12
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00crypto.c17
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00debug.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c63
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00firmware.c3
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00ht.c10
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00queue.c11
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00queue.h8
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00usb.c135
-rw-r--r--drivers/net/wireless/rt2x00/rt61pci.c12
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c6
-rw-r--r--drivers/net/wireless/rtl818x/rtl8180_dev.c143
-rw-r--r--drivers/net/wireless/rtl818x/rtl8187_dev.c9
-rw-r--r--drivers/net/wireless/wl12xx/wl1251_acx.c2
-rw-r--r--drivers/net/wireless/wl12xx/wl1251_cmd.c4
-rw-r--r--drivers/net/wireless/wl12xx/wl1251_main.c13
-rw-r--r--drivers/net/wireless/wl12xx/wl1251_tx.c4
-rw-r--r--drivers/net/wireless/wl12xx/wl1271_acx.c2
-rw-r--r--drivers/net/wireless/wl12xx/wl1271_main.c13
-rw-r--r--drivers/net/wireless/wl12xx/wl1271_scan.c2
-rw-r--r--drivers/net/wireless/wl12xx/wl1271_tx.c4
-rw-r--r--drivers/net/wireless/wl3501_cs.c11
-rw-r--r--drivers/net/wireless/zd1211rw/zd_chip.c5
-rw-r--r--drivers/pci/pci.c2
-rw-r--r--drivers/pci/proc.c4
-rw-r--r--drivers/regulator/ab8500.c3
-rw-r--r--drivers/rtc/rtc-nuc900.c2
-rw-r--r--drivers/s390/block/dasd_3990_erp.c2
-rw-r--r--drivers/s390/char/tape_3590.c6
-rw-r--r--drivers/scsi/lpfc/lpfc_hbadisc.c2
-rw-r--r--drivers/serial/8250_early.c4
-rw-r--r--drivers/serial/kgdboc.c13
-rw-r--r--drivers/serial/sh-sci.h17
-rw-r--r--drivers/serial/suncore.c15
-rw-r--r--drivers/serial/uartlite.c26
-rw-r--r--drivers/sh/clk.c17
-rw-r--r--drivers/spi/coldfire_qspi.c1
-rw-r--r--drivers/staging/spectra/ffsport.c29
-rw-r--r--drivers/staging/spectra/flash.c420
-rw-r--r--drivers/usb/core/hcd.c1
-rw-r--r--drivers/usb/gadget/at91_udc.c1
-rw-r--r--drivers/usb/gadget/f_audio.c2
-rw-r--r--drivers/usb/gadget/f_hid.c4
-rw-r--r--drivers/usb/gadget/fsl_udc_core.c6
-rw-r--r--drivers/usb/gadget/langwell_udc.c3
-rw-r--r--drivers/usb/gadget/pxa27x_udc.c2
-rw-r--r--drivers/usb/gadget/rndis.c2
-rw-r--r--drivers/usb/gadget/uvc_v4l2.c2
-rw-r--r--drivers/usb/host/ehci-hcd.c1
-rw-r--r--drivers/usb/host/imx21-hcd.c4
-rw-r--r--drivers/usb/host/isp1760-hcd.c2
-rw-r--r--drivers/usb/host/ohci-hcd.c1
-rw-r--r--drivers/usb/host/oxu210hp-hcd.c9
-rw-r--r--drivers/usb/host/pci-quirks.c2
-rw-r--r--drivers/usb/host/u132-hcd.c8
-rw-r--r--drivers/usb/image/microtek.c9
-rw-r--r--drivers/usb/misc/ftdi-elan.c2
-rw-r--r--drivers/usb/mon/mon_main.c2
-rw-r--r--drivers/usb/musb/musb_gadget.c1
-rw-r--r--drivers/usb/serial/cypress_m8.c2
-rw-r--r--drivers/usb/serial/ftdi_sio.c1
-rw-r--r--drivers/usb/serial/garmin_gps.c1
-rw-r--r--drivers/usb/serial/io_edgeport.c11
-rw-r--r--drivers/usb/serial/io_ti.c4
-rw-r--r--drivers/usb/serial/iuu_phoenix.c1
-rw-r--r--drivers/usb/serial/keyspan_pda.c1
-rw-r--r--drivers/usb/serial/mos7720.c6
-rw-r--r--drivers/usb/serial/mos7840.c7
-rw-r--r--drivers/usb/serial/navman.c1
-rw-r--r--drivers/usb/serial/omninet.c2
-rw-r--r--drivers/usb/serial/option.c7
-rw-r--r--drivers/usb/serial/pl2303.c1
-rw-r--r--drivers/usb/serial/pl2303.h4
-rw-r--r--drivers/usb/serial/sierra.c2
-rw-r--r--drivers/usb/serial/spcp8x5.c1
-rw-r--r--drivers/usb/serial/usb-serial.c23
-rw-r--r--drivers/usb/serial/usb_wwan.c1
-rw-r--r--drivers/usb/serial/whiteheat.c6
-rw-r--r--drivers/uwb/i1480/i1480u-wlp/lc.c16
-rw-r--r--drivers/uwb/wlp/messages.c40
-rw-r--r--drivers/uwb/wlp/sysfs.c46
-rw-r--r--drivers/uwb/wlp/wlp-lc.c12
-rw-r--r--drivers/vbus/Kconfig25
-rw-r--r--drivers/vbus/Makefile6
-rw-r--r--drivers/vbus/bus-proxy.c248
-rw-r--r--drivers/vbus/pci-bridge.c1016
-rw-r--r--drivers/video/amba-clcd.c10
-rw-r--r--drivers/video/bf54x-lq043fb.c6
-rw-r--r--drivers/video/bfin-t350mcqb-fb.c2
-rw-r--r--drivers/video/vesafb.c2
-rw-r--r--drivers/video/via/dvi.c172
-rw-r--r--drivers/video/via/dvi.h4
-rw-r--r--drivers/video/via/hw.c456
-rw-r--r--drivers/video/via/hw.h16
-rw-r--r--drivers/video/via/ioctl.c2
-rw-r--r--drivers/video/via/lcd.c49
-rw-r--r--drivers/video/via/lcd.h6
-rw-r--r--drivers/video/via/lcdtbl.h591
-rw-r--r--drivers/video/via/viafbdev.c8
-rw-r--r--drivers/video/via/viafbdev.h3
-rw-r--r--firmware/Makefile2
-rw-r--r--fs/ceph/Kconfig14
-rw-r--r--fs/ceph/Makefile11
-rw-r--r--fs/ceph/README20
-rw-r--r--fs/ceph/addr.c65
-rw-r--r--fs/ceph/caps.c35
-rw-r--r--fs/ceph/ceph_frag.c3
-rw-r--r--fs/ceph/debugfs.c407
-rw-r--r--fs/ceph/dir.c55
-rw-r--r--fs/ceph/export.c5
-rw-r--r--fs/ceph/file.c207
-rw-r--r--fs/ceph/inode.c19
-rw-r--r--fs/ceph/ioctl.c11
-rw-r--r--fs/ceph/locks.c6
-rw-r--r--fs/ceph/mds_client.c85
-rw-r--r--fs/ceph/mds_client.h20
-rw-r--r--fs/ceph/mdsmap.c11
-rw-r--r--fs/ceph/snap.c10
-rw-r--r--fs/ceph/strings.c (renamed from fs/ceph/ceph_strings.c)82
-rw-r--r--fs/ceph/super.c1154
-rw-r--r--fs/ceph/super.h397
-rw-r--r--fs/ceph/xattr.c15
-rw-r--r--fs/cifs/dir.c157
-rw-r--r--fs/cifs/file.c3
-rw-r--r--fs/ecryptfs/keystore.c2
-rw-r--r--fs/exofs/inode.c14
-rw-r--r--fs/exofs/ios.c10
-rw-r--r--fs/ext3/super.c4
-rw-r--r--fs/ext4/super.c8
-rw-r--r--fs/gfs2/Kconfig2
-rw-r--r--fs/gfs2/aops.c16
-rw-r--r--fs/gfs2/bmap.c255
-rw-r--r--fs/gfs2/bmap.h20
-rw-r--r--fs/gfs2/dir.c28
-rw-r--r--fs/gfs2/file.c2
-rw-r--r--fs/gfs2/glops.c5
-rw-r--r--fs/gfs2/incore.h1
-rw-r--r--fs/gfs2/inode.c9
-rw-r--r--fs/gfs2/inode.h13
-rw-r--r--fs/gfs2/ops_fstype.c2
-rw-r--r--fs/gfs2/ops_inode.c36
-rw-r--r--fs/gfs2/quota.c13
-rw-r--r--fs/gfs2/rgrp.c6
-rw-r--r--fs/gfs2/super.c11
-rw-r--r--fs/jbd2/journal.c4
-rw-r--r--fs/jfs/jfs_mount.c4
-rw-r--r--fs/libfs.c29
-rw-r--r--fs/nfs/Kconfig1
-rw-r--r--fs/nfs/dir.c9
-rw-r--r--fs/nfs/file.c2
-rw-r--r--fs/nfs/nfs4proc.c3
-rw-r--r--fs/nfs/super.c7
-rw-r--r--fs/nfsd/Kconfig1
-rw-r--r--fs/nilfs2/super.c4
-rw-r--r--fs/nilfs2/the_nilfs.c8
-rw-r--r--fs/ocfs2/aops.c9
-rw-r--r--fs/ocfs2/aops.h3
-rw-r--r--fs/ocfs2/blockcheck.c4
-rw-r--r--fs/ocfs2/file.c49
-rw-r--r--fs/ocfs2/inode.c6
-rw-r--r--fs/ocfs2/inode.h11
-rw-r--r--fs/ocfs2/ioctl.c356
-rw-r--r--fs/ocfs2/journal.c9
-rw-r--r--fs/ocfs2/journal.h3
-rw-r--r--fs/ocfs2/mmap.c7
-rw-r--r--fs/ocfs2/ocfs2.h23
-rw-r--r--fs/ocfs2/ocfs2_ioctl.h95
-rw-r--r--fs/ocfs2/refcounttree.c43
-rw-r--r--fs/ocfs2/refcounttree.h7
-rw-r--r--fs/ocfs2/super.c51
-rw-r--r--fs/quota/Kconfig4
-rw-r--r--fs/reiserfs/inode.c1
-rw-r--r--fs/xfs/Kconfig1
-rw-r--r--include/linux/Kbuild4
-rw-r--r--include/linux/amba/clcd.h1
-rw-r--r--include/linux/amba/pl08x.h184
-rw-r--r--include/linux/ceph/auth.h (renamed from fs/ceph/auth.h)4
-rw-r--r--include/linux/ceph/buffer.h (renamed from fs/ceph/buffer.h)0
-rw-r--r--include/linux/ceph/ceph_debug.h (renamed from fs/ceph/ceph_debug.h)2
-rw-r--r--include/linux/ceph/ceph_frag.h (renamed from fs/ceph/ceph_frag.h)0
-rw-r--r--include/linux/ceph/ceph_fs.h (renamed from fs/ceph/ceph_fs.h)0
-rw-r--r--include/linux/ceph/ceph_hash.h (renamed from fs/ceph/ceph_hash.h)0
-rw-r--r--include/linux/ceph/crush/crush.h (renamed from fs/ceph/crush/crush.h)0
-rw-r--r--include/linux/ceph/crush/hash.h (renamed from fs/ceph/crush/hash.h)0
-rw-r--r--include/linux/ceph/crush/mapper.h (renamed from fs/ceph/crush/mapper.h)0
-rw-r--r--include/linux/ceph/debugfs.h33
-rw-r--r--include/linux/ceph/decode.h (renamed from fs/ceph/decode.h)5
-rw-r--r--include/linux/ceph/libceph.h249
-rw-r--r--include/linux/ceph/mdsmap.h (renamed from fs/ceph/mdsmap.h)0
-rw-r--r--include/linux/ceph/messenger.h (renamed from fs/ceph/messenger.h)12
-rw-r--r--include/linux/ceph/mon_client.h (renamed from fs/ceph/mon_client.h)1
-rw-r--r--include/linux/ceph/msgpool.h (renamed from fs/ceph/msgpool.h)0
-rw-r--r--include/linux/ceph/msgr.h (renamed from fs/ceph/msgr.h)0
-rw-r--r--include/linux/ceph/osd_client.h (renamed from fs/ceph/osd_client.h)67
-rw-r--r--include/linux/ceph/osdmap.h (renamed from fs/ceph/osdmap.h)2
-rw-r--r--include/linux/ceph/pagelist.h (renamed from fs/ceph/pagelist.h)2
-rw-r--r--include/linux/ceph/rados.h (renamed from fs/ceph/rados.h)0
-rw-r--r--include/linux/ceph/types.h (renamed from fs/ceph/types.h)0
-rw-r--r--include/linux/dmaengine.h2
-rw-r--r--include/linux/fs.h2
-rw-r--r--include/linux/hid.h4
-rw-r--r--include/linux/i2c/twl.h6
-rw-r--r--include/linux/if_macvlan.h9
-rw-r--r--include/linux/interrupt.h43
-rw-r--r--include/linux/ioq.h414
-rw-r--r--include/linux/irq.h42
-rw-r--r--include/linux/kbd_kern.h1
-rw-r--r--include/linux/kobject.h35
-rw-r--r--include/linux/kobject_ns.h56
-rw-r--r--include/linux/libata.h2
-rw-r--r--include/linux/netdevice.h2
-rw-r--r--include/linux/nilfs2_fs.h1
-rw-r--r--include/linux/nl80211.h93
-rw-r--r--include/linux/pci.h3
-rw-r--r--include/linux/shm_signal.h189
-rw-r--r--include/linux/skbuff.h9
-rw-r--r--include/linux/slub_def.h2
-rw-r--r--include/linux/ssb/ssb_regs.h1
-rw-r--r--include/linux/sysfs.h1
-rw-r--r--include/linux/vbus_driver.h83
-rw-r--r--include/linux/vbus_pci.h145
-rw-r--r--include/linux/venet.h133
-rw-r--r--include/linux/wlp.h2
-rw-r--r--include/net/cfg80211.h58
-rw-r--r--include/net/mac80211.h60
-rw-r--r--include/sound/sh_fsi.h4
-rw-r--r--include/sound/soc-dai.h98
-rw-r--r--include/sound/soc-dapm.h8
-rw-r--r--include/sound/soc-of-simple.h25
-rw-r--r--include/sound/soc.h236
-rw-r--r--include/sound/tlv320aic3x.h43
-rw-r--r--include/sound/wm8962.h23
-rw-r--r--include/video/vga.h2
-rw-r--r--kernel/debug/kdb/kdb_private.h7
-rw-r--r--kernel/debug/kdb/kdb_support.c4
-rw-r--r--kernel/irq/chip.c20
-rw-r--r--kernel/irq/handle.c7
-rw-r--r--kernel/irq/internals.h10
-rw-r--r--kernel/irq/manage.c18
-rw-r--r--kernel/irq/proc.c5
-rw-r--r--kernel/irq/spurious.c978
-rw-r--r--kernel/trace/ring_buffer.c3
-rw-r--r--kernel/trace/trace.c11
-rw-r--r--kernel/trace/trace_events.c207
-rw-r--r--kernel/trace/trace_functions_graph.c10
-rw-r--r--kernel/trace/trace_kprobe.c2
-rw-r--r--lib/Kconfig21
-rw-r--r--lib/Makefile2
-rw-r--r--lib/ioq.c304
-rw-r--r--lib/shm_signal.c196
-rw-r--r--mm/percpu.c2
-rw-r--r--mm/slab.c4
-rw-r--r--net/Kconfig1
-rw-r--r--net/Makefile1
-rw-r--r--net/atm/common.c2
-rw-r--r--net/ceph/Kconfig27
-rw-r--r--net/ceph/Makefile37
-rw-r--r--net/ceph/armor.c (renamed from fs/ceph/armor.c)0
-rw-r--r--net/ceph/auth.c (renamed from fs/ceph/auth.c)10
-rw-r--r--net/ceph/auth_none.c (renamed from fs/ceph/auth_none.c)7
-rw-r--r--net/ceph/auth_none.h (renamed from fs/ceph/auth_none.h)3
-rw-r--r--net/ceph/auth_x.c (renamed from fs/ceph/auth_x.c)9
-rw-r--r--net/ceph/auth_x.h (renamed from fs/ceph/auth_x.h)3
-rw-r--r--net/ceph/auth_x_protocol.h (renamed from fs/ceph/auth_x_protocol.h)0
-rw-r--r--net/ceph/buffer.c (renamed from fs/ceph/buffer.c)9
-rw-r--r--net/ceph/ceph_common.c529
-rw-r--r--net/ceph/ceph_fs.c (renamed from fs/ceph/ceph_fs.c)5
-rw-r--r--net/ceph/ceph_hash.c (renamed from fs/ceph/ceph_hash.c)2
-rw-r--r--net/ceph/ceph_strings.c84
-rw-r--r--net/ceph/crush/crush.c (renamed from fs/ceph/crush/crush.c)2
-rw-r--r--net/ceph/crush/hash.c (renamed from fs/ceph/crush/hash.c)2
-rw-r--r--net/ceph/crush/mapper.c (renamed from fs/ceph/crush/mapper.c)4
-rw-r--r--net/ceph/crypto.c (renamed from fs/ceph/crypto.c)4
-rw-r--r--net/ceph/crypto.h (renamed from fs/ceph/crypto.h)4
-rw-r--r--net/ceph/debugfs.c268
-rw-r--r--net/ceph/messenger.c (renamed from fs/ceph/messenger.c)296
-rw-r--r--net/ceph/mon_client.c (renamed from fs/ceph/mon_client.c)73
-rw-r--r--net/ceph/msgpool.c (renamed from fs/ceph/msgpool.c)4
-rw-r--r--net/ceph/osd_client.c (renamed from fs/ceph/osd_client.c)400
-rw-r--r--net/ceph/osdmap.c (renamed from fs/ceph/osdmap.c)30
-rw-r--r--net/ceph/pagelist.c (renamed from fs/ceph/pagelist.c)8
-rw-r--r--net/ceph/pagevec.c223
-rw-r--r--net/core/dev.c106
-rw-r--r--net/core/ethtool.c33
-rw-r--r--net/core/net-sysfs.c3
-rw-r--r--net/decnet/dn_nsp_out.c8
-rw-r--r--net/ipv4/netfilter/arp_tables.c2
-rw-r--r--net/ipv4/netfilter/ip_tables.c2
-rw-r--r--net/ipv6/netfilter/ip6_tables.c2
-rw-r--r--net/ipv6/route.c4
-rw-r--r--net/mac80211/aes_ccm.c6
-rw-r--r--net/mac80211/aes_cmac.c6
-rw-r--r--net/mac80211/agg-rx.c22
-rw-r--r--net/mac80211/cfg.c62
-rw-r--r--net/mac80211/debugfs_key.c55
-rw-r--r--net/mac80211/driver-trace.h4
-rw-r--r--net/mac80211/ht.c28
-rw-r--r--net/mac80211/ibss.c8
-rw-r--r--net/mac80211/ieee80211_i.h20
-rw-r--r--net/mac80211/iface.c63
-rw-r--r--net/mac80211/key.c59
-rw-r--r--net/mac80211/key.h4
-rw-r--r--net/mac80211/main.c81
-rw-r--r--net/mac80211/mesh.h2
-rw-r--r--net/mac80211/mlme.c28
-rw-r--r--net/mac80211/rc80211_pid_debugfs.c2
-rw-r--r--net/mac80211/rx.c503
-rw-r--r--net/mac80211/scan.c32
-rw-r--r--net/mac80211/sta_info.h16
-rw-r--r--net/mac80211/status.c2
-rw-r--r--net/mac80211/tx.c22
-rw-r--r--net/mac80211/util.c6
-rw-r--r--net/mac80211/wep.c2
-rw-r--r--net/mac80211/work.c39
-rw-r--r--net/mac80211/wpa.c32
-rw-r--r--net/netlink/af_netlink.c22
-rw-r--r--net/sched/act_gact.c21
-rw-r--r--net/sched/act_mirred.c15
-rw-r--r--net/sched/act_nat.c22
-rw-r--r--net/sched/act_simple.c11
-rw-r--r--net/sched/act_skbedit.c11
-rw-r--r--net/sunrpc/Kconfig9
-rw-r--r--net/sunrpc/xprtrdma/rpc_rdma.c2
-rw-r--r--net/sunrpc/xprtrdma/verbs.c22
-rw-r--r--net/sunrpc/xprtsock.c28
-rw-r--r--net/wanrouter/wanmain.c4
-rw-r--r--net/wireless/core.c15
-rw-r--r--net/wireless/core.h21
-rw-r--r--net/wireless/mlme.c149
-rw-r--r--net/wireless/nl80211.c123
-rw-r--r--net/wireless/nl80211.h14
-rw-r--r--net/wireless/reg.c16
-rw-r--r--net/wireless/sysfs.c9
-rw-r--r--net/wireless/util.c4
-rw-r--r--net/xfrm/xfrm_user.c2
-rw-r--r--scripts/kconfig/Makefile5
-rw-r--r--scripts/kconfig/confdata.c7
-rw-r--r--scripts/kconfig/nconf.c365
-rw-r--r--scripts/kconfig/nconf.gui.c22
-rw-r--r--scripts/kconfig/nconf.h3
-rw-r--r--scripts/kconfig/symbol.c2
-rw-r--r--scripts/mkmakefile4
-rwxr-xr-xscripts/recordmcount.pl7
-rw-r--r--security/apparmor/lsm.c2
-rw-r--r--security/selinux/ss/policydb.c4
-rw-r--r--security/tomoyo/common.c6
-rw-r--r--sound/pci/hda/patch_conexant.c1
-rw-r--r--sound/pci/hda/patch_realtek.c176
-rw-r--r--sound/pci/riptide/riptide.c11
-rw-r--r--sound/soc/atmel/atmel-pcm.c59
-rw-r--r--sound/soc/atmel/atmel-pcm.h3
-rw-r--r--sound/soc/atmel/atmel_ssc_dai.c97
-rw-r--r--sound/soc/atmel/atmel_ssc_dai.h1
-rw-r--r--sound/soc/atmel/playpaq_wm8510.c65
-rw-r--r--sound/soc/atmel/sam9g20_wm8731.c51
-rw-r--r--sound/soc/atmel/snd-soc-afeb9260.c35
-rw-r--r--sound/soc/au1x/db1200.c35
-rw-r--r--sound/soc/au1x/dbdma2.c19
-rw-r--r--sound/soc/au1x/psc-ac97.c20
-rw-r--r--sound/soc/au1x/psc-i2s.c21
-rw-r--r--sound/soc/au1x/psc.h3
-rw-r--r--sound/soc/blackfin/bf5xx-ac97-pcm.c43
-rw-r--r--sound/soc/blackfin/bf5xx-ac97-pcm.h3
-rw-r--r--sound/soc/blackfin/bf5xx-ac97.c41
-rw-r--r--sound/soc/blackfin/bf5xx-ac97.h2
-rw-r--r--sound/soc/blackfin/bf5xx-ad1836.c23
-rw-r--r--sound/soc/blackfin/bf5xx-ad193x.c23
-rw-r--r--sound/soc/blackfin/bf5xx-ad1980.c19
-rw-r--r--sound/soc/blackfin/bf5xx-ad73311.c22
-rw-r--r--sound/soc/blackfin/bf5xx-i2s-pcm.c44
-rw-r--r--sound/soc/blackfin/bf5xx-i2s-pcm.h3
-rw-r--r--sound/soc/blackfin/bf5xx-i2s.c45
-rw-r--r--sound/soc/blackfin/bf5xx-i2s.h14
-rw-r--r--sound/soc/blackfin/bf5xx-ssm2602.c38
-rw-r--r--sound/soc/blackfin/bf5xx-tdm-pcm.c43
-rw-r--r--sound/soc/blackfin/bf5xx-tdm-pcm.h3
-rw-r--r--sound/soc/blackfin/bf5xx-tdm.c15
-rw-r--r--sound/soc/blackfin/bf5xx-tdm.h2
-rw-r--r--sound/soc/codecs/Kconfig4
-rw-r--r--sound/soc/codecs/Makefile2
-rw-r--r--sound/soc/codecs/ac97.c124
-rw-r--r--sound/soc/codecs/ac97.h19
-rw-r--r--sound/soc/codecs/ad1836.c191
-rw-r--r--sound/soc/codecs/ad1836.h2
-rw-r--r--sound/soc/codecs/ad193x.c217
-rw-r--r--sound/soc/codecs/ad193x.h3
-rw-r--r--sound/soc/codecs/ad1980.c107
-rw-r--r--sound/soc/codecs/ad1980.h3
-rw-r--r--sound/soc/codecs/ad73311.c66
-rw-r--r--sound/soc/codecs/ad73311.h2
-rw-r--r--sound/soc/codecs/ads117x.c72
-rw-r--r--sound/soc/codecs/ads117x.h4
-rw-r--r--sound/soc/codecs/ak4104.c149
-rw-r--r--sound/soc/codecs/ak4104.h7
-rw-r--r--sound/soc/codecs/ak4535.c236
-rw-r--r--sound/soc/codecs/ak4535.h8
-rw-r--r--sound/soc/codecs/ak4642.c175
-rw-r--r--sound/soc/codecs/ak4642.h20
-rw-r--r--sound/soc/codecs/ak4671.c141
-rw-r--r--sound/soc/codecs/ak4671.h3
-rw-r--r--sound/soc/codecs/cq93vc.c132
-rw-r--r--sound/soc/codecs/cq93vc.h29
-rw-r--r--sound/soc/codecs/cs4270.c393
-rw-r--r--sound/soc/codecs/cs4270.h28
-rw-r--r--sound/soc/codecs/cs42l51.c293
-rw-r--r--sound/soc/codecs/cs42l51.h2
-rw-r--r--sound/soc/codecs/cx20442.c173
-rw-r--r--sound/soc/codecs/cx20442.h2
-rw-r--r--sound/soc/codecs/da7210.c157
-rw-r--r--sound/soc/codecs/da7210.h24
-rw-r--r--sound/soc/codecs/jz4740.c116
-rw-r--r--sound/soc/codecs/jz4740.h20
-rw-r--r--sound/soc/codecs/pcm3008.c92
-rw-r--r--sound/soc/codecs/pcm3008.h3
-rw-r--r--sound/soc/codecs/spdif_transciever.c102
-rw-r--r--sound/soc/codecs/spdif_transciever.h18
-rw-r--r--sound/soc/codecs/ssm2602.c219
-rw-r--r--sound/soc/codecs/ssm2602.h3
-rw-r--r--sound/soc/codecs/stac9766.c118
-rw-r--r--sound/soc/codecs/stac9766.h4
-rw-r--r--sound/soc/codecs/tlv320aic23.c182
-rw-r--r--sound/soc/codecs/tlv320aic23.h3
-rw-r--r--sound/soc/codecs/tlv320aic26.c180
-rw-r--r--sound/soc/codecs/tlv320aic26.h3
-rw-r--r--sound/soc/codecs/tlv320aic3x.c223
-rw-r--r--sound/soc/codecs/tlv320aic3x.h43
-rw-r--r--sound/soc/codecs/tlv320dac33.c249
-rw-r--r--sound/soc/codecs/tlv320dac33.h3
-rw-r--r--sound/soc/codecs/twl4030.c229
-rw-r--r--sound/soc/codecs/twl4030.h55
-rw-r--r--sound/soc/codecs/twl6040.c170
-rw-r--r--sound/soc/codecs/twl6040.h3
-rw-r--r--sound/soc/codecs/uda134x.c154
-rw-r--r--sound/soc/codecs/uda134x.h3
-rw-r--r--sound/soc/codecs/uda1380.c211
-rw-r--r--sound/soc/codecs/uda1380.h3
-rw-r--r--sound/soc/codecs/wm2000.h3
-rw-r--r--sound/soc/codecs/wm8350.c231
-rw-r--r--sound/soc/codecs/wm8350.h3
-rw-r--r--sound/soc/codecs/wm8400.c181
-rw-r--r--sound/soc/codecs/wm8400.h3
-rw-r--r--sound/soc/codecs/wm8510.c288
-rw-r--r--sound/soc/codecs/wm8510.h3
-rw-r--r--sound/soc/codecs/wm8523.c177
-rw-r--r--sound/soc/codecs/wm8523.h3
-rw-r--r--sound/soc/codecs/wm8580.c325
-rw-r--r--sound/soc/codecs/wm8580.h17
-rw-r--r--sound/soc/codecs/wm8711.c202
-rw-r--r--sound/soc/codecs/wm8711.h3
-rw-r--r--sound/soc/codecs/wm8727.c106
-rw-r--r--sound/soc/codecs/wm8727.h21
-rw-r--r--sound/soc/codecs/wm8728.c290
-rw-r--r--sound/soc/codecs/wm8728.h9
-rw-r--r--sound/soc/codecs/wm8731.c213
-rw-r--r--sound/soc/codecs/wm8731.h3
-rw-r--r--sound/soc/codecs/wm8741.c201
-rw-r--r--sound/soc/codecs/wm8741.h3
-rw-r--r--sound/soc/codecs/wm8750.c265
-rw-r--r--sound/soc/codecs/wm8750.h9
-rw-r--r--sound/soc/codecs/wm8753.c403
-rw-r--r--sound/soc/codecs/wm8753.h3
-rw-r--r--sound/soc/codecs/wm8776.c254
-rw-r--r--sound/soc/codecs/wm8776.h3
-rw-r--r--sound/soc/codecs/wm8900.c247
-rw-r--r--sound/soc/codecs/wm8900.h3
-rw-r--r--sound/soc/codecs/wm8903.c265
-rw-r--r--sound/soc/codecs/wm8903.h3
-rw-r--r--sound/soc/codecs/wm8904.c208
-rw-r--r--sound/soc/codecs/wm8904.h3
-rw-r--r--sound/soc/codecs/wm8940.c199
-rw-r--r--sound/soc/codecs/wm8940.h2
-rw-r--r--sound/soc/codecs/wm8955.c181
-rw-r--r--sound/soc/codecs/wm8955.h3
-rw-r--r--sound/soc/codecs/wm8960.c209
-rw-r--r--sound/soc/codecs/wm8960.h3
-rw-r--r--sound/soc/codecs/wm8961.c237
-rw-r--r--sound/soc/codecs/wm8961.h3
-rw-r--r--sound/soc/codecs/wm8962-tables.c42299
-rw-r--r--sound/soc/codecs/wm8962.c1859
-rw-r--r--sound/soc/codecs/wm8962.h3787
-rw-r--r--sound/soc/codecs/wm8971.c247
-rw-r--r--sound/soc/codecs/wm8971.h8
-rw-r--r--sound/soc/codecs/wm8974.c167
-rw-r--r--sound/soc/codecs/wm8974.h3
-rw-r--r--sound/soc/codecs/wm8978.c190
-rw-r--r--sound/soc/codecs/wm8978.h3
-rw-r--r--sound/soc/codecs/wm8988.c262
-rw-r--r--sound/soc/codecs/wm8988.h3
-rw-r--r--sound/soc/codecs/wm8990.c222
-rw-r--r--sound/soc/codecs/wm8990.h8
-rw-r--r--sound/soc/codecs/wm8993.c304
-rw-r--r--sound/soc/codecs/wm8993.h3
-rw-r--r--sound/soc/codecs/wm8994.c229
-rw-r--r--sound/soc/codecs/wm8994.h3
-rw-r--r--sound/soc/codecs/wm9081.c208
-rw-r--r--sound/soc/codecs/wm9081.h3
-rw-r--r--sound/soc/codecs/wm9090.c183
-rw-r--r--sound/soc/codecs/wm9090.h2
-rw-r--r--sound/soc/codecs/wm9705.c116
-rw-r--r--sound/soc/codecs/wm9705.h3
-rw-r--r--sound/soc/codecs/wm9712.c124
-rw-r--r--sound/soc/codecs/wm9712.h3
-rw-r--r--sound/soc/codecs/wm9713.c131
-rw-r--r--sound/soc/codecs/wm9713.h3
-rw-r--r--sound/soc/davinci/davinci-evm.c109
-rw-r--r--sound/soc/davinci/davinci-i2s.c44
-rw-r--r--sound/soc/davinci/davinci-i2s.h2
-rw-r--r--sound/soc/davinci/davinci-mcasp.c32
-rw-r--r--sound/soc/davinci/davinci-mcasp.h2
-rw-r--r--sound/soc/davinci/davinci-pcm.c45
-rw-r--r--sound/soc/davinci/davinci-pcm.h3
-rw-r--r--sound/soc/davinci/davinci-sffsdr.c27
-rw-r--r--sound/soc/davinci/davinci-vcif.c25
-rw-r--r--sound/soc/davinci/davinci-vcif.h28
-rw-r--r--sound/soc/ep93xx/ep93xx-i2s.c34
-rw-r--r--sound/soc/ep93xx/ep93xx-i2s.h18
-rw-r--r--sound/soc/ep93xx/ep93xx-pcm.c37
-rw-r--r--sound/soc/ep93xx/ep93xx-pcm.h2
-rw-r--r--sound/soc/ep93xx/snappercl15.c24
-rw-r--r--sound/soc/fsl/Kconfig3
-rw-r--r--sound/soc/fsl/Makefile3
-rw-r--r--sound/soc/fsl/efika-audio-fabric.c20
-rw-r--r--sound/soc/fsl/fsl_dma.c370
-rw-r--r--sound/soc/fsl/fsl_dma.h20
-rw-r--r--sound/soc/fsl/fsl_ssi.c273
-rw-r--r--sound/soc/fsl/fsl_ssi.h26
-rw-r--r--sound/soc/fsl/mpc5200_dma.c66
-rw-r--r--sound/soc/fsl/mpc5200_dma.h5
-rw-r--r--sound/soc/fsl/mpc5200_psc_ac97.c34
-rw-r--r--sound/soc/fsl/mpc5200_psc_ac97.h2
-rw-r--r--sound/soc/fsl/mpc5200_psc_i2s.c19
-rw-r--r--sound/soc/fsl/mpc8610_hpcd.c658
-rw-r--r--sound/soc/fsl/pcm030-audio-fabric.c21
-rw-r--r--sound/soc/fsl/soc-of-simple.c172
-rw-r--r--sound/soc/imx/Kconfig16
-rw-r--r--sound/soc/imx/Makefile10
-rw-r--r--sound/soc/imx/eukrea-tlv320.c16
-rw-r--r--sound/soc/imx/imx-pcm-dma-mx2.c43
-rw-r--r--sound/soc/imx/imx-pcm-fiq.c68
-rw-r--r--sound/soc/imx/imx-ssi.c148
-rw-r--r--sound/soc/imx/imx-ssi.h7
-rw-r--r--sound/soc/imx/phycore-ac97.c19
-rw-r--r--sound/soc/imx/wm1133-ev1.c27
-rw-r--r--sound/soc/jz4740/jz4740-i2s.c104
-rw-r--r--sound/soc/jz4740/jz4740-i2s.h2
-rw-r--r--sound/soc/jz4740/jz4740-pcm.c18
-rw-r--r--sound/soc/jz4740/jz4740-pcm.h2
-rw-r--r--sound/soc/jz4740/qi_lb60.c25
-rw-r--r--sound/soc/kirkwood/kirkwood-dma.c64
-rw-r--r--sound/soc/kirkwood/kirkwood-dma.h17
-rw-r--r--sound/soc/kirkwood/kirkwood-i2s.c52
-rw-r--r--sound/soc/kirkwood/kirkwood-i2s.h17
-rw-r--r--sound/soc/kirkwood/kirkwood-openrd.c21
-rw-r--r--sound/soc/nuc900/nuc900-ac97.c12
-rw-r--r--sound/soc/nuc900/nuc900-audio.c16
-rw-r--r--sound/soc/nuc900/nuc900-audio.h4
-rw-r--r--sound/soc/nuc900/nuc900-pcm.c38
-rw-r--r--sound/soc/omap/am3517evm.c25
-rw-r--r--sound/soc/omap/ams-delta.c98
-rw-r--r--sound/soc/omap/igep0020.c22
-rw-r--r--sound/soc/omap/mcpdm.c19
-rw-r--r--sound/soc/omap/mcpdm.h2
-rw-r--r--sound/soc/omap/n810.c42
-rw-r--r--sound/soc/omap/omap-mcbsp.c123
-rw-r--r--sound/soc/omap/omap-mcbsp.h2
-rw-r--r--sound/soc/omap/omap-mcpdm.c71
-rw-r--r--sound/soc/omap/omap-mcpdm.h29
-rw-r--r--sound/soc/omap/omap-pcm.c47
-rw-r--r--sound/soc/omap/omap-pcm.h2
-rw-r--r--sound/soc/omap/omap2evm.c25
-rw-r--r--sound/soc/omap/omap3beagle.c23
-rw-r--r--sound/soc/omap/omap3evm.c30
-rw-r--r--sound/soc/omap/omap3pandora.c36
-rw-r--r--sound/soc/omap/osk5912.c24
-rw-r--r--sound/soc/omap/overo.c22
-rw-r--r--sound/soc/omap/rx51.c37
-rw-r--r--sound/soc/omap/sdp3430.c56
-rw-r--r--sound/soc/omap/sdp4430.c23
-rw-r--r--sound/soc/omap/zoom2.c64
-rw-r--r--sound/soc/pxa/corgi.c26
-rw-r--r--sound/soc/pxa/e740_wm9705.c26
-rw-r--r--sound/soc/pxa/e750_wm9705.c26
-rw-r--r--sound/soc/pxa/e800_wm9712.c26
-rw-r--r--sound/soc/pxa/em-x270.c22
-rw-r--r--sound/soc/pxa/imote2.c20
-rw-r--r--sound/soc/pxa/magician.c35
-rw-r--r--sound/soc/pxa/mioa701_wm9713.c33
-rw-r--r--sound/soc/pxa/palm27x.c27
-rw-r--r--sound/soc/pxa/poodle.c27
-rw-r--r--sound/soc/pxa/pxa-ssp.c173
-rw-r--r--sound/soc/pxa/pxa-ssp.h2
-rw-r--r--sound/soc/pxa/pxa2xx-ac97.c45
-rw-r--r--sound/soc/pxa/pxa2xx-ac97.h2
-rw-r--r--sound/soc/pxa/pxa2xx-i2s.c90
-rw-r--r--sound/soc/pxa/pxa2xx-i2s.h2
-rw-r--r--sound/soc/pxa/pxa2xx-pcm.c46
-rw-r--r--sound/soc/pxa/pxa2xx-pcm.h19
-rw-r--r--sound/soc/pxa/raumfeld.c114
-rw-r--r--sound/soc/pxa/spitz.c26
-rw-r--r--sound/soc/pxa/tosa.c27
-rw-r--r--sound/soc/pxa/z2.c26
-rw-r--r--sound/soc/pxa/zylonite.c40
-rw-r--r--sound/soc/s3c24xx/Kconfig18
-rw-r--r--sound/soc/s3c24xx/Makefile4
-rw-r--r--sound/soc/s3c24xx/aquila_wm8994.c295
-rw-r--r--sound/soc/s3c24xx/goni_wm8994.c298
-rw-r--r--sound/soc/s3c24xx/jive_wm8750.c23
-rw-r--r--sound/soc/s3c24xx/ln2440sbc_alc650.c17
-rw-r--r--sound/soc/s3c24xx/neo1973_gta02_wm8753.c58
-rw-r--r--sound/soc/s3c24xx/neo1973_wm8753.c37
-rw-r--r--sound/soc/s3c24xx/s3c-ac97.c22
-rw-r--r--sound/soc/s3c24xx/s3c-ac97.h2
-rw-r--r--sound/soc/s3c24xx/s3c-dma.c46
-rw-r--r--sound/soc/s3c24xx/s3c-dma.h1
-rw-r--r--sound/soc/s3c24xx/s3c-i2s-v2.c50
-rw-r--r--sound/soc/s3c24xx/s3c-i2s-v2.h13
-rw-r--r--sound/soc/s3c24xx/s3c-pcm.c42
-rw-r--r--sound/soc/s3c24xx/s3c2412-i2s.c54
-rw-r--r--sound/soc/s3c24xx/s3c2412-i2s.h2
-rw-r--r--sound/soc/s3c24xx/s3c24xx-i2s.c40
-rw-r--r--sound/soc/s3c24xx/s3c24xx-i2s.h2
-rw-r--r--sound/soc/s3c24xx/s3c24xx_simtec.c15
-rw-r--r--sound/soc/s3c24xx/s3c24xx_simtec.h4
-rw-r--r--sound/soc/s3c24xx/s3c24xx_simtec_hermes.c25
-rw-r--r--sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c21
-rw-r--r--sound/soc/s3c24xx/s3c24xx_uda134x.c21
-rw-r--r--sound/soc/s3c24xx/s3c64xx-i2s-v4.c135
-rw-r--r--sound/soc/s3c24xx/s3c64xx-i2s.c206
-rw-r--r--sound/soc/s3c24xx/s3c64xx-i2s.h2
-rw-r--r--sound/soc/s3c24xx/smartq_wm8987.c15
-rw-r--r--sound/soc/s3c24xx/smdk2443_wm9710.c17
-rw-r--r--sound/soc/s3c24xx/smdk64xx_wm8580.c66
-rw-r--r--sound/soc/s3c24xx/smdk_wm9713.c38
-rw-r--r--sound/soc/s6000/s6000-i2s.c56
-rw-r--r--sound/soc/s6000/s6000-i2s.h2
-rw-r--r--sound/soc/s6000/s6000-pcm.c100
-rw-r--r--sound/soc/s6000/s6000-pcm.h2
-rw-r--r--sound/soc/s6000/s6105-ipcam.c31
-rw-r--r--sound/soc/sh/dma-sh7760.c53
-rw-r--r--sound/soc/sh/fsi-ak4642.c24
-rw-r--r--sound/soc/sh/fsi-da7210.c22
-rw-r--r--sound/soc/sh/fsi.c47
-rw-r--r--sound/soc/sh/hac.c46
-rw-r--r--sound/soc/sh/migor.c29
-rw-r--r--sound/soc/sh/sh7760-ac97.c25
-rw-r--r--sound/soc/sh/siu.h5
-rw-r--r--sound/soc/sh/siu_dai.c66
-rw-r--r--sound/soc/sh/siu_pcm.c34
-rw-r--r--sound/soc/sh/ssi.c55
-rw-r--r--sound/soc/soc-cache.c42
-rw-r--r--sound/soc/soc-core.c1677
-rw-r--r--sound/soc/soc-dapm.c88
-rw-r--r--sound/soc/soc-jack.c10
-rw-r--r--sound/soc/txx9/txx9aclc-ac97.c55
-rw-r--r--sound/soc/txx9/txx9aclc-generic.c24
-rw-r--r--sound/soc/txx9/txx9aclc.c141
-rw-r--r--sound/soc/txx9/txx9aclc.h13
-rw-r--r--tools/perf/util/ui/browsers/annotate.c3
1123 files changed, 85887 insertions, 23063 deletions
diff --git a/Documentation/DocBook/80211.tmpl b/Documentation/DocBook/80211.tmpl
new file mode 100644
index 000000000000..6f88e184d2e7
--- /dev/null
+++ b/Documentation/DocBook/80211.tmpl
@@ -0,0 +1,371 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE set PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
+<set>
+ <setinfo>
+ <title>The 802.11 subsystems &ndash; for kernel developers</title>
+ <subtitle>
+ Explaining wireless 802.11 networking in the Linux kernel
+ </subtitle>
+
+ <copyright>
+ <year>2007-2009</year>
+ <holder>Johannes Berg</holder>
+ </copyright>
+
+ <authorgroup>
+ <author>
+ <firstname>Johannes</firstname>
+ <surname>Berg</surname>
+ <affiliation>
+ <address><email>johannes@sipsolutions.net</email></address>
+ </affiliation>
+ </author>
+ </authorgroup>
+
+ <legalnotice>
+ <para>
+ This documentation is free software; you can redistribute
+ it and/or modify it under the terms of the GNU General Public
+ License version 2 as published by the Free Software Foundation.
+ </para>
+ <para>
+ This documentation is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
+ </para>
+ <para>
+ You should have received a copy of the GNU General Public
+ License along with this documentation; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
+ </para>
+ <para>
+ For more details see the file COPYING in the source
+ distribution of Linux.
+ </para>
+ </legalnotice>
+
+ <abstract>
+ <para>
+ These books attempt to give a description of the
+ various subsystems that play a role in 802.11 wireless
+ networking in Linux. Since these books are for kernel
+ developers they attempts to document the structures
+ and functions used in the kernel as well as giving a
+ higher-level overview.
+ </para>
+ <para>
+ The reader is expected to be familiar with the 802.11
+ standard as published by the IEEE in 802.11-2007 (or
+ possibly later versions). References to this standard
+ will be given as "802.11-2007 8.1.5".
+ </para>
+ </abstract>
+ </setinfo>
+ <book id="cfg80211-developers-guide">
+ <bookinfo>
+ <title>The cfg80211 subsystem</title>
+
+ <abstract>
+ <para>
+MISSING
+ </para>
+ </abstract>
+ </bookinfo>
+ <part><chapter>
+!Finclude/net/cfg80211.h ieee80211_band
+ </chapter></part>
+ </book>
+ <book id="mac80211-developers-guide">
+ <bookinfo>
+ <title>The mac80211 subsystem</title>
+ <abstract>
+!Pinclude/net/mac80211.h Introduction
+!Pinclude/net/mac80211.h Warning
+ </abstract>
+ </bookinfo>
+
+ <toc></toc>
+
+ <!--
+ Generally, this document shall be ordered by increasing complexity.
+ It is important to note that readers should be able to read only
+ the first few sections to get a working driver and only advanced
+ usage should require reading the full document.
+ -->
+
+ <part>
+ <title>The basic mac80211 driver interface</title>
+ <partintro>
+ <para>
+ You should read and understand the information contained
+ within this part of the book while implementing a driver.
+ In some chapters, advanced usage is noted, that may be
+ skipped at first.
+ </para>
+ <para>
+ This part of the book only covers station and monitor mode
+ functionality, additional information required to implement
+ the other modes is covered in the second part of the book.
+ </para>
+ </partintro>
+
+ <chapter id="basics">
+ <title>Basic hardware handling</title>
+ <para>TBD</para>
+ <para>
+ This chapter shall contain information on getting a hw
+ struct allocated and registered with mac80211.
+ </para>
+ <para>
+ Since it is required to allocate rates/modes before registering
+ a hw struct, this chapter shall also contain information on setting
+ up the rate/mode structs.
+ </para>
+ <para>
+ Additionally, some discussion about the callbacks and
+ the general programming model should be in here, including
+ the definition of ieee80211_ops which will be referred to
+ a lot.
+ </para>
+ <para>
+ Finally, a discussion of hardware capabilities should be done
+ with references to other parts of the book.
+ </para>
+ <!-- intentionally multiple !F lines to get proper order -->
+!Finclude/net/mac80211.h ieee80211_hw
+!Finclude/net/mac80211.h ieee80211_hw_flags
+!Finclude/net/mac80211.h SET_IEEE80211_DEV
+!Finclude/net/mac80211.h SET_IEEE80211_PERM_ADDR
+!Finclude/net/mac80211.h ieee80211_ops
+!Finclude/net/mac80211.h ieee80211_alloc_hw
+!Finclude/net/mac80211.h ieee80211_register_hw
+!Finclude/net/mac80211.h ieee80211_get_tx_led_name
+!Finclude/net/mac80211.h ieee80211_get_rx_led_name
+!Finclude/net/mac80211.h ieee80211_get_assoc_led_name
+!Finclude/net/mac80211.h ieee80211_get_radio_led_name
+!Finclude/net/mac80211.h ieee80211_unregister_hw
+!Finclude/net/mac80211.h ieee80211_free_hw
+ </chapter>
+
+ <chapter id="phy-handling">
+ <title>PHY configuration</title>
+ <para>TBD</para>
+ <para>
+ This chapter should describe PHY handling including
+ start/stop callbacks and the various structures used.
+ </para>
+!Finclude/net/mac80211.h ieee80211_conf
+!Finclude/net/mac80211.h ieee80211_conf_flags
+ </chapter>
+
+ <chapter id="iface-handling">
+ <title>Virtual interfaces</title>
+ <para>TBD</para>
+ <para>
+ This chapter should describe virtual interface basics
+ that are relevant to the driver (VLANs, MGMT etc are not.)
+ It should explain the use of the add_iface/remove_iface
+ callbacks as well as the interface configuration callbacks.
+ </para>
+ <para>Things related to AP mode should be discussed there.</para>
+ <para>
+ Things related to supporting multiple interfaces should be
+ in the appropriate chapter, a BIG FAT note should be here about
+ this though and the recommendation to allow only a single
+ interface in STA mode at first!
+ </para>
+!Finclude/net/mac80211.h ieee80211_vif
+ </chapter>
+
+ <chapter id="rx-tx">
+ <title>Receive and transmit processing</title>
+ <sect1>
+ <title>what should be here</title>
+ <para>TBD</para>
+ <para>
+ This should describe the receive and transmit
+ paths in mac80211/the drivers as well as
+ transmit status handling.
+ </para>
+ </sect1>
+ <sect1>
+ <title>Frame format</title>
+!Pinclude/net/mac80211.h Frame format
+ </sect1>
+ <sect1>
+ <title>Packet alignment</title>
+!Pnet/mac80211/rx.c Packet alignment
+ </sect1>
+ <sect1>
+ <title>Calling into mac80211 from interrupts</title>
+!Pinclude/net/mac80211.h Calling mac80211 from interrupts
+ </sect1>
+ <sect1>
+ <title>functions/definitions</title>
+!Finclude/net/mac80211.h ieee80211_rx_status
+!Finclude/net/mac80211.h mac80211_rx_flags
+!Finclude/net/mac80211.h ieee80211_tx_info
+!Finclude/net/mac80211.h ieee80211_rx
+!Finclude/net/mac80211.h ieee80211_rx_irqsafe
+!Finclude/net/mac80211.h ieee80211_tx_status
+!Finclude/net/mac80211.h ieee80211_tx_status_irqsafe
+!Finclude/net/mac80211.h ieee80211_rts_get
+!Finclude/net/mac80211.h ieee80211_rts_duration
+!Finclude/net/mac80211.h ieee80211_ctstoself_get
+!Finclude/net/mac80211.h ieee80211_ctstoself_duration
+!Finclude/net/mac80211.h ieee80211_generic_frame_duration
+!Finclude/net/mac80211.h ieee80211_wake_queue
+!Finclude/net/mac80211.h ieee80211_stop_queue
+!Finclude/net/mac80211.h ieee80211_wake_queues
+!Finclude/net/mac80211.h ieee80211_stop_queues
+ </sect1>
+ </chapter>
+
+ <chapter id="filters">
+ <title>Frame filtering</title>
+!Pinclude/net/mac80211.h Frame filtering
+!Finclude/net/mac80211.h ieee80211_filter_flags
+ </chapter>
+ </part>
+
+ <part id="advanced">
+ <title>Advanced driver interface</title>
+ <partintro>
+ <para>
+ Information contained within this part of the book is
+ of interest only for advanced interaction of mac80211
+ with drivers to exploit more hardware capabilities and
+ improve performance.
+ </para>
+ </partintro>
+
+ <chapter id="hardware-crypto-offload">
+ <title>Hardware crypto acceleration</title>
+!Pinclude/net/mac80211.h Hardware crypto acceleration
+ <!-- intentionally multiple !F lines to get proper order -->
+!Finclude/net/mac80211.h set_key_cmd
+!Finclude/net/mac80211.h ieee80211_key_conf
+!Finclude/net/mac80211.h ieee80211_key_alg
+!Finclude/net/mac80211.h ieee80211_key_flags
+ </chapter>
+
+ <chapter id="powersave">
+ <title>Powersave support</title>
+!Pinclude/net/mac80211.h Powersave support
+ </chapter>
+
+ <chapter id="beacon-filter">
+ <title>Beacon filter support</title>
+!Pinclude/net/mac80211.h Beacon filter support
+!Finclude/net/mac80211.h ieee80211_beacon_loss
+ </chapter>
+
+ <chapter id="qos">
+ <title>Multiple queues and QoS support</title>
+ <para>TBD</para>
+!Finclude/net/mac80211.h ieee80211_tx_queue_params
+ </chapter>
+
+ <chapter id="AP">
+ <title>Access point mode support</title>
+ <para>TBD</para>
+ <para>Some parts of the if_conf should be discussed here instead</para>
+ <para>
+ Insert notes about VLAN interfaces with hw crypto here or
+ in the hw crypto chapter.
+ </para>
+!Finclude/net/mac80211.h ieee80211_get_buffered_bc
+!Finclude/net/mac80211.h ieee80211_beacon_get
+ </chapter>
+
+ <chapter id="multi-iface">
+ <title>Supporting multiple virtual interfaces</title>
+ <para>TBD</para>
+ <para>
+ Note: WDS with identical MAC address should almost always be OK
+ </para>
+ <para>
+ Insert notes about having multiple virtual interfaces with
+ different MAC addresses here, note which configurations are
+ supported by mac80211, add notes about supporting hw crypto
+ with it.
+ </para>
+ </chapter>
+
+ <chapter id="hardware-scan-offload">
+ <title>Hardware scan offload</title>
+ <para>TBD</para>
+!Finclude/net/mac80211.h ieee80211_scan_completed
+ </chapter>
+ </part>
+
+ <part id="rate-control">
+ <title>Rate control interface</title>
+ <partintro>
+ <para>TBD</para>
+ <para>
+ This part of the book describes the rate control algorithm
+ interface and how it relates to mac80211 and drivers.
+ </para>
+ </partintro>
+ <chapter id="dummy">
+ <title>dummy chapter</title>
+ <para>TBD</para>
+ </chapter>
+ </part>
+
+ <part id="internal">
+ <title>Internals</title>
+ <partintro>
+ <para>TBD</para>
+ <para>
+ This part of the book describes mac80211 internals.
+ </para>
+ </partintro>
+
+ <chapter id="key-handling">
+ <title>Key handling</title>
+ <sect1>
+ <title>Key handling basics</title>
+!Pnet/mac80211/key.c Key handling basics
+ </sect1>
+ <sect1>
+ <title>MORE TBD</title>
+ <para>TBD</para>
+ </sect1>
+ </chapter>
+
+ <chapter id="rx-processing">
+ <title>Receive processing</title>
+ <para>TBD</para>
+ </chapter>
+
+ <chapter id="tx-processing">
+ <title>Transmit processing</title>
+ <para>TBD</para>
+ </chapter>
+
+ <chapter id="sta-info">
+ <title>Station info handling</title>
+ <sect1>
+ <title>Programming information</title>
+!Fnet/mac80211/sta_info.h sta_info
+!Fnet/mac80211/sta_info.h ieee80211_sta_info_flags
+ </sect1>
+ <sect1>
+ <title>STA information lifetime rules</title>
+!Pnet/mac80211/sta_info.c STA information lifetime rules
+ </sect1>
+ </chapter>
+
+ <chapter id="synchronisation">
+ <title>Synchronisation</title>
+ <para>TBD</para>
+ <para>Locking, lots of RCU</para>
+ </chapter>
+ </part>
+ </book>
+</set>
diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile
index 34929f24c284..8b6e00a71034 100644
--- a/Documentation/DocBook/Makefile
+++ b/Documentation/DocBook/Makefile
@@ -12,7 +12,7 @@ DOCBOOKS := z8530book.xml mcabook.xml device-drivers.xml \
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \
genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \
- mac80211.xml debugobjects.xml sh.xml regulator.xml \
+ 80211.xml debugobjects.xml sh.xml regulator.xml \
alsa-driver-api.xml writing-an-alsa-driver.xml \
tracepoint.xml media.xml drm.xml
diff --git a/Documentation/DocBook/mac80211.tmpl b/Documentation/DocBook/mac80211.tmpl
deleted file mode 100644
index affb15a344a1..000000000000
--- a/Documentation/DocBook/mac80211.tmpl
+++ /dev/null
@@ -1,337 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
-
-<book id="mac80211-developers-guide">
- <bookinfo>
- <title>The mac80211 subsystem for kernel developers</title>
-
- <authorgroup>
- <author>
- <firstname>Johannes</firstname>
- <surname>Berg</surname>
- <affiliation>
- <address><email>johannes@sipsolutions.net</email></address>
- </affiliation>
- </author>
- </authorgroup>
-
- <copyright>
- <year>2007-2009</year>
- <holder>Johannes Berg</holder>
- </copyright>
-
- <legalnotice>
- <para>
- This documentation is free software; you can redistribute
- it and/or modify it under the terms of the GNU General Public
- License version 2 as published by the Free Software Foundation.
- </para>
-
- <para>
- This documentation is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied
- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
- </para>
-
- <para>
- You should have received a copy of the GNU General Public
- License along with this documentation; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
- </para>
-
- <para>
- For more details see the file COPYING in the source
- distribution of Linux.
- </para>
- </legalnotice>
-
- <abstract>
-!Pinclude/net/mac80211.h Introduction
-!Pinclude/net/mac80211.h Warning
- </abstract>
- </bookinfo>
-
- <toc></toc>
-
-<!--
-Generally, this document shall be ordered by increasing complexity.
-It is important to note that readers should be able to read only
-the first few sections to get a working driver and only advanced
-usage should require reading the full document.
--->
-
- <part>
- <title>The basic mac80211 driver interface</title>
- <partintro>
- <para>
- You should read and understand the information contained
- within this part of the book while implementing a driver.
- In some chapters, advanced usage is noted, that may be
- skipped at first.
- </para>
- <para>
- This part of the book only covers station and monitor mode
- functionality, additional information required to implement
- the other modes is covered in the second part of the book.
- </para>
- </partintro>
-
- <chapter id="basics">
- <title>Basic hardware handling</title>
- <para>TBD</para>
- <para>
- This chapter shall contain information on getting a hw
- struct allocated and registered with mac80211.
- </para>
- <para>
- Since it is required to allocate rates/modes before registering
- a hw struct, this chapter shall also contain information on setting
- up the rate/mode structs.
- </para>
- <para>
- Additionally, some discussion about the callbacks and
- the general programming model should be in here, including
- the definition of ieee80211_ops which will be referred to
- a lot.
- </para>
- <para>
- Finally, a discussion of hardware capabilities should be done
- with references to other parts of the book.
- </para>
-<!-- intentionally multiple !F lines to get proper order -->
-!Finclude/net/mac80211.h ieee80211_hw
-!Finclude/net/mac80211.h ieee80211_hw_flags
-!Finclude/net/mac80211.h SET_IEEE80211_DEV
-!Finclude/net/mac80211.h SET_IEEE80211_PERM_ADDR
-!Finclude/net/mac80211.h ieee80211_ops
-!Finclude/net/mac80211.h ieee80211_alloc_hw
-!Finclude/net/mac80211.h ieee80211_register_hw
-!Finclude/net/mac80211.h ieee80211_get_tx_led_name
-!Finclude/net/mac80211.h ieee80211_get_rx_led_name
-!Finclude/net/mac80211.h ieee80211_get_assoc_led_name
-!Finclude/net/mac80211.h ieee80211_get_radio_led_name
-!Finclude/net/mac80211.h ieee80211_unregister_hw
-!Finclude/net/mac80211.h ieee80211_free_hw
- </chapter>
-
- <chapter id="phy-handling">
- <title>PHY configuration</title>
- <para>TBD</para>
- <para>
- This chapter should describe PHY handling including
- start/stop callbacks and the various structures used.
- </para>
-!Finclude/net/mac80211.h ieee80211_conf
-!Finclude/net/mac80211.h ieee80211_conf_flags
- </chapter>
-
- <chapter id="iface-handling">
- <title>Virtual interfaces</title>
- <para>TBD</para>
- <para>
- This chapter should describe virtual interface basics
- that are relevant to the driver (VLANs, MGMT etc are not.)
- It should explain the use of the add_iface/remove_iface
- callbacks as well as the interface configuration callbacks.
- </para>
- <para>Things related to AP mode should be discussed there.</para>
- <para>
- Things related to supporting multiple interfaces should be
- in the appropriate chapter, a BIG FAT note should be here about
- this though and the recommendation to allow only a single
- interface in STA mode at first!
- </para>
-!Finclude/net/mac80211.h ieee80211_vif
- </chapter>
-
- <chapter id="rx-tx">
- <title>Receive and transmit processing</title>
- <sect1>
- <title>what should be here</title>
- <para>TBD</para>
- <para>
- This should describe the receive and transmit
- paths in mac80211/the drivers as well as
- transmit status handling.
- </para>
- </sect1>
- <sect1>
- <title>Frame format</title>
-!Pinclude/net/mac80211.h Frame format
- </sect1>
- <sect1>
- <title>Packet alignment</title>
-!Pnet/mac80211/rx.c Packet alignment
- </sect1>
- <sect1>
- <title>Calling into mac80211 from interrupts</title>
-!Pinclude/net/mac80211.h Calling mac80211 from interrupts
- </sect1>
- <sect1>
- <title>functions/definitions</title>
-!Finclude/net/mac80211.h ieee80211_rx_status
-!Finclude/net/mac80211.h mac80211_rx_flags
-!Finclude/net/mac80211.h ieee80211_tx_info
-!Finclude/net/mac80211.h ieee80211_rx
-!Finclude/net/mac80211.h ieee80211_rx_irqsafe
-!Finclude/net/mac80211.h ieee80211_tx_status
-!Finclude/net/mac80211.h ieee80211_tx_status_irqsafe
-!Finclude/net/mac80211.h ieee80211_rts_get
-!Finclude/net/mac80211.h ieee80211_rts_duration
-!Finclude/net/mac80211.h ieee80211_ctstoself_get
-!Finclude/net/mac80211.h ieee80211_ctstoself_duration
-!Finclude/net/mac80211.h ieee80211_generic_frame_duration
-!Finclude/net/mac80211.h ieee80211_wake_queue
-!Finclude/net/mac80211.h ieee80211_stop_queue
-!Finclude/net/mac80211.h ieee80211_wake_queues
-!Finclude/net/mac80211.h ieee80211_stop_queues
- </sect1>
- </chapter>
-
- <chapter id="filters">
- <title>Frame filtering</title>
-!Pinclude/net/mac80211.h Frame filtering
-!Finclude/net/mac80211.h ieee80211_filter_flags
- </chapter>
- </part>
-
- <part id="advanced">
- <title>Advanced driver interface</title>
- <partintro>
- <para>
- Information contained within this part of the book is
- of interest only for advanced interaction of mac80211
- with drivers to exploit more hardware capabilities and
- improve performance.
- </para>
- </partintro>
-
- <chapter id="hardware-crypto-offload">
- <title>Hardware crypto acceleration</title>
-!Pinclude/net/mac80211.h Hardware crypto acceleration
-<!-- intentionally multiple !F lines to get proper order -->
-!Finclude/net/mac80211.h set_key_cmd
-!Finclude/net/mac80211.h ieee80211_key_conf
-!Finclude/net/mac80211.h ieee80211_key_alg
-!Finclude/net/mac80211.h ieee80211_key_flags
- </chapter>
-
- <chapter id="powersave">
- <title>Powersave support</title>
-!Pinclude/net/mac80211.h Powersave support
- </chapter>
-
- <chapter id="beacon-filter">
- <title>Beacon filter support</title>
-!Pinclude/net/mac80211.h Beacon filter support
-!Finclude/net/mac80211.h ieee80211_beacon_loss
- </chapter>
-
- <chapter id="qos">
- <title>Multiple queues and QoS support</title>
- <para>TBD</para>
-!Finclude/net/mac80211.h ieee80211_tx_queue_params
- </chapter>
-
- <chapter id="AP">
- <title>Access point mode support</title>
- <para>TBD</para>
- <para>Some parts of the if_conf should be discussed here instead</para>
- <para>
- Insert notes about VLAN interfaces with hw crypto here or
- in the hw crypto chapter.
- </para>
-!Finclude/net/mac80211.h ieee80211_get_buffered_bc
-!Finclude/net/mac80211.h ieee80211_beacon_get
- </chapter>
-
- <chapter id="multi-iface">
- <title>Supporting multiple virtual interfaces</title>
- <para>TBD</para>
- <para>
- Note: WDS with identical MAC address should almost always be OK
- </para>
- <para>
- Insert notes about having multiple virtual interfaces with
- different MAC addresses here, note which configurations are
- supported by mac80211, add notes about supporting hw crypto
- with it.
- </para>
- </chapter>
-
- <chapter id="hardware-scan-offload">
- <title>Hardware scan offload</title>
- <para>TBD</para>
-!Finclude/net/mac80211.h ieee80211_scan_completed
- </chapter>
- </part>
-
- <part id="rate-control">
- <title>Rate control interface</title>
- <partintro>
- <para>TBD</para>
- <para>
- This part of the book describes the rate control algorithm
- interface and how it relates to mac80211 and drivers.
- </para>
- </partintro>
- <chapter id="dummy">
- <title>dummy chapter</title>
- <para>TBD</para>
- </chapter>
- </part>
-
- <part id="internal">
- <title>Internals</title>
- <partintro>
- <para>TBD</para>
- <para>
- This part of the book describes mac80211 internals.
- </para>
- </partintro>
-
- <chapter id="key-handling">
- <title>Key handling</title>
- <sect1>
- <title>Key handling basics</title>
-!Pnet/mac80211/key.c Key handling basics
- </sect1>
- <sect1>
- <title>MORE TBD</title>
- <para>TBD</para>
- </sect1>
- </chapter>
-
- <chapter id="rx-processing">
- <title>Receive processing</title>
- <para>TBD</para>
- </chapter>
-
- <chapter id="tx-processing">
- <title>Transmit processing</title>
- <para>TBD</para>
- </chapter>
-
- <chapter id="sta-info">
- <title>Station info handling</title>
- <sect1>
- <title>Programming information</title>
-!Fnet/mac80211/sta_info.h sta_info
-!Fnet/mac80211/sta_info.h ieee80211_sta_info_flags
- </sect1>
- <sect1>
- <title>STA information lifetime rules</title>
-!Pnet/mac80211/sta_info.c STA information lifetime rules
- </sect1>
- </chapter>
-
- <chapter id="synchronisation">
- <title>Synchronisation</title>
- <para>TBD</para>
- <para>Locking, lots of RCU</para>
- </chapter>
- </part>
-</book>
diff --git a/Documentation/arm/00-INDEX b/Documentation/arm/00-INDEX
index 7f5fc3ba9c91..2d025641ec55 100644
--- a/Documentation/arm/00-INDEX
+++ b/Documentation/arm/00-INDEX
@@ -32,3 +32,5 @@ memory.txt
- description of the virtual memory layout
nwfpe/
- NWFPE floating point emulator documentation
+swp_emulation
+ - SWP/SWPB emulation handler/logging description
diff --git a/Documentation/arm/SA1100/FreeBird b/Documentation/arm/SA1100/FreeBird
index fb23b770aaf4..ab9193663b2b 100644
--- a/Documentation/arm/SA1100/FreeBird
+++ b/Documentation/arm/SA1100/FreeBird
@@ -1,6 +1,6 @@
-Freebird-1.1 is produced by Legned(C) ,Inc.
+Freebird-1.1 is produced by Legend(C), Inc.
http://web.archive.org/web/*/http://www.legend.com.cn
-and software/linux mainatined by Coventive(C),Inc.
+and software/linux maintained by Coventive(C), Inc.
(http://www.coventive.com)
Based on the Nicolas's strongarm kernel tree.
diff --git a/Documentation/arm/swp_emulation b/Documentation/arm/swp_emulation
new file mode 100644
index 000000000000..af903d22fd93
--- /dev/null
+++ b/Documentation/arm/swp_emulation
@@ -0,0 +1,27 @@
+Software emulation of deprecated SWP instruction (CONFIG_SWP_EMULATE)
+---------------------------------------------------------------------
+
+ARMv6 architecture deprecates use of the SWP/SWPB instructions, and recommeds
+moving to the load-locked/store-conditional instructions LDREX and STREX.
+
+ARMv7 multiprocessing extensions introduce the ability to disable these
+instructions, triggering an undefined instruction exception when executed.
+Trapped instructions are emulated using an LDREX/STREX or LDREXB/STREXB
+sequence. If a memory access fault (an abort) occurs, a segmentation fault is
+signalled to the triggering process.
+
+/proc/cpu/swp_emulation holds some statistics/information, including the PID of
+the last process to trigger the emulation to be invocated. For example:
+---
+Emulated SWP: 12
+Emulated SWPB: 0
+Aborted SWP{B}: 1
+Last process: 314
+---
+
+NOTE: when accessing uncached shared regions, LDREX/STREX rely on an external
+transaction monitoring block called a global monitor to maintain update
+atomicity. If your system does not implement a global monitor, this option can
+cause programs that perform SWP operations to uncached memory to deadlock, as
+the STREX operation will always fail.
+
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 2c85c0692b01..cf812981b8f0 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -1713,7 +1713,7 @@ and is between 256 and 4096 characters. It is defined in the file
norandmaps Don't use address space randomization. Equivalent to
echo 0 > /proc/sys/kernel/randomize_va_space
- noreplace-paravirt [X86-32,PV_OPS] Don't patch paravirt_ops
+ noreplace-paravirt [X86,IA-64,PV_OPS] Don't patch paravirt_ops
noreplace-smp [X86-32,SMP] Don't replace SMP instructions
with UP alternatives
diff --git a/Documentation/x86/x86_64/kernel-stacks b/Documentation/x86/x86_64/kernel-stacks
index 5ad65d51fb95..a01eec5d1d0b 100644
--- a/Documentation/x86/x86_64/kernel-stacks
+++ b/Documentation/x86/x86_64/kernel-stacks
@@ -18,9 +18,9 @@ specialized stacks contain no useful data. The main CPU stacks are:
Used for external hardware interrupts. If this is the first external
hardware interrupt (i.e. not a nested hardware interrupt) then the
kernel switches from the current task to the interrupt stack. Like
- the split thread and interrupt stacks on i386 (with CONFIG_4KSTACKS),
- this gives more room for kernel interrupt processing without having
- to increase the size of every per thread stack.
+ the split thread and interrupt stacks on i386, this gives more room
+ for kernel interrupt processing without having to increase the size
+ of every per thread stack.
The interrupt stack is also used when processing a softirq.
diff --git a/MAINTAINERS b/MAINTAINERS
index b5b8baa1d70e..2c07d55a039d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -454,6 +454,17 @@ L: linux-rdma@vger.kernel.org
S: Maintained
F: drivers/infiniband/hw/amso1100/
+ANALOG DEVICES INC ASOC DRIVERS
+L: uclinux-dist-devel@blackfin.uclinux.org
+L: alsa-devel@alsa-project.org (moderated for non-subscribers)
+W: http://blackfin.uclinux.org/
+S: Supported
+F: sound/soc/blackfin/*
+F: sound/soc/codecs/ad1*
+F: sound/soc/codecs/adau*
+F: sound/soc/codecs/adav*
+F: sound/soc/codecs/ssm*
+
AOA (Apple Onboard Audio) ALSA DRIVER
M: Johannes Berg <johannes@sipsolutions.net>
L: linuxppc-dev@ozlabs.org
@@ -1489,6 +1500,8 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git
S: Supported
F: Documentation/filesystems/ceph.txt
F: fs/ceph
+F: net/ceph
+F: include/linux/ceph
CERTIFIED WIRELESS USB (WUSB) SUBSYSTEM:
M: David Vrabel <david.vrabel@csr.com>
@@ -3099,6 +3112,12 @@ L: linux-mips@linux-mips.org
S: Maintained
F: drivers/serial/ioc3_serial.c
+IOQ LIBRARY
+M: Gregory Haskins <ghaskins@novell.com>
+S: Maintained
+F: include/linux/ioq.h
+F: lib/ioq.c
+
IP MASQUERADING
M: Juanjo Ciarlante <jjciarla@raiz.uncu.edu.ar>
S: Maintained
@@ -4336,6 +4355,15 @@ L: linux-i2c@vger.kernel.org
S: Maintained
F: drivers/i2c/busses/i2c-pasemi.c
+PADATA PARALLEL EXECUTION MECHANISM
+M: Steffen Klassert <steffen.klassert@secunet.com>
+L: linux-kernel@vger.kernel.org
+L: linux-crypto@vger.kernel.org
+S: Maintained
+F: kernel/padata.c
+F: include/linux/padata.h
+F: Documentation/padata.txt
+
PANASONIC LAPTOP ACPI EXTRAS DRIVER
M: Harald Welte <laforge@gnumonks.org>
L: platform-driver-x86@vger.kernel.org
@@ -4463,6 +4491,13 @@ L: netdev@vger.kernel.org
S: Maintained
F: drivers/net/pcnet32.c
+PCRYPT PARALLEL CRYPTO ENGINE
+M: Steffen Klassert <steffen.klassert@secunet.com>
+L: linux-crypto@vger.kernel.org
+S: Maintained
+F: crypto/pcrypt.c
+F: include/crypto/pcrypt.h
+
PER-TASK DELAY ACCOUNTING
M: Balbir Singh <balbir@linux.vnet.ibm.com>
S: Maintained
@@ -4740,6 +4775,15 @@ F: fs/qnx4/
F: include/linux/qnx4_fs.h
F: include/linux/qnxtypes.h
+RADOS BLOCK DEVICE (RBD)
+F: include/linux/qnxtypes.h
+M: Yehuda Sadeh <yehuda@hq.newdream.net>
+M: Sage Weil <sage@newdream.net>
+M: ceph-devel@vger.kernel.org
+S: Supported
+F: drivers/block/rbd.c
+F: drivers/block/rbd_types.h
+
RADEON FRAMEBUFFER DISPLAY DRIVER
M: Benjamin Herrenschmidt <benh@kernel.crashing.org>
L: linux-fbdev@vger.kernel.org
@@ -5192,6 +5236,12 @@ F: drivers/serial/serial_lh7a40x.c
F: drivers/usb/gadget/lh7a40*
F: drivers/usb/host/ohci-lh7a40*
+SHM-SIGNAL LIBRARY
+M: Gregory Haskins <ghaskins@novell.com>
+S: Maintained
+F: include/linux/shm_signal.h
+F: lib/shm_signal.c
+
SIMPLE FIRMWARE INTERFACE (SFI)
M: Len Brown <lenb@kernel.org>
L: sfi-devel@simplefirmware.org
@@ -6187,6 +6237,19 @@ S: Maintained
F: Documentation/fb/uvesafb.txt
F: drivers/video/uvesafb.*
+VBUS
+M: Gregory Haskins <ghaskins@novell.com>
+S: Maintained
+F: include/linux/vbus*
+F: drivers/vbus/*
+
+VBUS ETHERNET DRIVER
+M: Gregory Haskins <ghaskins@novell.com>
+S: Maintained
+W: http://developer.novell.com/wiki/index.php/AlacrityVM
+F: include/linux/venet.h
+F: drivers/net/vbus-enet.c
+
VFAT/FAT/MSDOS FILESYSTEM
M: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
S: Maintained
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 99b8200138d2..59c1ce858fc8 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -21,6 +21,9 @@ GZFLAGS :=-9
# Explicitly specifiy 32-bit ARM ISA since toolchain default can be -mthumb:
KBUILD_CFLAGS +=$(call cc-option,-marm,)
+# Never generate .eh_frame
+KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
+
# Do not use arch/arm/defconfig - it's always outdated.
# Select a platform tht is kept up-to-date
KBUILD_DEFCONFIG := versatile_defconfig
diff --git a/arch/arm/configs/omap_4430sdp_defconfig b/arch/arm/configs/omap_4430sdp_defconfig
index 63e0c2d50f32..14c1e18c648f 100644
--- a/arch/arm/configs/omap_4430sdp_defconfig
+++ b/arch/arm/configs/omap_4430sdp_defconfig
@@ -13,6 +13,9 @@ CONFIG_MODULE_SRCVERSION_ALL=y
# CONFIG_BLK_DEV_BSG is not set
CONFIG_ARCH_OMAP=y
CONFIG_ARCH_OMAP4=y
+# CONFIG_ARCH_OMAP2PLUS_TYPICAL is not set
+# CONFIG_ARCH_OMAP2 is not set
+# CONFIG_ARCH_OMAP3 is not set
# CONFIG_OMAP_MUX is not set
CONFIG_OMAP_32K_TIMER=y
CONFIG_OMAP_DM_TIMER=y
diff --git a/arch/arm/configs/tegra_defconfig b/arch/arm/configs/tegra_defconfig
new file mode 100644
index 000000000000..c81b6d9c9fa2
--- /dev/null
+++ b/arch/arm/configs/tegra_defconfig
@@ -0,0 +1,1095 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.35-rc2
+# Tue Jun 8 17:11:49 2010
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+# CONFIG_ARCH_USES_GETTIMEOFFSET is not set
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_HAVE_PROC_CPU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_LOCKBREAK=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_CONSTRUCTORS=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_CROSS_COMPILE=""
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_KERNEL_GZIP=y
+# CONFIG_KERNEL_BZIP2 is not set
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_LZO is not set
+CONFIG_SWAP=y
+# CONFIG_SYSVIPC is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_AUDIT is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_RCU=y
+# CONFIG_TREE_PREEMPT_RCU is not set
+# CONFIG_TINY_RCU is not set
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_FANOUT=32
+# CONFIG_RCU_FANOUT_EXACT is not set
+# CONFIG_RCU_FAST_NO_HZ is not set
+# CONFIG_TREE_RCU_TRACE is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=17
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_DEBUG=y
+# CONFIG_CGROUP_NS is not set
+CONFIG_CGROUP_FREEZER=y
+# CONFIG_CGROUP_DEVICE is not set
+# CONFIG_CPUSETS is not set
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_RESOURCE_COUNTERS=y
+# CONFIG_CGROUP_MEM_RES_CTLR is not set
+CONFIG_CGROUP_SCHED=y
+CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_RT_GROUP_SCHED=y
+# CONFIG_BLK_CGROUP is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+# CONFIG_RELAY is not set
+# CONFIG_NAMESPACES is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+# CONFIG_RD_BZIP2 is not set
+# CONFIG_RD_LZMA is not set
+# CONFIG_RD_LZO is not set
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+# CONFIG_SYSCTL_SYSCALL is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+# CONFIG_ELF_CORE is not set
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_PERF_USE_VMALLOC=y
+
+#
+# Kernel Performance Events And Counters
+#
+# CONFIG_PERF_EVENTS is not set
+# CONFIG_PERF_COUNTERS is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_COMPAT_BRK=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_USE_GENERIC_SMP_HELPERS=y
+CONFIG_HAVE_CLK=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+# CONFIG_SLOW_WORK is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_STOP_MACHINE=y
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+# CONFIG_INLINE_SPIN_TRYLOCK is not set
+# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK is not set
+# CONFIG_INLINE_SPIN_LOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
+# CONFIG_INLINE_SPIN_UNLOCK is not set
+# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
+# CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_READ_TRYLOCK is not set
+# CONFIG_INLINE_READ_LOCK is not set
+# CONFIG_INLINE_READ_LOCK_BH is not set
+# CONFIG_INLINE_READ_LOCK_IRQ is not set
+# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
+# CONFIG_INLINE_READ_UNLOCK is not set
+# CONFIG_INLINE_READ_UNLOCK_BH is not set
+# CONFIG_INLINE_READ_UNLOCK_IRQ is not set
+# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_WRITE_TRYLOCK is not set
+# CONFIG_INLINE_WRITE_LOCK is not set
+# CONFIG_INLINE_WRITE_LOCK_BH is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
+# CONFIG_INLINE_WRITE_UNLOCK is not set
+# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
+# CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
+# CONFIG_MUTEX_SPIN_ON_OWNER is not set
+CONFIG_FREEZER=y
+
+#
+# System Type
+#
+CONFIG_MMU=y
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_VEXPRESS is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_BCMRING is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CNS3XXX is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_STMP3XXX is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_DOVE is not set
+# CONFIG_ARCH_KIRKWOOD is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_W90X900 is not set
+# CONFIG_ARCH_NUC93X is not set
+CONFIG_ARCH_TEGRA=y
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_SHMOBILE is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_S5P6440 is not set
+# CONFIG_ARCH_S5P6442 is not set
+# CONFIG_ARCH_S5PC100 is not set
+# CONFIG_ARCH_S5PV210 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_U300 is not set
+# CONFIG_ARCH_U8500 is not set
+# CONFIG_ARCH_NOMADIK is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_PLAT_SPEAR is not set
+
+#
+# NVIDIA Tegra options
+#
+CONFIG_ARCH_TEGRA_2x_SOC=y
+
+#
+# Tegra board type
+#
+CONFIG_MACH_HARMONY=y
+# CONFIG_TEGRA_DEBUG_UART_NONE is not set
+# CONFIG_TEGRA_DEBUG_UARTA is not set
+# CONFIG_TEGRA_DEBUG_UARTB is not set
+# CONFIG_TEGRA_DEBUG_UARTC is not set
+CONFIG_TEGRA_DEBUG_UARTD=y
+# CONFIG_TEGRA_DEBUG_UARTE is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32v6K=y
+CONFIG_CPU_V7=y
+CONFIG_CPU_32v7=y
+CONFIG_CPU_ABRT_EV7=y
+CONFIG_CPU_PABRT_V7=y
+CONFIG_CPU_CACHE_V7=y
+CONFIG_CPU_CACHE_VIPT=y
+CONFIG_CPU_COPY_V6=y
+CONFIG_CPU_TLB_V7=y
+CONFIG_CPU_HAS_ASID=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_ARM_THUMBEE is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_BPREDICT_DISABLE is not set
+CONFIG_HAS_TLS_REG=y
+CONFIG_OUTER_CACHE=y
+CONFIG_OUTER_CACHE_SYNC=y
+CONFIG_CACHE_L2X0=y
+CONFIG_ARM_L1_CACHE_SHIFT=5
+CONFIG_ARM_DMA_MEM_BUFFERABLE=y
+CONFIG_ARCH_HAS_BARRIERS=y
+CONFIG_CPU_HAS_PMU=y
+# CONFIG_ARM_ERRATA_430973 is not set
+# CONFIG_ARM_ERRATA_458693 is not set
+# CONFIG_ARM_ERRATA_460075 is not set
+CONFIG_ARM_GIC=y
+CONFIG_COMMON_CLKDEV=y
+
+#
+# Bus support
+#
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_SMP=y
+CONFIG_HAVE_ARM_SCU=y
+CONFIG_HAVE_ARM_TWD=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_NR_CPUS=2
+CONFIG_HOTPLUG_CPU=y
+CONFIG_LOCAL_TIMERS=y
+# CONFIG_PREEMPT_NONE is not set
+# CONFIG_PREEMPT_VOLUNTARY is not set
+CONFIG_PREEMPT=y
+CONFIG_HZ=100
+# CONFIG_THUMB2_KERNEL is not set
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+CONFIG_HIGHMEM=y
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UACCESS_WITH_MEMCPY is not set
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="mem=448M@0M console=ttyS0,115200n8 earlyprintk init=/bin/ash"
+# CONFIG_CMDLINE_FORCE is not set
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# CPU Power Management
+#
+# CONFIG_CPU_IDLE is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+CONFIG_VFP=y
+CONFIG_VFPv3=y
+# CONFIG_NEON is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_SLEEP_SMP=y
+CONFIG_PM_SLEEP=y
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+# CONFIG_APM_EMULATION is not set
+# CONFIG_PM_RUNTIME is not set
+CONFIG_PM_OPS=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_XFRM_STATISTICS is not set
+CONFIG_XFRM_IPCOMP=y
+CONFIG_NET_KEY=y
+# CONFIG_NET_KEY_MIGRATE is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+CONFIG_INET_ESP=y
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+CONFIG_INET_TUNNEL=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_LRO is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+CONFIG_IPV6=y
+CONFIG_IPV6_PRIVACY=y
+CONFIG_IPV6_ROUTER_PREF=y
+# CONFIG_IPV6_ROUTE_INFO is not set
+CONFIG_IPV6_OPTIMISTIC_DAD=y
+CONFIG_INET6_AH=y
+CONFIG_INET6_ESP=y
+CONFIG_INET6_IPCOMP=y
+CONFIG_IPV6_MIP6=y
+CONFIG_INET6_XFRM_TUNNEL=y
+CONFIG_INET6_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_BEET=y
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=y
+# CONFIG_IPV6_SIT_6RD is not set
+CONFIG_IPV6_NDISC_NODETYPE=y
+CONFIG_IPV6_TUNNEL=y
+CONFIG_IPV6_MULTIPLE_TABLES=y
+# CONFIG_IPV6_SUBTREES is not set
+# CONFIG_IPV6_MROUTE is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_RDS is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_L2TP is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_PHONET is not set
+# CONFIG_IEEE802154 is not set
+# CONFIG_NET_SCHED is not set
+# CONFIG_DCB is not set
+CONFIG_RPS=y
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+CONFIG_FIB_RULES=y
+# CONFIG_WIRELESS is not set
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+# CONFIG_CAIF is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH=""
+# CONFIG_DEVTMPFS is not set
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_FIRMWARE_IN_KERNEL is not set
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+# CONFIG_MTD is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+
+#
+# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
+#
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_MG_DISK is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+# CONFIG_EEPROM_93CX6 is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=y
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_VETH is not set
+# CONFIG_NET_ETHERNET is not set
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+# CONFIG_WLAN is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+# CONFIG_WAN is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_DEVKMEM is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_N_GSM is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_TIMBERDALE is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_RAMOOPS is not set
+# CONFIG_I2C is not set
+# CONFIG_SPI is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+# CONFIG_DEBUG_GPIO is not set
+# CONFIG_GPIO_SYSFS is not set
+
+#
+# Memory mapped GPIO expanders:
+#
+# CONFIG_GPIO_IT8761E is not set
+
+#
+# I2C GPIO expanders:
+#
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+
+#
+# AC97 GPIO expanders:
+#
+
+#
+# MODULbus GPIO expanders:
+#
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+# CONFIG_MFD_SUPPORT is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+# CONFIG_FB_SYS_FOPS is not set
+# CONFIG_FB_SVGALIB is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_TEGRA=y
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_METRONOME is not set
+# CONFIG_FB_MB862XX is not set
+# CONFIG_FB_BROADSHEET is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_LOGO is not set
+# CONFIG_SOUND is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_MMC is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_ACCESSIBILITY is not set
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_CLASS is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+# CONFIG_STAGING is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+CONFIG_FS_POSIX_ACL=y
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+# CONFIG_DNOTIFY is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+# CONFIG_MSDOS_FS is not set
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+# CONFIG_CONFIGFS_FS is not set
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_LOGFS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+# CONFIG_NFS_FS is not set
+# CONFIG_NFSD is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CEPH_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+# CONFIG_DLM is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+CONFIG_DETECT_HUNG_TASK=y
+# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
+CONFIG_SCHED_DEBUG=y
+CONFIG_SCHEDSTATS=y
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_OBJECTS is not set
+CONFIG_DEBUG_SLAB=y
+# CONFIG_DEBUG_SLAB_LEAK is not set
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_PREEMPT is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+CONFIG_DEBUG_SPINLOCK_SLEEP=y
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_HIGHMEM is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_WRITECOUNT is not set
+# CONFIG_DEBUG_MEMORY_INIT is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_DEBUG_SG=y
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# CONFIG_LKDTM is not set
+# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+# CONFIG_PAGE_POISONING is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_PREEMPT_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_ENABLE_DEFAULT_TRACERS is not set
+# CONFIG_BOOT_TRACER is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_STACK_TRACER is not set
+# CONFIG_KMEMTRACE is not set
+# CONFIG_WORKQUEUE_TRACER is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+# CONFIG_ATOMIC64_SELFTEST is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+CONFIG_ARM_UNWIND=y
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_ERRORS is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+CONFIG_DEBUG_LL=y
+CONFIG_EARLY_PRINTK=y
+# CONFIG_DEBUG_ICEDCC is not set
+# CONFIG_OC_ETM is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+# CONFIG_DEFAULT_SECURITY_SELINUX is not set
+# CONFIG_DEFAULT_SECURITY_SMACK is not set
+# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_PCOMP=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+# CONFIG_CRYPTO_GF128MUL is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_PCRYPT is not set
+CONFIG_CRYPTO_WORKQUEUE=y
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_AUTHENC=y
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Authenticated Encryption with Associated Data
+#
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_SEQIV is not set
+
+#
+# Block modes
+#
+CONFIG_CRYPTO_CBC=y
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_CTS is not set
+CONFIG_CRYPTO_ECB=y
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_PCBC is not set
+# CONFIG_CRYPTO_XTS is not set
+
+#
+# Hash modes
+#
+CONFIG_CRYPTO_HMAC=y
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_VMAC is not set
+
+#
+# Digest
+#
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_GHASH is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+CONFIG_CRYPTO_SHA1=y
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_WP512 is not set
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_ANUBIS is not set
+CONFIG_CRYPTO_ARC4=y
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_TWOFISH=y
+CONFIG_CRYPTO_TWOFISH_COMMON=y
+
+#
+# Compression
+#
+CONFIG_CRYPTO_DEFLATE=y
+# CONFIG_CRYPTO_ZLIB is not set
+# CONFIG_CRYPTO_LZO is not set
+
+#
+# Random Number Generation
+#
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+CONFIG_CRYPTO_HW=y
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC16=y
+# CONFIG_CRC_T10DIF is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_NLATTR=y
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
index 6e8f05c8a1c8..66db132cf1cb 100644
--- a/arch/arm/include/asm/assembler.h
+++ b/arch/arm/include/asm/assembler.h
@@ -18,6 +18,7 @@
#endif
#include <asm/ptrace.h>
+#include <asm/domain.h>
/*
* Endian independent macros for shifting bytes within registers.
@@ -183,12 +184,12 @@
*/
#ifdef CONFIG_THUMB2_KERNEL
- .macro usraccoff, instr, reg, ptr, inc, off, cond, abort
+ .macro usraccoff, instr, reg, ptr, inc, off, cond, abort, t=T()
9999:
.if \inc == 1
- \instr\cond\()bt \reg, [\ptr, #\off]
+ \instr\cond\()b\()\t\().w \reg, [\ptr, #\off]
.elseif \inc == 4
- \instr\cond\()t \reg, [\ptr, #\off]
+ \instr\cond\()\t\().w \reg, [\ptr, #\off]
.else
.error "Unsupported inc macro argument"
.endif
@@ -223,13 +224,13 @@
#else /* !CONFIG_THUMB2_KERNEL */
- .macro usracc, instr, reg, ptr, inc, cond, rept, abort
+ .macro usracc, instr, reg, ptr, inc, cond, rept, abort, t=T()
.rept \rept
9999:
.if \inc == 1
- \instr\cond\()bt \reg, [\ptr], #\inc
+ \instr\cond\()b\()\t \reg, [\ptr], #\inc
.elseif \inc == 4
- \instr\cond\()t \reg, [\ptr], #\inc
+ \instr\cond\()\t \reg, [\ptr], #\inc
.else
.error "Unsupported inc macro argument"
.endif
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
index 4656a24058d2..042e13994d38 100644
--- a/arch/arm/include/asm/cacheflush.h
+++ b/arch/arm/include/asm/cacheflush.h
@@ -137,10 +137,10 @@
#endif
/*
- * This flag is used to indicate that the page pointed to by a pte
- * is dirty and requires cleaning before returning it to the user.
+ * This flag is used to indicate that the page pointed to by a pte is clean
+ * and does not require cleaning before returning it to the user.
*/
-#define PG_dcache_dirty PG_arch_1
+#define PG_dcache_clean PG_arch_1
/*
* MM Cache Management
@@ -405,9 +405,6 @@ static inline void flush_anon_page(struct vm_area_struct *vma,
#define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
static inline void flush_kernel_dcache_page(struct page *page)
{
- /* highmem pages are always flushed upon kunmap already */
- if ((cache_is_vivt() || cache_is_vipt_aliasing()) && !PageHighMem(page))
- __cpuc_flush_dcache_area(page_address(page), PAGE_SIZE);
}
#define flush_dcache_mmap_lock(mapping) \
diff --git a/arch/arm/include/asm/domain.h b/arch/arm/include/asm/domain.h
index cc7ef4080711..af18ceaacf5d 100644
--- a/arch/arm/include/asm/domain.h
+++ b/arch/arm/include/asm/domain.h
@@ -45,13 +45,17 @@
*/
#define DOMAIN_NOACCESS 0
#define DOMAIN_CLIENT 1
+#ifdef CONFIG_CPU_USE_DOMAINS
#define DOMAIN_MANAGER 3
+#else
+#define DOMAIN_MANAGER 1
+#endif
#define domain_val(dom,type) ((type) << (2*(dom)))
#ifndef __ASSEMBLY__
-#ifdef CONFIG_MMU
+#ifdef CONFIG_CPU_USE_DOMAINS
#define set_domain(x) \
do { \
__asm__ __volatile__( \
@@ -74,5 +78,28 @@
#define modify_domain(dom,type) do { } while (0)
#endif
+/*
+ * Generate the T (user) versions of the LDR/STR and related
+ * instructions (inline assembly)
+ */
+#ifdef CONFIG_CPU_USE_DOMAINS
+#define T(instr) #instr "t"
+#else
+#define T(instr) #instr
#endif
-#endif /* !__ASSEMBLY__ */
+
+#else /* __ASSEMBLY__ */
+
+/*
+ * Generate the T (user) versions of the LDR/STR and related
+ * instructions
+ */
+#ifdef CONFIG_CPU_USE_DOMAINS
+#define T(instr) instr ## t
+#else
+#define T(instr) instr
+#endif
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* !__ASM_PROC_DOMAIN_H */
diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h
index 540a044153a5..b33fe7065b38 100644
--- a/arch/arm/include/asm/futex.h
+++ b/arch/arm/include/asm/futex.h
@@ -13,12 +13,13 @@
#include <linux/preempt.h>
#include <linux/uaccess.h>
#include <asm/errno.h>
+#include <asm/domain.h>
#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \
__asm__ __volatile__( \
- "1: ldrt %1, [%2]\n" \
+ "1: " T(ldr) " %1, [%2]\n" \
" " insn "\n" \
- "2: strt %0, [%2]\n" \
+ "2: " T(str) " %0, [%2]\n" \
" mov %0, #0\n" \
"3:\n" \
" .pushsection __ex_table,\"a\"\n" \
@@ -97,10 +98,10 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
pagefault_disable(); /* implies preempt_disable() */
__asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n"
- "1: ldrt %0, [%3]\n"
+ "1: " T(ldr) " %0, [%3]\n"
" teq %0, %1\n"
" it eq @ explicit IT needed for the 2b label\n"
- "2: streqt %2, [%3]\n"
+ "2: " T(streq) " %2, [%3]\n"
"3:\n"
" .pushsection __ex_table,\"a\"\n"
" .align 3\n"
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h
index ab68cf1ef80f..ea19775fa532 100644
--- a/arch/arm/include/asm/pgtable.h
+++ b/arch/arm/include/asm/pgtable.h
@@ -278,9 +278,24 @@ extern struct page *empty_zero_page;
#define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext)
-#define set_pte_at(mm,addr,ptep,pteval) do { \
- set_pte_ext(ptep, pteval, (addr) >= TASK_SIZE ? 0 : PTE_EXT_NG); \
- } while (0)
+#if __LINUX_ARM_ARCH__ < 6
+static inline void __sync_icache_dcache(pte_t pteval)
+{
+}
+#else
+extern void __sync_icache_dcache(pte_t pteval);
+#endif
+
+static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
+ pte_t *ptep, pte_t pteval)
+{
+ if (addr >= TASK_SIZE)
+ set_pte_ext(ptep, pteval, 0);
+ else {
+ __sync_icache_dcache(pteval);
+ set_pte_ext(ptep, pteval, PTE_EXT_NG);
+ }
+}
/*
* The following only work if pte_present() is true.
@@ -290,8 +305,13 @@ extern struct page *empty_zero_page;
#define pte_write(pte) (pte_val(pte) & L_PTE_WRITE)
#define pte_dirty(pte) (pte_val(pte) & L_PTE_DIRTY)
#define pte_young(pte) (pte_val(pte) & L_PTE_YOUNG)
+#define pte_exec(pte) (pte_val(pte) & L_PTE_EXEC)
#define pte_special(pte) (0)
+#define pte_present_user(pte) \
+ ((pte_val(pte) & (L_PTE_PRESENT | L_PTE_USER)) == \
+ (L_PTE_PRESENT | L_PTE_USER))
+
#define PTE_BIT_FUNC(fn,op) \
static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
@@ -317,6 +337,9 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; }
#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
#define pgprot_dmacoherent(prot) \
__pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_BUFFERABLE)
+#define __HAVE_PHYS_MEM_ACCESS_PROT
+extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
+ unsigned long size, pgprot_t vma_prot);
#else
#define pgprot_dmacoherent(prot) \
__pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_UNCACHED)
diff --git a/arch/arm/include/asm/ptrace.h b/arch/arm/include/asm/ptrace.h
index c974be8913a7..7ce15eb15f72 100644
--- a/arch/arm/include/asm/ptrace.h
+++ b/arch/arm/include/asm/ptrace.h
@@ -158,15 +158,24 @@ struct pt_regs {
*/
static inline int valid_user_regs(struct pt_regs *regs)
{
- if (user_mode(regs) && (regs->ARM_cpsr & PSR_I_BIT) == 0) {
- regs->ARM_cpsr &= ~(PSR_F_BIT | PSR_A_BIT);
- return 1;
+ unsigned long mode = regs->ARM_cpsr & MODE_MASK;
+
+ /*
+ * Always clear the F (FIQ) and A (delayed abort) bits
+ */
+ regs->ARM_cpsr &= ~(PSR_F_BIT | PSR_A_BIT);
+
+ if ((regs->ARM_cpsr & PSR_I_BIT) == 0) {
+ if (mode == USR_MODE)
+ return 1;
+ if (elf_hwcap & HWCAP_26BIT && mode == USR26_MODE)
+ return 1;
}
/*
* Force CPSR to something logical...
*/
- regs->ARM_cpsr &= PSR_f | PSR_s | (PSR_x & ~PSR_A_BIT) | PSR_T_BIT | MODE32_BIT;
+ regs->ARM_cpsr &= PSR_f | PSR_s | PSR_x | PSR_T_BIT | MODE32_BIT;
if (!(elf_hwcap & HWCAP_26BIT))
regs->ARM_cpsr |= USR_MODE;
diff --git a/arch/arm/include/asm/smp_plat.h b/arch/arm/include/asm/smp_plat.h
index e6215305544a..963a338d567b 100644
--- a/arch/arm/include/asm/smp_plat.h
+++ b/arch/arm/include/asm/smp_plat.h
@@ -13,9 +13,13 @@ static inline int tlb_ops_need_broadcast(void)
return ((read_cpuid_ext(CPUID_EXT_MMFR3) >> 12) & 0xf) < 2;
}
+#if !defined(CONFIG_SMP) || __LINUX_ARM_ARCH__ >= 7
+#define cache_ops_need_broadcast() 0
+#else
static inline int cache_ops_need_broadcast(void)
{
return ((read_cpuid_ext(CPUID_EXT_MMFR3) >> 12) & 0xf) < 1;
}
+#endif
#endif
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h
index 33b546ae72d4..989c9e57d92b 100644
--- a/arch/arm/include/asm/tlbflush.h
+++ b/arch/arm/include/asm/tlbflush.h
@@ -560,12 +560,20 @@ extern void flush_tlb_kernel_range(unsigned long start, unsigned long end);
#endif
/*
- * if PG_dcache_dirty is set for the page, we need to ensure that any
+ * If PG_dcache_clean is not set for the page, we need to ensure that any
* cache entries for the kernels virtual memory range are written
- * back to the page.
+ * back to the page. On ARMv6 and later, the cache coherency is handled via
+ * the set_pte_at() function.
*/
+#if __LINUX_ARM_ARCH__ < 6
extern void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr,
pte_t *ptep);
+#else
+static inline void update_mmu_cache(struct vm_area_struct *vma,
+ unsigned long addr, pte_t *ptep)
+{
+}
+#endif
#endif
diff --git a/arch/arm/include/asm/traps.h b/arch/arm/include/asm/traps.h
index 491960bf4260..af5d5d1388c6 100644
--- a/arch/arm/include/asm/traps.h
+++ b/arch/arm/include/asm/traps.h
@@ -27,4 +27,6 @@ static inline int in_exception_text(unsigned long ptr)
extern void __init early_trap_init(void);
extern void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame);
+extern void *vectors_page;
+
#endif
diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h
index 33e4a48fe103..b293616a1a1a 100644
--- a/arch/arm/include/asm/uaccess.h
+++ b/arch/arm/include/asm/uaccess.h
@@ -227,7 +227,7 @@ do { \
#define __get_user_asm_byte(x,addr,err) \
__asm__ __volatile__( \
- "1: ldrbt %1,[%2]\n" \
+ "1: " T(ldrb) " %1,[%2],#0\n" \
"2:\n" \
" .pushsection .fixup,\"ax\"\n" \
" .align 2\n" \
@@ -263,7 +263,7 @@ do { \
#define __get_user_asm_word(x,addr,err) \
__asm__ __volatile__( \
- "1: ldrt %1,[%2]\n" \
+ "1: " T(ldr) " %1,[%2],#0\n" \
"2:\n" \
" .pushsection .fixup,\"ax\"\n" \
" .align 2\n" \
@@ -308,7 +308,7 @@ do { \
#define __put_user_asm_byte(x,__pu_addr,err) \
__asm__ __volatile__( \
- "1: strbt %1,[%2]\n" \
+ "1: " T(strb) " %1,[%2],#0\n" \
"2:\n" \
" .pushsection .fixup,\"ax\"\n" \
" .align 2\n" \
@@ -341,7 +341,7 @@ do { \
#define __put_user_asm_word(x,__pu_addr,err) \
__asm__ __volatile__( \
- "1: strt %1,[%2]\n" \
+ "1: " T(str) " %1,[%2],#0\n" \
"2:\n" \
" .pushsection .fixup,\"ax\"\n" \
" .align 2\n" \
@@ -366,10 +366,10 @@ do { \
#define __put_user_asm_dword(x,__pu_addr,err) \
__asm__ __volatile__( \
- ARM( "1: strt " __reg_oper1 ", [%1], #4\n" ) \
- ARM( "2: strt " __reg_oper0 ", [%1]\n" ) \
- THUMB( "1: strt " __reg_oper1 ", [%1]\n" ) \
- THUMB( "2: strt " __reg_oper0 ", [%1, #4]\n" ) \
+ ARM( "1: " T(str) " " __reg_oper1 ", [%1], #4\n" ) \
+ ARM( "2: " T(str) " " __reg_oper0 ", [%1]\n" ) \
+ THUMB( "1: " T(str) " " __reg_oper1 ", [%1]\n" ) \
+ THUMB( "2: " T(str) " " __reg_oper0 ", [%1, #4]\n" ) \
"3:\n" \
" .pushsection .fixup,\"ax\"\n" \
" .align 2\n" \
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h
index dd2bf53000fe..d02cfb683487 100644
--- a/arch/arm/include/asm/unistd.h
+++ b/arch/arm/include/asm/unistd.h
@@ -392,6 +392,7 @@
#define __NR_rt_tgsigqueueinfo (__NR_SYSCALL_BASE+363)
#define __NR_perf_event_open (__NR_SYSCALL_BASE+364)
#define __NR_recvmmsg (__NR_SYSCALL_BASE+365)
+#define __NR_accept4 (__NR_SYSCALL_BASE+366)
/*
* The following SWIs are ARM private.
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index 980b78e31328..d3430eed9b97 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -42,6 +42,7 @@ obj-$(CONFIG_KGDB) += kgdb.o
obj-$(CONFIG_ARM_UNWIND) += unwind.o
obj-$(CONFIG_HAVE_TCM) += tcm.o
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
+obj-$(CONFIG_SWP_EMULATE) += swp_emulate.o
obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o
AFLAGS_crunch-bits.o := -Wa,-mcpu=ep9312
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S
index 37ae301cc47c..afeb71fa72cb 100644
--- a/arch/arm/kernel/calls.S
+++ b/arch/arm/kernel/calls.S
@@ -375,6 +375,7 @@
CALL(sys_rt_tgsigqueueinfo)
CALL(sys_perf_event_open)
/* 365 */ CALL(sys_recvmmsg)
+ CALL(sys_accept4)
#ifndef syscalls_counted
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
#define syscalls_counted
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index bb8e93a76407..4a8559f39643 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -733,7 +733,7 @@ ENTRY(__switch_to)
THUMB( stmia ip!, {r4 - sl, fp} ) @ Store most regs on stack
THUMB( str sp, [ip], #4 )
THUMB( str lr, [ip], #4 )
-#ifdef CONFIG_MMU
+#ifdef CONFIG_CPU_USE_DOMAINS
ldr r6, [r2, #TI_CPU_DOMAIN]
#endif
set_tls r3, r4, r5
@@ -742,7 +742,7 @@ ENTRY(__switch_to)
ldr r8, =__stack_chk_guard
ldr r7, [r7, #TSK_STACK_CANARY]
#endif
-#ifdef CONFIG_MMU
+#ifdef CONFIG_CPU_USE_DOMAINS
mcr p15, 0, r6, c3, c0, 0 @ Set domain register
#endif
mov r5, r0
diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c
index 6ff7919613d7..d601ef297eb6 100644
--- a/arch/arm/kernel/fiq.c
+++ b/arch/arm/kernel/fiq.c
@@ -45,6 +45,7 @@
#include <asm/fiq.h>
#include <asm/irq.h>
#include <asm/system.h>
+#include <asm/traps.h>
static unsigned long no_fiq_insn;
@@ -77,7 +78,11 @@ int show_fiq_list(struct seq_file *p, void *v)
void set_fiq_handler(void *start, unsigned int length)
{
+#if defined(CONFIG_CPU_USE_DOMAINS)
memcpy((void *)0xffff001c, start, length);
+#else
+ memcpy(vectors_page + 0x1c, start, length);
+#endif
flush_icache_range(0xffff001c, 0xffff001c + length);
if (!vectors_high())
flush_icache_range(0x1c, 0x1c + length);
diff --git a/arch/arm/kernel/kgdb.c b/arch/arm/kernel/kgdb.c
index 778c2f7024ff..d6e8b4d2e60d 100644
--- a/arch/arm/kernel/kgdb.c
+++ b/arch/arm/kernel/kgdb.c
@@ -79,7 +79,7 @@ sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *task)
return;
/* Initialize to zero */
- for (regno = 0; regno < GDB_MAX_REGS; regno++)
+ for (regno = 0; regno < DBG_MAX_REG_NUM; regno++)
gdb_regs[regno] = 0;
/* Otherwise, we have only some registers from switch_to() */
diff --git a/arch/arm/kernel/swp_emulate.c b/arch/arm/kernel/swp_emulate.c
new file mode 100644
index 000000000000..c254d1dab9e2
--- /dev/null
+++ b/arch/arm/kernel/swp_emulate.c
@@ -0,0 +1,260 @@
+/*
+ * linux/arch/arm/kernel/swp_emulate.c
+ *
+ * Copyright (C) 2009 ARM Limited
+ * __user_* functions adapted from include/asm/uaccess.h
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Implements emulation of the SWP/SWPB instructions using load-exclusive and
+ * store-exclusive for processors that have them disabled (or future ones that
+ * might not implement them).
+ *
+ * Syntax of SWP{B} instruction: SWP{B}<c> <Rt>, <Rt2>, [<Rn>]
+ * Where: Rt = destination
+ * Rt2 = source
+ * Rn = address
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/proc_fs.h>
+#include <linux/sched.h>
+#include <linux/syscalls.h>
+
+#include <asm/traps.h>
+#include <asm/uaccess.h>
+
+/*
+ * Error-checking SWP macros implemented using ldrex{b}/strex{b}
+ */
+#define __user_swpX_asm(data, addr, res, B) \
+ __asm__ __volatile__( \
+ " mov r3, %1\n" \
+ "0: ldrex"B" %1, [%2]\n" \
+ "1: strex"B" %0, r3, [%2]\n" \
+ " cmp %0, #0\n" \
+ " movne %0, %3\n" \
+ "2:\n" \
+ " .section .fixup,\"ax\"\n" \
+ " .align 2\n" \
+ "3: mov %0, %4\n" \
+ " b 2b\n" \
+ " .previous\n" \
+ " .section __ex_table,\"a\"\n" \
+ " .align 3\n" \
+ " .long 0b, 3b\n" \
+ " .long 1b, 3b\n" \
+ " .previous" \
+ : "=&r" (res), "+r" (data) \
+ : "r" (addr), "i" (-EAGAIN), "i" (-EFAULT) \
+ : "cc", "r3")
+
+#define __user_swp_asm(data, addr, res) __user_swpX_asm(data, addr, res, "")
+#define __user_swpb_asm(data, addr, res) __user_swpX_asm(data, addr, res, "b")
+
+/*
+ * Macros/defines for extracting register numbers from instruction.
+ */
+#define EXTRACT_REG_NUM(instruction, offset) \
+ (((instruction) & (0xf << (offset))) >> (offset))
+#define RN_OFFSET 16
+#define RT_OFFSET 12
+#define RT2_OFFSET 0
+/*
+ * Bit 22 of the instruction encoding distinguishes between
+ * the SWP and SWPB variants (bit set means SWPB).
+ */
+#define TYPE_SWPB (1 << 22)
+
+static unsigned long long swpcounter;
+static unsigned long long swpbcounter;
+static unsigned long long abtcounter;
+static long previous_pid;
+
+#ifdef CONFIG_PROC_FS
+static int proc_read_status(char *page, char **start, off_t off, int count,
+ int *eof, void *data)
+{
+ char *p = page;
+ int len;
+
+ p += sprintf(p, "Emulated SWP:\t\t%llu\n", swpcounter);
+ p += sprintf(p, "Emulated SWPB:\t\t%llu\n", swpbcounter);
+ p += sprintf(p, "Aborted SWP{B}:\t\t%llu\n", abtcounter);
+ if (previous_pid != 0)
+ p += sprintf(p, "Last process:\t\t%ld\n", previous_pid);
+
+ len = (p - page) - off;
+ if (len < 0)
+ len = 0;
+
+ *eof = (len <= count) ? 1 : 0;
+ *start = page + off;
+
+ return len;
+}
+#endif
+
+/*
+ * Set up process info to signal segmentation fault - called on access error.
+ */
+static void set_segfault(struct pt_regs *regs, unsigned long addr)
+{
+ siginfo_t info;
+
+ if (find_vma(current->mm, addr) == NULL)
+ info.si_code = SEGV_MAPERR;
+ else
+ info.si_code = SEGV_ACCERR;
+
+ info.si_signo = SIGSEGV;
+ info.si_errno = 0;
+ info.si_addr = (void *) instruction_pointer(regs);
+
+ pr_debug("SWP{B} emulation: access caused memory abort!\n");
+ arm_notify_die("Illegal memory access", regs, &info, 0, 0);
+
+ abtcounter++;
+}
+
+static int emulate_swpX(unsigned int address, unsigned int *data,
+ unsigned int type)
+{
+ unsigned int res = 0;
+
+ if ((type != TYPE_SWPB) && (address & 0x3)) {
+ /* SWP to unaligned address not permitted */
+ pr_debug("SWP instruction on unaligned pointer!\n");
+ return -EFAULT;
+ }
+
+ while (1) {
+ /*
+ * Barrier required between accessing protected resource and
+ * releasing a lock for it. Legacy code might not have done
+ * this, and we cannot determine that this is not the case
+ * being emulated, so insert always.
+ */
+ smp_mb();
+
+ if (type == TYPE_SWPB)
+ __user_swpb_asm(*data, address, res);
+ else
+ __user_swp_asm(*data, address, res);
+
+ if (likely(res != -EAGAIN) || signal_pending(current))
+ break;
+
+ cond_resched();
+ }
+
+ if (res == 0) {
+ /*
+ * Barrier also required between aquiring a lock for a
+ * protected resource and accessing the resource. Inserted for
+ * same reason as above.
+ */
+ smp_mb();
+
+ if (type == TYPE_SWPB)
+ swpbcounter++;
+ else
+ swpcounter++;
+ }
+
+ return res;
+}
+
+/*
+ * swp_handler logs the id of calling process, dissects the instruction, sanity
+ * checks the memory location, calls emulate_swpX for the actual operation and
+ * deals with fixup/error handling before returning
+ */
+static int swp_handler(struct pt_regs *regs, unsigned int instr)
+{
+ unsigned int address, destreg, data, type;
+ unsigned int res = 0;
+
+ if (current->pid != previous_pid) {
+ pr_debug("\"%s\" (%ld) uses deprecated SWP{B} instruction\n",
+ current->comm, (unsigned long)current->pid);
+ previous_pid = current->pid;
+ }
+
+ address = regs->uregs[EXTRACT_REG_NUM(instr, RN_OFFSET)];
+ data = regs->uregs[EXTRACT_REG_NUM(instr, RT2_OFFSET)];
+ destreg = EXTRACT_REG_NUM(instr, RT_OFFSET);
+
+ type = instr & TYPE_SWPB;
+
+ pr_debug("addr in r%d->0x%08x, dest is r%d, source in r%d->0x%08x)\n",
+ EXTRACT_REG_NUM(instr, RN_OFFSET), address,
+ destreg, EXTRACT_REG_NUM(instr, RT2_OFFSET), data);
+
+ /* Check access in reasonable access range for both SWP and SWPB */
+ if (!access_ok(VERIFY_WRITE, (address & ~3), 4)) {
+ pr_debug("SWP{B} emulation: access to %p not allowed!\n",
+ (void *)address);
+ res = -EFAULT;
+ } else {
+ res = emulate_swpX(address, &data, type);
+ }
+
+ if (res == 0) {
+ /*
+ * On successful emulation, revert the adjustment to the PC
+ * made in kernel/traps.c in order to resume execution at the
+ * instruction following the SWP{B}.
+ */
+ regs->ARM_pc += 4;
+ regs->uregs[destreg] = data;
+ } else if (res == -EFAULT) {
+ /*
+ * Memory errors do not mean emulation failed.
+ * Set up signal info to return SEGV, then return OK
+ */
+ set_segfault(regs, address);
+ }
+
+ return 0;
+}
+
+/*
+ * Only emulate SWP/SWPB executed in ARM state/User mode.
+ * The kernel must be SWP free and SWP{B} does not exist in Thumb/ThumbEE.
+ */
+static struct undef_hook swp_hook = {
+ .instr_mask = 0x0fb00ff0,
+ .instr_val = 0x01000090,
+ .cpsr_mask = MODE_MASK | PSR_T_BIT | PSR_J_BIT,
+ .cpsr_val = USR_MODE,
+ .fn = swp_handler
+};
+
+/*
+ * Register handler and create status file in /proc/cpu
+ * Invoked as late_initcall, since not needed before init spawned.
+ */
+static int __init swp_emulation_init(void)
+{
+#ifdef CONFIG_PROC_FS
+ struct proc_dir_entry *res;
+
+ res = create_proc_entry("cpu/swp_emulation", S_IRUGO, NULL);
+
+ if (!res)
+ return -ENOMEM;
+
+ res->read_proc = proc_read_status;
+#endif /* CONFIG_PROC_FS */
+
+ printk(KERN_NOTICE "Registering SWP/SWPB emulation handler\n");
+ register_undef_hook(&swp_hook);
+
+ return 0;
+}
+
+late_initcall(swp_emulation_init);
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index cda78d59aa31..87abca018054 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -37,6 +37,8 @@
static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" };
+void *vectors_page;
+
#ifdef CONFIG_DEBUG_USER
unsigned int user_debug;
@@ -759,7 +761,11 @@ static void __init kuser_get_tls_init(unsigned long vectors)
void __init early_trap_init(void)
{
+#if defined(CONFIG_CPU_USE_DOMAINS)
unsigned long vectors = CONFIG_VECTORS_BASE;
+#else
+ unsigned long vectors = (unsigned long)vectors_page;
+#endif
extern char __stubs_start[], __stubs_end[];
extern char __vectors_start[], __vectors_end[];
extern char __kuser_helper_start[], __kuser_helper_end[];
@@ -783,10 +789,10 @@ void __init early_trap_init(void)
* Copy signal return handlers into the vector page, and
* set sigreturn to be a pointer to these.
*/
- memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes,
- sizeof(sigreturn_codes));
- memcpy((void *)KERN_RESTART_CODE, syscall_restart_code,
- sizeof(syscall_restart_code));
+ memcpy((void *)(vectors + KERN_SIGRETURN_CODE - CONFIG_VECTORS_BASE),
+ sigreturn_codes, sizeof(sigreturn_codes));
+ memcpy((void *)(vectors + KERN_RESTART_CODE - CONFIG_VECTORS_BASE),
+ syscall_restart_code, sizeof(syscall_restart_code));
flush_icache_range(vectors, vectors + PAGE_SIZE);
modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
diff --git a/arch/arm/lib/getuser.S b/arch/arm/lib/getuser.S
index b1631a7dbe75..1b049cd7a49a 100644
--- a/arch/arm/lib/getuser.S
+++ b/arch/arm/lib/getuser.S
@@ -28,20 +28,21 @@
*/
#include <linux/linkage.h>
#include <asm/errno.h>
+#include <asm/domain.h>
ENTRY(__get_user_1)
-1: ldrbt r2, [r0]
+1: T(ldrb) r2, [r0]
mov r0, #0
mov pc, lr
ENDPROC(__get_user_1)
ENTRY(__get_user_2)
#ifdef CONFIG_THUMB2_KERNEL
-2: ldrbt r2, [r0]
-3: ldrbt r3, [r0, #1]
+2: T(ldrb) r2, [r0]
+3: T(ldrb) r3, [r0, #1]
#else
-2: ldrbt r2, [r0], #1
-3: ldrbt r3, [r0]
+2: T(ldrb) r2, [r0], #1
+3: T(ldrb) r3, [r0]
#endif
#ifndef __ARMEB__
orr r2, r2, r3, lsl #8
@@ -53,7 +54,7 @@ ENTRY(__get_user_2)
ENDPROC(__get_user_2)
ENTRY(__get_user_4)
-4: ldrt r2, [r0]
+4: T(ldr) r2, [r0]
mov r0, #0
mov pc, lr
ENDPROC(__get_user_4)
diff --git a/arch/arm/lib/putuser.S b/arch/arm/lib/putuser.S
index 5a01a23c6c06..c023fc11e86c 100644
--- a/arch/arm/lib/putuser.S
+++ b/arch/arm/lib/putuser.S
@@ -28,9 +28,10 @@
*/
#include <linux/linkage.h>
#include <asm/errno.h>
+#include <asm/domain.h>
ENTRY(__put_user_1)
-1: strbt r2, [r0]
+1: T(strb) r2, [r0]
mov r0, #0
mov pc, lr
ENDPROC(__put_user_1)
@@ -39,19 +40,19 @@ ENTRY(__put_user_2)
mov ip, r2, lsr #8
#ifdef CONFIG_THUMB2_KERNEL
#ifndef __ARMEB__
-2: strbt r2, [r0]
-3: strbt ip, [r0, #1]
+2: T(strb) r2, [r0]
+3: T(strb) ip, [r0, #1]
#else
-2: strbt ip, [r0]
-3: strbt r2, [r0, #1]
+2: T(strb) ip, [r0]
+3: T(strb) r2, [r0, #1]
#endif
#else /* !CONFIG_THUMB2_KERNEL */
#ifndef __ARMEB__
-2: strbt r2, [r0], #1
-3: strbt ip, [r0]
+2: T(strb) r2, [r0], #1
+3: T(strb) ip, [r0]
#else
-2: strbt ip, [r0], #1
-3: strbt r2, [r0]
+2: T(strb) ip, [r0], #1
+3: T(strb) r2, [r0]
#endif
#endif /* CONFIG_THUMB2_KERNEL */
mov r0, #0
@@ -59,18 +60,18 @@ ENTRY(__put_user_2)
ENDPROC(__put_user_2)
ENTRY(__put_user_4)
-4: strt r2, [r0]
+4: T(str) r2, [r0]
mov r0, #0
mov pc, lr
ENDPROC(__put_user_4)
ENTRY(__put_user_8)
#ifdef CONFIG_THUMB2_KERNEL
-5: strt r2, [r0]
-6: strt r3, [r0, #4]
+5: T(str) r2, [r0]
+6: T(str) r3, [r0, #4]
#else
-5: strt r2, [r0], #4
-6: strt r3, [r0]
+5: T(str) r2, [r0], #4
+6: T(str) r3, [r0]
#endif
mov r0, #0
mov pc, lr
diff --git a/arch/arm/lib/uaccess.S b/arch/arm/lib/uaccess.S
index fee9f6f88adb..d0ece2aeb70d 100644
--- a/arch/arm/lib/uaccess.S
+++ b/arch/arm/lib/uaccess.S
@@ -14,6 +14,7 @@
#include <linux/linkage.h>
#include <asm/assembler.h>
#include <asm/errno.h>
+#include <asm/domain.h>
.text
@@ -31,11 +32,11 @@
rsb ip, ip, #4
cmp ip, #2
ldrb r3, [r1], #1
-USER( strbt r3, [r0], #1) @ May fault
+USER( T(strb) r3, [r0], #1) @ May fault
ldrgeb r3, [r1], #1
-USER( strgebt r3, [r0], #1) @ May fault
+USER( T(strgeb) r3, [r0], #1) @ May fault
ldrgtb r3, [r1], #1
-USER( strgtbt r3, [r0], #1) @ May fault
+USER( T(strgtb) r3, [r0], #1) @ May fault
sub r2, r2, ip
b .Lc2u_dest_aligned
@@ -58,7 +59,7 @@ ENTRY(__copy_to_user)
addmi ip, r2, #4
bmi .Lc2u_0nowords
ldr r3, [r1], #4
-USER( strt r3, [r0], #4) @ May fault
+USER( T(str) r3, [r0], #4) @ May fault
mov ip, r0, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction
rsb ip, ip, #0
movs ip, ip, lsr #32 - PAGE_SHIFT
@@ -87,18 +88,18 @@ USER( strt r3, [r0], #4) @ May fault
stmneia r0!, {r3 - r4} @ Shouldnt fault
tst ip, #4
ldrne r3, [r1], #4
- strnet r3, [r0], #4 @ Shouldnt fault
+ T(strne) r3, [r0], #4 @ Shouldnt fault
ands ip, ip, #3
beq .Lc2u_0fupi
.Lc2u_0nowords: teq ip, #0
beq .Lc2u_finished
.Lc2u_nowords: cmp ip, #2
ldrb r3, [r1], #1
-USER( strbt r3, [r0], #1) @ May fault
+USER( T(strb) r3, [r0], #1) @ May fault
ldrgeb r3, [r1], #1
-USER( strgebt r3, [r0], #1) @ May fault
+USER( T(strgeb) r3, [r0], #1) @ May fault
ldrgtb r3, [r1], #1
-USER( strgtbt r3, [r0], #1) @ May fault
+USER( T(strgtb) r3, [r0], #1) @ May fault
b .Lc2u_finished
.Lc2u_not_enough:
@@ -119,7 +120,7 @@ USER( strgtbt r3, [r0], #1) @ May fault
mov r3, r7, pull #8
ldr r7, [r1], #4
orr r3, r3, r7, push #24
-USER( strt r3, [r0], #4) @ May fault
+USER( T(str) r3, [r0], #4) @ May fault
mov ip, r0, lsl #32 - PAGE_SHIFT
rsb ip, ip, #0
movs ip, ip, lsr #32 - PAGE_SHIFT
@@ -154,18 +155,18 @@ USER( strt r3, [r0], #4) @ May fault
movne r3, r7, pull #8
ldrne r7, [r1], #4
orrne r3, r3, r7, push #24
- strnet r3, [r0], #4 @ Shouldnt fault
+ T(strne) r3, [r0], #4 @ Shouldnt fault
ands ip, ip, #3
beq .Lc2u_1fupi
.Lc2u_1nowords: mov r3, r7, get_byte_1
teq ip, #0
beq .Lc2u_finished
cmp ip, #2
-USER( strbt r3, [r0], #1) @ May fault
+USER( T(strb) r3, [r0], #1) @ May fault
movge r3, r7, get_byte_2
-USER( strgebt r3, [r0], #1) @ May fault
+USER( T(strgeb) r3, [r0], #1) @ May fault
movgt r3, r7, get_byte_3
-USER( strgtbt r3, [r0], #1) @ May fault
+USER( T(strgtb) r3, [r0], #1) @ May fault
b .Lc2u_finished
.Lc2u_2fupi: subs r2, r2, #4
@@ -174,7 +175,7 @@ USER( strgtbt r3, [r0], #1) @ May fault
mov r3, r7, pull #16
ldr r7, [r1], #4
orr r3, r3, r7, push #16
-USER( strt r3, [r0], #4) @ May fault
+USER( T(str) r3, [r0], #4) @ May fault
mov ip, r0, lsl #32 - PAGE_SHIFT
rsb ip, ip, #0
movs ip, ip, lsr #32 - PAGE_SHIFT
@@ -209,18 +210,18 @@ USER( strt r3, [r0], #4) @ May fault
movne r3, r7, pull #16
ldrne r7, [r1], #4
orrne r3, r3, r7, push #16
- strnet r3, [r0], #4 @ Shouldnt fault
+ T(strne) r3, [r0], #4 @ Shouldnt fault
ands ip, ip, #3
beq .Lc2u_2fupi
.Lc2u_2nowords: mov r3, r7, get_byte_2
teq ip, #0
beq .Lc2u_finished
cmp ip, #2
-USER( strbt r3, [r0], #1) @ May fault
+USER( T(strb) r3, [r0], #1) @ May fault
movge r3, r7, get_byte_3
-USER( strgebt r3, [r0], #1) @ May fault
+USER( T(strgeb) r3, [r0], #1) @ May fault
ldrgtb r3, [r1], #0
-USER( strgtbt r3, [r0], #1) @ May fault
+USER( T(strgtb) r3, [r0], #1) @ May fault
b .Lc2u_finished
.Lc2u_3fupi: subs r2, r2, #4
@@ -229,7 +230,7 @@ USER( strgtbt r3, [r0], #1) @ May fault
mov r3, r7, pull #24
ldr r7, [r1], #4
orr r3, r3, r7, push #8
-USER( strt r3, [r0], #4) @ May fault
+USER( T(str) r3, [r0], #4) @ May fault
mov ip, r0, lsl #32 - PAGE_SHIFT
rsb ip, ip, #0
movs ip, ip, lsr #32 - PAGE_SHIFT
@@ -264,18 +265,18 @@ USER( strt r3, [r0], #4) @ May fault
movne r3, r7, pull #24
ldrne r7, [r1], #4
orrne r3, r3, r7, push #8
- strnet r3, [r0], #4 @ Shouldnt fault
+ T(strne) r3, [r0], #4 @ Shouldnt fault
ands ip, ip, #3
beq .Lc2u_3fupi
.Lc2u_3nowords: mov r3, r7, get_byte_3
teq ip, #0
beq .Lc2u_finished
cmp ip, #2
-USER( strbt r3, [r0], #1) @ May fault
+USER( T(strb) r3, [r0], #1) @ May fault
ldrgeb r3, [r1], #1
-USER( strgebt r3, [r0], #1) @ May fault
+USER( T(strgeb) r3, [r0], #1) @ May fault
ldrgtb r3, [r1], #0
-USER( strgtbt r3, [r0], #1) @ May fault
+USER( T(strgtb) r3, [r0], #1) @ May fault
b .Lc2u_finished
ENDPROC(__copy_to_user)
@@ -294,11 +295,11 @@ ENDPROC(__copy_to_user)
.Lcfu_dest_not_aligned:
rsb ip, ip, #4
cmp ip, #2
-USER( ldrbt r3, [r1], #1) @ May fault
+USER( T(ldrb) r3, [r1], #1) @ May fault
strb r3, [r0], #1
-USER( ldrgebt r3, [r1], #1) @ May fault
+USER( T(ldrgeb) r3, [r1], #1) @ May fault
strgeb r3, [r0], #1
-USER( ldrgtbt r3, [r1], #1) @ May fault
+USER( T(ldrgtb) r3, [r1], #1) @ May fault
strgtb r3, [r0], #1
sub r2, r2, ip
b .Lcfu_dest_aligned
@@ -321,7 +322,7 @@ ENTRY(__copy_from_user)
.Lcfu_0fupi: subs r2, r2, #4
addmi ip, r2, #4
bmi .Lcfu_0nowords
-USER( ldrt r3, [r1], #4)
+USER( T(ldr) r3, [r1], #4)
str r3, [r0], #4
mov ip, r1, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction
rsb ip, ip, #0
@@ -350,18 +351,18 @@ USER( ldrt r3, [r1], #4)
ldmneia r1!, {r3 - r4} @ Shouldnt fault
stmneia r0!, {r3 - r4}
tst ip, #4
- ldrnet r3, [r1], #4 @ Shouldnt fault
+ T(ldrne) r3, [r1], #4 @ Shouldnt fault
strne r3, [r0], #4
ands ip, ip, #3
beq .Lcfu_0fupi
.Lcfu_0nowords: teq ip, #0
beq .Lcfu_finished
.Lcfu_nowords: cmp ip, #2
-USER( ldrbt r3, [r1], #1) @ May fault
+USER( T(ldrb) r3, [r1], #1) @ May fault
strb r3, [r0], #1
-USER( ldrgebt r3, [r1], #1) @ May fault
+USER( T(ldrgeb) r3, [r1], #1) @ May fault
strgeb r3, [r0], #1
-USER( ldrgtbt r3, [r1], #1) @ May fault
+USER( T(ldrgtb) r3, [r1], #1) @ May fault
strgtb r3, [r0], #1
b .Lcfu_finished
@@ -374,7 +375,7 @@ USER( ldrgtbt r3, [r1], #1) @ May fault
.Lcfu_src_not_aligned:
bic r1, r1, #3
-USER( ldrt r7, [r1], #4) @ May fault
+USER( T(ldr) r7, [r1], #4) @ May fault
cmp ip, #2
bgt .Lcfu_3fupi
beq .Lcfu_2fupi
@@ -382,7 +383,7 @@ USER( ldrt r7, [r1], #4) @ May fault
addmi ip, r2, #4
bmi .Lcfu_1nowords
mov r3, r7, pull #8
-USER( ldrt r7, [r1], #4) @ May fault
+USER( T(ldr) r7, [r1], #4) @ May fault
orr r3, r3, r7, push #24
str r3, [r0], #4
mov ip, r1, lsl #32 - PAGE_SHIFT
@@ -417,7 +418,7 @@ USER( ldrt r7, [r1], #4) @ May fault
stmneia r0!, {r3 - r4}
tst ip, #4
movne r3, r7, pull #8
-USER( ldrnet r7, [r1], #4) @ May fault
+USER( T(ldrne) r7, [r1], #4) @ May fault
orrne r3, r3, r7, push #24
strne r3, [r0], #4
ands ip, ip, #3
@@ -437,7 +438,7 @@ USER( ldrnet r7, [r1], #4) @ May fault
addmi ip, r2, #4
bmi .Lcfu_2nowords
mov r3, r7, pull #16
-USER( ldrt r7, [r1], #4) @ May fault
+USER( T(ldr) r7, [r1], #4) @ May fault
orr r3, r3, r7, push #16
str r3, [r0], #4
mov ip, r1, lsl #32 - PAGE_SHIFT
@@ -473,7 +474,7 @@ USER( ldrt r7, [r1], #4) @ May fault
stmneia r0!, {r3 - r4}
tst ip, #4
movne r3, r7, pull #16
-USER( ldrnet r7, [r1], #4) @ May fault
+USER( T(ldrne) r7, [r1], #4) @ May fault
orrne r3, r3, r7, push #16
strne r3, [r0], #4
ands ip, ip, #3
@@ -485,7 +486,7 @@ USER( ldrnet r7, [r1], #4) @ May fault
strb r3, [r0], #1
movge r3, r7, get_byte_3
strgeb r3, [r0], #1
-USER( ldrgtbt r3, [r1], #0) @ May fault
+USER( T(ldrgtb) r3, [r1], #0) @ May fault
strgtb r3, [r0], #1
b .Lcfu_finished
@@ -493,7 +494,7 @@ USER( ldrgtbt r3, [r1], #0) @ May fault
addmi ip, r2, #4
bmi .Lcfu_3nowords
mov r3, r7, pull #24
-USER( ldrt r7, [r1], #4) @ May fault
+USER( T(ldr) r7, [r1], #4) @ May fault
orr r3, r3, r7, push #8
str r3, [r0], #4
mov ip, r1, lsl #32 - PAGE_SHIFT
@@ -528,7 +529,7 @@ USER( ldrt r7, [r1], #4) @ May fault
stmneia r0!, {r3 - r4}
tst ip, #4
movne r3, r7, pull #24
-USER( ldrnet r7, [r1], #4) @ May fault
+USER( T(ldrne) r7, [r1], #4) @ May fault
orrne r3, r3, r7, push #8
strne r3, [r0], #4
ands ip, ip, #3
@@ -538,9 +539,9 @@ USER( ldrnet r7, [r1], #4) @ May fault
beq .Lcfu_finished
cmp ip, #2
strb r3, [r0], #1
-USER( ldrgebt r3, [r1], #1) @ May fault
+USER( T(ldrgeb) r3, [r1], #1) @ May fault
strgeb r3, [r0], #1
-USER( ldrgtbt r3, [r1], #1) @ May fault
+USER( T(ldrgtb) r3, [r1], #1) @ May fault
strgtb r3, [r0], #1
b .Lcfu_finished
ENDPROC(__copy_from_user)
diff --git a/arch/arm/mach-aaec2000/core.c b/arch/arm/mach-aaec2000/core.c
index 3ef68330452a..ac8753539c4f 100644
--- a/arch/arm/mach-aaec2000/core.c
+++ b/arch/arm/mach-aaec2000/core.c
@@ -139,7 +139,7 @@ aaec2000_timer_interrupt(int irq, void *dev_id)
static struct irqaction aaec2000_timer_irq = {
.name = "AAEC-2000 Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = aaec2000_timer_interrupt,
};
diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c
index 2500f41d8d2d..a4a00493ad9e 100644
--- a/arch/arm/mach-at91/at91rm9200_time.c
+++ b/arch/arm/mach-at91/at91rm9200_time.c
@@ -87,7 +87,7 @@ static irqreturn_t at91rm9200_timer_interrupt(int irq, void *dev_id)
static struct irqaction at91rm9200_timer_irq = {
.name = "at91_tick",
- .flags = IRQF_SHARED | IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_SHARED | IRQF_DISABLED | IRQF_TIMER,
.handler = at91rm9200_timer_interrupt
};
diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c
index 608a63240b64..22a290bdce24 100644
--- a/arch/arm/mach-at91/at91sam926x_time.c
+++ b/arch/arm/mach-at91/at91sam926x_time.c
@@ -123,7 +123,7 @@ static irqreturn_t at91sam926x_pit_interrupt(int irq, void *dev_id)
static struct irqaction at91sam926x_pit_irq = {
.name = "at91_tick",
- .flags = IRQF_SHARED | IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_SHARED | IRQF_DISABLED | IRQF_TIMER,
.handler = at91sam926x_pit_interrupt
};
diff --git a/arch/arm/mach-bcmring/core.c b/arch/arm/mach-bcmring/core.c
index d3f959e92b2d..f6b132fa80be 100644
--- a/arch/arm/mach-bcmring/core.c
+++ b/arch/arm/mach-bcmring/core.c
@@ -275,7 +275,7 @@ static irqreturn_t bcmring_timer_interrupt(int irq, void *dev_id)
static struct irqaction bcmring_timer_irq = {
.name = "bcmring Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = bcmring_timer_interrupt,
};
diff --git a/arch/arm/mach-clps711x/time.c b/arch/arm/mach-clps711x/time.c
index d581ef0bcd24..9dffaa60c8d1 100644
--- a/arch/arm/mach-clps711x/time.c
+++ b/arch/arm/mach-clps711x/time.c
@@ -56,7 +56,7 @@ p720t_timer_interrupt(int irq, void *dev_id)
static struct irqaction clps711x_timer_irq = {
.name = "CLPS711x Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = p720t_timer_interrupt,
};
diff --git a/arch/arm/mach-cns3xxx/core.c b/arch/arm/mach-cns3xxx/core.c
index 9ca4d581016f..9dcea9f3a84e 100644
--- a/arch/arm/mach-cns3xxx/core.c
+++ b/arch/arm/mach-cns3xxx/core.c
@@ -178,7 +178,7 @@ static irqreturn_t cns3xxx_timer_interrupt(int irq, void *dev_id)
static struct irqaction cns3xxx_timer_irq = {
.name = "timer",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = cns3xxx_timer_interrupt,
};
diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c
index 8b7201e4c79c..de40e9c787e1 100644
--- a/arch/arm/mach-davinci/devices.c
+++ b/arch/arm/mach-davinci/devices.c
@@ -295,6 +295,18 @@ static void davinci_init_wdt(void)
/*-------------------------------------------------------------------------*/
+struct platform_device davinci_pcm_device = {
+ .name = "davinci-pcm-audio",
+ .id = -1,
+};
+
+static void davinci_init_pcm(void)
+{
+ platform_device_register(&davinci_pcm_device);
+}
+
+/*-------------------------------------------------------------------------*/
+
struct davinci_timer_instance davinci_timer_instance[2] = {
{
.base = DAVINCI_TIMER0_BASE,
@@ -315,6 +327,7 @@ static int __init davinci_init_devices(void)
/* please keep these calls, and their implementations above,
* in alphabetical order so they're easier to sort through.
*/
+ davinci_init_pcm();
davinci_init_wdt();
return 0;
diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c
index c7bc7fbb11a6..efb77343365b 100644
--- a/arch/arm/mach-ebsa110/core.c
+++ b/arch/arm/mach-ebsa110/core.c
@@ -195,7 +195,7 @@ ebsa110_timer_interrupt(int irq, void *dev_id)
static struct irqaction ebsa110_timer_irq = {
.name = "EBSA110 Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = ebsa110_timer_interrupt,
};
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c
index 4cb55d3902ff..54c2301476d8 100644
--- a/arch/arm/mach-ep93xx/core.c
+++ b/arch/arm/mach-ep93xx/core.c
@@ -133,7 +133,7 @@ static irqreturn_t ep93xx_timer_interrupt(int irq, void *dev_id)
static struct irqaction ep93xx_timer_irq = {
.name = "ep93xx timer",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = ep93xx_timer_interrupt,
};
@@ -776,9 +776,15 @@ static struct platform_device ep93xx_i2s_device = {
.resource = ep93xx_i2s_resource,
};
+static struct platform_device ep93xx_pcm_device = {
+ .name = "ep93xx-pcm-audio",
+ .id = -1,
+};
+
void __init ep93xx_register_i2s(void)
{
platform_device_register(&ep93xx_i2s_device);
+ platform_device_register(&ep93xx_pcm_device);
}
#define EP93XX_SYSCON_DEVCFG_I2S_MASK (EP93XX_SYSCON_DEVCFG_I2SONSSP | \
diff --git a/arch/arm/mach-footbridge/dc21285-timer.c b/arch/arm/mach-footbridge/dc21285-timer.c
index bc5e83fb5819..42b0bd787d6f 100644
--- a/arch/arm/mach-footbridge/dc21285-timer.c
+++ b/arch/arm/mach-footbridge/dc21285-timer.c
@@ -41,7 +41,7 @@ timer1_interrupt(int irq, void *dev_id)
static struct irqaction footbridge_timer_irq = {
.name = "Timer1 timer tick",
.handler = timer1_interrupt,
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
};
/*
diff --git a/arch/arm/mach-footbridge/isa-timer.c b/arch/arm/mach-footbridge/isa-timer.c
index f488fa2082d7..ca1932e2a2c3 100644
--- a/arch/arm/mach-footbridge/isa-timer.c
+++ b/arch/arm/mach-footbridge/isa-timer.c
@@ -71,7 +71,7 @@ isa_timer_interrupt(int irq, void *dev_id)
static struct irqaction isa_timer_irq = {
.name = "ISA timer tick",
.handler = isa_timer_interrupt,
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
};
static void __init isa_timer_init(void)
diff --git a/arch/arm/mach-h720x/cpu-h7201.c b/arch/arm/mach-h720x/cpu-h7201.c
index 24df2a349a98..be1db54c6870 100644
--- a/arch/arm/mach-h720x/cpu-h7201.c
+++ b/arch/arm/mach-h720x/cpu-h7201.c
@@ -37,7 +37,7 @@ h7201_timer_interrupt(int irq, void *dev_id)
static struct irqaction h7201_timer_irq = {
.name = "h7201 Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = h7201_timer_interrupt,
};
diff --git a/arch/arm/mach-h720x/cpu-h7202.c b/arch/arm/mach-h720x/cpu-h7202.c
index fd33a19c813a..e40deea5f5dc 100644
--- a/arch/arm/mach-h720x/cpu-h7202.c
+++ b/arch/arm/mach-h720x/cpu-h7202.c
@@ -166,7 +166,7 @@ static struct irq_chip h7202_timerx_chip = {
static struct irqaction h7202_timer_irq = {
.name = "h7202 Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = h7202_timer_interrupt,
};
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index c5c0369bb481..19ed16d0017e 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -163,6 +163,15 @@ config MACH_MX27_3DS
Include support for MX27PDK platform. This includes specific
configurations for the board and its peripherals.
+config MACH_IMX27_VISSTRIM_M10
+ bool "Vista Silicon i.MX27 Visstrim_m10"
+ select IMX_HAVE_PLATFORM_IMX_I2C
+ select IMX_HAVE_PLATFORM_IMX_UART
+ help
+ Include support for Visstrim_m10 platform and its different variants.
+ This includes specific configurations for the board and its
+ peripherals.
+
config MACH_IMX27LITE
bool "LogicPD MX27 LITEKIT platform"
select IMX_HAVE_PLATFORM_IMX_UART
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index 46a9fdfbbd15..5582692bb176 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -27,6 +27,7 @@ obj-$(CONFIG_MACH_PCM038) += mach-pcm038.o
obj-$(CONFIG_MACH_PCM970_BASEBOARD) += pcm970-baseboard.o
obj-$(CONFIG_MACH_MX27_3DS) += mach-mx27_3ds.o
obj-$(CONFIG_MACH_IMX27LITE) += mach-imx27lite.o
+obj-$(CONFIG_MACH_IMX27_VISSTRIM_M10) += mach-imx27_visstrim_m10.o
obj-$(CONFIG_MACH_CPUIMX27) += mach-cpuimx27.o
obj-$(CONFIG_MACH_EUKREA_MBIMX27_BASEBOARD) += eukrea_mbimx27-baseboard.o
obj-$(CONFIG_MACH_PCA100) += mach-pca100.o
diff --git a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c
new file mode 100644
index 000000000000..6dad632b83d6
--- /dev/null
+++ b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c
@@ -0,0 +1,263 @@
+/*
+ * mach-imx27_visstrim_m10.c
+ *
+ * Copyright 2010 Javier Martin <javier.martin@vista-silicon.com>
+ *
+ * Based on mach-pcm038.c, mach-pca100.c, mach-mx27ads.c and others.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/platform_device.h>
+#include <linux/mtd/physmap.h>
+#include <linux/i2c.h>
+#include <linux/i2c/pca953x.h>
+#include <linux/gpio_keys.h>
+#include <linux/input.h>
+#include <linux/gpio.h>
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/time.h>
+#include <mach/common.h>
+#include <mach/mmc.h>
+#include <mach/iomux.h>
+#include <mach/mxc_ehci.h>
+
+#include "devices-imx27.h"
+#include "devices.h"
+
+#define OTG_PHY_CS_GPIO (GPIO_PORTF + 17)
+#define SDHC1_IRQ IRQ_GPIOB(25)
+
+static int visstrim_m10_pins[] = {
+ /* UART1 (console) */
+ PE12_PF_UART1_TXD,
+ PE13_PF_UART1_RXD,
+ PE14_PF_UART1_CTS,
+ PE15_PF_UART1_RTS,
+ /* FEC */
+ PD0_AIN_FEC_TXD0,
+ PD1_AIN_FEC_TXD1,
+ PD2_AIN_FEC_TXD2,
+ PD3_AIN_FEC_TXD3,
+ PD4_AOUT_FEC_RX_ER,
+ PD5_AOUT_FEC_RXD1,
+ PD6_AOUT_FEC_RXD2,
+ PD7_AOUT_FEC_RXD3,
+ PD8_AF_FEC_MDIO,
+ PD9_AIN_FEC_MDC,
+ PD10_AOUT_FEC_CRS,
+ PD11_AOUT_FEC_TX_CLK,
+ PD12_AOUT_FEC_RXD0,
+ PD13_AOUT_FEC_RX_DV,
+ PD14_AOUT_FEC_RX_CLK,
+ PD15_AOUT_FEC_COL,
+ PD16_AIN_FEC_TX_ER,
+ PF23_AIN_FEC_TX_EN,
+ /* SDHC1 */
+ PE18_PF_SD1_D0,
+ PE19_PF_SD1_D1,
+ PE20_PF_SD1_D2,
+ PE21_PF_SD1_D3,
+ PE22_PF_SD1_CMD,
+ PE23_PF_SD1_CLK,
+ /* Both I2Cs */
+ PD17_PF_I2C_DATA,
+ PD18_PF_I2C_CLK,
+ PC5_PF_I2C2_SDA,
+ PC6_PF_I2C2_SCL,
+ /* USB OTG */
+ OTG_PHY_CS_GPIO | GPIO_GPIO | GPIO_OUT,
+ PC9_PF_USBOTG_DATA0,
+ PC11_PF_USBOTG_DATA1,
+ PC10_PF_USBOTG_DATA2,
+ PC13_PF_USBOTG_DATA3,
+ PC12_PF_USBOTG_DATA4,
+ PC7_PF_USBOTG_DATA5,
+ PC8_PF_USBOTG_DATA6,
+ PE25_PF_USBOTG_DATA7,
+ PE24_PF_USBOTG_CLK,
+ PE2_PF_USBOTG_DIR,
+ PE0_PF_USBOTG_NXT,
+ PE1_PF_USBOTG_STP,
+ PB23_PF_USB_PWR,
+ PB24_PF_USB_OC,
+};
+
+/* GPIOs used as events for applications */
+static struct gpio_keys_button visstrim_gpio_keys[] = {
+ {
+ .type = EV_KEY,
+ .code = KEY_RESTART,
+ .gpio = (GPIO_PORTC + 15),
+ .desc = "Default config",
+ .active_low = 0,
+ .wakeup = 1,
+ },
+ {
+ .type = EV_KEY,
+ .code = KEY_RECORD,
+ .gpio = (GPIO_PORTF + 14),
+ .desc = "Record",
+ .active_low = 0,
+ .wakeup = 1,
+ },
+ {
+ .type = EV_KEY,
+ .code = KEY_STOP,
+ .gpio = (GPIO_PORTF + 13),
+ .desc = "Stop",
+ .active_low = 0,
+ .wakeup = 1,
+ }
+};
+
+static struct gpio_keys_platform_data visstrim_gpio_keys_platform_data = {
+ .buttons = visstrim_gpio_keys,
+ .nbuttons = ARRAY_SIZE(visstrim_gpio_keys),
+};
+
+static struct platform_device visstrim_gpio_keys_device = {
+ .name = "gpio-keys",
+ .id = -1,
+ .dev = {
+ .platform_data = &visstrim_gpio_keys_platform_data,
+ },
+};
+
+/* Visstrim_SM10 has a microSD slot connected to sdhc1 */
+static int visstrim_m10_sdhc1_init(struct device *dev,
+ irq_handler_t detect_irq, void *data)
+{
+ int ret;
+
+ ret = request_irq(SDHC1_IRQ, detect_irq, IRQF_TRIGGER_FALLING,
+ "mmc-detect", data);
+ return ret;
+}
+
+static void visstrim_m10_sdhc1_exit(struct device *dev, void *data)
+{
+ free_irq(SDHC1_IRQ, data);
+}
+
+static struct imxmmc_platform_data visstrim_m10_sdhc_pdata = {
+ .init = visstrim_m10_sdhc1_init,
+ .exit = visstrim_m10_sdhc1_exit,
+};
+
+/* Visstrim_SM10 NOR flash */
+static struct physmap_flash_data visstrim_m10_flash_data = {
+ .width = 2,
+};
+
+static struct resource visstrim_m10_flash_resource = {
+ .start = 0xc0000000,
+ .end = 0xc0000000 + SZ_64M - 1,
+ .flags = IORESOURCE_MEM,
+};
+
+static struct platform_device visstrim_m10_nor_mtd_device = {
+ .name = "physmap-flash",
+ .id = 0,
+ .dev = {
+ .platform_data = &visstrim_m10_flash_data,
+ },
+ .num_resources = 1,
+ .resource = &visstrim_m10_flash_resource,
+};
+
+static struct platform_device *platform_devices[] __initdata = {
+ &visstrim_gpio_keys_device,
+ &visstrim_m10_nor_mtd_device,
+ &mxc_fec_device,
+};
+
+/* Visstrim_M10 uses UART0 as console */
+static const struct imxuart_platform_data uart_pdata __initconst = {
+ .flags = IMXUART_HAVE_RTSCTS,
+};
+
+/* I2C */
+static const struct imxi2c_platform_data visstrim_m10_i2c_data __initconst = {
+ .bitrate = 100000,
+};
+
+static struct pca953x_platform_data visstrim_m10_pca9555_pdata = {
+ .gpio_base = 240, /* After MX27 internal GPIOs */
+ .invert = 0,
+};
+
+static struct i2c_board_info visstrim_m10_i2c_devices[] = {
+ {
+ I2C_BOARD_INFO("pca9555", 0x20),
+ .platform_data = &visstrim_m10_pca9555_pdata,
+ },
+};
+
+/* USB OTG */
+static int otg_phy_init(struct platform_device *pdev)
+{
+ gpio_set_value(OTG_PHY_CS_GPIO, 0);
+ return 0;
+}
+
+static struct mxc_usbh_platform_data visstrim_m10_usbotg_pdata = {
+ .init = otg_phy_init,
+ .portsc = MXC_EHCI_MODE_ULPI | MXC_EHCI_UTMI_8BIT,
+ .flags = MXC_EHCI_POWER_PINS_ENABLED,
+};
+
+static void __init visstrim_m10_board_init(void)
+{
+ int ret;
+
+ ret = mxc_gpio_setup_multiple_pins(visstrim_m10_pins,
+ ARRAY_SIZE(visstrim_m10_pins), "VISSTRIM_M10");
+ if (ret)
+ pr_err("Failed to setup pins (%d)\n", ret);
+
+ imx27_add_imx_uart0(&uart_pdata);
+
+ i2c_register_board_info(0, visstrim_m10_i2c_devices,
+ ARRAY_SIZE(visstrim_m10_i2c_devices));
+ imx27_add_i2c_imx0(&visstrim_m10_i2c_data);
+ imx27_add_i2c_imx1(&visstrim_m10_i2c_data);
+ mxc_register_device(&mxc_sdhc_device0, &visstrim_m10_sdhc_pdata);
+ mxc_register_device(&mxc_otg_host, &visstrim_m10_usbotg_pdata);
+ platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
+}
+
+static void __init visstrim_m10_timer_init(void)
+{
+ mx27_clocks_init((unsigned long)25000000);
+}
+
+static struct sys_timer visstrim_m10_timer = {
+ .init = visstrim_m10_timer_init,
+};
+
+MACHINE_START(IMX27_VISSTRIM_M10, "Vista Silicon Visstrim_M10")
+ .phys_io = MX27_AIPI_BASE_ADDR,
+ .io_pg_offst = ((MX27_AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc,
+ .boot_params = MX27_PHYS_OFFSET + 0x100,
+ .map_io = mx27_map_io,
+ .init_irq = mx27_init_irq,
+ .init_machine = visstrim_m10_board_init,
+ .timer = &visstrim_m10_timer,
+MACHINE_END
diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c
index 6ab5a03ab9d8..3459da325406 100644
--- a/arch/arm/mach-integrator/integrator_ap.c
+++ b/arch/arm/mach-integrator/integrator_ap.c
@@ -449,7 +449,7 @@ static struct clock_event_device integrator_clockevent = {
static struct irqaction integrator_timer_irq = {
.name = "timer",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = integrator_timer_interrupt,
.dev_id = &integrator_clockevent,
};
diff --git a/arch/arm/mach-ixp2000/core.c b/arch/arm/mach-ixp2000/core.c
index babb22597163..693275d1139d 100644
--- a/arch/arm/mach-ixp2000/core.c
+++ b/arch/arm/mach-ixp2000/core.c
@@ -213,7 +213,7 @@ static int ixp2000_timer_interrupt(int irq, void *dev_id)
static struct irqaction ixp2000_timer_irq = {
.name = "IXP2000 Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = ixp2000_timer_interrupt,
};
diff --git a/arch/arm/mach-ixp23xx/core.c b/arch/arm/mach-ixp23xx/core.c
index aa4c4420ff3d..8967392b6a66 100644
--- a/arch/arm/mach-ixp23xx/core.c
+++ b/arch/arm/mach-ixp23xx/core.c
@@ -359,7 +359,7 @@ ixp23xx_timer_interrupt(int irq, void *dev_id)
static struct irqaction ixp23xx_timer_irq = {
.name = "IXP23xx Timer Tick",
.handler = ixp23xx_timer_interrupt,
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
};
void __init ixp23xx_init_timer(void)
diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c
index 0bce09799d18..9a574fb42f62 100644
--- a/arch/arm/mach-ixp4xx/common.c
+++ b/arch/arm/mach-ixp4xx/common.c
@@ -278,7 +278,7 @@ static irqreturn_t ixp4xx_timer_interrupt(int irq, void *dev_id)
static struct irqaction ixp4xx_timer_irq = {
.name = "timer1",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = ixp4xx_timer_interrupt,
.dev_id = &clockevent_ixp4xx,
};
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c
index 1c82d4290dad..0f6ee32678ef 100644
--- a/arch/arm/mach-kirkwood/common.c
+++ b/arch/arm/mach-kirkwood/common.c
@@ -903,10 +903,16 @@ static struct platform_device kirkwood_i2s_device = {
},
};
+static struct platform_device kirkwood_pcm_device = {
+ .name = "kirkwood-pcm",
+ .id = -1,
+};
+
void __init kirkwood_audio_init(void)
{
kirkwood_clk_ctrl |= CGC_AUDIO;
platform_device_register(&kirkwood_i2s_device);
+ platform_device_register(&kirkwood_pcm_device);
}
/*****************************************************************************
diff --git a/arch/arm/mach-lh7a40x/time.c b/arch/arm/mach-lh7a40x/time.c
index 4601e425bae3..841fe8c518c5 100644
--- a/arch/arm/mach-lh7a40x/time.c
+++ b/arch/arm/mach-lh7a40x/time.c
@@ -49,7 +49,7 @@ lh7a40x_timer_interrupt(int irq, void *dev_id)
static struct irqaction lh7a40x_timer_irq = {
.name = "LHA740x Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = lh7a40x_timer_interrupt,
};
diff --git a/arch/arm/mach-mmp/time.c b/arch/arm/mach-mmp/time.c
index 66528193f939..1faf6b15c7f0 100644
--- a/arch/arm/mach-mmp/time.c
+++ b/arch/arm/mach-mmp/time.c
@@ -177,7 +177,7 @@ static void __init timer_config(void)
static struct irqaction timer_irq = {
.name = "timer",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = timer_interrupt,
.dev_id = &ckevt,
};
diff --git a/arch/arm/mach-mx25/eukrea_mbimxsd-baseboard.c b/arch/arm/mach-mx25/eukrea_mbimxsd-baseboard.c
index 91931dcb0689..4aaadc753d3e 100644
--- a/arch/arm/mach-mx25/eukrea_mbimxsd-baseboard.c
+++ b/arch/arm/mach-mx25/eukrea_mbimxsd-baseboard.c
@@ -215,7 +215,7 @@ struct imx_ssi_platform_data eukrea_mbimxsd_ssi_pdata = {
* Add platform devices present on this baseboard and init
* them from CPU side as far as required to use them later on
*/
-void __init eukrea_mbimxsd_baseboard_init(void)
+void __init eukrea_mbimxsd25_baseboard_init(void)
{
if (mxc_iomux_v3_setup_multiple_pads(eukrea_mbimxsd_pads,
ARRAY_SIZE(eukrea_mbimxsd_pads)))
diff --git a/arch/arm/mach-mx25/mach-cpuimx25.c b/arch/arm/mach-mx25/mach-cpuimx25.c
index 56b2e26d23b4..b5efee23008f 100644
--- a/arch/arm/mach-mx25/mach-cpuimx25.c
+++ b/arch/arm/mach-mx25/mach-cpuimx25.c
@@ -147,8 +147,8 @@ static void __init eukrea_cpuimx25_init(void)
if (!otg_mode_host)
mxc_register_device(&otg_udc_device, &otg_device_pdata);
-#ifdef CONFIG_MACH_EUKREA_MBIMXSD_BASEBOARD
- eukrea_mbimxsd_baseboard_init();
+#ifdef CONFIG_MACH_EUKREA_MBIMXSD25_BASEBOARD
+ eukrea_mbimxsd25_baseboard_init();
#endif
}
diff --git a/arch/arm/mach-mx3/clock-imx31.c b/arch/arm/mach-mx3/clock-imx31.c
index 9a9eb6de6127..9b52a67abf2d 100644
--- a/arch/arm/mach-mx3/clock-imx31.c
+++ b/arch/arm/mach-mx3/clock-imx31.c
@@ -558,8 +558,8 @@ static struct clk_lookup lookups[] = {
_REGISTER_CLOCK("mxc_w1.0", NULL, owire_clk)
_REGISTER_CLOCK("mxc-mmc.0", NULL, sdhc1_clk)
_REGISTER_CLOCK("mxc-mmc.1", NULL, sdhc2_clk)
- _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk)
- _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk)
+ _REGISTER_CLOCK("imx-ssi-dai.0", NULL, ssi1_clk)
+ _REGISTER_CLOCK("imx-ssi-dai.1", NULL, ssi2_clk)
_REGISTER_CLOCK(NULL, "firi", firi_clk)
_REGISTER_CLOCK(NULL, "ata", ata_clk)
_REGISTER_CLOCK(NULL, "rtic", rtic_clk)
diff --git a/arch/arm/mach-mx3/clock-imx35.c b/arch/arm/mach-mx3/clock-imx35.c
index d3af0fdf8475..f29c3e91fa3a 100644
--- a/arch/arm/mach-mx3/clock-imx35.c
+++ b/arch/arm/mach-mx3/clock-imx35.c
@@ -464,8 +464,8 @@ static struct clk_lookup lookups[] = {
_REGISTER_CLOCK(NULL, "sdma", sdma_clk)
_REGISTER_CLOCK(NULL, "spba", spba_clk)
_REGISTER_CLOCK(NULL, "spdif", spdif_clk)
- _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk)
- _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk)
+ _REGISTER_CLOCK("imx-ssi-dai.0", NULL, ssi1_clk)
+ _REGISTER_CLOCK("imx-ssi-dai.1", NULL, ssi2_clk)
_REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk)
_REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk)
_REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk)
diff --git a/arch/arm/mach-mx3/devices.c b/arch/arm/mach-mx3/devices.c
index a4fd1a26fc91..90eccba66d00 100644
--- a/arch/arm/mach-mx3/devices.c
+++ b/arch/arm/mach-mx3/devices.c
@@ -327,14 +327,14 @@ static struct resource imx_ssi_resources1[] = {
};
struct platform_device imx_ssi_device0 = {
- .name = "imx-ssi",
+ .name = "imx-ssi-dai",
.id = 0,
.num_resources = ARRAY_SIZE(imx_ssi_resources0),
.resource = imx_ssi_resources0,
};
struct platform_device imx_ssi_device1 = {
- .name = "imx-ssi",
+ .name = "imx-ssi-dai",
.id = 1,
.num_resources = ARRAY_SIZE(imx_ssi_resources1),
.resource = imx_ssi_resources1,
diff --git a/arch/arm/mach-mx3/eukrea_mbimxsd-baseboard.c b/arch/arm/mach-mx3/eukrea_mbimxsd-baseboard.c
index 1dc5004df866..f8f15e3ac7a0 100644
--- a/arch/arm/mach-mx3/eukrea_mbimxsd-baseboard.c
+++ b/arch/arm/mach-mx3/eukrea_mbimxsd-baseboard.c
@@ -216,7 +216,7 @@ struct imx_ssi_platform_data eukrea_mbimxsd_ssi_pdata = {
* Add platform devices present on this baseboard and init
* them from CPU side as far as required to use them later on
*/
-void __init eukrea_mbimxsd_baseboard_init(void)
+void __init eukrea_mbimxsd35_baseboard_init(void)
{
if (mxc_iomux_v3_setup_multiple_pads(eukrea_mbimxsd_pads,
ARRAY_SIZE(eukrea_mbimxsd_pads)))
diff --git a/arch/arm/mach-mx3/mach-cpuimx35.c b/arch/arm/mach-mx3/mach-cpuimx35.c
index 63f970f340a2..e4268bbb8fbc 100644
--- a/arch/arm/mach-mx3/mach-cpuimx35.c
+++ b/arch/arm/mach-mx3/mach-cpuimx35.c
@@ -201,8 +201,8 @@ static void __init mxc_board_init(void)
if (!otg_mode_host)
mxc_register_device(&mxc_otg_udc_device, &otg_device_pdata);
-#ifdef CONFIG_MACH_EUKREA_MBIMXSD_BASEBOARD
- eukrea_mbimxsd_baseboard_init();
+#ifdef CONFIG_MACH_EUKREA_MBIMXSD35_BASEBOARD
+ eukrea_mbimxsd35_baseboard_init();
#endif
}
diff --git a/arch/arm/mach-netx/time.c b/arch/arm/mach-netx/time.c
index 82801dbf0579..c0cc83697927 100644
--- a/arch/arm/mach-netx/time.c
+++ b/arch/arm/mach-netx/time.c
@@ -100,7 +100,7 @@ netx_timer_interrupt(int irq, void *dev_id)
static struct irqaction netx_timer_irq = {
.name = "NetX Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = netx_timer_interrupt,
};
diff --git a/arch/arm/mach-ns9xxx/irq.c b/arch/arm/mach-ns9xxx/irq.c
index 038f24d47023..6be86e93b183 100644
--- a/arch/arm/mach-ns9xxx/irq.c
+++ b/arch/arm/mach-ns9xxx/irq.c
@@ -82,9 +82,6 @@ static void handle_prio_irq(unsigned int irq, struct irq_desc *desc)
action_ret = handle_IRQ_event(irq, action);
- /* XXX: There is no direct way to access noirqdebug, so check
- * unconditionally for spurious irqs...
- * Maybe this function should go to kernel/irq/chip.c? */
note_interrupt(irq, desc, action_ret);
raw_spin_lock(&desc->lock);
diff --git a/arch/arm/mach-ns9xxx/time-ns9360.c b/arch/arm/mach-ns9xxx/time-ns9360.c
index 77281260358a..e60627f292d8 100644
--- a/arch/arm/mach-ns9xxx/time-ns9360.c
+++ b/arch/arm/mach-ns9xxx/time-ns9360.c
@@ -121,7 +121,7 @@ static irqreturn_t ns9360_clockevent_handler(int irq, void *dev_id)
static struct irqaction ns9360_clockevent_action = {
.name = "ns9360-timer" __stringify(TIMER_CLOCKEVENT),
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = ns9360_clockevent_handler,
};
diff --git a/arch/arm/mach-nuc93x/time.c b/arch/arm/mach-nuc93x/time.c
index 2f90f9dc6e30..8e0dbea8ec24 100644
--- a/arch/arm/mach-nuc93x/time.c
+++ b/arch/arm/mach-nuc93x/time.c
@@ -56,7 +56,7 @@ static irqreturn_t nuc93x_timer_interrupt(int irq, void *dev_id)
static struct irqaction nuc93x_timer_irq = {
.name = "nuc93x Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = nuc93x_timer_interrupt,
};
diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c
index aa0725608fb1..b583121b04b9 100644
--- a/arch/arm/mach-omap1/devices.c
+++ b/arch/arm/mach-omap1/devices.c
@@ -25,6 +25,7 @@
#include <mach/gpio.h>
#include <plat/mmc.h>
#include <plat/omap7xx.h>
+#include <plat/mcbsp.h>
/*-------------------------------------------------------------------------*/
@@ -195,6 +196,30 @@ static inline void omap_init_spi100k(void)
static inline void omap_init_sti(void) {}
+#if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE)
+
+static struct platform_device omap_pcm = {
+ .name = "omap-pcm-audio",
+ .id = -1,
+};
+
+OMAP_MCBSP_PLATFORM_DEVICE(1);
+OMAP_MCBSP_PLATFORM_DEVICE(2);
+OMAP_MCBSP_PLATFORM_DEVICE(3);
+
+static void omap_init_audio(void)
+{
+ platform_device_register(&omap_mcbsp1);
+ platform_device_register(&omap_mcbsp2);
+ if (!cpu_is_omap7xx())
+ platform_device_register(&omap_mcbsp3);
+ platform_device_register(&omap_pcm);
+}
+
+#else
+static inline void omap_init_audio(void) {}
+#endif
+
/*-------------------------------------------------------------------------*/
/*
@@ -227,6 +252,7 @@ static int __init omap1_init_devices(void)
omap_init_rtc();
omap_init_spi100k();
omap_init_sti();
+ omap_init_audio();
return 0;
}
diff --git a/arch/arm/mach-omap1/time.c b/arch/arm/mach-omap1/time.c
index 1be6a214d88d..c62fa799fe78 100644
--- a/arch/arm/mach-omap1/time.c
+++ b/arch/arm/mach-omap1/time.c
@@ -157,7 +157,7 @@ static irqreturn_t omap_mpu_timer1_interrupt(int irq, void *dev_id)
static struct irqaction omap_mpu_timer1_irq = {
.name = "mpu_timer1",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = omap_mpu_timer1_interrupt,
};
diff --git a/arch/arm/mach-omap1/timer32k.c b/arch/arm/mach-omap1/timer32k.c
index 20cfbcc6c60c..8ad901b566f4 100644
--- a/arch/arm/mach-omap1/timer32k.c
+++ b/arch/arm/mach-omap1/timer32k.c
@@ -156,7 +156,7 @@ static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id)
static struct irqaction omap_32k_timer_irq = {
.name = "32KHz timer",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = omap_32k_timer_interrupt,
};
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 63b2d8859c3c..88d3a1e920f5 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -25,6 +25,7 @@ obj-$(CONFIG_LOCAL_TIMERS) += timer-mpu.o
obj-$(CONFIG_HOTPLUG_CPU) += omap-hotplug.o
obj-$(CONFIG_ARCH_OMAP4) += omap44xx-smc.o omap4-common.o
+AFLAGS_omap-headsmp.o :=-Wa,-march=armv7-a
AFLAGS_omap44xx-smc.o :=-Wa,-march=armv7-a
# Functions loaded to SRAM
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c
index a3e2b49aa39f..8fd226989b25 100644
--- a/arch/arm/mach-omap2/board-n8x0.c
+++ b/arch/arm/mach-omap2/board-n8x0.c
@@ -20,6 +20,7 @@
#include <linux/i2c.h>
#include <linux/spi/spi.h>
#include <linux/usb/musb.h>
+#include <sound/tlv320aic3x.h>
#include <asm/mach/arch.h>
#include <asm/mach-types.h>
@@ -614,29 +615,35 @@ static int n8x0_menelaus_late_init(struct device *dev)
return 0;
}
-static struct i2c_board_info __initdata n8x0_i2c_board_info_1[] = {
+#else
+static int n8x0_menelaus_late_init(struct device *dev)
+{
+ return 0;
+}
+#endif
+
+static struct menelaus_platform_data n8x0_menelaus_platform_data __initdata = {
+ .late_init = n8x0_menelaus_late_init,
+};
+
+static struct i2c_board_info __initdata n8x0_i2c_board_info_1[] __initdata = {
{
I2C_BOARD_INFO("menelaus", 0x72),
.irq = INT_24XX_SYS_NIRQ,
+ .platform_data = &n8x0_menelaus_platform_data,
},
};
-static struct menelaus_platform_data n8x0_menelaus_platform_data = {
- .late_init = n8x0_menelaus_late_init,
+static struct aic3x_pdata n810_aic33_data __initdata = {
+ .gpio_reset = 118,
};
-static void __init n8x0_menelaus_init(void)
-{
- n8x0_i2c_board_info_1[0].platform_data = &n8x0_menelaus_platform_data;
- omap_register_i2c_bus(1, 400, n8x0_i2c_board_info_1,
- ARRAY_SIZE(n8x0_i2c_board_info_1));
-}
-
-#else
-static inline void __init n8x0_menelaus_init(void)
-{
-}
-#endif
+static struct i2c_board_info n810_i2c_board_info_2[] __initdata = {
+ {
+ I2C_BOARD_INFO("tlv320aic3x", 0x18),
+ .platform_data = &n810_aic33_data,
+ },
+};
static void __init n8x0_map_io(void)
{
@@ -653,6 +660,11 @@ static void __init n8x0_init_irq(void)
#ifdef CONFIG_OMAP_MUX
static struct omap_board_mux board_mux[] __initdata = {
+ /* I2S codec port pins for McBSP block */
+ OMAP2420_MUX(EAC_AC_SCLK, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
+ OMAP2420_MUX(EAC_AC_FS, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
+ OMAP2420_MUX(EAC_AC_DIN, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
+ OMAP2420_MUX(EAC_AC_DOUT, OMAP_MUX_MODE1 | OMAP_PIN_OUTPUT),
{ .reg_offset = OMAP_MUX_TERMINATOR },
};
#else
@@ -665,9 +677,14 @@ static void __init n8x0_init_machine(void)
/* FIXME: add n810 spi devices */
spi_register_board_info(n800_spi_board_info,
ARRAY_SIZE(n800_spi_board_info));
+ omap_register_i2c_bus(1, 400, n8x0_i2c_board_info_1,
+ ARRAY_SIZE(n8x0_i2c_board_info_1));
+ omap_register_i2c_bus(2, 400, NULL, 0);
+ if (machine_is_nokia_n810())
+ i2c_register_board_info(2, n810_i2c_board_info_2,
+ ARRAY_SIZE(n810_i2c_board_info_2));
omap_serial_init();
- n8x0_menelaus_init();
n8x0_onenand_init();
n8x0_mmc_init();
n8x0_usb_init();
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
index c03d1d56db56..96f5bbb73b6f 100644
--- a/arch/arm/mach-omap2/board-omap4panda.c
+++ b/arch/arm/mach-omap2/board-omap4panda.c
@@ -274,8 +274,6 @@ static int __init omap4_panda_i2c_init(void)
}
static void __init omap4_panda_init(void)
{
- int status;
-
omap4_panda_i2c_init();
omap_serial_init();
omap4_twl6030_hsmmc_init(mmc);
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index 9a5eb87425fc..897d960fe16f 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -23,6 +23,7 @@
#include <linux/gpio.h>
#include <linux/gpio_keys.h>
#include <linux/mmc/host.h>
+#include <sound/tlv320aic3x.h>
#include <plat/mcspi.h>
#include <plat/board.h>
@@ -689,7 +690,6 @@ static struct twl4030_power_data rx51_t2scripts_data __initdata = {
};
-
static struct twl4030_platform_data rx51_twldata __initdata = {
.irq_base = TWL4030_IRQ_BASE,
.irq_end = TWL4030_IRQ_END,
@@ -728,6 +728,17 @@ static struct i2c_board_info __initdata rx51_peripherals_i2c_board_info_1[] = {
},
};
+/* Audio setup data */
+static struct aic3x_setup_data rx51_aic34_setup = {
+ .gpio_func[0] = AIC3X_GPIO1_FUNC_DISABLED,
+ .gpio_func[1] = AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT,
+};
+
+static struct aic3x_pdata rx51_aic3x_data = {
+ .setup = &rx51_aic34_setup,
+ .gpio_reset = 60,
+};
+
static struct i2c_board_info __initdata rx51_peripherals_i2c_board_info_2[] = {
{
I2C_BOARD_INFO("tlv320aic3x", 0x18),
diff --git a/arch/arm/mach-omap2/board-zoom2.c b/arch/arm/mach-omap2/board-zoom2.c
index 3ad9ecf7f5e2..efbcd8fb21ec 100644
--- a/arch/arm/mach-omap2/board-zoom2.c
+++ b/arch/arm/mach-omap2/board-zoom2.c
@@ -14,6 +14,7 @@
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/gpio.h>
+#include <linux/i2c/twl.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
@@ -34,8 +35,11 @@ static void __init omap_zoom2_init_irq(void)
omap_gpio_init();
}
-/* REVISIT: These audio entries can be removed once MFD code is merged */
-#if 0
+/* EXTMUTE callback function */
+void zoom2_set_hs_extmute(int mute)
+{
+ gpio_set_value(ZOOM2_HEADSET_EXTMUTE_GPIO, mute);
+}
static struct twl4030_madc_platform_data zoom2_madc_data = {
.irq_line = 1,
@@ -43,6 +47,9 @@ static struct twl4030_madc_platform_data zoom2_madc_data = {
static struct twl4030_codec_audio_data zoom2_audio_data = {
.audio_mclk = 26000000,
+ .ramp_delay_value = 3, /* 161 ms */
+ .hs_extmute = 1,
+ .set_hs_extmute = zoom2_set_hs_extmute,
};
static struct twl4030_codec_data zoom2_codec_data = {
@@ -64,10 +71,24 @@ static struct twl4030_platform_data zoom2_twldata = {
.vmmc1 = &zoom2_vmmc1,
.vmmc2 = &zoom2_vmmc2,
.vsim = &zoom2_vsim,
+};
+static struct i2c_board_info __initdata zoom2_i2c_boardinfo[] = {
+ {
+ I2C_BOARD_INFO("twl4030", 0x48),
+ .flags = I2C_CLIENT_WAKE,
+ .irq = INT_34XX_SYS_NIRQ,
+ .platform_data = &zoom2_twldata,
+ },
};
-#endif
+static int __init omap3_zoom2_i2c_init(void)
+{
+ omap_register_i2c_bus(1, 2600, zoom2_i2c_boardinfo,
+ ARRAY_SIZE(zoom2_i2c_boardinfo));
+ return 0;
+}
+
#ifdef CONFIG_OMAP_MUX
static struct omap_board_mux board_mux[] __initdata = {
@@ -135,6 +156,7 @@ static void __init omap_zoom2_init(void)
{
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
zoom_peripherals_init();
+ omap3_zoom2_i2c_init();
board_nand_init(zoom_nand_partitions,
ARRAY_SIZE(zoom_nand_partitions), ZOOM_NAND_CS);
zoom_debugboard_init();
diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c
index 138646deac89..dfdce2d82779 100644
--- a/arch/arm/mach-omap2/clock3xxx_data.c
+++ b/arch/arm/mach-omap2/clock3xxx_data.c
@@ -3417,7 +3417,13 @@ int __init omap3xxx_clk_init(void)
struct omap_clk *c;
u32 cpu_clkflg = CK_3XXX;
- if (cpu_is_omap34xx()) {
+ if (cpu_is_omap3517()) {
+ cpu_mask = RATE_IN_3XXX | RATE_IN_3430ES2PLUS;
+ cpu_clkflg |= CK_3517;
+ } else if (cpu_is_omap3505()) {
+ cpu_mask = RATE_IN_3XXX | RATE_IN_3430ES2PLUS;
+ cpu_clkflg |= CK_3505;
+ } else if (cpu_is_omap34xx()) {
cpu_mask = RATE_IN_3XXX;
cpu_clkflg |= CK_343X;
@@ -3432,12 +3438,6 @@ int __init omap3xxx_clk_init(void)
cpu_mask |= RATE_IN_3430ES2PLUS;
cpu_clkflg |= CK_3430ES2;
}
- } else if (cpu_is_omap3517()) {
- cpu_mask = RATE_IN_3XXX | RATE_IN_3430ES2PLUS;
- cpu_clkflg |= CK_3517;
- } else if (cpu_is_omap3505()) {
- cpu_mask = RATE_IN_3XXX | RATE_IN_3430ES2PLUS;
- cpu_clkflg |= CK_3505;
}
if (omap3_has_192mhz_clk())
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index 2dbb265bedd4..08e1ad5adb14 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -28,6 +28,7 @@
#include <mach/gpio.h>
#include <plat/mmc.h>
#include <plat/dma.h>
+#include <plat/mcbsp.h>
#include "mux.h"
@@ -235,6 +236,43 @@ static inline void omap_init_mbox(void) { }
static inline void omap_init_sti(void) {}
+#if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE)
+
+static struct platform_device omap_pcm = {
+ .name = "omap-pcm-audio",
+ .id = -1,
+};
+
+/*
+ * OMAP2420 has 2 McBSP ports
+ * OMAP2430 has 5 McBSP ports
+ * OMAP3 has 5 McBSP ports
+ * OMAP4 has 4 McBSP ports
+ */
+OMAP_MCBSP_PLATFORM_DEVICE(1);
+OMAP_MCBSP_PLATFORM_DEVICE(2);
+OMAP_MCBSP_PLATFORM_DEVICE(3);
+OMAP_MCBSP_PLATFORM_DEVICE(4);
+OMAP_MCBSP_PLATFORM_DEVICE(5);
+
+static void omap_init_audio(void)
+{
+ platform_device_register(&omap_mcbsp1);
+ platform_device_register(&omap_mcbsp2);
+ if (cpu_is_omap243x() || cpu_is_omap34xx() || cpu_is_omap44xx()) {
+ platform_device_register(&omap_mcbsp3);
+ platform_device_register(&omap_mcbsp4);
+ }
+ if (cpu_is_omap243x() || cpu_is_omap34xx())
+ platform_device_register(&omap_mcbsp5);
+
+ platform_device_register(&omap_pcm);
+}
+
+#else
+static inline void omap_init_audio(void) {}
+#endif
+
#if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE)
#include <plat/mcspi.h>
@@ -847,6 +885,7 @@ static int __init omap2_init_devices(void)
* in alphabetical order so they're easier to sort through.
*/
omap_hsmmc_reset();
+ omap_init_audio();
omap_init_camera();
omap_init_mbox();
omap_init_mcspi();
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index e8256a2ed8e7..9a879f959509 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -284,8 +284,8 @@ static void __init omap3_check_revision(void)
default:
omap_revision = OMAP3630_REV_ES1_2;
omap_chip.oc |= CHIP_IS_OMAP3630ES1_2;
- break;
}
+ break;
default:
/* Unknown default to latest silicon rev as default*/
omap_revision = OMAP3630_REV_ES1_2;
diff --git a/arch/arm/mach-omap2/include/mach/board-zoom.h b/arch/arm/mach-omap2/include/mach/board-zoom.h
index 3af69d2c3dcd..80591fda8f8f 100644
--- a/arch/arm/mach-omap2/include/mach/board-zoom.h
+++ b/arch/arm/mach-omap2/include/mach/board-zoom.h
@@ -9,3 +9,5 @@
extern void __init board_nand_init(struct mtd_partition *, u8 nr_parts, u8 cs);
extern int __init zoom_debugboard_init(void);
extern void __init zoom_peripherals_init(void);
+
+#define ZOOM2_HEADSET_EXTMUTE_GPIO 153
diff --git a/arch/arm/mach-omap2/include/mach/entry-macro.S b/arch/arm/mach-omap2/include/mach/entry-macro.S
index 50fd74916643..06e64e1fc28a 100644
--- a/arch/arm/mach-omap2/include/mach/entry-macro.S
+++ b/arch/arm/mach-omap2/include/mach/entry-macro.S
@@ -177,7 +177,10 @@ omap_irq_base: .word 0
cmpne \irqnr, \tmp
cmpcs \irqnr, \irqnr
.endm
+#endif
+#endif /* MULTI_OMAP2 */
+#ifdef CONFIG_SMP
/* We assume that irqstat (the raw value of the IRQ acknowledge
* register) is preserved from the macro above.
* If there is an IPI, we immediately signal end of interrupt
@@ -205,8 +208,7 @@ omap_irq_base: .word 0
streq \irqstat, [\base, #GIC_CPU_EOI]
cmp \tmp, #0
.endm
-#endif
-#endif /* MULTI_OMAP2 */
+#endif /* CONFIG_SMP */
.macro irq_prio_table
.endm
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
index ab403b2ed26b..6c2f8f0c0edb 100644
--- a/arch/arm/mach-omap2/mux.c
+++ b/arch/arm/mach-omap2/mux.c
@@ -87,7 +87,7 @@ static char *omap_mux_options;
int __init omap_mux_init_gpio(int gpio, int val)
{
struct omap_mux_entry *e;
- struct omap_mux *gpio_mux;
+ struct omap_mux *gpio_mux = NULL;
u16 old_mode;
u16 mux_mode;
int found = 0;
diff --git a/arch/arm/mach-omap2/omap-iommu.c b/arch/arm/mach-omap2/omap-iommu.c
index f5a1aad1a5c0..bb8c01da6578 100644
--- a/arch/arm/mach-omap2/omap-iommu.c
+++ b/arch/arm/mach-omap2/omap-iommu.c
@@ -35,7 +35,6 @@ static struct iommu_device omap3_devices[] = {
.clk_name = "cam_ick",
},
},
-#if defined(CONFIG_MPU_BRIDGE_IOMMU)
{
.base = 0x5d000000,
.irq = 28,
@@ -45,7 +44,6 @@ static struct iommu_device omap3_devices[] = {
.clk_name = "iva2_ck",
},
},
-#endif
};
#define NR_OMAP3_IOMMU_DEVICES ARRAY_SIZE(omap3_devices)
static struct platform_device *omap3_iommu_pdev[NR_OMAP3_IOMMU_DEVICES];
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c
index af3c20c8d3f9..9e9f70e18e3c 100644
--- a/arch/arm/mach-omap2/omap-smp.c
+++ b/arch/arm/mach-omap2/omap-smp.c
@@ -102,8 +102,7 @@ static void __init wakeup_secondary(void)
* Send a 'sev' to wake the secondary core from WFE.
* Drain the outstanding writes to memory
*/
- dsb();
- set_event();
+ dsb_sev();
mb();
}
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index fb4994ad622e..7b03426c72a3 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -480,7 +480,9 @@ void omap_sram_idle(void)
}
/* Disable IO-PAD and IO-CHAIN wakeup */
- if (omap3_has_io_wakeup() && core_next_state < PWRDM_POWER_ON) {
+ if (omap3_has_io_wakeup() &&
+ (per_next_state < PWRDM_POWER_ON ||
+ core_next_state < PWRDM_POWER_ON)) {
prm_clear_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, PM_WKEN);
omap3_disable_io_chain();
}
diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c
index 74fbed8491f2..ddf9fae448b8 100644
--- a/arch/arm/mach-omap2/timer-gp.c
+++ b/arch/arm/mach-omap2/timer-gp.c
@@ -62,7 +62,7 @@ static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
static struct irqaction omap2_gp_timer_irq = {
.name = "gp timer",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = omap2_gp_timer_interrupt,
};
diff --git a/arch/arm/mach-pnx4008/time.c b/arch/arm/mach-pnx4008/time.c
index 0c8aad4bb0dc..1d5b2dae3183 100644
--- a/arch/arm/mach-pnx4008/time.c
+++ b/arch/arm/mach-pnx4008/time.c
@@ -80,7 +80,7 @@ static irqreturn_t pnx4008_timer_interrupt(int irq, void *dev_id)
static struct irqaction pnx4008_timer_irq = {
.name = "PNX4008 Tick Timer",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = pnx4008_timer_interrupt
};
diff --git a/arch/arm/mach-pxa/devices.c b/arch/arm/mach-pxa/devices.c
index 65447dc736c2..6d845446ce26 100644
--- a/arch/arm/mach-pxa/devices.c
+++ b/arch/arm/mach-pxa/devices.c
@@ -354,6 +354,31 @@ struct platform_device pxa_device_i2s = {
.num_resources = ARRAY_SIZE(pxai2s_resources),
};
+struct platform_device pxa_device_asoc_ssp1 = {
+ .name = "pxa-ssp-dai",
+ .id = 0,
+};
+
+struct platform_device pxa_device_asoc_ssp2= {
+ .name = "pxa-ssp-dai",
+ .id = 1,
+};
+
+struct platform_device pxa_device_asoc_ssp3 = {
+ .name = "pxa-ssp-dai",
+ .id = 2,
+};
+
+struct platform_device pxa_device_asoc_ssp4 = {
+ .name = "pxa-ssp-dai",
+ .id = 3,
+};
+
+struct platform_device pxa_device_asoc_platform = {
+ .name = "pxa-pcm-audio",
+ .id = -1,
+};
+
static u64 pxaficp_dmamask = ~(u32)0;
struct platform_device pxa_device_ficp = {
diff --git a/arch/arm/mach-pxa/devices.h b/arch/arm/mach-pxa/devices.h
index 50353ea49ba4..491a27a92735 100644
--- a/arch/arm/mach-pxa/devices.h
+++ b/arch/arm/mach-pxa/devices.h
@@ -38,4 +38,10 @@ extern struct platform_device pxa3xx_device_i2c_power;
extern struct platform_device pxa3xx_device_gcu;
+extern struct platform_device pxa_device_asoc_platform;
+extern struct platform_device pxa_device_asoc_ssp1;
+extern struct platform_device pxa_device_asoc_ssp2;
+extern struct platform_device pxa_device_asoc_ssp3;
+extern struct platform_device pxa_device_asoc_ssp4;
+
void __init pxa_register_device(struct platform_device *dev, void *data);
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c
index 12e5b9f01e6f..d1fbf29d561c 100644
--- a/arch/arm/mach-pxa/pxa27x.c
+++ b/arch/arm/mach-pxa/pxa27x.c
@@ -385,6 +385,10 @@ static struct platform_device *devices[] __initdata = {
&pxa27x_device_udc,
&pxa_device_pmu,
&pxa_device_i2s,
+ &pxa_device_asoc_ssp1,
+ &pxa_device_asoc_ssp2,
+ &pxa_device_asoc_ssp3,
+ &pxa_device_asoc_platform,
&sa1100_device_rtc,
&pxa_device_rtc,
&pxa27x_device_ssp1,
diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c
index fa0014847c71..90974e6fae6a 100644
--- a/arch/arm/mach-pxa/pxa3xx.c
+++ b/arch/arm/mach-pxa/pxa3xx.c
@@ -610,6 +610,11 @@ static struct platform_device *devices[] __initdata = {
&pxa27x_device_udc,
&pxa_device_pmu,
&pxa_device_i2s,
+ &pxa_device_asoc_ssp1,
+ &pxa_device_asoc_ssp2,
+ &pxa_device_asoc_ssp3,
+ &pxa_device_asoc_ssp4,
+ &pxa_device_asoc_platform,
&sa1100_device_rtc,
&pxa_device_rtc,
&pxa27x_device_ssp1,
diff --git a/arch/arm/mach-pxa/time.c b/arch/arm/mach-pxa/time.c
index 293e40aeaf29..9fa6e1a0b96f 100644
--- a/arch/arm/mach-pxa/time.c
+++ b/arch/arm/mach-pxa/time.c
@@ -133,7 +133,7 @@ static struct clocksource cksrc_pxa_oscr0 = {
static struct irqaction pxa_ost0_irq = {
.name = "ost0",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = pxa_ost0_interrupt,
.dev_id = &ckevt_pxa_osmr0,
};
diff --git a/arch/arm/mach-pxa/zylonite.c b/arch/arm/mach-pxa/zylonite.c
index c479cbecf784..5ba9d99a1bf6 100644
--- a/arch/arm/mach-pxa/zylonite.c
+++ b/arch/arm/mach-pxa/zylonite.c
@@ -45,6 +45,16 @@ int wm9713_irq;
int lcd_id;
int lcd_orientation;
+struct platform_device pxa_device_wm9713_audio = {
+ .name = "wm9713-codec",
+ .id = -1,
+};
+
+static void __init zylonite_init_wm9713_audio(void)
+{
+ platform_device_register(&pxa_device_wm9713_audio);
+}
+
static struct resource smc91x_resources[] = {
[0] = {
.start = ZYLONITE_ETH_PHYS + 0x300,
@@ -408,6 +418,7 @@ static void __init zylonite_init(void)
zylonite_init_nand();
zylonite_init_leds();
zylonite_init_ohci();
+ zylonite_init_wm9713_audio();
}
MACHINE_START(ZYLONITE, "PXA3xx Platform Development Kit (aka Zylonite)")
diff --git a/arch/arm/mach-s3c64xx/dev-audio.c b/arch/arm/mach-s3c64xx/dev-audio.c
index 9648fbc36eec..f0942585b9c1 100644
--- a/arch/arm/mach-s3c64xx/dev-audio.c
+++ b/arch/arm/mach-s3c64xx/dev-audio.c
@@ -333,3 +333,16 @@ void __init s3c64xx_ac97_setup_gpio(int num)
else
s3c_ac97_pdata.cfg_gpio = s3c64xx_ac97_cfg_gpe;
}
+
+static u64 s3c_device_audio_dmamask = 0xffffffffUL;
+
+struct platform_device s3c_device_pcm = {
+ .name = "s3c24xx-pcm-audio",
+ .id = -1,
+ .dev = {
+ .dma_mask = &s3c_device_audio_dmamask,
+ .coherent_dma_mask = 0xffffffffUL
+ }
+};
+EXPORT_SYMBOL(s3c_device_pcm);
+
diff --git a/arch/arm/mach-s3c64xx/dev-ts.c b/arch/arm/mach-s3c64xx/dev-ts.c
new file mode 100644
index 000000000000..17cc7934afbe
--- /dev/null
+++ b/arch/arm/mach-s3c64xx/dev-ts.c
@@ -0,0 +1,61 @@
+/* linux/arch/arm/mach-s3c64xx/dev-ts.c
+ *
+ * Copyright (c) 2008 Simtec Electronics
+ * http://armlinux.simtec.co.uk/
+ * Ben Dooks <ben@simtec.co.uk>, <ben-linux@fluff.org>
+ *
+ * Adapted by Maurus Cuelenaere for s3c64xx
+ *
+ * S3C64XX series device definition for touchscreen device
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/platform_device.h>
+
+#include <mach/irqs.h>
+#include <mach/map.h>
+
+#include <plat/devs.h>
+#include <plat/ts.h>
+
+static struct resource s3c_ts_resource[] = {
+ [0] = {
+ .start = S3C64XX_PA_ADC,
+ .end = S3C64XX_PA_ADC + SZ_256 - 1,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = {
+ .start = IRQ_TC,
+ .end = IRQ_TC,
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
+struct platform_device s3c_device_ts = {
+ .name = "s3c64xx-ts",
+ .id = -1,
+ .num_resources = ARRAY_SIZE(s3c_ts_resource),
+ .resource = s3c_ts_resource,
+};
+
+void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *pd)
+{
+ struct s3c2410_ts_mach_info *npd;
+
+ if (!pd) {
+ printk(KERN_ERR "%s: no platform data\n", __func__);
+ return;
+ }
+
+ npd = kmemdup(pd, sizeof(struct s3c2410_ts_mach_info), GFP_KERNEL);
+ if (!npd)
+ printk(KERN_ERR "%s: no memory for platform data\n", __func__);
+
+ s3c_device_ts.dev.platform_data = npd;
+}
+EXPORT_SYMBOL(s3c24xx_ts_set_platdata);
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c
index d498219fff1b..0a1e1920e2d1 100644
--- a/arch/arm/mach-s3c64xx/mach-smdk6410.c
+++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c
@@ -69,6 +69,7 @@
#include <plat/adc.h>
#include <plat/ts.h>
#include <plat/keypad.h>
+#include <plat/audio.h>
#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
@@ -283,6 +284,8 @@ static struct platform_device *smdk6410_devices[] __initdata = {
&s3c_device_fb,
&s3c_device_ohci,
&s3c_device_usb_hsotg,
+ &s3c64xx_device_ac97,
+ &s3c_device_pcm,
&s3c64xx_device_iisv4,
&samsung_device_keypad,
@@ -699,6 +702,9 @@ static void __init smdk6410_machine_init(void)
s3c_ide_set_platdata(&smdk6410_ide_pdata);
+ /* Board defualt with CFG2.1 off */
+ s3c64xx_ac97_setup_gpio(S3C64XX_AC97_GPD);
+
platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices));
}
diff --git a/arch/arm/mach-sa1100/time.c b/arch/arm/mach-sa1100/time.c
index 74b6e0e570b6..7ec781d5249a 100644
--- a/arch/arm/mach-sa1100/time.c
+++ b/arch/arm/mach-sa1100/time.c
@@ -87,7 +87,7 @@ static struct clocksource cksrc_sa1100_oscr = {
static struct irqaction sa1100_timer_irq = {
.name = "ost0",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = sa1100_ost0_interrupt,
.dev_id = &ckevt_sa1100_osmr0,
};
diff --git a/arch/arm/mach-shark/core.c b/arch/arm/mach-shark/core.c
index 358d875ace14..d1d6ea5e9fcf 100644
--- a/arch/arm/mach-shark/core.c
+++ b/arch/arm/mach-shark/core.c
@@ -130,7 +130,7 @@ shark_timer_interrupt(int irq, void *dev_id)
static struct irqaction shark_timer_irq = {
.name = "Shark Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = shark_timer_interrupt,
};
diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile
index 5e16b4c69222..ae416fe7daf2 100644
--- a/arch/arm/mach-shmobile/Makefile
+++ b/arch/arm/mach-shmobile/Makefile
@@ -3,7 +3,7 @@
#
# Common objects
-obj-y := timer.o console.o clock.o
+obj-y := timer.o console.o clock.o pm_runtime.o
# CPU objects
obj-$(CONFIG_ARCH_SH7367) += setup-sh7367.o clock-sh7367.o intc-sh7367.o
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c
index 23d472f9525e..8afdb1dab029 100644
--- a/arch/arm/mach-shmobile/board-ap4evb.c
+++ b/arch/arm/mach-shmobile/board-ap4evb.c
@@ -39,6 +39,7 @@
#include <linux/sh_clk.h>
#include <linux/gpio.h>
#include <linux/input.h>
+#include <linux/leds.h>
#include <linux/input/sh_keysc.h>
#include <linux/usb/r8a66597.h>
@@ -650,7 +651,44 @@ static struct platform_device hdmi_device = {
},
};
+static struct gpio_led ap4evb_leds[] = {
+ {
+ .name = "led4",
+ .gpio = GPIO_PORT185,
+ .default_state = LEDS_GPIO_DEFSTATE_ON,
+ },
+ {
+ .name = "led2",
+ .gpio = GPIO_PORT186,
+ .default_state = LEDS_GPIO_DEFSTATE_ON,
+ },
+ {
+ .name = "led3",
+ .gpio = GPIO_PORT187,
+ .default_state = LEDS_GPIO_DEFSTATE_ON,
+ },
+ {
+ .name = "led1",
+ .gpio = GPIO_PORT188,
+ .default_state = LEDS_GPIO_DEFSTATE_ON,
+ }
+};
+
+static struct gpio_led_platform_data ap4evb_leds_pdata = {
+ .num_leds = ARRAY_SIZE(ap4evb_leds),
+ .leds = ap4evb_leds,
+};
+
+static struct platform_device leds_device = {
+ .name = "leds-gpio",
+ .id = 0,
+ .dev = {
+ .platform_data = &ap4evb_leds_pdata,
+ },
+};
+
static struct platform_device *ap4evb_devices[] __initdata = {
+ &leds_device,
&nor_flash_device,
&smc911x_device,
&sdhi0_device,
@@ -840,20 +878,6 @@ static void __init ap4evb_init(void)
gpio_request(GPIO_FN_CS5A, NULL);
gpio_request(GPIO_FN_IRQ6_39, NULL);
- /* enable LED 1 - 4 */
- gpio_request(GPIO_PORT185, NULL);
- gpio_request(GPIO_PORT186, NULL);
- gpio_request(GPIO_PORT187, NULL);
- gpio_request(GPIO_PORT188, NULL);
- gpio_direction_output(GPIO_PORT185, 1);
- gpio_direction_output(GPIO_PORT186, 1);
- gpio_direction_output(GPIO_PORT187, 1);
- gpio_direction_output(GPIO_PORT188, 1);
- gpio_export(GPIO_PORT185, 0);
- gpio_export(GPIO_PORT186, 0);
- gpio_export(GPIO_PORT187, 0);
- gpio_export(GPIO_PORT188, 0);
-
/* enable Debug switch (S6) */
gpio_request(GPIO_PORT32, NULL);
gpio_request(GPIO_PORT33, NULL);
diff --git a/arch/arm/mach-shmobile/clock-sh7372.c b/arch/arm/mach-shmobile/clock-sh7372.c
index fb4e9b1d788e..dcaac1b6691d 100644
--- a/arch/arm/mach-shmobile/clock-sh7372.c
+++ b/arch/arm/mach-shmobile/clock-sh7372.c
@@ -395,7 +395,7 @@ static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = {
enum { MSTP001,
MSTP131, MSTP130,
- MSTP129, MSTP128,
+ MSTP129, MSTP128, MSTP127, MSTP126,
MSTP118, MSTP117, MSTP116,
MSTP106, MSTP101, MSTP100,
MSTP223,
@@ -413,6 +413,8 @@ static struct clk mstp_clks[MSTP_NR] = {
[MSTP130] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 30, 0), /* VEU2 */
[MSTP129] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 29, 0), /* VEU1 */
[MSTP128] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 28, 0), /* VEU0 */
+ [MSTP127] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 27, 0), /* CEU */
+ [MSTP126] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 26, 0), /* CSI2 */
[MSTP118] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 18, 0), /* DSITX */
[MSTP117] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 17, 0), /* LCDC1 */
[MSTP116] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR1, 16, 0), /* IIC0 */
@@ -428,7 +430,7 @@ static struct clk mstp_clks[MSTP_NR] = {
[MSTP201] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 1, 0), /* SCIFA3 */
[MSTP200] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 0, 0), /* SCIFA4 */
[MSTP329] = MSTP(&r_clk, SMSTPCR3, 29, 0), /* CMT10 */
- [MSTP328] = MSTP(&div6_clks[DIV6_SPU], SMSTPCR3, 28, CLK_ENABLE_ON_INIT), /* FSIA */
+ [MSTP328] = MSTP(&div6_clks[DIV6_SPU], SMSTPCR3, 28, 0), /* FSIA */
[MSTP323] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 23, 0), /* IIC1 */
[MSTP322] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 22, 0), /* USB0 */
[MSTP314] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 14, 0), /* SDHI0 */
@@ -498,6 +500,8 @@ static struct clk_lookup lookups[] = {
CLKDEV_DEV_ID("uio_pdrv_genirq.3", &mstp_clks[MSTP130]), /* VEU2 */
CLKDEV_DEV_ID("uio_pdrv_genirq.2", &mstp_clks[MSTP129]), /* VEU1 */
CLKDEV_DEV_ID("uio_pdrv_genirq.1", &mstp_clks[MSTP128]), /* VEU0 */
+ CLKDEV_DEV_ID("sh_mobile_ceu.0", &mstp_clks[MSTP127]), /* CEU */
+ CLKDEV_DEV_ID("sh-mobile-csi2.0", &mstp_clks[MSTP126]), /* CSI2 */
CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX */
CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1", &mstp_clks[MSTP117]), /* LCDC1 */
CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* IIC0 */
diff --git a/arch/arm/mach-shmobile/pm_runtime.c b/arch/arm/mach-shmobile/pm_runtime.c
new file mode 100644
index 000000000000..94912d3944d3
--- /dev/null
+++ b/arch/arm/mach-shmobile/pm_runtime.c
@@ -0,0 +1,169 @@
+/*
+ * arch/arm/mach-shmobile/pm_runtime.c
+ *
+ * Runtime PM support code for SuperH Mobile ARM
+ *
+ * Copyright (C) 2009-2010 Magnus Damm
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/pm_runtime.h>
+#include <linux/platform_device.h>
+#include <linux/clk.h>
+#include <linux/sh_clk.h>
+#include <linux/bitmap.h>
+
+#ifdef CONFIG_PM_RUNTIME
+#define BIT_ONCE 0
+#define BIT_ACTIVE 1
+#define BIT_CLK_ENABLED 2
+
+struct pm_runtime_data {
+ unsigned long flags;
+ struct clk *clk;
+};
+
+static void __devres_release(struct device *dev, void *res)
+{
+ struct pm_runtime_data *prd = res;
+
+ dev_dbg(dev, "__devres_release()\n");
+
+ if (test_bit(BIT_CLK_ENABLED, &prd->flags))
+ clk_disable(prd->clk);
+
+ if (test_bit(BIT_ACTIVE, &prd->flags))
+ clk_put(prd->clk);
+}
+
+static struct pm_runtime_data *__to_prd(struct device *dev)
+{
+ return devres_find(dev, __devres_release, NULL, NULL);
+}
+
+static void platform_pm_runtime_init(struct device *dev,
+ struct pm_runtime_data *prd)
+{
+ if (prd && !test_and_set_bit(BIT_ONCE, &prd->flags)) {
+ prd->clk = clk_get(dev, NULL);
+ if (!IS_ERR(prd->clk)) {
+ set_bit(BIT_ACTIVE, &prd->flags);
+ dev_info(dev, "clocks managed by runtime pm\n");
+ }
+ }
+}
+
+static void platform_pm_runtime_bug(struct device *dev,
+ struct pm_runtime_data *prd)
+{
+ if (prd && !test_and_set_bit(BIT_ONCE, &prd->flags))
+ dev_err(dev, "runtime pm suspend before resume\n");
+}
+
+int platform_pm_runtime_suspend(struct device *dev)
+{
+ struct pm_runtime_data *prd = __to_prd(dev);
+
+ dev_dbg(dev, "platform_pm_runtime_suspend()\n");
+
+ platform_pm_runtime_bug(dev, prd);
+
+ if (prd && test_bit(BIT_ACTIVE, &prd->flags)) {
+ clk_disable(prd->clk);
+ clear_bit(BIT_CLK_ENABLED, &prd->flags);
+ }
+
+ return 0;
+}
+
+int platform_pm_runtime_resume(struct device *dev)
+{
+ struct pm_runtime_data *prd = __to_prd(dev);
+
+ dev_dbg(dev, "platform_pm_runtime_resume()\n");
+
+ platform_pm_runtime_init(dev, prd);
+
+ if (prd && test_bit(BIT_ACTIVE, &prd->flags)) {
+ clk_enable(prd->clk);
+ set_bit(BIT_CLK_ENABLED, &prd->flags);
+ }
+
+ return 0;
+}
+
+int platform_pm_runtime_idle(struct device *dev)
+{
+ /* suspend synchronously to disable clocks immediately */
+ return pm_runtime_suspend(dev);
+}
+
+static int platform_bus_notify(struct notifier_block *nb,
+ unsigned long action, void *data)
+{
+ struct device *dev = data;
+ struct pm_runtime_data *prd;
+
+ dev_dbg(dev, "platform_bus_notify() %ld !\n", action);
+
+ if (action == BUS_NOTIFY_BIND_DRIVER) {
+ prd = devres_alloc(__devres_release, sizeof(*prd), GFP_KERNEL);
+ if (prd)
+ devres_add(dev, prd);
+ else
+ dev_err(dev, "unable to alloc memory for runtime pm\n");
+ }
+
+ return 0;
+}
+
+#else /* CONFIG_PM_RUNTIME */
+
+static int platform_bus_notify(struct notifier_block *nb,
+ unsigned long action, void *data)
+{
+ struct device *dev = data;
+ struct clk *clk;
+
+ dev_dbg(dev, "platform_bus_notify() %ld !\n", action);
+
+ switch (action) {
+ case BUS_NOTIFY_BIND_DRIVER:
+ clk = clk_get(dev, NULL);
+ if (!IS_ERR(clk)) {
+ clk_enable(clk);
+ clk_put(clk);
+ dev_info(dev, "runtime pm disabled, clock forced on\n");
+ }
+ break;
+ case BUS_NOTIFY_UNBOUND_DRIVER:
+ clk = clk_get(dev, NULL);
+ if (!IS_ERR(clk)) {
+ clk_disable(clk);
+ clk_put(clk);
+ dev_info(dev, "runtime pm disabled, clock forced off\n");
+ }
+ break;
+ }
+
+ return 0;
+}
+
+#endif /* CONFIG_PM_RUNTIME */
+
+static struct notifier_block platform_bus_notifier = {
+ .notifier_call = platform_bus_notify
+};
+
+static int __init sh_pm_runtime_init(void)
+{
+ bus_register_notifier(&platform_bus_type, &platform_bus_notifier);
+ return 0;
+}
+core_initcall(sh_pm_runtime_init);
diff --git a/arch/arm/mach-u300/timer.c b/arch/arm/mach-u300/timer.c
index 3fc4472719be..9a7cfbfa7842 100644
--- a/arch/arm/mach-u300/timer.c
+++ b/arch/arm/mach-u300/timer.c
@@ -327,7 +327,7 @@ static irqreturn_t u300_timer_interrupt(int irq, void *dev_id)
static struct irqaction u300_timer_irq = {
.name = "U300 Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = u300_timer_interrupt,
};
diff --git a/arch/arm/mach-w90x900/time.c b/arch/arm/mach-w90x900/time.c
index b80f769bc135..9cda8355e19d 100644
--- a/arch/arm/mach-w90x900/time.c
+++ b/arch/arm/mach-w90x900/time.c
@@ -111,7 +111,7 @@ static irqreturn_t nuc900_timer0_interrupt(int irq, void *dev_id)
static struct irqaction nuc900_timer0_irq = {
.name = "nuc900-timer0",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = nuc900_timer0_interrupt,
};
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig
index 33c3f570aaa0..3d0afdeaffdb 100644
--- a/arch/arm/mm/Kconfig
+++ b/arch/arm/mm/Kconfig
@@ -599,6 +599,14 @@ config CPU_CP15_MPU
help
Processor has the CP15 register, which has MPU related registers.
+config CPU_USE_DOMAINS
+ bool
+ depends on MMU
+ default y if !CPU_32v6K
+ help
+ This option enables or disables the use of domain switching
+ via the set_fs() function.
+
#
# CPU supports 36-bit I/O
#
@@ -628,6 +636,33 @@ config ARM_THUMBEE
Say Y here if you have a CPU with the ThumbEE extension and code to
make use of it. Say N for code that can run on CPUs without ThumbEE.
+config SWP_EMULATE
+ bool "Emulate SWP/SWPB instructions"
+ depends on CPU_V7
+ select HAVE_PROC_CPU if PROC_FS
+ default y if SMP
+ help
+ ARMv6 architecture deprecates use of the SWP/SWPB instructions.
+ ARMv7 multiprocessing extensions introduce the ability to disable
+ these instructions, triggering an undefined instruction exception
+ when executed. Say Y here to enable software emulation of these
+ instructions for userspace (not kernel) using LDREX/STREX.
+ Also creates /proc/cpu/swp_emulation for statistics.
+
+ In some older versions of glibc [<=2.8] SWP is used during futex
+ trylock() operations with the assumption that the code will not
+ be preempted. This invalid assumption may be more likely to fail
+ with SWP emulation enabled, leading to deadlock of the user
+ application.
+
+ NOTE: when accessing uncached shared regions, LDREX/STREX rely
+ on an external transaction monitoring block called a global
+ monitor to maintain update atomicity. If your system does not
+ implement a global monitor, this option can cause programs that
+ perform SWP operations to uncached memory to deadlock.
+
+ If unsure, say Y.
+
config CPU_BIG_ENDIAN
bool "Build big-endian kernel"
depends on ARCH_SUPPORTS_BIG_ENDIAN
@@ -779,6 +814,14 @@ config CACHE_L2X0
help
This option enables the L2x0 PrimeCell.
+config CACHE_PL310
+ bool
+ depends on CACHE_L2X0
+ default y if CPU_V7 && !CPU_V6
+ help
+ This option enables optimisations for the PL310 cache
+ controller.
+
config CACHE_TAUROS2
bool "Enable the Tauros2 L2 cache controller"
depends on (ARCH_DOVE || ARCH_MMP)
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c
index 9982eb385c0f..edb43ff7aeef 100644
--- a/arch/arm/mm/cache-l2x0.c
+++ b/arch/arm/mm/cache-l2x0.c
@@ -29,13 +29,22 @@ static void __iomem *l2x0_base;
static DEFINE_SPINLOCK(l2x0_lock);
static uint32_t l2x0_way_mask; /* Bitmask of active ways */
-static inline void cache_wait(void __iomem *reg, unsigned long mask)
+static inline void cache_wait_way(void __iomem *reg, unsigned long mask)
{
- /* wait for the operation to complete */
+ /* wait for cache operation by line or way to complete */
while (readl_relaxed(reg) & mask)
;
}
+#ifdef CONFIG_CACHE_PL310
+static inline void cache_wait(void __iomem *reg, unsigned long mask)
+{
+ /* cache operations by line are atomic on PL310 */
+}
+#else
+#define cache_wait cache_wait_way
+#endif
+
static inline void cache_sync(void)
{
void __iomem *base = l2x0_base;
@@ -110,7 +119,7 @@ static inline void l2x0_inv_all(void)
/* invalidate all ways */
spin_lock_irqsave(&l2x0_lock, flags);
writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_INV_WAY);
- cache_wait(l2x0_base + L2X0_INV_WAY, l2x0_way_mask);
+ cache_wait_way(l2x0_base + L2X0_INV_WAY, l2x0_way_mask);
cache_sync();
spin_unlock_irqrestore(&l2x0_lock, flags);
}
diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c
index 598c51ad5071..b8061519ce77 100644
--- a/arch/arm/mm/copypage-v4mc.c
+++ b/arch/arm/mm/copypage-v4mc.c
@@ -73,7 +73,7 @@ void v4_mc_copy_user_highpage(struct page *to, struct page *from,
{
void *kto = kmap_atomic(to, KM_USER1);
- if (test_and_clear_bit(PG_dcache_dirty, &from->flags))
+ if (!test_and_set_bit(PG_dcache_clean, &from->flags))
__flush_dcache_page(page_mapping(from), from);
spin_lock(&minicache_lock);
diff --git a/arch/arm/mm/copypage-v6.c b/arch/arm/mm/copypage-v6.c
index f55fa1044f72..bdba6c65c901 100644
--- a/arch/arm/mm/copypage-v6.c
+++ b/arch/arm/mm/copypage-v6.c
@@ -79,7 +79,7 @@ static void v6_copy_user_highpage_aliasing(struct page *to,
unsigned int offset = CACHE_COLOUR(vaddr);
unsigned long kfrom, kto;
- if (test_and_clear_bit(PG_dcache_dirty, &from->flags))
+ if (!test_and_set_bit(PG_dcache_clean, &from->flags))
__flush_dcache_page(page_mapping(from), from);
/* FIXME: not highmem safe */
diff --git a/arch/arm/mm/copypage-xscale.c b/arch/arm/mm/copypage-xscale.c
index 9920c0ae2096..649bbcd325bf 100644
--- a/arch/arm/mm/copypage-xscale.c
+++ b/arch/arm/mm/copypage-xscale.c
@@ -95,7 +95,7 @@ void xscale_mc_copy_user_highpage(struct page *to, struct page *from,
{
void *kto = kmap_atomic(to, KM_USER1);
- if (test_and_clear_bit(PG_dcache_dirty, &from->flags))
+ if (!test_and_set_bit(PG_dcache_clean, &from->flags))
__flush_dcache_page(page_mapping(from), from);
spin_lock(&minicache_lock);
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index c704eed63c5d..ba93c4910b8a 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -521,6 +521,12 @@ void ___dma_page_dev_to_cpu(struct page *page, unsigned long off,
outer_inv_range(paddr, paddr + size);
dma_cache_maint_page(page, off, size, dir, dmac_unmap_area);
+
+ /*
+ * Mark the D-cache clean for this page to avoid extra flushing.
+ */
+ if (dir != DMA_TO_DEVICE && off == 0 && size >= PAGE_SIZE)
+ set_bit(PG_dcache_clean, &page->flags);
}
EXPORT_SYMBOL(___dma_page_dev_to_cpu);
diff --git a/arch/arm/mm/fault-armv.c b/arch/arm/mm/fault-armv.c
index 9b906dec1ca1..8440d952ba6d 100644
--- a/arch/arm/mm/fault-armv.c
+++ b/arch/arm/mm/fault-armv.c
@@ -28,6 +28,7 @@
static unsigned long shared_pte_mask = L_PTE_MT_BUFFERABLE;
+#if __LINUX_ARM_ARCH__ < 6
/*
* We take the easy way out of this problem - we make the
* PTE uncacheable. However, we leave the write buffer on.
@@ -141,7 +142,7 @@ make_coherent(struct address_space *mapping, struct vm_area_struct *vma,
* a page table, or changing an existing PTE. Basically, there are two
* things that we need to take care of:
*
- * 1. If PG_dcache_dirty is set for the page, we need to ensure
+ * 1. If PG_dcache_clean is not set for the page, we need to ensure
* that any cache entries for the kernels virtual memory
* range are written back to the page.
* 2. If we have multiple shared mappings of the same space in
@@ -168,10 +169,8 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr,
return;
mapping = page_mapping(page);
-#ifndef CONFIG_SMP
- if (test_and_clear_bit(PG_dcache_dirty, &page->flags))
+ if (!test_and_set_bit(PG_dcache_clean, &page->flags))
__flush_dcache_page(mapping, page);
-#endif
if (mapping) {
if (cache_is_vivt())
make_coherent(mapping, vma, addr, ptep, pfn);
@@ -179,6 +178,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr,
__flush_icache_all();
}
}
+#endif /* __LINUX_ARM_ARCH__ < 6 */
/*
* Check whether the write buffer has physical address aliasing
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c
index c6844cb9b508..2332b774c6b9 100644
--- a/arch/arm/mm/flush.c
+++ b/arch/arm/mm/flush.c
@@ -17,6 +17,7 @@
#include <asm/smp_plat.h>
#include <asm/system.h>
#include <asm/tlbflush.h>
+#include <asm/smp_plat.h>
#include "mm.h"
@@ -93,12 +94,10 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsig
#define flush_pfn_alias(pfn,vaddr) do { } while (0)
#endif
-#ifdef CONFIG_SMP
static void flush_ptrace_access_other(void *args)
{
__flush_icache_all();
}
-#endif
static
void flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
@@ -122,11 +121,9 @@ void flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
if (vma->vm_flags & VM_EXEC) {
unsigned long addr = (unsigned long)kaddr;
__cpuc_coherent_kern_range(addr, addr + len);
-#ifdef CONFIG_SMP
if (cache_ops_need_broadcast())
smp_call_function(flush_ptrace_access_other,
NULL, 1);
-#endif
}
}
@@ -215,6 +212,36 @@ static void __flush_dcache_aliases(struct address_space *mapping, struct page *p
flush_dcache_mmap_unlock(mapping);
}
+#if __LINUX_ARM_ARCH__ >= 6
+void __sync_icache_dcache(pte_t pteval)
+{
+ unsigned long pfn;
+ struct page *page;
+ struct address_space *mapping;
+
+ if (!pte_present_user(pteval))
+ return;
+ if (cache_is_vipt_nonaliasing() && !pte_exec(pteval))
+ /* only flush non-aliasing VIPT caches for exec mappings */
+ return;
+ pfn = pte_pfn(pteval);
+ if (!pfn_valid(pfn))
+ return;
+
+ page = pfn_to_page(pfn);
+ if (cache_is_vipt_aliasing())
+ mapping = page_mapping(page);
+ else
+ mapping = NULL;
+
+ if (!test_and_set_bit(PG_dcache_clean, &page->flags))
+ __flush_dcache_page(mapping, page);
+ /* pte_exec() already checked above for non-aliasing VIPT cache */
+ if (cache_is_vipt_nonaliasing() || pte_exec(pteval))
+ __flush_icache_all();
+}
+#endif
+
/*
* Ensure cache coherency between kernel mapping and userspace mapping
* of this page.
@@ -246,17 +273,16 @@ void flush_dcache_page(struct page *page)
mapping = page_mapping(page);
-#ifndef CONFIG_SMP
- if (!PageHighMem(page) && mapping && !mapping_mapped(mapping))
- set_bit(PG_dcache_dirty, &page->flags);
- else
-#endif
- {
+ if (!cache_ops_need_broadcast() &&
+ mapping && !mapping_mapped(mapping))
+ clear_bit(PG_dcache_clean, &page->flags);
+ else {
__flush_dcache_page(mapping, page);
if (mapping && cache_is_vivt())
__flush_dcache_aliases(mapping, page);
else if (mapping)
__flush_icache_all();
+ set_bit(PG_dcache_clean, &page->flags);
}
}
EXPORT_SYMBOL(flush_dcache_page);
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index 6e1c4f6a2b3f..920fb3b3827f 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -15,6 +15,7 @@
#include <linux/nodemask.h>
#include <linux/memblock.h>
#include <linux/sort.h>
+#include <linux/fs.h>
#include <asm/cputype.h>
#include <asm/sections.h>
@@ -24,6 +25,7 @@
#include <asm/smp_plat.h>
#include <asm/tlb.h>
#include <asm/highmem.h>
+#include <asm/traps.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
@@ -498,6 +500,19 @@ static void __init build_mem_type_table(void)
}
}
+#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
+pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
+ unsigned long size, pgprot_t vma_prot)
+{
+ if (!pfn_valid(pfn))
+ return pgprot_noncached(vma_prot);
+ else if (file->f_flags & O_SYNC)
+ return pgprot_writecombine(vma_prot);
+ return vma_prot;
+}
+EXPORT_SYMBOL(phys_mem_access_prot);
+#endif
+
#define vectors_base() (vectors_high() ? 0xffff0000 : 0)
static void __init *early_alloc(unsigned long sz)
@@ -883,12 +898,11 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
{
struct map_desc map;
unsigned long addr;
- void *vectors;
/*
* Allocate the vector page early.
*/
- vectors = early_alloc(PAGE_SIZE);
+ vectors_page = early_alloc(PAGE_SIZE);
for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE)
pmd_clear(pmd_off_k(addr));
@@ -928,7 +942,7 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
* location (0xffff0000). If we aren't using high-vectors, also
* create a mapping at the low-vectors virtual address.
*/
- map.pfn = __phys_to_pfn(virt_to_phys(vectors));
+ map.pfn = __phys_to_pfn(virt_to_phys(vectors_page));
map.virtual = 0xffff0000;
map.length = PAGE_SIZE;
map.type = MT_HIGH_VECTORS;
diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S
index 7d63beaf9745..337f10256cd6 100644
--- a/arch/arm/mm/proc-macros.S
+++ b/arch/arm/mm/proc-macros.S
@@ -99,6 +99,10 @@
* 110x 0 1 0 r/w r/o
* 11x0 0 1 0 r/w r/o
* 1111 0 1 1 r/w r/w
+ *
+ * If !CONFIG_CPU_USE_DOMAINS, the following permissions are changed:
+ * 110x 1 1 1 r/o r/o
+ * 11x0 1 1 1 r/o r/o
*/
.macro armv6_mt_table pfx
\pfx\()_mt_table:
@@ -138,8 +142,11 @@
tst r1, #L_PTE_USER
orrne r3, r3, #PTE_EXT_AP1
+#ifdef CONFIG_CPU_USE_DOMAINS
+ @ allow kernel read/write access to read-only user pages
tstne r3, #PTE_EXT_APX
bicne r3, r3, #PTE_EXT_APX | PTE_EXT_AP0
+#endif
tst r1, #L_PTE_EXEC
orreq r3, r3, #PTE_EXT_XN
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S
index 6a8506d99ee9..d5d9b585c689 100644
--- a/arch/arm/mm/proc-v7.S
+++ b/arch/arm/mm/proc-v7.S
@@ -149,8 +149,11 @@ ENTRY(cpu_v7_set_pte_ext)
tst r1, #L_PTE_USER
orrne r3, r3, #PTE_EXT_AP1
+#ifdef CONFIG_CPU_USE_DOMAINS
+ @ allow kernel read/write access to read-only user pages
tstne r3, #PTE_EXT_APX
bicne r3, r3, #PTE_EXT_APX | PTE_EXT_AP0
+#endif
tst r1, #L_PTE_EXEC
orreq r3, r3, #PTE_EXT_XN
@@ -237,8 +240,6 @@ __v7_setup:
mcr p15, 0, r10, c2, c0, 2 @ TTB control register
orr r4, r4, #TTB_FLAGS
mcr p15, 0, r4, c2, c0, 1 @ load TTB1
- mov r10, #0x1f @ domains 0, 1 = manager
- mcr p15, 0, r10, c3, c0, 0 @ load domain access register
/*
* Memory region attributes with SCTLR.TRE=1
*
@@ -277,6 +278,10 @@ __v7_setup:
#ifdef CONFIG_CPU_ENDIAN_BE8
orr r6, r6, #1 << 25 @ big-endian page tables
#endif
+#ifdef CONFIG_SWP_EMULATE
+ orr r5, r5, #(1 << 10) @ set SW bit in "clear"
+ bic r6, r6, #(1 << 10) @ clear it in "mmuset"
+#endif
mrc p15, 0, r0, c1, c0, 0 @ read control register
bic r0, r0, r5 @ clear bits them
orr r0, r0, r6 @ set them
diff --git a/arch/arm/plat-iop/time.c b/arch/arm/plat-iop/time.c
index 85d3e55ca4a9..f5f1a9d39dbe 100644
--- a/arch/arm/plat-iop/time.c
+++ b/arch/arm/plat-iop/time.c
@@ -127,7 +127,7 @@ iop_timer_interrupt(int irq, void *dev_id)
static struct irqaction iop_timer_irq = {
.name = "IOP Timer Tick",
.handler = iop_timer_interrupt,
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.dev_id = &iop_clockevent,
};
diff --git a/arch/arm/plat-mxc/audmux-v2.c b/arch/arm/plat-mxc/audmux-v2.c
index f9e7cdbd0005..910374d1d486 100644
--- a/arch/arm/plat-mxc/audmux-v2.c
+++ b/arch/arm/plat-mxc/audmux-v2.c
@@ -45,9 +45,9 @@ static const char *audmux_port_string(int port)
{
switch (port) {
case MX31_AUDMUX_PORT1_SSI0:
- return "imx-ssi.0";
+ return "imx-ssi-dai.0";
case MX31_AUDMUX_PORT2_SSI1:
- return "imx-ssi.1";
+ return "imx-ssi-dai.1";
case MX31_AUDMUX_PORT3_SSI_PINS_3:
return "SSI3";
case MX31_AUDMUX_PORT4_SSI_PINS_4:
diff --git a/arch/arm/plat-mxc/include/mach/eukrea-baseboards.h b/arch/arm/plat-mxc/include/mach/eukrea-baseboards.h
index 634e3f4c454d..656acb45d434 100644
--- a/arch/arm/plat-mxc/include/mach/eukrea-baseboards.h
+++ b/arch/arm/plat-mxc/include/mach/eukrea-baseboards.h
@@ -37,9 +37,9 @@
* mach-mx5/eukrea_mbimx51-baseboard.c for cpuimx51
*/
-extern void eukrea_mbimx25_baseboard_init(void);
+extern void eukrea_mbimxsd25_baseboard_init(void);
extern void eukrea_mbimx27_baseboard_init(void);
-extern void eukrea_mbimx35_baseboard_init(void);
+extern void eukrea_mbimxsd35_baseboard_init(void);
extern void eukrea_mbimx51_baseboard_init(void);
#endif
diff --git a/arch/arm/plat-mxc/time.c b/arch/arm/plat-mxc/time.c
index f9a1b059a76c..e5ca2bdaa92d 100644
--- a/arch/arm/plat-mxc/time.c
+++ b/arch/arm/plat-mxc/time.c
@@ -258,7 +258,7 @@ static irqreturn_t mxc_timer_interrupt(int irq, void *dev_id)
static struct irqaction mxc_timer_irq = {
.name = "i.MX Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = mxc_timer_interrupt,
};
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c
index 7951eefe1a0e..2c0d3c38b01f 100644
--- a/arch/arm/plat-omap/gpio.c
+++ b/arch/arm/plat-omap/gpio.c
@@ -2084,7 +2084,7 @@ void omap2_gpio_prepare_for_idle(int power_state)
for (i = min; i < gpio_bank_count; i++) {
struct gpio_bank *bank = &gpio_bank[i];
- u32 l1, l2;
+ u32 l1 = 0, l2 = 0;
if (bank->dbck_enable_mask)
clk_disable(bank->dbck);
@@ -2151,7 +2151,7 @@ void omap2_gpio_resume_after_idle(void)
min = 1;
for (i = min; i < gpio_bank_count; i++) {
struct gpio_bank *bank = &gpio_bank[i];
- u32 l, gen, gen0, gen1;
+ u32 l = 0, gen, gen0, gen1;
if (bank->dbck_enable_mask)
clk_enable(bank->dbck);
diff --git a/arch/arm/plat-omap/include/plat/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h
index b4ff6a11a8f2..5b20103e68eb 100644
--- a/arch/arm/plat-omap/include/plat/mcbsp.h
+++ b/arch/arm/plat-omap/include/plat/mcbsp.h
@@ -30,6 +30,13 @@
#include <mach/hardware.h>
#include <plat/clock.h>
+/* macro for building platform_device for McBSP ports */
+#define OMAP_MCBSP_PLATFORM_DEVICE(port_nr) \
+static struct platform_device omap_mcbsp##port_nr = { \
+ .name = "omap-mcbsp-dai", \
+ .id = OMAP_MCBSP##port_nr, \
+}
+
#define OMAP7XX_MCBSP1_BASE 0xfffb1000
#define OMAP7XX_MCBSP2_BASE 0xfffb1800
diff --git a/arch/arm/plat-omap/include/plat/smp.h b/arch/arm/plat-omap/include/plat/smp.h
index 6a3ff65c0303..5177a9c5a25a 100644
--- a/arch/arm/plat-omap/include/plat/smp.h
+++ b/arch/arm/plat-omap/include/plat/smp.h
@@ -19,13 +19,6 @@
#include <asm/hardware/gic.h>
-/*
- * set_event() is used to wake up secondary core from wfe using sev. ROM
- * code puts the second core into wfe(standby).
- *
- */
-#define set_event() __asm__ __volatile__ ("sev" : : : "memory")
-
/* Needed for secondary core boot */
extern void omap_secondary_startup(void);
extern u32 omap_modify_auxcoreboot0(u32 set_mask, u32 clear_mask);
diff --git a/arch/arm/plat-s3c24xx/devs.c b/arch/arm/plat-s3c24xx/devs.c
index 452e18438b41..9f8ee5e38615 100644
--- a/arch/arm/plat-s3c24xx/devs.c
+++ b/arch/arm/plat-s3c24xx/devs.c
@@ -481,7 +481,7 @@ static struct resource s3c_ac97_resource[] = {
},
};
-static u64 s3c_device_ac97_dmamask = 0xffffffffUL;
+static u64 s3c_device_audio_dmamask = 0xffffffffUL;
struct platform_device s3c_device_ac97 = {
.name = "s3c-ac97",
@@ -489,11 +489,37 @@ struct platform_device s3c_device_ac97 = {
.num_resources = ARRAY_SIZE(s3c_ac97_resource),
.resource = s3c_ac97_resource,
.dev = {
- .dma_mask = &s3c_device_ac97_dmamask,
+ .dma_mask = &s3c_device_audio_dmamask,
.coherent_dma_mask = 0xffffffffUL
}
};
EXPORT_SYMBOL(s3c_device_ac97);
+/* ASoC PCM DMA */
+
+struct platform_device s3c_device_pcm = {
+ .name = "s3c24xx-pcm-audio",
+ .id = -1,
+ .dev = {
+ .dma_mask = &s3c_device_audio_dmamask,
+ .coherent_dma_mask = 0xffffffffUL
+ }
+};
+
+EXPORT_SYMBOL(s3c_device_pcm);
+
+/* ASoC I2S */
+
+struct platform_device s3c2412_device_iis = {
+ .name = "s3c2412-iis",
+ .id = -1,
+ .dev = {
+ .dma_mask = &s3c_device_audio_dmamask,
+ .coherent_dma_mask = 0xffffffffUL
+ }
+};
+
+EXPORT_SYMBOL(s3c2412_device_iis);
+
#endif // CONFIG_CPU_S32440
diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h
index 85f6f23a510f..a9fecd615de4 100644
--- a/arch/arm/plat-samsung/include/plat/devs.h
+++ b/arch/arm/plat-samsung/include/plat/devs.h
@@ -32,6 +32,8 @@ extern struct platform_device s3c64xx_device_iisv4;
extern struct platform_device s3c64xx_device_spi0;
extern struct platform_device s3c64xx_device_spi1;
+extern struct platform_device s3c_device_pcm;
+
extern struct platform_device s3c64xx_device_pcm0;
extern struct platform_device s3c64xx_device_pcm1;
diff --git a/arch/arm/plat-samsung/time.c b/arch/arm/plat-samsung/time.c
index 2231d80ad817..133069ae6feb 100644
--- a/arch/arm/plat-samsung/time.c
+++ b/arch/arm/plat-samsung/time.c
@@ -138,7 +138,7 @@ s3c2410_timer_interrupt(int irq, void *dev_id)
static struct irqaction s3c2410_timer_irq = {
.name = "S3C2410 Timer Tick",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = s3c2410_timer_interrupt,
};
diff --git a/arch/arm/plat-versatile/timer-sp.c b/arch/arm/plat-versatile/timer-sp.c
index fb0d1c299718..62066b4b6af7 100644
--- a/arch/arm/plat-versatile/timer-sp.c
+++ b/arch/arm/plat-versatile/timer-sp.c
@@ -135,7 +135,7 @@ static struct clock_event_device sp804_clockevent = {
static struct irqaction sp804_timer_irq = {
.name = "timer",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER,
.handler = sp804_timer_interrupt,
.dev_id = &sp804_clockevent,
};
diff --git a/arch/blackfin/include/asm/bitops.h b/arch/blackfin/include/asm/bitops.h
index d5872cd967ab..4fe8305867bb 100644
--- a/arch/blackfin/include/asm/bitops.h
+++ b/arch/blackfin/include/asm/bitops.h
@@ -22,7 +22,9 @@
#include <asm-generic/bitops/sched.h>
#include <asm-generic/bitops/ffs.h>
+#include <asm-generic/bitops/hweight.h>
#include <asm-generic/bitops/lock.h>
+
#include <asm-generic/bitops/ext2-non-atomic.h>
#include <asm-generic/bitops/ext2-atomic.h>
#include <asm-generic/bitops/minix.h>
@@ -115,7 +117,7 @@ static inline int test_and_change_bit(int nr, volatile unsigned long *addr)
* of bits set) of a N-bit word
*/
-static inline unsigned int hweight32(unsigned int w)
+static inline unsigned int __arch_hweight32(unsigned int w)
{
unsigned int res;
@@ -125,19 +127,20 @@ static inline unsigned int hweight32(unsigned int w)
return res;
}
-static inline unsigned int hweight64(__u64 w)
+static inline unsigned int __arch_hweight64(__u64 w)
{
- return hweight32((unsigned int)(w >> 32)) + hweight32((unsigned int)w);
+ return __arch_hweight32((unsigned int)(w >> 32)) +
+ __arch_hweight32((unsigned int)w);
}
-static inline unsigned int hweight16(unsigned int w)
+static inline unsigned int __arch_hweight16(unsigned int w)
{
- return hweight32(w & 0xffff);
+ return __arch_hweight32(w & 0xffff);
}
-static inline unsigned int hweight8(unsigned int w)
+static inline unsigned int __arch_hweight8(unsigned int w)
{
- return hweight32(w & 0xff);
+ return __arch_hweight32(w & 0xff);
}
#endif /* _BLACKFIN_BITOPS_H */
diff --git a/arch/blackfin/kernel/time-ts.c b/arch/blackfin/kernel/time-ts.c
index 8c9a43daf80f..6fefad4edd19 100644
--- a/arch/blackfin/kernel/time-ts.c
+++ b/arch/blackfin/kernel/time-ts.c
@@ -213,8 +213,7 @@ irqreturn_t bfin_gptmr0_interrupt(int irq, void *dev_id)
static struct irqaction gptmr0_irq = {
.name = "Blackfin GPTimer0",
- .flags = IRQF_DISABLED | IRQF_TIMER | \
- IRQF_IRQPOLL | IRQF_PERCPU,
+ .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_PERCPU,
.handler = bfin_gptmr0_interrupt,
};
@@ -322,8 +321,7 @@ irqreturn_t bfin_coretmr_interrupt(int irq, void *dev_id)
static struct irqaction coretmr_irq = {
.name = "Blackfin CoreTimer",
- .flags = IRQF_DISABLED | IRQF_TIMER | \
- IRQF_IRQPOLL | IRQF_PERCPU,
+ .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_PERCPU,
.handler = bfin_coretmr_interrupt,
};
diff --git a/arch/blackfin/mach-bf527/boards/ezkit.c b/arch/blackfin/mach-bf527/boards/ezkit.c
index a05c967a24cf..b182afb28d24 100644
--- a/arch/blackfin/mach-bf527/boards/ezkit.c
+++ b/arch/blackfin/mach-bf527/boards/ezkit.c
@@ -884,7 +884,7 @@ static struct adp5520_keys_platform_data adp5520_keys_data = {
};
/*
- * ADP5520/5501 Multifuction Device Init Data
+ * ADP5520/5501 Multifunction Device Init Data
*/
static struct adp5520_platform_data adp5520_pdev_data = {
diff --git a/arch/blackfin/mach-bf537/boards/stamp.c b/arch/blackfin/mach-bf537/boards/stamp.c
index 68a27bccc7d4..294b86be57cb 100644
--- a/arch/blackfin/mach-bf537/boards/stamp.c
+++ b/arch/blackfin/mach-bf537/boards/stamp.c
@@ -1645,7 +1645,7 @@ static struct adp5520_keys_platform_data adp5520_keys_data = {
};
/*
- * ADP5520/5501 Multifuction Device Init Data
+ * ADP5520/5501 Multifunction Device Init Data
*/
static struct adp5520_platform_data adp5520_pdev_data = {
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c
index ed6f22eb5b12..f9dfb57aba56 100644
--- a/arch/ia64/kernel/time.c
+++ b/arch/ia64/kernel/time.c
@@ -411,7 +411,7 @@ static cycle_t itc_get_cycles(struct clocksource *cs)
static struct irqaction timer_irqaction = {
.handler = timer_interrupt,
- .flags = IRQF_DISABLED | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED,
.name = "timer"
};
diff --git a/arch/m68k/include/asm/ide.h b/arch/m68k/include/asm/ide.h
index 3958726664ba..492fee8a1ab2 100644
--- a/arch/m68k/include/asm/ide.h
+++ b/arch/m68k/include/asm/ide.h
@@ -1,6 +1,4 @@
/*
- * linux/include/asm-m68k/ide.h
- *
* Copyright (C) 1994-1996 Linus Torvalds & authors
*/
@@ -34,6 +32,8 @@
#include <asm/io.h>
#include <asm/irq.h>
+#ifdef CONFIG_MMU
+
/*
* Get rid of defs from io.h - ide has its private and conflicting versions
* Since so far no single m68k platform uses ISA/PCI I/O space for IDE, we
@@ -53,5 +53,14 @@
#define __ide_mm_outsw(port, addr, n) raw_outsw((u16 *)port, addr, n)
#define __ide_mm_outsl(port, addr, n) raw_outsl((u32 *)port, addr, n)
+#else
+
+#define __ide_mm_insw(port, addr, n) io_insw((unsigned int)port, addr, n)
+#define __ide_mm_insl(port, addr, n) io_insl((unsigned int)port, addr, n)
+#define __ide_mm_outsw(port, addr, n) io_outsw((unsigned int)port, addr, n)
+#define __ide_mm_outsl(port, addr, n) io_outsl((unsigned int)port, addr, n)
+
+#endif /* CONFIG_MMU */
+
#endif /* __KERNEL__ */
#endif /* _M68K_IDE_H */
diff --git a/arch/m68knommu/kernel/process.c b/arch/m68knommu/kernel/process.c
index 6350f68cd026..3fb9e45df888 100644
--- a/arch/m68knommu/kernel/process.c
+++ b/arch/m68knommu/kernel/process.c
@@ -316,14 +316,14 @@ void dump(struct pt_regs *fp)
fp->d0, fp->d1, fp->d2, fp->d3);
printk(KERN_EMERG "d4: %08lx d5: %08lx a0: %08lx a1: %08lx\n",
fp->d4, fp->d5, fp->a0, fp->a1);
- printk(KERN_EMERG "\nUSP: %08x TRAPFRAME: %08x\n",
- (unsigned int) rdusp(), (unsigned int) fp);
+ printk(KERN_EMERG "\nUSP: %08x TRAPFRAME: %p\n",
+ (unsigned int) rdusp(), fp);
printk(KERN_EMERG "\nCODE:");
tp = ((unsigned char *) fp->pc) - 0x20;
for (sp = (unsigned long *) tp, i = 0; (i < 0x40); i += 4) {
if ((i % 0x10) == 0)
- printk(KERN_EMERG "%08x: ", (int) (tp + i));
+ printk(KERN_EMERG "%p: ", tp + i);
printk("%08x ", (int) *sp++);
}
printk(KERN_EMERG "\n");
@@ -332,7 +332,7 @@ void dump(struct pt_regs *fp)
tp = ((unsigned char *) fp) - 0x40;
for (sp = (unsigned long *) tp, i = 0; (i < 0xc0); i += 4) {
if ((i % 0x10) == 0)
- printk(KERN_EMERG "%08x: ", (int) (tp + i));
+ printk(KERN_EMERG "%p: ", tp + i);
printk("%08x ", (int) *sp++);
}
printk(KERN_EMERG "\n");
@@ -341,7 +341,7 @@ void dump(struct pt_regs *fp)
tp = (unsigned char *) (rdusp() - 0x10);
for (sp = (unsigned long *) tp, i = 0; (i < 0x80); i += 4) {
if ((i % 0x10) == 0)
- printk(KERN_EMERG "%08x: ", (int) (tp + i));
+ printk(KERN_EMERG "%p: ", tp + i);
printk("%08x ", (int) *sp++);
}
printk(KERN_EMERG "\n");
diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
index 692fdfce2a23..dad40fc2bef8 100644
--- a/arch/microblaze/Kconfig
+++ b/arch/microblaze/Kconfig
@@ -121,6 +121,23 @@ config CMDLINE_FORCE
Set this to have arguments from the default kernel command string
override those passed by the boot loader.
+config SECCOMP
+ bool "Enable seccomp to safely compute untrusted bytecode"
+ depends on PROC_FS
+ default y
+ help
+ This kernel feature is useful for number crunching applications
+ that may need to compute untrusted bytecode during their
+ execution. By using pipes or other transports made available to
+ the process as file descriptors supporting the read/write
+ syscalls, it's possible to isolate those applications in
+ their own address space using seccomp. Once seccomp is
+ enabled via /proc/<pid>/seccomp, it cannot be disabled
+ and the task is only allowed to execute a few safe syscalls
+ defined by each seccomp mode.
+
+ If unsure, say Y. Only embedded should say N here.
+
endmenu
menu "Advanced setup"
diff --git a/arch/microblaze/include/asm/page.h b/arch/microblaze/include/asm/page.h
index cf377d91da71..ed9d0f6e2cdb 100644
--- a/arch/microblaze/include/asm/page.h
+++ b/arch/microblaze/include/asm/page.h
@@ -205,9 +205,6 @@ extern int page_is_ram(unsigned long pfn);
#define TOPHYS(addr) __virt_to_phys(addr)
#ifdef CONFIG_MMU
-#ifdef CONFIG_CONTIGUOUS_PAGE_ALLOC
-#define WANT_PAGE_VIRTUAL 1 /* page alloc 2 relies on this */
-#endif
#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
diff --git a/arch/microblaze/include/asm/prom.h b/arch/microblaze/include/asm/prom.h
index 101fa098f62a..5012b222e1df 100644
--- a/arch/microblaze/include/asm/prom.h
+++ b/arch/microblaze/include/asm/prom.h
@@ -22,6 +22,7 @@
#include <linux/types.h>
#include <asm/irq.h>
#include <asm/atomic.h>
+#include <linux/of_address.h>
#define HAVE_ARCH_DEVTREE_FIXUPS
diff --git a/arch/microblaze/include/asm/seccomp.h b/arch/microblaze/include/asm/seccomp.h
new file mode 100644
index 000000000000..0d912758a0d7
--- /dev/null
+++ b/arch/microblaze/include/asm/seccomp.h
@@ -0,0 +1,16 @@
+#ifndef _ASM_MICROBLAZE_SECCOMP_H
+#define _ASM_MICROBLAZE_SECCOMP_H
+
+#include <linux/unistd.h>
+
+#define __NR_seccomp_read __NR_read
+#define __NR_seccomp_write __NR_write
+#define __NR_seccomp_exit __NR_exit
+#define __NR_seccomp_sigreturn __NR_sigreturn
+
+#define __NR_seccomp_read_32 __NR_read
+#define __NR_seccomp_write_32 __NR_write
+#define __NR_seccomp_exit_32 __NR_exit
+#define __NR_seccomp_sigreturn_32 __NR_sigreturn
+
+#endif /* _ASM_MICROBLAZE_SECCOMP_H */
diff --git a/arch/microblaze/include/asm/setup.h b/arch/microblaze/include/asm/setup.h
index 782b5c89248e..5f910ebe0325 100644
--- a/arch/microblaze/include/asm/setup.h
+++ b/arch/microblaze/include/asm/setup.h
@@ -25,6 +25,12 @@ void early_printk(const char *fmt, ...);
int setup_early_printk(char *opt);
void disable_early_printk(void);
+#if defined(CONFIG_EARLY_PRINTK) && defined(CONFIG_SERIAL_UARTLITE_CONSOLE)
+#define eprintk early_printk
+#else
+#define eprintk printk
+#endif
+
void heartbeat(void);
void setup_heartbeat(void);
diff --git a/arch/microblaze/include/asm/thread_info.h b/arch/microblaze/include/asm/thread_info.h
index 8a8e9fc6e0c0..b73da2ac21b3 100644
--- a/arch/microblaze/include/asm/thread_info.h
+++ b/arch/microblaze/include/asm/thread_info.h
@@ -127,23 +127,19 @@ static inline struct thread_info *current_thread_info(void)
#define TIF_SECCOMP 10 /* secure computing */
#define TIF_FREEZE 14 /* Freezing for suspend */
-/* FIXME change in entry.S */
-#define TIF_KERNEL_TRACE 8 /* kernel trace active */
-
/* true if poll_idle() is polling TIF_NEED_RESCHED */
#define TIF_POLLING_NRFLAG 16
-#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
-#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
-#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
-#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
-#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
-#define _TIF_IRET (1<<TIF_IRET)
-#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
-#define _TIF_FREEZE (1<<TIF_FREEZE)
+#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
+#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
+#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
+#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
+#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
+#define _TIF_IRET (1 << TIF_IRET)
+#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
+#define _TIF_FREEZE (1 << TIF_FREEZE)
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
#define _TIF_SECCOMP (1 << TIF_SECCOMP)
-#define _TIF_KERNEL_TRACE (1 << TIF_KERNEL_TRACE)
/* work to do in syscall trace */
#define _TIF_WORK_SYSCALL_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \
diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S
index 304882e56459..a2a7e1e20e4c 100644
--- a/arch/microblaze/kernel/entry.S
+++ b/arch/microblaze/kernel/entry.S
@@ -186,6 +186,8 @@
swi r13, r1, PTO+PT_R13; /* Save SDA2 */ \
swi r14, r1, PTO+PT_PC; /* PC, before IRQ/trap */ \
swi r15, r1, PTO+PT_R15; /* Save LP */ \
+ swi r16, r1, PTO+PT_R16; \
+ swi r17, r1, PTO+PT_R17; \
swi r18, r1, PTO+PT_R18; /* Save asm scratch reg */ \
swi r19, r1, PTO+PT_R19; \
swi r20, r1, PTO+PT_R20; \
@@ -220,6 +222,8 @@
lwi r13, r1, PTO+PT_R13; /* restore SDA2 */ \
lwi r14, r1, PTO+PT_PC; /* RESTORE_LINK PC, before IRQ/trap */\
lwi r15, r1, PTO+PT_R15; /* restore LP */ \
+ lwi r16, r1, PTO+PT_R16; \
+ lwi r17, r1, PTO+PT_R17; \
lwi r18, r1, PTO+PT_R18; /* restore asm scratch reg */ \
lwi r19, r1, PTO+PT_R19; \
lwi r20, r1, PTO+PT_R20; \
@@ -295,6 +299,8 @@ C_ENTRY(_user_exception):
/* addik r1, r1, -STATE_SAVE_SIZE; */
addik r1, r1, THREAD_SIZE + CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - STATE_SAVE_SIZE;
SAVE_REGS
+ swi r0, r1, PTO + PT_R3
+ swi r0, r1, PTO + PT_R4
lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP));
swi r11, r1, PTO+PT_R1; /* Store user SP. */
@@ -319,8 +325,6 @@ C_ENTRY(_user_exception):
andi r11, r11, _TIF_WORK_SYSCALL_MASK
beqi r11, 4f
- addik r3, r0, -ENOSYS
- swi r3, r1, PTO + PT_R3
brlid r15, do_syscall_trace_enter
addik r5, r1, PTO + PT_R0
@@ -458,14 +462,8 @@ C_ENTRY(sys_execve):
addik r8, r1, PTO; /* add user context as 4th arg */
C_ENTRY(sys_rt_sigreturn_wrapper):
- swi r3, r1, PTO+PT_R3; /* restore saved r3, r4 registers */
- swi r4, r1, PTO+PT_R4;
- brlid r15, sys_rt_sigreturn /* Do real work */
+ brid sys_rt_sigreturn /* Do real work */
addik r5, r1, PTO; /* add user context as 1st arg */
- lwi r3, r1, PTO+PT_R3; /* restore saved r3, r4 registers */
- lwi r4, r1, PTO+PT_R4;
- bri ret_from_trap /* fall through will not work here due to align */
- nop;
/*
* HW EXCEPTION rutine start
@@ -765,9 +763,7 @@ C_ENTRY(_debug_exception):
/* save all regs to pt_reg structure */
swi r0, r1, PTO+PT_R0; /* R0 must be saved too */
swi r14, r1, PTO+PT_R14 /* rewrite saved R14 value */
- swi r16, r1, PTO+PT_R16
swi r16, r1, PTO+PT_PC; /* PC and r16 are the same */
- swi r17, r1, PTO+PT_R17
/* save special purpose registers to pt_regs */
mfs r11, rear;
swi r11, r1, PTO+PT_EAR;
@@ -801,8 +797,6 @@ C_ENTRY(_debug_exception):
addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */
SAVE_REGS;
- swi r17, r1, PTO+PT_R17;
- swi r16, r1, PTO+PT_R16;
swi r16, r1, PTO+PT_PC; /* Save LP */
swi r0, r1, PTO + PT_MODE; /* Was in user-mode. */
lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP));
@@ -848,8 +842,6 @@ dbtrap_call: /* Return point for kernel/user entry + 8 because of rtsd r15, 8 */
tophys(r1,r1);
/* MS: Restore all regs */
RESTORE_REGS
- lwi r17, r1, PTO+PT_R17;
- lwi r16, r1, PTO+PT_R16;
addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space */
lwi r1, r1, PT_R1 - PT_SIZE; /* Restore user stack pointer */
DBTRAP_return_user: /* MS: Make global symbol for debugging */
@@ -863,7 +855,6 @@ DBTRAP_return_user: /* MS: Make global symbol for debugging */
RESTORE_REGS
lwi r14, r1, PTO+PT_R14;
lwi r16, r1, PTO+PT_PC;
- lwi r17, r1, PTO+PT_R17;
addik r1, r1, STATE_SAVE_SIZE; /* MS: Clean up stack space */
tovirt(r1,r1);
DBTRAP_return_kernel: /* MS: Make global symbol for debugging */
diff --git a/arch/microblaze/kernel/exceptions.c b/arch/microblaze/kernel/exceptions.c
index b98ee8d0c1cd..7fce4ee4644c 100644
--- a/arch/microblaze/kernel/exceptions.c
+++ b/arch/microblaze/kernel/exceptions.c
@@ -148,13 +148,7 @@ asmlinkage void full_exception(struct pt_regs *regs, unsigned int type,
#ifdef CONFIG_MMU
case MICROBLAZE_PRIVILEGED_EXCEPTION:
pr_debug(KERN_WARNING "Privileged exception\n");
- /* "brk r0,r0" - used as debug breakpoint - old toolchain */
- if (get_user(code, (unsigned long *)regs->pc) == 0
- && code == 0x980c0000) {
- _exception(SIGTRAP, regs, TRAP_BRKPT, addr);
- } else {
- _exception(SIGILL, regs, ILL_PRVOPC, addr);
- }
+ _exception(SIGILL, regs, ILL_PRVOPC, addr);
break;
#endif
default:
diff --git a/arch/microblaze/kernel/kgdb.c b/arch/microblaze/kernel/kgdb.c
index bfc006b7f2d8..9b5a817605ec 100644
--- a/arch/microblaze/kernel/kgdb.c
+++ b/arch/microblaze/kernel/kgdb.c
@@ -80,7 +80,7 @@ void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *regs)
void microblaze_kgdb_break(struct pt_regs *regs)
{
if (kgdb_handle_exception(1, SIGTRAP, 0, regs) != 0)
- return 0;
+ return;
/* Jump over the first arch_kgdb_breakpoint which is barrier to
* get kgdb work. The same solution is used for powerpc */
@@ -114,7 +114,6 @@ int kgdb_arch_handle_exception(int vector, int signo, int err_code,
{
char *ptr;
unsigned long address;
- int cpu = smp_processor_id();
switch (remcom_in_buffer[0]) {
case 'c':
diff --git a/arch/microblaze/kernel/setup.c b/arch/microblaze/kernel/setup.c
index f5f768842354..bb1558e4b283 100644
--- a/arch/microblaze/kernel/setup.c
+++ b/arch/microblaze/kernel/setup.c
@@ -92,12 +92,6 @@ inline unsigned get_romfs_len(unsigned *addr)
}
#endif /* CONFIG_MTD_UCLINUX_EBSS */
-#if defined(CONFIG_EARLY_PRINTK) && defined(CONFIG_SERIAL_UARTLITE_CONSOLE)
-#define eprintk early_printk
-#else
-#define eprintk printk
-#endif
-
void __init machine_early_init(const char *cmdline, unsigned int ram,
unsigned int fdt, unsigned int msr)
{
diff --git a/arch/microblaze/kernel/timer.c b/arch/microblaze/kernel/timer.c
index b1380ae93ae1..ec7df67006ba 100644
--- a/arch/microblaze/kernel/timer.c
+++ b/arch/microblaze/kernel/timer.c
@@ -278,7 +278,7 @@ void __init time_init(void)
timer_num =
*(int *) of_get_property(timer, "xlnx,one-timer-only", NULL);
if (timer_num) {
- printk(KERN_EMERG "Please enable two timers in HW\n");
+ eprintk(KERN_EMERG "Please enable two timers in HW\n");
BUG();
}
diff --git a/arch/microblaze/platform/generic/system.dts b/arch/microblaze/platform/generic/system.dts
index 2d5c41767cd0..544a6f232012 100644
--- a/arch/microblaze/platform/generic/system.dts
+++ b/arch/microblaze/platform/generic/system.dts
@@ -218,6 +218,7 @@
#address-cells = <1>;
#size-cells = <1>;
compatible = "xlnx,compound";
+ ranges ;
ethernet@81c00000 {
compatible = "xlnx,xps-ll-temac-1.01.b", "xlnx,xps-ll-temac-1.00.a";
device_type = "network";
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c
index efbcee5d2220..24681d553e13 100644
--- a/arch/parisc/kernel/irq.c
+++ b/arch/parisc/kernel/irq.c
@@ -383,7 +383,7 @@ void do_cpu_irq_mask(struct pt_regs *regs)
static struct irqaction timer_action = {
.handler = timer_interrupt,
.name = "timer",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_PERCPU | IRQF_IRQPOLL,
+ .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_PERCPU,
};
#ifdef CONFIG_SMP
diff --git a/arch/powerpc/boot/dts/mpc8610_hpcd.dts b/arch/powerpc/boot/dts/mpc8610_hpcd.dts
index 9535ce68caae..83c3218cb4da 100644
--- a/arch/powerpc/boot/dts/mpc8610_hpcd.dts
+++ b/arch/powerpc/boot/dts/mpc8610_hpcd.dts
@@ -286,6 +286,7 @@
ssi@16100 {
compatible = "fsl,mpc8610-ssi";
+ status = "disabled";
cell-index = <1>;
reg = <0x16100 0x100>;
interrupt-parent = <&mpic>;
diff --git a/arch/powerpc/include/asm/immap_86xx.h b/arch/powerpc/include/asm/fsl_guts.h
index 0f165e59c326..bebd12463ec9 100644
--- a/arch/powerpc/include/asm/immap_86xx.h
+++ b/arch/powerpc/include/asm/fsl_guts.h
@@ -1,5 +1,5 @@
/**
- * MPC86xx Internal Memory Map
+ * Freecale 85xx and 86xx Global Utilties register set
*
* Authors: Jeff Brown
* Timur Tabi <timur@freescale.com>
@@ -10,73 +10,112 @@
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
- *
- * This header file defines structures for various 86xx SOC devices that are
- * used by multiple source files.
*/
-#ifndef __ASM_POWERPC_IMMAP_86XX_H__
-#define __ASM_POWERPC_IMMAP_86XX_H__
+#ifndef __ASM_POWERPC_FSL_GUTS_H__
+#define __ASM_POWERPC_FSL_GUTS_H__
#ifdef __KERNEL__
-/* Global Utility Registers */
-struct ccsr_guts {
+/*
+ * These #ifdefs are safe because it's not possible to build a kernel that
+ * runs on e500 and e600 cores.
+ */
+
+#if !defined(CONFIG_PPC_85xx) && !defined(CONFIG_PPC_86xx)
+#error Only 85xx and 86xx SOCs are supported
+#endif
+
+/**
+ * Global Utility Registers.
+ *
+ * Not all registers defined in this structure are available on all chips, so
+ * you are expected to know whether a given register actually exists on your
+ * chip before you access it.
+ *
+ * Also, some registers are similar on different chips but have slightly
+ * different names. In these cases, one name is chosen to avoid extraneous
+ * #ifdefs.
+ */
+#ifdef CONFIG_PPC_85xx
+struct ccsr_guts_85xx {
+#else
+struct ccsr_guts_86xx {
+#endif
__be32 porpllsr; /* 0x.0000 - POR PLL Ratio Status Register */
__be32 porbmsr; /* 0x.0004 - POR Boot Mode Status Register */
__be32 porimpscr; /* 0x.0008 - POR I/O Impedance Status and Control Register */
__be32 pordevsr; /* 0x.000c - POR I/O Device Status Register */
__be32 pordbgmsr; /* 0x.0010 - POR Debug Mode Status Register */
- u8 res1[0x20 - 0x14];
+ __be32 pordevsr2; /* 0x.0014 - POR device status register 2 */
+ u8 res018[0x20 - 0x18];
__be32 porcir; /* 0x.0020 - POR Configuration Information Register */
- u8 res2[0x30 - 0x24];
+ u8 res024[0x30 - 0x24];
__be32 gpiocr; /* 0x.0030 - GPIO Control Register */
- u8 res3[0x40 - 0x34];
+ u8 res034[0x40 - 0x34];
__be32 gpoutdr; /* 0x.0040 - General-Purpose Output Data Register */
- u8 res4[0x50 - 0x44];
+ u8 res044[0x50 - 0x44];
__be32 gpindr; /* 0x.0050 - General-Purpose Input Data Register */
- u8 res5[0x60 - 0x54];
+ u8 res054[0x60 - 0x54];
__be32 pmuxcr; /* 0x.0060 - Alternate Function Signal Multiplex Control */
- u8 res6[0x70 - 0x64];
+ __be32 pmuxcr2; /* 0x.0064 - Alternate function signal multiplex control 2 */
+ __be32 dmuxcr; /* 0x.0068 - DMA Mux Control Register */
+ u8 res06c[0x70 - 0x6c];
__be32 devdisr; /* 0x.0070 - Device Disable Control */
__be32 devdisr2; /* 0x.0074 - Device Disable Control 2 */
- u8 res7[0x80 - 0x78];
+ u8 res078[0x7c - 0x78];
+ __be32 pmjcr; /* 0x.007c - 4 Power Management Jog Control Register */
__be32 powmgtcsr; /* 0x.0080 - Power Management Status and Control Register */
- u8 res8[0x90 - 0x84];
+ __be32 pmrccr; /* 0x.0084 - Power Management Reset Counter Configuration Register */
+ __be32 pmpdccr; /* 0x.0088 - Power Management Power Down Counter Configuration Register */
+ __be32 pmcdr; /* 0x.008c - 4Power management clock disable register */
__be32 mcpsumr; /* 0x.0090 - Machine Check Summary Register */
__be32 rstrscr; /* 0x.0094 - Reset Request Status and Control Register */
- u8 res9[0xA0 - 0x98];
+ __be32 ectrstcr; /* 0x.0098 - Exception reset control register */
+ __be32 autorstsr; /* 0x.009c - Automatic reset status register */
__be32 pvr; /* 0x.00a0 - Processor Version Register */
__be32 svr; /* 0x.00a4 - System Version Register */
- u8 res10[0xB0 - 0xA8];
+ u8 res0a8[0xb0 - 0xa8];
__be32 rstcr; /* 0x.00b0 - Reset Control Register */
- u8 res11[0xC0 - 0xB4];
+ u8 res0b4[0xc0 - 0xb4];
+#ifdef CONFIG_PPC_85xx
+ __be32 iovselsr; /* 0x.00c0 - I/O voltage select status register */
+#else
__be32 elbcvselcr; /* 0x.00c0 - eLBC Voltage Select Ctrl Reg */
- u8 res12[0x800 - 0xC4];
+#endif
+ u8 res0c4[0x224 - 0xc4];
+ __be32 iodelay1; /* 0x.0224 - IO delay control register 1 */
+ __be32 iodelay2; /* 0x.0228 - IO delay control register 2 */
+ u8 res22c[0x800 - 0x22c];
__be32 clkdvdr; /* 0x.0800 - Clock Divide Register */
- u8 res13[0x900 - 0x804];
+ u8 res804[0x900 - 0x804];
__be32 ircr; /* 0x.0900 - Infrared Control Register */
- u8 res14[0x908 - 0x904];
+ u8 res904[0x908 - 0x904];
__be32 dmacr; /* 0x.0908 - DMA Control Register */
- u8 res15[0x914 - 0x90C];
+ u8 res90c[0x914 - 0x90c];
__be32 elbccr; /* 0x.0914 - eLBC Control Register */
- u8 res16[0xB20 - 0x918];
+ u8 res918[0xb20 - 0x918];
__be32 ddr1clkdr; /* 0x.0b20 - DDR1 Clock Disable Register */
__be32 ddr2clkdr; /* 0x.0b24 - DDR2 Clock Disable Register */
__be32 ddrclkdr; /* 0x.0b28 - DDR Clock Disable Register */
- u8 res17[0xE00 - 0xB2C];
+ u8 resb2c[0xe00 - 0xb2c];
__be32 clkocr; /* 0x.0e00 - Clock Out Select Register */
- u8 res18[0xE10 - 0xE04];
+ u8 rese04[0xe10 - 0xe04];
__be32 ddrdllcr; /* 0x.0e10 - DDR DLL Control Register */
- u8 res19[0xE20 - 0xE14];
+ u8 rese14[0xe20 - 0xe14];
__be32 lbcdllcr; /* 0x.0e20 - LBC DLL Control Register */
- u8 res20[0xF04 - 0xE24];
+ __be32 cpfor; /* 0x.0e24 - L2 charge pump fuse override register */
+ u8 rese28[0xf04 - 0xe28];
__be32 srds1cr0; /* 0x.0f04 - SerDes1 Control Register 0 */
__be32 srds1cr1; /* 0x.0f08 - SerDes1 Control Register 0 */
- u8 res21[0xF40 - 0xF0C];
- __be32 srds2cr0; /* 0x.0f40 - SerDes1 Control Register 0 */
- __be32 srds2cr1; /* 0x.0f44 - SerDes1 Control Register 0 */
+ u8 resf0c[0xf2c - 0xf0c];
+ __be32 itcr; /* 0x.0f2c - Internal transaction control register */
+ u8 resf30[0xf40 - 0xf30];
+ __be32 srds2cr0; /* 0x.0f40 - SerDes2 Control Register 0 */
+ __be32 srds2cr1; /* 0x.0f44 - SerDes2 Control Register 0 */
} __attribute__ ((packed));
+#ifdef CONFIG_PPC_86xx
+
#define CCSR_GUTS_DMACR_DEV_SSI 0 /* DMA controller/channel set to SSI */
#define CCSR_GUTS_DMACR_DEV_IR 1 /* DMA controller/channel set to IR */
@@ -93,7 +132,7 @@ struct ccsr_guts {
* ch: The channel on the DMA controller (0, 1, 2, or 3)
* device: The device to set as the source (CCSR_GUTS_DMACR_DEV_xx)
*/
-static inline void guts_set_dmacr(struct ccsr_guts __iomem *guts,
+static inline void guts_set_dmacr(struct ccsr_guts_86xx __iomem *guts,
unsigned int co, unsigned int ch, unsigned int device)
{
unsigned int shift = 16 + (8 * (1 - co) + 2 * (3 - ch));
@@ -129,7 +168,7 @@ static inline void guts_set_dmacr(struct ccsr_guts __iomem *guts,
* ch: The channel on the DMA controller (0, 1, 2, or 3)
* value: the new value for the bit (0 or 1)
*/
-static inline void guts_set_pmuxcr_dma(struct ccsr_guts __iomem *guts,
+static inline void guts_set_pmuxcr_dma(struct ccsr_guts_86xx __iomem *guts,
unsigned int co, unsigned int ch, unsigned int value)
{
if ((ch == 0) || (ch == 3)) {
@@ -152,5 +191,7 @@ static inline void guts_set_pmuxcr_dma(struct ccsr_guts __iomem *guts,
#define CCSR_GUTS_CLKDVDR_SSICLK_MASK 0x000000FF
#define CCSR_GUTS_CLKDVDR_SSICLK(x) ((x) & CCSR_GUTS_CLKDVDR_SSICLK_MASK)
-#endif /* __ASM_POWERPC_IMMAP_86XX_H__ */
-#endif /* __KERNEL__ */
+#endif
+
+#endif
+#endif
diff --git a/arch/powerpc/platforms/cell/interrupt.c b/arch/powerpc/platforms/cell/interrupt.c
index 10eb1a443626..e638fb3e9893 100644
--- a/arch/powerpc/platforms/cell/interrupt.c
+++ b/arch/powerpc/platforms/cell/interrupt.c
@@ -233,8 +233,6 @@ static int iic_host_match(struct irq_host *h, struct device_node *node)
"IBM,CBEA-Internal-Interrupt-Controller");
}
-extern int noirqdebug;
-
static void handle_iic_irq(unsigned int irq, struct irq_desc *desc)
{
raw_spin_lock(&desc->lock);
@@ -267,8 +265,7 @@ static void handle_iic_irq(unsigned int irq, struct irq_desc *desc)
desc->status &= ~IRQ_PENDING;
raw_spin_unlock(&desc->lock);
action_ret = handle_IRQ_event(irq, action);
- if (!noirqdebug)
- note_interrupt(irq, desc, action_ret);
+ note_interrupt(irq, desc, action_ret);
raw_spin_lock(&desc->lock);
} while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING);
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig
index 33990fa95af0..2284215981ed 100644
--- a/arch/sh/Kconfig
+++ b/arch/sh/Kconfig
@@ -23,6 +23,7 @@ config SUPERH
select HAVE_KERNEL_LZMA
select HAVE_KERNEL_LZO
select HAVE_SYSCALL_TRACEPOINTS
+ select HAVE_REGS_AND_STACK_ACCESS_API
select RTC_LIB
select GENERIC_ATOMIC64
help
@@ -45,7 +46,7 @@ config SUPERH32
select HAVE_ARCH_KGDB
select HAVE_HW_BREAKPOINT
select HAVE_MIXED_BREAKPOINTS_REGS
- select PERF_EVENTS if HAVE_HW_BREAKPOINT
+ select PERF_EVENTS
select ARCH_HIBERNATION_POSSIBLE if MMU
config SUPERH64
@@ -569,7 +570,7 @@ config SH_CLK_CPG
config SH_CLK_CPG_LEGACY
depends on SH_CLK_CPG
def_bool y if !CPU_SUBTYPE_SH7785 && !ARCH_SHMOBILE && \
- !CPU_SUBTYPE_SH7786
+ !CPU_SUBTYPE_SH7786 && !CPU_SUBTYPE_SH7757
config SH_CLK_MD
int "CPU Mode Pin Setting"
diff --git a/arch/sh/boards/Kconfig b/arch/sh/boards/Kconfig
index 07b35ca2f644..90ed1ec6921d 100644
--- a/arch/sh/boards/Kconfig
+++ b/arch/sh/boards/Kconfig
@@ -165,6 +165,11 @@ config SH_HIGHLANDER
select SYS_SUPPORTS_PCI
select IO_TRAPPED if MMU
+config SH_SH7757LCR
+ bool "SH7757LCR"
+ depends on CPU_SUBTYPE_SH7757
+ select ARCH_REQUIRE_GPIOLIB
+
config SH_SH7785LCR
bool "SH7785LCR"
depends on CPU_SUBTYPE_SH7785
@@ -309,6 +314,17 @@ config SH_POLARIS
help
Select if configuring for an SMSC Polaris development board
+config SH_SH2007
+ bool "SH-2007 board"
+ select NO_IOPORT
+ depends on CPU_SUBTYPE_SH7780
+ help
+ SH-2007 is a single-board computer based around SH7780 chip
+ intended for embedded applications.
+ It has an Ethernet interface (SMC9118), direct connected
+ Compact Flash socket, two serial ports and PC-104 bus.
+ More information at <http://sh2000.sh-linux.org>.
+
endmenu
source "arch/sh/boards/mach-r2d/Kconfig"
diff --git a/arch/sh/boards/Makefile b/arch/sh/boards/Makefile
index 4f90f9b7a922..38ef655cc0f0 100644
--- a/arch/sh/boards/Makefile
+++ b/arch/sh/boards/Makefile
@@ -2,6 +2,7 @@
# Specific board support, not covered by a mach group.
#
obj-$(CONFIG_SH_MAGIC_PANEL_R2) += board-magicpanelr2.o
+obj-$(CONFIG_SH_SH2007) += board-sh2007.o
obj-$(CONFIG_SH_SH7785LCR) += board-sh7785lcr.o
obj-$(CONFIG_SH_URQUELL) += board-urquell.o
obj-$(CONFIG_SH_SHMIN) += board-shmin.o
@@ -9,3 +10,4 @@ obj-$(CONFIG_SH_EDOSK7760) += board-edosk7760.o
obj-$(CONFIG_SH_ESPT) += board-espt.o
obj-$(CONFIG_SH_POLARIS) += board-polaris.o
obj-$(CONFIG_SH_TITAN) += board-titan.o
+obj-$(CONFIG_SH_SH7757LCR) += board-sh7757lcr.o
diff --git a/arch/sh/boards/board-sh2007.c b/arch/sh/boards/board-sh2007.c
new file mode 100644
index 000000000000..b90b78f6a829
--- /dev/null
+++ b/arch/sh/boards/board-sh2007.c
@@ -0,0 +1,133 @@
+/*
+ * SH-2007 board support.
+ *
+ * Copyright (C) 2003, 2004 SUGIOKA Toshinobu
+ * Copyright (C) 2010 Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
+ */
+#include <linux/init.h>
+#include <linux/irq.h>
+#include <linux/smsc911x.h>
+#include <linux/platform_device.h>
+#include <linux/ata_platform.h>
+#include <linux/io.h>
+#include <asm/machvec.h>
+#include <mach/sh2007.h>
+
+struct smsc911x_platform_config smc911x_info = {
+ .flags = SMSC911X_USE_32BIT,
+ .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
+ .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
+};
+
+static struct resource smsc9118_0_resources[] = {
+ [0] = {
+ .start = SMC0_BASE,
+ .end = SMC0_BASE + 0xff,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = {
+ .start = evt2irq(0x240),
+ .end = evt2irq(0x240),
+ .flags = IORESOURCE_IRQ,
+ }
+};
+
+static struct resource smsc9118_1_resources[] = {
+ [0] = {
+ .start = SMC1_BASE,
+ .end = SMC1_BASE + 0xff,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = {
+ .start = evt2irq(0x280),
+ .end = evt2irq(0x280),
+ .flags = IORESOURCE_IRQ,
+ }
+};
+
+static struct platform_device smsc9118_0_device = {
+ .name = "smsc911x",
+ .id = 0,
+ .num_resources = ARRAY_SIZE(smsc9118_0_resources),
+ .resource = smsc9118_0_resources,
+ .dev = {
+ .platform_data = &smc911x_info,
+ },
+};
+
+static struct platform_device smsc9118_1_device = {
+ .name = "smsc911x",
+ .id = 1,
+ .num_resources = ARRAY_SIZE(smsc9118_1_resources),
+ .resource = smsc9118_1_resources,
+ .dev = {
+ .platform_data = &smc911x_info,
+ },
+};
+
+static struct resource cf_resources[] = {
+ [0] = {
+ .start = CF_BASE + CF_OFFSET,
+ .end = CF_BASE + CF_OFFSET + 0x0f,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = {
+ .start = CF_BASE + CF_OFFSET + 0x206,
+ .end = CF_BASE + CF_OFFSET + 0x20f,
+ .flags = IORESOURCE_MEM,
+ },
+ [2] = {
+ .start = evt2irq(0x2c0),
+ .end = evt2irq(0x2c0),
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
+static struct platform_device cf_device = {
+ .name = "pata_platform",
+ .id = 0,
+ .num_resources = ARRAY_SIZE(cf_resources),
+ .resource = cf_resources,
+};
+
+static struct platform_device *sh2007_devices[] __initdata = {
+ &smsc9118_0_device,
+ &smsc9118_1_device,
+ &cf_device,
+};
+
+static int __init sh2007_io_init(void)
+{
+ platform_add_devices(sh2007_devices, ARRAY_SIZE(sh2007_devices));
+ return 0;
+}
+subsys_initcall(sh2007_io_init);
+
+static void __init sh2007_init_irq(void)
+{
+ plat_irq_setup_pins(IRQ_MODE_IRQ);
+}
+
+/*
+ * Initialize the board
+ */
+static void __init sh2007_setup(char **cmdline_p)
+{
+ printk(KERN_INFO "SH-2007 Setup...");
+
+ /* setup wait control registers for area 5 */
+ __raw_writel(CS5BCR_D, CS5BCR);
+ __raw_writel(CS5WCR_D, CS5WCR);
+ __raw_writel(CS5PCR_D, CS5PCR);
+
+ printk(KERN_INFO " done.\n");
+}
+
+/*
+ * The Machine Vector
+ */
+struct sh_machine_vector mv_sh2007 __initmv = {
+ .mv_setup = sh2007_setup,
+ .mv_name = "sh2007",
+ .mv_init_irq = sh2007_init_irq,
+};
diff --git a/arch/sh/boards/board-sh7757lcr.c b/arch/sh/boards/board-sh7757lcr.c
new file mode 100644
index 000000000000..c475f1056ab4
--- /dev/null
+++ b/arch/sh/boards/board-sh7757lcr.c
@@ -0,0 +1,374 @@
+/*
+ * Renesas R0P7757LC0012RL Support.
+ *
+ * Copyright (C) 2009 - 2010 Renesas Solutions Corp.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/gpio.h>
+#include <linux/irq.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/flash.h>
+#include <linux/io.h>
+#include <cpu/sh7757.h>
+#include <asm/sh_eth.h>
+#include <asm/heartbeat.h>
+
+static struct resource heartbeat_resource = {
+ .start = 0xffec005c, /* PUDR */
+ .end = 0xffec005c,
+ .flags = IORESOURCE_MEM | IORESOURCE_MEM_8BIT,
+};
+
+static unsigned char heartbeat_bit_pos[] = { 0, 1, 2, 3 };
+
+static struct heartbeat_data heartbeat_data = {
+ .bit_pos = heartbeat_bit_pos,
+ .nr_bits = ARRAY_SIZE(heartbeat_bit_pos),
+ .flags = HEARTBEAT_INVERTED,
+};
+
+static struct platform_device heartbeat_device = {
+ .name = "heartbeat",
+ .id = -1,
+ .dev = {
+ .platform_data = &heartbeat_data,
+ },
+ .num_resources = 1,
+ .resource = &heartbeat_resource,
+};
+
+/* Fast Ethernet */
+static struct resource sh_eth0_resources[] = {
+ {
+ .start = 0xfef00000,
+ .end = 0xfef001ff,
+ .flags = IORESOURCE_MEM,
+ }, {
+ .start = 84,
+ .end = 84,
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
+static struct sh_eth_plat_data sh7757_eth0_pdata = {
+ .phy = 1,
+ .edmac_endian = EDMAC_LITTLE_ENDIAN,
+};
+
+static struct platform_device sh7757_eth0_device = {
+ .name = "sh-eth",
+ .resource = sh_eth0_resources,
+ .id = 0,
+ .num_resources = ARRAY_SIZE(sh_eth0_resources),
+ .dev = {
+ .platform_data = &sh7757_eth0_pdata,
+ },
+};
+
+static struct resource sh_eth1_resources[] = {
+ {
+ .start = 0xfef00800,
+ .end = 0xfef009ff,
+ .flags = IORESOURCE_MEM,
+ }, {
+ .start = 84,
+ .end = 84,
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
+static struct sh_eth_plat_data sh7757_eth1_pdata = {
+ .phy = 1,
+ .edmac_endian = EDMAC_LITTLE_ENDIAN,
+};
+
+static struct platform_device sh7757_eth1_device = {
+ .name = "sh-eth",
+ .resource = sh_eth1_resources,
+ .id = 1,
+ .num_resources = ARRAY_SIZE(sh_eth1_resources),
+ .dev = {
+ .platform_data = &sh7757_eth1_pdata,
+ },
+};
+
+static struct platform_device *sh7757lcr_devices[] __initdata = {
+ &heartbeat_device,
+ &sh7757_eth0_device,
+ &sh7757_eth1_device,
+};
+
+static int __init sh7757lcr_devices_setup(void)
+{
+ /* RGMII (PTA) */
+ gpio_request(GPIO_FN_ET0_MDC, NULL);
+ gpio_request(GPIO_FN_ET0_MDIO, NULL);
+ gpio_request(GPIO_FN_ET1_MDC, NULL);
+ gpio_request(GPIO_FN_ET1_MDIO, NULL);
+
+ /* ONFI (PTB, PTZ) */
+ gpio_request(GPIO_FN_ON_NRE, NULL);
+ gpio_request(GPIO_FN_ON_NWE, NULL);
+ gpio_request(GPIO_FN_ON_NWP, NULL);
+ gpio_request(GPIO_FN_ON_NCE0, NULL);
+ gpio_request(GPIO_FN_ON_R_B0, NULL);
+ gpio_request(GPIO_FN_ON_ALE, NULL);
+ gpio_request(GPIO_FN_ON_CLE, NULL);
+
+ gpio_request(GPIO_FN_ON_DQ7, NULL);
+ gpio_request(GPIO_FN_ON_DQ6, NULL);
+ gpio_request(GPIO_FN_ON_DQ5, NULL);
+ gpio_request(GPIO_FN_ON_DQ4, NULL);
+ gpio_request(GPIO_FN_ON_DQ3, NULL);
+ gpio_request(GPIO_FN_ON_DQ2, NULL);
+ gpio_request(GPIO_FN_ON_DQ1, NULL);
+ gpio_request(GPIO_FN_ON_DQ0, NULL);
+
+ /* IRQ8 to 0 (PTB, PTC) */
+ gpio_request(GPIO_FN_IRQ8, NULL);
+ gpio_request(GPIO_FN_IRQ7, NULL);
+ gpio_request(GPIO_FN_IRQ6, NULL);
+ gpio_request(GPIO_FN_IRQ5, NULL);
+ gpio_request(GPIO_FN_IRQ4, NULL);
+ gpio_request(GPIO_FN_IRQ3, NULL);
+ gpio_request(GPIO_FN_IRQ2, NULL);
+ gpio_request(GPIO_FN_IRQ1, NULL);
+ gpio_request(GPIO_FN_IRQ0, NULL);
+
+ /* SPI0 (PTD) */
+ gpio_request(GPIO_FN_SP0_MOSI, NULL);
+ gpio_request(GPIO_FN_SP0_MISO, NULL);
+ gpio_request(GPIO_FN_SP0_SCK, NULL);
+ gpio_request(GPIO_FN_SP0_SCK_FB, NULL);
+ gpio_request(GPIO_FN_SP0_SS0, NULL);
+ gpio_request(GPIO_FN_SP0_SS1, NULL);
+ gpio_request(GPIO_FN_SP0_SS2, NULL);
+ gpio_request(GPIO_FN_SP0_SS3, NULL);
+
+ /* RMII 0/1 (PTE, PTF) */
+ gpio_request(GPIO_FN_RMII0_CRS_DV, NULL);
+ gpio_request(GPIO_FN_RMII0_TXD1, NULL);
+ gpio_request(GPIO_FN_RMII0_TXD0, NULL);
+ gpio_request(GPIO_FN_RMII0_TXEN, NULL);
+ gpio_request(GPIO_FN_RMII0_REFCLK, NULL);
+ gpio_request(GPIO_FN_RMII0_RXD1, NULL);
+ gpio_request(GPIO_FN_RMII0_RXD0, NULL);
+ gpio_request(GPIO_FN_RMII0_RX_ER, NULL);
+ gpio_request(GPIO_FN_RMII1_CRS_DV, NULL);
+ gpio_request(GPIO_FN_RMII1_TXD1, NULL);
+ gpio_request(GPIO_FN_RMII1_TXD0, NULL);
+ gpio_request(GPIO_FN_RMII1_TXEN, NULL);
+ gpio_request(GPIO_FN_RMII1_REFCLK, NULL);
+ gpio_request(GPIO_FN_RMII1_RXD1, NULL);
+ gpio_request(GPIO_FN_RMII1_RXD0, NULL);
+ gpio_request(GPIO_FN_RMII1_RX_ER, NULL);
+
+ /* eMMC (PTG) */
+ gpio_request(GPIO_FN_MMCCLK, NULL);
+ gpio_request(GPIO_FN_MMCCMD, NULL);
+ gpio_request(GPIO_FN_MMCDAT7, NULL);
+ gpio_request(GPIO_FN_MMCDAT6, NULL);
+ gpio_request(GPIO_FN_MMCDAT5, NULL);
+ gpio_request(GPIO_FN_MMCDAT4, NULL);
+ gpio_request(GPIO_FN_MMCDAT3, NULL);
+ gpio_request(GPIO_FN_MMCDAT2, NULL);
+ gpio_request(GPIO_FN_MMCDAT1, NULL);
+ gpio_request(GPIO_FN_MMCDAT0, NULL);
+
+ /* LPC (PTG, PTH, PTQ, PTU) */
+ gpio_request(GPIO_FN_SERIRQ, NULL);
+ gpio_request(GPIO_FN_LPCPD, NULL);
+ gpio_request(GPIO_FN_LDRQ, NULL);
+ gpio_request(GPIO_FN_WP, NULL);
+ gpio_request(GPIO_FN_FMS0, NULL);
+ gpio_request(GPIO_FN_LAD3, NULL);
+ gpio_request(GPIO_FN_LAD2, NULL);
+ gpio_request(GPIO_FN_LAD1, NULL);
+ gpio_request(GPIO_FN_LAD0, NULL);
+ gpio_request(GPIO_FN_LFRAME, NULL);
+ gpio_request(GPIO_FN_LRESET, NULL);
+ gpio_request(GPIO_FN_LCLK, NULL);
+ gpio_request(GPIO_FN_LGPIO7, NULL);
+ gpio_request(GPIO_FN_LGPIO6, NULL);
+ gpio_request(GPIO_FN_LGPIO5, NULL);
+ gpio_request(GPIO_FN_LGPIO4, NULL);
+
+ /* SPI1 (PTH) */
+ gpio_request(GPIO_FN_SP1_MOSI, NULL);
+ gpio_request(GPIO_FN_SP1_MISO, NULL);
+ gpio_request(GPIO_FN_SP1_SCK, NULL);
+ gpio_request(GPIO_FN_SP1_SCK_FB, NULL);
+ gpio_request(GPIO_FN_SP1_SS0, NULL);
+ gpio_request(GPIO_FN_SP1_SS1, NULL);
+
+ /* SDHI (PTI) */
+ gpio_request(GPIO_FN_SD_WP, NULL);
+ gpio_request(GPIO_FN_SD_CD, NULL);
+ gpio_request(GPIO_FN_SD_CLK, NULL);
+ gpio_request(GPIO_FN_SD_CMD, NULL);
+ gpio_request(GPIO_FN_SD_D3, NULL);
+ gpio_request(GPIO_FN_SD_D2, NULL);
+ gpio_request(GPIO_FN_SD_D1, NULL);
+ gpio_request(GPIO_FN_SD_D0, NULL);
+
+ /* SCIF3/4 (PTJ, PTW) */
+ gpio_request(GPIO_FN_RTS3, NULL);
+ gpio_request(GPIO_FN_CTS3, NULL);
+ gpio_request(GPIO_FN_TXD3, NULL);
+ gpio_request(GPIO_FN_RXD3, NULL);
+ gpio_request(GPIO_FN_RTS4, NULL);
+ gpio_request(GPIO_FN_RXD4, NULL);
+ gpio_request(GPIO_FN_TXD4, NULL);
+ gpio_request(GPIO_FN_CTS4, NULL);
+
+ /* SERMUX (PTK, PTL, PTO, PTV) */
+ gpio_request(GPIO_FN_COM2_TXD, NULL);
+ gpio_request(GPIO_FN_COM2_RXD, NULL);
+ gpio_request(GPIO_FN_COM2_RTS, NULL);
+ gpio_request(GPIO_FN_COM2_CTS, NULL);
+ gpio_request(GPIO_FN_COM2_DTR, NULL);
+ gpio_request(GPIO_FN_COM2_DSR, NULL);
+ gpio_request(GPIO_FN_COM2_DCD, NULL);
+ gpio_request(GPIO_FN_COM2_RI, NULL);
+ gpio_request(GPIO_FN_RAC_RXD, NULL);
+ gpio_request(GPIO_FN_RAC_RTS, NULL);
+ gpio_request(GPIO_FN_RAC_CTS, NULL);
+ gpio_request(GPIO_FN_RAC_DTR, NULL);
+ gpio_request(GPIO_FN_RAC_DSR, NULL);
+ gpio_request(GPIO_FN_RAC_DCD, NULL);
+ gpio_request(GPIO_FN_RAC_TXD, NULL);
+ gpio_request(GPIO_FN_COM1_TXD, NULL);
+ gpio_request(GPIO_FN_COM1_RXD, NULL);
+ gpio_request(GPIO_FN_COM1_RTS, NULL);
+ gpio_request(GPIO_FN_COM1_CTS, NULL);
+
+ writeb(0x10, 0xfe470000); /* SMR0: SerMux mode 0 */
+
+ /* IIC (PTM, PTR, PTS) */
+ gpio_request(GPIO_FN_SDA7, NULL);
+ gpio_request(GPIO_FN_SCL7, NULL);
+ gpio_request(GPIO_FN_SDA6, NULL);
+ gpio_request(GPIO_FN_SCL6, NULL);
+ gpio_request(GPIO_FN_SDA5, NULL);
+ gpio_request(GPIO_FN_SCL5, NULL);
+ gpio_request(GPIO_FN_SDA4, NULL);
+ gpio_request(GPIO_FN_SCL4, NULL);
+ gpio_request(GPIO_FN_SDA3, NULL);
+ gpio_request(GPIO_FN_SCL3, NULL);
+ gpio_request(GPIO_FN_SDA2, NULL);
+ gpio_request(GPIO_FN_SCL2, NULL);
+ gpio_request(GPIO_FN_SDA1, NULL);
+ gpio_request(GPIO_FN_SCL1, NULL);
+ gpio_request(GPIO_FN_SDA0, NULL);
+ gpio_request(GPIO_FN_SCL0, NULL);
+
+ /* USB (PTN) */
+ gpio_request(GPIO_FN_VBUS_EN, NULL);
+ gpio_request(GPIO_FN_VBUS_OC, NULL);
+
+ /* SGPIO1/0 (PTN, PTO) */
+ gpio_request(GPIO_FN_SGPIO1_CLK, NULL);
+ gpio_request(GPIO_FN_SGPIO1_LOAD, NULL);
+ gpio_request(GPIO_FN_SGPIO1_DI, NULL);
+ gpio_request(GPIO_FN_SGPIO1_DO, NULL);
+ gpio_request(GPIO_FN_SGPIO0_CLK, NULL);
+ gpio_request(GPIO_FN_SGPIO0_LOAD, NULL);
+ gpio_request(GPIO_FN_SGPIO0_DI, NULL);
+ gpio_request(GPIO_FN_SGPIO0_DO, NULL);
+
+ /* WDT (PTN) */
+ gpio_request(GPIO_FN_SUB_CLKIN, NULL);
+
+ /* System (PTT) */
+ gpio_request(GPIO_FN_STATUS1, NULL);
+ gpio_request(GPIO_FN_STATUS0, NULL);
+
+ /* PWMX (PTT) */
+ gpio_request(GPIO_FN_PWMX1, NULL);
+ gpio_request(GPIO_FN_PWMX0, NULL);
+
+ /* R-SPI (PTV) */
+ gpio_request(GPIO_FN_R_SPI_MOSI, NULL);
+ gpio_request(GPIO_FN_R_SPI_MISO, NULL);
+ gpio_request(GPIO_FN_R_SPI_RSPCK, NULL);
+ gpio_request(GPIO_FN_R_SPI_SSL0, NULL);
+ gpio_request(GPIO_FN_R_SPI_SSL1, NULL);
+
+ /* EVC (PTV, PTW) */
+ gpio_request(GPIO_FN_EVENT7, NULL);
+ gpio_request(GPIO_FN_EVENT6, NULL);
+ gpio_request(GPIO_FN_EVENT5, NULL);
+ gpio_request(GPIO_FN_EVENT4, NULL);
+ gpio_request(GPIO_FN_EVENT3, NULL);
+ gpio_request(GPIO_FN_EVENT2, NULL);
+ gpio_request(GPIO_FN_EVENT1, NULL);
+ gpio_request(GPIO_FN_EVENT0, NULL);
+
+ /* LED for heartbeat */
+ gpio_request(GPIO_PTU3, NULL);
+ gpio_direction_output(GPIO_PTU3, 1);
+ gpio_request(GPIO_PTU2, NULL);
+ gpio_direction_output(GPIO_PTU2, 1);
+ gpio_request(GPIO_PTU1, NULL);
+ gpio_direction_output(GPIO_PTU1, 1);
+ gpio_request(GPIO_PTU0, NULL);
+ gpio_direction_output(GPIO_PTU0, 1);
+
+ /* control for MDIO of Gigabit Ethernet */
+ gpio_request(GPIO_PTT4, NULL);
+ gpio_direction_output(GPIO_PTT4, 1);
+
+ /* control for eMMC */
+ gpio_request(GPIO_PTT7, NULL); /* eMMC_RST# */
+ gpio_direction_output(GPIO_PTT7, 0);
+ gpio_request(GPIO_PTT6, NULL); /* eMMC_INDEX# */
+ gpio_direction_output(GPIO_PTT6, 0);
+ gpio_request(GPIO_PTT5, NULL); /* eMMC_PRST# */
+ gpio_direction_output(GPIO_PTT5, 1);
+
+ /* General platform */
+ return platform_add_devices(sh7757lcr_devices,
+ ARRAY_SIZE(sh7757lcr_devices));
+}
+arch_initcall(sh7757lcr_devices_setup);
+
+/* Initialize IRQ setting */
+void __init init_sh7757lcr_IRQ(void)
+{
+ plat_irq_setup_pins(IRQ_MODE_IRQ7654);
+ plat_irq_setup_pins(IRQ_MODE_IRQ3210);
+}
+
+/* Initialize the board */
+static void __init sh7757lcr_setup(char **cmdline_p)
+{
+ printk(KERN_INFO "Renesas R0P7757LC0012RL support.\n");
+}
+
+static int sh7757lcr_mode_pins(void)
+{
+ int value = 0;
+
+ /* These are the factory default settings of S3 (Low active).
+ * If you change these dip switches then you will need to
+ * adjust the values below as well.
+ */
+ value |= MODE_PIN0; /* Clock Mode: 1 */
+
+ return value;
+}
+
+/* The Machine Vector */
+static struct sh_machine_vector mv_sh7757lcr __initmv = {
+ .mv_name = "SH7757LCR",
+ .mv_setup = sh7757lcr_setup,
+ .mv_init_irq = init_sh7757lcr_IRQ,
+ .mv_mode_pins = sh7757lcr_mode_pins,
+};
+
diff --git a/arch/sh/configs/sh2007_defconfig b/arch/sh/configs/sh2007_defconfig
new file mode 100644
index 000000000000..adf7a6b05814
--- /dev/null
+++ b/arch/sh/configs/sh2007_defconfig
@@ -0,0 +1,1357 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.35-rc2
+# Fri Jun 18 19:46:14 2010
+#
+CONFIG_SUPERH=y
+CONFIG_SUPERH32=y
+# CONFIG_SUPERH64 is not set
+CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig"
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_SPARSE_IRQ=y
+# CONFIG_GENERIC_GPIO is not set
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+# CONFIG_ARCH_SUSPEND_POSSIBLE is not set
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_SYS_SUPPORTS_HUGETLBFS=y
+CONFIG_SYS_SUPPORTS_TMU=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_ARCH_NO_VIRT_TO_BUS=y
+CONFIG_ARCH_HAS_DEFAULT_IDLE=y
+CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
+CONFIG_NO_IOPORT=y
+CONFIG_DMA_NONCOHERENT=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_NEED_SG_DMA_LENGTH=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_CONSTRUCTORS=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_CROSS_COMPILE=""
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_BZIP2=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_KERNEL_GZIP=y
+# CONFIG_KERNEL_BZIP2 is not set
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_LZO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+# CONFIG_TASKSTATS is not set
+CONFIG_AUDIT=y
+CONFIG_AUDITSYSCALL=y
+CONFIG_AUDIT_TREE=y
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_RCU=y
+# CONFIG_TREE_PREEMPT_RCU is not set
+# CONFIG_TINY_RCU is not set
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_FANOUT=32
+# CONFIG_RCU_FANOUT_EXACT is not set
+# CONFIG_TREE_RCU_TRACE is not set
+CONFIG_IKCONFIG=y
+# CONFIG_IKCONFIG_PROC is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_CGROUPS is not set
+CONFIG_SYSFS_DEPRECATED=y
+CONFIG_SYSFS_DEPRECATED_V2=y
+# CONFIG_RELAY is not set
+# CONFIG_NAMESPACES is not set
+# CONFIG_BLK_DEV_INITRD is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_PERF_USE_VMALLOC=y
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_PERF_EVENTS=y
+# CONFIG_PERF_COUNTERS is not set
+# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_COMPAT_BRK=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+CONFIG_HAVE_IOREMAP_PROT=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_DMA_ATTRS=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_DMA_API_DEBUG=y
+CONFIG_HAVE_HW_BREAKPOINT=y
+CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+# CONFIG_SLOW_WORK is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+# CONFIG_MODULES is not set
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+# CONFIG_INLINE_SPIN_TRYLOCK is not set
+# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK is not set
+# CONFIG_INLINE_SPIN_LOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
+CONFIG_INLINE_SPIN_UNLOCK=y
+# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
+CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
+# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_READ_TRYLOCK is not set
+# CONFIG_INLINE_READ_LOCK is not set
+# CONFIG_INLINE_READ_LOCK_BH is not set
+# CONFIG_INLINE_READ_LOCK_IRQ is not set
+# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
+CONFIG_INLINE_READ_UNLOCK=y
+# CONFIG_INLINE_READ_UNLOCK_BH is not set
+CONFIG_INLINE_READ_UNLOCK_IRQ=y
+# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_WRITE_TRYLOCK is not set
+# CONFIG_INLINE_WRITE_LOCK is not set
+# CONFIG_INLINE_WRITE_LOCK_BH is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
+CONFIG_INLINE_WRITE_UNLOCK=y
+# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
+CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
+# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
+# CONFIG_MUTEX_SPIN_ON_OWNER is not set
+# CONFIG_FREEZER is not set
+
+#
+# System type
+#
+CONFIG_CPU_SH4=y
+CONFIG_CPU_SH4A=y
+# CONFIG_CPU_SUBTYPE_SH7619 is not set
+# CONFIG_CPU_SUBTYPE_SH7201 is not set
+# CONFIG_CPU_SUBTYPE_SH7203 is not set
+# CONFIG_CPU_SUBTYPE_SH7206 is not set
+# CONFIG_CPU_SUBTYPE_SH7263 is not set
+# CONFIG_CPU_SUBTYPE_MXG is not set
+# CONFIG_CPU_SUBTYPE_SH7705 is not set
+# CONFIG_CPU_SUBTYPE_SH7706 is not set
+# CONFIG_CPU_SUBTYPE_SH7707 is not set
+# CONFIG_CPU_SUBTYPE_SH7708 is not set
+# CONFIG_CPU_SUBTYPE_SH7709 is not set
+# CONFIG_CPU_SUBTYPE_SH7710 is not set
+# CONFIG_CPU_SUBTYPE_SH7712 is not set
+# CONFIG_CPU_SUBTYPE_SH7720 is not set
+# CONFIG_CPU_SUBTYPE_SH7721 is not set
+# CONFIG_CPU_SUBTYPE_SH7750 is not set
+# CONFIG_CPU_SUBTYPE_SH7091 is not set
+# CONFIG_CPU_SUBTYPE_SH7750R is not set
+# CONFIG_CPU_SUBTYPE_SH7750S is not set
+# CONFIG_CPU_SUBTYPE_SH7751 is not set
+# CONFIG_CPU_SUBTYPE_SH7751R is not set
+# CONFIG_CPU_SUBTYPE_SH7760 is not set
+# CONFIG_CPU_SUBTYPE_SH4_202 is not set
+# CONFIG_CPU_SUBTYPE_SH7723 is not set
+# CONFIG_CPU_SUBTYPE_SH7724 is not set
+# CONFIG_CPU_SUBTYPE_SH7757 is not set
+# CONFIG_CPU_SUBTYPE_SH7763 is not set
+# CONFIG_CPU_SUBTYPE_SH7770 is not set
+CONFIG_CPU_SUBTYPE_SH7780=y
+# CONFIG_CPU_SUBTYPE_SH7785 is not set
+# CONFIG_CPU_SUBTYPE_SH7786 is not set
+# CONFIG_CPU_SUBTYPE_SHX3 is not set
+# CONFIG_CPU_SUBTYPE_SH7343 is not set
+# CONFIG_CPU_SUBTYPE_SH7722 is not set
+# CONFIG_CPU_SUBTYPE_SH7366 is not set
+
+#
+# Memory management options
+#
+CONFIG_QUICKLIST=y
+CONFIG_MMU=y
+CONFIG_PAGE_OFFSET=0x80000000
+CONFIG_FORCE_MAX_ZONEORDER=11
+CONFIG_MEMORY_START=0x08000000
+CONFIG_MEMORY_SIZE=0x08000000
+CONFIG_29BIT=y
+# CONFIG_PMB is not set
+# CONFIG_VSYSCALL is not set
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_MAX_ACTIVE_REGIONS=1
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_UNCACHED_MAPPING=y
+CONFIG_PAGE_SIZE_4KB=y
+# CONFIG_PAGE_SIZE_8KB is not set
+# CONFIG_PAGE_SIZE_16KB is not set
+# CONFIG_PAGE_SIZE_64KB is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_SPARSEMEM_STATIC=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_NR_QUICK=1
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+
+#
+# Cache configuration
+#
+CONFIG_CACHE_WRITEBACK=y
+# CONFIG_CACHE_WRITETHROUGH is not set
+# CONFIG_CACHE_OFF is not set
+
+#
+# Processor features
+#
+CONFIG_CPU_LITTLE_ENDIAN=y
+# CONFIG_CPU_BIG_ENDIAN is not set
+CONFIG_SH_FPU=y
+# CONFIG_SH_STORE_QUEUES is not set
+# CONFIG_SPECULATIVE_EXECUTION is not set
+CONFIG_CPU_HAS_INTEVT=y
+CONFIG_CPU_HAS_SR_RB=y
+CONFIG_CPU_HAS_FPU=y
+
+#
+# Board support
+#
+# CONFIG_SH_7780_SOLUTION_ENGINE is not set
+# CONFIG_SH_SDK7780 is not set
+# CONFIG_SH_HIGHLANDER is not set
+CONFIG_SH_SH2007=y
+
+#
+# Timer and clock configuration
+#
+CONFIG_SH_TIMER_TMU=y
+CONFIG_SH_PCLK_FREQ=50000000
+CONFIG_SH_CLK_CPG=y
+CONFIG_SH_CLK_CPG_LEGACY=y
+CONFIG_TICK_ONESHOT=y
+# CONFIG_NO_HZ is not set
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# DMA support
+#
+CONFIG_SH_DMA=y
+CONFIG_SH_DMA_IRQ_MULTI=y
+CONFIG_SH_DMA_API=y
+CONFIG_NR_ONCHIP_DMA_CHANNELS=12
+CONFIG_NR_DMA_CHANNELS_BOOL=y
+CONFIG_NR_DMA_CHANNELS=12
+
+#
+# Companion Chips
+#
+
+#
+# Additional SuperH Device Drivers
+#
+# CONFIG_HEARTBEAT is not set
+# CONFIG_PUSH_SWITCH is not set
+
+#
+# Kernel features
+#
+CONFIG_HZ_100=y
+# CONFIG_HZ_250 is not set
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=100
+CONFIG_SCHED_HRTICK=y
+# CONFIG_KEXEC is not set
+# CONFIG_CRASH_DUMP is not set
+# CONFIG_SECCOMP is not set
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_GUSA=y
+# CONFIG_INTC_USERIMASK is not set
+
+#
+# Boot options
+#
+CONFIG_ZERO_PAGE_OFFSET=0x00001000
+CONFIG_BOOT_LINK_OFFSET=0x00800000
+CONFIG_ENTRY_OFFSET=0x00001000
+CONFIG_CMDLINE_OVERWRITE=y
+# CONFIG_CMDLINE_EXTEND is not set
+CONFIG_CMDLINE="console=ttySC1,115200 ip=dhcp root=/dev/nfs rw nfsroot=/nfs/rootfs,rsize=1024,wsize=1024 earlyprintk=sh-sci.1"
+
+#
+# Bus options
+#
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_PCCARD=y
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+
+#
+# PC-card bridges
+#
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+# CONFIG_HAVE_AOUT is not set
+CONFIG_BINFMT_MISC=y
+
+#
+# Power management options (EXPERIMENTAL)
+#
+# CONFIG_PM is not set
+# CONFIG_CPU_IDLE is not set
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+CONFIG_XFRM_USER=y
+# CONFIG_XFRM_SUB_POLICY is not set
+CONFIG_XFRM_MIGRATE=y
+# CONFIG_XFRM_STATISTICS is not set
+CONFIG_NET_KEY=y
+CONFIG_NET_KEY_MIGRATE=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_ASK_IP_FIB_HASH=y
+# CONFIG_IP_FIB_TRIE is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+CONFIG_NET_IPIP=y
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+CONFIG_INET_TUNNEL=y
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+CONFIG_NETWORK_SECMARK=y
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_RDS is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_L2TP is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_PHONET is not set
+# CONFIG_IEEE802154 is not set
+# CONFIG_NET_SCHED is not set
+# CONFIG_DCB is not set
+
+#
+# Network testing
+#
+CONFIG_NET_PKTGEN=y
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+CONFIG_FIB_RULES=y
+CONFIG_WIRELESS=y
+# CONFIG_CFG80211 is not set
+# CONFIG_LIB80211 is not set
+
+#
+# CFG80211 needs to be enabled for MAC80211
+#
+
+#
+# Some wireless drivers require a rate control algorithm
+#
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+# CONFIG_CAIF is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_DEVTMPFS is not set
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+# CONFIG_MTD is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+
+#
+# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
+#
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+# CONFIG_BLK_DEV_XIP is not set
+CONFIG_CDROM_PKTCDVD=y
+CONFIG_CDROM_PKTCDVD_BUFFERS=8
+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_MISC_DEVICES is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+CONFIG_RAID_ATTRS=y
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+CONFIG_SCSI_TGT=y
+CONFIG_SCSI_NETLINK=y
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=y
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SCH is not set
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_SCSI_LOGGING=y
+CONFIG_SCSI_SCAN_ASYNC=y
+
+#
+# SCSI Transports
+#
+CONFIG_SCSI_SPI_ATTRS=y
+CONFIG_SCSI_FC_ATTRS=y
+# CONFIG_SCSI_FC_TGT_ATTRS is not set
+CONFIG_SCSI_ISCSI_ATTRS=y
+# CONFIG_SCSI_SAS_LIBSAS is not set
+CONFIG_SCSI_SRP_ATTRS=y
+# CONFIG_SCSI_SRP_TGT_ATTRS is not set
+# CONFIG_SCSI_LOWLEVEL is not set
+# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
+# CONFIG_SCSI_DH is not set
+# CONFIG_SCSI_OSD_INITIATOR is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=y
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+CONFIG_EQUALIZER=y
+CONFIG_TUN=y
+CONFIG_VETH=y
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_STE10XP is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+# CONFIG_MICREL_PHY is not set
+# CONFIG_FIXED_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_AX88796 is not set
+# CONFIG_STNIC is not set
+# CONFIG_SMC91X is not set
+# CONFIG_ETHOC is not set
+# CONFIG_SMC911X is not set
+CONFIG_SMSC911X=y
+# CONFIG_DNET is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+# CONFIG_B44 is not set
+# CONFIG_KS8842 is not set
+# CONFIG_KS8851_MLL is not set
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+# CONFIG_WLAN is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET is not set
+# CONFIG_USB_IPHETH is not set
+# CONFIG_NET_PCMCIA is not set
+# CONFIG_WAN is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_FF_MEMLESS=y
+# CONFIG_INPUT_POLLDEV is not set
+# CONFIG_INPUT_SPARSEKMAP is not set
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+# CONFIG_DEVKMEM is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_N_GSM is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_SH_SCI=y
+CONFIG_SERIAL_SH_SCI_NR_UARTS=2
+CONFIG_SERIAL_SH_SCI_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_TIMBERDALE is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_IPMI_HANDLER is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_HW_RANDOM_TIMERIOMEM is not set
+# CONFIG_R3964 is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_IPWIRELESS is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_RAMOOPS is not set
+# CONFIG_I2C is not set
+# CONFIG_SPI is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_SH_WDT=y
+# CONFIG_SH_WDT_MMAP is not set
+
+#
+# USB-based Watchdog Cards
+#
+# CONFIG_USBPCWATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+CONFIG_SSB=y
+CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
+# CONFIG_SSB_PCMCIAHOST is not set
+# CONFIG_SSB_SILENT is not set
+# CONFIG_SSB_DEBUG is not set
+CONFIG_MFD_SUPPORT=y
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_SH_MOBILE_SDHI is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_ABX500_CORE is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+# CONFIG_FB_SYS_FOPS is not set
+# CONFIG_FB_SVGALIB is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_SH_MOBILE_LCDC is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_METRONOME is not set
+# CONFIG_FB_MB862XX is not set
+# CONFIG_FB_BROADSHEET is not set
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_GENERIC=y
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+CONFIG_LOGO=y
+CONFIG_LOGO_LINUX_MONO=y
+CONFIG_LOGO_LINUX_VGA16=y
+CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_LOGO_SUPERH_MONO=y
+CONFIG_LOGO_SUPERH_VGA16=y
+CONFIG_LOGO_SUPERH_CLUT224=y
+# CONFIG_SOUND is not set
+# CONFIG_HID_SUPPORT is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_DEVICE_CLASS is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG_WHITELIST is not set
+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+CONFIG_USB_MON=y
+# CONFIG_USB_WUSB is not set
+# CONFIG_USB_WUSB_CBAF is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_C67X00_HCD is not set
+# CONFIG_USB_OXU210HP_HCD is not set
+# CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_ISP1760_HCD is not set
+# CONFIG_USB_ISP1362_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+# CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_HWA_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+# CONFIG_USB_WDM is not set
+# CONFIG_USB_TMC is not set
+
+#
+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
+#
+
+#
+# also be needed; see USB_STORAGE Help for more info
+#
+# CONFIG_USB_STORAGE is not set
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_SEVSEG is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_IOWARRIOR is not set
+# CONFIG_USB_TEST is not set
+# CONFIG_USB_ISIGHTFW is not set
+# CONFIG_USB_GADGET is not set
+
+#
+# OTG and related infrastructure
+#
+# CONFIG_NOP_USB_XCEIV is not set
+# CONFIG_MMC is not set
+# CONFIG_MEMSTICK is not set
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_TRIGGERS=y
+
+#
+# LED Triggers
+#
+# CONFIG_LEDS_TRIGGER_TIMER is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
+
+#
+# iptables trigger is under Netfilter config (LED target)
+#
+# CONFIG_ACCESSIBILITY is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+CONFIG_RTC_INTF_DEV_UIE_EMUL=y
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# SPI RTC drivers
+#
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_DS1286 is not set
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T35 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_MSM6242 is not set
+# CONFIG_RTC_DRV_BQ4802 is not set
+# CONFIG_RTC_DRV_RP5C01 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+# CONFIG_RTC_DRV_SH is not set
+# CONFIG_RTC_DRV_GENERIC is not set
+CONFIG_DMADEVICES=y
+# CONFIG_DMADEVICES_DEBUG is not set
+
+#
+# DMA Devices
+#
+CONFIG_TIMB_DMA=y
+CONFIG_DMA_ENGINE=y
+
+#
+# DMA Clients
+#
+# CONFIG_NET_DMA is not set
+# CONFIG_ASYNC_TX_DMA is not set
+# CONFIG_DMATEST is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+# CONFIG_STAGING is not set
+
+#
+# File systems
+#
+# CONFIG_EXT2_FS is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+CONFIG_FS_POSIX_ACL=y
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+CONFIG_GENERIC_ACL=y
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=y
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=932
+CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_CONFIGFS_FS=y
+# CONFIG_MISC_FILESYSTEMS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V3_ACL=y
+CONFIG_NFS_V4=y
+# CONFIG_NFS_V4_1 is not set
+CONFIG_ROOT_NFS=y
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_ACL_SUPPORT=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CEPH_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=y
+CONFIG_NLS_CODEPAGE_775=y
+CONFIG_NLS_CODEPAGE_850=y
+CONFIG_NLS_CODEPAGE_852=y
+CONFIG_NLS_CODEPAGE_855=y
+CONFIG_NLS_CODEPAGE_857=y
+CONFIG_NLS_CODEPAGE_860=y
+CONFIG_NLS_CODEPAGE_861=y
+CONFIG_NLS_CODEPAGE_862=y
+CONFIG_NLS_CODEPAGE_863=y
+CONFIG_NLS_CODEPAGE_864=y
+CONFIG_NLS_CODEPAGE_865=y
+CONFIG_NLS_CODEPAGE_866=y
+CONFIG_NLS_CODEPAGE_869=y
+CONFIG_NLS_CODEPAGE_936=y
+CONFIG_NLS_CODEPAGE_950=y
+CONFIG_NLS_CODEPAGE_932=y
+CONFIG_NLS_CODEPAGE_949=y
+CONFIG_NLS_CODEPAGE_874=y
+CONFIG_NLS_ISO8859_8=y
+CONFIG_NLS_CODEPAGE_1250=y
+CONFIG_NLS_CODEPAGE_1251=y
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=y
+CONFIG_NLS_ISO8859_3=y
+CONFIG_NLS_ISO8859_4=y
+CONFIG_NLS_ISO8859_5=y
+CONFIG_NLS_ISO8859_6=y
+CONFIG_NLS_ISO8859_7=y
+CONFIG_NLS_ISO8859_9=y
+CONFIG_NLS_ISO8859_13=y
+CONFIG_NLS_ISO8859_14=y
+CONFIG_NLS_ISO8859_15=y
+CONFIG_NLS_KOI8_R=y
+CONFIG_NLS_KOI8_U=y
+CONFIG_NLS_UTF8=y
+# CONFIG_DLM is not set
+
+#
+# Kernel hacking
+#
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_FRAME_WARN=1024
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+# CONFIG_DETECT_SOFTLOCKUP is not set
+# CONFIG_DETECT_HUNG_TASK is not set
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_WRITECOUNT is not set
+# CONFIG_DEBUG_MEMORY_INIT is not set
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# CONFIG_LKDTM is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+# CONFIG_PAGE_POISONING is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_ENABLE_DEFAULT_TRACERS is not set
+# CONFIG_FTRACE_SYSCALLS is not set
+# CONFIG_BOOT_TRACER is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_KSYM_TRACER is not set
+# CONFIG_STACK_TRACER is not set
+# CONFIG_KMEMTRACE is not set
+# CONFIG_WORKQUEUE_TRACER is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+# CONFIG_DMA_API_DEBUG is not set
+# CONFIG_ATOMIC64_SELFTEST is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+CONFIG_SH_STANDARD_BIOS=y
+# CONFIG_STACK_DEBUG is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_4KSTACKS is not set
+CONFIG_DUMP_CODE=y
+# CONFIG_DWARF_UNWINDER is not set
+# CONFIG_SH_NO_BSS_INIT is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+# CONFIG_DEFAULT_SECURITY_SELINUX is not set
+# CONFIG_DEFAULT_SECURITY_SMACK is not set
+# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_PCOMP=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+CONFIG_CRYPTO_GF128MUL=y
+CONFIG_CRYPTO_NULL=y
+CONFIG_CRYPTO_WORKQUEUE=y
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_AUTHENC=y
+
+#
+# Authenticated Encryption with Associated Data
+#
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_SEQIV is not set
+
+#
+# Block modes
+#
+CONFIG_CRYPTO_CBC=y
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_CTS is not set
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_LRW=y
+CONFIG_CRYPTO_PCBC=y
+CONFIG_CRYPTO_XTS=y
+
+#
+# Hash modes
+#
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_XCBC=y
+# CONFIG_CRYPTO_VMAC is not set
+
+#
+# Digest
+#
+CONFIG_CRYPTO_CRC32C=y
+# CONFIG_CRYPTO_GHASH is not set
+CONFIG_CRYPTO_MD4=y
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA256=y
+CONFIG_CRYPTO_SHA512=y
+CONFIG_CRYPTO_TGR192=y
+CONFIG_CRYPTO_WP512=y
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_AES=y
+CONFIG_CRYPTO_ANUBIS=y
+CONFIG_CRYPTO_ARC4=y
+CONFIG_CRYPTO_BLOWFISH=y
+CONFIG_CRYPTO_CAMELLIA=y
+CONFIG_CRYPTO_CAST5=y
+CONFIG_CRYPTO_CAST6=y
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_FCRYPT=y
+CONFIG_CRYPTO_KHAZAD=y
+# CONFIG_CRYPTO_SALSA20 is not set
+CONFIG_CRYPTO_SEED=y
+CONFIG_CRYPTO_SERPENT=y
+CONFIG_CRYPTO_TEA=y
+CONFIG_CRYPTO_TWOFISH=y
+CONFIG_CRYPTO_TWOFISH_COMMON=y
+
+#
+# Compression
+#
+CONFIG_CRYPTO_DEFLATE=y
+# CONFIG_CRYPTO_ZLIB is not set
+CONFIG_CRYPTO_LZO=y
+
+#
+# Random Number Generation
+#
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+# CONFIG_CRYPTO_HW is not set
+# CONFIG_VIRTUALIZATION is not set
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC16=y
+# CONFIG_CRC_T10DIF is not set
+CONFIG_CRC_ITU_T=y
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+CONFIG_LIBCRC32C=y
+CONFIG_AUDIT_GENERIC=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_DMA=y
+CONFIG_HAVE_LMB=y
+CONFIG_NLATTR=y
+CONFIG_GENERIC_ATOMIC64=y
diff --git a/arch/sh/configs/sh7757lcr_defconfig b/arch/sh/configs/sh7757lcr_defconfig
new file mode 100644
index 000000000000..635933e76e31
--- /dev/null
+++ b/arch/sh/configs/sh7757lcr_defconfig
@@ -0,0 +1,1126 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.35-rc3
+# Mon Jul 5 20:42:01 2010
+#
+CONFIG_SUPERH=y
+CONFIG_SUPERH32=y
+# CONFIG_SUPERH64 is not set
+CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig"
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_SPARSE_IRQ=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+# CONFIG_ARCH_SUSPEND_POSSIBLE is not set
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_SYS_SUPPORTS_HUGETLBFS=y
+CONFIG_SYS_SUPPORTS_TMU=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_ARCH_NO_VIRT_TO_BUS=y
+CONFIG_ARCH_HAS_DEFAULT_IDLE=y
+CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
+CONFIG_DMA_NONCOHERENT=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_NEED_SG_DMA_LENGTH=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_CONSTRUCTORS=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_CROSS_COMPILE=""
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_BZIP2=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_KERNEL_GZIP=y
+# CONFIG_KERNEL_BZIP2 is not set
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_LZO is not set
+# CONFIG_SWAP is not set
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+CONFIG_TASKSTATS=y
+CONFIG_TASK_DELAY_ACCT=y
+CONFIG_TASK_XACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+# CONFIG_AUDIT is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_RCU=y
+# CONFIG_TREE_PREEMPT_RCU is not set
+# CONFIG_TINY_RCU is not set
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_FANOUT=32
+# CONFIG_RCU_FANOUT_EXACT is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_CGROUPS is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+# CONFIG_RELAY is not set
+# CONFIG_NAMESPACES is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+# CONFIG_RD_BZIP2 is not set
+# CONFIG_RD_LZMA is not set
+# CONFIG_RD_LZO is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+# CONFIG_SYSCTL_SYSCALL is not set
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_PERF_USE_VMALLOC=y
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_PERF_EVENTS=y
+# CONFIG_PERF_COUNTERS is not set
+# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_COMPAT_BRK=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_DMA_ATTRS=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_DMA_API_DEBUG=y
+CONFIG_HAVE_HW_BREAKPOINT=y
+CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_SLOW_WORK is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+# CONFIG_INLINE_SPIN_TRYLOCK is not set
+# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK is not set
+# CONFIG_INLINE_SPIN_LOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
+CONFIG_INLINE_SPIN_UNLOCK=y
+# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
+CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
+# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_READ_TRYLOCK is not set
+# CONFIG_INLINE_READ_LOCK is not set
+# CONFIG_INLINE_READ_LOCK_BH is not set
+# CONFIG_INLINE_READ_LOCK_IRQ is not set
+# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
+CONFIG_INLINE_READ_UNLOCK=y
+# CONFIG_INLINE_READ_UNLOCK_BH is not set
+CONFIG_INLINE_READ_UNLOCK_IRQ=y
+# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_WRITE_TRYLOCK is not set
+# CONFIG_INLINE_WRITE_LOCK is not set
+# CONFIG_INLINE_WRITE_LOCK_BH is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
+CONFIG_INLINE_WRITE_UNLOCK=y
+# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
+CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
+# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
+# CONFIG_MUTEX_SPIN_ON_OWNER is not set
+# CONFIG_FREEZER is not set
+
+#
+# System type
+#
+CONFIG_CPU_SH4=y
+CONFIG_CPU_SH4A=y
+CONFIG_CPU_SHX2=y
+# CONFIG_CPU_SUBTYPE_SH7619 is not set
+# CONFIG_CPU_SUBTYPE_SH7201 is not set
+# CONFIG_CPU_SUBTYPE_SH7203 is not set
+# CONFIG_CPU_SUBTYPE_SH7206 is not set
+# CONFIG_CPU_SUBTYPE_SH7263 is not set
+# CONFIG_CPU_SUBTYPE_MXG is not set
+# CONFIG_CPU_SUBTYPE_SH7705 is not set
+# CONFIG_CPU_SUBTYPE_SH7706 is not set
+# CONFIG_CPU_SUBTYPE_SH7707 is not set
+# CONFIG_CPU_SUBTYPE_SH7708 is not set
+# CONFIG_CPU_SUBTYPE_SH7709 is not set
+# CONFIG_CPU_SUBTYPE_SH7710 is not set
+# CONFIG_CPU_SUBTYPE_SH7712 is not set
+# CONFIG_CPU_SUBTYPE_SH7720 is not set
+# CONFIG_CPU_SUBTYPE_SH7721 is not set
+# CONFIG_CPU_SUBTYPE_SH7750 is not set
+# CONFIG_CPU_SUBTYPE_SH7091 is not set
+# CONFIG_CPU_SUBTYPE_SH7750R is not set
+# CONFIG_CPU_SUBTYPE_SH7750S is not set
+# CONFIG_CPU_SUBTYPE_SH7751 is not set
+# CONFIG_CPU_SUBTYPE_SH7751R is not set
+# CONFIG_CPU_SUBTYPE_SH7760 is not set
+# CONFIG_CPU_SUBTYPE_SH4_202 is not set
+# CONFIG_CPU_SUBTYPE_SH7723 is not set
+# CONFIG_CPU_SUBTYPE_SH7724 is not set
+CONFIG_CPU_SUBTYPE_SH7757=y
+# CONFIG_CPU_SUBTYPE_SH7763 is not set
+# CONFIG_CPU_SUBTYPE_SH7770 is not set
+# CONFIG_CPU_SUBTYPE_SH7780 is not set
+# CONFIG_CPU_SUBTYPE_SH7785 is not set
+# CONFIG_CPU_SUBTYPE_SH7786 is not set
+# CONFIG_CPU_SUBTYPE_SHX3 is not set
+# CONFIG_CPU_SUBTYPE_SH7343 is not set
+# CONFIG_CPU_SUBTYPE_SH7722 is not set
+# CONFIG_CPU_SUBTYPE_SH7366 is not set
+
+#
+# Memory management options
+#
+CONFIG_QUICKLIST=y
+CONFIG_MMU=y
+CONFIG_PAGE_OFFSET=0x80000000
+CONFIG_FORCE_MAX_ZONEORDER=11
+CONFIG_MEMORY_START=0x40000000
+CONFIG_MEMORY_SIZE=0x0f000000
+# CONFIG_29BIT is not set
+CONFIG_32BIT=y
+CONFIG_PMB=y
+CONFIG_X2TLB=y
+CONFIG_VSYSCALL=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_MAX_ACTIVE_REGIONS=1
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_IOREMAP_FIXED=y
+CONFIG_UNCACHED_MAPPING=y
+CONFIG_PAGE_SIZE_4KB=y
+# CONFIG_PAGE_SIZE_8KB is not set
+# CONFIG_PAGE_SIZE_16KB is not set
+# CONFIG_PAGE_SIZE_64KB is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_SPARSEMEM_STATIC=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_NR_QUICK=1
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+
+#
+# Cache configuration
+#
+CONFIG_CACHE_WRITEBACK=y
+# CONFIG_CACHE_WRITETHROUGH is not set
+# CONFIG_CACHE_OFF is not set
+
+#
+# Processor features
+#
+CONFIG_CPU_LITTLE_ENDIAN=y
+# CONFIG_CPU_BIG_ENDIAN is not set
+CONFIG_SH_FPU=y
+# CONFIG_SH_STORE_QUEUES is not set
+CONFIG_CPU_HAS_INTEVT=y
+CONFIG_CPU_HAS_SR_RB=y
+CONFIG_CPU_HAS_FPU=y
+
+#
+# Board support
+#
+CONFIG_SH_SH7757LCR=y
+
+#
+# Timer and clock configuration
+#
+CONFIG_SH_TIMER_TMU=y
+CONFIG_SH_CLK_CPG=y
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# DMA support
+#
+# CONFIG_SH_DMA is not set
+
+#
+# Companion Chips
+#
+
+#
+# Additional SuperH Device Drivers
+#
+CONFIG_HEARTBEAT=y
+# CONFIG_PUSH_SWITCH is not set
+
+#
+# Kernel features
+#
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+# CONFIG_SCHED_HRTICK is not set
+# CONFIG_KEXEC is not set
+# CONFIG_CRASH_DUMP is not set
+CONFIG_SECCOMP=y
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_GUSA=y
+# CONFIG_INTC_USERIMASK is not set
+
+#
+# Boot options
+#
+CONFIG_ZERO_PAGE_OFFSET=0x00001000
+CONFIG_BOOT_LINK_OFFSET=0x00800000
+CONFIG_ENTRY_OFFSET=0x00001000
+CONFIG_CMDLINE_OVERWRITE=y
+# CONFIG_CMDLINE_EXTEND is not set
+CONFIG_CMDLINE="console=ttySC2,115200 root=/dev/nfs ip=dhcp"
+
+#
+# Bus options
+#
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCCARD is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+# CONFIG_HAVE_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options (EXPERIMENTAL)
+#
+# CONFIG_PM is not set
+# CONFIG_CPU_IDLE is not set
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_XFRM_STATISTICS is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+CONFIG_INET_TUNNEL=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+CONFIG_IPV6=y
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_BEET=y
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=y
+# CONFIG_IPV6_SIT_6RD is not set
+CONFIG_IPV6_NDISC_NODETYPE=y
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_IPV6_MROUTE is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_RDS is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_L2TP is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_PHONET is not set
+# CONFIG_IEEE802154 is not set
+# CONFIG_NET_SCHED is not set
+# CONFIG_DCB is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+# CONFIG_WIRELESS is not set
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+# CONFIG_CAIF is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_DEVTMPFS is not set
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+# CONFIG_MTD is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+
+#
+# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
+#
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+# CONFIG_BLK_DEV_XIP is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_BLK_DEV_HD is not set
+# CONFIG_MISC_DEVICES is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_VETH is not set
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_CICADA_PHY is not set
+CONFIG_VITESSE_PHY=y
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_STE10XP is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+# CONFIG_MICREL_PHY is not set
+# CONFIG_FIXED_PHY is not set
+CONFIG_MDIO_BITBANG=y
+# CONFIG_MDIO_GPIO is not set
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_AX88796 is not set
+# CONFIG_STNIC is not set
+CONFIG_SH_ETH=y
+# CONFIG_SMC91X is not set
+# CONFIG_ETHOC is not set
+# CONFIG_SMC911X is not set
+# CONFIG_SMSC911X is not set
+# CONFIG_DNET is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+# CONFIG_B44 is not set
+# CONFIG_KS8842 is not set
+# CONFIG_KS8851_MLL is not set
+CONFIG_NETDEV_1000=y
+# CONFIG_NETDEV_10000 is not set
+# CONFIG_WLAN is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+# CONFIG_WAN is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
+# CONFIG_INPUT_SPARSEKMAP is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_GPIO is not set
+# CONFIG_KEYBOARD_MATRIX is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_OPENCORES is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_SH_KEYSC is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_MOUSE_GPIO is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_DEVKMEM=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_N_GSM is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=2
+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_SH_SCI=y
+CONFIG_SERIAL_SH_SCI_NR_UARTS=3
+CONFIG_SERIAL_SH_SCI_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_TIMBERDALE is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_RAMOOPS is not set
+# CONFIG_I2C is not set
+# CONFIG_SPI is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+# CONFIG_DEBUG_GPIO is not set
+# CONFIG_GPIO_SYSFS is not set
+
+#
+# Memory mapped GPIO expanders:
+#
+# CONFIG_GPIO_IT8761E is not set
+
+#
+# I2C GPIO expanders:
+#
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+
+#
+# AC97 GPIO expanders:
+#
+
+#
+# MODULbus GPIO expanders:
+#
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+CONFIG_MFD_SUPPORT=y
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_SH_MOBILE_SDHI is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_ABX500_CORE is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_SOUND is not set
+CONFIG_HID_SUPPORT=y
+CONFIG_HID=y
+# CONFIG_HIDRAW is not set
+# CONFIG_HID_PID is not set
+
+#
+# Special HID drivers
+#
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_MMC is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_ACCESSIBILITY is not set
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_CLASS is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+# CONFIG_STAGING is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=y
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+# CONFIG_JOLIET is not set
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+# CONFIG_MSDOS_FS is not set
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+# CONFIG_CONFIGFS_FS is not set
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_LOGFS is not set
+# CONFIG_CRAMFS is not set
+CONFIG_SQUASHFS=y
+# CONFIG_SQUASHFS_XATTRS is not set
+# CONFIG_SQUASHFS_EMBEDDED is not set
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+# CONFIG_VXFS_FS is not set
+CONFIG_MINIX_FS=y
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+CONFIG_ROOT_NFS=y
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CEPH_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+CONFIG_NLS_CODEPAGE_932=y
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+# CONFIG_DLM is not set
+
+#
+# Kernel hacking
+#
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+# CONFIG_DETECT_SOFTLOCKUP is not set
+# CONFIG_DETECT_HUNG_TASK is not set
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_WRITECOUNT is not set
+# CONFIG_DEBUG_MEMORY_INIT is not set
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+# CONFIG_FRAME_POINTER is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+# CONFIG_PAGE_POISONING is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_TRACING_SUPPORT=y
+# CONFIG_FTRACE is not set
+# CONFIG_DMA_API_DEBUG is not set
+# CONFIG_ATOMIC64_SELFTEST is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+# CONFIG_SH_STANDARD_BIOS is not set
+# CONFIG_STACK_DEBUG is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_4KSTACKS is not set
+# CONFIG_DUMP_CODE is not set
+# CONFIG_DWARF_UNWINDER is not set
+# CONFIG_SH_NO_BSS_INIT is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+# CONFIG_DEFAULT_SECURITY_SELINUX is not set
+# CONFIG_DEFAULT_SECURITY_SMACK is not set
+# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+# CONFIG_CRYPTO_MANAGER is not set
+# CONFIG_CRYPTO_MANAGER2 is not set
+# CONFIG_CRYPTO_GF128MUL is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+# CONFIG_CRYPTO_AUTHENC is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Authenticated Encryption with Associated Data
+#
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_SEQIV is not set
+
+#
+# Block modes
+#
+# CONFIG_CRYPTO_CBC is not set
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_CTS is not set
+# CONFIG_CRYPTO_ECB is not set
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_PCBC is not set
+# CONFIG_CRYPTO_XTS is not set
+
+#
+# Hash modes
+#
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_VMAC is not set
+
+#
+# Digest
+#
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_GHASH is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_WP512 is not set
+
+#
+# Ciphers
+#
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+
+#
+# Compression
+#
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_ZLIB is not set
+# CONFIG_CRYPTO_LZO is not set
+
+#
+# Random Number Generation
+#
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+CONFIG_CRYPTO_HW=y
+# CONFIG_VIRTUALIZATION is not set
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_T10DIF is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_HAVE_LMB=y
+CONFIG_NLATTR=y
+CONFIG_GENERIC_ATOMIC64=y
diff --git a/arch/sh/drivers/dma/dma-api.c b/arch/sh/drivers/dma/dma-api.c
index 4a277224a871..f46848f088e4 100644
--- a/arch/sh/drivers/dma/dma-api.c
+++ b/arch/sh/drivers/dma/dma-api.c
@@ -412,8 +412,8 @@ EXPORT_SYMBOL(unregister_dmac);
static int __init dma_api_init(void)
{
printk(KERN_NOTICE "DMA: Registering DMA API.\n");
- create_proc_read_entry("dma", 0, 0, dma_read_proc, 0);
- return 0;
+ return create_proc_read_entry("dma", 0, 0, dma_read_proc, 0)
+ ? 0 : -ENOMEM;
}
subsys_initcall(dma_api_init);
diff --git a/arch/sh/drivers/pci/pci-sh7751.c b/arch/sh/drivers/pci/pci-sh7751.c
index f98141b3b7d7..86adb1e235cd 100644
--- a/arch/sh/drivers/pci/pci-sh7751.c
+++ b/arch/sh/drivers/pci/pci-sh7751.c
@@ -81,7 +81,7 @@ static int __init sh7751_pci_init(void)
unsigned int id;
u32 word, reg;
- printk(KERN_NOTICE "PCI: Starting intialization.\n");
+ printk(KERN_NOTICE "PCI: Starting initialization.\n");
chan->reg_base = 0xfe200000;
diff --git a/arch/sh/drivers/pci/pci-sh7780.c b/arch/sh/drivers/pci/pci-sh7780.c
index ffdcbf10b95e..edb7cca14882 100644
--- a/arch/sh/drivers/pci/pci-sh7780.c
+++ b/arch/sh/drivers/pci/pci-sh7780.c
@@ -246,7 +246,7 @@ static int __init sh7780_pci_init(void)
const char *type;
int ret, i;
- printk(KERN_NOTICE "PCI: Starting intialization.\n");
+ printk(KERN_NOTICE "PCI: Starting initialization.\n");
chan->reg_base = 0xfe040000;
diff --git a/arch/sh/drivers/pci/pcie-sh7786.c b/arch/sh/drivers/pci/pcie-sh7786.c
index 68cb9b0ac9d2..78f378731858 100644
--- a/arch/sh/drivers/pci/pcie-sh7786.c
+++ b/arch/sh/drivers/pci/pcie-sh7786.c
@@ -392,7 +392,7 @@ static int __init sh7786_pcie_init(void)
{
int ret = 0, i;
- printk(KERN_NOTICE "PCI: Starting intialization.\n");
+ printk(KERN_NOTICE "PCI: Starting initialization.\n");
sh7786_pcie_hwops = &sh7786_65nm_pcie_hwops;
diff --git a/arch/sh/include/asm/Kbuild b/arch/sh/include/asm/Kbuild
index 0eed47b236ab..7beb42322f60 100644
--- a/arch/sh/include/asm/Kbuild
+++ b/arch/sh/include/asm/Kbuild
@@ -5,5 +5,7 @@ header-y += cpu-features.h
header-y += hw_breakpoint.h
header-y += posix_types_32.h
header-y += posix_types_64.h
+header-y += ptrace_32.h
+header-y += ptrace_64.h
header-y += unistd_32.h
header-y += unistd_64.h
diff --git a/arch/sh/include/asm/elf.h b/arch/sh/include/asm/elf.h
index ce830faeebbf..f38112be67d2 100644
--- a/arch/sh/include/asm/elf.h
+++ b/arch/sh/include/asm/elf.h
@@ -50,25 +50,14 @@
#define R_SH_GOTPC 167
/* FDPIC relocs */
-#define R_SH_GOT20 70
-#define R_SH_GOTOFF20 71
-#define R_SH_GOTFUNCDESC 72
-#define R_SH_GOTFUNCDESC20 73
-#define R_SH_GOTOFFFUNCDESC 74
-#define R_SH_GOTOFFFUNCDESC20 75
-#define R_SH_FUNCDESC 76
-#define R_SH_FUNCDESC_VALUE 77
-
-#if 0 /* XXX - later .. */
-#define R_SH_GOT20 198
-#define R_SH_GOTOFF20 199
-#define R_SH_GOTFUNCDESC 200
-#define R_SH_GOTFUNCDESC20 201
-#define R_SH_GOTOFFFUNCDESC 202
-#define R_SH_GOTOFFFUNCDESC20 203
-#define R_SH_FUNCDESC 204
-#define R_SH_FUNCDESC_VALUE 205
-#endif
+#define R_SH_GOT20 201
+#define R_SH_GOTOFF20 202
+#define R_SH_GOTFUNCDESC 203
+#define R_SH_GOTFUNCDESC20 204
+#define R_SH_GOTOFFFUNCDESC 205
+#define R_SH_GOTOFFFUNCDESC20 206
+#define R_SH_FUNCDESC 207
+#define R_SH_FUNCDESC_VALUE 208
/* SHmedia relocs */
#define R_SH_IMM_LOW16 246
diff --git a/arch/sh/include/asm/fixmap.h b/arch/sh/include/asm/fixmap.h
index 6e7cea453895..bd7e79a12653 100644
--- a/arch/sh/include/asm/fixmap.h
+++ b/arch/sh/include/asm/fixmap.h
@@ -58,7 +58,7 @@ enum fixed_addresses {
#ifdef CONFIG_HIGHMEM
FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
- FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
+ FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * NR_CPUS) - 1,
#endif
#ifdef CONFIG_IOREMAP_FIXED
@@ -69,7 +69,7 @@ enum fixed_addresses {
*/
#define FIX_N_IOREMAPS 32
FIX_IOREMAP_BEGIN,
- FIX_IOREMAP_END = FIX_IOREMAP_BEGIN + FIX_N_IOREMAPS,
+ FIX_IOREMAP_END = FIX_IOREMAP_BEGIN + FIX_N_IOREMAPS - 1,
#endif
__end_of_fixed_addresses
diff --git a/arch/sh/include/asm/irq.h b/arch/sh/include/asm/irq.h
index 02c2f0102cfa..45d08b6a5ef7 100644
--- a/arch/sh/include/asm/irq.h
+++ b/arch/sh/include/asm/irq.h
@@ -9,7 +9,7 @@
* advised to cap this at the hard limit that they're interested in
* through the machvec.
*/
-#define NR_IRQS 256
+#define NR_IRQS 512
#define NR_IRQS_LEGACY 8 /* Legacy external IRQ0-7 */
/*
diff --git a/arch/sh/include/asm/kprobes.h b/arch/sh/include/asm/kprobes.h
index 036c3311233c..134f3980e44a 100644
--- a/arch/sh/include/asm/kprobes.h
+++ b/arch/sh/include/asm/kprobes.h
@@ -16,7 +16,6 @@ typedef insn_size_t kprobe_opcode_t;
? (MAX_STACK_SIZE) \
: (((unsigned long)current_thread_info()) + THREAD_SIZE - (ADDR)))
-#define regs_return_value(_regs) ((_regs)->regs[0])
#define flush_insn_slot(p) do { } while (0)
#define kretprobe_blacklist_size 0
diff --git a/arch/sh/include/asm/processor_32.h b/arch/sh/include/asm/processor_32.h
index 61a445d2d02a..46d5179c9f49 100644
--- a/arch/sh/include/asm/processor_32.h
+++ b/arch/sh/include/asm/processor_32.h
@@ -13,7 +13,6 @@
#include <linux/linkage.h>
#include <asm/page.h>
#include <asm/types.h>
-#include <asm/ptrace.h>
#include <asm/hw_breakpoint.h>
/*
@@ -194,8 +193,6 @@ extern unsigned long get_wchan(struct task_struct *p);
#define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc)
#define KSTK_ESP(tsk) (task_pt_regs(tsk)->regs[15])
-#define user_stack_pointer(_regs) ((_regs)->regs[15])
-
#if defined(CONFIG_CPU_SH2A) || defined(CONFIG_CPU_SH4)
#define PREFETCH_STRIDE L1_CACHE_BYTES
#define ARCH_HAS_PREFETCH
diff --git a/arch/sh/include/asm/processor_64.h b/arch/sh/include/asm/processor_64.h
index 621bc4618c6b..2a541ddb5a1b 100644
--- a/arch/sh/include/asm/processor_64.h
+++ b/arch/sh/include/asm/processor_64.h
@@ -17,7 +17,6 @@
#include <linux/compiler.h>
#include <asm/page.h>
#include <asm/types.h>
-#include <asm/ptrace.h>
#include <cpu/registers.h>
/*
@@ -231,7 +230,5 @@ extern unsigned long get_wchan(struct task_struct *p);
#define KSTK_EIP(tsk) ((tsk)->thread.pc)
#define KSTK_ESP(tsk) ((tsk)->thread.sp)
-#define user_stack_pointer(_regs) ((_regs)->regs[15])
-
#endif /* __ASSEMBLY__ */
#endif /* __ASM_SH_PROCESSOR_64_H */
diff --git a/arch/sh/include/asm/ptrace.h b/arch/sh/include/asm/ptrace.h
index 2168fde25611..f6edc10aa0d3 100644
--- a/arch/sh/include/asm/ptrace.h
+++ b/arch/sh/include/asm/ptrace.h
@@ -3,90 +3,7 @@
/*
* Copyright (C) 1999, 2000 Niibe Yutaka
- *
- */
-#if defined(__SH5__)
-struct pt_regs {
- unsigned long long pc;
- unsigned long long sr;
- long long syscall_nr;
- unsigned long long regs[63];
- unsigned long long tregs[8];
- unsigned long long pad[2];
-};
-#else
-/*
- * GCC defines register number like this:
- * -----------------------------
- * 0 - 15 are integer registers
- * 17 - 22 are control/special registers
- * 24 - 39 fp registers
- * 40 - 47 xd registers
- * 48 - fpscr register
- * -----------------------------
- *
- * We follows above, except:
- * 16 --- program counter (PC)
- * 22 --- syscall #
- * 23 --- floating point communication register
*/
-#define REG_REG0 0
-#define REG_REG15 15
-
-#define REG_PC 16
-
-#define REG_PR 17
-#define REG_SR 18
-#define REG_GBR 19
-#define REG_MACH 20
-#define REG_MACL 21
-
-#define REG_SYSCALL 22
-
-#define REG_FPREG0 23
-#define REG_FPREG15 38
-#define REG_XFREG0 39
-#define REG_XFREG15 54
-
-#define REG_FPSCR 55
-#define REG_FPUL 56
-
-/*
- * This struct defines the way the registers are stored on the
- * kernel stack during a system call or other kernel entry.
- */
-struct pt_regs {
- unsigned long regs[16];
- unsigned long pc;
- unsigned long pr;
- unsigned long sr;
- unsigned long gbr;
- unsigned long mach;
- unsigned long macl;
- long tra;
-};
-
-/*
- * This struct defines the way the DSP registers are stored on the
- * kernel stack during a system call or other kernel entry.
- */
-struct pt_dspregs {
- unsigned long a1;
- unsigned long a0g;
- unsigned long a1g;
- unsigned long m0;
- unsigned long m1;
- unsigned long a0;
- unsigned long x0;
- unsigned long x1;
- unsigned long y0;
- unsigned long y1;
- unsigned long dsr;
- unsigned long rs;
- unsigned long re;
- unsigned long mod;
-};
-#endif
#define PTRACE_GETREGS 12 /* General registers */
#define PTRACE_SETREGS 13
@@ -107,22 +24,102 @@ struct pt_dspregs {
#define PT_DATA_ADDR 248 /* &(struct user)->start_data */
#define PT_TEXT_LEN 252
+#if defined(__SH5__) || defined(CONFIG_CPU_SH5)
+#include "ptrace_64.h"
+#else
+#include "ptrace_32.h"
+#endif
+
#ifdef __KERNEL__
+
+#include <linux/stringify.h>
+#include <linux/stddef.h>
+#include <linux/thread_info.h>
#include <asm/addrspace.h>
#include <asm/page.h>
#include <asm/system.h>
#define user_mode(regs) (((regs)->sr & 0x40000000)==0)
+#define user_stack_pointer(regs) ((unsigned long)(regs)->regs[15])
+#define kernel_stack_pointer(regs) ((unsigned long)(regs)->regs[15])
#define instruction_pointer(regs) ((unsigned long)(regs)->pc)
extern void show_regs(struct pt_regs *);
+#define arch_has_single_step() (1)
+
/*
- * These are defined as per linux/ptrace.h.
+ * kprobe-based event tracer support
*/
-struct task_struct;
+struct pt_regs_offset {
+ const char *name;
+ int offset;
+};
-#define arch_has_single_step() (1)
+#define REG_OFFSET_NAME(r) {.name = #r, .offset = offsetof(struct pt_regs, r)}
+#define REGS_OFFSET_NAME(num) \
+ {.name = __stringify(r##num), .offset = offsetof(struct pt_regs, regs[num])}
+#define TREGS_OFFSET_NAME(num) \
+ {.name = __stringify(tr##num), .offset = offsetof(struct pt_regs, tregs[num])}
+#define REG_OFFSET_END {.name = NULL, .offset = 0}
+
+/* Query offset/name of register from its name/offset */
+extern int regs_query_register_offset(const char *name);
+extern const char *regs_query_register_name(unsigned int offset);
+
+extern const struct pt_regs_offset regoffset_table[];
+
+/**
+ * regs_get_register() - get register value from its offset
+ * @regs: pt_regs from which register value is gotten.
+ * @offset: offset number of the register.
+ *
+ * regs_get_register returns the value of a register. The @offset is the
+ * offset of the register in struct pt_regs address which specified by @regs.
+ * If @offset is bigger than MAX_REG_OFFSET, this returns 0.
+ */
+static inline unsigned long regs_get_register(struct pt_regs *regs,
+ unsigned int offset)
+{
+ if (unlikely(offset > MAX_REG_OFFSET))
+ return 0;
+ return *(unsigned long *)((unsigned long)regs + offset);
+}
+
+/**
+ * regs_within_kernel_stack() - check the address in the stack
+ * @regs: pt_regs which contains kernel stack pointer.
+ * @addr: address which is checked.
+ *
+ * regs_within_kernel_stack() checks @addr is within the kernel stack page(s).
+ * If @addr is within the kernel stack, it returns true. If not, returns false.
+ */
+static inline int regs_within_kernel_stack(struct pt_regs *regs,
+ unsigned long addr)
+{
+ return ((addr & ~(THREAD_SIZE - 1)) ==
+ (kernel_stack_pointer(regs) & ~(THREAD_SIZE - 1)));
+}
+
+/**
+ * regs_get_kernel_stack_nth() - get Nth entry of the stack
+ * @regs: pt_regs which contains kernel stack pointer.
+ * @n: stack entry number.
+ *
+ * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which
+ * is specified by @regs. If the @n th entry is NOT in the kernel stack,
+ * this returns 0.
+ */
+static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
+ unsigned int n)
+{
+ unsigned long *addr = (unsigned long *)kernel_stack_pointer(regs);
+ addr += n;
+ if (regs_within_kernel_stack(regs, (unsigned long)addr))
+ return *addr;
+ else
+ return 0;
+}
struct perf_event;
struct perf_sample_data;
diff --git a/arch/sh/include/asm/ptrace_32.h b/arch/sh/include/asm/ptrace_32.h
new file mode 100644
index 000000000000..35d9e257558c
--- /dev/null
+++ b/arch/sh/include/asm/ptrace_32.h
@@ -0,0 +1,83 @@
+#ifndef __ASM_SH_PTRACE_32_H
+#define __ASM_SH_PTRACE_32_H
+
+/*
+ * GCC defines register number like this:
+ * -----------------------------
+ * 0 - 15 are integer registers
+ * 17 - 22 are control/special registers
+ * 24 - 39 fp registers
+ * 40 - 47 xd registers
+ * 48 - fpscr register
+ * -----------------------------
+ *
+ * We follows above, except:
+ * 16 --- program counter (PC)
+ * 22 --- syscall #
+ * 23 --- floating point communication register
+ */
+#define REG_REG0 0
+#define REG_REG15 15
+
+#define REG_PC 16
+
+#define REG_PR 17
+#define REG_SR 18
+#define REG_GBR 19
+#define REG_MACH 20
+#define REG_MACL 21
+
+#define REG_SYSCALL 22
+
+#define REG_FPREG0 23
+#define REG_FPREG15 38
+#define REG_XFREG0 39
+#define REG_XFREG15 54
+
+#define REG_FPSCR 55
+#define REG_FPUL 56
+
+/*
+ * This struct defines the way the registers are stored on the
+ * kernel stack during a system call or other kernel entry.
+ */
+struct pt_regs {
+ unsigned long regs[16];
+ unsigned long pc;
+ unsigned long pr;
+ unsigned long sr;
+ unsigned long gbr;
+ unsigned long mach;
+ unsigned long macl;
+ long tra;
+};
+
+/*
+ * This struct defines the way the DSP registers are stored on the
+ * kernel stack during a system call or other kernel entry.
+ */
+struct pt_dspregs {
+ unsigned long a1;
+ unsigned long a0g;
+ unsigned long a1g;
+ unsigned long m0;
+ unsigned long m1;
+ unsigned long a0;
+ unsigned long x0;
+ unsigned long x1;
+ unsigned long y0;
+ unsigned long y1;
+ unsigned long dsr;
+ unsigned long rs;
+ unsigned long re;
+ unsigned long mod;
+};
+
+#ifdef __KERNEL__
+
+#define MAX_REG_OFFSET offsetof(struct pt_regs, tra)
+#define regs_return_value(regs) ((regs)->regs[0])
+
+#endif /* __KERNEL__ */
+
+#endif /* __ASM_SH_PTRACE_32_H */
diff --git a/arch/sh/include/asm/ptrace_64.h b/arch/sh/include/asm/ptrace_64.h
new file mode 100644
index 000000000000..d43c1cb0bbe7
--- /dev/null
+++ b/arch/sh/include/asm/ptrace_64.h
@@ -0,0 +1,20 @@
+#ifndef __ASM_SH_PTRACE_64_H
+#define __ASM_SH_PTRACE_64_H
+
+struct pt_regs {
+ unsigned long long pc;
+ unsigned long long sr;
+ long long syscall_nr;
+ unsigned long long regs[63];
+ unsigned long long tregs[8];
+ unsigned long long pad[2];
+};
+
+#ifdef __KERNEL__
+
+#define MAX_REG_OFFSET offsetof(struct pt_regs, tregs[7])
+#define regs_return_value(regs) ((regs)->regs[3])
+
+#endif /* __KERNEL__ */
+
+#endif /* __ASM_SH_PTRACE_64_H */
diff --git a/arch/sh/include/asm/system_32.h b/arch/sh/include/asm/system_32.h
index 51296b36770e..9bd2684f908e 100644
--- a/arch/sh/include/asm/system_32.h
+++ b/arch/sh/include/asm/system_32.h
@@ -216,13 +216,12 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs,
static inline void trigger_address_error(void)
{
- if (__in_29bit_mode())
- __asm__ __volatile__ (
- "ldc %0, sr\n\t"
- "mov.l @%1, %0"
- :
- : "r" (0x10000000), "r" (0x80000001)
- );
+ __asm__ __volatile__ (
+ "ldc %0, sr\n\t"
+ "mov.l @%1, %0"
+ :
+ : "r" (0x10000000), "r" (0x80000001)
+ );
}
asmlinkage void do_address_error(struct pt_regs *regs,
diff --git a/arch/sh/include/asm/tlbflush.h b/arch/sh/include/asm/tlbflush.h
index e0ac97221ae6..0df66f0c7284 100644
--- a/arch/sh/include/asm/tlbflush.h
+++ b/arch/sh/include/asm/tlbflush.h
@@ -21,6 +21,8 @@ extern void local_flush_tlb_kernel_range(unsigned long start,
unsigned long end);
extern void local_flush_tlb_one(unsigned long asid, unsigned long page);
+extern void __flush_tlb_global(void);
+
#ifdef CONFIG_SMP
extern void flush_tlb_all(void);
diff --git a/arch/sh/include/asm/unistd_32.h b/arch/sh/include/asm/unistd_32.h
index 0e7f0fc8f086..01183add5687 100644
--- a/arch/sh/include/asm/unistd_32.h
+++ b/arch/sh/include/asm/unistd_32.h
@@ -345,8 +345,11 @@
#define __NR_pwritev 334
#define __NR_rt_tgsigqueueinfo 335
#define __NR_perf_event_open 336
+#define __NR_fanotify_init 337
+#define __NR_fanotify_mark 338
+#define __NR_prlimit64 339
-#define NR_syscalls 337
+#define NR_syscalls 340
#ifdef __KERNEL__
diff --git a/arch/sh/include/asm/unistd_64.h b/arch/sh/include/asm/unistd_64.h
index 0580c33a1e04..09aa93f9eb70 100644
--- a/arch/sh/include/asm/unistd_64.h
+++ b/arch/sh/include/asm/unistd_64.h
@@ -387,10 +387,13 @@
#define __NR_perf_event_open 364
#define __NR_recvmmsg 365
#define __NR_accept4 366
+#define __NR_fanotify_init 367
+#define __NR_fanotify_mark 368
+#define __NR_prlimit64 369
#ifdef __KERNEL__
-#define NR_syscalls 367
+#define NR_syscalls 370
#define __ARCH_WANT_IPC_PARSE_VERSION
#define __ARCH_WANT_OLD_READDIR
diff --git a/arch/sh/include/cpu-sh4/cpu/sh7757.h b/arch/sh/include/cpu-sh4/cpu/sh7757.h
index f4d267efad71..15f3de11c55a 100644
--- a/arch/sh/include/cpu-sh4/cpu/sh7757.h
+++ b/arch/sh/include/cpu-sh4/cpu/sh7757.h
@@ -3,241 +3,252 @@
enum {
/* PTA */
- GPIO_PTA7, GPIO_PTA6, GPIO_PTA5, GPIO_PTA4,
- GPIO_PTA3, GPIO_PTA2, GPIO_PTA1, GPIO_PTA0,
+ GPIO_PTA0, GPIO_PTA1, GPIO_PTA2, GPIO_PTA3,
+ GPIO_PTA4, GPIO_PTA5, GPIO_PTA6, GPIO_PTA7,
/* PTB */
- GPIO_PTB7, GPIO_PTB6, GPIO_PTB5, GPIO_PTB4,
- GPIO_PTB3, GPIO_PTB2, GPIO_PTB1, GPIO_PTB0,
+ GPIO_PTB0, GPIO_PTB1, GPIO_PTB2, GPIO_PTB3,
+ GPIO_PTB4, GPIO_PTB5, GPIO_PTB6, GPIO_PTB7,
/* PTC */
- GPIO_PTC7, GPIO_PTC6, GPIO_PTC5, GPIO_PTC4,
- GPIO_PTC3, GPIO_PTC2, GPIO_PTC1, GPIO_PTC0,
+ GPIO_PTC0, GPIO_PTC1, GPIO_PTC2, GPIO_PTC3,
+ GPIO_PTC4, GPIO_PTC5, GPIO_PTC6, GPIO_PTC7,
/* PTD */
- GPIO_PTD7, GPIO_PTD6, GPIO_PTD5, GPIO_PTD4,
- GPIO_PTD3, GPIO_PTD2, GPIO_PTD1, GPIO_PTD0,
+ GPIO_PTD0, GPIO_PTD1, GPIO_PTD2, GPIO_PTD3,
+ GPIO_PTD4, GPIO_PTD5, GPIO_PTD6, GPIO_PTD7,
/* PTE */
- GPIO_PTE7, GPIO_PTE6, GPIO_PTE5, GPIO_PTE4,
- GPIO_PTE3, GPIO_PTE2, GPIO_PTE1, GPIO_PTE0,
+ GPIO_PTE0, GPIO_PTE1, GPIO_PTE2, GPIO_PTE3,
+ GPIO_PTE4, GPIO_PTE5, GPIO_PTE6, GPIO_PTE7,
/* PTF */
- GPIO_PTF7, GPIO_PTF6, GPIO_PTF5, GPIO_PTF4,
- GPIO_PTF3, GPIO_PTF2, GPIO_PTF1, GPIO_PTF0,
+ GPIO_PTF0, GPIO_PTF1, GPIO_PTF2, GPIO_PTF3,
+ GPIO_PTF4, GPIO_PTF5, GPIO_PTF6, GPIO_PTF7,
/* PTG */
- GPIO_PTG7, GPIO_PTG6, GPIO_PTG5, GPIO_PTG4,
- GPIO_PTG3, GPIO_PTG2, GPIO_PTG1, GPIO_PTG0,
+ GPIO_PTG0, GPIO_PTG1, GPIO_PTG2, GPIO_PTG3,
+ GPIO_PTG4, GPIO_PTG5, GPIO_PTG6, GPIO_PTG7,
/* PTH */
- GPIO_PTH7, GPIO_PTH6, GPIO_PTH5, GPIO_PTH4,
- GPIO_PTH3, GPIO_PTH2, GPIO_PTH1, GPIO_PTH0,
+ GPIO_PTH0, GPIO_PTH1, GPIO_PTH2, GPIO_PTH3,
+ GPIO_PTH4, GPIO_PTH5, GPIO_PTH6, GPIO_PTH7,
/* PTI */
- GPIO_PTI7, GPIO_PTI6, GPIO_PTI5, GPIO_PTI4,
- GPIO_PTI3, GPIO_PTI2, GPIO_PTI1, GPIO_PTI0,
+ GPIO_PTI0, GPIO_PTI1, GPIO_PTI2, GPIO_PTI3,
+ GPIO_PTI4, GPIO_PTI5, GPIO_PTI6, GPIO_PTI7,
/* PTJ */
- GPIO_PTJ7, GPIO_PTJ6, GPIO_PTJ5, GPIO_PTJ4,
- GPIO_PTJ3, GPIO_PTJ2, GPIO_PTJ1, GPIO_PTJ0,
+ GPIO_PTJ0, GPIO_PTJ1, GPIO_PTJ2, GPIO_PTJ3,
+ GPIO_PTJ4, GPIO_PTJ5, GPIO_PTJ6, GPIO_PTJ7_RESV,
/* PTK */
- GPIO_PTK7, GPIO_PTK6, GPIO_PTK5, GPIO_PTK4,
- GPIO_PTK3, GPIO_PTK2, GPIO_PTK1, GPIO_PTK0,
+ GPIO_PTK0, GPIO_PTK1, GPIO_PTK2, GPIO_PTK3,
+ GPIO_PTK4, GPIO_PTK5, GPIO_PTK6, GPIO_PTK7,
/* PTL */
- GPIO_PTL7, GPIO_PTL6, GPIO_PTL5, GPIO_PTL4,
- GPIO_PTL3, GPIO_PTL2, GPIO_PTL1, GPIO_PTL0,
+ GPIO_PTL0, GPIO_PTL1, GPIO_PTL2, GPIO_PTL3,
+ GPIO_PTL4, GPIO_PTL5, GPIO_PTL6, GPIO_PTL7_RESV,
/* PTM */
- GPIO_PTM6, GPIO_PTM5, GPIO_PTM4,
- GPIO_PTM3, GPIO_PTM2, GPIO_PTM1, GPIO_PTM0,
+ GPIO_PTM0, GPIO_PTM1, GPIO_PTM2, GPIO_PTM3,
+ GPIO_PTM4, GPIO_PTM5, GPIO_PTM6, GPIO_PTM7,
/* PTN */
- GPIO_PTN7, GPIO_PTN6, GPIO_PTN5, GPIO_PTN4,
- GPIO_PTN3, GPIO_PTN2, GPIO_PTN1, GPIO_PTN0,
+ GPIO_PTN0, GPIO_PTN1, GPIO_PTN2, GPIO_PTN3,
+ GPIO_PTN4, GPIO_PTN5, GPIO_PTN6, GPIO_PTN7_RESV,
/* PTO */
- GPIO_PTO7, GPIO_PTO6, GPIO_PTO5, GPIO_PTO4,
- GPIO_PTO3, GPIO_PTO2, GPIO_PTO1, GPIO_PTO0,
+ GPIO_PTO0, GPIO_PTO1, GPIO_PTO2, GPIO_PTO3,
+ GPIO_PTO4, GPIO_PTO5, GPIO_PTO6, GPIO_PTO7,
/* PTP */
- GPIO_PTP6, GPIO_PTP5, GPIO_PTP4,
- GPIO_PTP3, GPIO_PTP2, GPIO_PTP1, GPIO_PTP0,
+ GPIO_PTP0, GPIO_PTP1, GPIO_PTP2, GPIO_PTP3,
+ GPIO_PTP4, GPIO_PTP5, GPIO_PTP6, GPIO_PTP7,
/* PTQ */
- GPIO_PTQ6, GPIO_PTQ5, GPIO_PTQ4,
- GPIO_PTQ3, GPIO_PTQ2, GPIO_PTQ1, GPIO_PTQ0,
+ GPIO_PTQ0, GPIO_PTQ1, GPIO_PTQ2, GPIO_PTQ3,
+ GPIO_PTQ4, GPIO_PTQ5, GPIO_PTQ6, GPIO_PTQ7_RESV,
/* PTR */
- GPIO_PTR7, GPIO_PTR6, GPIO_PTR5, GPIO_PTR4,
- GPIO_PTR3, GPIO_PTR2, GPIO_PTR1, GPIO_PTR0,
+ GPIO_PTR0, GPIO_PTR1, GPIO_PTR2, GPIO_PTR3,
+ GPIO_PTR4, GPIO_PTR5, GPIO_PTR6, GPIO_PTR7,
/* PTS */
- GPIO_PTS7, GPIO_PTS6, GPIO_PTS5, GPIO_PTS4,
- GPIO_PTS3, GPIO_PTS2, GPIO_PTS1, GPIO_PTS0,
+ GPIO_PTS0, GPIO_PTS1, GPIO_PTS2, GPIO_PTS3,
+ GPIO_PTS4, GPIO_PTS5, GPIO_PTS6, GPIO_PTS7,
/* PTT */
- GPIO_PTT5, GPIO_PTT4,
- GPIO_PTT3, GPIO_PTT2, GPIO_PTT1, GPIO_PTT0,
+ GPIO_PTT0, GPIO_PTT1, GPIO_PTT2, GPIO_PTT3,
+ GPIO_PTT4, GPIO_PTT5, GPIO_PTT6, GPIO_PTT7,
/* PTU */
- GPIO_PTU7, GPIO_PTU6, GPIO_PTU5, GPIO_PTU4,
- GPIO_PTU3, GPIO_PTU2, GPIO_PTU1, GPIO_PTU0,
+ GPIO_PTU0, GPIO_PTU1, GPIO_PTU2, GPIO_PTU3,
+ GPIO_PTU4, GPIO_PTU5, GPIO_PTU6, GPIO_PTU7,
/* PTV */
- GPIO_PTV7, GPIO_PTV6, GPIO_PTV5, GPIO_PTV4,
- GPIO_PTV3, GPIO_PTV2, GPIO_PTV1, GPIO_PTV0,
+ GPIO_PTV0, GPIO_PTV1, GPIO_PTV2, GPIO_PTV3,
+ GPIO_PTV4, GPIO_PTV5, GPIO_PTV6, GPIO_PTV7,
/* PTW */
- GPIO_PTW7, GPIO_PTW6, GPIO_PTW5, GPIO_PTW4,
- GPIO_PTW3, GPIO_PTW2, GPIO_PTW1, GPIO_PTW0,
+ GPIO_PTW0, GPIO_PTW1, GPIO_PTW2, GPIO_PTW3,
+ GPIO_PTW4, GPIO_PTW5, GPIO_PTW6, GPIO_PTW7,
/* PTX */
- GPIO_PTX7, GPIO_PTX6, GPIO_PTX5, GPIO_PTX4,
- GPIO_PTX3, GPIO_PTX2, GPIO_PTX1, GPIO_PTX0,
+ GPIO_PTX0, GPIO_PTX1, GPIO_PTX2, GPIO_PTX3,
+ GPIO_PTX4, GPIO_PTX5, GPIO_PTX6, GPIO_PTX7,
/* PTY */
- GPIO_PTY7, GPIO_PTY6, GPIO_PTY5, GPIO_PTY4,
- GPIO_PTY3, GPIO_PTY2, GPIO_PTY1, GPIO_PTY0,
+ GPIO_PTY0, GPIO_PTY1, GPIO_PTY2, GPIO_PTY3,
+ GPIO_PTY4, GPIO_PTY5, GPIO_PTY6, GPIO_PTY7,
/* PTZ */
- GPIO_PTZ7, GPIO_PTZ6, GPIO_PTZ5, GPIO_PTZ4,
- GPIO_PTZ3, GPIO_PTZ2, GPIO_PTZ1, GPIO_PTZ0,
+ GPIO_PTZ0, GPIO_PTZ1, GPIO_PTZ2, GPIO_PTZ3,
+ GPIO_PTZ4, GPIO_PTZ5, GPIO_PTZ6, GPIO_PTZ7,
- /* PTA (mobule: LBSC, CPG, LPC) */
+ /* PTA (mobule: LBSC, RGMII) */
GPIO_FN_BS, GPIO_FN_RDWR, GPIO_FN_WE1, GPIO_FN_RDY,
- GPIO_FN_MD10, GPIO_FN_MD9, GPIO_FN_MD8,
- GPIO_FN_LGPIO7, GPIO_FN_LGPIO6, GPIO_FN_LGPIO5, GPIO_FN_LGPIO4,
- GPIO_FN_LGPIO3, GPIO_FN_LGPIO2, GPIO_FN_LGPIO1, GPIO_FN_LGPIO0,
-
- /* PTB (mobule: LBSC, EtherC, SIM, LPC) */
- GPIO_FN_D15, GPIO_FN_D14, GPIO_FN_D13, GPIO_FN_D12,
- GPIO_FN_D11, GPIO_FN_D10, GPIO_FN_D9, GPIO_FN_D8,
- GPIO_FN_ET0_MDC, GPIO_FN_ET0_MDIO,
- GPIO_FN_ET1_MDC, GPIO_FN_ET1_MDIO,
- GPIO_FN_SIM_D, GPIO_FN_SIM_CLK, GPIO_FN_SIM_RST,
- GPIO_FN_WPSZ1, GPIO_FN_WPSZ0, GPIO_FN_FWID, GPIO_FN_FLSHSZ,
- GPIO_FN_LPC_SPIEN, GPIO_FN_BASEL,
+ GPIO_FN_ET0_MDC, GPIO_FN_ET0_MDIO,
+ GPIO_FN_ET1_MDC, GPIO_FN_ET1_MDIO,
- /* PTC (mobule: SD) */
- GPIO_FN_SD_WP, GPIO_FN_SD_CD, GPIO_FN_SD_CLK, GPIO_FN_SD_CMD,
- GPIO_FN_SD_D3, GPIO_FN_SD_D2, GPIO_FN_SD_D1, GPIO_FN_SD_D0,
+ /* PTB (mobule: INTC, ONFI, TMU) */
+ GPIO_FN_IRQ15, GPIO_FN_IRQ14, GPIO_FN_IRQ13, GPIO_FN_IRQ12,
+ GPIO_FN_IRQ11, GPIO_FN_IRQ10, GPIO_FN_IRQ9, GPIO_FN_IRQ8,
+ GPIO_FN_ON_NRE, GPIO_FN_ON_NWE, GPIO_FN_ON_NWP, GPIO_FN_ON_NCE0,
+ GPIO_FN_ON_R_B0, GPIO_FN_ON_ALE, GPIO_FN_ON_CLE,
+ GPIO_FN_TCLK,
- /* PTD (mobule: INTC, SPI0, LBSC, CPG, ADC) */
+ /* PTC (mobule: IRQ, PWMU) */
GPIO_FN_IRQ7, GPIO_FN_IRQ6, GPIO_FN_IRQ5, GPIO_FN_IRQ4,
GPIO_FN_IRQ3, GPIO_FN_IRQ2, GPIO_FN_IRQ1, GPIO_FN_IRQ0,
- GPIO_FN_MD6, GPIO_FN_MD5, GPIO_FN_MD3, GPIO_FN_MD2,
- GPIO_FN_MD1, GPIO_FN_MD0, GPIO_FN_ADTRG1, GPIO_FN_ADTRG0,
-
- /* PTE (mobule: EtherC) */
- GPIO_FN_ET0_CRS_DV, GPIO_FN_ET0_TXD1,
- GPIO_FN_ET0_TXD0, GPIO_FN_ET0_TX_EN,
- GPIO_FN_ET0_REF_CLK, GPIO_FN_ET0_RXD1,
- GPIO_FN_ET0_RXD0, GPIO_FN_ET0_RX_ER,
-
- /* PTF (mobule: EtherC) */
- GPIO_FN_ET1_CRS_DV, GPIO_FN_ET1_TXD1,
- GPIO_FN_ET1_TXD0, GPIO_FN_ET1_TX_EN,
- GPIO_FN_ET1_REF_CLK, GPIO_FN_ET1_RXD1,
- GPIO_FN_ET1_RXD0, GPIO_FN_ET1_RX_ER,
-
- /* PTG (mobule: SYSTEM, PWMX, LPC) */
- GPIO_FN_STATUS0, GPIO_FN_STATUS1,
- GPIO_FN_PWX0, GPIO_FN_PWX1, GPIO_FN_PWX2, GPIO_FN_PWX3,
- GPIO_FN_SERIRQ, GPIO_FN_CLKRUN, GPIO_FN_LPCPD, GPIO_FN_LDRQ,
-
- /* PTH (mobule: TMU, SCIF234, SPI1, SPI0) */
- GPIO_FN_TCLK, GPIO_FN_RXD4, GPIO_FN_TXD4,
+ GPIO_FN_PWMU0, GPIO_FN_PWMU1, GPIO_FN_PWMU2, GPIO_FN_PWMU3,
+ GPIO_FN_PWMU4, GPIO_FN_PWMU5,
+
+ /* PTD (mobule: SPI0, DMAC) */
+ GPIO_FN_SP0_MOSI, GPIO_FN_SP0_MISO, GPIO_FN_SP0_SCK,
+ GPIO_FN_SP0_SCK_FB, GPIO_FN_SP0_SS0, GPIO_FN_SP0_SS1,
+ GPIO_FN_SP0_SS2, GPIO_FN_SP0_SS3, GPIO_FN_DREQ0,
+ GPIO_FN_DACK0, GPIO_FN_TEND0,
+
+ /* PTE (mobule: RMII) */
+ GPIO_FN_RMII0_CRS_DV, GPIO_FN_RMII0_TXD1, GPIO_FN_RMII0_TXD0,
+ GPIO_FN_RMII0_TXEN, GPIO_FN_RMII0_REFCLK, GPIO_FN_RMII0_RXD1,
+ GPIO_FN_RMII0_RXD0, GPIO_FN_RMII0_RX_ER,
+
+ /* PTF (mobule: RMII, SerMux) */
+ GPIO_FN_RMII1_CRS_DV, GPIO_FN_RMII1_TXD1, GPIO_FN_RMII1_TXD0,
+ GPIO_FN_RMII1_TXEN, GPIO_FN_RMII1_REFCLK, GPIO_FN_RMII1_RXD1,
+ GPIO_FN_RMII1_RXD0, GPIO_FN_RMII1_RX_ER, GPIO_FN_RAC_RI,
+
+ /* PTG (mobule: system, LBSC, LPC, WDT, LPC, eMMC) */
+ GPIO_FN_BOOTFMS, GPIO_FN_BOOTWP,
+ GPIO_FN_A25, GPIO_FN_A24, GPIO_FN_SERIRQ, GPIO_FN_WDTOVF,
+ GPIO_FN_LPCPD, GPIO_FN_LDRQ, GPIO_FN_MMCCLK, GPIO_FN_MMCCMD,
+
+ /* PTH (mobule: SPI1, LPC, DMAC, ADC) */
GPIO_FN_SP1_MOSI, GPIO_FN_SP1_MISO,
GPIO_FN_SP1_SCK, GPIO_FN_SP1_SCK_FB,
GPIO_FN_SP1_SS0, GPIO_FN_SP1_SS1,
- GPIO_FN_SP0_SS1,
-
- /* PTI (mobule: INTC) */
- GPIO_FN_IRQ15, GPIO_FN_IRQ14, GPIO_FN_IRQ13, GPIO_FN_IRQ12,
- GPIO_FN_IRQ11, GPIO_FN_IRQ10, GPIO_FN_IRQ9, GPIO_FN_IRQ8,
-
- /* PTJ (mobule: SCIF234, SERMUX) */
- GPIO_FN_RXD3, GPIO_FN_TXD3, GPIO_FN_RXD2, GPIO_FN_TXD2,
- GPIO_FN_COM1_TXD, GPIO_FN_COM1_RXD,
- GPIO_FN_COM1_RTS, GPIO_FN_COM1_CTS,
-
- /* PTK (mobule: SERMUX) */
- GPIO_FN_COM2_TXD, GPIO_FN_COM2_RXD,
- GPIO_FN_COM2_RTS, GPIO_FN_COM2_CTS,
- GPIO_FN_COM2_DTR, GPIO_FN_COM2_DSR,
- GPIO_FN_COM2_DCD, GPIO_FN_COM2_RI,
+ GPIO_FN_WP, GPIO_FN_FMS0, GPIO_FN_TEND1, GPIO_FN_DREQ1,
+ GPIO_FN_DACK1, GPIO_FN_ADTRG1, GPIO_FN_ADTRG0,
- /* PTL (mobule: SERMUX) */
- GPIO_FN_RAC_TXD, GPIO_FN_RAC_RXD,
- GPIO_FN_RAC_RTS, GPIO_FN_RAC_CTS,
- GPIO_FN_RAC_DTR, GPIO_FN_RAC_DSR,
- GPIO_FN_RAC_DCD, GPIO_FN_RAC_RI,
+ /* PTI (mobule: LBSC, SDHI) */
+ GPIO_FN_D15, GPIO_FN_D14, GPIO_FN_D13, GPIO_FN_D12,
+ GPIO_FN_D11, GPIO_FN_D10, GPIO_FN_D9, GPIO_FN_D8,
+ GPIO_FN_SD_WP, GPIO_FN_SD_CD, GPIO_FN_SD_CLK, GPIO_FN_SD_CMD,
+ GPIO_FN_SD_D3, GPIO_FN_SD_D2, GPIO_FN_SD_D1, GPIO_FN_SD_D0,
- /* PTM (mobule: IIC, LPC) */
+ /* PTJ (mobule: SCIF234) */
+ GPIO_FN_RTS3, GPIO_FN_CTS3, GPIO_FN_TXD3, GPIO_FN_RXD3,
+ GPIO_FN_RTS4, GPIO_FN_RXD4, GPIO_FN_TXD4,
+
+ /* PTK (mobule: SERMUX, LBSC, SCIF) */
+ GPIO_FN_COM2_TXD, GPIO_FN_COM2_RXD, GPIO_FN_COM2_RTS,
+ GPIO_FN_COM2_CTS, GPIO_FN_COM2_DTR, GPIO_FN_COM2_DSR,
+ GPIO_FN_COM2_DCD, GPIO_FN_CLKOUT,
+ GPIO_FN_SCK2, GPIO_FN_SCK4, GPIO_FN_SCK3,
+
+ /* PTL (mobule: SERMUX, SCIF, LBSC, AUD) */
+ GPIO_FN_RAC_RXD, GPIO_FN_RAC_RTS, GPIO_FN_RAC_CTS,
+ GPIO_FN_RAC_DTR, GPIO_FN_RAC_DSR, GPIO_FN_RAC_DCD,
+ GPIO_FN_RAC_TXD, GPIO_FN_RXD2, GPIO_FN_CS5,
+ GPIO_FN_CS6, GPIO_FN_AUDSYNC, GPIO_FN_AUDCK,
+ GPIO_FN_TXD2,
+
+ /* PTM (mobule: LBSC, IIC) */
+ GPIO_FN_CS4, GPIO_FN_RD, GPIO_FN_WE0, GPIO_FN_CS0,
GPIO_FN_SDA6, GPIO_FN_SCL6, GPIO_FN_SDA7, GPIO_FN_SCL7,
- GPIO_FN_WP, GPIO_FN_FMS0, GPIO_FN_FMS1,
-
- /* PTN (mobule: SCIF234, EVC) */
- GPIO_FN_SCK2, GPIO_FN_RTS4, GPIO_FN_RTS3, GPIO_FN_RTS2,
- GPIO_FN_CTS4, GPIO_FN_CTS3, GPIO_FN_CTS2,
- GPIO_FN_EVENT7, GPIO_FN_EVENT6, GPIO_FN_EVENT5, GPIO_FN_EVENT4,
- GPIO_FN_EVENT3, GPIO_FN_EVENT2, GPIO_FN_EVENT1, GPIO_FN_EVENT0,
- /* PTO (mobule: SGPIO) */
- GPIO_FN_SGPIO0_CLK, GPIO_FN_SGPIO0_LOAD,
- GPIO_FN_SGPIO0_DI, GPIO_FN_SGPIO0_DO,
- GPIO_FN_SGPIO1_CLK, GPIO_FN_SGPIO1_LOAD,
- GPIO_FN_SGPIO1_DI, GPIO_FN_SGPIO1_DO,
+ /* PTN (mobule: USB, JMC, SGPIO, WDT) */
+ GPIO_FN_VBUS_EN, GPIO_FN_VBUS_OC, GPIO_FN_JMCTCK,
+ GPIO_FN_JMCTMS, GPIO_FN_JMCTDO, GPIO_FN_JMCTDI,
+ GPIO_FN_JMCTRST,
+ GPIO_FN_SGPIO1_CLK, GPIO_FN_SGPIO1_LOAD, GPIO_FN_SGPIO1_DI,
+ GPIO_FN_SGPIO1_DO, GPIO_FN_SUB_CLKIN,
- /* PTP (mobule: JMC, SCIF234) */
- GPIO_FN_JMCTCK, GPIO_FN_JMCTMS, GPIO_FN_JMCTDO, GPIO_FN_JMCTDI,
- GPIO_FN_JMCRST, GPIO_FN_SCK4, GPIO_FN_SCK3,
+ /* PTO (mobule: SGPIO, SerMux) */
+ GPIO_FN_SGPIO0_CLK, GPIO_FN_SGPIO0_LOAD, GPIO_FN_SGPIO0_DI,
+ GPIO_FN_SGPIO0_DO, GPIO_FN_SGPIO2_CLK, GPIO_FN_SGPIO2_LOAD,
+ GPIO_FN_SGPIO2_DI, GPIO_FN_SGPIO2_DO, GPIO_FN_COM1_TXD,
+ GPIO_FN_COM1_RXD, GPIO_FN_COM1_RTS, GPIO_FN_COM1_CTS,
/* PTQ (mobule: LPC) */
GPIO_FN_LAD3, GPIO_FN_LAD2, GPIO_FN_LAD1, GPIO_FN_LAD0,
GPIO_FN_LFRAME, GPIO_FN_LRESET, GPIO_FN_LCLK,
/* PTR (mobule: GRA, IIC) */
- GPIO_FN_DDC3, GPIO_FN_DDC2,
- GPIO_FN_SDA8, GPIO_FN_SCL8, GPIO_FN_SDA2, GPIO_FN_SCL2,
+ GPIO_FN_DDC3, GPIO_FN_DDC2, GPIO_FN_SDA2, GPIO_FN_SCL2,
GPIO_FN_SDA1, GPIO_FN_SCL1, GPIO_FN_SDA0, GPIO_FN_SCL0,
+ GPIO_FN_SDA8, GPIO_FN_SCL8,
/* PTS (mobule: GRA, IIC) */
- GPIO_FN_DDC1, GPIO_FN_DDC0,
- GPIO_FN_SDA9, GPIO_FN_SCL9, GPIO_FN_SDA5, GPIO_FN_SCL5,
+ GPIO_FN_DDC1, GPIO_FN_DDC0, GPIO_FN_SDA5, GPIO_FN_SCL5,
GPIO_FN_SDA4, GPIO_FN_SCL4, GPIO_FN_SDA3, GPIO_FN_SCL3,
+ GPIO_FN_SDA9, GPIO_FN_SCL9,
- /* PTT (mobule: SYSTEM, PWMX) */
- GPIO_FN_AUDSYNC, GPIO_FN_AUDCK,
- GPIO_FN_AUDATA3, GPIO_FN_AUDATA2,
- GPIO_FN_AUDATA1, GPIO_FN_AUDATA0,
- GPIO_FN_PWX7, GPIO_FN_PWX6, GPIO_FN_PWX5, GPIO_FN_PWX4,
+ /* PTT (mobule: PWMX, AUD) */
+ GPIO_FN_PWMX7, GPIO_FN_PWMX6, GPIO_FN_PWMX5, GPIO_FN_PWMX4,
+ GPIO_FN_PWMX3, GPIO_FN_PWMX2, GPIO_FN_PWMX1, GPIO_FN_PWMX0,
+ GPIO_FN_AUDATA3, GPIO_FN_AUDATA2, GPIO_FN_AUDATA1,
+ GPIO_FN_AUDATA0, GPIO_FN_STATUS1, GPIO_FN_STATUS0,
- /* PTU (mobule: LBSC, DMAC) */
- GPIO_FN_CS6, GPIO_FN_CS5, GPIO_FN_CS4, GPIO_FN_CS0,
- GPIO_FN_RD, GPIO_FN_WE0, GPIO_FN_A25, GPIO_FN_A24,
- GPIO_FN_DREQ0, GPIO_FN_DACK0,
+ /* PTU (mobule: LPC, APM) */
+ GPIO_FN_LGPIO7, GPIO_FN_LGPIO6, GPIO_FN_LGPIO5, GPIO_FN_LGPIO4,
+ GPIO_FN_LGPIO3, GPIO_FN_LGPIO2, GPIO_FN_LGPIO1, GPIO_FN_LGPIO0,
+ GPIO_FN_APMONCTL_O, GPIO_FN_APMPWBTOUT_O, GPIO_FN_APMSCI_O,
+ GPIO_FN_APMVDDON, GPIO_FN_APMSLPBTN, GPIO_FN_APMPWRBTN,
+ GPIO_FN_APMS5N, GPIO_FN_APMS3N,
- /* PTV (mobule: LBSC, DMAC) */
+ /* PTV (mobule: LBSC, SerMux, R-SPI, EVC, GRA) */
GPIO_FN_A23, GPIO_FN_A22, GPIO_FN_A21, GPIO_FN_A20,
GPIO_FN_A19, GPIO_FN_A18, GPIO_FN_A17, GPIO_FN_A16,
- GPIO_FN_TEND0, GPIO_FN_DREQ1, GPIO_FN_DACK1, GPIO_FN_TEND1,
+ GPIO_FN_COM2_RI, GPIO_FN_R_SPI_MOSI, GPIO_FN_R_SPI_MISO,
+ GPIO_FN_R_SPI_RSPCK, GPIO_FN_R_SPI_SSL0, GPIO_FN_R_SPI_SSL1,
+ GPIO_FN_EVENT7, GPIO_FN_EVENT6, GPIO_FN_VBIOS_DI,
+ GPIO_FN_VBIOS_DO, GPIO_FN_VBIOS_CLK, GPIO_FN_VBIOS_CS,
- /* PTW (mobule: LBSC) */
+ /* PTW (mobule: LBSC, EVC, SCIF) */
GPIO_FN_A15, GPIO_FN_A14, GPIO_FN_A13, GPIO_FN_A12,
GPIO_FN_A11, GPIO_FN_A10, GPIO_FN_A9, GPIO_FN_A8,
+ GPIO_FN_EVENT5, GPIO_FN_EVENT4, GPIO_FN_EVENT3, GPIO_FN_EVENT2,
+ GPIO_FN_EVENT1, GPIO_FN_EVENT0, GPIO_FN_CTS4, GPIO_FN_CTS2,
- /* PTX (mobule: LBSC) */
+ /* PTX (mobule: LBSC, SCIF, SIM) */
GPIO_FN_A7, GPIO_FN_A6, GPIO_FN_A5, GPIO_FN_A4,
GPIO_FN_A3, GPIO_FN_A2, GPIO_FN_A1, GPIO_FN_A0,
+ GPIO_FN_RTS2, GPIO_FN_SIM_D, GPIO_FN_SIM_CLK, GPIO_FN_SIM_RST,
/* PTY (mobule: LBSC) */
GPIO_FN_D7, GPIO_FN_D6, GPIO_FN_D5, GPIO_FN_D4,
GPIO_FN_D3, GPIO_FN_D2, GPIO_FN_D1, GPIO_FN_D0,
+
+ /* PTZ (mobule: eMMC, ONFI) */
+ GPIO_FN_MMCDAT7, GPIO_FN_MMCDAT6, GPIO_FN_MMCDAT5,
+ GPIO_FN_MMCDAT4, GPIO_FN_MMCDAT3, GPIO_FN_MMCDAT2,
+ GPIO_FN_MMCDAT1, GPIO_FN_MMCDAT0,
+ GPIO_FN_ON_DQ7, GPIO_FN_ON_DQ6, GPIO_FN_ON_DQ5, GPIO_FN_ON_DQ4,
+ GPIO_FN_ON_DQ3, GPIO_FN_ON_DQ2, GPIO_FN_ON_DQ1, GPIO_FN_ON_DQ0,
};
#endif /* __ASM_SH7757_H__ */
diff --git a/arch/sh/include/mach-common/mach/sh2007.h b/arch/sh/include/mach-common/mach/sh2007.h
new file mode 100644
index 000000000000..48180b9aa03d
--- /dev/null
+++ b/arch/sh/include/mach-common/mach/sh2007.h
@@ -0,0 +1,117 @@
+#ifndef __MACH_SH2007_H
+#define __MACH_SH2007_H
+
+#define CS5BCR 0xff802050
+#define CS5WCR 0xff802058
+#define CS5PCR 0xff802070
+
+#define BUS_SZ8 1
+#define BUS_SZ16 2
+#define BUS_SZ32 3
+
+#define PCMCIA_IODYN 1
+#define PCMCIA_ATA 0
+#define PCMCIA_IO8 2
+#define PCMCIA_IO16 3
+#define PCMCIA_COMM8 4
+#define PCMCIA_COMM16 5
+#define PCMCIA_ATTR8 6
+#define PCMCIA_ATTR16 7
+
+#define TYPE_SRAM 0
+#define TYPE_PCMCIA 4
+
+/* write-read/write-write delay (0-7:0,1,2,3,4,5,6,7) */
+#define IWW5 0
+#define IWW6 3
+/* different area, read-write delay (0-7:0,1,2,3,4,5,6,7) */
+#define IWRWD5 2
+#define IWRWD6 2
+/* same area, read-write delay (0-7:0,1,2,3,4,5,6,7) */
+#define IWRWS5 2
+#define IWRWS6 2
+/* different area, read-read delay (0-7:0,1,2,3,4,5,6,7) */
+#define IWRRD5 2
+#define IWRRD6 2
+/* same area, read-read delay (0-7:0,1,2,3,4,5,6,7) */
+#define IWRRS5 0
+#define IWRRS6 2
+/* burst count (0-3:4,8,16,32) */
+#define BST5 0
+#define BST6 0
+/* bus size */
+#define SZ5 BUS_SZ16
+#define SZ6 BUS_SZ16
+/* RD hold for SRAM (0-1:0,1) */
+#define RDSPL5 0
+#define RDSPL6 0
+/* Burst pitch (0-7:0,1,2,3,4,5,6,7) */
+#define BW5 0
+#define BW6 0
+/* Multiplex (0-1:0,1) */
+#define MPX5 0
+#define MPX6 0
+/* device type */
+#define TYPE5 TYPE_PCMCIA
+#define TYPE6 TYPE_PCMCIA
+/* address setup before assert CSn for SRAM (0-7:0,1,2,3,4,5,6,7) */
+#define ADS5 0
+#define ADS6 0
+/* address hold after negate CSn for SRAM (0-7:0,1,2,3,4,5,6,7) */
+#define ADH5 0
+#define ADH6 0
+/* CSn assert to RD assert delay for SRAM (0-7:0,1,2,3,4,5,6,7) */
+#define RDS5 0
+#define RDS6 0
+/* RD negate to CSn negate delay for SRAM (0-7:0,1,2,3,4,5,6,7) */
+#define RDH5 0
+#define RDH6 0
+/* CSn assert to WE assert delay for SRAM (0-7:0,1,2,3,4,5,6,7) */
+#define WTS5 0
+#define WTS6 0
+/* WE negate to CSn negate delay for SRAM (0-7:0,1,2,3,4,5,6,7) */
+#define WTH5 0
+#define WTH6 0
+/* BS hold (0-1:1,2) */
+#define BSH5 0
+#define BSH6 0
+/* wait cycle (0-15:0,1,2,3,4,5,6,7,8,9,11,13,15,17,21,25) */
+#define IW5 6 /* 60ns PIO mode 4 */
+#define IW6 15 /* 250ns */
+
+#define SAA5 PCMCIA_IODYN /* IDE area b4000000-b5ffffff */
+#define SAB5 PCMCIA_IODYN /* CF area b6000000-b7ffffff */
+#define PCWA5 0 /* additional wait A (0-3:0,15,30,50) */
+#define PCWB5 0 /* additional wait B (0-3:0,15,30,50) */
+/* wait B (0-15:0,1,2,3,4,5,6,7,8,9,11,13,15,17,21,25) */
+#define PCIW5 12
+/* Address->OE/WE assert delay A (0-7:0,1,2,3,6,9,12,15) */
+#define TEDA5 2
+/* Address->OE/WE assert delay B (0-7:0,1,2,3,6,9,12,15) */
+#define TEDB5 4
+/* OE/WE negate->Address delay A (0-7:0,1,2,3,6,9,12,15) */
+#define TEHA5 2
+/* OE/WE negate->Address delay B (0-7:0,1,2,3,6,9,12,15) */
+#define TEHB5 3
+
+#define CS5BCR_D ((IWW5<<28)|(IWRWD5<<24)|(IWRWS5<<20)| \
+ (IWRRD5<<16)|(IWRRS5<<12)|(BST5<<10)| \
+ (SZ5<<8)|(RDSPL5<<7)|(BW5<<4)|(MPX5<<3)|TYPE5)
+#define CS5WCR_D ((ADS5<<28)|(ADH5<<24)|(RDS5<<20)| \
+ (RDH5<<16)|(WTS5<<12)|(WTH5<<8)|(BSH5<<4)|IW5)
+#define CS5PCR_D ((SAA5<<28)|(SAB5<<24)|(PCWA5<<22)| \
+ (PCWB5<<20)|(PCIW5<<16)|(TEDA5<<12)| \
+ (TEDB5<<8)|(TEHA5<<4)|TEHB5)
+
+#define SMC0_BASE 0xb0800000 /* eth0 */
+#define SMC1_BASE 0xb0900000 /* eth1 */
+#define CF_BASE 0xb6100000 /* Compact Flash (I/O area) */
+#define IDE_BASE 0xb4000000 /* IDE */
+#define PC104_IO_BASE 0xb8000000
+#define PC104_MEM_BASE 0xba000000
+#define SMC_IO_SIZE 0x100
+
+#define CF_OFFSET 0x1f0
+#define IDE_OFFSET 0x170
+
+#endif /* __MACH_SH2007_H */
diff --git a/arch/sh/kernel/Makefile b/arch/sh/kernel/Makefile
index e25f3c69525d..1086ba1abdab 100644
--- a/arch/sh/kernel/Makefile
+++ b/arch/sh/kernel/Makefile
@@ -14,7 +14,7 @@ CFLAGS_REMOVE_return_address.o = -pg
obj-y := clkdev.o debugtraps.o dma-nommu.o dumpstack.o \
idle.o io.o irq.o \
irq_$(BITS).o machvec.o nmi_debug.o process.o \
- process_$(BITS).o ptrace_$(BITS).o \
+ process_$(BITS).o ptrace.o ptrace_$(BITS).o \
reboot.o return_address.o \
setup.o signal_$(BITS).o sys_sh.o sys_sh$(BITS).o \
syscalls_$(BITS).o time.o topology.o traps.o \
diff --git a/arch/sh/kernel/cpu/sh4/probe.c b/arch/sh/kernel/cpu/sh4/probe.c
index d180f16281ed..b93458f33b74 100644
--- a/arch/sh/kernel/cpu/sh4/probe.c
+++ b/arch/sh/kernel/cpu/sh4/probe.c
@@ -150,7 +150,7 @@ void __cpuinit cpu_probe(void)
boot_cpu_data.type = CPU_SH7724;
boot_cpu_data.flags |= CPU_HAS_L2_CACHE;
break;
- case 0x50:
+ case 0x10:
boot_cpu_data.type = CPU_SH7757;
break;
}
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7757.c b/arch/sh/kernel/cpu/sh4a/clock-sh7757.c
index 0a752bd324ac..ce39a2ae8c6c 100644
--- a/arch/sh/kernel/cpu/sh4a/clock-sh7757.c
+++ b/arch/sh/kernel/cpu/sh4a/clock-sh7757.c
@@ -3,7 +3,7 @@
*
* SH7757 support for the clock framework
*
- * Copyright (C) 2009 Renesas Solutions Corp.
+ * Copyright (C) 2009-2010 Renesas Solutions Corp.
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
@@ -16,124 +16,147 @@
#include <asm/clock.h>
#include <asm/freq.h>
-static int ifc_divisors[] = { 2, 1, 4, 1, 1, 8, 1, 1,
- 16, 1, 1, 32, 1, 1, 1, 1 };
-static int sfc_divisors[] = { 2, 1, 4, 1, 1, 8, 1, 1,
- 16, 1, 1, 32, 1, 1, 1, 1 };
-static int bfc_divisors[] = { 2, 1, 4, 1, 1, 8, 1, 1,
- 16, 1, 1, 32, 1, 1, 1, 1 };
-static int p1fc_divisors[] = { 2, 1, 4, 1, 1, 8, 1, 1,
- 16, 1, 1, 32, 1, 1, 1, 1 };
+/*
+ * Default rate for the root input clock, reset this with clk_set_rate()
+ * from the platform code.
+ */
+static struct clk extal_clk = {
+ .rate = 48000000,
+};
-static void master_clk_init(struct clk *clk)
+static unsigned long pll_recalc(struct clk *clk)
{
- clk->rate = CONFIG_SH_PCLK_FREQ * 16;
-}
+ int multiplier;
-static struct clk_ops sh7757_master_clk_ops = {
- .init = master_clk_init,
-};
+ multiplier = test_mode_pin(MODE_PIN0) ? 24 : 16;
-static void module_clk_recalc(struct clk *clk)
-{
- int idx = __raw_readl(FRQCR) & 0x0000000f;
- clk->rate = clk->parent->rate / p1fc_divisors[idx];
+ return clk->parent->rate * multiplier;
}
-static struct clk_ops sh7757_module_clk_ops = {
- .recalc = module_clk_recalc,
+static struct clk_ops pll_clk_ops = {
+ .recalc = pll_recalc,
};
-static void bus_clk_recalc(struct clk *clk)
-{
- int idx = (__raw_readl(FRQCR) >> 8) & 0x0000000f;
- clk->rate = clk->parent->rate / bfc_divisors[idx];
-}
+static struct clk pll_clk = {
+ .ops = &pll_clk_ops,
+ .parent = &extal_clk,
+ .flags = CLK_ENABLE_ON_INIT,
+};
-static struct clk_ops sh7757_bus_clk_ops = {
- .recalc = bus_clk_recalc,
+static struct clk *clks[] = {
+ &extal_clk,
+ &pll_clk,
};
-static void cpu_clk_recalc(struct clk *clk)
-{
- int idx = (__raw_readl(FRQCR) >> 20) & 0x0000000f;
- clk->rate = clk->parent->rate / ifc_divisors[idx];
-}
+static unsigned int div2[] = { 1, 1, 2, 1, 1, 4, 1, 6,
+ 1, 1, 1, 16, 1, 24, 1, 1 };
-static struct clk_ops sh7757_cpu_clk_ops = {
- .recalc = cpu_clk_recalc,
+static struct clk_div_mult_table div4_div_mult_table = {
+ .divisors = div2,
+ .nr_divisors = ARRAY_SIZE(div2),
};
-static struct clk_ops *sh7757_clk_ops[] = {
- &sh7757_master_clk_ops,
- &sh7757_module_clk_ops,
- &sh7757_bus_clk_ops,
- &sh7757_cpu_clk_ops,
+static struct clk_div4_table div4_table = {
+ .div_mult_table = &div4_div_mult_table,
};
-void __init arch_init_clk_ops(struct clk_ops **ops, int idx)
-{
- if (idx < ARRAY_SIZE(sh7757_clk_ops))
- *ops = sh7757_clk_ops[idx];
-}
+enum { DIV4_I, DIV4_SH, DIV4_P, DIV4_NR };
-static void shyway_clk_recalc(struct clk *clk)
-{
- int idx = (__raw_readl(FRQCR) >> 12) & 0x0000000f;
- clk->rate = clk->parent->rate / sfc_divisors[idx];
-}
-
-static struct clk_ops sh7757_shyway_clk_ops = {
- .recalc = shyway_clk_recalc,
-};
+#define DIV4(_bit, _mask, _flags) \
+ SH_CLK_DIV4(&pll_clk, FRQCR, _bit, _mask, _flags)
-static struct clk sh7757_shyway_clk = {
- .flags = CLK_ENABLE_ON_INIT,
- .ops = &sh7757_shyway_clk_ops,
+struct clk div4_clks[DIV4_NR] = {
+ /*
+ * P clock is always enable, because some P clock modules is used
+ * by Host PC.
+ */
+ [DIV4_P] = DIV4(0, 0x2800, CLK_ENABLE_ON_INIT),
+ [DIV4_SH] = DIV4(12, 0x00a0, CLK_ENABLE_ON_INIT),
+ [DIV4_I] = DIV4(20, 0x0004, CLK_ENABLE_ON_INIT),
};
-/*
- * Additional sh7757-specific on-chip clocks that aren't already part of the
- * clock framework
- */
-static struct clk *sh7757_onchip_clocks[] = {
- &sh7757_shyway_clk,
+#define MSTPCR0 0xffc80030
+#define MSTPCR1 0xffc80034
+
+enum { MSTP004, MSTP000, MSTP114, MSTP113, MSTP112,
+ MSTP111, MSTP110, MSTP103, MSTP102,
+ MSTP_NR };
+
+static struct clk mstp_clks[MSTP_NR] = {
+ /* MSTPCR0 */
+ [MSTP004] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 4, 0),
+ [MSTP000] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 0, 0),
+
+ /* MSTPCR1 */
+ [MSTP114] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 14, 0),
+ [MSTP113] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 13, 0),
+ [MSTP112] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 12, 0),
+ [MSTP111] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 11, 0),
+ [MSTP110] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 10, 0),
+ [MSTP103] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 3, 0),
+ [MSTP102] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 2, 0),
};
#define CLKDEV_CON_ID(_id, _clk) { .con_id = _id, .clk = _clk }
static struct clk_lookup lookups[] = {
/* main clocks */
- CLKDEV_CON_ID("shyway_clk", &sh7757_shyway_clk),
+ CLKDEV_CON_ID("extal", &extal_clk),
+ CLKDEV_CON_ID("pll_clk", &pll_clk),
+
+ /* DIV4 clocks */
+ CLKDEV_CON_ID("peripheral_clk", &div4_clks[DIV4_P]),
+ CLKDEV_CON_ID("shyway_clk", &div4_clks[DIV4_SH]),
+ CLKDEV_CON_ID("cpu_clk", &div4_clks[DIV4_I]),
+
+ /* MSTP32 clocks */
+ CLKDEV_CON_ID("sdhi0", &mstp_clks[MSTP004]),
+ CLKDEV_CON_ID("riic", &mstp_clks[MSTP000]),
+ {
+ /* TMU0 */
+ .dev_id = "sh_tmu.0",
+ .con_id = "tmu_fck",
+ .clk = &mstp_clks[MSTP113],
+ }, {
+ /* TMU1 */
+ .dev_id = "sh_tmu.1",
+ .con_id = "tmu_fck",
+ .clk = &mstp_clks[MSTP114],
+ },
+ {
+ /* SCIF4 (But, ID is 2) */
+ .dev_id = "sh-sci.2",
+ .con_id = "sci_fck",
+ .clk = &mstp_clks[MSTP112],
+ }, {
+ /* SCIF3 */
+ .dev_id = "sh-sci.1",
+ .con_id = "sci_fck",
+ .clk = &mstp_clks[MSTP111],
+ }, {
+ /* SCIF2 */
+ .dev_id = "sh-sci.0",
+ .con_id = "sci_fck",
+ .clk = &mstp_clks[MSTP110],
+ },
+ CLKDEV_CON_ID("usb0", &mstp_clks[MSTP102]),
};
-static int __init sh7757_clk_init(void)
+int __init arch_clk_init(void)
{
- struct clk *clk = clk_get(NULL, "master_clk");
- int i;
-
- for (i = 0; i < ARRAY_SIZE(sh7757_onchip_clocks); i++) {
- struct clk *clkp = sh7757_onchip_clocks[i];
+ int i, ret = 0;
- clkp->parent = clk;
- clk_register(clkp);
- clk_enable(clkp);
- }
+ for (i = 0; i < ARRAY_SIZE(clks); i++)
+ ret |= clk_register(clks[i]);
+ for (i = 0; i < ARRAY_SIZE(lookups); i++)
+ clkdev_add(&lookups[i]);
- /*
- * Now that we have the rest of the clocks registered, we need to
- * force the parent clock to propagate so that these clocks will
- * automatically figure out their rate. We cheat by handing the
- * parent clock its current rate and forcing child propagation.
- */
- clk_set_rate(clk, clk_get_rate(clk));
+ if (!ret)
+ ret = sh_clk_div4_register(div4_clks, ARRAY_SIZE(div4_clks),
+ &div4_table);
+ if (!ret)
+ ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR);
- clk_put(clk);
-
- clkdev_add_table(lookups, ARRAY_SIZE(lookups));
-
- return 0;
+ return ret;
}
-arch_initcall(sh7757_clk_init);
-
diff --git a/arch/sh/kernel/cpu/sh4a/pinmux-sh7757.c b/arch/sh/kernel/cpu/sh4a/pinmux-sh7757.c
index ed23b155c097..4c74bd04bba4 100644
--- a/arch/sh/kernel/cpu/sh4a/pinmux-sh7757.c
+++ b/arch/sh/kernel/cpu/sh4a/pinmux-sh7757.c
@@ -1,11 +1,11 @@
/*
- * SH7757 (A0 step) Pinmux
+ * SH7757 (B0 step) Pinmux
*
- * Copyright (C) 2009 Renesas Solutions Corp.
+ * Copyright (C) 2009-2010 Renesas Solutions Corp.
*
* Author : Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
*
- * Based on SH7757 Pinmux
+ * Based on SH7723 Pinmux
* Copyright (C) 2008 Magnus Damm
*
* This file is subject to the terms and conditions of the GNU General Public
@@ -40,27 +40,27 @@ enum {
PTH3_DATA, PTH2_DATA, PTH1_DATA, PTH0_DATA,
PTI7_DATA, PTI6_DATA, PTI5_DATA, PTI4_DATA,
PTI3_DATA, PTI2_DATA, PTI1_DATA, PTI0_DATA,
- PTJ7_DATA, PTJ6_DATA, PTJ5_DATA, PTJ4_DATA,
+ PTJ6_DATA, PTJ5_DATA, PTJ4_DATA,
PTJ3_DATA, PTJ2_DATA, PTJ1_DATA, PTJ0_DATA,
PTK7_DATA, PTK6_DATA, PTK5_DATA, PTK4_DATA,
PTK3_DATA, PTK2_DATA, PTK1_DATA, PTK0_DATA,
- PTL7_DATA, PTL6_DATA, PTL5_DATA, PTL4_DATA,
+ PTL6_DATA, PTL5_DATA, PTL4_DATA,
PTL3_DATA, PTL2_DATA, PTL1_DATA, PTL0_DATA,
- PTM6_DATA, PTM5_DATA, PTM4_DATA,
+ PTM7_DATA, PTM6_DATA, PTM5_DATA, PTM4_DATA,
PTM3_DATA, PTM2_DATA, PTM1_DATA, PTM0_DATA,
- PTN7_DATA, PTN6_DATA, PTN5_DATA, PTN4_DATA,
+ PTN6_DATA, PTN5_DATA, PTN4_DATA,
PTN3_DATA, PTN2_DATA, PTN1_DATA, PTN0_DATA,
PTO7_DATA, PTO6_DATA, PTO5_DATA, PTO4_DATA,
PTO3_DATA, PTO2_DATA, PTO1_DATA, PTO0_DATA,
- PTP6_DATA, PTP5_DATA, PTP4_DATA,
+ PTP7_DATA, PTP6_DATA, PTP5_DATA, PTP4_DATA,
PTP3_DATA, PTP2_DATA, PTP1_DATA, PTP0_DATA,
- PTQ6_DATA, PTQ5_DATA, PTQ4_DATA,
+ PTQ6_DATA, PTQ5_DATA, PTQ4_DATA,
PTQ3_DATA, PTQ2_DATA, PTQ1_DATA, PTQ0_DATA,
PTR7_DATA, PTR6_DATA, PTR5_DATA, PTR4_DATA,
PTR3_DATA, PTR2_DATA, PTR1_DATA, PTR0_DATA,
PTS7_DATA, PTS6_DATA, PTS5_DATA, PTS4_DATA,
PTS3_DATA, PTS2_DATA, PTS1_DATA, PTS0_DATA,
- PTT5_DATA, PTT4_DATA,
+ PTT7_DATA, PTT6_DATA, PTT5_DATA, PTT4_DATA,
PTT3_DATA, PTT2_DATA, PTT1_DATA, PTT0_DATA,
PTU7_DATA, PTU6_DATA, PTU5_DATA, PTU4_DATA,
PTU3_DATA, PTU2_DATA, PTU1_DATA, PTU0_DATA,
@@ -95,27 +95,27 @@ enum {
PTH3_IN, PTH2_IN, PTH1_IN, PTH0_IN,
PTI7_IN, PTI6_IN, PTI5_IN, PTI4_IN,
PTI3_IN, PTI2_IN, PTI1_IN, PTI0_IN,
- PTJ7_IN, PTJ6_IN, PTJ5_IN, PTJ4_IN,
+ PTJ6_IN, PTJ5_IN, PTJ4_IN,
PTJ3_IN, PTJ2_IN, PTJ1_IN, PTJ0_IN,
PTK7_IN, PTK6_IN, PTK5_IN, PTK4_IN,
PTK3_IN, PTK2_IN, PTK1_IN, PTK0_IN,
- PTL7_IN, PTL6_IN, PTL5_IN, PTL4_IN,
+ PTL6_IN, PTL5_IN, PTL4_IN,
PTL3_IN, PTL2_IN, PTL1_IN, PTL0_IN,
- PTM6_IN, PTM5_IN, PTM4_IN,
+ PTM7_IN, PTM6_IN, PTM5_IN, PTM4_IN,
PTM3_IN, PTM2_IN, PTM1_IN, PTM0_IN,
- PTN7_IN, PTN6_IN, PTN5_IN, PTN4_IN,
+ PTN6_IN, PTN5_IN, PTN4_IN,
PTN3_IN, PTN2_IN, PTN1_IN, PTN0_IN,
PTO7_IN, PTO6_IN, PTO5_IN, PTO4_IN,
PTO3_IN, PTO2_IN, PTO1_IN, PTO0_IN,
- PTP6_IN, PTP5_IN, PTP4_IN,
+ PTP7_IN, PTP6_IN, PTP5_IN, PTP4_IN,
PTP3_IN, PTP2_IN, PTP1_IN, PTP0_IN,
- PTQ6_IN, PTQ5_IN, PTQ4_IN,
+ PTQ6_IN, PTQ5_IN, PTQ4_IN,
PTQ3_IN, PTQ2_IN, PTQ1_IN, PTQ0_IN,
PTR7_IN, PTR6_IN, PTR5_IN, PTR4_IN,
PTR3_IN, PTR2_IN, PTR1_IN, PTR0_IN,
PTS7_IN, PTS6_IN, PTS5_IN, PTS4_IN,
PTS3_IN, PTS2_IN, PTS1_IN, PTS0_IN,
- PTT5_IN, PTT4_IN,
+ PTT7_IN, PTT6_IN, PTT5_IN, PTT4_IN,
PTT3_IN, PTT2_IN, PTT1_IN, PTT0_IN,
PTU7_IN, PTU6_IN, PTU5_IN, PTU4_IN,
PTU3_IN, PTU2_IN, PTU1_IN, PTU0_IN,
@@ -132,16 +132,43 @@ enum {
PINMUX_INPUT_END,
PINMUX_INPUT_PULLUP_BEGIN,
+ PTA7_IN_PU, PTA6_IN_PU, PTA5_IN_PU, PTA4_IN_PU,
+ PTA3_IN_PU, PTA2_IN_PU, PTA1_IN_PU, PTA0_IN_PU,
+ PTD7_IN_PU, PTD6_IN_PU, PTD5_IN_PU, PTD4_IN_PU,
+ PTD3_IN_PU, PTD2_IN_PU, PTD1_IN_PU, PTD0_IN_PU,
+ PTE7_IN_PU, PTE6_IN_PU, PTE5_IN_PU, PTE4_IN_PU,
+ PTE3_IN_PU, PTE2_IN_PU, PTE1_IN_PU, PTE0_IN_PU,
+ PTF7_IN_PU, PTF6_IN_PU, PTF5_IN_PU, PTF4_IN_PU,
+ PTF3_IN_PU, PTF2_IN_PU, PTF1_IN_PU, PTF0_IN_PU,
+ PTG7_IN_PU, PTG6_IN_PU, PTG4_IN_PU,
+ PTH7_IN_PU, PTH6_IN_PU, PTH5_IN_PU, PTH4_IN_PU,
+ PTH3_IN_PU, PTH2_IN_PU, PTH1_IN_PU, PTH0_IN_PU,
+ PTI7_IN_PU, PTI6_IN_PU, PTI4_IN_PU,
+ PTI3_IN_PU, PTI2_IN_PU, PTI1_IN_PU, PTI0_IN_PU,
+ PTJ6_IN_PU, PTJ5_IN_PU, PTJ4_IN_PU,
+ PTJ3_IN_PU, PTJ2_IN_PU, PTJ1_IN_PU, PTJ0_IN_PU,
+ PTK7_IN_PU, PTK6_IN_PU, PTK5_IN_PU, PTK4_IN_PU,
+ PTK3_IN_PU, PTK2_IN_PU, PTK1_IN_PU, PTK0_IN_PU,
+ PTL6_IN_PU, PTL5_IN_PU, PTL4_IN_PU,
+ PTL3_IN_PU, PTL2_IN_PU, PTL1_IN_PU, PTL0_IN_PU,
+ PTM7_IN_PU, PTM6_IN_PU, PTM5_IN_PU, PTM4_IN_PU,
+ PTN4_IN_PU,
+ PTN3_IN_PU, PTN2_IN_PU, PTN1_IN_PU, PTN0_IN_PU,
+ PTO7_IN_PU, PTO6_IN_PU, PTO5_IN_PU, PTO4_IN_PU,
+ PTO3_IN_PU, PTO2_IN_PU, PTO1_IN_PU, PTO0_IN_PU,
+ PTT7_IN_PU, PTT6_IN_PU, PTT5_IN_PU, PTT4_IN_PU,
+ PTT3_IN_PU, PTT2_IN_PU, PTT1_IN_PU, PTT0_IN_PU,
PTU7_IN_PU, PTU6_IN_PU, PTU5_IN_PU, PTU4_IN_PU,
PTU3_IN_PU, PTU2_IN_PU, PTU1_IN_PU, PTU0_IN_PU,
PTV7_IN_PU, PTV6_IN_PU, PTV5_IN_PU, PTV4_IN_PU,
- PTV3_IN_PU, PTV2_IN_PU, PTV1_IN_PU, PTV0_IN_PU,
- PTW7_IN_PU, PTW6_IN_PU, PTW5_IN_PU, PTW4_IN_PU,
- PTW3_IN_PU, PTW2_IN_PU, PTW1_IN_PU, PTW0_IN_PU,
+ PTV3_IN_PU, PTV2_IN_PU,
+ PTW1_IN_PU, PTW0_IN_PU,
PTX7_IN_PU, PTX6_IN_PU, PTX5_IN_PU, PTX4_IN_PU,
PTX3_IN_PU, PTX2_IN_PU, PTX1_IN_PU, PTX0_IN_PU,
PTY7_IN_PU, PTY6_IN_PU, PTY5_IN_PU, PTY4_IN_PU,
PTY3_IN_PU, PTY2_IN_PU, PTY1_IN_PU, PTY0_IN_PU,
+ PTZ7_IN_PU, PTZ6_IN_PU, PTZ5_IN_PU, PTZ4_IN_PU,
+ PTZ3_IN_PU, PTZ2_IN_PU, PTZ1_IN_PU, PTZ0_IN_PU,
PINMUX_INPUT_PULLUP_END,
PINMUX_OUTPUT_BEGIN,
@@ -163,27 +190,27 @@ enum {
PTH3_OUT, PTH2_OUT, PTH1_OUT, PTH0_OUT,
PTI7_OUT, PTI6_OUT, PTI5_OUT, PTI4_OUT,
PTI3_OUT, PTI2_OUT, PTI1_OUT, PTI0_OUT,
- PTJ7_OUT, PTJ6_OUT, PTJ5_OUT, PTJ4_OUT,
+ PTJ6_OUT, PTJ5_OUT, PTJ4_OUT,
PTJ3_OUT, PTJ2_OUT, PTJ1_OUT, PTJ0_OUT,
PTK7_OUT, PTK6_OUT, PTK5_OUT, PTK4_OUT,
PTK3_OUT, PTK2_OUT, PTK1_OUT, PTK0_OUT,
- PTL7_OUT, PTL6_OUT, PTL5_OUT, PTL4_OUT,
+ PTL6_OUT, PTL5_OUT, PTL4_OUT,
PTL3_OUT, PTL2_OUT, PTL1_OUT, PTL0_OUT,
- PTM6_OUT, PTM5_OUT, PTM4_OUT,
+ PTM7_OUT, PTM6_OUT, PTM5_OUT, PTM4_OUT,
PTM3_OUT, PTM2_OUT, PTM1_OUT, PTM0_OUT,
- PTN7_OUT, PTN6_OUT, PTN5_OUT, PTN4_OUT,
+ PTN6_OUT, PTN5_OUT, PTN4_OUT,
PTN3_OUT, PTN2_OUT, PTN1_OUT, PTN0_OUT,
PTO7_OUT, PTO6_OUT, PTO5_OUT, PTO4_OUT,
PTO3_OUT, PTO2_OUT, PTO1_OUT, PTO0_OUT,
- PTP6_OUT, PTP5_OUT, PTP4_OUT,
+ PTP7_OUT, PTP6_OUT, PTP5_OUT, PTP4_OUT,
PTP3_OUT, PTP2_OUT, PTP1_OUT, PTP0_OUT,
- PTQ6_OUT, PTQ5_OUT, PTQ4_OUT,
+ PTQ6_OUT, PTQ5_OUT, PTQ4_OUT,
PTQ3_OUT, PTQ2_OUT, PTQ1_OUT, PTQ0_OUT,
PTR7_OUT, PTR6_OUT, PTR5_OUT, PTR4_OUT,
PTR3_OUT, PTR2_OUT, PTR1_OUT, PTR0_OUT,
PTS7_OUT, PTS6_OUT, PTS5_OUT, PTS4_OUT,
PTS3_OUT, PTS2_OUT, PTS1_OUT, PTS0_OUT,
- PTT5_OUT, PTT4_OUT,
+ PTT7_OUT, PTT6_OUT, PTT5_OUT, PTT4_OUT,
PTT3_OUT, PTT2_OUT, PTT1_OUT, PTT0_OUT,
PTU7_OUT, PTU6_OUT, PTU5_OUT, PTU4_OUT,
PTU3_OUT, PTU2_OUT, PTU1_OUT, PTU0_OUT,
@@ -218,27 +245,27 @@ enum {
PTH3_FN, PTH2_FN, PTH1_FN, PTH0_FN,
PTI7_FN, PTI6_FN, PTI5_FN, PTI4_FN,
PTI3_FN, PTI2_FN, PTI1_FN, PTI0_FN,
- PTJ7_FN, PTJ6_FN, PTJ5_FN, PTJ4_FN,
+ PTJ6_FN, PTJ5_FN, PTJ4_FN,
PTJ3_FN, PTJ2_FN, PTJ1_FN, PTJ0_FN,
PTK7_FN, PTK6_FN, PTK5_FN, PTK4_FN,
PTK3_FN, PTK2_FN, PTK1_FN, PTK0_FN,
- PTL7_FN, PTL6_FN, PTL5_FN, PTL4_FN,
+ PTL6_FN, PTL5_FN, PTL4_FN,
PTL3_FN, PTL2_FN, PTL1_FN, PTL0_FN,
- PTM6_FN, PTM5_FN, PTM4_FN,
+ PTM7_FN, PTM6_FN, PTM5_FN, PTM4_FN,
PTM3_FN, PTM2_FN, PTM1_FN, PTM0_FN,
- PTN7_FN, PTN6_FN, PTN5_FN, PTN4_FN,
+ PTN6_FN, PTN5_FN, PTN4_FN,
PTN3_FN, PTN2_FN, PTN1_FN, PTN0_FN,
PTO7_FN, PTO6_FN, PTO5_FN, PTO4_FN,
PTO3_FN, PTO2_FN, PTO1_FN, PTO0_FN,
- PTP6_FN, PTP5_FN, PTP4_FN,
+ PTP7_FN, PTP6_FN, PTP5_FN, PTP4_FN,
PTP3_FN, PTP2_FN, PTP1_FN, PTP0_FN,
- PTQ6_FN, PTQ5_FN, PTQ4_FN,
+ PTQ6_FN, PTQ5_FN, PTQ4_FN,
PTQ3_FN, PTQ2_FN, PTQ1_FN, PTQ0_FN,
PTR7_FN, PTR6_FN, PTR5_FN, PTR4_FN,
PTR3_FN, PTR2_FN, PTR1_FN, PTR0_FN,
PTS7_FN, PTS6_FN, PTS5_FN, PTS4_FN,
PTS3_FN, PTS2_FN, PTS1_FN, PTS0_FN,
- PTT5_FN, PTT4_FN,
+ PTT7_FN, PTT6_FN, PTT5_FN, PTT4_FN,
PTT3_FN, PTT2_FN, PTT1_FN, PTT0_FN,
PTU7_FN, PTU6_FN, PTU5_FN, PTU4_FN,
PTU3_FN, PTU2_FN, PTU1_FN, PTU0_FN,
@@ -253,181 +280,248 @@ enum {
PTZ7_FN, PTZ6_FN, PTZ5_FN, PTZ4_FN,
PTZ3_FN, PTZ2_FN, PTZ1_FN, PTZ0_FN,
- PS0_15_FN1, PS0_15_FN3,
- PS0_14_FN1, PS0_14_FN3,
- PS0_13_FN1, PS0_13_FN3,
- PS0_12_FN1, PS0_12_FN3,
+ PS0_15_FN1, PS0_15_FN2,
+ PS0_14_FN1, PS0_14_FN2,
+ PS0_13_FN1, PS0_13_FN2,
+ PS0_12_FN1, PS0_12_FN2,
+ PS0_11_FN1, PS0_11_FN2,
+ PS0_10_FN1, PS0_10_FN2,
+ PS0_9_FN1, PS0_9_FN2,
+ PS0_8_FN1, PS0_8_FN2,
PS0_7_FN1, PS0_7_FN2,
PS0_6_FN1, PS0_6_FN2,
PS0_5_FN1, PS0_5_FN2,
PS0_4_FN1, PS0_4_FN2,
PS0_3_FN1, PS0_3_FN2,
PS0_2_FN1, PS0_2_FN2,
- PS0_1_FN1, PS0_1_FN2,
- PS1_7_FN1, PS1_7_FN3,
- PS1_6_FN1, PS1_6_FN3,
+ PS1_10_FN1, PS1_10_FN2,
+ PS1_9_FN1, PS1_9_FN2,
+ PS1_8_FN1, PS1_8_FN2,
+ PS1_2_FN1, PS1_2_FN2,
+
+ PS2_13_FN1, PS2_13_FN2,
+ PS2_12_FN1, PS2_12_FN2,
+ PS2_7_FN1, PS2_7_FN2,
+ PS2_6_FN1, PS2_6_FN2,
+ PS2_5_FN1, PS2_5_FN2,
+ PS2_4_FN1, PS2_4_FN2,
+ PS2_2_FN1, PS2_2_FN2,
+
+ PS3_15_FN1, PS3_15_FN2,
+ PS3_14_FN1, PS3_14_FN2,
+ PS3_13_FN1, PS3_13_FN2,
+ PS3_12_FN1, PS3_12_FN2,
+ PS3_11_FN1, PS3_11_FN2,
+ PS3_10_FN1, PS3_10_FN2,
+ PS3_9_FN1, PS3_9_FN2,
+ PS3_8_FN1, PS3_8_FN2,
+ PS3_7_FN1, PS3_7_FN2,
+ PS3_2_FN1, PS3_2_FN2,
+ PS3_1_FN1, PS3_1_FN2,
- PS2_13_FN1, PS2_13_FN3,
- PS2_12_FN1, PS2_12_FN3,
- PS2_1_FN1, PS2_1_FN2,
- PS2_0_FN1, PS2_0_FN2,
-
- PS4_15_FN1, PS4_15_FN2,
PS4_14_FN1, PS4_14_FN2,
PS4_13_FN1, PS4_13_FN2,
PS4_12_FN1, PS4_12_FN2,
- PS4_11_FN1, PS4_11_FN2,
PS4_10_FN1, PS4_10_FN2,
PS4_9_FN1, PS4_9_FN2,
+ PS4_8_FN1, PS4_8_FN2,
+ PS4_4_FN1, PS4_4_FN2,
PS4_3_FN1, PS4_3_FN2,
PS4_2_FN1, PS4_2_FN2,
PS4_1_FN1, PS4_1_FN2,
PS4_0_FN1, PS4_0_FN2,
+ PS5_11_FN1, PS5_11_FN2,
+ PS5_10_FN1, PS5_10_FN2,
PS5_9_FN1, PS5_9_FN2,
PS5_8_FN1, PS5_8_FN2,
PS5_7_FN1, PS5_7_FN2,
PS5_6_FN1, PS5_6_FN2,
PS5_5_FN1, PS5_5_FN2,
PS5_4_FN1, PS5_4_FN2,
-
- /* AN15 to 8 : EVENT15 to 8 */
- PS6_7_FN_AN, PS6_7_FN_EV,
- PS6_6_FN_AN, PS6_6_FN_EV,
- PS6_5_FN_AN, PS6_5_FN_EV,
- PS6_4_FN_AN, PS6_4_FN_EV,
- PS6_3_FN_AN, PS6_3_FN_EV,
- PS6_2_FN_AN, PS6_2_FN_EV,
- PS6_1_FN_AN, PS6_1_FN_EV,
- PS6_0_FN_AN, PS6_0_FN_EV,
-
+ PS5_3_FN1, PS5_3_FN2,
+ PS5_2_FN1, PS5_2_FN2,
+
+ PS6_15_FN1, PS6_15_FN2,
+ PS6_14_FN1, PS6_14_FN2,
+ PS6_13_FN1, PS6_13_FN2,
+ PS6_12_FN1, PS6_12_FN2,
+ PS6_11_FN1, PS6_11_FN2,
+ PS6_10_FN1, PS6_10_FN2,
+ PS6_9_FN1, PS6_9_FN2,
+ PS6_8_FN1, PS6_8_FN2,
+ PS6_7_FN1, PS6_7_FN2,
+ PS6_6_FN1, PS6_6_FN2,
+ PS6_5_FN1, PS6_5_FN2,
+ PS6_4_FN1, PS6_4_FN2,
+ PS6_3_FN1, PS6_3_FN2,
+ PS6_2_FN1, PS6_2_FN2,
+ PS6_1_FN1, PS6_1_FN2,
+ PS6_0_FN1, PS6_0_FN2,
+
+ PS7_15_FN1, PS7_15_FN2,
+ PS7_14_FN1, PS7_14_FN2,
+ PS7_13_FN1, PS7_13_FN2,
+ PS7_12_FN1, PS7_12_FN2,
+ PS7_11_FN1, PS7_11_FN2,
+ PS7_10_FN1, PS7_10_FN2,
+ PS7_9_FN1, PS7_9_FN2,
+ PS7_8_FN1, PS7_8_FN2,
+ PS7_7_FN1, PS7_7_FN2,
+ PS7_6_FN1, PS7_6_FN2,
+ PS7_5_FN1, PS7_5_FN2,
+ PS7_4_FN1, PS7_4_FN2,
+
+ PS8_15_FN1, PS8_15_FN2,
+ PS8_14_FN1, PS8_14_FN2,
+ PS8_13_FN1, PS8_13_FN2,
+ PS8_12_FN1, PS8_12_FN2,
+ PS8_11_FN1, PS8_11_FN2,
+ PS8_10_FN1, PS8_10_FN2,
+ PS8_9_FN1, PS8_9_FN2,
+ PS8_8_FN1, PS8_8_FN2,
PINMUX_FUNCTION_END,
PINMUX_MARK_BEGIN,
- /* PTA (mobule: LBSC, CPG, LPC) */
+ /* PTA (mobule: LBSC, RGMII) */
BS_MARK, RDWR_MARK, WE1_MARK, RDY_MARK,
- MD10_MARK, MD9_MARK, MD8_MARK,
- LGPIO7_MARK, LGPIO6_MARK, LGPIO5_MARK, LGPIO4_MARK,
- LGPIO3_MARK, LGPIO2_MARK, LGPIO1_MARK, LGPIO0_MARK,
-
- /* PTB (mobule: LBSC, EtherC, SIM, LPC) */
- D15_MARK, D14_MARK, D13_MARK, D12_MARK,
- D11_MARK, D10_MARK, D9_MARK, D8_MARK,
ET0_MDC_MARK, ET0_MDIO_MARK, ET1_MDC_MARK, ET1_MDIO_MARK,
- SIM_D_MARK, SIM_CLK_MARK, SIM_RST_MARK,
- WPSZ1_MARK, WPSZ0_MARK, FWID_MARK, FLSHSZ_MARK,
- LPC_SPIEN_MARK, BASEL_MARK,
- /* PTC (mobule: SD) */
- SD_WP_MARK, SD_CD_MARK, SD_CLK_MARK, SD_CMD_MARK,
- SD_D3_MARK, SD_D2_MARK, SD_D1_MARK, SD_D0_MARK,
+ /* PTB (mobule: INTC, ONFI, TMU) */
+ IRQ15_MARK, IRQ14_MARK, IRQ13_MARK, IRQ12_MARK,
+ IRQ11_MARK, IRQ10_MARK, IRQ9_MARK, IRQ8_MARK,
+ ON_NRE_MARK, ON_NWE_MARK, ON_NWP_MARK, ON_NCE0_MARK,
+ ON_R_B0_MARK, ON_ALE_MARK, ON_CLE_MARK, TCLK_MARK,
- /* PTD (mobule: INTC, SPI0, LBSC, CPG, ADC) */
+ /* PTC (mobule: IRQ, PWMU) */
IRQ7_MARK, IRQ6_MARK, IRQ5_MARK, IRQ4_MARK,
IRQ3_MARK, IRQ2_MARK, IRQ1_MARK, IRQ0_MARK,
- MD6_MARK, MD5_MARK, MD3_MARK, MD2_MARK,
- MD1_MARK, MD0_MARK, ADTRG1_MARK, ADTRG0_MARK,
-
- /* PTE (mobule: EtherC) */
- ET0_CRS_DV_MARK, ET0_TXD1_MARK,
- ET0_TXD0_MARK, ET0_TX_EN_MARK,
- ET0_REF_CLK_MARK, ET0_RXD1_MARK,
- ET0_RXD0_MARK, ET0_RX_ER_MARK,
-
- /* PTF (mobule: EtherC) */
- ET1_CRS_DV_MARK, ET1_TXD1_MARK,
- ET1_TXD0_MARK, ET1_TX_EN_MARK,
- ET1_REF_CLK_MARK, ET1_RXD1_MARK,
- ET1_RXD0_MARK, ET1_RX_ER_MARK,
-
- /* PTG (mobule: SYSTEM, PWMX, LPC) */
- STATUS0_MARK, STATUS1_MARK,
- PWX0_MARK, PWX1_MARK, PWX2_MARK, PWX3_MARK,
- SERIRQ_MARK, CLKRUN_MARK, LPCPD_MARK, LDRQ_MARK,
-
- /* PTH (mobule: TMU, SCIF234, SPI1, SPI0) */
- TCLK_MARK, RXD4_MARK, TXD4_MARK,
+ PWMU0_MARK, PWMU1_MARK, PWMU2_MARK, PWMU3_MARK,
+ PWMU4_MARK, PWMU5_MARK,
+
+ /* PTD (mobule: SPI0, DMAC) */
+ SP0_MOSI_MARK, SP0_MISO_MARK, SP0_SCK_MARK, SP0_SCK_FB_MARK,
+ SP0_SS0_MARK, SP0_SS1_MARK, SP0_SS2_MARK, SP0_SS3_MARK,
+ DREQ0_MARK, DACK0_MARK, TEND0_MARK,
+
+ /* PTE (mobule: RMII) */
+ RMII0_CRS_DV_MARK, RMII0_TXD1_MARK,
+ RMII0_TXD0_MARK, RMII0_TXEN_MARK,
+ RMII0_REFCLK_MARK, RMII0_RXD1_MARK,
+ RMII0_RXD0_MARK, RMII0_RX_ER_MARK,
+
+ /* PTF (mobule: RMII, SerMux) */
+ RMII1_CRS_DV_MARK, RMII1_TXD1_MARK,
+ RMII1_TXD0_MARK, RMII1_TXEN_MARK,
+ RMII1_REFCLK_MARK, RMII1_RXD1_MARK,
+ RMII1_RXD0_MARK, RMII1_RX_ER_MARK,
+ RAC_RI_MARK,
+
+ /* PTG (mobule: system, LBSC, LPC, WDT, LPC, eMMC) */
+ BOOTFMS_MARK, BOOTWP_MARK, A25_MARK, A24_MARK,
+ SERIRQ_MARK, WDTOVF_MARK, LPCPD_MARK, LDRQ_MARK,
+ MMCCLK_MARK, MMCCMD_MARK,
+
+ /* PTH (mobule: SPI1, LPC, DMAC, ADC) */
SP1_MOSI_MARK, SP1_MISO_MARK, SP1_SCK_MARK, SP1_SCK_FB_MARK,
- SP1_SS0_MARK, SP1_SS1_MARK, SP0_SS1_MARK,
+ SP1_SS0_MARK, SP1_SS1_MARK, WP_MARK, FMS0_MARK,
+ TEND1_MARK, DREQ1_MARK, DACK1_MARK, ADTRG1_MARK,
+ ADTRG0_MARK,
- /* PTI (mobule: INTC) */
- IRQ15_MARK, IRQ14_MARK, IRQ13_MARK, IRQ12_MARK,
- IRQ11_MARK, IRQ10_MARK, IRQ9_MARK, IRQ8_MARK,
+ /* PTI (mobule: LBSC, SDHI) */
+ D15_MARK, D14_MARK, D13_MARK, D12_MARK,
+ D11_MARK, D10_MARK, D9_MARK, D8_MARK,
+ SD_WP_MARK, SD_CD_MARK, SD_CLK_MARK, SD_CMD_MARK,
+ SD_D3_MARK, SD_D2_MARK, SD_D1_MARK, SD_D0_MARK,
- /* PTJ (mobule: SCIF234, SERMUX) */
- RXD3_MARK, TXD3_MARK, RXD2_MARK, TXD2_MARK,
- COM1_TXD_MARK, COM1_RXD_MARK, COM1_RTS_MARK, COM1_CTS_MARK,
+ /* PTJ (mobule: SCIF234) */
+ RTS3_MARK, CTS3_MARK, TXD3_MARK, RXD3_MARK,
+ RTS4_MARK, RXD4_MARK, TXD4_MARK,
- /* PTK (mobule: SERMUX) */
+ /* PTK (mobule: SERMUX, LBSC, SCIF) */
COM2_TXD_MARK, COM2_RXD_MARK, COM2_RTS_MARK, COM2_CTS_MARK,
- COM2_DTR_MARK, COM2_DSR_MARK, COM2_DCD_MARK, COM2_RI_MARK,
+ COM2_DTR_MARK, COM2_DSR_MARK, COM2_DCD_MARK, CLKOUT_MARK,
+ SCK2_MARK, SCK4_MARK, SCK3_MARK,
- /* PTL (mobule: SERMUX) */
- RAC_TXD_MARK, RAC_RXD_MARK, RAC_RTS_MARK, RAC_CTS_MARK,
- RAC_DTR_MARK, RAC_DSR_MARK, RAC_DCD_MARK, RAC_RI_MARK,
+ /* PTL (mobule: SERMUX, SCIF, LBSC, AUD) */
+ RAC_RXD_MARK, RAC_RTS_MARK, RAC_CTS_MARK, RAC_DTR_MARK,
+ RAC_DSR_MARK, RAC_DCD_MARK, RAC_TXD_MARK, RXD2_MARK,
+ CS5_MARK, CS6_MARK, AUDSYNC_MARK, AUDCK_MARK,
+ TXD2_MARK,
- /* PTM (mobule: IIC, LPC) */
+ /* PTM (mobule: LBSC, IIC) */
+ CS4_MARK, RD_MARK, WE0_MARK, CS0_MARK,
SDA6_MARK, SCL6_MARK, SDA7_MARK, SCL7_MARK,
- WP_MARK, FMS0_MARK, FMS1_MARK,
- /* PTN (mobule: SCIF234, EVC) */
- SCK2_MARK, RTS4_MARK, RTS3_MARK, RTS2_MARK,
- CTS4_MARK, CTS3_MARK, CTS2_MARK,
- EVENT7_MARK, EVENT6_MARK, EVENT5_MARK, EVENT4_MARK,
- EVENT3_MARK, EVENT2_MARK, EVENT1_MARK, EVENT0_MARK,
+ /* PTN (mobule: USB, JMC, SGPIO, WDT) */
+ VBUS_EN_MARK, VBUS_OC_MARK, JMCTCK_MARK, JMCTMS_MARK,
+ JMCTDO_MARK, JMCTDI_MARK, JMCTRST_MARK,
+ SGPIO1_CLK_MARK, SGPIO1_LOAD_MARK, SGPIO1_DI_MARK,
+ SGPIO1_DO_MARK, SUB_CLKIN_MARK,
- /* PTO (mobule: SGPIO) */
- SGPIO0_CLK_MARK, SGPIO0_LOAD_MARK,
- SGPIO0_DI_MARK, SGPIO0_DO_MARK,
- SGPIO1_CLK_MARK, SGPIO1_LOAD_MARK,
- SGPIO1_DI_MARK, SGPIO1_DO_MARK,
-
- /* PTP (mobule: JMC, SCIF234) */
- JMCTCK_MARK, JMCTMS_MARK, JMCTDO_MARK, JMCTDI_MARK,
- JMCRST_MARK, SCK4_MARK, SCK3_MARK,
+ /* PTO (mobule: SGPIO, SerMux) */
+ SGPIO0_CLK_MARK, SGPIO0_LOAD_MARK, SGPIO0_DI_MARK,
+ SGPIO0_DO_MARK, SGPIO2_CLK_MARK, SGPIO2_LOAD_MARK,
+ SGPIO2_DI_MARK, SGPIO2_DO_MARK,
+ COM1_TXD_MARK, COM1_RXD_MARK, COM1_RTS_MARK, COM1_CTS_MARK,
/* PTQ (mobule: LPC) */
LAD3_MARK, LAD2_MARK, LAD1_MARK, LAD0_MARK,
LFRAME_MARK, LRESET_MARK, LCLK_MARK,
/* PTR (mobule: GRA, IIC) */
- DDC3_MARK, DDC2_MARK,
- SDA8_MARK, SCL8_MARK, SDA2_MARK, SCL2_MARK,
+ DDC3_MARK, DDC2_MARK, SDA2_MARK, SCL2_MARK,
SDA1_MARK, SCL1_MARK, SDA0_MARK, SCL0_MARK,
+ SDA8_MARK, SCL8_MARK,
/* PTS (mobule: GRA, IIC) */
- DDC1_MARK, DDC0_MARK,
- SDA9_MARK, SCL9_MARK, SDA5_MARK, SCL5_MARK,
+ DDC1_MARK, DDC0_MARK, SDA5_MARK, SCL5_MARK,
SDA4_MARK, SCL4_MARK, SDA3_MARK, SCL3_MARK,
+ SDA9_MARK, SCL9_MARK,
- /* PTT (mobule: SYSTEM, PWMX) */
- AUDSYNC_MARK, AUDCK_MARK,
- AUDATA3_MARK, AUDATA2_MARK,
- AUDATA1_MARK, AUDATA0_MARK,
- PWX7_MARK, PWX6_MARK, PWX5_MARK, PWX4_MARK,
+ /* PTT (mobule: PWMX, AUD) */
+ PWMX7_MARK, PWMX6_MARK, PWMX5_MARK, PWMX4_MARK,
+ PWMX3_MARK, PWMX2_MARK, PWMX1_MARK, PWMX0_MARK,
+ AUDATA3_MARK, AUDATA2_MARK, AUDATA1_MARK, AUDATA0_MARK,
+ STATUS1_MARK, STATUS0_MARK,
- /* PTU (mobule: LBSC, DMAC) */
- CS6_MARK, CS5_MARK, CS4_MARK, CS0_MARK,
- RD_MARK, WE0_MARK, A25_MARK, A24_MARK,
- DREQ0_MARK, DACK0_MARK,
+ /* PTU (mobule: LPC, APM) */
+ LGPIO7_MARK, LGPIO6_MARK, LGPIO5_MARK, LGPIO4_MARK,
+ LGPIO3_MARK, LGPIO2_MARK, LGPIO1_MARK, LGPIO0_MARK,
+ APMONCTL_O_MARK, APMPWBTOUT_O_MARK, APMSCI_O_MARK,
+ APMVDDON_MARK, APMSLPBTN_MARK, APMPWRBTN_MARK, APMS5N_MARK,
+ APMS3N_MARK,
- /* PTV (mobule: LBSC, DMAC) */
+ /* PTV (mobule: LBSC, SerMux, R-SPI, EVC, GRA) */
A23_MARK, A22_MARK, A21_MARK, A20_MARK,
A19_MARK, A18_MARK, A17_MARK, A16_MARK,
- TEND0_MARK, DREQ1_MARK, DACK1_MARK, TEND1_MARK,
+ COM2_RI_MARK, R_SPI_MOSI_MARK, R_SPI_MISO_MARK,
+ R_SPI_RSPCK_MARK, R_SPI_SSL0_MARK, R_SPI_SSL1_MARK,
+ EVENT7_MARK, EVENT6_MARK, VBIOS_DI_MARK, VBIOS_DO_MARK,
+ VBIOS_CLK_MARK, VBIOS_CS_MARK,
- /* PTW (mobule: LBSC) */
+ /* PTW (mobule: LBSC, EVC, SCIF) */
A15_MARK, A14_MARK, A13_MARK, A12_MARK,
A11_MARK, A10_MARK, A9_MARK, A8_MARK,
+ EVENT5_MARK, EVENT4_MARK, EVENT3_MARK, EVENT2_MARK,
+ EVENT1_MARK, EVENT0_MARK, CTS4_MARK, CTS2_MARK,
- /* PTX (mobule: LBSC) */
+ /* PTX (mobule: LBSC, SCIF, SIM) */
A7_MARK, A6_MARK, A5_MARK, A4_MARK,
A3_MARK, A2_MARK, A1_MARK, A0_MARK,
+ RTS2_MARK, SIM_D_MARK, SIM_CLK_MARK, SIM_RST_MARK,
/* PTY (mobule: LBSC) */
D7_MARK, D6_MARK, D5_MARK, D4_MARK,
D3_MARK, D2_MARK, D1_MARK, D0_MARK,
+
+ /* PTZ (mobule: eMMC, ONFI) */
+ MMCDAT7_MARK, MMCDAT6_MARK, MMCDAT5_MARK, MMCDAT4_MARK,
+ MMCDAT3_MARK, MMCDAT2_MARK, MMCDAT1_MARK, MMCDAT0_MARK,
+ ON_DQ7_MARK, ON_DQ6_MARK, ON_DQ5_MARK, ON_DQ4_MARK,
+ ON_DQ3_MARK, ON_DQ2_MARK, ON_DQ1_MARK, ON_DQ0_MARK,
+
PINMUX_MARK_END,
};
@@ -473,6 +567,8 @@ static pinmux_enum_t pinmux_data[] = {
PINMUX_DATA(PTD0_DATA, PTD0_IN, PTD0_OUT),
/* PTE GPIO */
+ PINMUX_DATA(PTE7_DATA, PTE7_IN, PTE7_OUT),
+ PINMUX_DATA(PTE6_DATA, PTE6_IN, PTE6_OUT),
PINMUX_DATA(PTE5_DATA, PTE5_IN, PTE5_OUT),
PINMUX_DATA(PTE4_DATA, PTE4_IN, PTE4_OUT),
PINMUX_DATA(PTE3_DATA, PTE3_IN, PTE3_OUT),
@@ -521,7 +617,6 @@ static pinmux_enum_t pinmux_data[] = {
PINMUX_DATA(PTI0_DATA, PTI0_IN, PTI0_OUT),
/* PTJ GPIO */
- PINMUX_DATA(PTJ7_DATA, PTJ7_IN, PTJ7_OUT),
PINMUX_DATA(PTJ6_DATA, PTJ6_IN, PTJ6_OUT),
PINMUX_DATA(PTJ5_DATA, PTJ5_IN, PTJ5_OUT),
PINMUX_DATA(PTJ4_DATA, PTJ4_IN, PTJ4_OUT),
@@ -541,7 +636,6 @@ static pinmux_enum_t pinmux_data[] = {
PINMUX_DATA(PTK0_DATA, PTK0_IN, PTK0_OUT),
/* PTL GPIO */
- PINMUX_DATA(PTL7_DATA, PTL7_IN, PTL7_OUT),
PINMUX_DATA(PTL6_DATA, PTL6_IN, PTL6_OUT),
PINMUX_DATA(PTL5_DATA, PTL5_IN, PTL5_OUT),
PINMUX_DATA(PTL4_DATA, PTL4_IN, PTL4_OUT),
@@ -560,7 +654,6 @@ static pinmux_enum_t pinmux_data[] = {
PINMUX_DATA(PTM0_DATA, PTM0_IN, PTM0_OUT),
/* PTN GPIO */
- PINMUX_DATA(PTN7_DATA, PTN7_IN, PTN7_OUT),
PINMUX_DATA(PTN6_DATA, PTN6_IN, PTN6_OUT),
PINMUX_DATA(PTN5_DATA, PTN5_IN, PTN5_OUT),
PINMUX_DATA(PTN4_DATA, PTN4_IN, PTN4_OUT),
@@ -609,6 +702,8 @@ static pinmux_enum_t pinmux_data[] = {
PINMUX_DATA(PTS0_DATA, PTS0_IN, PTS0_OUT),
/* PTT GPIO */
+ PINMUX_DATA(PTT7_DATA, PTT7_IN, PTT7_OUT),
+ PINMUX_DATA(PTT6_DATA, PTT6_IN, PTT6_OUT),
PINMUX_DATA(PTT5_DATA, PTT5_IN, PTT5_OUT),
PINMUX_DATA(PTT4_DATA, PTT4_IN, PTT4_OUT),
PINMUX_DATA(PTT3_DATA, PTT3_IN, PTT3_OUT),
@@ -677,186 +772,204 @@ static pinmux_enum_t pinmux_data[] = {
PINMUX_DATA(PTZ0_DATA, PTZ0_IN, PTZ0_OUT),
/* PTA FN */
- PINMUX_DATA(BS_MARK, PS0_15_FN1, PTA7_FN),
- PINMUX_DATA(LGPIO7_MARK, PS0_15_FN3, PTA7_FN),
- PINMUX_DATA(RDWR_MARK, PS0_14_FN1, PTA6_FN),
- PINMUX_DATA(LGPIO6_MARK, PS0_14_FN3, PTA6_FN),
- PINMUX_DATA(WE1_MARK, PS0_13_FN1, PTA5_FN),
- PINMUX_DATA(LGPIO5_MARK, PS0_13_FN3, PTA5_FN),
- PINMUX_DATA(RDY_MARK, PS0_12_FN1, PTA4_FN),
- PINMUX_DATA(LGPIO4_MARK, PS0_12_FN3, PTA4_FN),
- PINMUX_DATA(LGPIO3_MARK, PTA3_FN),
- PINMUX_DATA(LGPIO2_MARK, PTA2_FN),
- PINMUX_DATA(LGPIO1_MARK, PTA1_FN),
- PINMUX_DATA(LGPIO0_MARK, PTA0_FN),
+ PINMUX_DATA(BS_MARK, PTA7_FN),
+ PINMUX_DATA(RDWR_MARK, PTA6_FN),
+ PINMUX_DATA(WE1_MARK, PTA5_FN),
+ PINMUX_DATA(RDY_MARK, PTA4_FN),
+ PINMUX_DATA(ET0_MDC_MARK, PTA3_FN),
+ PINMUX_DATA(ET0_MDIO_MARK, PTA2_FN),
+ PINMUX_DATA(ET1_MDC_MARK, PTA1_FN),
+ PINMUX_DATA(ET1_MDIO_MARK, PTA0_FN),
/* PTB FN */
- PINMUX_DATA(D15_MARK, PS0_7_FN1, PTB7_FN),
- PINMUX_DATA(ET0_MDC_MARK, PS0_7_FN2, PTB7_FN),
- PINMUX_DATA(D14_MARK, PS0_6_FN1, PTB6_FN),
- PINMUX_DATA(ET0_MDIO_MARK, PS0_6_FN2, PTB6_FN),
- PINMUX_DATA(D13_MARK, PS0_5_FN1, PTB5_FN),
- PINMUX_DATA(ET1_MDC_MARK, PS0_5_FN2, PTB5_FN),
- PINMUX_DATA(D12_MARK, PS0_4_FN1, PTB4_FN),
- PINMUX_DATA(ET1_MDIO_MARK, PS0_4_FN2, PTB4_FN),
- PINMUX_DATA(D11_MARK, PS0_3_FN1, PTB3_FN),
- PINMUX_DATA(SIM_D_MARK, PS0_3_FN2, PTB3_FN),
- PINMUX_DATA(D10_MARK, PS0_2_FN1, PTB2_FN),
- PINMUX_DATA(SIM_CLK_MARK, PS0_2_FN2, PTB2_FN),
- PINMUX_DATA(D9_MARK, PS0_1_FN1, PTB1_FN),
- PINMUX_DATA(SIM_RST_MARK, PS0_1_FN2, PTB1_FN),
- PINMUX_DATA(D8_MARK, PTB0_FN),
+ PINMUX_DATA(IRQ15_MARK, PS0_15_FN1, PTB7_FN),
+ PINMUX_DATA(ON_NRE_MARK, PS0_15_FN2, PTB7_FN),
+ PINMUX_DATA(IRQ14_MARK, PS0_14_FN1, PTB6_FN),
+ PINMUX_DATA(ON_NWE_MARK, PS0_14_FN2, PTB6_FN),
+ PINMUX_DATA(IRQ13_MARK, PS0_13_FN1, PTB5_FN),
+ PINMUX_DATA(ON_NWP_MARK, PS0_13_FN2, PTB5_FN),
+ PINMUX_DATA(IRQ12_MARK, PS0_12_FN1, PTB4_FN),
+ PINMUX_DATA(ON_NCE0_MARK, PS0_12_FN2, PTB4_FN),
+ PINMUX_DATA(IRQ11_MARK, PS0_11_FN1, PTB3_FN),
+ PINMUX_DATA(ON_R_B0_MARK, PS0_11_FN2, PTB3_FN),
+ PINMUX_DATA(IRQ10_MARK, PS0_10_FN1, PTB2_FN),
+ PINMUX_DATA(ON_ALE_MARK, PS0_10_FN2, PTB2_FN),
+ PINMUX_DATA(IRQ9_MARK, PS0_9_FN1, PTB1_FN),
+ PINMUX_DATA(ON_CLE_MARK, PS0_9_FN2, PTB1_FN),
+ PINMUX_DATA(IRQ8_MARK, PS0_8_FN1, PTB0_FN),
+ PINMUX_DATA(TCLK_MARK, PS0_8_FN2, PTB0_FN),
/* PTC FN */
- PINMUX_DATA(SD_WP_MARK, PTC7_FN),
- PINMUX_DATA(SD_CD_MARK, PTC6_FN),
- PINMUX_DATA(SD_CLK_MARK, PTC5_FN),
- PINMUX_DATA(SD_CMD_MARK, PTC4_FN),
- PINMUX_DATA(SD_D3_MARK, PTC3_FN),
- PINMUX_DATA(SD_D2_MARK, PTC2_FN),
- PINMUX_DATA(SD_D1_MARK, PTC1_FN),
- PINMUX_DATA(SD_D0_MARK, PTC0_FN),
+ PINMUX_DATA(IRQ7_MARK, PS0_7_FN1, PTC7_FN),
+ PINMUX_DATA(PWMU0_MARK, PS0_7_FN2, PTC7_FN),
+ PINMUX_DATA(IRQ6_MARK, PS0_6_FN1, PTC6_FN),
+ PINMUX_DATA(PWMU1_MARK, PS0_6_FN2, PTC6_FN),
+ PINMUX_DATA(IRQ5_MARK, PS0_5_FN1, PTC5_FN),
+ PINMUX_DATA(PWMU2_MARK, PS0_5_FN2, PTC5_FN),
+ PINMUX_DATA(IRQ4_MARK, PS0_4_FN1, PTC5_FN),
+ PINMUX_DATA(PWMU3_MARK, PS0_4_FN2, PTC4_FN),
+ PINMUX_DATA(IRQ3_MARK, PS0_3_FN1, PTC3_FN),
+ PINMUX_DATA(PWMU4_MARK, PS0_3_FN2, PTC3_FN),
+ PINMUX_DATA(IRQ2_MARK, PS0_2_FN1, PTC2_FN),
+ PINMUX_DATA(PWMU5_MARK, PS0_2_FN2, PTC2_FN),
+ PINMUX_DATA(IRQ1_MARK, PTC1_FN),
+ PINMUX_DATA(IRQ0_MARK, PTC0_FN),
/* PTD FN */
- PINMUX_DATA(IRQ7_MARK, PS1_7_FN1, PTD7_FN),
- PINMUX_DATA(ADTRG1_MARK, PS1_7_FN3, PTD7_FN),
- PINMUX_DATA(IRQ6_MARK, PS1_6_FN1, PTD6_FN),
- PINMUX_DATA(ADTRG0_MARK, PS1_6_FN3, PTD6_FN),
- PINMUX_DATA(IRQ5_MARK, PTD5_FN),
- PINMUX_DATA(IRQ4_MARK, PTD4_FN),
- PINMUX_DATA(IRQ3_MARK, PTD3_FN),
- PINMUX_DATA(IRQ2_MARK, PTD2_FN),
- PINMUX_DATA(IRQ1_MARK, PTD1_FN),
- PINMUX_DATA(IRQ0_MARK, PTD0_FN),
+ PINMUX_DATA(SP0_MOSI_MARK, PTD7_FN),
+ PINMUX_DATA(SP0_MISO_MARK, PTD6_FN),
+ PINMUX_DATA(SP0_SCK_MARK, PTD5_FN),
+ PINMUX_DATA(SP0_SCK_FB_MARK, PTD4_FN),
+ PINMUX_DATA(SP0_SS0_MARK, PTD3_FN),
+ PINMUX_DATA(SP0_SS1_MARK, PS1_10_FN1, PTD2_FN),
+ PINMUX_DATA(DREQ0_MARK, PS1_10_FN2, PTD2_FN),
+ PINMUX_DATA(SP0_SS2_MARK, PS1_9_FN1, PTD1_FN),
+ PINMUX_DATA(DACK0_MARK, PS1_9_FN2, PTD1_FN),
+ PINMUX_DATA(SP0_SS3_MARK, PS1_8_FN1, PTD0_FN),
+ PINMUX_DATA(TEND0_MARK, PS1_8_FN2, PTD0_FN),
/* PTE FN */
- PINMUX_DATA(ET0_CRS_DV_MARK, PTE7_FN),
- PINMUX_DATA(ET0_TXD1_MARK, PTE6_FN),
- PINMUX_DATA(ET0_TXD0_MARK, PTE5_FN),
- PINMUX_DATA(ET0_TX_EN_MARK, PTE4_FN),
- PINMUX_DATA(ET0_REF_CLK_MARK, PTE3_FN),
- PINMUX_DATA(ET0_RXD1_MARK, PTE2_FN),
- PINMUX_DATA(ET0_RXD0_MARK, PTE1_FN),
- PINMUX_DATA(ET0_RX_ER_MARK, PTE0_FN),
+ PINMUX_DATA(RMII0_CRS_DV_MARK, PTE7_FN),
+ PINMUX_DATA(RMII0_TXD1_MARK, PTE6_FN),
+ PINMUX_DATA(RMII0_TXD0_MARK, PTE5_FN),
+ PINMUX_DATA(RMII0_TXEN_MARK, PTE4_FN),
+ PINMUX_DATA(RMII0_REFCLK_MARK, PTE3_FN),
+ PINMUX_DATA(RMII0_RXD1_MARK, PTE2_FN),
+ PINMUX_DATA(RMII0_RXD0_MARK, PTE1_FN),
+ PINMUX_DATA(RMII0_RX_ER_MARK, PTE0_FN),
/* PTF FN */
- PINMUX_DATA(ET1_CRS_DV_MARK, PTF7_FN),
- PINMUX_DATA(ET1_TXD1_MARK, PTF6_FN),
- PINMUX_DATA(ET1_TXD0_MARK, PTF5_FN),
- PINMUX_DATA(ET1_TX_EN_MARK, PTF4_FN),
- PINMUX_DATA(ET1_REF_CLK_MARK, PTF3_FN),
- PINMUX_DATA(ET1_RXD1_MARK, PTF2_FN),
- PINMUX_DATA(ET1_RXD0_MARK, PTF1_FN),
- PINMUX_DATA(ET1_RX_ER_MARK, PTF0_FN),
+ PINMUX_DATA(RMII1_CRS_DV_MARK, PTF7_FN),
+ PINMUX_DATA(RMII1_TXD1_MARK, PTF6_FN),
+ PINMUX_DATA(RMII1_TXD0_MARK, PTF5_FN),
+ PINMUX_DATA(RMII1_TXEN_MARK, PTF4_FN),
+ PINMUX_DATA(RMII1_REFCLK_MARK, PTF3_FN),
+ PINMUX_DATA(RMII1_RXD1_MARK, PS1_2_FN1, PTF2_FN),
+ PINMUX_DATA(RAC_RI_MARK, PS1_2_FN2, PTF2_FN),
+ PINMUX_DATA(RMII1_RXD0_MARK, PTF1_FN),
+ PINMUX_DATA(RMII1_RX_ER_MARK, PTF0_FN),
/* PTG FN */
- PINMUX_DATA(PWX0_MARK, PTG7_FN),
- PINMUX_DATA(PWX1_MARK, PTG6_FN),
- PINMUX_DATA(STATUS0_MARK, PS2_13_FN1, PTG5_FN),
- PINMUX_DATA(PWX2_MARK, PS2_13_FN3, PTG5_FN),
- PINMUX_DATA(STATUS1_MARK, PS2_12_FN1, PTG4_FN),
- PINMUX_DATA(PWX3_MARK, PS2_12_FN3, PTG4_FN),
+ PINMUX_DATA(BOOTFMS_MARK, PTG7_FN),
+ PINMUX_DATA(BOOTWP_MARK, PTG6_FN),
+ PINMUX_DATA(A25_MARK, PS2_13_FN1, PTG5_FN),
+ PINMUX_DATA(MMCCLK_MARK, PS2_13_FN2, PTG5_FN),
+ PINMUX_DATA(A24_MARK, PS2_12_FN1, PTG4_FN),
+ PINMUX_DATA(MMCCMD_MARK, PS2_12_FN2, PTG4_FN),
PINMUX_DATA(SERIRQ_MARK, PTG3_FN),
- PINMUX_DATA(CLKRUN_MARK, PTG2_FN),
+ PINMUX_DATA(WDTOVF_MARK, PTG2_FN),
PINMUX_DATA(LPCPD_MARK, PTG1_FN),
PINMUX_DATA(LDRQ_MARK, PTG0_FN),
/* PTH FN */
- PINMUX_DATA(SP1_MOSI_MARK, PTH7_FN),
- PINMUX_DATA(SP1_MISO_MARK, PTH6_FN),
- PINMUX_DATA(SP1_SCK_MARK, PTH5_FN),
- PINMUX_DATA(SP1_SCK_FB_MARK, PTH4_FN),
+ PINMUX_DATA(SP1_MOSI_MARK, PS2_7_FN1, PTH7_FN),
+ PINMUX_DATA(TEND1_MARK, PS2_7_FN2, PTH7_FN),
+ PINMUX_DATA(SP1_MISO_MARK, PS2_6_FN1, PTH6_FN),
+ PINMUX_DATA(DREQ1_MARK, PS2_6_FN2, PTH6_FN),
+ PINMUX_DATA(SP1_SCK_MARK, PS2_5_FN1, PTH5_FN),
+ PINMUX_DATA(DACK1_MARK, PS2_5_FN2, PTH5_FN),
+ PINMUX_DATA(SP1_SCK_FB_MARK, PS2_4_FN1, PTH4_FN),
+ PINMUX_DATA(ADTRG1_MARK, PS2_4_FN2, PTH4_FN),
PINMUX_DATA(SP1_SS0_MARK, PTH3_FN),
- PINMUX_DATA(TCLK_MARK, PTH2_FN),
- PINMUX_DATA(RXD4_MARK, PS2_1_FN1, PTH1_FN),
- PINMUX_DATA(SP1_SS1_MARK, PS2_1_FN2, PTH1_FN),
- PINMUX_DATA(TXD4_MARK, PS2_0_FN1, PTH0_FN),
- PINMUX_DATA(SP0_SS1_MARK, PS2_0_FN2, PTH0_FN),
+ PINMUX_DATA(SP1_SS1_MARK, PS2_2_FN1, PTH2_FN),
+ PINMUX_DATA(ADTRG0_MARK, PS2_2_FN2, PTH2_FN),
+ PINMUX_DATA(WP_MARK, PTH1_FN),
+ PINMUX_DATA(FMS0_MARK, PTH0_FN),
/* PTI FN */
- PINMUX_DATA(IRQ15_MARK, PTI7_FN),
- PINMUX_DATA(IRQ14_MARK, PTI6_FN),
- PINMUX_DATA(IRQ13_MARK, PTI5_FN),
- PINMUX_DATA(IRQ12_MARK, PTI4_FN),
- PINMUX_DATA(IRQ11_MARK, PTI3_FN),
- PINMUX_DATA(IRQ10_MARK, PTI2_FN),
- PINMUX_DATA(IRQ9_MARK, PTI1_FN),
- PINMUX_DATA(IRQ8_MARK, PTI0_FN),
+ PINMUX_DATA(D15_MARK, PS3_15_FN1, PTI7_FN),
+ PINMUX_DATA(SD_WP_MARK, PS3_15_FN2, PTI7_FN),
+ PINMUX_DATA(D14_MARK, PS3_14_FN1, PTI6_FN),
+ PINMUX_DATA(SD_CD_MARK, PS3_14_FN2, PTI6_FN),
+ PINMUX_DATA(D13_MARK, PS3_13_FN1, PTI5_FN),
+ PINMUX_DATA(SD_CLK_MARK, PS3_13_FN2, PTI5_FN),
+ PINMUX_DATA(D12_MARK, PS3_12_FN1, PTI4_FN),
+ PINMUX_DATA(SD_CMD_MARK, PS3_12_FN2, PTI4_FN),
+ PINMUX_DATA(D11_MARK, PS3_11_FN1, PTI3_FN),
+ PINMUX_DATA(SD_D3_MARK, PS3_11_FN2, PTI3_FN),
+ PINMUX_DATA(D10_MARK, PS3_10_FN1, PTI2_FN),
+ PINMUX_DATA(SD_D2_MARK, PS3_10_FN2, PTI2_FN),
+ PINMUX_DATA(D9_MARK, PS3_9_FN1, PTI1_FN),
+ PINMUX_DATA(SD_D1_MARK, PS3_9_FN2, PTI1_FN),
+ PINMUX_DATA(D8_MARK, PS3_8_FN1, PTI0_FN),
+ PINMUX_DATA(SD_D0_MARK, PS3_8_FN2, PTI0_FN),
/* PTJ FN */
- PINMUX_DATA(RXD3_MARK, PTJ7_FN),
- PINMUX_DATA(TXD3_MARK, PTJ6_FN),
- PINMUX_DATA(RXD2_MARK, PTJ5_FN),
- PINMUX_DATA(TXD2_MARK, PTJ4_FN),
- PINMUX_DATA(COM1_TXD_MARK, PTJ3_FN),
- PINMUX_DATA(COM1_RXD_MARK, PTJ2_FN),
- PINMUX_DATA(COM1_RTS_MARK, PTJ1_FN),
- PINMUX_DATA(COM1_CTS_MARK, PTJ0_FN),
+ PINMUX_DATA(RTS3_MARK, PTJ6_FN),
+ PINMUX_DATA(CTS3_MARK, PTJ5_FN),
+ PINMUX_DATA(TXD3_MARK, PTJ4_FN),
+ PINMUX_DATA(RXD3_MARK, PTJ3_FN),
+ PINMUX_DATA(RTS4_MARK, PTJ2_FN),
+ PINMUX_DATA(RXD4_MARK, PTJ1_FN),
+ PINMUX_DATA(TXD4_MARK, PTJ0_FN),
/* PTK FN */
- PINMUX_DATA(COM2_TXD_MARK, PTK7_FN),
+ PINMUX_DATA(COM2_TXD_MARK, PS3_7_FN1, PTK7_FN),
+ PINMUX_DATA(SCK2_MARK, PS3_7_FN2, PTK7_FN),
PINMUX_DATA(COM2_RXD_MARK, PTK6_FN),
PINMUX_DATA(COM2_RTS_MARK, PTK5_FN),
PINMUX_DATA(COM2_CTS_MARK, PTK4_FN),
PINMUX_DATA(COM2_DTR_MARK, PTK3_FN),
- PINMUX_DATA(COM2_DSR_MARK, PTK2_FN),
- PINMUX_DATA(COM2_DCD_MARK, PTK1_FN),
- PINMUX_DATA(COM2_RI_MARK, PTK0_FN),
+ PINMUX_DATA(COM2_DSR_MARK, PS3_2_FN1, PTK2_FN),
+ PINMUX_DATA(SCK4_MARK, PS3_2_FN2, PTK2_FN),
+ PINMUX_DATA(COM2_DCD_MARK, PS3_1_FN1, PTK1_FN),
+ PINMUX_DATA(SCK3_MARK, PS3_1_FN2, PTK1_FN),
+ PINMUX_DATA(CLKOUT_MARK, PTK0_FN),
/* PTL FN */
- PINMUX_DATA(RAC_TXD_MARK, PTL7_FN),
- PINMUX_DATA(RAC_RXD_MARK, PTL6_FN),
- PINMUX_DATA(RAC_RTS_MARK, PTL5_FN),
- PINMUX_DATA(RAC_CTS_MARK, PTL4_FN),
+ PINMUX_DATA(RAC_RXD_MARK, PS4_14_FN1, PTL6_FN),
+ PINMUX_DATA(RXD2_MARK, PS4_14_FN2, PTL6_FN),
+ PINMUX_DATA(RAC_RTS_MARK, PS4_13_FN1, PTL5_FN),
+ PINMUX_DATA(CS5_MARK, PS4_13_FN2, PTL5_FN),
+ PINMUX_DATA(RAC_CTS_MARK, PS4_12_FN1, PTL4_FN),
+ PINMUX_DATA(CS6_MARK, PS4_12_FN2, PTL4_FN),
PINMUX_DATA(RAC_DTR_MARK, PTL3_FN),
- PINMUX_DATA(RAC_DSR_MARK, PTL2_FN),
- PINMUX_DATA(RAC_DCD_MARK, PTL1_FN),
- PINMUX_DATA(RAC_RI_MARK, PTL0_FN),
+ PINMUX_DATA(RAC_DSR_MARK, PS4_10_FN1, PTL2_FN),
+ PINMUX_DATA(AUDSYNC_MARK, PS4_10_FN2, PTL2_FN),
+ PINMUX_DATA(RAC_DCD_MARK, PS4_9_FN1, PTL1_FN),
+ PINMUX_DATA(AUDCK_MARK, PS4_9_FN2, PTL1_FN),
+ PINMUX_DATA(RAC_TXD_MARK, PS4_8_FN1, PTL0_FN),
+ PINMUX_DATA(TXD2_MARK, PS4_8_FN1, PTL0_FN),
/* PTM FN */
- PINMUX_DATA(WP_MARK, PTM6_FN),
- PINMUX_DATA(FMS0_MARK, PTM5_FN),
- PINMUX_DATA(FMS1_MARK, PTM4_FN),
+ PINMUX_DATA(CS4_MARK, PTM7_FN),
+ PINMUX_DATA(RD_MARK, PTM6_FN),
+ PINMUX_DATA(WE0_MARK, PTM7_FN),
+ PINMUX_DATA(CS0_MARK, PTM4_FN),
PINMUX_DATA(SDA6_MARK, PTM3_FN),
PINMUX_DATA(SCL6_MARK, PTM2_FN),
PINMUX_DATA(SDA7_MARK, PTM1_FN),
PINMUX_DATA(SCL7_MARK, PTM0_FN),
/* PTN FN */
- PINMUX_DATA(SCK2_MARK, PS4_15_FN1, PTN7_FN),
- PINMUX_DATA(EVENT7_MARK, PS4_15_FN2, PTN7_FN),
- PINMUX_DATA(RTS4_MARK, PS4_14_FN1, PTN6_FN),
- PINMUX_DATA(EVENT6_MARK, PS4_14_FN2, PTN6_FN),
- PINMUX_DATA(RTS3_MARK, PS4_13_FN1, PTN5_FN),
- PINMUX_DATA(EVENT5_MARK, PS4_13_FN2, PTN5_FN),
- PINMUX_DATA(RTS2_MARK, PS4_12_FN1, PTN4_FN),
- PINMUX_DATA(EVENT4_MARK, PS4_12_FN2, PTN4_FN),
- PINMUX_DATA(CTS4_MARK, PS4_11_FN1, PTN3_FN),
- PINMUX_DATA(EVENT3_MARK, PS4_11_FN2, PTN3_FN),
- PINMUX_DATA(CTS3_MARK, PS4_10_FN1, PTN2_FN),
- PINMUX_DATA(EVENT2_MARK, PS4_10_FN2, PTN2_FN),
- PINMUX_DATA(CTS2_MARK, PS4_9_FN1, PTN1_FN),
- PINMUX_DATA(EVENT1_MARK, PS4_9_FN2, PTN1_FN),
- PINMUX_DATA(EVENT0_MARK, PTN0_FN),
+ PINMUX_DATA(VBUS_EN_MARK, PTN6_FN),
+ PINMUX_DATA(VBUS_OC_MARK, PTN5_FN),
+ PINMUX_DATA(JMCTCK_MARK, PS4_4_FN1, PTN4_FN),
+ PINMUX_DATA(SGPIO1_CLK_MARK, PS4_4_FN2, PTN4_FN),
+ PINMUX_DATA(JMCTMS_MARK, PS4_3_FN1, PTN5_FN),
+ PINMUX_DATA(SGPIO1_LOAD_MARK, PS4_3_FN2, PTN5_FN),
+ PINMUX_DATA(JMCTDO_MARK, PS4_2_FN1, PTN2_FN),
+ PINMUX_DATA(SGPIO1_DO_MARK, PS4_2_FN2, PTN2_FN),
+ PINMUX_DATA(JMCTDI_MARK, PS4_1_FN1, PTN1_FN),
+ PINMUX_DATA(SGPIO1_DI_MARK, PS4_1_FN2, PTN1_FN),
+ PINMUX_DATA(JMCTRST_MARK, PS4_0_FN1, PTN0_FN),
+ PINMUX_DATA(SUB_CLKIN_MARK, PS4_0_FN2, PTN0_FN),
/* PTO FN */
PINMUX_DATA(SGPIO0_CLK_MARK, PTO7_FN),
PINMUX_DATA(SGPIO0_LOAD_MARK, PTO6_FN),
PINMUX_DATA(SGPIO0_DI_MARK, PTO5_FN),
PINMUX_DATA(SGPIO0_DO_MARK, PTO4_FN),
- PINMUX_DATA(SGPIO1_CLK_MARK, PTO3_FN),
- PINMUX_DATA(SGPIO1_LOAD_MARK, PTO2_FN),
- PINMUX_DATA(SGPIO1_DI_MARK, PTO1_FN),
- PINMUX_DATA(SGPIO1_DO_MARK, PTO0_FN),
+ PINMUX_DATA(SGPIO2_CLK_MARK, PS5_11_FN1, PTO3_FN),
+ PINMUX_DATA(COM1_TXD_MARK, PS5_11_FN2, PTO3_FN),
+ PINMUX_DATA(SGPIO2_LOAD_MARK, PS5_10_FN1, PTO2_FN),
+ PINMUX_DATA(COM1_RXD_MARK, PS5_10_FN2, PTO2_FN),
+ PINMUX_DATA(SGPIO2_DI_MARK, PS5_9_FN1, PTO1_FN),
+ PINMUX_DATA(COM1_RTS_MARK, PS5_9_FN2, PTO1_FN),
+ PINMUX_DATA(SGPIO2_DO_MARK, PS5_8_FN1, PTO0_FN),
+ PINMUX_DATA(COM1_CTS_MARK, PS5_8_FN2, PTO0_FN),
/* PTP FN */
- PINMUX_DATA(JMCTCK_MARK, PTP6_FN),
- PINMUX_DATA(JMCTMS_MARK, PTP5_FN),
- PINMUX_DATA(JMCTDO_MARK, PTP4_FN),
- PINMUX_DATA(JMCTDI_MARK, PTP3_FN),
- PINMUX_DATA(JMCRST_MARK, PTP2_FN),
- PINMUX_DATA(SCK4_MARK, PTP1_FN),
- PINMUX_DATA(SCK3_MARK, PTP0_FN),
/* PTQ FN */
PINMUX_DATA(LAD3_MARK, PTQ6_FN),
@@ -864,8 +977,8 @@ static pinmux_enum_t pinmux_data[] = {
PINMUX_DATA(LAD1_MARK, PTQ4_FN),
PINMUX_DATA(LAD0_MARK, PTQ3_FN),
PINMUX_DATA(LFRAME_MARK, PTQ2_FN),
- PINMUX_DATA(SCK4_MARK, PTQ1_FN),
- PINMUX_DATA(SCK3_MARK, PTQ0_FN),
+ PINMUX_DATA(LRESET_MARK, PTQ1_FN),
+ PINMUX_DATA(LCLK_MARK, PTQ0_FN),
/* PTR FN */
PINMUX_DATA(SDA8_MARK, PTR7_FN), /* DDC3? */
@@ -888,58 +1001,84 @@ static pinmux_enum_t pinmux_data[] = {
PINMUX_DATA(SCL3_MARK, PTS0_FN),
/* PTT FN */
- PINMUX_DATA(AUDSYNC_MARK, PTS5_FN),
- PINMUX_DATA(AUDCK_MARK, PTS4_FN),
- PINMUX_DATA(AUDATA3_MARK, PS4_3_FN1, PTS3_FN),
- PINMUX_DATA(PWX7_MARK, PS4_3_FN2, PTS3_FN),
- PINMUX_DATA(AUDATA2_MARK, PS4_2_FN1, PTS2_FN),
- PINMUX_DATA(PWX6_MARK, PS4_2_FN2, PTS2_FN),
- PINMUX_DATA(AUDATA1_MARK, PS4_1_FN1, PTS1_FN),
- PINMUX_DATA(PWX5_MARK, PS4_1_FN2, PTS1_FN),
- PINMUX_DATA(AUDATA0_MARK, PS4_0_FN1, PTS0_FN),
- PINMUX_DATA(PWX4_MARK, PS4_0_FN2, PTS0_FN),
+ PINMUX_DATA(PWMX7_MARK, PS5_7_FN1, PTT7_FN),
+ PINMUX_DATA(AUDATA3_MARK, PS5_7_FN2, PTT7_FN),
+ PINMUX_DATA(PWMX6_MARK, PS5_6_FN1, PTT6_FN),
+ PINMUX_DATA(AUDATA2_MARK, PS5_6_FN2, PTT6_FN),
+ PINMUX_DATA(PWMX5_MARK, PS5_5_FN1, PTT5_FN),
+ PINMUX_DATA(AUDATA1_MARK, PS5_5_FN2, PTT5_FN),
+ PINMUX_DATA(PWMX4_MARK, PS5_4_FN1, PTT4_FN),
+ PINMUX_DATA(AUDATA0_MARK, PS5_4_FN2, PTT4_FN),
+ PINMUX_DATA(PWMX3_MARK, PS5_3_FN1, PTT3_FN),
+ PINMUX_DATA(STATUS1_MARK, PS5_3_FN2, PTT3_FN),
+ PINMUX_DATA(PWMX2_MARK, PS5_2_FN1, PTT2_FN),
+ PINMUX_DATA(STATUS0_MARK, PS5_2_FN2, PTT2_FN),
+ PINMUX_DATA(PWMX1_MARK, PTT1_FN),
+ PINMUX_DATA(PWMX0_MARK, PTT0_FN),
/* PTU FN */
- PINMUX_DATA(CS6_MARK, PTU7_FN),
- PINMUX_DATA(CS5_MARK, PTU6_FN),
- PINMUX_DATA(CS4_MARK, PTU5_FN),
- PINMUX_DATA(CS0_MARK, PTU4_FN),
- PINMUX_DATA(RD_MARK, PTU3_FN),
- PINMUX_DATA(WE0_MARK, PTU2_FN),
- PINMUX_DATA(A25_MARK, PS5_9_FN1, PTU1_FN),
- PINMUX_DATA(DREQ0_MARK, PS5_9_FN2, PTU1_FN),
- PINMUX_DATA(A24_MARK, PS5_8_FN1, PTU0_FN),
- PINMUX_DATA(DACK0_MARK, PS5_8_FN2, PTU0_FN),
+ PINMUX_DATA(LGPIO7_MARK, PS6_15_FN1, PTU7_FN),
+ PINMUX_DATA(APMONCTL_O_MARK, PS6_15_FN2, PTU7_FN),
+ PINMUX_DATA(LGPIO6_MARK, PS6_14_FN1, PTU6_FN),
+ PINMUX_DATA(APMPWBTOUT_O_MARK, PS6_14_FN2, PTU6_FN),
+ PINMUX_DATA(LGPIO5_MARK, PS6_13_FN1, PTU5_FN),
+ PINMUX_DATA(APMSCI_O_MARK, PS6_13_FN2, PTU5_FN),
+ PINMUX_DATA(LGPIO4_MARK, PS6_12_FN1, PTU4_FN),
+ PINMUX_DATA(APMVDDON_MARK, PS6_12_FN2, PTU4_FN),
+ PINMUX_DATA(LGPIO3_MARK, PS6_11_FN1, PTU3_FN),
+ PINMUX_DATA(APMSLPBTN_MARK, PS6_11_FN2, PTU3_FN),
+ PINMUX_DATA(LGPIO2_MARK, PS6_10_FN1, PTU2_FN),
+ PINMUX_DATA(APMPWRBTN_MARK, PS6_10_FN2, PTU2_FN),
+ PINMUX_DATA(LGPIO1_MARK, PS6_9_FN1, PTU1_FN),
+ PINMUX_DATA(APMS5N_MARK, PS6_9_FN2, PTU1_FN),
+ PINMUX_DATA(LGPIO0_MARK, PS6_8_FN1, PTU0_FN),
+ PINMUX_DATA(APMS3N_MARK, PS6_8_FN2, PTU0_FN),
/* PTV FN */
- PINMUX_DATA(A23_MARK, PS5_7_FN1, PTV7_FN),
- PINMUX_DATA(TEND0_MARK, PS5_7_FN2, PTV7_FN),
- PINMUX_DATA(A22_MARK, PS5_6_FN1, PTV6_FN),
- PINMUX_DATA(DREQ1_MARK, PS5_6_FN2, PTV6_FN),
- PINMUX_DATA(A21_MARK, PS5_5_FN1, PTV5_FN),
- PINMUX_DATA(DACK1_MARK, PS5_5_FN2, PTV5_FN),
- PINMUX_DATA(A20_MARK, PS5_4_FN1, PTV4_FN),
- PINMUX_DATA(TEND1_MARK, PS5_4_FN2, PTV4_FN),
- PINMUX_DATA(A19_MARK, PTV3_FN),
- PINMUX_DATA(A18_MARK, PTV2_FN),
- PINMUX_DATA(A17_MARK, PTV1_FN),
- PINMUX_DATA(A16_MARK, PTV0_FN),
+ PINMUX_DATA(A23_MARK, PS6_7_FN1, PTV7_FN),
+ PINMUX_DATA(COM2_RI_MARK, PS6_7_FN2, PTV7_FN),
+ PINMUX_DATA(A22_MARK, PS6_6_FN1, PTV6_FN),
+ PINMUX_DATA(R_SPI_MOSI_MARK, PS6_6_FN2, PTV6_FN),
+ PINMUX_DATA(A21_MARK, PS6_5_FN1, PTV5_FN),
+ PINMUX_DATA(R_SPI_MISO_MARK, PS6_5_FN2, PTV5_FN),
+ PINMUX_DATA(A20_MARK, PS6_4_FN1, PTV4_FN),
+ PINMUX_DATA(R_SPI_RSPCK_MARK, PS6_4_FN2, PTV4_FN),
+ PINMUX_DATA(A19_MARK, PS6_3_FN1, PTV3_FN),
+ PINMUX_DATA(R_SPI_SSL0_MARK, PS6_3_FN2, PTV3_FN),
+ PINMUX_DATA(A18_MARK, PS6_2_FN1, PTV2_FN),
+ PINMUX_DATA(R_SPI_SSL1_MARK, PS6_2_FN2, PTV2_FN),
+ PINMUX_DATA(A17_MARK, PS6_1_FN1, PTV1_FN),
+ PINMUX_DATA(EVENT7_MARK, PS6_1_FN2, PTV1_FN),
+ PINMUX_DATA(A16_MARK, PS6_0_FN1, PTV0_FN),
+ PINMUX_DATA(EVENT6_MARK, PS6_0_FN1, PTV0_FN),
/* PTW FN */
- PINMUX_DATA(A15_MARK, PTW7_FN),
- PINMUX_DATA(A14_MARK, PTW6_FN),
- PINMUX_DATA(A13_MARK, PTW5_FN),
- PINMUX_DATA(A12_MARK, PTW4_FN),
- PINMUX_DATA(A11_MARK, PTW3_FN),
- PINMUX_DATA(A10_MARK, PTW2_FN),
- PINMUX_DATA(A9_MARK, PTW1_FN),
- PINMUX_DATA(A8_MARK, PTW0_FN),
+ PINMUX_DATA(A15_MARK, PS7_15_FN1, PTW7_FN),
+ PINMUX_DATA(EVENT5_MARK, PS7_15_FN2, PTW7_FN),
+ PINMUX_DATA(A14_MARK, PS7_14_FN1, PTW6_FN),
+ PINMUX_DATA(EVENT4_MARK, PS7_14_FN2, PTW6_FN),
+ PINMUX_DATA(A13_MARK, PS7_13_FN1, PTW5_FN),
+ PINMUX_DATA(EVENT3_MARK, PS7_13_FN2, PTW5_FN),
+ PINMUX_DATA(A12_MARK, PS7_12_FN1, PTW4_FN),
+ PINMUX_DATA(EVENT2_MARK, PS7_12_FN2, PTW4_FN),
+ PINMUX_DATA(A11_MARK, PS7_11_FN1, PTW3_FN),
+ PINMUX_DATA(EVENT1_MARK, PS7_11_FN2, PTW3_FN),
+ PINMUX_DATA(A10_MARK, PS7_10_FN1, PTW2_FN),
+ PINMUX_DATA(EVENT0_MARK, PS7_10_FN2, PTW2_FN),
+ PINMUX_DATA(A9_MARK, PS7_9_FN1, PTW1_FN),
+ PINMUX_DATA(CTS4_MARK, PS7_9_FN2, PTW1_FN),
+ PINMUX_DATA(A8_MARK, PS7_8_FN1, PTW0_FN),
+ PINMUX_DATA(CTS2_MARK, PS7_8_FN2, PTW0_FN),
/* PTX FN */
- PINMUX_DATA(A7_MARK, PTX7_FN),
- PINMUX_DATA(A6_MARK, PTX6_FN),
- PINMUX_DATA(A5_MARK, PTX5_FN),
- PINMUX_DATA(A4_MARK, PTX4_FN),
+ PINMUX_DATA(A7_MARK, PS7_7_FN1, PTX7_FN),
+ PINMUX_DATA(RTS2_MARK, PS7_7_FN2, PTX7_FN),
+ PINMUX_DATA(A6_MARK, PS7_6_FN1, PTX6_FN),
+ PINMUX_DATA(SIM_D_MARK, PS7_6_FN2, PTX6_FN),
+ PINMUX_DATA(A5_MARK, PS7_5_FN1, PTX5_FN),
+ PINMUX_DATA(SIM_CLK_MARK, PS7_5_FN2, PTX5_FN),
+ PINMUX_DATA(A4_MARK, PS7_4_FN1, PTX4_FN),
+ PINMUX_DATA(SIM_RST_MARK, PS7_4_FN2, PTX4_FN),
PINMUX_DATA(A3_MARK, PTX3_FN),
PINMUX_DATA(A2_MARK, PTX2_FN),
PINMUX_DATA(A1_MARK, PTX1_FN),
@@ -954,6 +1093,24 @@ static pinmux_enum_t pinmux_data[] = {
PINMUX_DATA(D2_MARK, PTY2_FN),
PINMUX_DATA(D1_MARK, PTY1_FN),
PINMUX_DATA(D0_MARK, PTY0_FN),
+
+ /* PTZ FN */
+ PINMUX_DATA(MMCDAT7_MARK, PS8_15_FN1, PTZ7_FN),
+ PINMUX_DATA(ON_DQ7_MARK, PS8_15_FN2, PTZ7_FN),
+ PINMUX_DATA(MMCDAT6_MARK, PS8_14_FN1, PTZ6_FN),
+ PINMUX_DATA(ON_DQ6_MARK, PS8_14_FN2, PTZ6_FN),
+ PINMUX_DATA(MMCDAT5_MARK, PS8_13_FN1, PTZ5_FN),
+ PINMUX_DATA(ON_DQ5_MARK, PS8_13_FN2, PTZ5_FN),
+ PINMUX_DATA(MMCDAT4_MARK, PS8_12_FN1, PTZ4_FN),
+ PINMUX_DATA(ON_DQ4_MARK, PS8_12_FN2, PTZ4_FN),
+ PINMUX_DATA(MMCDAT3_MARK, PS8_11_FN1, PTZ3_FN),
+ PINMUX_DATA(ON_DQ3_MARK, PS8_11_FN2, PTZ3_FN),
+ PINMUX_DATA(MMCDAT2_MARK, PS8_10_FN1, PTZ2_FN),
+ PINMUX_DATA(ON_DQ2_MARK, PS8_10_FN2, PTZ2_FN),
+ PINMUX_DATA(MMCDAT1_MARK, PS8_9_FN1, PTZ1_FN),
+ PINMUX_DATA(ON_DQ1_MARK, PS8_9_FN2, PTZ1_FN),
+ PINMUX_DATA(MMCDAT0_MARK, PS8_8_FN1, PTZ0_FN),
+ PINMUX_DATA(ON_DQ0_MARK, PS8_8_FN2, PTZ0_FN),
};
static struct pinmux_gpio pinmux_gpios[] = {
@@ -1048,7 +1205,6 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_PTI0, PTI0_DATA),
/* PTJ */
- PINMUX_GPIO(GPIO_PTJ7, PTJ7_DATA),
PINMUX_GPIO(GPIO_PTJ6, PTJ6_DATA),
PINMUX_GPIO(GPIO_PTJ5, PTJ5_DATA),
PINMUX_GPIO(GPIO_PTJ4, PTJ4_DATA),
@@ -1068,7 +1224,6 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_PTK0, PTK0_DATA),
/* PTL */
- PINMUX_GPIO(GPIO_PTL7, PTL7_DATA),
PINMUX_GPIO(GPIO_PTL6, PTL6_DATA),
PINMUX_GPIO(GPIO_PTL5, PTL5_DATA),
PINMUX_GPIO(GPIO_PTL4, PTL4_DATA),
@@ -1078,6 +1233,7 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_PTL0, PTL0_DATA),
/* PTM */
+ PINMUX_GPIO(GPIO_PTM7, PTM7_DATA),
PINMUX_GPIO(GPIO_PTM6, PTM6_DATA),
PINMUX_GPIO(GPIO_PTM5, PTM5_DATA),
PINMUX_GPIO(GPIO_PTM4, PTM4_DATA),
@@ -1087,7 +1243,6 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_PTM0, PTM0_DATA),
/* PTN */
- PINMUX_GPIO(GPIO_PTN7, PTN7_DATA),
PINMUX_GPIO(GPIO_PTN6, PTN6_DATA),
PINMUX_GPIO(GPIO_PTN5, PTN5_DATA),
PINMUX_GPIO(GPIO_PTN4, PTN4_DATA),
@@ -1107,6 +1262,7 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_PTO0, PTO0_DATA),
/* PTP */
+ PINMUX_GPIO(GPIO_PTP7, PTP7_DATA),
PINMUX_GPIO(GPIO_PTP6, PTP6_DATA),
PINMUX_GPIO(GPIO_PTP5, PTP5_DATA),
PINMUX_GPIO(GPIO_PTP4, PTP4_DATA),
@@ -1145,6 +1301,8 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_PTS0, PTS0_DATA),
/* PTT */
+ PINMUX_GPIO(GPIO_PTT7, PTT7_DATA),
+ PINMUX_GPIO(GPIO_PTT6, PTT6_DATA),
PINMUX_GPIO(GPIO_PTT5, PTT5_DATA),
PINMUX_GPIO(GPIO_PTT4, PTT4_DATA),
PINMUX_GPIO(GPIO_PTT3, PTT3_DATA),
@@ -1212,54 +1370,35 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_PTZ1, PTZ1_DATA),
PINMUX_GPIO(GPIO_PTZ0, PTZ0_DATA),
- /* PTA (mobule: LBSC, CPG, LPC) */
+ /* PTA (mobule: LBSC, RGMII) */
PINMUX_GPIO(GPIO_FN_BS, BS_MARK),
PINMUX_GPIO(GPIO_FN_RDWR, RDWR_MARK),
PINMUX_GPIO(GPIO_FN_WE1, WE1_MARK),
PINMUX_GPIO(GPIO_FN_RDY, RDY_MARK),
- PINMUX_GPIO(GPIO_FN_MD10, MD10_MARK),
- PINMUX_GPIO(GPIO_FN_MD9, MD9_MARK),
- PINMUX_GPIO(GPIO_FN_MD8, MD8_MARK),
- PINMUX_GPIO(GPIO_FN_LGPIO7, LGPIO7_MARK),
- PINMUX_GPIO(GPIO_FN_LGPIO6, LGPIO6_MARK),
- PINMUX_GPIO(GPIO_FN_LGPIO5, LGPIO5_MARK),
- PINMUX_GPIO(GPIO_FN_LGPIO4, LGPIO4_MARK),
- PINMUX_GPIO(GPIO_FN_LGPIO3, LGPIO3_MARK),
- PINMUX_GPIO(GPIO_FN_LGPIO2, LGPIO2_MARK),
- PINMUX_GPIO(GPIO_FN_LGPIO1, LGPIO1_MARK),
- PINMUX_GPIO(GPIO_FN_LGPIO0, LGPIO0_MARK),
-
- /* PTB (mobule: LBSC, EtherC, SIM, LPC) */
- PINMUX_GPIO(GPIO_FN_D15, D15_MARK),
- PINMUX_GPIO(GPIO_FN_D14, D14_MARK),
- PINMUX_GPIO(GPIO_FN_D13, D13_MARK),
- PINMUX_GPIO(GPIO_FN_D12, D12_MARK),
- PINMUX_GPIO(GPIO_FN_D11, D11_MARK),
- PINMUX_GPIO(GPIO_FN_D10, D10_MARK),
- PINMUX_GPIO(GPIO_FN_D9, D9_MARK),
- PINMUX_GPIO(GPIO_FN_D8, D8_MARK),
PINMUX_GPIO(GPIO_FN_ET0_MDC, ET0_MDC_MARK),
- PINMUX_GPIO(GPIO_FN_ET0_MDIO, ET0_MDIO_MARK),
+ PINMUX_GPIO(GPIO_FN_ET0_MDIO, ET0_MDC_MARK),
PINMUX_GPIO(GPIO_FN_ET1_MDC, ET1_MDC_MARK),
- PINMUX_GPIO(GPIO_FN_ET1_MDIO, ET1_MDIO_MARK),
- PINMUX_GPIO(GPIO_FN_WPSZ1, WPSZ1_MARK),
- PINMUX_GPIO(GPIO_FN_WPSZ0, WPSZ0_MARK),
- PINMUX_GPIO(GPIO_FN_FWID, FWID_MARK),
- PINMUX_GPIO(GPIO_FN_FLSHSZ, FLSHSZ_MARK),
- PINMUX_GPIO(GPIO_FN_LPC_SPIEN, LPC_SPIEN_MARK),
- PINMUX_GPIO(GPIO_FN_BASEL, BASEL_MARK),
-
- /* PTC (mobule: SD) */
- PINMUX_GPIO(GPIO_FN_SD_WP, SD_WP_MARK),
- PINMUX_GPIO(GPIO_FN_SD_CD, SD_CD_MARK),
- PINMUX_GPIO(GPIO_FN_SD_CLK, SD_CLK_MARK),
- PINMUX_GPIO(GPIO_FN_SD_CMD, SD_CMD_MARK),
- PINMUX_GPIO(GPIO_FN_SD_D3, SD_D3_MARK),
- PINMUX_GPIO(GPIO_FN_SD_D2, SD_D2_MARK),
- PINMUX_GPIO(GPIO_FN_SD_D1, SD_D1_MARK),
- PINMUX_GPIO(GPIO_FN_SD_D0, SD_D0_MARK),
+ PINMUX_GPIO(GPIO_FN_ET1_MDIO, ET1_MDC_MARK),
- /* PTD (mobule: INTC, SPI0, LBSC, CPG, ADC) */
+ /* PTB (mobule: INTC, ONFI, TMU) */
+ PINMUX_GPIO(GPIO_FN_IRQ15, IRQ15_MARK),
+ PINMUX_GPIO(GPIO_FN_IRQ14, IRQ14_MARK),
+ PINMUX_GPIO(GPIO_FN_IRQ13, IRQ13_MARK),
+ PINMUX_GPIO(GPIO_FN_IRQ12, IRQ12_MARK),
+ PINMUX_GPIO(GPIO_FN_IRQ11, IRQ11_MARK),
+ PINMUX_GPIO(GPIO_FN_IRQ10, IRQ10_MARK),
+ PINMUX_GPIO(GPIO_FN_IRQ9, IRQ9_MARK),
+ PINMUX_GPIO(GPIO_FN_IRQ8, IRQ8_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_NRE, ON_NRE_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_NWE, ON_NWE_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_NWP, ON_NWP_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_NCE0, ON_NCE0_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_R_B0, ON_R_B0_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_ALE, ON_ALE_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_CLE, ON_CLE_MARK),
+ PINMUX_GPIO(GPIO_FN_TCLK, TCLK_MARK),
+
+ /* PTC (mobule: IRQ, PWMU) */
PINMUX_GPIO(GPIO_FN_IRQ7, IRQ7_MARK),
PINMUX_GPIO(GPIO_FN_IRQ6, IRQ6_MARK),
PINMUX_GPIO(GPIO_FN_IRQ5, IRQ5_MARK),
@@ -1268,80 +1407,102 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_FN_IRQ2, IRQ2_MARK),
PINMUX_GPIO(GPIO_FN_IRQ1, IRQ1_MARK),
PINMUX_GPIO(GPIO_FN_IRQ0, IRQ0_MARK),
- PINMUX_GPIO(GPIO_FN_MD6, MD6_MARK),
- PINMUX_GPIO(GPIO_FN_MD5, MD5_MARK),
- PINMUX_GPIO(GPIO_FN_MD3, MD3_MARK),
- PINMUX_GPIO(GPIO_FN_MD2, MD2_MARK),
- PINMUX_GPIO(GPIO_FN_MD1, MD1_MARK),
- PINMUX_GPIO(GPIO_FN_MD0, MD0_MARK),
- PINMUX_GPIO(GPIO_FN_ADTRG1, ADTRG1_MARK),
- PINMUX_GPIO(GPIO_FN_ADTRG0, ADTRG0_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMU0, PWMU0_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMU1, PWMU1_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMU2, PWMU2_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMU3, PWMU3_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMU4, PWMU4_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMU5, PWMU5_MARK),
+
+ /* PTD (mobule: SPI0, DMAC) */
+ PINMUX_GPIO(GPIO_FN_SP0_MOSI, SP0_MOSI_MARK),
+ PINMUX_GPIO(GPIO_FN_SP0_MISO, SP0_MISO_MARK),
+ PINMUX_GPIO(GPIO_FN_SP0_SCK, SP0_SCK_MARK),
+ PINMUX_GPIO(GPIO_FN_SP0_SCK_FB, SP0_SCK_FB_MARK),
+ PINMUX_GPIO(GPIO_FN_SP0_SS0, SP0_SS0_MARK),
+ PINMUX_GPIO(GPIO_FN_SP0_SS1, SP0_SS1_MARK),
+ PINMUX_GPIO(GPIO_FN_SP0_SS2, SP0_SS2_MARK),
+ PINMUX_GPIO(GPIO_FN_SP0_SS3, SP0_SS3_MARK),
+ PINMUX_GPIO(GPIO_FN_DREQ0, DREQ0_MARK),
+ PINMUX_GPIO(GPIO_FN_DACK0, DACK0_MARK),
+ PINMUX_GPIO(GPIO_FN_TEND0, TEND0_MARK),
- /* PTE (mobule: EtherC) */
- PINMUX_GPIO(GPIO_FN_ET0_CRS_DV, ET0_CRS_DV_MARK),
- PINMUX_GPIO(GPIO_FN_ET0_TXD1, ET0_TXD1_MARK),
- PINMUX_GPIO(GPIO_FN_ET0_TXD0, ET0_TXD0_MARK),
- PINMUX_GPIO(GPIO_FN_ET0_TX_EN, ET0_TX_EN_MARK),
- PINMUX_GPIO(GPIO_FN_ET0_REF_CLK, ET0_REF_CLK_MARK),
- PINMUX_GPIO(GPIO_FN_ET0_RXD1, ET0_RXD1_MARK),
- PINMUX_GPIO(GPIO_FN_ET0_RXD0, ET0_RXD0_MARK),
- PINMUX_GPIO(GPIO_FN_ET0_RX_ER, ET0_RX_ER_MARK),
-
- /* PTF (mobule: EtherC) */
- PINMUX_GPIO(GPIO_FN_ET1_CRS_DV, ET1_CRS_DV_MARK),
- PINMUX_GPIO(GPIO_FN_ET1_TXD1, ET1_TXD1_MARK),
- PINMUX_GPIO(GPIO_FN_ET1_TXD0, ET1_TXD0_MARK),
- PINMUX_GPIO(GPIO_FN_ET1_TX_EN, ET1_TX_EN_MARK),
- PINMUX_GPIO(GPIO_FN_ET1_REF_CLK, ET1_REF_CLK_MARK),
- PINMUX_GPIO(GPIO_FN_ET1_RXD1, ET1_RXD1_MARK),
- PINMUX_GPIO(GPIO_FN_ET1_RXD0, ET1_RXD0_MARK),
- PINMUX_GPIO(GPIO_FN_ET1_RX_ER, ET1_RX_ER_MARK),
-
- /* PTG (mobule: SYSTEM, PWMX, LPC) */
- PINMUX_GPIO(GPIO_FN_STATUS0, STATUS0_MARK),
- PINMUX_GPIO(GPIO_FN_STATUS1, STATUS1_MARK),
- PINMUX_GPIO(GPIO_FN_PWX0, PWX0_MARK),
- PINMUX_GPIO(GPIO_FN_PWX1, PWX1_MARK),
- PINMUX_GPIO(GPIO_FN_PWX2, PWX2_MARK),
- PINMUX_GPIO(GPIO_FN_PWX3, PWX3_MARK),
+ /* PTE (mobule: RMII) */
+ PINMUX_GPIO(GPIO_FN_RMII0_CRS_DV, RMII0_CRS_DV_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII0_TXD1, RMII0_TXD1_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII0_TXD0, RMII0_TXD0_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII0_TXEN, RMII0_TXEN_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII0_REFCLK, RMII0_REFCLK_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII0_RXD1, RMII0_RXD1_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII0_RXD0, RMII0_RXD0_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII0_RX_ER, RMII0_RX_ER_MARK),
+
+ /* PTF (mobule: RMII, SerMux) */
+ PINMUX_GPIO(GPIO_FN_RMII1_CRS_DV, RMII1_CRS_DV_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII1_TXD1, RMII1_TXD1_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII1_TXD0, RMII1_TXD0_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII1_TXEN, RMII1_TXEN_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII1_REFCLK, RMII1_REFCLK_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII1_RXD1, RMII1_RXD1_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII1_RXD0, RMII1_RXD0_MARK),
+ PINMUX_GPIO(GPIO_FN_RMII1_RX_ER, RMII1_RX_ER_MARK),
+ PINMUX_GPIO(GPIO_FN_RAC_RI, RAC_RI_MARK),
+
+ /* PTG (mobule: system, LBSC, LPC, WDT, LPC, eMMC) */
+ PINMUX_GPIO(GPIO_FN_BOOTFMS, BOOTFMS_MARK),
+ PINMUX_GPIO(GPIO_FN_BOOTWP, BOOTWP_MARK),
+ PINMUX_GPIO(GPIO_FN_A25, A25_MARK),
+ PINMUX_GPIO(GPIO_FN_A24, A24_MARK),
PINMUX_GPIO(GPIO_FN_SERIRQ, SERIRQ_MARK),
- PINMUX_GPIO(GPIO_FN_CLKRUN, CLKRUN_MARK),
+ PINMUX_GPIO(GPIO_FN_WDTOVF, WDTOVF_MARK),
PINMUX_GPIO(GPIO_FN_LPCPD, LPCPD_MARK),
PINMUX_GPIO(GPIO_FN_LDRQ, LDRQ_MARK),
+ PINMUX_GPIO(GPIO_FN_MMCCLK, MMCCLK_MARK),
+ PINMUX_GPIO(GPIO_FN_MMCCMD, MMCCMD_MARK),
- /* PTH (mobule: TMU, SCIF234, SPI1, SPI0) */
- PINMUX_GPIO(GPIO_FN_TCLK, TCLK_MARK),
- PINMUX_GPIO(GPIO_FN_RXD4, RXD4_MARK),
- PINMUX_GPIO(GPIO_FN_TXD4, TXD4_MARK),
+ /* PTH (mobule: SPI1, LPC, DMAC, ADC) */
PINMUX_GPIO(GPIO_FN_SP1_MOSI, SP1_MOSI_MARK),
PINMUX_GPIO(GPIO_FN_SP1_MISO, SP1_MISO_MARK),
PINMUX_GPIO(GPIO_FN_SP1_SCK, SP1_SCK_MARK),
PINMUX_GPIO(GPIO_FN_SP1_SCK_FB, SP1_SCK_FB_MARK),
PINMUX_GPIO(GPIO_FN_SP1_SS0, SP1_SS0_MARK),
PINMUX_GPIO(GPIO_FN_SP1_SS1, SP1_SS1_MARK),
- PINMUX_GPIO(GPIO_FN_SP0_SS1, SP0_SS1_MARK),
+ PINMUX_GPIO(GPIO_FN_WP, WP_MARK),
+ PINMUX_GPIO(GPIO_FN_FMS0, FMS0_MARK),
+ PINMUX_GPIO(GPIO_FN_TEND1, TEND1_MARK),
+ PINMUX_GPIO(GPIO_FN_DREQ1, DREQ1_MARK),
+ PINMUX_GPIO(GPIO_FN_DACK1, DACK1_MARK),
+ PINMUX_GPIO(GPIO_FN_ADTRG1, ADTRG1_MARK),
+ PINMUX_GPIO(GPIO_FN_ADTRG0, ADTRG0_MARK),
- /* PTI (mobule: INTC) */
- PINMUX_GPIO(GPIO_FN_IRQ15, IRQ15_MARK),
- PINMUX_GPIO(GPIO_FN_IRQ14, IRQ14_MARK),
- PINMUX_GPIO(GPIO_FN_IRQ13, IRQ13_MARK),
- PINMUX_GPIO(GPIO_FN_IRQ12, IRQ12_MARK),
- PINMUX_GPIO(GPIO_FN_IRQ11, IRQ11_MARK),
- PINMUX_GPIO(GPIO_FN_IRQ10, IRQ10_MARK),
- PINMUX_GPIO(GPIO_FN_IRQ9, IRQ9_MARK),
- PINMUX_GPIO(GPIO_FN_IRQ8, IRQ8_MARK),
+ /* PTI (mobule: LBSC, SDHI) */
+ PINMUX_GPIO(GPIO_FN_D15, D15_MARK),
+ PINMUX_GPIO(GPIO_FN_D14, D14_MARK),
+ PINMUX_GPIO(GPIO_FN_D13, D13_MARK),
+ PINMUX_GPIO(GPIO_FN_D12, D12_MARK),
+ PINMUX_GPIO(GPIO_FN_D11, D11_MARK),
+ PINMUX_GPIO(GPIO_FN_D10, D10_MARK),
+ PINMUX_GPIO(GPIO_FN_D9, D9_MARK),
+ PINMUX_GPIO(GPIO_FN_D8, D8_MARK),
+ PINMUX_GPIO(GPIO_FN_SD_WP, SD_WP_MARK),
+ PINMUX_GPIO(GPIO_FN_SD_CD, SD_CD_MARK),
+ PINMUX_GPIO(GPIO_FN_SD_CLK, SD_CLK_MARK),
+ PINMUX_GPIO(GPIO_FN_SD_CMD, SD_CMD_MARK),
+ PINMUX_GPIO(GPIO_FN_SD_D3, SD_D3_MARK),
+ PINMUX_GPIO(GPIO_FN_SD_D2, SD_D2_MARK),
+ PINMUX_GPIO(GPIO_FN_SD_D1, SD_D1_MARK),
+ PINMUX_GPIO(GPIO_FN_SD_D0, SD_D0_MARK),
/* PTJ (mobule: SCIF234, SERMUX) */
- PINMUX_GPIO(GPIO_FN_RXD3, RXD3_MARK),
+ PINMUX_GPIO(GPIO_FN_RTS3, RTS3_MARK),
+ PINMUX_GPIO(GPIO_FN_CTS3, CTS3_MARK),
PINMUX_GPIO(GPIO_FN_TXD3, TXD3_MARK),
- PINMUX_GPIO(GPIO_FN_RXD2, RXD2_MARK),
- PINMUX_GPIO(GPIO_FN_TXD2, TXD2_MARK),
- PINMUX_GPIO(GPIO_FN_COM1_TXD, COM1_TXD_MARK),
- PINMUX_GPIO(GPIO_FN_COM1_RXD, COM1_RXD_MARK),
- PINMUX_GPIO(GPIO_FN_COM1_RTS, COM1_RTS_MARK),
- PINMUX_GPIO(GPIO_FN_COM1_CTS, COM1_CTS_MARK),
+ PINMUX_GPIO(GPIO_FN_RXD3, RXD3_MARK),
+ PINMUX_GPIO(GPIO_FN_RTS4, RTS4_MARK),
+ PINMUX_GPIO(GPIO_FN_RXD4, RXD4_MARK),
+ PINMUX_GPIO(GPIO_FN_TXD4, TXD4_MARK),
- /* PTK (mobule: SERMUX) */
+ /* PTK (mobule: SERMUX, LBSC, SCIF) */
PINMUX_GPIO(GPIO_FN_COM2_TXD, COM2_TXD_MARK),
PINMUX_GPIO(GPIO_FN_COM2_RXD, COM2_RXD_MARK),
PINMUX_GPIO(GPIO_FN_COM2_RTS, COM2_RTS_MARK),
@@ -1349,62 +1510,65 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_FN_COM2_DTR, COM2_DTR_MARK),
PINMUX_GPIO(GPIO_FN_COM2_DSR, COM2_DSR_MARK),
PINMUX_GPIO(GPIO_FN_COM2_DCD, COM2_DCD_MARK),
- PINMUX_GPIO(GPIO_FN_COM2_RI, COM2_RI_MARK),
+ PINMUX_GPIO(GPIO_FN_CLKOUT, CLKOUT_MARK),
+ PINMUX_GPIO(GPIO_FN_SCK2, SCK2_MARK),
+ PINMUX_GPIO(GPIO_FN_SCK4, SCK4_MARK),
+ PINMUX_GPIO(GPIO_FN_SCK3, SCK3_MARK),
- /* PTL (mobule: SERMUX) */
- PINMUX_GPIO(GPIO_FN_RAC_TXD, RAC_TXD_MARK),
+ /* PTL (mobule: SERMUX, SCIF, LBSC, AUD) */
PINMUX_GPIO(GPIO_FN_RAC_RXD, RAC_RXD_MARK),
PINMUX_GPIO(GPIO_FN_RAC_RTS, RAC_RTS_MARK),
PINMUX_GPIO(GPIO_FN_RAC_CTS, RAC_CTS_MARK),
PINMUX_GPIO(GPIO_FN_RAC_DTR, RAC_DTR_MARK),
PINMUX_GPIO(GPIO_FN_RAC_DSR, RAC_DSR_MARK),
PINMUX_GPIO(GPIO_FN_RAC_DCD, RAC_DCD_MARK),
- PINMUX_GPIO(GPIO_FN_RAC_RI, RAC_RI_MARK),
+ PINMUX_GPIO(GPIO_FN_RAC_TXD, RAC_TXD_MARK),
+ PINMUX_GPIO(GPIO_FN_RXD2, RXD2_MARK),
+ PINMUX_GPIO(GPIO_FN_CS5, CS5_MARK),
+ PINMUX_GPIO(GPIO_FN_CS6, CS6_MARK),
+ PINMUX_GPIO(GPIO_FN_AUDSYNC, AUDSYNC_MARK),
+ PINMUX_GPIO(GPIO_FN_AUDCK, AUDCK_MARK),
+ PINMUX_GPIO(GPIO_FN_TXD2, TXD2_MARK),
- /* PTM (mobule: IIC, LPC) */
+ /* PTM (mobule: LBSC, IIC) */
+ PINMUX_GPIO(GPIO_FN_CS4, CS4_MARK),
+ PINMUX_GPIO(GPIO_FN_RD, RD_MARK),
+ PINMUX_GPIO(GPIO_FN_WE0, WE0_MARK),
+ PINMUX_GPIO(GPIO_FN_CS0, CS0_MARK),
PINMUX_GPIO(GPIO_FN_SDA6, SDA6_MARK),
PINMUX_GPIO(GPIO_FN_SCL6, SCL6_MARK),
PINMUX_GPIO(GPIO_FN_SDA7, SDA7_MARK),
PINMUX_GPIO(GPIO_FN_SCL7, SCL7_MARK),
- PINMUX_GPIO(GPIO_FN_WP, WP_MARK),
- PINMUX_GPIO(GPIO_FN_FMS0, FMS0_MARK),
- PINMUX_GPIO(GPIO_FN_FMS1, FMS1_MARK),
- /* PTN (mobule: SCIF234, EVC) */
- PINMUX_GPIO(GPIO_FN_SCK2, SCK2_MARK),
- PINMUX_GPIO(GPIO_FN_RTS4, RTS4_MARK),
- PINMUX_GPIO(GPIO_FN_RTS3, RTS3_MARK),
- PINMUX_GPIO(GPIO_FN_RTS2, RTS2_MARK),
- PINMUX_GPIO(GPIO_FN_CTS4, CTS4_MARK),
- PINMUX_GPIO(GPIO_FN_CTS3, CTS3_MARK),
- PINMUX_GPIO(GPIO_FN_CTS2, CTS2_MARK),
- PINMUX_GPIO(GPIO_FN_EVENT7, EVENT7_MARK),
- PINMUX_GPIO(GPIO_FN_EVENT6, EVENT6_MARK),
- PINMUX_GPIO(GPIO_FN_EVENT5, EVENT5_MARK),
- PINMUX_GPIO(GPIO_FN_EVENT4, EVENT4_MARK),
- PINMUX_GPIO(GPIO_FN_EVENT3, EVENT3_MARK),
- PINMUX_GPIO(GPIO_FN_EVENT2, EVENT2_MARK),
- PINMUX_GPIO(GPIO_FN_EVENT1, EVENT1_MARK),
- PINMUX_GPIO(GPIO_FN_EVENT0, EVENT0_MARK),
+ /* PTN (mobule: USB, JMC, SGPIO, WDT) */
+ PINMUX_GPIO(GPIO_FN_VBUS_EN, VBUS_EN_MARK),
+ PINMUX_GPIO(GPIO_FN_VBUS_OC, VBUS_OC_MARK),
+ PINMUX_GPIO(GPIO_FN_JMCTCK, JMCTCK_MARK),
+ PINMUX_GPIO(GPIO_FN_JMCTMS, JMCTMS_MARK),
+ PINMUX_GPIO(GPIO_FN_JMCTDO, JMCTDO_MARK),
+ PINMUX_GPIO(GPIO_FN_JMCTDI, JMCTDI_MARK),
+ PINMUX_GPIO(GPIO_FN_JMCTRST, JMCTRST_MARK),
+ PINMUX_GPIO(GPIO_FN_SGPIO1_CLK, SGPIO1_CLK_MARK),
+ PINMUX_GPIO(GPIO_FN_SGPIO1_LOAD, SGPIO1_LOAD_MARK),
+ PINMUX_GPIO(GPIO_FN_SGPIO1_DI, SGPIO1_DI_MARK),
+ PINMUX_GPIO(GPIO_FN_SGPIO1_DO, SGPIO1_DO_MARK),
+ PINMUX_GPIO(GPIO_FN_SUB_CLKIN, SUB_CLKIN_MARK),
- /* PTO (mobule: SGPIO) */
+ /* PTO (mobule: SGPIO, SerMux) */
PINMUX_GPIO(GPIO_FN_SGPIO0_CLK, SGPIO0_CLK_MARK),
PINMUX_GPIO(GPIO_FN_SGPIO0_LOAD, SGPIO0_LOAD_MARK),
PINMUX_GPIO(GPIO_FN_SGPIO0_DI, SGPIO0_DI_MARK),
PINMUX_GPIO(GPIO_FN_SGPIO0_DO, SGPIO0_DO_MARK),
- PINMUX_GPIO(GPIO_FN_SGPIO1_CLK, SGPIO1_CLK_MARK),
- PINMUX_GPIO(GPIO_FN_SGPIO1_LOAD, SGPIO1_LOAD_MARK),
- PINMUX_GPIO(GPIO_FN_SGPIO1_DI, SGPIO1_DI_MARK),
- PINMUX_GPIO(GPIO_FN_SGPIO1_DO, SGPIO1_DO_MARK),
+ PINMUX_GPIO(GPIO_FN_SGPIO2_CLK, SGPIO2_CLK_MARK),
+ PINMUX_GPIO(GPIO_FN_SGPIO2_LOAD, SGPIO2_LOAD_MARK),
+ PINMUX_GPIO(GPIO_FN_SGPIO2_DI, SGPIO2_DI_MARK),
+ PINMUX_GPIO(GPIO_FN_SGPIO2_DO, SGPIO2_DO_MARK),
+ PINMUX_GPIO(GPIO_FN_COM1_TXD, COM1_TXD_MARK),
+ PINMUX_GPIO(GPIO_FN_COM1_RXD, COM1_RXD_MARK),
+ PINMUX_GPIO(GPIO_FN_COM1_RTS, COM1_RTS_MARK),
+ PINMUX_GPIO(GPIO_FN_COM1_CTS, COM1_CTS_MARK),
- /* PTP (mobule: JMC, SCIF234) */
- PINMUX_GPIO(GPIO_FN_JMCTCK, JMCTCK_MARK),
- PINMUX_GPIO(GPIO_FN_JMCTMS, JMCTMS_MARK),
- PINMUX_GPIO(GPIO_FN_JMCTDO, JMCTDO_MARK),
- PINMUX_GPIO(GPIO_FN_JMCTDI, JMCTDI_MARK),
- PINMUX_GPIO(GPIO_FN_JMCRST, JMCRST_MARK),
- PINMUX_GPIO(GPIO_FN_SCK4, SCK4_MARK),
- PINMUX_GPIO(GPIO_FN_SCK3, SCK3_MARK),
+ /* PTP (mobule: EVC, ADC) */
/* PTQ (mobule: LPC) */
PINMUX_GPIO(GPIO_FN_LAD3, LAD3_MARK),
@@ -1439,31 +1603,41 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_FN_SDA3, SDA3_MARK),
PINMUX_GPIO(GPIO_FN_SCL3, SCL3_MARK),
- /* PTT (mobule: SYSTEM, PWMX) */
- PINMUX_GPIO(GPIO_FN_AUDSYNC, AUDSYNC_MARK),
- PINMUX_GPIO(GPIO_FN_AUDCK, AUDCK_MARK),
+ /* PTT (mobule: PWMX, AUD) */
+ PINMUX_GPIO(GPIO_FN_PWMX7, PWMX7_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMX6, PWMX6_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMX5, PWMX5_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMX4, PWMX4_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMX3, PWMX3_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMX2, PWMX2_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMX1, PWMX1_MARK),
+ PINMUX_GPIO(GPIO_FN_PWMX0, PWMX0_MARK),
PINMUX_GPIO(GPIO_FN_AUDATA3, AUDATA3_MARK),
PINMUX_GPIO(GPIO_FN_AUDATA2, AUDATA2_MARK),
PINMUX_GPIO(GPIO_FN_AUDATA1, AUDATA1_MARK),
PINMUX_GPIO(GPIO_FN_AUDATA0, AUDATA0_MARK),
- PINMUX_GPIO(GPIO_FN_PWX7, PWX7_MARK),
- PINMUX_GPIO(GPIO_FN_PWX6, PWX6_MARK),
- PINMUX_GPIO(GPIO_FN_PWX5, PWX5_MARK),
- PINMUX_GPIO(GPIO_FN_PWX4, PWX4_MARK),
-
- /* PTU (mobule: LBSC, DMAC) */
- PINMUX_GPIO(GPIO_FN_CS6, CS6_MARK),
- PINMUX_GPIO(GPIO_FN_CS5, CS5_MARK),
- PINMUX_GPIO(GPIO_FN_CS4, CS4_MARK),
- PINMUX_GPIO(GPIO_FN_CS0, CS0_MARK),
- PINMUX_GPIO(GPIO_FN_RD, RD_MARK),
- PINMUX_GPIO(GPIO_FN_WE0, WE0_MARK),
- PINMUX_GPIO(GPIO_FN_A25, A25_MARK),
- PINMUX_GPIO(GPIO_FN_A24, A24_MARK),
- PINMUX_GPIO(GPIO_FN_DREQ0, DREQ0_MARK),
- PINMUX_GPIO(GPIO_FN_DACK0, DACK0_MARK),
+ PINMUX_GPIO(GPIO_FN_STATUS1, STATUS1_MARK),
+ PINMUX_GPIO(GPIO_FN_STATUS0, STATUS0_MARK),
- /* PTV (mobule: LBSC, DMAC) */
+ /* PTU (mobule: LPC, APM) */
+ PINMUX_GPIO(GPIO_FN_LGPIO7, LGPIO7_MARK),
+ PINMUX_GPIO(GPIO_FN_LGPIO6, LGPIO6_MARK),
+ PINMUX_GPIO(GPIO_FN_LGPIO5, LGPIO5_MARK),
+ PINMUX_GPIO(GPIO_FN_LGPIO4, LGPIO4_MARK),
+ PINMUX_GPIO(GPIO_FN_LGPIO3, LGPIO3_MARK),
+ PINMUX_GPIO(GPIO_FN_LGPIO2, LGPIO2_MARK),
+ PINMUX_GPIO(GPIO_FN_LGPIO1, LGPIO1_MARK),
+ PINMUX_GPIO(GPIO_FN_LGPIO0, LGPIO0_MARK),
+ PINMUX_GPIO(GPIO_FN_APMONCTL_O, APMONCTL_O_MARK),
+ PINMUX_GPIO(GPIO_FN_APMPWBTOUT_O, APMPWBTOUT_O_MARK),
+ PINMUX_GPIO(GPIO_FN_APMSCI_O, APMSCI_O_MARK),
+ PINMUX_GPIO(GPIO_FN_APMVDDON, APMVDDON_MARK),
+ PINMUX_GPIO(GPIO_FN_APMSLPBTN, APMSLPBTN_MARK),
+ PINMUX_GPIO(GPIO_FN_APMPWRBTN, APMPWRBTN_MARK),
+ PINMUX_GPIO(GPIO_FN_APMS5N, APMS5N_MARK),
+ PINMUX_GPIO(GPIO_FN_APMS3N, APMS3N_MARK),
+
+ /* PTV (mobule: LBSC, SerMux, R-SPI, EVC, GRA) */
PINMUX_GPIO(GPIO_FN_A23, A23_MARK),
PINMUX_GPIO(GPIO_FN_A22, A22_MARK),
PINMUX_GPIO(GPIO_FN_A21, A21_MARK),
@@ -1472,12 +1646,20 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_FN_A18, A18_MARK),
PINMUX_GPIO(GPIO_FN_A17, A17_MARK),
PINMUX_GPIO(GPIO_FN_A16, A16_MARK),
- PINMUX_GPIO(GPIO_FN_TEND0, TEND0_MARK),
- PINMUX_GPIO(GPIO_FN_DREQ1, DREQ1_MARK),
- PINMUX_GPIO(GPIO_FN_DACK1, DACK1_MARK),
- PINMUX_GPIO(GPIO_FN_TEND1, TEND1_MARK),
+ PINMUX_GPIO(GPIO_FN_COM2_RI, COM2_RI_MARK),
+ PINMUX_GPIO(GPIO_FN_R_SPI_MOSI, R_SPI_MOSI_MARK),
+ PINMUX_GPIO(GPIO_FN_R_SPI_MISO, R_SPI_MISO_MARK),
+ PINMUX_GPIO(GPIO_FN_R_SPI_RSPCK, R_SPI_RSPCK_MARK),
+ PINMUX_GPIO(GPIO_FN_R_SPI_SSL0, R_SPI_SSL0_MARK),
+ PINMUX_GPIO(GPIO_FN_R_SPI_SSL1, R_SPI_SSL1_MARK),
+ PINMUX_GPIO(GPIO_FN_EVENT7, EVENT7_MARK),
+ PINMUX_GPIO(GPIO_FN_EVENT6, EVENT6_MARK),
+ PINMUX_GPIO(GPIO_FN_VBIOS_DI, VBIOS_DI_MARK),
+ PINMUX_GPIO(GPIO_FN_VBIOS_DO, VBIOS_DO_MARK),
+ PINMUX_GPIO(GPIO_FN_VBIOS_CLK, VBIOS_CLK_MARK),
+ PINMUX_GPIO(GPIO_FN_VBIOS_CS, VBIOS_CS_MARK),
- /* PTW (mobule: LBSC) */
+ /* PTW (mobule: LBSC, EVC, SCIF) */
PINMUX_GPIO(GPIO_FN_A16, A16_MARK),
PINMUX_GPIO(GPIO_FN_A15, A15_MARK),
PINMUX_GPIO(GPIO_FN_A14, A14_MARK),
@@ -1487,6 +1669,14 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_FN_A10, A10_MARK),
PINMUX_GPIO(GPIO_FN_A9, A9_MARK),
PINMUX_GPIO(GPIO_FN_A8, A8_MARK),
+ PINMUX_GPIO(GPIO_FN_EVENT5, EVENT5_MARK),
+ PINMUX_GPIO(GPIO_FN_EVENT4, EVENT4_MARK),
+ PINMUX_GPIO(GPIO_FN_EVENT3, EVENT3_MARK),
+ PINMUX_GPIO(GPIO_FN_EVENT2, EVENT2_MARK),
+ PINMUX_GPIO(GPIO_FN_EVENT1, EVENT1_MARK),
+ PINMUX_GPIO(GPIO_FN_EVENT0, EVENT0_MARK),
+ PINMUX_GPIO(GPIO_FN_CTS4, CTS4_MARK),
+ PINMUX_GPIO(GPIO_FN_CTS2, CTS2_MARK),
/* PTX (mobule: LBSC) */
PINMUX_GPIO(GPIO_FN_A7, A7_MARK),
@@ -1497,6 +1687,10 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_FN_A2, A2_MARK),
PINMUX_GPIO(GPIO_FN_A1, A1_MARK),
PINMUX_GPIO(GPIO_FN_A0, A0_MARK),
+ PINMUX_GPIO(GPIO_FN_RTS2, RTS2_MARK),
+ PINMUX_GPIO(GPIO_FN_SIM_D, SIM_D_MARK),
+ PINMUX_GPIO(GPIO_FN_SIM_CLK, SIM_CLK_MARK),
+ PINMUX_GPIO(GPIO_FN_SIM_RST, SIM_RST_MARK),
/* PTY (mobule: LBSC) */
PINMUX_GPIO(GPIO_FN_D7, D7_MARK),
@@ -1507,18 +1701,36 @@ static struct pinmux_gpio pinmux_gpios[] = {
PINMUX_GPIO(GPIO_FN_D2, D2_MARK),
PINMUX_GPIO(GPIO_FN_D1, D1_MARK),
PINMUX_GPIO(GPIO_FN_D0, D0_MARK),
+
+ /* PTZ (mobule: eMMC, ONFI) */
+ PINMUX_GPIO(GPIO_FN_MMCDAT7, MMCDAT7_MARK),
+ PINMUX_GPIO(GPIO_FN_MMCDAT6, MMCDAT6_MARK),
+ PINMUX_GPIO(GPIO_FN_MMCDAT5, MMCDAT5_MARK),
+ PINMUX_GPIO(GPIO_FN_MMCDAT4, MMCDAT4_MARK),
+ PINMUX_GPIO(GPIO_FN_MMCDAT3, MMCDAT3_MARK),
+ PINMUX_GPIO(GPIO_FN_MMCDAT2, MMCDAT2_MARK),
+ PINMUX_GPIO(GPIO_FN_MMCDAT1, MMCDAT1_MARK),
+ PINMUX_GPIO(GPIO_FN_MMCDAT0, MMCDAT0_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_DQ7, ON_DQ7_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_DQ6, ON_DQ6_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_DQ5, ON_DQ5_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_DQ4, ON_DQ4_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_DQ3, ON_DQ3_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_DQ2, ON_DQ2_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_DQ1, ON_DQ1_MARK),
+ PINMUX_GPIO(GPIO_FN_ON_DQ0, ON_DQ0_MARK),
};
static struct pinmux_cfg_reg pinmux_config_regs[] = {
{ PINMUX_CFG_REG("PACR", 0xffec0000, 16, 2) {
- PTA7_FN, PTA7_OUT, PTA7_IN, 0,
- PTA6_FN, PTA6_OUT, PTA6_IN, 0,
- PTA5_FN, PTA5_OUT, PTA5_IN, 0,
- PTA4_FN, PTA4_OUT, PTA4_IN, 0,
- PTA3_FN, PTA3_OUT, PTA3_IN, 0,
- PTA2_FN, PTA2_OUT, PTA2_IN, 0,
- PTA1_FN, PTA1_OUT, PTA1_IN, 0,
- PTA0_FN, PTA0_OUT, PTA0_IN, 0 }
+ PTA7_FN, PTA7_OUT, PTA7_IN, PTA7_IN_PU,
+ PTA6_FN, PTA6_OUT, PTA6_IN, PTA6_IN_PU,
+ PTA5_FN, PTA5_OUT, PTA5_IN, PTA5_IN_PU,
+ PTA4_FN, PTA4_OUT, PTA4_IN, PTA4_IN_PU,
+ PTA3_FN, PTA3_OUT, PTA3_IN, PTA3_IN_PU,
+ PTA2_FN, PTA2_OUT, PTA2_IN, PTA2_IN_PU,
+ PTA1_FN, PTA1_OUT, PTA1_IN, PTA1_IN_PU,
+ PTA0_FN, PTA0_OUT, PTA0_IN, PTA0_IN_PU }
},
{ PINMUX_CFG_REG("PBCR", 0xffec0002, 16, 2) {
PTB7_FN, PTB7_OUT, PTB7_IN, 0,
@@ -1541,125 +1753,126 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
PTC0_FN, PTC0_OUT, PTC0_IN, 0 }
},
{ PINMUX_CFG_REG("PDCR", 0xffec0006, 16, 2) {
- PTD7_FN, PTD7_OUT, PTD7_IN, 0,
- PTD6_FN, PTD6_OUT, PTD6_IN, 0,
- PTD5_FN, PTD5_OUT, PTD5_IN, 0,
- PTD4_FN, PTD4_OUT, PTD4_IN, 0,
- PTD3_FN, PTD3_OUT, PTD3_IN, 0,
- PTD2_FN, PTD2_OUT, PTD2_IN, 0,
- PTD1_FN, PTD1_OUT, PTD1_IN, 0,
- PTD0_FN, PTD0_OUT, PTD0_IN, 0 }
+ PTD7_FN, PTD7_OUT, PTD7_IN, PTD7_IN_PU,
+ PTD6_FN, PTD6_OUT, PTD6_IN, PTD6_IN_PU,
+ PTD5_FN, PTD5_OUT, PTD5_IN, PTD5_IN_PU,
+ PTD4_FN, PTD4_OUT, PTD4_IN, PTD4_IN_PU,
+ PTD3_FN, PTD3_OUT, PTD3_IN, PTD3_IN_PU,
+ PTD2_FN, PTD2_OUT, PTD2_IN, PTD2_IN_PU,
+ PTD1_FN, PTD1_OUT, PTD1_IN, PTD1_IN_PU,
+ PTD0_FN, PTD0_OUT, PTD0_IN, PTD0_IN_PU }
},
{ PINMUX_CFG_REG("PECR", 0xffec0008, 16, 2) {
- PTE7_FN, PTE7_OUT, PTE7_IN, 0,
- PTE6_FN, PTE6_OUT, PTE6_IN, 0,
- PTE5_FN, PTE5_OUT, PTE5_IN, 0,
- PTE4_FN, PTE4_OUT, PTE4_IN, 0,
- PTE3_FN, PTE3_OUT, PTE3_IN, 0,
- PTE2_FN, PTE2_OUT, PTE2_IN, 0,
- PTE1_FN, PTE1_OUT, PTE1_IN, 0,
- PTE0_FN, PTE0_OUT, PTE0_IN, 0 }
+ PTE7_FN, PTE7_OUT, PTE7_IN, PTE7_IN_PU,
+ PTE6_FN, PTE6_OUT, PTE6_IN, PTE6_IN_PU,
+ PTE5_FN, PTE5_OUT, PTE5_IN, PTE5_IN_PU,
+ PTE4_FN, PTE4_OUT, PTE4_IN, PTE4_IN_PU,
+ PTE3_FN, PTE3_OUT, PTE3_IN, PTE3_IN_PU,
+ PTE2_FN, PTE2_OUT, PTE2_IN, PTE2_IN_PU,
+ PTE1_FN, PTE1_OUT, PTE1_IN, PTE1_IN_PU,
+ PTE0_FN, PTE0_OUT, PTE0_IN, PTE0_IN_PU }
},
{ PINMUX_CFG_REG("PFCR", 0xffec000a, 16, 2) {
- PTF7_FN, PTF7_OUT, PTF7_IN, 0,
- PTF6_FN, PTF6_OUT, PTF6_IN, 0,
- PTF5_FN, PTF5_OUT, PTF5_IN, 0,
- PTF4_FN, PTF4_OUT, PTF4_IN, 0,
- PTF3_FN, PTF3_OUT, PTF3_IN, 0,
- PTF2_FN, PTF2_OUT, PTF2_IN, 0,
- PTF1_FN, PTF1_OUT, PTF1_IN, 0,
- PTF0_FN, PTF0_OUT, PTF0_IN, 0 }
+ PTF7_FN, PTF7_OUT, PTF7_IN, PTF7_IN_PU,
+ PTF6_FN, PTF6_OUT, PTF6_IN, PTF6_IN_PU,
+ PTF5_FN, PTF5_OUT, PTF5_IN, PTF5_IN_PU,
+ PTF4_FN, PTF4_OUT, PTF4_IN, PTF4_IN_PU,
+ PTF3_FN, PTF3_OUT, PTF3_IN, PTF3_IN_PU,
+ PTF2_FN, PTF2_OUT, PTF2_IN, PTF2_IN_PU,
+ PTF1_FN, PTF1_OUT, PTF1_IN, PTF1_IN_PU,
+ PTF0_FN, PTF0_OUT, PTF0_IN, PTF0_IN_PU }
},
{ PINMUX_CFG_REG("PGCR", 0xffec000c, 16, 2) {
- PTG7_FN, PTG7_OUT, PTG7_IN, 0,
- PTG6_FN, PTG6_OUT, PTG6_IN, 0,
+ PTG7_FN, PTG7_OUT, PTG7_IN, PTG7_IN_PU ,
+ PTG6_FN, PTG6_OUT, PTG6_IN, PTG6_IN_PU ,
PTG5_FN, PTG5_OUT, PTG5_IN, 0,
- PTG4_FN, PTG4_OUT, PTG4_IN, 0,
+ PTG4_FN, PTG4_OUT, PTG4_IN, PTG4_IN_PU ,
PTG3_FN, PTG3_OUT, PTG3_IN, 0,
PTG2_FN, PTG2_OUT, PTG2_IN, 0,
PTG1_FN, PTG1_OUT, PTG1_IN, 0,
PTG0_FN, PTG0_OUT, PTG0_IN, 0 }
},
{ PINMUX_CFG_REG("PHCR", 0xffec000e, 16, 2) {
- PTH7_FN, PTH7_OUT, PTH7_IN, 0,
- PTH6_FN, PTH6_OUT, PTH6_IN, 0,
- PTH5_FN, PTH5_OUT, PTH5_IN, 0,
- PTH4_FN, PTH4_OUT, PTH4_IN, 0,
- PTH3_FN, PTH3_OUT, PTH3_IN, 0,
- PTH2_FN, PTH2_OUT, PTH2_IN, 0,
- PTH1_FN, PTH1_OUT, PTH1_IN, 0,
- PTH0_FN, PTH0_OUT, PTH0_IN, 0 }
+ PTH7_FN, PTH7_OUT, PTH7_IN, PTH7_IN_PU,
+ PTH6_FN, PTH6_OUT, PTH6_IN, PTH6_IN_PU,
+ PTH5_FN, PTH5_OUT, PTH5_IN, PTH5_IN_PU,
+ PTH4_FN, PTH4_OUT, PTH4_IN, PTH4_IN_PU,
+ PTH3_FN, PTH3_OUT, PTH3_IN, PTH3_IN_PU,
+ PTH2_FN, PTH2_OUT, PTH2_IN, PTH2_IN_PU,
+ PTH1_FN, PTH1_OUT, PTH1_IN, PTH1_IN_PU,
+ PTH0_FN, PTH0_OUT, PTH0_IN, PTH0_IN_PU }
},
{ PINMUX_CFG_REG("PICR", 0xffec0010, 16, 2) {
- PTI7_FN, PTI7_OUT, PTI7_IN, 0,
- PTI6_FN, PTI6_OUT, PTI6_IN, 0,
+ PTI7_FN, PTI7_OUT, PTI7_IN, PTI7_IN_PU,
+ PTI6_FN, PTI6_OUT, PTI6_IN, PTI6_IN_PU,
PTI5_FN, PTI5_OUT, PTI5_IN, 0,
- PTI4_FN, PTI4_OUT, PTI4_IN, 0,
- PTI3_FN, PTI3_OUT, PTI3_IN, 0,
- PTI2_FN, PTI2_OUT, PTI2_IN, 0,
- PTI1_FN, PTI1_OUT, PTI1_IN, 0,
- PTI0_FN, PTI0_OUT, PTI0_IN, 0 }
+ PTI4_FN, PTI4_OUT, PTI4_IN, PTI4_IN_PU,
+ PTI3_FN, PTI3_OUT, PTI3_IN, PTI3_IN_PU,
+ PTI2_FN, PTI2_OUT, PTI2_IN, PTI2_IN_PU,
+ PTI1_FN, PTI1_OUT, PTI1_IN, PTI1_IN_PU,
+ PTI0_FN, PTI0_OUT, PTI0_IN, PTI0_IN_PU }
},
{ PINMUX_CFG_REG("PJCR", 0xffec0012, 16, 2) {
- PTJ7_FN, PTJ7_OUT, PTJ7_IN, 0,
- PTJ6_FN, PTJ6_OUT, PTJ6_IN, 0,
- PTJ5_FN, PTJ5_OUT, PTJ5_IN, 0,
- PTJ4_FN, PTJ4_OUT, PTJ4_IN, 0,
- PTJ3_FN, PTJ3_OUT, PTJ3_IN, 0,
- PTJ2_FN, PTJ2_OUT, PTJ2_IN, 0,
- PTJ1_FN, PTJ1_OUT, PTJ1_IN, 0,
- PTJ0_FN, PTJ0_OUT, PTJ0_IN, 0 }
+ 0, 0, 0, 0, /* reserved: always set 1 */
+ PTJ6_FN, PTJ6_OUT, PTJ6_IN, PTJ6_IN_PU,
+ PTJ5_FN, PTJ5_OUT, PTJ5_IN, PTJ5_IN_PU,
+ PTJ4_FN, PTJ4_OUT, PTJ4_IN, PTJ4_IN_PU,
+ PTJ3_FN, PTJ3_OUT, PTJ3_IN, PTJ3_IN_PU,
+ PTJ2_FN, PTJ2_OUT, PTJ2_IN, PTJ2_IN_PU,
+ PTJ1_FN, PTJ1_OUT, PTJ1_IN, PTJ1_IN_PU,
+ PTJ0_FN, PTJ0_OUT, PTJ0_IN, PTJ0_IN_PU }
},
{ PINMUX_CFG_REG("PKCR", 0xffec0014, 16, 2) {
- PTK7_FN, PTK7_OUT, PTK7_IN, 0,
- PTK6_FN, PTK6_OUT, PTK6_IN, 0,
- PTK5_FN, PTK5_OUT, PTK5_IN, 0,
- PTK4_FN, PTK4_OUT, PTK4_IN, 0,
- PTK3_FN, PTK3_OUT, PTK3_IN, 0,
- PTK2_FN, PTK2_OUT, PTK2_IN, 0,
- PTK1_FN, PTK1_OUT, PTK1_IN, 0,
- PTK0_FN, PTK0_OUT, PTK0_IN, 0 }
+ PTK7_FN, PTK7_OUT, PTK7_IN, PTK7_IN_PU,
+ PTK6_FN, PTK6_OUT, PTK6_IN, PTK6_IN_PU,
+ PTK5_FN, PTK5_OUT, PTK5_IN, PTK5_IN_PU,
+ PTK4_FN, PTK4_OUT, PTK4_IN, PTK4_IN_PU,
+ PTK3_FN, PTK3_OUT, PTK3_IN, PTK3_IN_PU,
+ PTK2_FN, PTK2_OUT, PTK2_IN, PTK2_IN_PU,
+ PTK1_FN, PTK1_OUT, PTK1_IN, PTK1_IN_PU,
+ PTK0_FN, PTK0_OUT, PTK0_IN, PTK0_IN_PU }
},
{ PINMUX_CFG_REG("PLCR", 0xffec0016, 16, 2) {
- PTL7_FN, PTL7_OUT, PTL7_IN, 0,
- PTL6_FN, PTL6_OUT, PTL6_IN, 0,
- PTL5_FN, PTL5_OUT, PTL5_IN, 0,
- PTL4_FN, PTL4_OUT, PTL4_IN, 0,
- PTL3_FN, PTL3_OUT, PTL3_IN, 0,
- PTL2_FN, PTL2_OUT, PTL2_IN, 0,
- PTL1_FN, PTL1_OUT, PTL1_IN, 0,
- PTL0_FN, PTL0_OUT, PTL0_IN, 0 }
+ 0, 0, 0, 0, /* reserved: always set 1 */
+ PTL6_FN, PTL6_OUT, PTL6_IN, PTL6_IN_PU,
+ PTL5_FN, PTL5_OUT, PTL5_IN, PTL5_IN_PU,
+ PTL4_FN, PTL4_OUT, PTL4_IN, PTL4_IN_PU,
+ PTL3_FN, PTL3_OUT, PTL3_IN, PTL3_IN_PU,
+ PTL2_FN, PTL2_OUT, PTL2_IN, PTL2_IN_PU,
+ PTL1_FN, PTL1_OUT, PTL1_IN, PTL1_IN_PU,
+ PTL0_FN, PTL0_OUT, PTL0_IN, PTL0_IN_PU }
},
{ PINMUX_CFG_REG("PMCR", 0xffec0018, 16, 2) {
- 0, 0, 0, 0, /* reserved: always set 1 */
- PTM6_FN, PTM6_OUT, PTM6_IN, 0,
- PTM5_FN, PTM5_OUT, PTM5_IN, 0,
- PTM4_FN, PTM4_OUT, PTM4_IN, 0,
+ PTM7_FN, PTM7_OUT, PTM7_IN, PTM7_IN_PU,
+ PTM6_FN, PTM6_OUT, PTM6_IN, PTM6_IN_PU,
+ PTM5_FN, PTM5_OUT, PTM5_IN, PTM5_IN_PU,
+ PTM4_FN, PTM4_OUT, PTM4_IN, PTM4_IN_PU,
PTM3_FN, PTM3_OUT, PTM3_IN, 0,
PTM2_FN, PTM2_OUT, PTM2_IN, 0,
PTM1_FN, PTM1_OUT, PTM1_IN, 0,
PTM0_FN, PTM0_OUT, PTM0_IN, 0 }
},
{ PINMUX_CFG_REG("PNCR", 0xffec001a, 16, 2) {
- PTN7_FN, PTN7_OUT, PTN7_IN, 0,
+ 0, 0, 0, 0, /* reserved: always set 1 */
PTN6_FN, PTN6_OUT, PTN6_IN, 0,
PTN5_FN, PTN5_OUT, PTN5_IN, 0,
- PTN4_FN, PTN4_OUT, PTN4_IN, 0,
- PTN3_FN, PTN3_OUT, PTN3_IN, 0,
- PTN2_FN, PTN2_OUT, PTN2_IN, 0,
- PTN1_FN, PTN1_OUT, PTN1_IN, 0,
- PTN0_FN, PTN0_OUT, PTN0_IN, 0 }
+ PTN4_FN, PTN4_OUT, PTN4_IN, PTN4_IN_PU,
+ PTN3_FN, PTN3_OUT, PTN3_IN, PTN3_IN_PU,
+ PTN2_FN, PTN2_OUT, PTN2_IN, PTN2_IN_PU,
+ PTN1_FN, PTN1_OUT, PTN1_IN, PTN1_IN_PU,
+ PTN0_FN, PTN0_OUT, PTN0_IN, PTN0_IN_PU }
},
{ PINMUX_CFG_REG("POCR", 0xffec001c, 16, 2) {
- PTO7_FN, PTO7_OUT, PTO7_IN, 0,
- PTO6_FN, PTO6_OUT, PTO6_IN, 0,
- PTO5_FN, PTO5_OUT, PTO5_IN, 0,
- PTO4_FN, PTO4_OUT, PTO4_IN, 0,
- PTO3_FN, PTO3_OUT, PTO3_IN, 0,
- PTO2_FN, PTO2_OUT, PTO2_IN, 0,
- PTO1_FN, PTO1_OUT, PTO1_IN, 0,
- PTO0_FN, PTO0_OUT, PTO0_IN, 0 }
+ PTO7_FN, PTO7_OUT, PTO7_IN, PTO7_IN_PU,
+ PTO6_FN, PTO6_OUT, PTO6_IN, PTO6_IN_PU,
+ PTO5_FN, PTO5_OUT, PTO5_IN, PTO5_IN_PU,
+ PTO4_FN, PTO4_OUT, PTO4_IN, PTO4_IN_PU,
+ PTO3_FN, PTO3_OUT, PTO3_IN, PTO3_IN_PU,
+ PTO2_FN, PTO2_OUT, PTO2_IN, PTO2_IN_PU,
+ PTO1_FN, PTO1_OUT, PTO1_IN, PTO1_IN_PU,
+ PTO0_FN, PTO0_OUT, PTO0_IN, PTO0_IN_PU }
},
+#if 0 /* FIXME: Remove it? */
{ PINMUX_CFG_REG("PPCR", 0xffec001e, 16, 2) {
0, 0, 0, 0, /* reserved: always set 1 */
PTP6_FN, PTP6_OUT, PTP6_IN, 0,
@@ -1670,6 +1883,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
PTP1_FN, PTP1_OUT, PTP1_IN, 0,
PTP0_FN, PTP0_OUT, PTP0_IN, 0 }
},
+#endif
{ PINMUX_CFG_REG("PQCR", 0xffec0020, 16, 2) {
0, 0, 0, 0, /* reserved: always set 1 */
PTQ6_FN, PTQ6_OUT, PTQ6_IN, 0,
@@ -1701,14 +1915,14 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
PTS0_FN, PTS0_OUT, PTS0_IN, 0 }
},
{ PINMUX_CFG_REG("PTCR", 0xffec0026, 16, 2) {
- 0, 0, 0, 0, /* reserved: always set 1 */
- 0, 0, 0, 0, /* reserved: always set 1 */
- PTT5_FN, PTT5_OUT, PTT5_IN, 0,
- PTT4_FN, PTT4_OUT, PTT4_IN, 0,
- PTT3_FN, PTT3_OUT, PTT3_IN, 0,
- PTT2_FN, PTT2_OUT, PTT2_IN, 0,
- PTT1_FN, PTT1_OUT, PTT1_IN, 0,
- PTT0_FN, PTT0_OUT, PTT0_IN, 0 }
+ PTT7_FN, PTT7_OUT, PTT7_IN, PTO7_IN_PU,
+ PTT6_FN, PTT6_OUT, PTT6_IN, PTO6_IN_PU,
+ PTT5_FN, PTT5_OUT, PTT5_IN, PTO5_IN_PU,
+ PTT4_FN, PTT4_OUT, PTT4_IN, PTO4_IN_PU,
+ PTT3_FN, PTT3_OUT, PTT3_IN, PTO3_IN_PU,
+ PTT2_FN, PTT2_OUT, PTT2_IN, PTO2_IN_PU,
+ PTT1_FN, PTT1_OUT, PTT1_IN, PTO1_IN_PU,
+ PTT0_FN, PTT0_OUT, PTT0_IN, PTO0_IN_PU }
},
{ PINMUX_CFG_REG("PUCR", 0xffec0028, 16, 2) {
PTU7_FN, PTU7_OUT, PTU7_IN, PTU7_IN_PU,
@@ -1727,16 +1941,16 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
PTV4_FN, PTV4_OUT, PTV4_IN, PTV4_IN_PU,
PTV3_FN, PTV3_OUT, PTV3_IN, PTV3_IN_PU,
PTV2_FN, PTV2_OUT, PTV2_IN, PTV2_IN_PU,
- PTV1_FN, PTV1_OUT, PTV1_IN, PTV1_IN_PU,
- PTV0_FN, PTV0_OUT, PTV0_IN, PTV0_IN_PU }
+ PTV1_FN, PTV1_OUT, PTV1_IN, 0,
+ PTV0_FN, PTV0_OUT, PTV0_IN, 0 }
},
{ PINMUX_CFG_REG("PWCR", 0xffec002c, 16, 2) {
- PTW7_FN, PTW7_OUT, PTW7_IN, PTW7_IN_PU,
- PTW6_FN, PTW6_OUT, PTW6_IN, PTW6_IN_PU,
- PTW5_FN, PTW5_OUT, PTW5_IN, PTW5_IN_PU,
- PTW4_FN, PTW4_OUT, PTW4_IN, PTW4_IN_PU,
- PTW3_FN, PTW3_OUT, PTW3_IN, PTW3_IN_PU,
- PTW2_FN, PTW2_OUT, PTW2_IN, PTW2_IN_PU,
+ PTW7_FN, PTW7_OUT, PTW7_IN, 0,
+ PTW6_FN, PTW6_OUT, PTW6_IN, 0,
+ PTW5_FN, PTW5_OUT, PTW5_IN, 0,
+ PTW4_FN, PTW4_OUT, PTW4_IN, 0,
+ PTW3_FN, PTW3_OUT, PTW3_IN, 0,
+ PTW2_FN, PTW2_OUT, PTW2_IN, 0,
PTW1_FN, PTW1_OUT, PTW1_IN, PTW1_IN_PU,
PTW0_FN, PTW0_OUT, PTW0_IN, PTW0_IN_PU }
},
@@ -1761,32 +1975,32 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
PTY0_FN, PTY0_OUT, PTY0_IN, PTY0_IN_PU }
},
{ PINMUX_CFG_REG("PZCR", 0xffec0032, 16, 2) {
- 0, PTZ7_OUT, PTZ7_IN, 0,
- 0, PTZ6_OUT, PTZ6_IN, 0,
- 0, PTZ5_OUT, PTZ5_IN, 0,
- 0, PTZ4_OUT, PTZ4_IN, 0,
- 0, PTZ3_OUT, PTZ3_IN, 0,
- 0, PTZ2_OUT, PTZ2_IN, 0,
- 0, PTZ1_OUT, PTZ1_IN, 0,
- 0, PTZ0_OUT, PTZ0_IN, 0 }
+ PTZ7_FN, PTZ7_OUT, PTZ7_IN, 0,
+ PTZ6_FN, PTZ6_OUT, PTZ6_IN, 0,
+ PTZ5_FN, PTZ5_OUT, PTZ5_IN, 0,
+ PTZ4_FN, PTZ4_OUT, PTZ4_IN, 0,
+ PTZ3_FN, PTZ3_OUT, PTZ3_IN, 0,
+ PTZ2_FN, PTZ2_OUT, PTZ2_IN, 0,
+ PTZ1_FN, PTZ1_OUT, PTZ1_IN, 0,
+ PTZ0_FN, PTZ0_OUT, PTZ0_IN, 0 }
},
{ PINMUX_CFG_REG("PSEL0", 0xffec0070, 16, 1) {
- PS0_15_FN3, PS0_15_FN1,
- PS0_14_FN3, PS0_14_FN1,
- PS0_13_FN3, PS0_13_FN1,
- PS0_12_FN3, PS0_12_FN1,
- 0, 0,
- 0, 0,
+ PS0_15_FN1, PS0_15_FN2,
+ PS0_14_FN1, PS0_14_FN2,
+ PS0_13_FN1, PS0_13_FN2,
+ PS0_12_FN1, PS0_12_FN2,
+ PS0_11_FN1, PS0_11_FN2,
+ PS0_10_FN1, PS0_10_FN2,
+ PS0_9_FN1, PS0_9_FN2,
+ PS0_8_FN1, PS0_8_FN2,
+ PS0_7_FN1, PS0_7_FN2,
+ PS0_6_FN1, PS0_6_FN2,
+ PS0_5_FN1, PS0_5_FN2,
+ PS0_4_FN1, PS0_4_FN2,
+ PS0_3_FN1, PS0_3_FN2,
+ PS0_2_FN1, PS0_2_FN2,
0, 0,
- 0, 0,
- PS0_7_FN2, PS0_7_FN1,
- PS0_6_FN2, PS0_6_FN1,
- PS0_5_FN2, PS0_5_FN1,
- PS0_4_FN2, PS0_4_FN1,
- PS0_3_FN2, PS0_3_FN1,
- PS0_2_FN2, PS0_2_FN1,
- PS0_1_FN2, PS0_1_FN1,
0, 0, }
},
{ PINMUX_CFG_REG("PSEL1", 0xffec0072, 16, 1) {
@@ -1795,73 +2009,136 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
0, 0,
0, 0,
0, 0,
+ PS1_10_FN1, PS1_10_FN2,
+ PS1_9_FN1, PS1_9_FN2,
+ PS1_8_FN1, PS1_8_FN2,
0, 0,
0, 0,
0, 0,
- PS1_7_FN1, PS1_7_FN3,
- PS1_6_FN1, PS1_6_FN3,
- 0, 0,
- 0, 0,
0, 0,
0, 0,
+ PS1_2_FN1, PS1_2_FN2,
0, 0,
0, 0, }
},
{ PINMUX_CFG_REG("PSEL2", 0xffec0074, 16, 1) {
0, 0,
0, 0,
- PS2_13_FN3, PS2_13_FN1,
- PS2_12_FN3, PS2_12_FN1,
+ PS2_13_FN1, PS2_13_FN2,
+ PS2_12_FN1, PS2_12_FN2,
0, 0,
0, 0,
0, 0,
0, 0,
+ PS2_7_FN1, PS2_7_FN2,
+ PS2_6_FN1, PS2_6_FN2,
+ PS2_5_FN1, PS2_5_FN2,
+ PS2_4_FN1, PS2_4_FN2,
0, 0,
+ PS2_2_FN1, PS2_2_FN2,
0, 0,
+ 0, 0, }
+ },
+ { PINMUX_CFG_REG("PSEL3", 0xffec0076, 16, 1) {
+ PS3_15_FN1, PS3_15_FN2,
+ PS3_14_FN1, PS3_14_FN2,
+ PS3_13_FN1, PS3_13_FN2,
+ PS3_12_FN1, PS3_12_FN2,
+ PS3_11_FN1, PS3_11_FN2,
+ PS3_10_FN1, PS3_10_FN2,
+ PS3_9_FN1, PS3_9_FN2,
+ PS3_8_FN1, PS3_8_FN2,
+ PS3_7_FN1, PS3_7_FN2,
0, 0,
0, 0,
0, 0,
0, 0,
- PS2_1_FN1, PS2_1_FN2,
- PS2_0_FN1, PS2_0_FN2, }
+ PS3_2_FN1, PS3_2_FN2,
+ PS3_1_FN1, PS3_1_FN2,
+ 0, 0, }
},
+
{ PINMUX_CFG_REG("PSEL4", 0xffec0078, 16, 1) {
- PS4_15_FN2, PS4_15_FN1,
- PS4_14_FN2, PS4_14_FN1,
- PS4_13_FN2, PS4_13_FN1,
- PS4_12_FN2, PS4_12_FN1,
- PS4_11_FN2, PS4_11_FN1,
- PS4_10_FN2, PS4_10_FN1,
- PS4_9_FN2, PS4_9_FN1,
0, 0,
+ PS4_14_FN1, PS4_14_FN2,
+ PS4_13_FN1, PS4_13_FN2,
+ PS4_12_FN1, PS4_12_FN2,
0, 0,
+ PS4_10_FN1, PS4_10_FN2,
+ PS4_9_FN1, PS4_9_FN2,
+ PS4_8_FN1, PS4_8_FN2,
0, 0,
0, 0,
0, 0,
- PS4_3_FN2, PS4_3_FN1,
- PS4_2_FN2, PS4_2_FN1,
- PS4_1_FN2, PS4_1_FN1,
- PS4_0_FN2, PS4_0_FN1, }
+ PS4_4_FN1, PS4_4_FN2,
+ PS4_3_FN1, PS4_3_FN2,
+ PS4_2_FN1, PS4_2_FN2,
+ PS4_1_FN1, PS4_1_FN2,
+ PS4_0_FN1, PS4_0_FN2, }
},
{ PINMUX_CFG_REG("PSEL5", 0xffec007a, 16, 1) {
0, 0,
0, 0,
0, 0,
0, 0,
- 0, 0,
- 0, 0,
+ PS5_11_FN1, PS5_11_FN2,
+ PS5_10_FN1, PS5_10_FN2,
PS5_9_FN1, PS5_9_FN2,
PS5_8_FN1, PS5_8_FN2,
PS5_7_FN1, PS5_7_FN2,
PS5_6_FN1, PS5_6_FN2,
PS5_5_FN1, PS5_5_FN2,
+ PS5_4_FN1, PS5_4_FN2,
+ PS5_3_FN1, PS5_3_FN2,
+ PS5_2_FN1, PS5_2_FN2,
+ 0, 0,
+ 0, 0, }
+ },
+ { PINMUX_CFG_REG("PSEL6", 0xffec007c, 16, 1) {
+ PS6_15_FN1, PS6_15_FN2,
+ PS6_14_FN1, PS6_14_FN2,
+ PS6_13_FN1, PS6_13_FN2,
+ PS6_12_FN1, PS6_12_FN2,
+ PS6_11_FN1, PS6_11_FN2,
+ PS6_10_FN1, PS6_10_FN2,
+ PS6_9_FN1, PS6_9_FN2,
+ PS6_8_FN1, PS6_8_FN2,
+ PS6_7_FN1, PS6_7_FN2,
+ PS6_6_FN1, PS6_6_FN2,
+ PS6_5_FN1, PS6_5_FN2,
+ PS6_4_FN1, PS6_4_FN2,
+ PS6_3_FN1, PS6_3_FN2,
+ PS6_2_FN1, PS6_2_FN2,
+ PS6_1_FN1, PS6_1_FN2,
+ PS6_0_FN1, PS6_0_FN2, }
+ },
+ { PINMUX_CFG_REG("PSEL7", 0xffec0082, 16, 1) {
+ PS7_15_FN1, PS7_15_FN2,
+ PS7_14_FN1, PS7_14_FN2,
+ PS7_13_FN1, PS7_13_FN2,
+ PS7_12_FN1, PS7_12_FN2,
+ PS7_11_FN1, PS7_11_FN2,
+ PS7_10_FN1, PS7_10_FN2,
+ PS7_9_FN1, PS7_9_FN2,
+ PS7_8_FN1, PS7_8_FN2,
+ PS7_7_FN1, PS7_7_FN2,
+ PS7_6_FN1, PS7_6_FN2,
+ PS7_5_FN1, PS7_5_FN2,
0, 0,
0, 0,
0, 0,
0, 0,
0, 0, }
},
- { PINMUX_CFG_REG("PSEL6", 0xffec007c, 16, 1) {
+ { PINMUX_CFG_REG("PSEL8", 0xffec0084, 16, 1) {
+ PS8_15_FN1, PS8_15_FN2,
+ PS8_14_FN1, PS8_14_FN2,
+ PS8_13_FN1, PS8_13_FN2,
+ PS8_12_FN1, PS8_12_FN2,
+ PS8_11_FN1, PS8_11_FN2,
+ PS8_10_FN1, PS8_10_FN2,
+ PS8_9_FN1, PS8_9_FN2,
+ PS8_8_FN1, PS8_8_FN2,
0, 0,
0, 0,
0, 0,
@@ -1869,15 +2146,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
0, 0,
0, 0,
0, 0,
- 0, 0,
- PS6_7_FN_AN, PS6_7_FN_EV,
- PS6_6_FN_AN, PS6_6_FN_EV,
- PS6_5_FN_AN, PS6_5_FN_EV,
- PS6_4_FN_AN, PS6_4_FN_EV,
- PS6_3_FN_AN, PS6_3_FN_EV,
- PS6_2_FN_AN, PS6_2_FN_EV,
- PS6_1_FN_AN, PS6_1_FN_EV,
- PS6_0_FN_AN, PS6_0_FN_EV, }
+ 0, 0, }
},
{}
};
@@ -1920,7 +2189,7 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
PTI3_DATA, PTI2_DATA, PTI1_DATA, PTI0_DATA }
},
{ PINMUX_DATA_REG("PJDR", 0xffec0046, 8) {
- PTJ7_DATA, PTJ6_DATA, PTJ5_DATA, PTJ4_DATA,
+ 0, PTJ6_DATA, PTJ5_DATA, PTJ4_DATA,
PTJ3_DATA, PTJ2_DATA, PTJ1_DATA, PTJ0_DATA }
},
{ PINMUX_DATA_REG("PKDR", 0xffec0048, 8) {
@@ -1928,15 +2197,15 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
PTK3_DATA, PTK2_DATA, PTK1_DATA, PTK0_DATA }
},
{ PINMUX_DATA_REG("PLDR", 0xffec004a, 8) {
- PTL7_DATA, PTL6_DATA, PTL5_DATA, PTL4_DATA,
+ 0, PTL6_DATA, PTL5_DATA, PTL4_DATA,
PTL3_DATA, PTL2_DATA, PTL1_DATA, PTL0_DATA }
},
{ PINMUX_DATA_REG("PMDR", 0xffec004c, 8) {
- 0, PTM6_DATA, PTM5_DATA, PTM4_DATA,
+ PTM7_DATA, PTM6_DATA, PTM5_DATA, PTM4_DATA,
PTM3_DATA, PTM2_DATA, PTM1_DATA, PTM0_DATA }
},
{ PINMUX_DATA_REG("PNDR", 0xffec004e, 8) {
- PTN7_DATA, PTN6_DATA, PTN5_DATA, PTN4_DATA,
+ 0, PTN6_DATA, PTN5_DATA, PTN4_DATA,
PTN3_DATA, PTN2_DATA, PTN1_DATA, PTN0_DATA }
},
{ PINMUX_DATA_REG("PODR", 0xffec0050, 8) {
@@ -1944,7 +2213,7 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
PTO3_DATA, PTO2_DATA, PTO1_DATA, PTO0_DATA }
},
{ PINMUX_DATA_REG("PPDR", 0xffec0052, 8) {
- 0, PTP6_DATA, PTP5_DATA, PTP4_DATA,
+ PTP7_DATA, PTP6_DATA, PTP5_DATA, PTP4_DATA,
PTP3_DATA, PTP2_DATA, PTP1_DATA, PTP0_DATA }
},
{ PINMUX_DATA_REG("PQDR", 0xffec0054, 8) {
@@ -1960,7 +2229,7 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
PTS3_DATA, PTS2_DATA, PTS1_DATA, PTS0_DATA }
},
{ PINMUX_DATA_REG("PTDR", 0xffec005a, 8) {
- 0, 0, PTT5_DATA, PTT4_DATA,
+ PTT7_DATA, PTT6_DATA, PTT5_DATA, PTT4_DATA,
PTT3_DATA, PTT2_DATA, PTT1_DATA, PTT0_DATA }
},
{ PINMUX_DATA_REG("PUDR", 0xffec005c, 8) {
@@ -2000,8 +2269,8 @@ static struct pinmux_info sh7757_pinmux_info = {
.mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
.function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
- .first_gpio = GPIO_PTA7,
- .last_gpio = GPIO_FN_D0,
+ .first_gpio = GPIO_PTA0,
+ .last_gpio = GPIO_FN_ON_DQ0,
.gpios = pinmux_gpios,
.cfg_regs = pinmux_config_regs,
@@ -2015,5 +2284,4 @@ static int __init plat_pinmux_setup(void)
{
return register_pinmux(&sh7757_pinmux_info);
}
-
arch_initcall(plat_pinmux_setup);
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7724.c b/arch/sh/kernel/cpu/sh4a/setup-sh7724.c
index 79c556e56262..828c9657eb52 100644
--- a/arch/sh/kernel/cpu/sh4a/setup-sh7724.c
+++ b/arch/sh/kernel/cpu/sh4a/setup-sh7724.c
@@ -524,6 +524,70 @@ static struct platform_device veu1_device = {
},
};
+/* BEU0 */
+static struct uio_info beu0_platform_data = {
+ .name = "BEU0",
+ .version = "0",
+ .irq = evt2irq(0x8A0),
+};
+
+static struct resource beu0_resources[] = {
+ [0] = {
+ .name = "BEU0",
+ .start = 0xfe930000,
+ .end = 0xfe933400,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = {
+ /* place holder for contiguous memory */
+ },
+};
+
+static struct platform_device beu0_device = {
+ .name = "uio_pdrv_genirq",
+ .id = 6,
+ .dev = {
+ .platform_data = &beu0_platform_data,
+ },
+ .resource = beu0_resources,
+ .num_resources = ARRAY_SIZE(beu0_resources),
+ .archdata = {
+ .hwblk_id = HWBLK_BEU0,
+ },
+};
+
+/* BEU1 */
+static struct uio_info beu1_platform_data = {
+ .name = "BEU1",
+ .version = "0",
+ .irq = evt2irq(0xA00),
+};
+
+static struct resource beu1_resources[] = {
+ [0] = {
+ .name = "BEU1",
+ .start = 0xfe940000,
+ .end = 0xfe943400,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = {
+ /* place holder for contiguous memory */
+ },
+};
+
+static struct platform_device beu1_device = {
+ .name = "uio_pdrv_genirq",
+ .id = 7,
+ .dev = {
+ .platform_data = &beu1_platform_data,
+ },
+ .resource = beu1_resources,
+ .num_resources = ARRAY_SIZE(beu1_resources),
+ .archdata = {
+ .hwblk_id = HWBLK_BEU1,
+ },
+};
+
static struct sh_timer_config cmt_platform_data = {
.channel_offset = 0x60,
.timer_bit = 5,
@@ -857,6 +921,8 @@ static struct platform_device *sh7724_devices[] __initdata = {
&vpu_device,
&veu0_device,
&veu1_device,
+ &beu0_device,
+ &beu1_device,
&jpu_device,
&spu0_device,
&spu1_device,
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c
index 444aca95b20d..749c6388d5a5 100644
--- a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c
+++ b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c
@@ -26,7 +26,7 @@ static struct plat_sci_port scif2_platform_data = {
static struct platform_device scif2_device = {
.name = "sh-sci",
- .id = 2,
+ .id = 0,
.dev = {
.platform_data = &scif2_platform_data,
},
@@ -41,7 +41,7 @@ static struct plat_sci_port scif3_platform_data = {
static struct platform_device scif3_device = {
.name = "sh-sci",
- .id = 3,
+ .id = 1,
.dev = {
.platform_data = &scif3_platform_data,
},
@@ -56,7 +56,7 @@ static struct plat_sci_port scif4_platform_data = {
static struct platform_device scif4_device = {
.name = "sh-sci",
- .id = 4,
+ .id = 2,
.dev = {
.platform_data = &scif4_platform_data,
},
@@ -163,39 +163,23 @@ enum {
IRL4_HHLL, IRL4_HHLH, IRL4_HHHL,
IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
- SDHI,
- DVC,
- IRQ8, IRQ9, IRQ10,
- WDT0,
- TMU0, TMU1, TMU2, TMU2_TICPI,
+ SDHI, DVC,
+ IRQ8, IRQ9, IRQ11, IRQ10, IRQ12, IRQ13, IRQ14, IRQ15,
+ TMU0, TMU1, TMU2, TMU2_TICPI, TMU3, TMU4, TMU5,
HUDI,
-
ARC4,
- DMAC0,
- IRQ11,
- SCIF2,
- DMAC1_6,
- USB0,
- IRQ12,
+ DMAC0_5, DMAC6_7, DMAC8_11,
+ SCIF0, SCIF1, SCIF2, SCIF3, SCIF4,
+ USB0, USB1,
JMC,
- SPI1,
- IRQ13, IRQ14,
- USB1,
+ SPI0, SPI1,
TMR01, TMR23, TMR45,
- WDT1,
FRT,
- LPC,
- SCIF0, SCIF1, SCIF3,
- PECI0I, PECI1I, PECI2I,
- IRQ15,
+ LPC, LPC5, LPC6, LPC7, LPC8,
+ PECI0, PECI1, PECI2, PECI3, PECI4, PECI5,
ETHERC,
- SPI0,
- ADC1,
- DMAC1_8,
+ ADC0, ADC1,
SIM,
- TMU3, TMU4, TMU5,
- ADC0,
- SCIF4,
IIC0_0, IIC0_1, IIC0_2, IIC0_3,
IIC1_0, IIC1_1, IIC1_2, IIC1_3,
IIC2_0, IIC2_1, IIC2_2, IIC2_3,
@@ -206,9 +190,23 @@ enum {
IIC7_0, IIC7_1, IIC7_2, IIC7_3,
IIC8_0, IIC8_1, IIC8_2, IIC8_3,
IIC9_0, IIC9_1, IIC9_2, IIC9_3,
- PCIINTA,
- PCIE,
+ ONFICTL,
+ MMC1, MMC2,
+ ECCU,
+ PCIC,
+ G200,
+ RSPI,
SGPIO,
+ DMINT12, DMINT13, DMINT14, DMINT15, DMINT16, DMINT17, DMINT18, DMINT19,
+ DMINT20, DMINT21, DMINT22, DMINT23,
+ DDRECC,
+ TSIP,
+ PCIE_BRIDGE,
+ WDT0B, WDT1B, WDT2B, WDT3B, WDT4B, WDT5B, WDT6B, WDT7B, WDT8B,
+ GETHER0, GETHER1, GETHER2,
+ PBIA, PBIB, PBIC,
+ DMAE2, DMAE3,
+ SERMUX2, SERMUX3,
/* interrupt groups */
@@ -221,19 +219,18 @@ static struct intc_vect vectors[] __initdata = {
INTC_VECT(DVC, 0x4e0),
INTC_VECT(IRQ8, 0x500), INTC_VECT(IRQ9, 0x520),
INTC_VECT(IRQ10, 0x540),
- INTC_VECT(WDT0, 0x560),
INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0),
INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0),
INTC_VECT(HUDI, 0x600),
INTC_VECT(ARC4, 0x620),
- INTC_VECT(DMAC0, 0x640), INTC_VECT(DMAC0, 0x660),
- INTC_VECT(DMAC0, 0x680), INTC_VECT(DMAC0, 0x6a0),
- INTC_VECT(DMAC0, 0x6c0),
+ INTC_VECT(DMAC0_5, 0x640), INTC_VECT(DMAC0_5, 0x660),
+ INTC_VECT(DMAC0_5, 0x680), INTC_VECT(DMAC0_5, 0x6a0),
+ INTC_VECT(DMAC0_5, 0x6c0),
INTC_VECT(IRQ11, 0x6e0),
INTC_VECT(SCIF2, 0x700), INTC_VECT(SCIF2, 0x720),
INTC_VECT(SCIF2, 0x740), INTC_VECT(SCIF2, 0x760),
- INTC_VECT(DMAC0, 0x780), INTC_VECT(DMAC0, 0x7a0),
- INTC_VECT(DMAC1_6, 0x7c0), INTC_VECT(DMAC1_6, 0x7e0),
+ INTC_VECT(DMAC0_5, 0x780), INTC_VECT(DMAC0_5, 0x7a0),
+ INTC_VECT(DMAC6_7, 0x7c0), INTC_VECT(DMAC6_7, 0x7e0),
INTC_VECT(USB0, 0x840),
INTC_VECT(IRQ12, 0x880),
INTC_VECT(JMC, 0x8a0),
@@ -242,7 +239,6 @@ static struct intc_vect vectors[] __initdata = {
INTC_VECT(USB1, 0x920),
INTC_VECT(TMR01, 0xa00), INTC_VECT(TMR23, 0xa20),
INTC_VECT(TMR45, 0xa40),
- INTC_VECT(WDT1, 0xa60),
INTC_VECT(FRT, 0xa80),
INTC_VECT(LPC, 0xaa0), INTC_VECT(LPC, 0xac0),
INTC_VECT(LPC, 0xae0), INTC_VECT(LPC, 0xb00),
@@ -250,14 +246,14 @@ static struct intc_vect vectors[] __initdata = {
INTC_VECT(SCIF0, 0xb40), INTC_VECT(SCIF1, 0xb60),
INTC_VECT(SCIF3, 0xb80), INTC_VECT(SCIF3, 0xba0),
INTC_VECT(SCIF3, 0xbc0), INTC_VECT(SCIF3, 0xbe0),
- INTC_VECT(PECI0I, 0xc00), INTC_VECT(PECI1I, 0xc20),
- INTC_VECT(PECI2I, 0xc40),
+ INTC_VECT(PECI0, 0xc00), INTC_VECT(PECI1, 0xc20),
+ INTC_VECT(PECI2, 0xc40),
INTC_VECT(IRQ15, 0xc60),
INTC_VECT(ETHERC, 0xc80), INTC_VECT(ETHERC, 0xca0),
INTC_VECT(SPI0, 0xcc0),
INTC_VECT(ADC1, 0xce0),
- INTC_VECT(DMAC1_8, 0xd00), INTC_VECT(DMAC1_8, 0xd20),
- INTC_VECT(DMAC1_8, 0xd40), INTC_VECT(DMAC1_8, 0xd60),
+ INTC_VECT(DMAC8_11, 0xd00), INTC_VECT(DMAC8_11, 0xd20),
+ INTC_VECT(DMAC8_11, 0xd40), INTC_VECT(DMAC8_11, 0xd60),
INTC_VECT(SIM, 0xd80), INTC_VECT(SIM, 0xda0),
INTC_VECT(SIM, 0xdc0), INTC_VECT(SIM, 0xde0),
INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20),
@@ -278,17 +274,47 @@ static struct intc_vect vectors[] __initdata = {
INTC_VECT(IIC5_0, 0x1860), INTC_VECT(IIC5_1, 0x1880),
INTC_VECT(IIC5_2, 0x18a0), INTC_VECT(IIC5_3, 0x18c0),
INTC_VECT(IIC6_0, 0x18e0), INTC_VECT(IIC6_1, 0x1900),
- INTC_VECT(IIC6_2, 0x1920), INTC_VECT(IIC6_3, 0x1980),
+ INTC_VECT(IIC6_2, 0x1920),
+ INTC_VECT(ONFICTL, 0x1960),
+ INTC_VECT(IIC6_3, 0x1980),
INTC_VECT(IIC7_0, 0x19a0), INTC_VECT(IIC7_1, 0x1a00),
INTC_VECT(IIC7_2, 0x1a20), INTC_VECT(IIC7_3, 0x1a40),
INTC_VECT(IIC8_0, 0x1a60), INTC_VECT(IIC8_1, 0x1a80),
INTC_VECT(IIC8_2, 0x1aa0), INTC_VECT(IIC8_3, 0x1b40),
INTC_VECT(IIC9_0, 0x1b60), INTC_VECT(IIC9_1, 0x1b80),
INTC_VECT(IIC9_2, 0x1c00), INTC_VECT(IIC9_3, 0x1c20),
- INTC_VECT(PCIINTA, 0x1ce0),
- INTC_VECT(PCIE, 0x1e00),
- INTC_VECT(SGPIO, 0x1f80),
- INTC_VECT(SGPIO, 0x1fa0),
+ INTC_VECT(MMC1, 0x1c60), INTC_VECT(MMC2, 0x1c80),
+ INTC_VECT(ECCU, 0x1cc0),
+ INTC_VECT(PCIC, 0x1ce0),
+ INTC_VECT(G200, 0x1d00),
+ INTC_VECT(RSPI, 0x1d80), INTC_VECT(RSPI, 0x1da0),
+ INTC_VECT(RSPI, 0x1dc0), INTC_VECT(RSPI, 0x1de0),
+ INTC_VECT(PECI3, 0x1ec0), INTC_VECT(PECI4, 0x1ee0),
+ INTC_VECT(PECI5, 0x1f00),
+ INTC_VECT(SGPIO, 0x1f80), INTC_VECT(SGPIO, 0x1fa0),
+ INTC_VECT(SGPIO, 0x1fc0),
+ INTC_VECT(DMINT12, 0x2400), INTC_VECT(DMINT13, 0x2420),
+ INTC_VECT(DMINT14, 0x2440), INTC_VECT(DMINT15, 0x2460),
+ INTC_VECT(DMINT16, 0x2480), INTC_VECT(DMINT17, 0x24e0),
+ INTC_VECT(DMINT18, 0x2500), INTC_VECT(DMINT19, 0x2520),
+ INTC_VECT(DMINT20, 0x2540), INTC_VECT(DMINT21, 0x2560),
+ INTC_VECT(DMINT22, 0x2580), INTC_VECT(DMINT23, 0x2600),
+ INTC_VECT(DDRECC, 0x2620),
+ INTC_VECT(TSIP, 0x2640),
+ INTC_VECT(PCIE_BRIDGE, 0x27c0),
+ INTC_VECT(WDT0B, 0x2800), INTC_VECT(WDT1B, 0x2820),
+ INTC_VECT(WDT2B, 0x2840), INTC_VECT(WDT3B, 0x2860),
+ INTC_VECT(WDT4B, 0x2880), INTC_VECT(WDT5B, 0x28a0),
+ INTC_VECT(WDT6B, 0x28c0), INTC_VECT(WDT7B, 0x28e0),
+ INTC_VECT(WDT8B, 0x2900),
+ INTC_VECT(GETHER0, 0x2960), INTC_VECT(GETHER1, 0x2980),
+ INTC_VECT(GETHER2, 0x29a0),
+ INTC_VECT(PBIA, 0x2a00), INTC_VECT(PBIB, 0x2a20),
+ INTC_VECT(PBIC, 0x2a40),
+ INTC_VECT(DMAE2, 0x2a60), INTC_VECT(DMAE3, 0x2a80),
+ INTC_VECT(SERMUX2, 0x2aa0), INTC_VECT(SERMUX3, 0x2b40),
+ INTC_VECT(LPC5, 0x2b60), INTC_VECT(LPC6, 0x2b80),
+ INTC_VECT(LPC7, 0x2c00), INTC_VECT(LPC8, 0x2c20),
};
static struct intc_group groups[] __initdata = {
@@ -312,31 +338,45 @@ static struct intc_mask_reg mask_registers[] __initdata = {
{ 0xffd40038, 0xffd4003c, 32, /* INT2MSKR / INT2MSKCR */
{ 0, 0, 0, 0, 0, 0, 0, 0,
- 0, DMAC1_8, 0, PECI0I, LPC, FRT, WDT1, TMR45,
- TMR23, TMR01, 0, 0, 0, 0, 0, DMAC0,
- HUDI, 0, WDT0, SCIF3, SCIF2, SDHI, TMU345, TMU012
+ 0, DMAC8_11, 0, PECI0, LPC, FRT, 0, TMR45,
+ TMR23, TMR01, 0, 0, 0, 0, 0, DMAC0_5,
+ HUDI, 0, 0, SCIF3, SCIF2, SDHI, TMU345, TMU012
} },
{ 0xffd400d0, 0xffd400d4, 32, /* INT2MSKR1 / INT2MSKCR1 */
{ IRQ15, IRQ14, IRQ13, IRQ12, IRQ11, IRQ10, SCIF4, ETHERC,
IRQ9, IRQ8, SCIF1, SCIF0, USB0, 0, 0, USB1,
- ADC1, 0, DMAC1_6, ADC0, SPI0, SIM, PECI2I, PECI1I,
+ ADC1, 0, DMAC6_7, ADC0, SPI0, SIM, PECI2, PECI1,
ARC4, 0, SPI1, JMC, 0, 0, 0, DVC
} },
{ 0xffd10038, 0xffd1003c, 32, /* INT2MSKR2 / INT2MSKCR2 */
- { IIC4_1, IIC4_2, IIC5_0, 0, 0, 0, SGPIO, 0,
- 0, 0, 0, IIC9_2, IIC8_2, IIC8_1, IIC8_0, IIC7_3,
+ { IIC4_1, IIC4_2, IIC5_0, ONFICTL, 0, 0, SGPIO, 0,
+ 0, G200, 0, IIC9_2, IIC8_2, IIC8_1, IIC8_0, IIC7_3,
IIC7_2, IIC7_1, IIC6_3, IIC0_0, IIC0_1, IIC0_2, IIC0_3, IIC3_1,
- IIC2_3, 0, IIC2_1, IIC9_1, IIC3_3, IIC1_0, PCIE, IIC2_2
+ IIC2_3, 0, IIC2_1, IIC9_1, IIC3_3, IIC1_0, 0, IIC2_2
} },
- { 0xffd100d0, 0xff1400d4, 32, /* INT2MSKR3 / INT2MSKCR4 */
- { 0, IIC6_1, IIC6_0, IIC5_1, IIC3_2, IIC2_0, 0, 0,
+ { 0xffd100d0, 0xffd100d4, 32, /* INT2MSKR3 / INT2MSKCR3 */
+ { MMC1, IIC6_1, IIC6_0, IIC5_1, IIC3_2, IIC2_0, PECI5, MMC2,
IIC1_3, IIC1_2, IIC9_0, IIC8_3, IIC4_3, IIC7_0, 0, IIC6_2,
- PCIINTA, 0, IIC4_0, 0, 0, 0, 0, IIC9_3,
+ PCIC, 0, IIC4_0, 0, ECCU, RSPI, 0, IIC9_3,
IIC3_0, 0, IIC5_3, IIC5_2, 0, 0, 0, IIC1_1
} },
+
+ { 0xffd20038, 0xffd2003c, 32, /* INT2MSKR4 / INT2MSKCR4 */
+ { WDT0B, WDT1B, WDT3B, GETHER0, 0, 0, 0, 0,
+ 0, 0, 0, LPC7, SERMUX2, DMAE3, DMAE2, PBIC,
+ PBIB, PBIA, GETHER1, DMINT12, DMINT13, DMINT14, DMINT15, TSIP,
+ DMINT23, 0, DMINT21, LPC6, 0, DMINT16, 0, DMINT22
+ } },
+
+ { 0xffd200d0, 0xffd200d4, 32, /* INT2MSKR5 / INT2MSKCR5 */
+ { 0, WDT8B, WDT7B, WDT4B, 0, DMINT20, 0, 0,
+ DMINT19, DMINT18, LPC5, SERMUX3, WDT2B, GETHER2, 0, 0,
+ 0, 0, PCIE_BRIDGE, 0, 0, 0, 0, LPC8,
+ DDRECC, 0, WDT6B, WDT5B, 0, 0, 0, DMINT17
+ } },
};
#define INTPRI 0xffd00010
@@ -372,6 +412,22 @@ static struct intc_mask_reg mask_registers[] __initdata = {
#define INT2PRI29 0xffd100b4
#define INT2PRI30 0xffd100b8
#define INT2PRI31 0xffd100bc
+#define INT2PRI32 0xffd20000
+#define INT2PRI33 0xffd20004
+#define INT2PRI34 0xffd20008
+#define INT2PRI35 0xffd2000c
+#define INT2PRI36 0xffd20010
+#define INT2PRI37 0xffd20014
+#define INT2PRI38 0xffd20018
+#define INT2PRI39 0xffd2001c
+#define INT2PRI40 0xffd200a0
+#define INT2PRI41 0xffd200a4
+#define INT2PRI42 0xffd200a8
+#define INT2PRI43 0xffd200ac
+#define INT2PRI44 0xffd200b0
+#define INT2PRI45 0xffd200b4
+#define INT2PRI46 0xffd200b8
+#define INT2PRI47 0xffd200bc
static struct intc_prio_reg prio_registers[] __initdata = {
{ INTPRI, 0, 32, 4, { IRQ0, IRQ1, IRQ2, IRQ3,
@@ -379,39 +435,61 @@ static struct intc_prio_reg prio_registers[] __initdata = {
{ INT2PRI0, 0, 32, 8, { TMU0, TMU1, TMU2, TMU2_TICPI } },
{ INT2PRI1, 0, 32, 8, { TMU3, TMU4, TMU5, SDHI } },
- { INT2PRI2, 0, 32, 8, { SCIF2, SCIF3, WDT0, IRQ8 } },
- { INT2PRI3, 0, 32, 8, { HUDI, DMAC0, ADC0, IRQ9 } },
+ { INT2PRI2, 0, 32, 8, { SCIF2, SCIF3, 0, IRQ8 } },
+ { INT2PRI3, 0, 32, 8, { HUDI, DMAC0_5, ADC0, IRQ9 } },
{ INT2PRI4, 0, 32, 8, { IRQ10, 0, TMR01, TMR23 } },
- { INT2PRI5, 0, 32, 8, { TMR45, WDT1, FRT, LPC } },
- { INT2PRI6, 0, 32, 8, { PECI0I, ETHERC, DMAC1_8, 0 } },
+ { INT2PRI5, 0, 32, 8, { TMR45, 0, FRT, LPC } },
+ { INT2PRI6, 0, 32, 8, { PECI0, ETHERC, DMAC8_11, 0 } },
{ INT2PRI7, 0, 32, 8, { SCIF4, 0, IRQ11, IRQ12 } },
{ INT2PRI8, 0, 32, 8, { 0, 0, 0, DVC } },
{ INT2PRI9, 0, 32, 8, { ARC4, 0, SPI1, JMC } },
- { INT2PRI10, 0, 32, 8, { SPI0, SIM, PECI2I, PECI1I } },
- { INT2PRI11, 0, 32, 8, { ADC1, IRQ13, DMAC1_6, IRQ14 } },
+ { INT2PRI10, 0, 32, 8, { SPI0, SIM, PECI2, PECI1 } },
+ { INT2PRI11, 0, 32, 8, { ADC1, IRQ13, DMAC6_7, IRQ14 } },
{ INT2PRI12, 0, 32, 8, { USB0, 0, IRQ15, USB1 } },
{ INT2PRI13, 0, 32, 8, { 0, 0, SCIF1, SCIF0 } },
{ INT2PRI16, 0, 32, 8, { IIC2_2, 0, 0, 0 } },
- { INT2PRI17, 0, 32, 8, { PCIE, 0, 0, IIC1_0 } },
+ { INT2PRI17, 0, 32, 8, { 0, 0, 0, IIC1_0 } },
{ INT2PRI18, 0, 32, 8, { IIC3_3, IIC9_1, IIC2_1, IIC1_2 } },
{ INT2PRI19, 0, 32, 8, { IIC2_3, IIC3_1, 0, IIC1_3 } },
{ INT2PRI20, 0, 32, 8, { IIC2_0, IIC6_3, IIC7_1, IIC7_2 } },
{ INT2PRI21, 0, 32, 8, { IIC7_3, IIC8_0, IIC8_1, IIC8_2 } },
- { INT2PRI22, 0, 32, 8, { IIC9_2, 0, 0, 0 } },
- { INT2PRI23, 0, 32, 8, { 0, SGPIO, IIC3_2, IIC5_1 } },
- { INT2PRI24, 0, 32, 8, { 0, 0, 0, IIC1_1 } },
+ { INT2PRI22, 0, 32, 8, { IIC9_2, MMC2, G200, 0 } },
+ { INT2PRI23, 0, 32, 8, { PECI5, SGPIO, IIC3_2, IIC5_1 } },
+ { INT2PRI24, 0, 32, 8, { PECI4, PECI3, 0, IIC1_1 } },
{ INT2PRI25, 0, 32, 8, { IIC3_0, 0, IIC5_3, IIC5_2 } },
- { INT2PRI26, 0, 32, 8, { 0, 0, 0, IIC9_3 } },
- { INT2PRI27, 0, 32, 8, { PCIINTA, IIC6_0, IIC4_0, IIC6_1 } },
- { INT2PRI28, 0, 32, 8, { IIC4_3, IIC7_0, 0, IIC6_2 } },
+ { INT2PRI26, 0, 32, 8, { ECCU, RSPI, 0, IIC9_3 } },
+ { INT2PRI27, 0, 32, 8, { PCIC, IIC6_0, IIC4_0, IIC6_1 } },
+ { INT2PRI28, 0, 32, 8, { IIC4_3, IIC7_0, MMC1, IIC6_2 } },
{ INT2PRI29, 0, 32, 8, { 0, 0, IIC9_0, IIC8_3 } },
- { INT2PRI30, 0, 32, 8, { IIC4_1, IIC4_2, IIC5_0, 0 } },
+ { INT2PRI30, 0, 32, 8, { IIC4_1, IIC4_2, IIC5_0, ONFICTL } },
{ INT2PRI31, 0, 32, 8, { IIC0_0, IIC0_1, IIC0_2, IIC0_3 } },
+ { INT2PRI32, 0, 32, 8, { DMINT22, 0, 0, 0 } },
+ { INT2PRI33, 0, 32, 8, { 0, 0, 0, DMINT16 } },
+ { INT2PRI34, 0, 32, 8, { 0, LPC6, DMINT21, DMINT18 } },
+ { INT2PRI35, 0, 32, 8, { DMINT23, TSIP, 0, DMINT19 } },
+ { INT2PRI36, 0, 32, 8, { DMINT20, GETHER1, PBIA, PBIB } },
+ { INT2PRI37, 0, 32, 8, { PBIC, DMAE2, DMAE3, SERMUX2 } },
+ { INT2PRI38, 0, 32, 8, { LPC7, 0, 0, 0 } },
+ { INT2PRI39, 0, 32, 8, { 0, 0, 0, WDT4B } },
+ { INT2PRI40, 0, 32, 8, { 0, 0, 0, DMINT17 } },
+ { INT2PRI41, 0, 32, 8, { DDRECC, 0, WDT6B, WDT5B } },
+ { INT2PRI42, 0, 32, 8, { 0, 0, 0, LPC8 } },
+ { INT2PRI43, 0, 32, 8, { 0, WDT7B, PCIE_BRIDGE, WDT8B } },
+ { INT2PRI44, 0, 32, 8, { WDT2B, GETHER2, 0, 0 } },
+ { INT2PRI45, 0, 32, 8, { 0, 0, LPC5, SERMUX3 } },
+ { INT2PRI46, 0, 32, 8, { WDT0B, WDT1B, WDT3B, GETHER0 } },
+ { INT2PRI47, 0, 32, 8, { DMINT12, DMINT13, DMINT14, DMINT15 } },
+};
+
+static struct intc_sense_reg sense_registers_irq8to15[] __initdata = {
+ { 0xffd100f8, 32, 2, /* ICR2 */ { IRQ15, IRQ14, IRQ13, IRQ12,
+ IRQ11, IRQ10, IRQ9, IRQ8 } },
};
static DECLARE_INTC_DESC(intc_desc, "sh7757", vectors, groups,
- mask_registers, prio_registers, NULL);
+ mask_registers, prio_registers,
+ sense_registers_irq8to15);
/* Support for external interrupt pins in IRQ mode */
static struct intc_vect vectors_irq0123[] __initdata = {
diff --git a/arch/sh/kernel/kprobes.c b/arch/sh/kernel/kprobes.c
index 4049d99f76e1..1208b09e95c3 100644
--- a/arch/sh/kernel/kprobes.c
+++ b/arch/sh/kernel/kprobes.c
@@ -20,9 +20,9 @@
DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
-static struct kprobe saved_current_opcode;
-static struct kprobe saved_next_opcode;
-static struct kprobe saved_next_opcode2;
+static DEFINE_PER_CPU(struct kprobe, saved_current_opcode);
+static DEFINE_PER_CPU(struct kprobe, saved_next_opcode);
+static DEFINE_PER_CPU(struct kprobe, saved_next_opcode2);
#define OPCODE_JMP(x) (((x) & 0xF0FF) == 0x402b)
#define OPCODE_JSR(x) (((x) & 0xF0FF) == 0x400b)
@@ -102,16 +102,21 @@ int __kprobes kprobe_handle_illslot(unsigned long pc)
void __kprobes arch_remove_kprobe(struct kprobe *p)
{
- if (saved_next_opcode.addr != 0x0) {
+ struct kprobe *saved = &__get_cpu_var(saved_next_opcode);
+
+ if (saved->addr) {
arch_disarm_kprobe(p);
- arch_disarm_kprobe(&saved_next_opcode);
- saved_next_opcode.addr = 0x0;
- saved_next_opcode.opcode = 0x0;
-
- if (saved_next_opcode2.addr != 0x0) {
- arch_disarm_kprobe(&saved_next_opcode2);
- saved_next_opcode2.addr = 0x0;
- saved_next_opcode2.opcode = 0x0;
+ arch_disarm_kprobe(saved);
+
+ saved->addr = NULL;
+ saved->opcode = 0;
+
+ saved = &__get_cpu_var(saved_next_opcode2);
+ if (saved->addr) {
+ arch_disarm_kprobe(saved);
+
+ saved->addr = NULL;
+ saved->opcode = 0;
}
}
}
@@ -141,57 +146,59 @@ static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
*/
static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
{
- kprobe_opcode_t *addr = NULL;
- saved_current_opcode.addr = (kprobe_opcode_t *) (regs->pc);
- addr = saved_current_opcode.addr;
+ __get_cpu_var(saved_current_opcode).addr = (kprobe_opcode_t *)regs->pc;
if (p != NULL) {
+ struct kprobe *op1, *op2;
+
arch_disarm_kprobe(p);
+ op1 = &__get_cpu_var(saved_next_opcode);
+ op2 = &__get_cpu_var(saved_next_opcode2);
+
if (OPCODE_JSR(p->opcode) || OPCODE_JMP(p->opcode)) {
unsigned int reg_nr = ((p->opcode >> 8) & 0x000F);
- saved_next_opcode.addr =
- (kprobe_opcode_t *) regs->regs[reg_nr];
+ op1->addr = (kprobe_opcode_t *) regs->regs[reg_nr];
} else if (OPCODE_BRA(p->opcode) || OPCODE_BSR(p->opcode)) {
unsigned long disp = (p->opcode & 0x0FFF);
- saved_next_opcode.addr =
+ op1->addr =
(kprobe_opcode_t *) (regs->pc + 4 + disp * 2);
} else if (OPCODE_BRAF(p->opcode) || OPCODE_BSRF(p->opcode)) {
unsigned int reg_nr = ((p->opcode >> 8) & 0x000F);
- saved_next_opcode.addr =
+ op1->addr =
(kprobe_opcode_t *) (regs->pc + 4 +
regs->regs[reg_nr]);
} else if (OPCODE_RTS(p->opcode)) {
- saved_next_opcode.addr = (kprobe_opcode_t *) regs->pr;
+ op1->addr = (kprobe_opcode_t *) regs->pr;
} else if (OPCODE_BF(p->opcode) || OPCODE_BT(p->opcode)) {
unsigned long disp = (p->opcode & 0x00FF);
/* case 1 */
- saved_next_opcode.addr = p->addr + 1;
+ op1->addr = p->addr + 1;
/* case 2 */
- saved_next_opcode2.addr =
+ op2->addr =
(kprobe_opcode_t *) (regs->pc + 4 + disp * 2);
- saved_next_opcode2.opcode = *(saved_next_opcode2.addr);
- arch_arm_kprobe(&saved_next_opcode2);
+ op2->opcode = *(op2->addr);
+ arch_arm_kprobe(op2);
} else if (OPCODE_BF_S(p->opcode) || OPCODE_BT_S(p->opcode)) {
unsigned long disp = (p->opcode & 0x00FF);
/* case 1 */
- saved_next_opcode.addr = p->addr + 2;
+ op1->addr = p->addr + 2;
/* case 2 */
- saved_next_opcode2.addr =
+ op2->addr =
(kprobe_opcode_t *) (regs->pc + 4 + disp * 2);
- saved_next_opcode2.opcode = *(saved_next_opcode2.addr);
- arch_arm_kprobe(&saved_next_opcode2);
+ op2->opcode = *(op2->addr);
+ arch_arm_kprobe(op2);
} else {
- saved_next_opcode.addr = p->addr + 1;
+ op1->addr = p->addr + 1;
}
- saved_next_opcode.opcode = *(saved_next_opcode.addr);
- arch_arm_kprobe(&saved_next_opcode);
+ op1->opcode = *(op1->addr);
+ arch_arm_kprobe(op1);
}
}
@@ -376,21 +383,23 @@ static int __kprobes post_kprobe_handler(struct pt_regs *regs)
cur->post_handler(cur, regs, 0);
}
- if (saved_next_opcode.addr != 0x0) {
- arch_disarm_kprobe(&saved_next_opcode);
- saved_next_opcode.addr = 0x0;
- saved_next_opcode.opcode = 0x0;
+ p = &__get_cpu_var(saved_next_opcode);
+ if (p->addr) {
+ arch_disarm_kprobe(p);
+ p->addr = NULL;
+ p->opcode = 0;
- addr = saved_current_opcode.addr;
- saved_current_opcode.addr = 0x0;
+ addr = __get_cpu_var(saved_current_opcode).addr;
+ __get_cpu_var(saved_current_opcode).addr = NULL;
p = get_kprobe(addr);
arch_arm_kprobe(p);
- if (saved_next_opcode2.addr != 0x0) {
- arch_disarm_kprobe(&saved_next_opcode2);
- saved_next_opcode2.addr = 0x0;
- saved_next_opcode2.opcode = 0x0;
+ p = &__get_cpu_var(saved_next_opcode2);
+ if (p->addr) {
+ arch_disarm_kprobe(p);
+ p->addr = NULL;
+ p->opcode = 0;
}
}
@@ -572,14 +581,5 @@ static struct kprobe trampoline_p = {
int __init arch_init_kprobes(void)
{
- saved_next_opcode.addr = 0x0;
- saved_next_opcode.opcode = 0x0;
-
- saved_current_opcode.addr = 0x0;
- saved_current_opcode.opcode = 0x0;
-
- saved_next_opcode2.addr = 0x0;
- saved_next_opcode2.opcode = 0x0;
-
return register_kprobe(&trampoline_p);
}
diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c
index 052981972ae6..ee22a583d48c 100644
--- a/arch/sh/kernel/process_32.c
+++ b/arch/sh/kernel/process_32.c
@@ -296,7 +296,8 @@ asmlinkage int sys_vfork(unsigned long r4, unsigned long r5,
/*
* sys_execve() executes a new program.
*/
-asmlinkage int sys_execve(char __user *ufilename, char __user * __user *uargv,
+asmlinkage int sys_execve(const char __user *ufilename,
+ char __user * __user *uargv,
char __user * __user *uenvp, unsigned long r7,
struct pt_regs __regs)
{
diff --git a/arch/sh/kernel/ptrace.c b/arch/sh/kernel/ptrace.c
new file mode 100644
index 000000000000..0a05983633ca
--- /dev/null
+++ b/arch/sh/kernel/ptrace.c
@@ -0,0 +1,33 @@
+#include <linux/ptrace.h>
+
+/**
+ * regs_query_register_offset() - query register offset from its name
+ * @name: the name of a register
+ *
+ * regs_query_register_offset() returns the offset of a register in struct
+ * pt_regs from its name. If the name is invalid, this returns -EINVAL;
+ */
+int regs_query_register_offset(const char *name)
+{
+ const struct pt_regs_offset *roff;
+ for (roff = regoffset_table; roff->name != NULL; roff++)
+ if (!strcmp(roff->name, name))
+ return roff->offset;
+ return -EINVAL;
+}
+
+/**
+ * regs_query_register_name() - query register name from its offset
+ * @offset: the offset of a register in struct pt_regs.
+ *
+ * regs_query_register_name() returns the name of a register from its
+ * offset in struct pt_regs. If the @offset is invalid, this returns NULL;
+ */
+const char *regs_query_register_name(unsigned int offset)
+{
+ const struct pt_regs_offset *roff;
+ for (roff = regoffset_table; roff->name != NULL; roff++)
+ if (roff->offset == offset)
+ return roff->name;
+ return NULL;
+}
diff --git a/arch/sh/kernel/ptrace_32.c b/arch/sh/kernel/ptrace_32.c
index 6c4bbba2a675..2cd42b58cb20 100644
--- a/arch/sh/kernel/ptrace_32.c
+++ b/arch/sh/kernel/ptrace_32.c
@@ -274,6 +274,33 @@ static int dspregs_active(struct task_struct *target,
}
#endif
+const struct pt_regs_offset regoffset_table[] = {
+ REGS_OFFSET_NAME(0),
+ REGS_OFFSET_NAME(1),
+ REGS_OFFSET_NAME(2),
+ REGS_OFFSET_NAME(3),
+ REGS_OFFSET_NAME(4),
+ REGS_OFFSET_NAME(5),
+ REGS_OFFSET_NAME(6),
+ REGS_OFFSET_NAME(7),
+ REGS_OFFSET_NAME(8),
+ REGS_OFFSET_NAME(9),
+ REGS_OFFSET_NAME(10),
+ REGS_OFFSET_NAME(11),
+ REGS_OFFSET_NAME(12),
+ REGS_OFFSET_NAME(13),
+ REGS_OFFSET_NAME(14),
+ REGS_OFFSET_NAME(15),
+ REG_OFFSET_NAME(pc),
+ REG_OFFSET_NAME(pr),
+ REG_OFFSET_NAME(sr),
+ REG_OFFSET_NAME(gbr),
+ REG_OFFSET_NAME(mach),
+ REG_OFFSET_NAME(macl),
+ REG_OFFSET_NAME(tra),
+ REG_OFFSET_END,
+};
+
/*
* These are our native regset flavours.
*/
diff --git a/arch/sh/kernel/ptrace_64.c b/arch/sh/kernel/ptrace_64.c
index 5fd644da7f02..b97817016b6a 100644
--- a/arch/sh/kernel/ptrace_64.c
+++ b/arch/sh/kernel/ptrace_64.c
@@ -252,6 +252,85 @@ static int fpregs_active(struct task_struct *target,
}
#endif
+const struct pt_regs_offset regoffset_table[] = {
+ REG_OFFSET_NAME(pc),
+ REG_OFFSET_NAME(sr),
+ REG_OFFSET_NAME(syscall_nr),
+ REGS_OFFSET_NAME(0),
+ REGS_OFFSET_NAME(1),
+ REGS_OFFSET_NAME(2),
+ REGS_OFFSET_NAME(3),
+ REGS_OFFSET_NAME(4),
+ REGS_OFFSET_NAME(5),
+ REGS_OFFSET_NAME(6),
+ REGS_OFFSET_NAME(7),
+ REGS_OFFSET_NAME(8),
+ REGS_OFFSET_NAME(9),
+ REGS_OFFSET_NAME(10),
+ REGS_OFFSET_NAME(11),
+ REGS_OFFSET_NAME(12),
+ REGS_OFFSET_NAME(13),
+ REGS_OFFSET_NAME(14),
+ REGS_OFFSET_NAME(15),
+ REGS_OFFSET_NAME(16),
+ REGS_OFFSET_NAME(17),
+ REGS_OFFSET_NAME(18),
+ REGS_OFFSET_NAME(19),
+ REGS_OFFSET_NAME(20),
+ REGS_OFFSET_NAME(21),
+ REGS_OFFSET_NAME(22),
+ REGS_OFFSET_NAME(23),
+ REGS_OFFSET_NAME(24),
+ REGS_OFFSET_NAME(25),
+ REGS_OFFSET_NAME(26),
+ REGS_OFFSET_NAME(27),
+ REGS_OFFSET_NAME(28),
+ REGS_OFFSET_NAME(29),
+ REGS_OFFSET_NAME(30),
+ REGS_OFFSET_NAME(31),
+ REGS_OFFSET_NAME(32),
+ REGS_OFFSET_NAME(33),
+ REGS_OFFSET_NAME(34),
+ REGS_OFFSET_NAME(35),
+ REGS_OFFSET_NAME(36),
+ REGS_OFFSET_NAME(37),
+ REGS_OFFSET_NAME(38),
+ REGS_OFFSET_NAME(39),
+ REGS_OFFSET_NAME(40),
+ REGS_OFFSET_NAME(41),
+ REGS_OFFSET_NAME(42),
+ REGS_OFFSET_NAME(43),
+ REGS_OFFSET_NAME(44),
+ REGS_OFFSET_NAME(45),
+ REGS_OFFSET_NAME(46),
+ REGS_OFFSET_NAME(47),
+ REGS_OFFSET_NAME(48),
+ REGS_OFFSET_NAME(49),
+ REGS_OFFSET_NAME(50),
+ REGS_OFFSET_NAME(51),
+ REGS_OFFSET_NAME(52),
+ REGS_OFFSET_NAME(53),
+ REGS_OFFSET_NAME(54),
+ REGS_OFFSET_NAME(55),
+ REGS_OFFSET_NAME(56),
+ REGS_OFFSET_NAME(57),
+ REGS_OFFSET_NAME(58),
+ REGS_OFFSET_NAME(59),
+ REGS_OFFSET_NAME(60),
+ REGS_OFFSET_NAME(61),
+ REGS_OFFSET_NAME(62),
+ REGS_OFFSET_NAME(63),
+ TREGS_OFFSET_NAME(0),
+ TREGS_OFFSET_NAME(1),
+ TREGS_OFFSET_NAME(2),
+ TREGS_OFFSET_NAME(3),
+ TREGS_OFFSET_NAME(4),
+ TREGS_OFFSET_NAME(5),
+ TREGS_OFFSET_NAME(6),
+ TREGS_OFFSET_NAME(7),
+ REG_OFFSET_END,
+};
+
/*
* These are our native regset flavours.
*/
diff --git a/arch/sh/kernel/reboot.c b/arch/sh/kernel/reboot.c
index b1fca66bb92e..ca6a5ca64015 100644
--- a/arch/sh/kernel/reboot.c
+++ b/arch/sh/kernel/reboot.c
@@ -9,6 +9,7 @@
#include <asm/addrspace.h>
#include <asm/reboot.h>
#include <asm/system.h>
+#include <asm/tlbflush.h>
void (*pm_power_off)(void);
EXPORT_SYMBOL(pm_power_off);
@@ -25,6 +26,9 @@ static void native_machine_restart(char * __unused)
{
local_irq_disable();
+ /* Destroy all of the TLBs in preparation for reset by MMU */
+ __flush_tlb_global();
+
/* Address error with SR.BL=1 first. */
trigger_address_error();
diff --git a/arch/sh/kernel/syscalls_32.S b/arch/sh/kernel/syscalls_32.S
index 19fd11dd9871..3c6d669740a7 100644
--- a/arch/sh/kernel/syscalls_32.S
+++ b/arch/sh/kernel/syscalls_32.S
@@ -353,3 +353,6 @@ ENTRY(sys_call_table)
.long sys_pwritev
.long sys_rt_tgsigqueueinfo /* 335 */
.long sys_perf_event_open
+ .long sys_fanotify_init
+ .long sys_fanotify_mark
+ .long sys_prlimit64
diff --git a/arch/sh/kernel/syscalls_64.S b/arch/sh/kernel/syscalls_64.S
index 2048a20d7c80..66585708ce90 100644
--- a/arch/sh/kernel/syscalls_64.S
+++ b/arch/sh/kernel/syscalls_64.S
@@ -393,3 +393,6 @@ sys_call_table:
.long sys_perf_event_open
.long sys_recvmmsg /* 365 */
.long sys_accept4
+ .long sys_fanotify_init
+ .long sys_fanotify_mark
+ .long sys_prlimit64
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c
index c86a08540258..038793286990 100644
--- a/arch/sh/mm/consistent.c
+++ b/arch/sh/mm/consistent.c
@@ -38,11 +38,12 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size,
void *ret, *ret_nocache;
int order = get_order(size);
+ gfp |= __GFP_ZERO;
+
ret = (void *)__get_free_pages(gfp, order);
if (!ret)
return NULL;
- memset(ret, 0, size);
/*
* Pages from the page allocator may have data present in
* cache. So flush the cache before using uncached memory.
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c
index d0e249100e98..105f559d946d 100644
--- a/arch/sh/mm/init.c
+++ b/arch/sh/mm/init.c
@@ -47,7 +47,6 @@ static pte_t *__get_pte_phys(unsigned long addr)
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
- pte_t *pte;
pgd = pgd_offset_k(addr);
if (pgd_none(*pgd)) {
@@ -67,8 +66,7 @@ static pte_t *__get_pte_phys(unsigned long addr)
return NULL;
}
- pte = pte_offset_kernel(pmd, addr);
- return pte;
+ return pte_offset_kernel(pmd, addr);
}
static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot)
@@ -125,13 +123,45 @@ void __clear_fixmap(enum fixed_addresses idx, pgprot_t prot)
clear_pte_phys(address, prot);
}
+static pmd_t * __init one_md_table_init(pud_t *pud)
+{
+ if (pud_none(*pud)) {
+ pmd_t *pmd;
+
+ pmd = alloc_bootmem_pages(PAGE_SIZE);
+ pud_populate(&init_mm, pud, pmd);
+ BUG_ON(pmd != pmd_offset(pud, 0));
+ }
+
+ return pmd_offset(pud, 0);
+}
+
+static pte_t * __init one_page_table_init(pmd_t *pmd)
+{
+ if (pmd_none(*pmd)) {
+ pte_t *pte;
+
+ pte = alloc_bootmem_pages(PAGE_SIZE);
+ pmd_populate_kernel(&init_mm, pmd, pte);
+ BUG_ON(pte != pte_offset_kernel(pmd, 0));
+ }
+
+ return pte_offset_kernel(pmd, 0);
+}
+
+static pte_t * __init page_table_kmap_check(pte_t *pte, pmd_t *pmd,
+ unsigned long vaddr, pte_t *lastpte)
+{
+ return pte;
+}
+
void __init page_table_range_init(unsigned long start, unsigned long end,
pgd_t *pgd_base)
{
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
- pte_t *pte;
+ pte_t *pte = NULL;
int i, j, k;
unsigned long vaddr;
@@ -144,19 +174,13 @@ void __init page_table_range_init(unsigned long start, unsigned long end,
for ( ; (i < PTRS_PER_PGD) && (vaddr != end); pgd++, i++) {
pud = (pud_t *)pgd;
for ( ; (j < PTRS_PER_PUD) && (vaddr != end); pud++, j++) {
-#ifdef __PAGETABLE_PMD_FOLDED
- pmd = (pmd_t *)pud;
-#else
- pmd = (pmd_t *)alloc_bootmem_low_pages(PAGE_SIZE);
- pud_populate(&init_mm, pud, pmd);
+ pmd = one_md_table_init(pud);
+#ifndef __PAGETABLE_PMD_FOLDED
pmd += k;
#endif
for (; (k < PTRS_PER_PMD) && (vaddr != end); pmd++, k++) {
- if (pmd_none(*pmd)) {
- pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
- pmd_populate_kernel(&init_mm, pmd, pte);
- BUG_ON(pte != pte_offset_kernel(pmd, 0));
- }
+ pte = page_table_kmap_check(one_page_table_init(pmd),
+ pmd, vaddr, pte);
vaddr += PMD_SIZE;
}
k = 0;
diff --git a/arch/sh/mm/nommu.c b/arch/sh/mm/nommu.c
index 7694f50c9034..36312d254faf 100644
--- a/arch/sh/mm/nommu.c
+++ b/arch/sh/mm/nommu.c
@@ -67,6 +67,10 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
BUG();
}
+void __flush_tlb_global(void)
+{
+}
+
void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte)
{
}
diff --git a/arch/sh/mm/tlbflush_32.c b/arch/sh/mm/tlbflush_32.c
index 3fbe03ce8fe3..a6a20d6de4c0 100644
--- a/arch/sh/mm/tlbflush_32.c
+++ b/arch/sh/mm/tlbflush_32.c
@@ -119,3 +119,19 @@ void local_flush_tlb_mm(struct mm_struct *mm)
local_irq_restore(flags);
}
}
+
+void __flush_tlb_global(void)
+{
+ unsigned long flags;
+
+ local_irq_save(flags);
+
+ /*
+ * This is the most destructive of the TLB flushing options,
+ * and will tear down all of the UTLB/ITLB mappings, including
+ * wired entries.
+ */
+ __raw_writel(__raw_readl(MMUCR) | MMUCR_TI, MMUCR);
+
+ local_irq_restore(flags);
+}
diff --git a/arch/sh/mm/tlbflush_64.c b/arch/sh/mm/tlbflush_64.c
index 03db41cc1268..7f5810f5dfdc 100644
--- a/arch/sh/mm/tlbflush_64.c
+++ b/arch/sh/mm/tlbflush_64.c
@@ -455,6 +455,11 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
flush_tlb_all();
}
+void __flush_tlb_global(void)
+{
+ flush_tlb_all();
+}
+
void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte)
{
}
diff --git a/arch/sh/tools/mach-types b/arch/sh/tools/mach-types
index b25aa554ee5e..9f56eb978024 100644
--- a/arch/sh/tools/mach-types
+++ b/arch/sh/tools/mach-types
@@ -52,6 +52,8 @@ MIGOR SH_MIGOR
RSK7201 SH_RSK7201
RSK7203 SH_RSK7203
AP325RXA SH_AP325RXA
+SH2007 SH_SH2007
+SH7757LCR SH_SH7757LCR
SH7763RDP SH_SH7763RDP
SH7785LCR SH_SH7785LCR
SH7785LCR_PT SH_SH7785LCR_PT
diff --git a/arch/sparc/include/asm/fb.h b/arch/sparc/include/asm/fb.h
index e834880be204..2173432ad7f7 100644
--- a/arch/sparc/include/asm/fb.h
+++ b/arch/sparc/include/asm/fb.h
@@ -1,5 +1,6 @@
#ifndef _SPARC_FB_H_
#define _SPARC_FB_H_
+#include <linux/console.h>
#include <linux/fb.h>
#include <linux/fs.h>
#include <asm/page.h>
@@ -18,6 +19,9 @@ static inline int fb_is_primary_device(struct fb_info *info)
struct device *dev = info->device;
struct device_node *node;
+ if (console_set_on_cmdline)
+ return 0;
+
node = dev->of_node;
if (node &&
node == of_console_device)
diff --git a/arch/sparc/include/asm/unistd.h b/arch/sparc/include/asm/unistd.h
index d0b3b01ac9d4..03eb5a8f6f93 100644
--- a/arch/sparc/include/asm/unistd.h
+++ b/arch/sparc/include/asm/unistd.h
@@ -397,8 +397,11 @@
#define __NR_rt_tgsigqueueinfo 326
#define __NR_perf_event_open 327
#define __NR_recvmmsg 328
+#define __NR_fanotify_init 329
+#define __NR_fanotify_mark 330
+#define __NR_prlimit64 331
-#define NR_syscalls 329
+#define NR_syscalls 332
#ifdef __32bit_syscall_numbers__
/* Sparc 32-bit only has the "setresuid32", "getresuid32" variants,
diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S
index 46a76ba3fb4b..44e5faf1ad5f 100644
--- a/arch/sparc/kernel/sys32.S
+++ b/arch/sparc/kernel/sys32.S
@@ -330,6 +330,15 @@ do_sys_accept4: /* sys_accept4(int, struct sockaddr *, int *, int) */
nop
nop
+ .globl sys32_fanotify_mark
+sys32_fanotify_mark:
+ sethi %hi(sys_fanotify_mark), %g1
+ sllx %o2, 32, %o2
+ or %o2, %o3, %o2
+ mov %o4, %o3
+ jmpl %g1 + %lo(sys_fanotify_mark), %g0
+ mov %o5, %o4
+
.section __ex_table,"a"
.align 4
.word 1b, __retl_efault, 2b, __retl_efault
diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S
index 801fc8e5a0e8..ec396e1916b9 100644
--- a/arch/sparc/kernel/systbls_32.S
+++ b/arch/sparc/kernel/systbls_32.S
@@ -82,5 +82,6 @@ sys_call_table:
/*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate
/*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1
/*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, sys_preadv
-/*325*/ .long sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg
+/*325*/ .long sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init
+/*330*/ .long sys_fanotify_mark, sys_prlimit64
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S
index 9db058dd039e..8cfcaa549580 100644
--- a/arch/sparc/kernel/systbls_64.S
+++ b/arch/sparc/kernel/systbls_64.S
@@ -83,7 +83,8 @@ sys_call_table32:
/*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate
.word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1
/*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, compat_sys_preadv
- .word compat_sys_pwritev, compat_sys_rt_tgsigqueueinfo, sys_perf_event_open, compat_sys_recvmmsg
+ .word compat_sys_pwritev, compat_sys_rt_tgsigqueueinfo, sys_perf_event_open, compat_sys_recvmmsg, sys_fanotify_init
+/*330*/ .word sys32_fanotify_mark, sys_prlimit64
#endif /* CONFIG_COMPAT */
@@ -158,4 +159,5 @@ sys_call_table:
/*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate
.word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1
/*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, sys_preadv
- .word sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg
+ .word sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init
+/*330*/ .word sys_fanotify_mark, sys_prlimit64
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index a84fc34c8f77..b925432df482 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2079,6 +2079,8 @@ source "drivers/pcmcia/Kconfig"
source "drivers/pci/hotplug/Kconfig"
+source "drivers/vbus/Kconfig"
+
endmenu
diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug
index 75085080b63e..7f1530838bc8 100644
--- a/arch/x86/Kconfig.debug
+++ b/arch/x86/Kconfig.debug
@@ -121,16 +121,6 @@ config DEBUG_NX_TEST
and the software setup of this feature.
If in doubt, say "N"
-config 4KSTACKS
- bool "Use 4Kb for kernel stacks instead of 8Kb"
- depends on X86_32
- ---help---
- If you say Y here the kernel will use a 4Kb stacksize for the
- kernel stack attached to each process/thread. This facilitates
- running more threads on a system and also reduces the pressure
- on the VM subsystem for higher order allocations. This option
- will also use IRQ stacks to compensate for the reduced stackspace.
-
config DOUBLEFAULT
default y
bool "Enable doublefault exception handler" if EMBEDDED
diff --git a/arch/x86/include/asm/apb_timer.h b/arch/x86/include/asm/apb_timer.h
index a69b1ac9eaf8..2fefa501d3ba 100644
--- a/arch/x86/include/asm/apb_timer.h
+++ b/arch/x86/include/asm/apb_timer.h
@@ -54,7 +54,6 @@ extern struct clock_event_device *global_clock_event;
extern unsigned long apbt_quick_calibrate(void);
extern int arch_setup_apbt_irqs(int irq, int trigger, int mask, int cpu);
extern void apbt_setup_secondary_clock(void);
-extern unsigned int boot_cpu_id;
extern struct sfi_timer_table_entry *sfi_get_mtmr(int hint);
extern void sfi_free_mtmr(struct sfi_timer_table_entry *mtmr);
diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h
index b185091bf19c..4fab24de26b1 100644
--- a/arch/x86/include/asm/cpu.h
+++ b/arch/x86/include/asm/cpu.h
@@ -32,6 +32,5 @@ extern void arch_unregister_cpu(int);
DECLARE_PER_CPU(int, cpu_state);
-extern unsigned int boot_cpu_id;
#endif /* _ASM_X86_CPU_H */
diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h
index 5458380b6ef8..0bf5b0083650 100644
--- a/arch/x86/include/asm/irq.h
+++ b/arch/x86/include/asm/irq.h
@@ -19,18 +19,16 @@ static inline int irq_canonicalize(int irq)
# define ARCH_HAS_NMI_WATCHDOG
#endif
-#ifdef CONFIG_4KSTACKS
- extern void irq_ctx_init(int cpu);
- extern void irq_ctx_exit(int cpu);
-# define __ARCH_HAS_DO_SOFTIRQ
+#ifdef CONFIG_X86_32
+extern void irq_ctx_init(int cpu);
+extern void irq_ctx_exit(int cpu);
#else
# define irq_ctx_init(cpu) do { } while (0)
# define irq_ctx_exit(cpu) do { } while (0)
-# ifdef CONFIG_X86_64
-# define __ARCH_HAS_DO_SOFTIRQ
-# endif
#endif
+#define __ARCH_HAS_DO_SOFTIRQ
+
#ifdef CONFIG_HOTPLUG_CPU
#include <linux/cpumask.h>
extern void fixup_irqs(void);
diff --git a/arch/x86/include/asm/module.h b/arch/x86/include/asm/module.h
index 3e2ce58a31a3..67763c5d8b4e 100644
--- a/arch/x86/include/asm/module.h
+++ b/arch/x86/include/asm/module.h
@@ -60,12 +60,7 @@
#endif
#ifdef CONFIG_X86_32
-# ifdef CONFIG_4KSTACKS
-# define MODULE_STACKSIZE "4KSTACKS "
-# else
-# define MODULE_STACKSIZE ""
-# endif
-# define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY MODULE_STACKSIZE
+# define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY
#endif
#endif /* _ASM_X86_MODULE_H */
diff --git a/arch/x86/include/asm/page_32_types.h b/arch/x86/include/asm/page_32_types.h
index 6f1b7331313f..ade619ff9e2a 100644
--- a/arch/x86/include/asm/page_32_types.h
+++ b/arch/x86/include/asm/page_32_types.h
@@ -15,11 +15,7 @@
*/
#define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
-#ifdef CONFIG_4KSTACKS
-#define THREAD_ORDER 0
-#else
#define THREAD_ORDER 1
-#endif
#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER)
#define STACKFAULT_STACK 0
diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h
index 404a880ea325..d395540ff894 100644
--- a/arch/x86/include/asm/pci.h
+++ b/arch/x86/include/asm/pci.h
@@ -27,6 +27,9 @@ extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops,
int node);
extern struct pci_bus *pci_scan_bus_with_sysdata(int busno);
+#ifdef CONFIG_PCI
+
+#ifdef CONFIG_PCI_DOMAINS
static inline int pci_domain_nr(struct pci_bus *bus)
{
struct pci_sysdata *sd = bus->sysdata;
@@ -37,13 +40,12 @@ static inline int pci_proc_domain(struct pci_bus *bus)
{
return pci_domain_nr(bus);
}
-
+#endif
/* Can be used to override the logic in pci_scan_bus for skipping
already-configured bus numbers - to be used for buggy BIOSes
or architectures with incomplete PCI setup by the loader */
-#ifdef CONFIG_PCI
extern unsigned int pcibios_assign_all_busses(void);
extern int pci_legacy_init(void);
# ifdef CONFIG_ACPI
diff --git a/arch/x86/kernel/apb_timer.c b/arch/x86/kernel/apb_timer.c
index 8dd77800ff5d..08f75fb4f509 100644
--- a/arch/x86/kernel/apb_timer.c
+++ b/arch/x86/kernel/apb_timer.c
@@ -343,7 +343,7 @@ void apbt_setup_secondary_clock(void)
/* Don't register boot CPU clockevent */
cpu = smp_processor_id();
- if (cpu == boot_cpu_id)
+ if (!cpu)
return;
/*
* We need to calculate the scaled math multiplication factor for
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 4dc0084ec1b1..8884928d7bc1 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -162,7 +162,7 @@ int __init arch_early_irq_init(void)
cfg = irq_cfgx;
count = ARRAY_SIZE(irq_cfgx);
- node= cpu_to_node(boot_cpu_id);
+ node = cpu_to_node(0);
for (i = 0; i < count; i++) {
desc = irq_to_desc(i);
@@ -1483,7 +1483,7 @@ static void __init setup_IO_APIC_irqs(void)
int notcon = 0;
struct irq_desc *desc;
struct irq_cfg *cfg;
- int node = cpu_to_node(boot_cpu_id);
+ int node = cpu_to_node(0);
apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
@@ -1548,7 +1548,7 @@ static void __init setup_IO_APIC_irqs(void)
void setup_IO_APIC_irq_extra(u32 gsi)
{
int apic_id = 0, pin, idx, irq;
- int node = cpu_to_node(boot_cpu_id);
+ int node = cpu_to_node(0);
struct irq_desc *desc;
struct irq_cfg *cfg;
@@ -2925,7 +2925,7 @@ static inline void __init check_timer(void)
{
struct irq_desc *desc = irq_to_desc(0);
struct irq_cfg *cfg = desc->chip_data;
- int node = cpu_to_node(boot_cpu_id);
+ int node = cpu_to_node(0);
int apic1, pin1, apic2, pin2;
unsigned long flags;
int no_pin1 = 0;
@@ -3279,7 +3279,7 @@ unsigned int create_irq_nr(unsigned int irq_want, int node)
int create_irq(void)
{
- int node = cpu_to_node(boot_cpu_id);
+ int node = cpu_to_node(0);
unsigned int irq_want;
int irq;
@@ -3901,7 +3901,7 @@ static int __io_apic_set_pci_routing(struct device *dev, int irq,
if (dev)
node = dev_to_node(dev);
else
- node = cpu_to_node(boot_cpu_id);
+ node = cpu_to_node(0);
desc = irq_to_desc_alloc_node(irq, node);
if (!desc) {
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index 60a57b13082d..3a7c852f021d 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -148,7 +148,7 @@ static void __cpuinit amd_k7_smp_check(struct cpuinfo_x86 *c)
{
#ifdef CONFIG_SMP
/* calling is from identify_secondary_cpu() ? */
- if (c->cpu_index == boot_cpu_id)
+ if (!c->cpu_index)
return;
/*
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 490dac63c2d2..787b3c7c6625 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -665,7 +665,7 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
this_cpu->c_early_init(c);
#ifdef CONFIG_SMP
- c->cpu_index = boot_cpu_id;
+ c->cpu_index = 0;
#endif
filter_cpuid_features(c, false);
}
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 85f69cdeae10..3a683ea5267e 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -169,7 +169,7 @@ static void __cpuinit intel_smp_check(struct cpuinfo_x86 *c)
{
#ifdef CONFIG_SMP
/* calling is from identify_secondary_cpu() ? */
- if (c->cpu_index == boot_cpu_id)
+ if (!c->cpu_index)
return;
/*
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c
index 1f11f5ce668f..339b4502daff 100644
--- a/arch/x86/kernel/i387.c
+++ b/arch/x86/kernel/i387.c
@@ -40,6 +40,7 @@
static unsigned int mxcsr_feature_mask __read_mostly = 0xffffffffu;
unsigned int xstate_size;
+EXPORT_SYMBOL_GPL(xstate_size);
unsigned int sig_xstate_ia32_size = sizeof(struct _fpstate_ia32);
static struct i387_fxsave_struct fx_scratch __cpuinitdata;
@@ -67,6 +68,12 @@ static void __cpuinit init_thread_xstate(void)
*/
if (!HAVE_HWFP) {
+ /*
+ * Disable xsave as we do not support it if i387
+ * emulation is enabled.
+ */
+ setup_clear_cpu_cap(X86_FEATURE_XSAVE);
+ setup_clear_cpu_cap(X86_FEATURE_XSAVEOPT);
xstate_size = sizeof(struct i387_soft_struct);
return;
}
diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c
index 10709f29d166..3b5609f54c4b 100644
--- a/arch/x86/kernel/irq_32.c
+++ b/arch/x86/kernel/irq_32.c
@@ -49,14 +49,13 @@ static inline int check_stack_overflow(void) { return 0; }
static inline void print_stack_overflow(void) { }
#endif
-#ifdef CONFIG_4KSTACKS
/*
* per-CPU IRQ handling contexts (thread information and stack)
*/
union irq_ctx {
struct thread_info tinfo;
u32 stack[THREAD_SIZE/sizeof(u32)];
-} __attribute__((aligned(PAGE_SIZE)));
+} __attribute__((aligned(THREAD_SIZE)));
static DEFINE_PER_CPU(union irq_ctx *, hardirq_ctx);
static DEFINE_PER_CPU(union irq_ctx *, softirq_ctx);
@@ -187,11 +186,6 @@ asmlinkage void do_softirq(void)
local_irq_restore(flags);
}
-#else
-static inline int
-execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) { return 0; }
-#endif
-
bool handle_irq(unsigned irq, struct pt_regs *regs)
{
struct irq_desc *desc;
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c
index ef10940e1af0..852b81967a37 100644
--- a/arch/x86/kernel/kgdb.c
+++ b/arch/x86/kernel/kgdb.c
@@ -194,7 +194,7 @@ static struct hw_breakpoint {
unsigned long addr;
int len;
int type;
- struct perf_event **pev;
+ struct perf_event * __percpu *pev;
} breakinfo[HBP_NUM];
static unsigned long early_dr7;
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 64ecaf0af9af..01881dd44a4a 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -44,7 +44,6 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
}
return 0;
}
-
void free_thread_xstate(struct task_struct *tsk)
{
fpu_free(&tsk->thread.fpu);
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
index e3af342fe83a..7a4cf14223ba 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -84,7 +84,7 @@ static int __init reboot_setup(char *str)
}
/* we will leave sorting out the final value
when we are ready to reboot, since we might not
- have set up boot_cpu_id or smp_num_cpu */
+ have detected BSP APIC ID or smp_num_cpu */
break;
#endif /* CONFIG_SMP */
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index b008e7883207..dede5c4bae4b 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -125,7 +125,6 @@ unsigned long max_pfn_mapped;
RESERVE_BRK(dmi_alloc, 65536);
#endif
-unsigned int boot_cpu_id __read_mostly;
static __initdata unsigned long _brk_start = (unsigned long)__brk_base;
unsigned long _brk_end = (unsigned long)__brk_base;
diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c
index a60df9ae6454..2335c15c93a4 100644
--- a/arch/x86/kernel/setup_percpu.c
+++ b/arch/x86/kernel/setup_percpu.c
@@ -253,7 +253,7 @@ void __init setup_per_cpu_areas(void)
* Up to this point, the boot CPU has been using .init.data
* area. Reload any changed state for the boot CPU.
*/
- if (cpu == boot_cpu_id)
+ if (!cpu)
switch_to_new_gdt(cpu);
}
diff --git a/arch/x86/kernel/time.c b/arch/x86/kernel/time.c
index fb5cc5e14cfa..476e2fe402b5 100644
--- a/arch/x86/kernel/time.c
+++ b/arch/x86/kernel/time.c
@@ -88,7 +88,7 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id)
static struct irqaction irq0 = {
.handler = timer_interrupt,
- .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
+ .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TIMER,
.name = "timer"
};
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
index 0fd6378981f4..f539c3c2a687 100644
--- a/arch/x86/kvm/i8254.c
+++ b/arch/x86/kvm/i8254.c
@@ -742,7 +742,7 @@ fail:
kvm_unregister_irq_mask_notifier(kvm, 0, &pit->mask_notifier);
kvm_unregister_irq_ack_notifier(kvm, &pit_state->irq_ack_notifier);
kvm_free_irq_source_id(kvm, pit->irq_source_id);
-
+ destroy_workqueue(pit->wq);
kfree(pit);
return NULL;
}
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 25f19078b321..3a09c625d526 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2387,7 +2387,7 @@ static void kvm_vcpu_ioctl_x86_get_xsave(struct kvm_vcpu *vcpu,
if (cpu_has_xsave)
memcpy(guest_xsave->region,
&vcpu->arch.guest_fpu.state->xsave,
- sizeof(struct xsave_struct));
+ xstate_size);
else {
memcpy(guest_xsave->region,
&vcpu->arch.guest_fpu.state->fxsave,
@@ -2405,7 +2405,7 @@ static int kvm_vcpu_ioctl_x86_set_xsave(struct kvm_vcpu *vcpu,
if (cpu_has_xsave)
memcpy(&vcpu->arch.guest_fpu.state->xsave,
- guest_xsave->region, sizeof(struct xsave_struct));
+ guest_xsave->region, xstate_size);
else {
if (xstate_bv & ~XSTATE_FPSSE)
return -EINVAL;
diff --git a/arch/x86/mm/k8topology_64.c b/arch/x86/mm/k8topology_64.c
index 970ed579d4e4..240f86462a83 100644
--- a/arch/x86/mm/k8topology_64.c
+++ b/arch/x86/mm/k8topology_64.c
@@ -54,8 +54,8 @@ static __init int find_northbridge(void)
static __init void early_get_boot_cpu_id(void)
{
/*
- * need to get boot_cpu_id so can use that to create apicid_to_node
- * in k8_scan_nodes()
+ * need to get the APIC ID of the BSP so can use that to
+ * create apicid_to_node in k8_scan_nodes()
*/
#ifdef CONFIG_X86_MPPARSE
/*
@@ -212,7 +212,7 @@ int __init k8_scan_nodes(void)
bits = boot_cpu_data.x86_coreid_bits;
cores = (1<<bits);
apicid_base = 0;
- /* need to get boot_cpu_id early for system with apicid lifting */
+ /* get the APIC ID of the BSP early for systems with apicid lifting */
early_get_boot_cpu_id();
if (boot_cpu_physical_apicid > 0) {
pr_info("BSP APIC ID: %02x\n", boot_cpu_physical_apicid);
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index 0859bfd8ae93..d88d09bd619e 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -81,10 +81,10 @@ config XTENSA_VARIANT_S6000
endchoice
config XTENSA_UNALIGNED_USER
- bool "Unaligned memory access in use space"
+ bool "Unaligned memory access in user space"
help
- The Xtensa architecture currently does not handle unaligned
- memory accesses in hardware but through an exception handler.
+ Xtensa processors are often not configured to handle unaligned
+ memory accesses in hardware, but rather through an exception handler.
Per default, unaligned memory accesses are disabled in user space.
Say Y here to enable unaligned memory access in user space.
@@ -154,8 +154,15 @@ config XTENSA_PLATFORM_ISS
config XTENSA_PLATFORM_XT2000
bool "XT2000"
help
- XT2000 is the name of Tensilica's feature-rich emulation platform.
- This hardware is capable of running a full Linux distribution.
+ XT2000 is the name of Tensilica's older emulation platform.
+
+config XTENSA_PLATFORM_XTAVNET
+ bool "XTAVNET"
+ select XTENSA_CALIBRATE_CCOUNT
+ select ETHOC
+ help
+ Selects support for the Tensilica-configured Avnet emulation boards.
+ These include the LX60 (XT-AV60), LX200 (XT-AV200), and LX110 (XT-AV110).
config XTENSA_PLATFORM_S6105
bool "S6105"
diff --git a/arch/xtensa/Makefile b/arch/xtensa/Makefile
index 7608559de93a..34d8427622eb 100644
--- a/arch/xtensa/Makefile
+++ b/arch/xtensa/Makefile
@@ -24,6 +24,7 @@ export VARIANT
# Platform configuration
platform-$(CONFIG_XTENSA_PLATFORM_XT2000) := xt2000
+platform-$(CONFIG_XTENSA_PLATFORM_XTAVNET) := xtavnet
platform-$(CONFIG_XTENSA_PLATFORM_ISS) := iss
platform-$(CONFIG_XTENSA_PLATFORM_S6105) := s6105
@@ -61,7 +62,9 @@ ifneq ($(VARIANT),)
ifneq ($(COMPILE_ARCH), xtensa)
ifndef CROSS_COMPILE
- CROSS_COMPILE = xtensa_$(VARIANT)-
+ CROSS_COMPILE := $(call cc-cross-prefix, xtensa_$(VARIANT)- \
+ xtensa-linux-uclibc- xtensa_$(VARIANT)-linux-uclibc- \
+ xtensa-linux-gnu- xtensa_$(VARIANT)-linux-gnu-)
endif
endif
endif
diff --git a/arch/xtensa/boot/Makefile b/arch/xtensa/boot/Makefile
index 40aa55b485be..8657c62fc78b 100644
--- a/arch/xtensa/boot/Makefile
+++ b/arch/xtensa/boot/Makefile
@@ -23,6 +23,7 @@ subdir-y := lib
bootdir-$(CONFIG_XTENSA_PLATFORM_ISS) += boot-elf
bootdir-$(CONFIG_XTENSA_PLATFORM_XT2000) += boot-redboot boot-elf
+bootdir-$(CONFIG_XTENSA_PLATFORM_XTAVNET) += boot-redboot boot-elf
zImage zImage.initrd Image Image.initrd: $(bootdir-y)
diff --git a/arch/xtensa/include/asm/coprocessor.h b/arch/xtensa/include/asm/coprocessor.h
index 75c94a1658b0..42da613d1623 100644
--- a/arch/xtensa/include/asm/coprocessor.h
+++ b/arch/xtensa/include/asm/coprocessor.h
@@ -1,11 +1,11 @@
/*
- * include/asm-xtensa/coprocessor.h
+ * arch/xtensa/include/asm/coprocessor.h
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
- * Copyright (C) 2003 - 2007 Tensilica Inc.
+ * Copyright (C) 2003-2010 Tensilica Inc.
*/
@@ -15,9 +15,10 @@
#include <linux/stringify.h>
#include <variant/core.h>
#include <variant/tie.h>
+#include <variant/core.h>
#include <asm/types.h>
-#ifdef __ASSEMBLY__
+#if defined(__ASSEMBLY__) && !defined(LINKER_SCRIPT)
# include <variant/tie-asm.h>
.macro xchal_sa_start a b
@@ -70,7 +71,7 @@
-#endif /* __ASSEMBLY__ */
+#endif /* __ASSEMBLY__ && !LINKER_SCRIPT */
/*
* XTENSA_HAVE_COPROCESSOR(x) returns 1 if coprocessor x is configured.
diff --git a/arch/xtensa/include/asm/io.h b/arch/xtensa/include/asm/io.h
index d04cd3a625fa..145db5cc6191 100644
--- a/arch/xtensa/include/asm/io.h
+++ b/arch/xtensa/include/asm/io.h
@@ -1,11 +1,11 @@
/*
- * include/asm-xtensa/io.h
+ * arch/xtensa/include/asm/io.h
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
- * Copyright (C) 2001 - 2005 Tensilica Inc.
+ * Copyright (C) 2001-2010 Tensilica Inc.
*/
#ifndef _XTENSA_IO_H
@@ -63,40 +63,33 @@ static inline void * phys_to_virt(unsigned long address)
#define bus_to_virt(x) phys_to_virt(x)
/*
- * Return the virtual (cached) address for the specified bus memory.
+ * Return the virtual (uncached) address for the specified bus memory
+ * (which is, for now, simply a physical address).
* Note that we currently don't support any address outside the KIO segment.
+ * See also arch/mips/include/asm/io.h for nice comments.
*/
-static inline void *ioremap(unsigned long offset, unsigned long size)
+static inline void __iomem *__ioremap(unsigned long offset, unsigned long size)
{
#ifdef CONFIG_MMU
if (offset >= XCHAL_KIO_PADDR
- && offset < XCHAL_KIO_PADDR + XCHAL_KIO_SIZE)
- return (void*)(offset-XCHAL_KIO_PADDR+XCHAL_KIO_BYPASS_VADDR);
+ && offset <= XCHAL_KIO_PADDR + XCHAL_KIO_SIZE - 1)
+ return (void __iomem *)(offset - XCHAL_KIO_PADDR + XCHAL_KIO_BYPASS_VADDR);
else
BUG();
#else
- return (void *)offset;
+ return (void __iomem *)offset;
#endif
}
-static inline void *ioremap_nocache(unsigned long offset, unsigned long size)
-{
-#ifdef CONFIG_MMU
- if (offset >= XCHAL_KIO_PADDR
- && offset < XCHAL_KIO_PADDR + XCHAL_KIO_SIZE)
- return (void*)(offset-XCHAL_KIO_PADDR+XCHAL_KIO_CACHED_VADDR);
- else
- BUG();
-#else
- return (void *)offset;
-#endif
-}
+#define ioremap(offset, size) __ioremap(offset, size)
+#define ioremap_nocache(offset, size) __ioremap(offset, size)
-static inline void iounmap(void *addr)
+static inline void iounmap(void __iomem *addr)
{
}
+
/*
* Generic I/O
*/
@@ -191,6 +184,13 @@ extern void outsl (unsigned long port, const void *src, unsigned long count);
#endif
+#ifndef CONFIG_GENERIC_IOMAP
+/* Partial Simple MMIO */
+#define ioread32(a) __raw_readl(a)
+#define iowrite32(v,a) __raw_writel((v),(a))
+#endif
+
+
/*
* Convert a physical pointer to a virtual kernel pointer for /dev/mem access
*/
diff --git a/arch/xtensa/include/asm/irq.h b/arch/xtensa/include/asm/irq.h
index 4c0ccc9c4f4c..6af436f4429d 100644
--- a/arch/xtensa/include/asm/irq.h
+++ b/arch/xtensa/include/asm/irq.h
@@ -1,11 +1,11 @@
/*
- * include/asm-xtensa/irq.h
+ * arch/xtensa/include/asm/irq.h
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
- * Copyright (C) 2001 - 2005 Tensilica Inc.
+ * Copyright (C) 2001-2010 Tensilica Inc.
*/
#ifndef _XTENSA_IRQ_H
@@ -22,6 +22,9 @@ static inline void variant_irq_enable(unsigned int irq) { }
static inline void variant_irq_disable(unsigned int irq) { }
#endif
+/* This number is used when no interrupt has been assigned. */
+#define NO_IRQ (-1)
+
#ifndef VARIANT_NR_IRQS
# define VARIANT_NR_IRQS 0
#endif
diff --git a/arch/xtensa/include/asm/serial.h b/arch/xtensa/include/asm/serial.h
index a8a2493260f6..c55a0e2b47ca 100644
--- a/arch/xtensa/include/asm/serial.h
+++ b/arch/xtensa/include/asm/serial.h
@@ -1,5 +1,5 @@
/*
- * include/asm-xtensa/serial.h
+ * arch/xtensa/include/asm/serial.h
*
* Configuration details for 8250, 16450, 16550, etc. serial ports
*
@@ -7,12 +7,20 @@
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
- * Copyright (C) 2001 - 2005 Tensilica Inc.
+ * Copyright (C) 2001-2010 Tensilica Inc.
*/
#ifndef _XTENSA_SERIAL_H
#define _XTENSA_SERIAL_H
+#include <asm/irq.h>
#include <platform/serial.h>
+/* The 8250 driver treats IRQ 0 as absent. For the Xtensa architecture,
+ interrupt 0 is valid, must compare against NO_IRQ instead. */
+#ifdef is_real_interrupt
+#undef is_real_interrupt
+#define is_real_interrupt(irq) ((irq) != NO_IRQ)
+#endif
+
#endif /* _XTENSA_SERIAL_H */
diff --git a/arch/xtensa/include/asm/uaccess.h b/arch/xtensa/include/asm/uaccess.h
index b8528426ab1f..5b0c18c1cce1 100644
--- a/arch/xtensa/include/asm/uaccess.h
+++ b/arch/xtensa/include/asm/uaccess.h
@@ -4,7 +4,7 @@
* User space memory access functions
*
* These routines provide basic accessing functions to the user memory
- * space for the kernel. This header file provides fuctions such as:
+ * space for the kernel. This header file provides functions such as:
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
diff --git a/arch/xtensa/kernel/Makefile b/arch/xtensa/kernel/Makefile
index 2d2728b3e862..e426a4ec7f22 100644
--- a/arch/xtensa/kernel/Makefile
+++ b/arch/xtensa/kernel/Makefile
@@ -27,8 +27,8 @@ sed-y = -e 's/\*(\(\.[a-z]*it\|\.ref\|\)\.text)/*(\1.literal \1.text)/g' \
-e 's/\*(\(\.text\.[a-z]*\))/*(\1.literal \1)/g'
quiet_cmd__cpp_lds_S = LDS $@
- cmd__cpp_lds_S = $(CPP) $(cpp_flags) -P -C -Uxtensa -D__ASSEMBLY__ $< \
- | sed $(sed-y) >$@
+ cmd__cpp_lds_S = $(CPP) $(cpp_flags) -P -C -Uxtensa -D__ASSEMBLY__ \
+ -DLINKER_SCRIPT $< | sed $(sed-y) >$@
$(obj)/vmlinux.lds: $(src)/vmlinux.lds.S FORCE
$(call if_changed_dep,_cpp_lds_S)
diff --git a/arch/xtensa/kernel/time.c b/arch/xtensa/kernel/time.c
index 19df764f6399..88ba96e2df25 100644
--- a/arch/xtensa/kernel/time.c
+++ b/arch/xtensa/kernel/time.c
@@ -31,7 +31,7 @@ unsigned long ccount_per_jiffy; /* per 1/HZ */
unsigned long nsec_per_ccount; /* nsec per ccount increment */
#endif
-static cycle_t ccount_read(void)
+static cycle_t ccount_read(struct clocksource *cs)
{
return (cycle_t)get_ccount();
}
diff --git a/arch/xtensa/platforms/xtavnet/Makefile b/arch/xtensa/platforms/xtavnet/Makefile
new file mode 100644
index 000000000000..06b120b40015
--- /dev/null
+++ b/arch/xtensa/platforms/xtavnet/Makefile
@@ -0,0 +1,10 @@
+# Makefile for the Tensilica Avnet-based Emulation Boards
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definitions are in the main makefile...
+
+obj-y = setup.o lcd.o
+
diff --git a/arch/xtensa/platforms/xtavnet/include/platform/hardware.h b/arch/xtensa/platforms/xtavnet/include/platform/hardware.h
new file mode 100644
index 000000000000..5301be745113
--- /dev/null
+++ b/arch/xtensa/platforms/xtavnet/include/platform/hardware.h
@@ -0,0 +1,85 @@
+/*
+ * arch/xtensa/platforms/xtavnet/include/platform/hardware.h
+ *
+ * This file contains the hardware configuration of Tensilica Avnet boards
+ * (XT-AV60, XT-AV110, XT-AV200, derived from Avnet LX60, LX110, LX200
+ * boards respectively).
+ *
+ * Copyright (C) 2006-2010 Tensilica Inc.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#ifndef __XTAVNET_HARDWARE_H
+#define __XTAVNET_HARDWARE_H
+
+#include <variant/core.h>
+
+/* Memory configuration. */
+
+#define PLATFORM_DEFAULT_MEM_START 0x00000000
+#define PLATFORM_DEFAULT_MEM_SIZE 0x04000000
+
+/* Interrupt configuration. */
+
+#define PLATFORM_NR_IRQS 2
+
+/*
+ * Default assignment of XTAVnet devices to external interrupts.
+ *
+ * CONFIG_ARCH_HAS_SMP means the hardware supports SMP, ie. is Xtensa MX.
+ *
+ * Systems with SMP support (MX) have an External Interrupt Distributor
+ * between external interrupts and the core's interrupts. The first three
+ * core interrupts are used for IPI (interprocessor interrupts), so
+ * external (board device) interrupts end up shifted up by 3.
+ */
+
+/* UART interrupt: */
+#ifdef CONFIG_ARCH_HAS_SMP
+#define UART_INTNUM XCHAL_EXTINT3_NUM
+#else
+#define UART_INTNUM XCHAL_EXTINT0_NUM
+#endif
+
+/* Ethernet interrupt: */
+#ifdef CONFIG_ARCH_HAS_SMP
+#define OETH_IRQ XCHAL_EXTINT4_NUM
+#else
+#define OETH_IRQ XCHAL_EXTINT1_NUM
+#endif
+
+/*
+ * Device addresses and parameters.
+ */
+
+/* UART */
+#define UART_PADDR 0xFD050020
+
+/* LCD instruction and data virt. addresses. */
+#define LCD_INSTR_ADDR (char*)(0xFD040000)
+#define LCD_DATA_ADDR (char*)(0xFD040004)
+
+/* Misc. */
+#define XTAVNET_FPGAREGS_VADDR 0xFD020000
+/* Clock frequency in Hz (read-only): */
+#define XTAVNET_CLKFRQ_VADDR (XTAVNET_FPGAREGS_VADDR + 0x04)
+/* Setting of 8 DIP switches: */
+#define DIP_SWITCHES_VADDR (XTAVNET_FPGAREGS_VADDR + 0x0C)
+/* Software reset (write 0xdead): */
+#define XTAVNET_SWRST_VADDR (XTAVNET_FPGAREGS_VADDR + 0x10)
+
+/* OpenCores Ethernet controller: */
+#define OETH_REGS_PADDR IOADDR(0xD030000) /* regs + RX/TX descriptors */
+#define OETH_REGS_VADDR 0xFD030000
+#define OETH_REGS_SIZE 0x1000
+#define OETH_SRAMBUFF_PADDR 0xFD800000
+#define OETH_SRAMBUFF_SIZE (5*0x600 + 5*0x600) /* 5*rx buffs + 5*tx buffs */
+/*#define OETH_SRAMBUFF_SIZE 0x3C00*/ /* probably 0x4000 ? */
+/* The MAC address for these boards is 00:50:c2:13:6f:xx.
+ The last byte (here as zero) is read from the DIP switches on the board. */
+#define OETH_MACADDR 0x00, 0x50, 0xc2, 0x13, 0x6f, 0
+
+#endif /* __XTAVNET_HARDWARE_H */
diff --git a/arch/xtensa/platforms/xtavnet/include/platform/lcd.h b/arch/xtensa/platforms/xtavnet/include/platform/lcd.h
new file mode 100644
index 000000000000..67de96acb2f9
--- /dev/null
+++ b/arch/xtensa/platforms/xtavnet/include/platform/lcd.h
@@ -0,0 +1,22 @@
+/*
+ * arch/xtensa/platforms/xtavnet/include/platform/lcd.h
+ *
+ * Copyright (C) 2001-2006 Tensilica Inc.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#ifndef __XTAVNET_LCD_H
+#define __XTAVNET_LCD_H
+
+/* Display string STR at position POS on the LCD. */
+void lcd_disp_at_pos(char *str, unsigned char pos);
+
+/* Shift the contents of the LCD display left or right. */
+void lcd_shiftleft(void);
+void lcd_shiftright(void);
+
+#endif
+
diff --git a/arch/xtensa/platforms/xtavnet/include/platform/serial.h b/arch/xtensa/platforms/xtavnet/include/platform/serial.h
new file mode 100644
index 000000000000..a0cb0caff152
--- /dev/null
+++ b/arch/xtensa/platforms/xtavnet/include/platform/serial.h
@@ -0,0 +1 @@
+#include <asm-generic/serial.h>
diff --git a/arch/xtensa/platforms/xtavnet/lcd.c b/arch/xtensa/platforms/xtavnet/lcd.c
new file mode 100644
index 000000000000..283986f158ad
--- /dev/null
+++ b/arch/xtensa/platforms/xtavnet/lcd.c
@@ -0,0 +1,79 @@
+/*
+ * Driver for the LCD display on the Tensilica LX60 Board.
+ * This code has no effect on the LX200 board. (LX110: TBD)
+ *
+ * Copyright (C) 2001-2006 Tensilica Inc.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+/*
+ *
+ * FIXME: this code is from the examples from the LX60 user guide.
+ *
+ * The lcd_pause function does busy waiting, which is probably not
+ * great. Maybe the code could be changed to use kernel timers, or
+ * change the hardware to not need to wait.
+ */
+
+#include <linux/init.h>
+
+#include <platform/hardware.h>
+#include <asm/processor.h>
+#include <platform/lcd.h>
+#include <linux/delay.h>
+
+#define LCD_PAUSE_ITERATIONS 4000
+#define LCD_CLEAR 0x1
+#define LCD_DISPLAY_ON 0xc
+
+/* 8bit and 2 lines display */
+#define LCD_DISPLAY_MODE8BIT 0x38
+#define LCD_DISPLAY_POS 0x80
+#define LCD_SHIFT_LEFT 0x18
+#define LCD_SHIFT_RIGHT 0x1c
+
+static int __init lcd_init(void)
+{
+ *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT;
+ mdelay(5);
+ *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT;
+ udelay(200);
+ *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT;
+ udelay(50);
+ *LCD_INSTR_ADDR = LCD_DISPLAY_ON;
+ udelay(50);
+ *LCD_INSTR_ADDR = LCD_CLEAR;
+ mdelay(10);
+ lcd_disp_at_pos("XTENSA LINUX", 0);
+
+ return 0;
+}
+
+void lcd_disp_at_pos (char *str, unsigned char pos)
+{
+ *LCD_INSTR_ADDR = LCD_DISPLAY_POS | pos;
+ udelay(100);
+ while (*str != 0){
+ *LCD_DATA_ADDR = *str;
+ udelay(200);
+ str++;
+ }
+}
+
+void lcd_shiftleft(void)
+{
+ *LCD_INSTR_ADDR = LCD_SHIFT_LEFT;
+ udelay(50);
+}
+
+void lcd_shiftright(void)
+{
+ *LCD_INSTR_ADDR = LCD_SHIFT_RIGHT;
+ udelay(50);
+}
+
+arch_initcall(lcd_init);
+
diff --git a/arch/xtensa/platforms/xtavnet/setup.c b/arch/xtensa/platforms/xtavnet/setup.c
new file mode 100644
index 000000000000..256fcb2b2af4
--- /dev/null
+++ b/arch/xtensa/platforms/xtavnet/setup.c
@@ -0,0 +1,269 @@
+/*
+ * arch/xtensa/platform-xtavnet/setup.c
+ *
+ * Setup/initialization for Tensilica Avnet boards (XT-AV60, XT-AV110, XT-AV200,
+ * derived from Avnet LX60, LX110, LX200 boards respectively).
+ * For details, see "Tensilica Avnet LX### (XT-AV###) Board User's Guide"
+ * (where ### is 60, 110, or 200).
+ *
+ * Authors: Chris Zankel <chris@zankel.net>
+ * Joe Taylor <joe@tensilica.com>
+ * Pete Delaney <piet@tensilica.com>
+ * Marc Gauthier <marc@tensilica.com> <marc@alumni.uwaterloo.ca>
+ *
+ * Copyright 2001-2010 Tensilica Inc.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License, version 2. See the file "COPYING" in the main directory of this
+ * archive for more details.
+ */
+
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/reboot.h>
+#include <linux/kdev_t.h>
+#include <linux/types.h>
+#include <linux/major.h>
+#include <linux/console.h>
+#include <linux/delay.h>
+#include <linux/stringify.h>
+#include <linux/platform_device.h>
+#include <linux/serial_8250.h>
+#include <asm/timex.h>
+
+#include <linux/etherdevice.h>
+#include <net/ethoc.h>
+
+#include <asm/processor.h>
+#include <asm/platform.h>
+#include <asm/bootparam.h>
+#include <platform/lcd.h>
+#include <platform/hardware.h>
+#include <variant/core.h>
+
+/* For doing extra init. beyond what the ethoc driver does. */
+struct oeth_regs {
+ unsigned moder; /* Mode Register */
+ unsigned int_src; /* Interrupt Source Register */
+ unsigned int_mask; /* Interrupt Mask Register */
+ unsigned ipgt; /* Back to Bak Inter Packet Gap Register */
+ unsigned ipgr1; /* Non Back to Back Inter Packet Gap Register 1 */
+ unsigned ipgr2; /* Non Back to Back Inter Packet Gap Register 2 */
+ unsigned packet_len; /* Packet Length Register (min. and max.) */
+ unsigned collconf; /* Collision and Retry Configuration Register */
+ unsigned tx_bd_num; /* Transmit Buffer Descriptor Number Register */
+ unsigned ctrlmoder; /* Control Module Mode Register */
+ unsigned miimoder; /* MII Mode Register */
+ unsigned miicommand; /* MII Command Register */
+ unsigned miiaddress; /* MII Address Register */
+ unsigned miitx_data; /* MII Transmit Data Register */
+ unsigned miirx_data; /* MII Receive Data Register */
+ unsigned miistatus; /* MII Status Register */
+ unsigned mac_addr0; /* MAC Individual Address Register 0 */
+ unsigned mac_addr1; /* MAC Individual Address Register 1 */
+ unsigned hash_addr0; /* Hash Register 0 */
+ unsigned hash_addr1; /* Hash Register 1 */
+};
+/* MODER Register */
+#define OETH_MODER_RST 0x00000800 /* Reset MAC */
+/* MII Mode Register */
+#define OETH_MIIMODER_CLKDIV 0x000000FF /* Clock Divider */
+
+
+
+void platform_halt(void)
+{
+ /* Just display HALT on LCD display, and loop. */
+ lcd_disp_at_pos(" HALT ", 0);
+ local_irq_disable();
+ while (1);
+}
+
+void platform_power_off(void)
+{
+ /* No software-controlled power-off, just display POWEROFF and loop. */
+ lcd_disp_at_pos ("POWEROFF", 0);
+ local_irq_disable();
+ while (1);
+}
+
+void platform_restart(void)
+{
+ /* Software-initiated board reset. */
+ *(volatile unsigned *)XTAVNET_SWRST_VADDR = 0xdead;
+}
+
+void platform_heartbeat(void)
+{
+ /* Executes every timer tick. */
+}
+
+
+/*
+ * Called from time_init(). "Calibrating" is a misnomer, here we just read
+ * the clock rate from the board specific FPGA registers.
+ */
+void platform_calibrate_ccount(void)
+{
+ long clk_freq = *(long *)XTAVNET_CLKFRQ_VADDR;
+
+ ccount_per_jiffy = clk_freq / HZ;
+ nsec_per_ccount = 1000000000UL / clk_freq;
+}
+
+
+/*----------------------------------------------------------------------------
+ * Ethernet -- OpenCores Ethernet MAC (ethoc driver)
+ */
+
+static struct resource ethoc_res[] = {
+ [0] = { /* register space */
+ .start = OETH_REGS_PADDR,
+ .end = OETH_REGS_PADDR + OETH_REGS_SIZE - 1,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = { /* buffer space */
+ .start = OETH_SRAMBUFF_PADDR,
+ .end = OETH_SRAMBUFF_PADDR + OETH_SRAMBUFF_SIZE - 1,
+ .flags = IORESOURCE_MEM,
+ },
+ [2] = { /* IRQ number */
+ .start = OETH_IRQ,
+ .end = OETH_IRQ,
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
+static struct ethoc_platform_data ethoc_pdata = {
+ .hwaddr = { OETH_MACADDR }, /* last byte written in setup below */
+ .phy_id = -1,
+};
+
+static struct platform_device ethoc_device = {
+ .name = "ethoc",
+ .id = -1,
+ .num_resources = ARRAY_SIZE(ethoc_res),
+ .resource = ethoc_res,
+ .dev = {
+ .platform_data = &ethoc_pdata,
+ },
+};
+
+
+/*----------------------------------------------------------------------------
+ * UART
+ */
+
+static struct resource serial_resource = {
+ .start = UART_PADDR,
+ .end = UART_PADDR + 0x1f,
+ .flags = IORESOURCE_MEM,
+};
+
+static struct plat_serial8250_port serial_platform_data[] = {
+ [0] = {
+ .mapbase = UART_PADDR,
+ .irq = UART_INTNUM,
+ .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP,
+ .iotype = UPIO_MEM32,
+ .regshift = 2,
+ .uartclk = 0, /* set in xtavnet_init() */
+ },
+ { },
+};
+
+static struct platform_device xtavnet_uart = {
+ .name = "serial8250",
+ .id = PLAT8250_DEV_PLATFORM,
+ .dev = {
+ .platform_data = serial_platform_data,
+ },
+ .num_resources = 1,
+ .resource = &serial_resource,
+};
+
+
+/*----------------------------------------------------------------------------
+ */
+
+/* platform devices */
+static struct platform_device *platform_devices[] = {
+ &ethoc_device,
+ &xtavnet_uart,
+};
+
+
+
+/* very early init */
+void __init platform_setup(char **cmdline)
+{
+ if (cmdline) {
+ if (cmdline[0])
+ printk("XTAVnet: platform_setup(cmdline[0]:'%s')\n", cmdline[0]);
+ else
+ printk("XTAVnet: platform_setup(cmdline[0]:<null>)\n");
+ }
+}
+
+/* early initialization, before secondary cpu's have been brought up */
+
+void platform_init(bp_tag_t *bootparams)
+{
+ printk("\n");
+ if( bootparams )
+ printk("XTAVnet: platform_init(bootparams:0x%x)\n", (unsigned)bootparams);
+}
+
+static int xtavnet_init(void)
+{
+ volatile struct oeth_regs *regs = (volatile struct oeth_regs*)OETH_REGS_VADDR;
+
+ /*
+ * Do some of the initialization missing in the ETHOC driver.
+ * (Perhaps not all necessary, but was in a previously used driver.)
+ */
+
+ /* Reset the controller. */
+ regs->moder = OETH_MODER_RST; /* Reset ON */
+ regs->moder &= ~OETH_MODER_RST; /* Reset OFF */
+
+ regs->packet_len = (64 << 16) | 1536;
+ regs->ipgr1 = 0x0000000c;
+ regs->ipgr2 = 0x00000012;
+ regs->collconf = 0x000f003f;
+ regs->ctrlmoder = 0;
+ regs->miimoder = (OETH_MIIMODER_CLKDIV & 0x2);
+
+ /*
+ * Setup dynamic info in platform device init structures.
+ */
+
+ /* Ethernet MAC address. */
+ ethoc_pdata.hwaddr[5] = *(u32*)DIP_SWITCHES_VADDR;
+
+ /* Clock rate varies among FPGA bitstreams; board specific FPGA register
+ * reports the actual clock rate. */
+ serial_platform_data[0].uartclk = *(long *)XTAVNET_CLKFRQ_VADDR;
+
+
+ /* register platform devices */
+ platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
+
+ /* ETHOC driver is a bit quiet; at least display Ethernet MAC, so user
+ knows whether they set it correctly on the DIP switches. */
+ printk("XTAVnet: Ethernet MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ ethoc_pdata.hwaddr[0], ethoc_pdata.hwaddr[1], ethoc_pdata.hwaddr[2],
+ ethoc_pdata.hwaddr[3], ethoc_pdata.hwaddr[4], ethoc_pdata.hwaddr[5]);
+
+ return 0;
+}
+
+
+/*
+ * Register to be done during do_initcalls().
+ */
+arch_initcall(xtavnet_init);
+
+
diff --git a/block/blk-core.c b/block/blk-core.c
index ee1a1e7e63cc..207af0df1253 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1637,7 +1637,7 @@ EXPORT_SYMBOL(submit_bio);
* the insertion using this generic function.
*
* This function should also be useful for request stacking drivers
- * in some cases below, so export this fuction.
+ * in some cases below, so export this function.
* Request stacking drivers like request-based dm may change the queue
* limits while requests are in the queue (e.g. dm's table swapping).
* Such request stacking drivers should check those requests agaist
diff --git a/crypto/Kconfig b/crypto/Kconfig
index 1cd497d7a15a..e573077f1672 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -101,13 +101,13 @@ config CRYPTO_MANAGER2
select CRYPTO_BLKCIPHER2
select CRYPTO_PCOMP2
-config CRYPTO_MANAGER_TESTS
- bool "Run algolithms' self-tests"
+config CRYPTO_MANAGER_DISABLE_TESTS
+ bool "Disable run-time self tests"
default y
depends on CRYPTO_MANAGER2
help
- Run cryptomanager's tests for the new crypto algorithms being
- registered.
+ Disable run-time self tests that normally take place at
+ algorithm registration.
config CRYPTO_GF128MUL
tristate "GF(2^128) multiplication functions (EXPERIMENTAL)"
diff --git a/crypto/ahash.c b/crypto/ahash.c
index b8c59b889c6e..f669822a7a44 100644
--- a/crypto/ahash.c
+++ b/crypto/ahash.c
@@ -47,8 +47,11 @@ static int hash_walk_next(struct crypto_hash_walk *walk)
walk->data = crypto_kmap(walk->pg, 0);
walk->data += offset;
- if (offset & alignmask)
- nbytes = alignmask + 1 - (offset & alignmask);
+ if (offset & alignmask) {
+ unsigned int unaligned = alignmask + 1 - (offset & alignmask);
+ if (nbytes > unaligned)
+ nbytes = unaligned;
+ }
walk->entrylen -= nbytes;
return nbytes;
diff --git a/crypto/algboss.c b/crypto/algboss.c
index 40bd391f34d9..791d194958fa 100644
--- a/crypto/algboss.c
+++ b/crypto/algboss.c
@@ -206,13 +206,16 @@ err:
return NOTIFY_OK;
}
-#ifdef CONFIG_CRYPTO_MANAGER_TESTS
static int cryptomgr_test(void *data)
{
struct crypto_test_param *param = data;
u32 type = param->type;
int err = 0;
+#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
+ goto skiptest;
+#endif
+
if (type & CRYPTO_ALG_TESTED)
goto skiptest;
@@ -267,7 +270,6 @@ err_put_module:
err:
return NOTIFY_OK;
}
-#endif /* CONFIG_CRYPTO_MANAGER_TESTS */
static int cryptomgr_notify(struct notifier_block *this, unsigned long msg,
void *data)
@@ -275,10 +277,8 @@ static int cryptomgr_notify(struct notifier_block *this, unsigned long msg,
switch (msg) {
case CRYPTO_MSG_ALG_REQUEST:
return cryptomgr_schedule_probe(data);
-#ifdef CONFIG_CRYPTO_MANAGER_TESTS
case CRYPTO_MSG_ALG_REGISTER:
return cryptomgr_schedule_test(data);
-#endif
}
return NOTIFY_DONE;
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index abd980c729eb..fa8c8f78c8d4 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -23,7 +23,7 @@
#include "internal.h"
-#ifndef CONFIG_CRYPTO_MANAGER_TESTS
+#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
/* a perfect nop */
int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
@@ -2542,6 +2542,6 @@ non_fips_alg:
return -EINVAL;
}
-#endif /* CONFIG_CRYPTO_MANAGER_TESTS */
+#endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
EXPORT_SYMBOL_GPL(alg_test);
diff --git a/drivers/Makefile b/drivers/Makefile
index ae473445ad6d..443c4eb48cae 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -92,6 +92,7 @@ obj-$(CONFIG_EISA) += eisa/
obj-y += lguest/
obj-$(CONFIG_CPU_FREQ) += cpufreq/
obj-$(CONFIG_CPU_IDLE) += cpuidle/
+obj-$(CONFIG_DMA_ENGINE) += dma/
obj-$(CONFIG_MMC) += mmc/
obj-$(CONFIG_MEMSTICK) += memstick/
obj-$(CONFIG_NEW_LEDS) += leds/
@@ -104,7 +105,6 @@ obj-$(CONFIG_ARCH_SHMOBILE) += sh/
ifndef CONFIG_ARCH_USES_GETTIMEOFFSET
obj-y += clocksource/
endif
-obj-$(CONFIG_DMA_ENGINE) += dma/
obj-$(CONFIG_DCA) += dca/
obj-$(CONFIG_HID) += hid/
obj-$(CONFIG_PPC_PS3) += ps3/
@@ -115,3 +115,4 @@ obj-$(CONFIG_VLYNQ) += vlynq/
obj-$(CONFIG_STAGING) += staging/
obj-y += platform/
obj-y += ieee802154/
+obj-y += vbus/
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 7ef7c4f216fa..21a883848279 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -4939,17 +4939,7 @@ static void ata_verify_xfer(struct ata_queued_cmd *qc)
dev->flags &= ~ATA_DFLAG_DUBIOUS_XFER;
}
-/**
- * ata_qc_complete - Complete an active ATA command
- * @qc: Command to complete
- *
- * Indicate to the mid and upper layers that an ATA
- * command has completed, with either an ok or not-ok status.
- *
- * LOCKING:
- * spin_lock_irqsave(host lock)
- */
-void ata_qc_complete(struct ata_queued_cmd *qc)
+static void ata_qc_complete_raw(struct ata_queued_cmd *qc)
{
struct ata_port *ap = qc->ap;
@@ -5028,6 +5018,27 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
}
/**
+ * ata_qc_complete - Complete an active ATA command
+ * @qc: Command to complete
+ *
+ * Indicate to the mid and upper layers that an ATA command has
+ * completed, with either an ok or not-ok status.
+ *
+ * Refrain from calling this function multiple times when
+ * successfully completing multiple NCQ commands.
+ * ata_qc_complete_multiple() should be used instead, which will
+ * properly update IRQ expect state.
+ *
+ * LOCKING:
+ * spin_lock_irqsave(host lock)
+ */
+void ata_qc_complete(struct ata_queued_cmd *qc)
+{
+ unexpect_irq(qc->ap->irq_expect, false);
+ ata_qc_complete_raw(qc);
+}
+
+/**
* ata_qc_complete_multiple - Complete multiple qcs successfully
* @ap: port in question
* @qc_active: new qc_active mask
@@ -5037,6 +5048,10 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
* requests normally. ap->qc_active and @qc_active is compared
* and commands are completed accordingly.
*
+ * Always use this function when completing multiple NCQ commands
+ * from IRQ handlers instead of calling ata_qc_complete()
+ * multiple times to keep IRQ expect status properly in sync.
+ *
* LOCKING:
* spin_lock_irqsave(host lock)
*
@@ -5048,6 +5063,8 @@ int ata_qc_complete_multiple(struct ata_port *ap, u32 qc_active)
int nr_done = 0;
u32 done_mask;
+ unexpect_irq(ap->irq_expect, false);
+
done_mask = ap->qc_active ^ qc_active;
if (unlikely(done_mask & qc_active)) {
@@ -5062,12 +5079,15 @@ int ata_qc_complete_multiple(struct ata_port *ap, u32 qc_active)
qc = ata_qc_from_tag(ap, tag);
if (qc) {
- ata_qc_complete(qc);
+ ata_qc_complete_raw(qc);
nr_done++;
}
done_mask &= ~(1 << tag);
}
+ if (ap->qc_active)
+ expect_irq(ap->irq_expect);
+
return nr_done;
}
@@ -5134,6 +5154,7 @@ void ata_qc_issue(struct ata_queued_cmd *qc)
qc->err_mask |= ap->ops->qc_issue(qc);
if (unlikely(qc->err_mask))
goto err;
+ expect_irq(ap->irq_expect);
return;
sg_err:
@@ -6167,8 +6188,13 @@ int ata_host_activate(struct ata_host *host, int irq,
if (rc)
return rc;
- for (i = 0; i < host->n_ports; i++)
- ata_port_desc(host->ports[i], "irq %d", irq);
+ for (i = 0; i < host->n_ports; i++) {
+ struct ata_port *ap = host->ports[i];
+
+ if (!ata_port_is_dummy(ap))
+ ap->irq_expect = init_irq_expect(irq, host);
+ ata_port_desc(ap, "irq %d%s", irq, ap->irq_expect ? "+" : "");
+ }
rc = ata_host_register(host, sht);
/* if failed, just free the IRQ and leave ports alone */
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index c9ae299b8342..287e5b78482e 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -619,8 +619,10 @@ void ata_scsi_error(struct Scsi_Host *host)
* handler doesn't diddle with those qcs. This must
* be done atomically w.r.t. setting QCFLAG_FAILED.
*/
- if (nr_timedout)
+ if (nr_timedout) {
+ unexpect_irq(ap->irq_expect, true);
__ata_port_freeze(ap);
+ }
spin_unlock_irqrestore(ap->lock, flags);
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 674c1436491f..57ea9c78af43 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -2388,7 +2388,8 @@ int ata_pci_sff_activate_host(struct ata_host *host,
struct device *dev = host->dev;
struct pci_dev *pdev = to_pci_dev(dev);
const char *drv_name = dev_driver_string(host->dev);
- int legacy_mode = 0, rc;
+ struct ata_port *ap[2] = { host->ports[0], host->ports[1] };
+ int legacy_mode = 0, i, rc;
rc = ata_host_start(host);
if (rc)
@@ -2422,29 +2423,29 @@ int ata_pci_sff_activate_host(struct ata_host *host,
if (rc)
goto out;
- ata_port_desc(host->ports[0], "irq %d", pdev->irq);
- ata_port_desc(host->ports[1], "irq %d", pdev->irq);
+ for (i = 0; i < 2; i++) {
+ if (!ata_port_is_dummy(ap[i]))
+ ap[i]->irq_expect =
+ init_irq_expect(pdev->irq, host);
+ ata_port_desc(ap[i], "irq %d%s",
+ pdev->irq, ap[i]->irq_expect ? "+" : "");
+ }
} else if (legacy_mode) {
- if (!ata_port_is_dummy(host->ports[0])) {
- rc = devm_request_irq(dev, ATA_PRIMARY_IRQ(pdev),
- irq_handler, IRQF_SHARED,
- drv_name, host);
- if (rc)
- goto out;
+ unsigned int irqs[2] = { ATA_PRIMARY_IRQ(pdev),
+ ATA_SECONDARY_IRQ(pdev) };
- ata_port_desc(host->ports[0], "irq %d",
- ATA_PRIMARY_IRQ(pdev));
- }
+ for (i = 0; i < 2; i++) {
+ if (ata_port_is_dummy(ap[i]))
+ continue;
- if (!ata_port_is_dummy(host->ports[1])) {
- rc = devm_request_irq(dev, ATA_SECONDARY_IRQ(pdev),
- irq_handler, IRQF_SHARED,
- drv_name, host);
+ rc = devm_request_irq(dev, irqs[i], irq_handler,
+ IRQF_SHARED, drv_name, host);
if (rc)
goto out;
- ata_port_desc(host->ports[1], "irq %d",
- ATA_SECONDARY_IRQ(pdev));
+ ap[i]->irq_expect = init_irq_expect(irqs[i], host);
+ ata_port_desc(ap[i], "irq %d%s",
+ irqs[i], ap[i]->irq_expect ? "+" : "");
}
}
diff --git a/drivers/ata/pata_bf54x.c b/drivers/ata/pata_bf54x.c
index 9cae65de750e..be7b1b21e777 100644
--- a/drivers/ata/pata_bf54x.c
+++ b/drivers/ata/pata_bf54x.c
@@ -1588,7 +1588,7 @@ static int __devinit bfin_atapi_probe(struct platform_device *pdev)
host->ports[0]->ioaddr.ctl_addr = (void *)res->start;
if (peripheral_request_list(atapi_io_port, "atapi-io-port")) {
- dev_err(&pdev->dev, "Requesting Peripherals faild\n");
+ dev_err(&pdev->dev, "Requesting Peripherals failed\n");
return -EFAULT;
}
diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c
index ea24c1e51be2..2673a3d14806 100644
--- a/drivers/ata/sata_dwc_460ex.c
+++ b/drivers/ata/sata_dwc_460ex.c
@@ -1588,7 +1588,7 @@ static const struct ata_port_info sata_dwc_port_info[] = {
},
};
-static int sata_dwc_probe(struct of_device *ofdev,
+static int sata_dwc_probe(struct platform_device *ofdev,
const struct of_device_id *match)
{
struct sata_dwc_device *hsdev;
@@ -1702,7 +1702,7 @@ error_out:
return err;
}
-static int sata_dwc_remove(struct of_device *ofdev)
+static int sata_dwc_remove(struct platform_device *ofdev)
{
struct device *dev = &ofdev->dev;
struct ata_host *host = dev_get_drvdata(dev);
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c
index 7325f77480dc..1440dc0af242 100644
--- a/drivers/ata/sata_fsl.c
+++ b/drivers/ata/sata_fsl.c
@@ -1137,17 +1137,13 @@ static void sata_fsl_host_intr(struct ata_port *ap)
ioread32(hcr_base + CE));
for (i = 0; i < SATA_FSL_QUEUE_DEPTH; i++) {
- if (done_mask & (1 << i)) {
- qc = ata_qc_from_tag(ap, i);
- if (qc) {
- ata_qc_complete(qc);
- }
+ if (done_mask & (1 << i))
DPRINTK
("completing ncq cmd,tag=%d,CC=0x%x,CA=0x%x\n",
i, ioread32(hcr_base + CC),
ioread32(hcr_base + CA));
- }
}
+ ata_qc_complete_multiple(ap, ap->qc_active ^ done_mask);
return;
} else if ((ap->qc_active & (1 << ATA_TAG_INTERNAL))) {
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
index 9463c71dd38e..f6b3b47f1f8a 100644
--- a/drivers/ata/sata_mv.c
+++ b/drivers/ata/sata_mv.c
@@ -2713,18 +2713,11 @@ static void mv_err_intr(struct ata_port *ap)
}
}
-static void mv_process_crpb_response(struct ata_port *ap,
+static bool mv_process_crpb_response(struct ata_port *ap,
struct mv_crpb *response, unsigned int tag, int ncq_enabled)
{
u8 ata_status;
u16 edma_status = le16_to_cpu(response->flags);
- struct ata_queued_cmd *qc = ata_qc_from_tag(ap, tag);
-
- if (unlikely(!qc)) {
- ata_port_printk(ap, KERN_ERR, "%s: no qc for tag=%d\n",
- __func__, tag);
- return;
- }
/*
* edma_status from a response queue entry:
@@ -2738,13 +2731,14 @@ static void mv_process_crpb_response(struct ata_port *ap,
* Error will be seen/handled by
* mv_err_intr(). So do nothing at all here.
*/
- return;
+ return false;
}
}
ata_status = edma_status >> CRPB_FLAG_STATUS_SHIFT;
if (!ac_err_mask(ata_status))
- ata_qc_complete(qc);
+ return true;
/* else: leave it for mv_err_intr() */
+ return false;
}
static void mv_process_crpb_entries(struct ata_port *ap, struct mv_port_priv *pp)
@@ -2753,6 +2747,7 @@ static void mv_process_crpb_entries(struct ata_port *ap, struct mv_port_priv *pp
struct mv_host_priv *hpriv = ap->host->private_data;
u32 in_index;
bool work_done = false;
+ u32 done_mask = 0;
int ncq_enabled = (pp->pp_flags & MV_PP_FLAG_NCQ_EN);
/* Get the hardware queue position index */
@@ -2773,15 +2768,19 @@ static void mv_process_crpb_entries(struct ata_port *ap, struct mv_port_priv *pp
/* Gen II/IIE: get command tag from CRPB entry */
tag = le16_to_cpu(response->id) & 0x1f;
}
- mv_process_crpb_response(ap, response, tag, ncq_enabled);
+ if (mv_process_crpb_response(ap, response, tag, ncq_enabled))
+ done_mask |= 1 << tag;
work_done = true;
}
- /* Update the software queue position index in hardware */
- if (work_done)
+ if (work_done) {
+ ata_qc_complete_multiple(ap, ap->qc_active ^ done_mask);
+
+ /* Update the software queue position index in hardware */
writelfl((pp->crpb_dma & EDMA_RSP_Q_BASE_LO_MASK) |
(pp->resp_idx << EDMA_RSP_Q_PTR_SHIFT),
port_mmio + EDMA_RSP_Q_OUT_PTR);
+ }
}
static void mv_port_intr(struct ata_port *ap, u32 port_cause)
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
index cb89ef8d99d9..7254e255fd78 100644
--- a/drivers/ata/sata_nv.c
+++ b/drivers/ata/sata_nv.c
@@ -873,29 +873,11 @@ static int nv_adma_check_cpb(struct ata_port *ap, int cpb_num, int force_err)
ata_port_freeze(ap);
else
ata_port_abort(ap);
- return 1;
+ return -1;
}
- if (likely(flags & NV_CPB_RESP_DONE)) {
- struct ata_queued_cmd *qc = ata_qc_from_tag(ap, cpb_num);
- VPRINTK("CPB flags done, flags=0x%x\n", flags);
- if (likely(qc)) {
- DPRINTK("Completing qc from tag %d\n", cpb_num);
- ata_qc_complete(qc);
- } else {
- struct ata_eh_info *ehi = &ap->link.eh_info;
- /* Notifier bits set without a command may indicate the drive
- is misbehaving. Raise host state machine violation on this
- condition. */
- ata_port_printk(ap, KERN_ERR,
- "notifier for tag %d with no cmd?\n",
- cpb_num);
- ehi->err_mask |= AC_ERR_HSM;
- ehi->action |= ATA_EH_RESET;
- ata_port_freeze(ap);
- return 1;
- }
- }
+ if (likely(flags & NV_CPB_RESP_DONE))
+ return 1;
return 0;
}
@@ -1018,6 +1000,7 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
NV_ADMA_STAT_CPBERR |
NV_ADMA_STAT_CMD_COMPLETE)) {
u32 check_commands = notifier_clears[i];
+ u32 done_mask = 0;
int pos, rc;
if (status & NV_ADMA_STAT_CPBERR) {
@@ -1034,10 +1017,13 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
pos--;
rc = nv_adma_check_cpb(ap, pos,
notifier_error & (1 << pos));
- if (unlikely(rc))
+ if (rc > 0)
+ done_mask |= 1 << pos;
+ else if (unlikely(rc < 0))
check_commands = 0;
check_commands &= ~(1 << pos);
}
+ ata_qc_complete_multiple(ap, ap->qc_active ^ done_mask);
}
}
@@ -2132,7 +2118,6 @@ static int nv_swncq_sdbfis(struct ata_port *ap)
struct ata_eh_info *ehi = &ap->link.eh_info;
u32 sactive;
u32 done_mask;
- int i;
u8 host_stat;
u8 lack_dhfis = 0;
@@ -2152,27 +2137,11 @@ static int nv_swncq_sdbfis(struct ata_port *ap)
sactive = readl(pp->sactive_block);
done_mask = pp->qc_active ^ sactive;
- if (unlikely(done_mask & sactive)) {
- ata_ehi_clear_desc(ehi);
- ata_ehi_push_desc(ehi, "illegal SWNCQ:qc_active transition"
- "(%08x->%08x)", pp->qc_active, sactive);
- ehi->err_mask |= AC_ERR_HSM;
- ehi->action |= ATA_EH_RESET;
- return -EINVAL;
- }
- for (i = 0; i < ATA_MAX_QUEUE; i++) {
- if (!(done_mask & (1 << i)))
- continue;
-
- qc = ata_qc_from_tag(ap, i);
- if (qc) {
- ata_qc_complete(qc);
- pp->qc_active &= ~(1 << i);
- pp->dhfis_bits &= ~(1 << i);
- pp->dmafis_bits &= ~(1 << i);
- pp->sdbfis_bits |= (1 << i);
- }
- }
+ pp->qc_active &= ~done_mask;
+ pp->dhfis_bits &= ~done_mask;
+ pp->dmafis_bits &= ~done_mask;
+ pp->sdbfis_bits |= done_mask;
+ ata_qc_complete_multiple(ap, ap->qc_active ^ done_mask);
if (!ap->qc_active) {
DPRINTK("over\n");
diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c
index ee9ddeb53417..8b358d7d958f 100644
--- a/drivers/atm/iphase.c
+++ b/drivers/atm/iphase.c
@@ -220,7 +220,7 @@ static u16 get_desc (IADEV *dev, struct ia_vcc *iavcc) {
while (!desc_num || (dev->desc_tbl[desc_num -1]).timestamp) {
dev->ffL.tcq_rd += 2;
if (dev->ffL.tcq_rd > dev->ffL.tcq_ed)
- dev->ffL.tcq_rd = dev->ffL.tcq_st;
+ dev->ffL.tcq_rd = dev->ffL.tcq_st;
if (dev->ffL.tcq_rd == dev->host_tcq_wr)
return 0xFFFF;
desc_num = *(u_short *)(dev->seg_ram + dev->ffL.tcq_rd);
diff --git a/drivers/base/core.c b/drivers/base/core.c
index d1b2c9adc271..aed85f1c446e 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -251,7 +251,7 @@ static int dev_uevent(struct kset *kset, struct kobject *kobj,
__func__, retval);
}
- /* have the device type specific fuction add its stuff */
+ /* have the device type specific function add its stuff */
if (dev->type && dev->type->uevent) {
retval = dev->type->uevent(dev, env);
if (retval)
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
index de277689da61..4a6e1b7b1dd6 100644
--- a/drivers/block/Kconfig
+++ b/drivers/block/Kconfig
@@ -488,4 +488,20 @@ config BLK_DEV_HD
If unsure, say N.
+config BLK_DEV_RBD
+ tristate "Rados block device (RBD)"
+ depends on INET && EXPERIMENTAL && BLOCK
+ select CEPH_LIB
+ select LIBCRC32C
+ select CRYPTO_AES
+ default n
+ help
+ Say Y here if you want include the Rados block device, which stripes
+ a block device over objects stored in the Ceph distributed object
+ store.
+
+ More information at http://ceph.newdream.net/.
+
+ If unsure, say N.
+
endif # BLK_DEV
diff --git a/drivers/block/Makefile b/drivers/block/Makefile
index aff5ac925c34..d7f463d6312d 100644
--- a/drivers/block/Makefile
+++ b/drivers/block/Makefile
@@ -37,5 +37,6 @@ obj-$(CONFIG_BLK_DEV_HD) += hd.o
obj-$(CONFIG_XEN_BLKDEV_FRONTEND) += xen-blkfront.o
obj-$(CONFIG_BLK_DEV_DRBD) += drbd/
+obj-$(CONFIG_BLK_DEV_RBD) += rbd.o
swim_mod-objs := swim.o swim_asm.o
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c
index 5674bd01d96d..b1e5c624b110 100644
--- a/drivers/block/aoe/aoecmd.c
+++ b/drivers/block/aoe/aoecmd.c
@@ -987,8 +987,12 @@ aoecmd_cfg_rsp(struct sk_buff *skb)
}
sysminor = SYSMINOR(aoemajor, h->minor);
- if (sysminor * AOE_PARTITIONS + AOE_PARTITIONS > MINORMASK) {
- printk(KERN_INFO "aoe: e%ld.%d: minor number too large\n",
+ if (h->minor >= NPERSHELF) {
+ printk(KERN_INFO "aoe: e%ld.%d: AoE minor address too large\n",
+ aoemajor, (int) h->minor);
+ return;
+ } else if (sysminor * AOE_PARTITIONS + AOE_PARTITIONS > MINORMASK) {
+ printk(KERN_INFO "aoe: e%ld.%d: AoE major address too large\n",
aoemajor, (int) h->minor);
return;
}
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
new file mode 100644
index 000000000000..f4cd870aacf9
--- /dev/null
+++ b/drivers/block/rbd.c
@@ -0,0 +1,1844 @@
+/*
+ rbd.c -- Export ceph rados objects as a Linux block device
+
+
+ based on drivers/block/osdblk.c:
+
+ Copyright 2009 Red Hat, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+
+ Instructions for use
+ --------------------
+
+ 1) Map a Linux block device to an existing rbd image.
+
+ Usage: <mon ip addr> <options> <pool name> <rbd image name> [snap name]
+
+ $ echo "192.168.0.1 name=admin rbd foo" > /sys/class/rbd/add
+
+ The snapshot name can be "-" or omitted to map the image read/write.
+
+ 2) List all active blkdev<->object mappings.
+
+ In this example, we have performed step #1 twice, creating two blkdevs,
+ mapped to two separate rados objects in the rados rbd pool
+
+ $ cat /sys/class/rbd/list
+ #id major client_name pool name snap KB
+ 0 254 client4143 rbd foo - 1024000
+
+ The columns, in order, are:
+ - blkdev unique id
+ - blkdev assigned major
+ - rados client id
+ - rados pool name
+ - rados block device name
+ - mapped snapshot ("-" if none)
+ - device size in KB
+
+
+ 3) Create a snapshot.
+
+ Usage: <blkdev id> <snapname>
+
+ $ echo "0 mysnap" > /sys/class/rbd/snap_create
+
+
+ 4) Listing a snapshot.
+
+ $ cat /sys/class/rbd/snaps_list
+ #id snap KB
+ 0 - 1024000 (*)
+ 0 foo 1024000
+
+ The columns, in order, are:
+ - blkdev unique id
+ - snapshot name, '-' means none (active read/write version)
+ - size of device at time of snapshot
+ - the (*) indicates this is the active version
+
+ 5) Rollback to snapshot.
+
+ Usage: <blkdev id> <snapname>
+
+ $ echo "0 mysnap" > /sys/class/rbd/snap_rollback
+
+
+ 6) Mapping an image using snapshot.
+
+ A snapshot mapping is read-only. This is being done by passing
+ snap=<snapname> to the options when adding a device.
+
+ $ echo "192.168.0.1 name=admin,snap=mysnap rbd foo" > /sys/class/rbd/add
+
+
+ 7) Remove an active blkdev<->rbd image mapping.
+
+ In this example, we remove the mapping with blkdev unique id 1.
+
+ $ echo 1 > /sys/class/rbd/remove
+
+
+ NOTE: The actual creation and deletion of rados objects is outside the scope
+ of this driver.
+
+ */
+
+#include <linux/ceph/libceph.h>
+#include <linux/ceph/osd_client.h>
+#include <linux/ceph/mon_client.h>
+#include <linux/ceph/decode.h>
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/blkdev.h>
+
+#include "rbd_types.h"
+
+#define DRV_NAME "rbd"
+#define DRV_NAME_LONG "rbd (rados block device)"
+
+#define RBD_MINORS_PER_MAJOR 256 /* max minors per blkdev */
+
+#define RBD_MAX_MD_NAME_LEN (96 + sizeof(RBD_SUFFIX))
+#define RBD_MAX_POOL_NAME_LEN 64
+#define RBD_MAX_SNAP_NAME_LEN 32
+#define RBD_MAX_OPT_LEN 1024
+
+#define RBD_SNAP_HEAD_NAME "-"
+
+#define DEV_NAME_LEN 32
+
+/*
+ * block device image metadata (in-memory version)
+ */
+struct rbd_image_header {
+ u64 image_size;
+ char block_name[32];
+ __u8 obj_order;
+ __u8 crypt_type;
+ __u8 comp_type;
+ struct rw_semaphore snap_rwsem;
+ struct ceph_snap_context *snapc;
+ size_t snap_names_len;
+ u64 snap_seq;
+ u32 total_snaps;
+
+ char *snap_names;
+ u64 *snap_sizes;
+};
+
+/*
+ * an instance of the client. multiple devices may share a client.
+ */
+struct rbd_client {
+ struct ceph_client *client;
+ struct kref kref;
+ struct list_head node;
+};
+
+/*
+ * a single io request
+ */
+struct rbd_request {
+ struct request *rq; /* blk layer request */
+ struct bio *bio; /* cloned bio */
+ struct page **pages; /* list of used pages */
+ u64 len;
+};
+
+/*
+ * a single device
+ */
+struct rbd_device {
+ int id; /* blkdev unique id */
+
+ int major; /* blkdev assigned major */
+ struct gendisk *disk; /* blkdev's gendisk and rq */
+ struct request_queue *q;
+
+ struct ceph_client *client;
+ struct rbd_client *rbd_client;
+
+ char name[DEV_NAME_LEN]; /* blkdev name, e.g. rbd3 */
+
+ spinlock_t lock; /* queue lock */
+
+ struct rbd_image_header header;
+ char obj[RBD_MAX_OBJ_NAME_LEN]; /* rbd image name */
+ int obj_len;
+ char obj_md_name[RBD_MAX_MD_NAME_LEN]; /* hdr nm. */
+ char pool_name[RBD_MAX_POOL_NAME_LEN];
+ int poolid;
+
+ char snap_name[RBD_MAX_SNAP_NAME_LEN];
+ u32 cur_snap; /* index+1 of current snapshot within snap context
+ 0 - for the head */
+ int read_only;
+
+ struct list_head node;
+};
+
+static spinlock_t node_lock; /* protects client get/put */
+
+static struct class *class_rbd; /* /sys/class/rbd */
+static DEFINE_MUTEX(ctl_mutex); /* Serialize open/close/setup/teardown */
+static LIST_HEAD(rbd_dev_list); /* devices */
+static LIST_HEAD(rbd_client_list); /* clients */
+
+
+static int rbd_open(struct block_device *bdev, fmode_t mode)
+{
+ struct gendisk *disk = bdev->bd_disk;
+ struct rbd_device *rbd_dev = disk->private_data;
+
+ set_device_ro(bdev, rbd_dev->read_only);
+
+ if ((mode & FMODE_WRITE) && rbd_dev->read_only)
+ return -EROFS;
+
+ return 0;
+}
+
+static const struct block_device_operations rbd_bd_ops = {
+ .owner = THIS_MODULE,
+ .open = rbd_open,
+};
+
+/*
+ * Initialize an rbd client instance.
+ */
+static struct rbd_client *rbd_client_create(struct ceph_options *opt)
+{
+ struct rbd_client *rbdc;
+ int ret = -ENOMEM;
+
+ dout("rbd_client_create\n");
+ rbdc = kmalloc(sizeof(struct rbd_client), GFP_KERNEL);
+ if (!rbdc)
+ goto out;
+
+ kref_init(&rbdc->kref);
+ INIT_LIST_HEAD(&rbdc->node);
+
+ rbdc->client = ceph_create_client(opt, rbdc);
+ if (IS_ERR(rbdc->client))
+ goto out_free;
+
+ ret = ceph_open_session(rbdc->client);
+ if (ret < 0)
+ goto out_err;
+
+ spin_lock(&node_lock);
+ list_add_tail(&rbdc->node, &rbd_client_list);
+ spin_unlock(&node_lock);
+
+ dout("rbd_client_create created %p\n", rbdc);
+ return rbdc;
+
+out_err:
+ ceph_destroy_client(rbdc->client);
+out_free:
+ kfree(rbdc);
+out:
+ return ERR_PTR(-ENOMEM);
+}
+
+/*
+ * Find a ceph client with specific addr and configuration.
+ */
+static struct rbd_client *__rbd_client_find(struct ceph_options *opt)
+{
+ struct rbd_client *client_node;
+
+ if (opt->flags & CEPH_OPT_NOSHARE)
+ return NULL;
+
+ list_for_each_entry(client_node, &rbd_client_list, node)
+ if (ceph_compare_options(opt, client_node->client) == 0)
+ return client_node;
+ return NULL;
+}
+
+/*
+ * Get a ceph client with specific addr and configuration, if one does
+ * not exist create it.
+ */
+static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr,
+ char *options)
+{
+ struct rbd_client *rbdc;
+ struct ceph_options *opt;
+ int ret;
+
+ ret = ceph_parse_options(&opt, options, mon_addr,
+ mon_addr + strlen(mon_addr), NULL, NULL);
+ if (ret < 0)
+ return ret;
+
+ spin_lock(&node_lock);
+ rbdc = __rbd_client_find(opt);
+ if (rbdc) {
+ ceph_destroy_options(opt);
+
+ /* using an existing client */
+ kref_get(&rbdc->kref);
+ rbd_dev->rbd_client = rbdc;
+ rbd_dev->client = rbdc->client;
+ spin_unlock(&node_lock);
+ return 0;
+ }
+ spin_unlock(&node_lock);
+
+ rbdc = rbd_client_create(opt);
+ if (IS_ERR(rbdc)) {
+ ret = PTR_ERR(rbdc);
+ goto out_args;
+ }
+ rbd_dev->rbd_client = rbdc;
+ rbd_dev->client = rbdc->client;
+ return 0;
+
+out_args:
+ ceph_destroy_options(opt);
+ return ret;
+}
+
+/*
+ * Destroy ceph client
+ */
+static void rbd_client_release(struct kref *kref)
+{
+ struct rbd_client *rbdc = container_of(kref, struct rbd_client, kref);
+
+ dout("rbd_release_client %p\n", rbdc);
+ spin_lock(&node_lock);
+ list_del(&rbdc->node);
+ spin_unlock(&node_lock);
+
+ ceph_destroy_client(rbdc->client);
+ kfree(rbdc);
+}
+
+/*
+ * Drop reference to ceph client node. If it's not referenced anymore, release
+ * it.
+ */
+static void rbd_put_client(struct rbd_device *rbd_dev)
+{
+ kref_put(&rbd_dev->rbd_client->kref, rbd_client_release);
+ rbd_dev->rbd_client = NULL;
+ rbd_dev->client = NULL;
+}
+
+
+/*
+ * Create a new header structure, translate header format from the on-disk
+ * header.
+ */
+static int rbd_header_from_disk(struct rbd_image_header *header,
+ struct rbd_image_header_ondisk *ondisk,
+ int allocated_snaps,
+ gfp_t gfp_flags)
+{
+ int i;
+ u32 snap_count = le32_to_cpu(ondisk->snap_count);
+ int ret = -ENOMEM;
+
+ init_rwsem(&header->snap_rwsem);
+
+ header->snap_names_len = le64_to_cpu(ondisk->snap_names_len);
+ header->snapc = kmalloc(sizeof(struct ceph_snap_context) +
+ snap_count *
+ sizeof(struct rbd_image_snap_ondisk),
+ gfp_flags);
+ if (!header->snapc)
+ return -ENOMEM;
+ if (snap_count) {
+ header->snap_names = kmalloc(header->snap_names_len,
+ GFP_KERNEL);
+ if (!header->snap_names)
+ goto err_snapc;
+ header->snap_sizes = kmalloc(snap_count * sizeof(u64),
+ GFP_KERNEL);
+ if (!header->snap_sizes)
+ goto err_names;
+ } else {
+ header->snap_names = NULL;
+ header->snap_sizes = NULL;
+ }
+ memcpy(header->block_name, ondisk->block_name,
+ sizeof(ondisk->block_name));
+
+ header->image_size = le64_to_cpu(ondisk->image_size);
+ header->obj_order = ondisk->options.order;
+ header->crypt_type = ondisk->options.crypt_type;
+ header->comp_type = ondisk->options.comp_type;
+
+ atomic_set(&header->snapc->nref, 1);
+ header->snap_seq = le64_to_cpu(ondisk->snap_seq);
+ header->snapc->num_snaps = snap_count;
+ header->total_snaps = snap_count;
+
+ if (snap_count &&
+ allocated_snaps == snap_count) {
+ for (i = 0; i < snap_count; i++) {
+ header->snapc->snaps[i] =
+ le64_to_cpu(ondisk->snaps[i].id);
+ header->snap_sizes[i] =
+ le64_to_cpu(ondisk->snaps[i].image_size);
+ }
+
+ /* copy snapshot names */
+ memcpy(header->snap_names, &ondisk->snaps[i],
+ header->snap_names_len);
+ }
+
+ return 0;
+
+err_names:
+ kfree(header->snap_names);
+err_snapc:
+ kfree(header->snapc);
+ return ret;
+}
+
+static int snap_index(struct rbd_image_header *header, int snap_num)
+{
+ return header->total_snaps - snap_num;
+}
+
+static u64 cur_snap_id(struct rbd_device *rbd_dev)
+{
+ struct rbd_image_header *header = &rbd_dev->header;
+
+ if (!rbd_dev->cur_snap)
+ return 0;
+
+ return header->snapc->snaps[snap_index(header, rbd_dev->cur_snap)];
+}
+
+static int snap_by_name(struct rbd_image_header *header, const char *snap_name,
+ u64 *seq, u64 *size)
+{
+ int i;
+ char *p = header->snap_names;
+
+ for (i = 0; i < header->total_snaps; i++, p += strlen(p) + 1) {
+ if (strcmp(snap_name, p) == 0)
+ break;
+ }
+ if (i == header->total_snaps)
+ return -ENOENT;
+ if (seq)
+ *seq = header->snapc->snaps[i];
+
+ if (size)
+ *size = header->snap_sizes[i];
+
+ return i;
+}
+
+static int rbd_header_set_snap(struct rbd_device *dev,
+ const char *snap_name,
+ u64 *size)
+{
+ struct rbd_image_header *header = &dev->header;
+ struct ceph_snap_context *snapc = header->snapc;
+ int ret = -ENOENT;
+
+ down_write(&header->snap_rwsem);
+
+ if (!snap_name ||
+ !*snap_name ||
+ strcmp(snap_name, "-") == 0 ||
+ strcmp(snap_name, RBD_SNAP_HEAD_NAME) == 0) {
+ if (header->total_snaps)
+ snapc->seq = header->snap_seq;
+ else
+ snapc->seq = 0;
+ dev->cur_snap = 0;
+ dev->read_only = 0;
+ if (size)
+ *size = header->image_size;
+ } else {
+ ret = snap_by_name(header, snap_name, &snapc->seq, size);
+ if (ret < 0)
+ goto done;
+
+ dev->cur_snap = header->total_snaps - ret;
+ dev->read_only = 1;
+ }
+
+ ret = 0;
+done:
+ up_write(&header->snap_rwsem);
+ return ret;
+}
+
+static void rbd_header_free(struct rbd_image_header *header)
+{
+ kfree(header->snapc);
+ kfree(header->snap_names);
+ kfree(header->snap_sizes);
+}
+
+/*
+ * get the actual striped segment name, offset and length
+ */
+static u64 rbd_get_segment(struct rbd_image_header *header,
+ const char *block_name,
+ u64 ofs, u64 len,
+ char *seg_name, u64 *segofs)
+{
+ u64 seg = ofs >> header->obj_order;
+
+ if (seg_name)
+ snprintf(seg_name, RBD_MAX_SEG_NAME_LEN,
+ "%s.%012llx", block_name, seg);
+
+ ofs = ofs & ((1 << header->obj_order) - 1);
+ len = min_t(u64, len, (1 << header->obj_order) - ofs);
+
+ if (segofs)
+ *segofs = ofs;
+
+ return len;
+}
+
+/*
+ * bio helpers
+ */
+
+static void bio_chain_put(struct bio *chain)
+{
+ struct bio *tmp;
+
+ while (chain) {
+ tmp = chain;
+ chain = chain->bi_next;
+ bio_put(tmp);
+ }
+}
+
+/*
+ * zeros a bio chain, starting at specific offset
+ */
+static void zero_bio_chain(struct bio *chain, int start_ofs)
+{
+ struct bio_vec *bv;
+ unsigned long flags;
+ void *buf;
+ int i;
+ int pos = 0;
+
+ while (chain) {
+ bio_for_each_segment(bv, chain, i) {
+ if (pos + bv->bv_len > start_ofs) {
+ int remainder = max(start_ofs - pos, 0);
+ buf = bvec_kmap_irq(bv, &flags);
+ memset(buf + remainder, 0,
+ bv->bv_len - remainder);
+ bvec_kunmap_irq(bv, &flags);
+ }
+ pos += bv->bv_len;
+ }
+
+ chain = chain->bi_next;
+ }
+}
+
+/*
+ * bio_chain_clone - clone a chain of bios up to a certain length.
+ * might return a bio_pair that will need to be released.
+ */
+static struct bio *bio_chain_clone(struct bio **old, struct bio **next,
+ struct bio_pair **bp,
+ int len, gfp_t gfpmask)
+{
+ struct bio *tmp, *old_chain = *old, *new_chain = NULL, *tail = NULL;
+ int total = 0;
+
+ if (*bp) {
+ bio_pair_release(*bp);
+ *bp = NULL;
+ }
+
+ while (old_chain && (total < len)) {
+ tmp = bio_kmalloc(gfpmask, old_chain->bi_max_vecs);
+ if (!tmp)
+ goto err_out;
+
+ if (total + old_chain->bi_size > len) {
+ struct bio_pair *bp;
+
+ /*
+ * this split can only happen with a single paged bio,
+ * split_bio will BUG_ON if this is not the case
+ */
+ dout("bio_chain_clone split! total=%d remaining=%d"
+ "bi_size=%d\n",
+ (int)total, (int)len-total,
+ (int)old_chain->bi_size);
+
+ /* split the bio. We'll release it either in the next
+ call, or it will have to be released outside */
+ bp = bio_split(old_chain, (len - total) / 512ULL);
+ if (!bp)
+ goto err_out;
+
+ __bio_clone(tmp, &bp->bio1);
+
+ *next = &bp->bio2;
+ } else {
+ __bio_clone(tmp, old_chain);
+ *next = old_chain->bi_next;
+ }
+
+ tmp->bi_bdev = NULL;
+ gfpmask &= ~__GFP_WAIT;
+ tmp->bi_next = NULL;
+
+ if (!new_chain) {
+ new_chain = tail = tmp;
+ } else {
+ tail->bi_next = tmp;
+ tail = tmp;
+ }
+ old_chain = old_chain->bi_next;
+
+ total += tmp->bi_size;
+ }
+
+ BUG_ON(total < len);
+
+ if (tail)
+ tail->bi_next = NULL;
+
+ *old = old_chain;
+
+ return new_chain;
+
+err_out:
+ dout("bio_chain_clone with err\n");
+ bio_chain_put(new_chain);
+ return NULL;
+}
+
+/*
+ * helpers for osd request op vectors.
+ */
+static int rbd_create_rw_ops(struct ceph_osd_req_op **ops,
+ int num_ops,
+ int opcode,
+ u32 payload_len)
+{
+ *ops = kzalloc(sizeof(struct ceph_osd_req_op) * (num_ops + 1),
+ GFP_NOIO);
+ if (!*ops)
+ return -ENOMEM;
+ (*ops)[0].op = opcode;
+ /*
+ * op extent offset and length will be set later on
+ * in calc_raw_layout()
+ */
+ (*ops)[0].payload_len = payload_len;
+ return 0;
+}
+
+static void rbd_destroy_ops(struct ceph_osd_req_op *ops)
+{
+ kfree(ops);
+}
+
+/*
+ * Send ceph osd request
+ */
+static int rbd_do_request(struct request *rq,
+ struct rbd_device *dev,
+ struct ceph_snap_context *snapc,
+ u64 snapid,
+ const char *obj, u64 ofs, u64 len,
+ struct bio *bio,
+ struct page **pages,
+ int num_pages,
+ int flags,
+ struct ceph_osd_req_op *ops,
+ int num_reply,
+ void (*rbd_cb)(struct ceph_osd_request *req,
+ struct ceph_msg *msg))
+{
+ struct ceph_osd_request *req;
+ struct ceph_file_layout *layout;
+ int ret;
+ u64 bno;
+ struct timespec mtime = CURRENT_TIME;
+ struct rbd_request *req_data;
+ struct ceph_osd_request_head *reqhead;
+ struct rbd_image_header *header = &dev->header;
+
+ ret = -ENOMEM;
+ req_data = kzalloc(sizeof(*req_data), GFP_NOIO);
+ if (!req_data)
+ goto done;
+
+ dout("rbd_do_request len=%lld ofs=%lld\n", len, ofs);
+
+ down_read(&header->snap_rwsem);
+
+ req = ceph_osdc_alloc_request(&dev->client->osdc, flags,
+ snapc,
+ ops,
+ false,
+ GFP_NOIO, pages, bio);
+ if (IS_ERR(req)) {
+ up_read(&header->snap_rwsem);
+ ret = PTR_ERR(req);
+ goto done_pages;
+ }
+
+ req->r_callback = rbd_cb;
+
+ req_data->rq = rq;
+ req_data->bio = bio;
+ req_data->pages = pages;
+ req_data->len = len;
+
+ req->r_priv = req_data;
+
+ reqhead = req->r_request->front.iov_base;
+ reqhead->snapid = cpu_to_le64(CEPH_NOSNAP);
+
+ strncpy(req->r_oid, obj, sizeof(req->r_oid));
+ req->r_oid_len = strlen(req->r_oid);
+
+ layout = &req->r_file_layout;
+ memset(layout, 0, sizeof(*layout));
+ layout->fl_stripe_unit = cpu_to_le32(1 << RBD_MAX_OBJ_ORDER);
+ layout->fl_stripe_count = cpu_to_le32(1);
+ layout->fl_object_size = cpu_to_le32(1 << RBD_MAX_OBJ_ORDER);
+ layout->fl_pg_preferred = cpu_to_le32(-1);
+ layout->fl_pg_pool = cpu_to_le32(dev->poolid);
+ ceph_calc_raw_layout(&dev->client->osdc, layout, snapid,
+ ofs, &len, &bno, req, ops);
+
+ ceph_osdc_build_request(req, ofs, &len,
+ ops,
+ snapc,
+ &mtime,
+ req->r_oid, req->r_oid_len);
+ up_read(&header->snap_rwsem);
+
+ ret = ceph_osdc_start_request(&dev->client->osdc, req, false);
+ if (ret < 0)
+ goto done_err;
+
+ if (!rbd_cb) {
+ ret = ceph_osdc_wait_request(&dev->client->osdc, req);
+ ceph_osdc_put_request(req);
+ }
+ return ret;
+
+done_err:
+ bio_chain_put(req_data->bio);
+ ceph_osdc_put_request(req);
+done_pages:
+ kfree(req_data);
+done:
+ if (rq)
+ blk_end_request(rq, ret, len);
+ return ret;
+}
+
+/*
+ * Ceph osd op callback
+ */
+static void rbd_req_cb(struct ceph_osd_request *req, struct ceph_msg *msg)
+{
+ struct rbd_request *req_data = req->r_priv;
+ struct ceph_osd_reply_head *replyhead;
+ struct ceph_osd_op *op;
+ __s32 rc;
+ u64 bytes;
+ int read_op;
+
+ /* parse reply */
+ replyhead = msg->front.iov_base;
+ WARN_ON(le32_to_cpu(replyhead->num_ops) == 0);
+ op = (void *)(replyhead + 1);
+ rc = le32_to_cpu(replyhead->result);
+ bytes = le64_to_cpu(op->extent.length);
+ read_op = (le32_to_cpu(op->op) == CEPH_OSD_OP_READ);
+
+ dout("rbd_req_cb bytes=%lld readop=%d rc=%d\n", bytes, read_op, rc);
+
+ if (rc == -ENOENT && read_op) {
+ zero_bio_chain(req_data->bio, 0);
+ rc = 0;
+ } else if (rc == 0 && read_op && bytes < req_data->len) {
+ zero_bio_chain(req_data->bio, bytes);
+ bytes = req_data->len;
+ }
+
+ blk_end_request(req_data->rq, rc, bytes);
+
+ if (req_data->bio)
+ bio_chain_put(req_data->bio);
+
+ ceph_osdc_put_request(req);
+ kfree(req_data);
+}
+
+/*
+ * Do a synchronous ceph osd operation
+ */
+static int rbd_req_sync_op(struct rbd_device *dev,
+ struct ceph_snap_context *snapc,
+ u64 snapid,
+ int opcode,
+ int flags,
+ struct ceph_osd_req_op *orig_ops,
+ int num_reply,
+ const char *obj,
+ u64 ofs, u64 len,
+ char *buf)
+{
+ int ret;
+ struct page **pages;
+ int num_pages;
+ struct ceph_osd_req_op *ops = orig_ops;
+ u32 payload_len;
+
+ num_pages = calc_pages_for(ofs , len);
+ pages = ceph_alloc_page_vector(num_pages, GFP_KERNEL);
+ if (!pages)
+ return -ENOMEM;
+
+ if (!orig_ops) {
+ payload_len = (flags & CEPH_OSD_FLAG_WRITE ? len : 0);
+ ret = rbd_create_rw_ops(&ops, 1, opcode, payload_len);
+ if (ret < 0)
+ goto done;
+
+ if ((flags & CEPH_OSD_FLAG_WRITE) && buf) {
+ ret = ceph_copy_to_page_vector(pages, buf, ofs, len);
+ if (ret < 0)
+ goto done_ops;
+ }
+ }
+
+ ret = rbd_do_request(NULL, dev, snapc, snapid,
+ obj, ofs, len, NULL,
+ pages, num_pages,
+ flags,
+ ops,
+ 2,
+ NULL);
+ if (ret < 0)
+ goto done_ops;
+
+ if ((flags & CEPH_OSD_FLAG_READ) && buf)
+ ret = ceph_copy_from_page_vector(pages, buf, ofs, ret);
+
+done_ops:
+ if (!orig_ops)
+ rbd_destroy_ops(ops);
+done:
+ ceph_release_page_vector(pages, num_pages);
+ return ret;
+}
+
+/*
+ * Do an asynchronous ceph osd operation
+ */
+static int rbd_do_op(struct request *rq,
+ struct rbd_device *rbd_dev ,
+ struct ceph_snap_context *snapc,
+ u64 snapid,
+ int opcode, int flags, int num_reply,
+ u64 ofs, u64 len,
+ struct bio *bio)
+{
+ char *seg_name;
+ u64 seg_ofs;
+ u64 seg_len;
+ int ret;
+ struct ceph_osd_req_op *ops;
+ u32 payload_len;
+
+ seg_name = kmalloc(RBD_MAX_SEG_NAME_LEN + 1, GFP_NOIO);
+ if (!seg_name)
+ return -ENOMEM;
+
+ seg_len = rbd_get_segment(&rbd_dev->header,
+ rbd_dev->header.block_name,
+ ofs, len,
+ seg_name, &seg_ofs);
+ if (seg_len < 0)
+ return seg_len;
+
+ payload_len = (flags & CEPH_OSD_FLAG_WRITE ? seg_len : 0);
+
+ ret = rbd_create_rw_ops(&ops, 1, opcode, payload_len);
+ if (ret < 0)
+ goto done;
+
+ /* we've taken care of segment sizes earlier when we
+ cloned the bios. We should never have a segment
+ truncated at this point */
+ BUG_ON(seg_len < len);
+
+ ret = rbd_do_request(rq, rbd_dev, snapc, snapid,
+ seg_name, seg_ofs, seg_len,
+ bio,
+ NULL, 0,
+ flags,
+ ops,
+ num_reply,
+ rbd_req_cb);
+done:
+ kfree(seg_name);
+ return ret;
+}
+
+/*
+ * Request async osd write
+ */
+static int rbd_req_write(struct request *rq,
+ struct rbd_device *rbd_dev,
+ struct ceph_snap_context *snapc,
+ u64 ofs, u64 len,
+ struct bio *bio)
+{
+ return rbd_do_op(rq, rbd_dev, snapc, CEPH_NOSNAP,
+ CEPH_OSD_OP_WRITE,
+ CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
+ 2,
+ ofs, len, bio);
+}
+
+/*
+ * Request async osd read
+ */
+static int rbd_req_read(struct request *rq,
+ struct rbd_device *rbd_dev,
+ u64 snapid,
+ u64 ofs, u64 len,
+ struct bio *bio)
+{
+ return rbd_do_op(rq, rbd_dev, NULL,
+ (snapid ? snapid : CEPH_NOSNAP),
+ CEPH_OSD_OP_READ,
+ CEPH_OSD_FLAG_READ,
+ 2,
+ ofs, len, bio);
+}
+
+/*
+ * Request sync osd read
+ */
+static int rbd_req_sync_read(struct rbd_device *dev,
+ struct ceph_snap_context *snapc,
+ u64 snapid,
+ const char *obj,
+ u64 ofs, u64 len,
+ char *buf)
+{
+ return rbd_req_sync_op(dev, NULL,
+ (snapid ? snapid : CEPH_NOSNAP),
+ CEPH_OSD_OP_READ,
+ CEPH_OSD_FLAG_READ,
+ NULL,
+ 1, obj, ofs, len, buf);
+}
+
+/*
+ * Request sync osd read
+ */
+static int rbd_req_sync_rollback_obj(struct rbd_device *dev,
+ u64 snapid,
+ const char *obj)
+{
+ struct ceph_osd_req_op *ops;
+ int ret = rbd_create_rw_ops(&ops, 1, CEPH_OSD_OP_ROLLBACK, 0);
+ if (ret < 0)
+ return ret;
+
+ ops[0].snap.snapid = snapid;
+
+ ret = rbd_req_sync_op(dev, NULL,
+ CEPH_NOSNAP,
+ 0,
+ CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
+ ops,
+ 1, obj, 0, 0, NULL);
+
+ rbd_destroy_ops(ops);
+
+ if (ret < 0)
+ return ret;
+
+ return ret;
+}
+
+/*
+ * Request sync osd read
+ */
+static int rbd_req_sync_exec(struct rbd_device *dev,
+ const char *obj,
+ const char *cls,
+ const char *method,
+ const char *data,
+ int len)
+{
+ struct ceph_osd_req_op *ops;
+ int cls_len = strlen(cls);
+ int method_len = strlen(method);
+ int ret = rbd_create_rw_ops(&ops, 1, CEPH_OSD_OP_CALL,
+ cls_len + method_len + len);
+ if (ret < 0)
+ return ret;
+
+ ops[0].cls.class_name = cls;
+ ops[0].cls.class_len = (__u8)cls_len;
+ ops[0].cls.method_name = method;
+ ops[0].cls.method_len = (__u8)method_len;
+ ops[0].cls.argc = 0;
+ ops[0].cls.indata = data;
+ ops[0].cls.indata_len = len;
+
+ ret = rbd_req_sync_op(dev, NULL,
+ CEPH_NOSNAP,
+ 0,
+ CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
+ ops,
+ 1, obj, 0, 0, NULL);
+
+ rbd_destroy_ops(ops);
+
+ dout("cls_exec returned %d\n", ret);
+ return ret;
+}
+
+/*
+ * block device queue callback
+ */
+static void rbd_rq_fn(struct request_queue *q)
+{
+ struct rbd_device *rbd_dev = q->queuedata;
+ struct request *rq;
+ struct bio_pair *bp = NULL;
+
+ rq = blk_fetch_request(q);
+
+ while (1) {
+ struct bio *bio;
+ struct bio *rq_bio, *next_bio = NULL;
+ bool do_write;
+ int size, op_size = 0;
+ u64 ofs;
+
+ /* peek at request from block layer */
+ if (!rq)
+ break;
+
+ dout("fetched request\n");
+
+ /* filter out block requests we don't understand */
+ if ((rq->cmd_type != REQ_TYPE_FS)) {
+ __blk_end_request_all(rq, 0);
+ goto next;
+ }
+
+ /* deduce our operation (read, write) */
+ do_write = (rq_data_dir(rq) == WRITE);
+
+ size = blk_rq_bytes(rq);
+ ofs = blk_rq_pos(rq) * 512ULL;
+ rq_bio = rq->bio;
+ if (do_write && rbd_dev->read_only) {
+ __blk_end_request_all(rq, -EROFS);
+ goto next;
+ }
+
+ spin_unlock_irq(q->queue_lock);
+
+ dout("%s 0x%x bytes at 0x%llx\n",
+ do_write ? "write" : "read",
+ size, blk_rq_pos(rq) * 512ULL);
+
+ do {
+ /* a bio clone to be passed down to OSD req */
+ dout("rq->bio->bi_vcnt=%d\n", rq->bio->bi_vcnt);
+ op_size = rbd_get_segment(&rbd_dev->header,
+ rbd_dev->header.block_name,
+ ofs, size,
+ NULL, NULL);
+ bio = bio_chain_clone(&rq_bio, &next_bio, &bp,
+ op_size, GFP_ATOMIC);
+ if (!bio) {
+ spin_lock_irq(q->queue_lock);
+ __blk_end_request_all(rq, -ENOMEM);
+ goto next;
+ }
+
+ /* init OSD command: write or read */
+ if (do_write)
+ rbd_req_write(rq, rbd_dev,
+ rbd_dev->header.snapc,
+ ofs,
+ op_size, bio);
+ else
+ rbd_req_read(rq, rbd_dev,
+ cur_snap_id(rbd_dev),
+ ofs,
+ op_size, bio);
+
+ size -= op_size;
+ ofs += op_size;
+
+ rq_bio = next_bio;
+ } while (size > 0);
+
+ if (bp)
+ bio_pair_release(bp);
+
+ spin_lock_irq(q->queue_lock);
+next:
+ rq = blk_fetch_request(q);
+ }
+}
+
+/*
+ * a queue callback. Makes sure that we don't create a bio that spans across
+ * multiple osd objects. One exception would be with a single page bios,
+ * which we handle later at bio_chain_clone
+ */
+static int rbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd,
+ struct bio_vec *bvec)
+{
+ struct rbd_device *rbd_dev = q->queuedata;
+ unsigned int chunk_sectors = 1 << (rbd_dev->header.obj_order - 9);
+ sector_t sector = bmd->bi_sector + get_start_sect(bmd->bi_bdev);
+ unsigned int bio_sectors = bmd->bi_size >> 9;
+ int max;
+
+ max = (chunk_sectors - ((sector & (chunk_sectors - 1))
+ + bio_sectors)) << 9;
+ if (max < 0)
+ max = 0; /* bio_add cannot handle a negative return */
+ if (max <= bvec->bv_len && bio_sectors == 0)
+ return bvec->bv_len;
+ return max;
+}
+
+static void rbd_free_disk(struct rbd_device *rbd_dev)
+{
+ struct gendisk *disk = rbd_dev->disk;
+
+ if (!disk)
+ return;
+
+ rbd_header_free(&rbd_dev->header);
+
+ if (disk->flags & GENHD_FL_UP)
+ del_gendisk(disk);
+ if (disk->queue)
+ blk_cleanup_queue(disk->queue);
+ put_disk(disk);
+}
+
+/*
+ * reload the ondisk the header
+ */
+static int rbd_read_header(struct rbd_device *rbd_dev,
+ struct rbd_image_header *header)
+{
+ ssize_t rc;
+ struct rbd_image_header_ondisk *dh;
+ int snap_count = 0;
+ u64 snap_names_len = 0;
+
+ while (1) {
+ int len = sizeof(*dh) +
+ snap_count * sizeof(struct rbd_image_snap_ondisk) +
+ snap_names_len;
+
+ rc = -ENOMEM;
+ dh = kmalloc(len, GFP_KERNEL);
+ if (!dh)
+ return -ENOMEM;
+
+ rc = rbd_req_sync_read(rbd_dev,
+ NULL, CEPH_NOSNAP,
+ rbd_dev->obj_md_name,
+ 0, len,
+ (char *)dh);
+ if (rc < 0)
+ goto out_dh;
+
+ rc = rbd_header_from_disk(header, dh, snap_count, GFP_KERNEL);
+ if (rc < 0)
+ goto out_dh;
+
+ if (snap_count != header->total_snaps) {
+ snap_count = header->total_snaps;
+ snap_names_len = header->snap_names_len;
+ rbd_header_free(header);
+ kfree(dh);
+ continue;
+ }
+ break;
+ }
+
+out_dh:
+ kfree(dh);
+ return rc;
+}
+
+/*
+ * create a snapshot
+ */
+static int rbd_header_add_snap(struct rbd_device *dev,
+ const char *snap_name,
+ gfp_t gfp_flags)
+{
+ int name_len = strlen(snap_name);
+ u64 new_snapid;
+ int ret;
+ void *data, *data_start, *data_end;
+
+ /* we should create a snapshot only if we're pointing at the head */
+ if (dev->cur_snap)
+ return -EINVAL;
+
+ ret = ceph_monc_create_snapid(&dev->client->monc, dev->poolid,
+ &new_snapid);
+ dout("created snapid=%lld\n", new_snapid);
+ if (ret < 0)
+ return ret;
+
+ data = kmalloc(name_len + 16, gfp_flags);
+ if (!data)
+ return -ENOMEM;
+
+ data_start = data;
+ data_end = data + name_len + 16;
+
+ ceph_encode_string_safe(&data, data_end, snap_name, name_len, bad);
+ ceph_encode_64_safe(&data, data_end, new_snapid, bad);
+
+ ret = rbd_req_sync_exec(dev, dev->obj_md_name, "rbd", "snap_add",
+ data_start, data - data_start);
+
+ kfree(data_start);
+
+ if (ret < 0)
+ return ret;
+
+ dev->header.snapc->seq = new_snapid;
+
+ return 0;
+bad:
+ return -ERANGE;
+}
+
+/*
+ * only read the first part of the ondisk header, without the snaps info
+ */
+static int rbd_update_snaps(struct rbd_device *rbd_dev)
+{
+ int ret;
+ struct rbd_image_header h;
+ u64 snap_seq;
+
+ ret = rbd_read_header(rbd_dev, &h);
+ if (ret < 0)
+ return ret;
+
+ down_write(&rbd_dev->header.snap_rwsem);
+
+ snap_seq = rbd_dev->header.snapc->seq;
+
+ kfree(rbd_dev->header.snapc);
+ kfree(rbd_dev->header.snap_names);
+ kfree(rbd_dev->header.snap_sizes);
+
+ rbd_dev->header.total_snaps = h.total_snaps;
+ rbd_dev->header.snapc = h.snapc;
+ rbd_dev->header.snap_names = h.snap_names;
+ rbd_dev->header.snap_sizes = h.snap_sizes;
+ rbd_dev->header.snapc->seq = snap_seq;
+
+ up_write(&rbd_dev->header.snap_rwsem);
+
+ return 0;
+}
+
+static int rbd_init_disk(struct rbd_device *rbd_dev)
+{
+ struct gendisk *disk;
+ struct request_queue *q;
+ int rc;
+ u64 total_size = 0;
+
+ /* contact OSD, request size info about the object being mapped */
+ rc = rbd_read_header(rbd_dev, &rbd_dev->header);
+ if (rc)
+ return rc;
+
+ rc = rbd_header_set_snap(rbd_dev, rbd_dev->snap_name, &total_size);
+ if (rc)
+ return rc;
+
+ /* create gendisk info */
+ rc = -ENOMEM;
+ disk = alloc_disk(RBD_MINORS_PER_MAJOR);
+ if (!disk)
+ goto out;
+
+ sprintf(disk->disk_name, DRV_NAME "%d", rbd_dev->id);
+ disk->major = rbd_dev->major;
+ disk->first_minor = 0;
+ disk->fops = &rbd_bd_ops;
+ disk->private_data = rbd_dev;
+
+ /* init rq */
+ rc = -ENOMEM;
+ q = blk_init_queue(rbd_rq_fn, &rbd_dev->lock);
+ if (!q)
+ goto out_disk;
+ blk_queue_merge_bvec(q, rbd_merge_bvec);
+ disk->queue = q;
+
+ q->queuedata = rbd_dev;
+
+ rbd_dev->disk = disk;
+ rbd_dev->q = q;
+
+ /* finally, announce the disk to the world */
+ set_capacity(disk, total_size / 512ULL);
+ add_disk(disk);
+
+ pr_info("%s: added with size 0x%llx\n",
+ disk->disk_name, (unsigned long long)total_size);
+ return 0;
+
+out_disk:
+ put_disk(disk);
+out:
+ return rc;
+}
+
+/********************************************************************
+ * /sys/class/rbd/
+ * add map rados objects to blkdev
+ * remove unmap rados objects
+ * list show mappings
+ *******************************************************************/
+
+static void class_rbd_release(struct class *cls)
+{
+ kfree(cls);
+}
+
+static ssize_t class_rbd_list(struct class *c,
+ struct class_attribute *attr,
+ char *data)
+{
+ int n = 0;
+ struct list_head *tmp;
+ int max = PAGE_SIZE;
+
+ mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
+
+ n += snprintf(data, max,
+ "#id\tmajor\tclient_name\tpool\tname\tsnap\tKB\n");
+
+ list_for_each(tmp, &rbd_dev_list) {
+ struct rbd_device *rbd_dev;
+
+ rbd_dev = list_entry(tmp, struct rbd_device, node);
+ n += snprintf(data+n, max-n,
+ "%d\t%d\tclient%lld\t%s\t%s\t%s\t%lld\n",
+ rbd_dev->id,
+ rbd_dev->major,
+ ceph_client_id(rbd_dev->client),
+ rbd_dev->pool_name,
+ rbd_dev->obj, rbd_dev->snap_name,
+ rbd_dev->header.image_size >> 10);
+ if (n == max)
+ break;
+ }
+
+ mutex_unlock(&ctl_mutex);
+ return n;
+}
+
+static ssize_t class_rbd_add(struct class *c,
+ struct class_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct ceph_osd_client *osdc;
+ struct rbd_device *rbd_dev;
+ ssize_t rc = -ENOMEM;
+ int irc, new_id = 0;
+ struct list_head *tmp;
+ char *mon_dev_name;
+ char *options;
+
+ if (!try_module_get(THIS_MODULE))
+ return -ENODEV;
+
+ mon_dev_name = kmalloc(RBD_MAX_OPT_LEN, GFP_KERNEL);
+ if (!mon_dev_name)
+ goto err_out_mod;
+
+ options = kmalloc(RBD_MAX_OPT_LEN, GFP_KERNEL);
+ if (!options)
+ goto err_mon_dev;
+
+ /* new rbd_device object */
+ rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL);
+ if (!rbd_dev)
+ goto err_out_opt;
+
+ /* static rbd_device initialization */
+ spin_lock_init(&rbd_dev->lock);
+ INIT_LIST_HEAD(&rbd_dev->node);
+
+ /* generate unique id: find highest unique id, add one */
+ mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
+
+ list_for_each(tmp, &rbd_dev_list) {
+ struct rbd_device *rbd_dev;
+
+ rbd_dev = list_entry(tmp, struct rbd_device, node);
+ if (rbd_dev->id >= new_id)
+ new_id = rbd_dev->id + 1;
+ }
+
+ rbd_dev->id = new_id;
+
+ /* add to global list */
+ list_add_tail(&rbd_dev->node, &rbd_dev_list);
+
+ /* parse add command */
+ if (sscanf(buf, "%" __stringify(RBD_MAX_OPT_LEN) "s "
+ "%" __stringify(RBD_MAX_OPT_LEN) "s "
+ "%" __stringify(RBD_MAX_POOL_NAME_LEN) "s "
+ "%" __stringify(RBD_MAX_OBJ_NAME_LEN) "s"
+ "%" __stringify(RBD_MAX_SNAP_NAME_LEN) "s",
+ mon_dev_name, options, rbd_dev->pool_name,
+ rbd_dev->obj, rbd_dev->snap_name) < 4) {
+ rc = -EINVAL;
+ goto err_out_slot;
+ }
+
+ if (rbd_dev->snap_name[0] == 0)
+ rbd_dev->snap_name[0] = '-';
+
+ rbd_dev->obj_len = strlen(rbd_dev->obj);
+ snprintf(rbd_dev->obj_md_name, sizeof(rbd_dev->obj_md_name), "%s%s",
+ rbd_dev->obj, RBD_SUFFIX);
+
+ /* initialize rest of new object */
+ snprintf(rbd_dev->name, DEV_NAME_LEN, DRV_NAME "%d", rbd_dev->id);
+ rc = rbd_get_client(rbd_dev, mon_dev_name, options);
+ if (rc < 0)
+ goto err_out_slot;
+
+ mutex_unlock(&ctl_mutex);
+
+ /* pick the pool */
+ osdc = &rbd_dev->client->osdc;
+ rc = ceph_pg_poolid_by_name(osdc->osdmap, rbd_dev->pool_name);
+ if (rc < 0)
+ goto err_out_client;
+ rbd_dev->poolid = rc;
+
+ /* register our block device */
+ irc = register_blkdev(0, rbd_dev->name);
+ if (irc < 0) {
+ rc = irc;
+ goto err_out_client;
+ }
+ rbd_dev->major = irc;
+
+ /* set up and announce blkdev mapping */
+ rc = rbd_init_disk(rbd_dev);
+ if (rc)
+ goto err_out_blkdev;
+
+ return count;
+
+err_out_blkdev:
+ unregister_blkdev(rbd_dev->major, rbd_dev->name);
+err_out_client:
+ rbd_put_client(rbd_dev);
+ mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
+err_out_slot:
+ list_del_init(&rbd_dev->node);
+ mutex_unlock(&ctl_mutex);
+
+ kfree(rbd_dev);
+err_out_opt:
+ kfree(options);
+err_mon_dev:
+ kfree(mon_dev_name);
+err_out_mod:
+ dout("Error adding device %s\n", buf);
+ module_put(THIS_MODULE);
+ return rc;
+}
+
+static struct rbd_device *__rbd_get_dev(unsigned long id)
+{
+ struct list_head *tmp;
+ struct rbd_device *rbd_dev;
+
+ list_for_each(tmp, &rbd_dev_list) {
+ rbd_dev = list_entry(tmp, struct rbd_device, node);
+ if (rbd_dev->id == id)
+ return rbd_dev;
+ }
+ return NULL;
+}
+
+static ssize_t class_rbd_remove(struct class *c,
+ struct class_attribute *attr,
+ const char *buf,
+ size_t count)
+{
+ struct rbd_device *rbd_dev = NULL;
+ int target_id, rc;
+ unsigned long ul;
+
+ rc = strict_strtoul(buf, 10, &ul);
+ if (rc)
+ return rc;
+
+ /* convert to int; abort if we lost anything in the conversion */
+ target_id = (int) ul;
+ if (target_id != ul)
+ return -EINVAL;
+
+ /* remove object from list immediately */
+ mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
+
+ rbd_dev = __rbd_get_dev(target_id);
+ if (rbd_dev)
+ list_del_init(&rbd_dev->node);
+
+ mutex_unlock(&ctl_mutex);
+
+ if (!rbd_dev)
+ return -ENOENT;
+
+ rbd_put_client(rbd_dev);
+
+ /* clean up and free blkdev */
+ rbd_free_disk(rbd_dev);
+ unregister_blkdev(rbd_dev->major, rbd_dev->name);
+ kfree(rbd_dev);
+
+ /* release module ref */
+ module_put(THIS_MODULE);
+
+ return count;
+}
+
+static ssize_t class_rbd_snaps_list(struct class *c,
+ struct class_attribute *attr,
+ char *data)
+{
+ struct rbd_device *rbd_dev = NULL;
+ struct list_head *tmp;
+ struct rbd_image_header *header;
+ int i, n = 0, max = PAGE_SIZE;
+ int ret;
+
+ mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
+
+ n += snprintf(data, max, "#id\tsnap\tKB\n");
+
+ list_for_each(tmp, &rbd_dev_list) {
+ char *names, *p;
+ struct ceph_snap_context *snapc;
+
+ rbd_dev = list_entry(tmp, struct rbd_device, node);
+ header = &rbd_dev->header;
+
+ down_read(&header->snap_rwsem);
+
+ names = header->snap_names;
+ snapc = header->snapc;
+
+ n += snprintf(data + n, max - n, "%d\t%s\t%lld%s\n",
+ rbd_dev->id, RBD_SNAP_HEAD_NAME,
+ header->image_size >> 10,
+ (!rbd_dev->cur_snap ? " (*)" : ""));
+ if (n == max)
+ break;
+
+ p = names;
+ for (i = 0; i < header->total_snaps; i++, p += strlen(p) + 1) {
+ n += snprintf(data + n, max - n, "%d\t%s\t%lld%s\n",
+ rbd_dev->id, p, header->snap_sizes[i] >> 10,
+ (rbd_dev->cur_snap &&
+ (snap_index(header, i) == rbd_dev->cur_snap) ?
+ " (*)" : ""));
+ if (n == max)
+ break;
+ }
+
+ up_read(&header->snap_rwsem);
+ }
+
+
+ ret = n;
+ mutex_unlock(&ctl_mutex);
+ return ret;
+}
+
+static ssize_t class_rbd_snaps_refresh(struct class *c,
+ struct class_attribute *attr,
+ const char *buf,
+ size_t count)
+{
+ struct rbd_device *rbd_dev = NULL;
+ int target_id, rc;
+ unsigned long ul;
+ int ret = count;
+
+ rc = strict_strtoul(buf, 10, &ul);
+ if (rc)
+ return rc;
+
+ /* convert to int; abort if we lost anything in the conversion */
+ target_id = (int) ul;
+ if (target_id != ul)
+ return -EINVAL;
+
+ mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
+
+ rbd_dev = __rbd_get_dev(target_id);
+ if (!rbd_dev) {
+ ret = -ENOENT;
+ goto done;
+ }
+
+ rc = rbd_update_snaps(rbd_dev);
+ if (rc < 0)
+ ret = rc;
+
+done:
+ mutex_unlock(&ctl_mutex);
+ return ret;
+}
+
+static ssize_t class_rbd_snap_create(struct class *c,
+ struct class_attribute *attr,
+ const char *buf,
+ size_t count)
+{
+ struct rbd_device *rbd_dev = NULL;
+ int target_id, ret;
+ char *name;
+
+ name = kmalloc(RBD_MAX_SNAP_NAME_LEN + 1, GFP_KERNEL);
+ if (!name)
+ return -ENOMEM;
+
+ /* parse snaps add command */
+ if (sscanf(buf, "%d "
+ "%" __stringify(RBD_MAX_SNAP_NAME_LEN) "s",
+ &target_id,
+ name) != 2) {
+ ret = -EINVAL;
+ goto done;
+ }
+
+ mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
+
+ rbd_dev = __rbd_get_dev(target_id);
+ if (!rbd_dev) {
+ ret = -ENOENT;
+ goto done_unlock;
+ }
+
+ ret = rbd_header_add_snap(rbd_dev,
+ name, GFP_KERNEL);
+ if (ret < 0)
+ goto done_unlock;
+
+ ret = rbd_update_snaps(rbd_dev);
+ if (ret < 0)
+ goto done_unlock;
+
+ ret = count;
+done_unlock:
+ mutex_unlock(&ctl_mutex);
+done:
+ kfree(name);
+ return ret;
+}
+
+static ssize_t class_rbd_rollback(struct class *c,
+ struct class_attribute *attr,
+ const char *buf,
+ size_t count)
+{
+ struct rbd_device *rbd_dev = NULL;
+ int target_id, ret;
+ u64 snapid;
+ char snap_name[RBD_MAX_SNAP_NAME_LEN];
+ u64 cur_ofs;
+ char *seg_name;
+
+ /* parse snaps add command */
+ if (sscanf(buf, "%d "
+ "%" __stringify(RBD_MAX_SNAP_NAME_LEN) "s",
+ &target_id,
+ snap_name) != 2) {
+ return -EINVAL;
+ }
+
+ ret = -ENOMEM;
+ seg_name = kmalloc(RBD_MAX_SEG_NAME_LEN + 1, GFP_NOIO);
+ if (!seg_name)
+ return ret;
+
+ mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
+
+ rbd_dev = __rbd_get_dev(target_id);
+ if (!rbd_dev) {
+ ret = -ENOENT;
+ goto done_unlock;
+ }
+
+ ret = snap_by_name(&rbd_dev->header, snap_name, &snapid, NULL);
+ if (ret < 0)
+ goto done_unlock;
+
+ dout("snapid=%lld\n", snapid);
+
+ cur_ofs = 0;
+ while (cur_ofs < rbd_dev->header.image_size) {
+ cur_ofs += rbd_get_segment(&rbd_dev->header,
+ rbd_dev->obj,
+ cur_ofs, (u64)-1,
+ seg_name, NULL);
+ dout("seg_name=%s\n", seg_name);
+
+ ret = rbd_req_sync_rollback_obj(rbd_dev, snapid, seg_name);
+ if (ret < 0)
+ pr_warning("could not roll back obj %s err=%d\n",
+ seg_name, ret);
+ }
+
+ ret = rbd_update_snaps(rbd_dev);
+ if (ret < 0)
+ goto done_unlock;
+
+ ret = count;
+
+done_unlock:
+ mutex_unlock(&ctl_mutex);
+ kfree(seg_name);
+
+ return ret;
+}
+
+static struct class_attribute class_rbd_attrs[] = {
+ __ATTR(add, 0200, NULL, class_rbd_add),
+ __ATTR(remove, 0200, NULL, class_rbd_remove),
+ __ATTR(list, 0444, class_rbd_list, NULL),
+ __ATTR(snaps_refresh, 0200, NULL, class_rbd_snaps_refresh),
+ __ATTR(snap_create, 0200, NULL, class_rbd_snap_create),
+ __ATTR(snaps_list, 0444, class_rbd_snaps_list, NULL),
+ __ATTR(snap_rollback, 0200, NULL, class_rbd_rollback),
+ __ATTR_NULL
+};
+
+/*
+ * create control files in sysfs
+ * /sys/class/rbd/...
+ */
+static int rbd_sysfs_init(void)
+{
+ int ret = -ENOMEM;
+
+ class_rbd = kzalloc(sizeof(*class_rbd), GFP_KERNEL);
+ if (!class_rbd)
+ goto out;
+
+ class_rbd->name = DRV_NAME;
+ class_rbd->owner = THIS_MODULE;
+ class_rbd->class_release = class_rbd_release;
+ class_rbd->class_attrs = class_rbd_attrs;
+
+ ret = class_register(class_rbd);
+ if (ret)
+ goto out_class;
+ return 0;
+
+out_class:
+ kfree(class_rbd);
+ class_rbd = NULL;
+ pr_err(DRV_NAME ": failed to create class rbd\n");
+out:
+ return ret;
+}
+
+static void rbd_sysfs_cleanup(void)
+{
+ if (class_rbd)
+ class_destroy(class_rbd);
+ class_rbd = NULL;
+}
+
+int __init rbd_init(void)
+{
+ int rc;
+
+ rc = rbd_sysfs_init();
+ if (rc)
+ return rc;
+ spin_lock_init(&node_lock);
+ pr_info("loaded " DRV_NAME_LONG "\n");
+ return 0;
+}
+
+void __exit rbd_exit(void)
+{
+ rbd_sysfs_cleanup();
+}
+
+module_init(rbd_init);
+module_exit(rbd_exit);
+
+MODULE_AUTHOR("Sage Weil <sage@newdream.net>");
+MODULE_AUTHOR("Yehuda Sadeh <yehuda@hq.newdream.net>");
+MODULE_DESCRIPTION("rados block device");
+
+/* following authorship retained from original osdblk.c */
+MODULE_AUTHOR("Jeff Garzik <jeff@garzik.org>");
+
+MODULE_LICENSE("GPL");
diff --git a/drivers/block/rbd_types.h b/drivers/block/rbd_types.h
new file mode 100644
index 000000000000..fc6c678aa2cb
--- /dev/null
+++ b/drivers/block/rbd_types.h
@@ -0,0 +1,73 @@
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2004-2010 Sage Weil <sage@newdream.net>
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+#ifndef CEPH_RBD_TYPES_H
+#define CEPH_RBD_TYPES_H
+
+#include <linux/types.h>
+
+/*
+ * rbd image 'foo' consists of objects
+ * foo.rbd - image metadata
+ * foo.00000000
+ * foo.00000001
+ * ... - data
+ */
+
+#define RBD_SUFFIX ".rbd"
+#define RBD_DIRECTORY "rbd_directory"
+#define RBD_INFO "rbd_info"
+
+#define RBD_DEFAULT_OBJ_ORDER 22 /* 4MB */
+#define RBD_MIN_OBJ_ORDER 16
+#define RBD_MAX_OBJ_ORDER 30
+
+#define RBD_MAX_OBJ_NAME_LEN 96
+#define RBD_MAX_SEG_NAME_LEN 128
+
+#define RBD_COMP_NONE 0
+#define RBD_CRYPT_NONE 0
+
+#define RBD_HEADER_TEXT "<<< Rados Block Device Image >>>\n"
+#define RBD_HEADER_SIGNATURE "RBD"
+#define RBD_HEADER_VERSION "001.005"
+
+struct rbd_info {
+ __le64 max_id;
+} __attribute__ ((packed));
+
+struct rbd_image_snap_ondisk {
+ __le64 id;
+ __le64 image_size;
+} __attribute__((packed));
+
+struct rbd_image_header_ondisk {
+ char text[40];
+ char block_name[24];
+ char signature[4];
+ char version[8];
+ struct {
+ __u8 order;
+ __u8 crypt_type;
+ __u8 comp_type;
+ __u8 unused;
+ } __attribute__((packed)) options;
+ __le64 image_size;
+ __le64 snap_seq;
+ __le32 snap_count;
+ __le32 reserved;
+ __le64 snap_names_len;
+ struct rbd_image_snap_ondisk snaps[0];
+} __attribute__((packed));
+
+
+#endif
diff --git a/drivers/char/hw_random/n2-drv.c b/drivers/char/hw_random/n2-drv.c
index 1acdb2509511..a3f5e381e746 100644
--- a/drivers/char/hw_random/n2-drv.c
+++ b/drivers/char/hw_random/n2-drv.c
@@ -387,7 +387,7 @@ static int n2rng_init_control(struct n2rng *np)
static int n2rng_data_read(struct hwrng *rng, u32 *data)
{
- struct n2rng *np = rng->priv;
+ struct n2rng *np = (struct n2rng *) rng->priv;
unsigned long ra = __pa(&np->test_data);
int len;
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c
index a7ca75212bfe..0c6c64178d7f 100644
--- a/drivers/char/keyboard.c
+++ b/drivers/char/keyboard.c
@@ -363,6 +363,43 @@ static void to_utf8(struct vc_data *vc, uint c)
}
}
+#ifdef CONFIG_KDB_KEYBOARD
+static int kbd_clear_keys_helper(struct input_handle *handle, void *data)
+{
+ unsigned int *keycode = data;
+ input_inject_event(handle, EV_KEY, *keycode, 0);
+ return 0;
+}
+
+static void kbd_clear_keys_callback(struct work_struct *dummy)
+{
+ unsigned int i, j, k;
+
+ for (i = 0; i < ARRAY_SIZE(key_down); i++) {
+ if (!key_down[i])
+ continue;
+
+ k = i * BITS_PER_LONG;
+
+ for (j = 0; j < BITS_PER_LONG; j++, k++) {
+ if (!test_bit(k, key_down))
+ continue;
+ input_handler_for_each_handle(&kbd_handler, &k,
+ kbd_clear_keys_helper);
+ }
+ }
+}
+
+static DECLARE_WORK(kbd_clear_keys_work, kbd_clear_keys_callback);
+
+/* Called to clear any key presses after resuming the kernel. */
+void kbd_dbg_clear_keys(void)
+{
+ schedule_work(&kbd_clear_keys_work);
+}
+EXPORT_SYMBOL_GPL(kbd_dbg_clear_keys);
+#endif /* CONFIG_KDB_KEYBOARD */
+
/*
* Called after returning from RAW mode or when changing consoles - recompute
* shift_down[] and shift_state from key_down[] maybe called when keymap is
diff --git a/drivers/char/vt.c b/drivers/char/vt.c
index c734f9b1263a..50590c7f2c01 100644
--- a/drivers/char/vt.c
+++ b/drivers/char/vt.c
@@ -194,10 +194,11 @@ static DECLARE_WORK(console_work, console_callback);
int fg_console;
int last_console;
int want_console = -1;
-int saved_fg_console;
-int saved_last_console;
-int saved_want_console;
-int saved_vc_mode;
+static int saved_fg_console;
+static int saved_last_console;
+static int saved_want_console;
+static int saved_vc_mode;
+static int saved_console_blanked;
/*
* For each existing display, we have a pointer to console currently visible
@@ -3449,6 +3450,7 @@ int con_debug_enter(struct vc_data *vc)
saved_last_console = last_console;
saved_want_console = want_console;
saved_vc_mode = vc->vc_mode;
+ saved_console_blanked = console_blanked;
vc->vc_mode = KD_TEXT;
console_blanked = 0;
if (vc->vc_sw->con_debug_enter)
@@ -3492,6 +3494,7 @@ int con_debug_leave(void)
fg_console = saved_fg_console;
last_console = saved_last_console;
want_console = saved_want_console;
+ console_blanked = saved_console_blanked;
vc_cons[fg_console].d->vc_mode = saved_vc_mode;
vc = vc_cons[fg_console].d;
diff --git a/drivers/clocksource/sh_cmt.c b/drivers/clocksource/sh_cmt.c
index 717305d30444..0a9701b1e13f 100644
--- a/drivers/clocksource/sh_cmt.c
+++ b/drivers/clocksource/sh_cmt.c
@@ -308,7 +308,7 @@ static irqreturn_t sh_cmt_interrupt(int irq, void *dev_id)
* isr before we end up here.
*/
if (p->flags & FLAG_CLOCKSOURCE)
- p->total_cycles += p->match_value;
+ p->total_cycles += p->match_value + 1;
if (!(p->flags & FLAG_REPROGRAM))
p->next_match_value = p->max_match_value;
@@ -403,7 +403,7 @@ static cycle_t sh_cmt_clocksource_read(struct clocksource *cs)
raw = sh_cmt_get_counter(p, &has_wrapped);
if (unlikely(has_wrapped))
- raw += p->match_value;
+ raw += p->match_value + 1;
spin_unlock_irqrestore(&p->lock, flags);
return value + raw;
@@ -445,7 +445,7 @@ static int sh_cmt_register_clocksource(struct sh_cmt_priv *p,
/* clk_get_rate() needs an enabled clock */
clk_enable(p->clk);
- p->rate = clk_get_rate(p->clk) / (p->width == 16) ? 512 : 8;
+ p->rate = clk_get_rate(p->clk) / ((p->width == 16) ? 512 : 8);
clk_disable(p->clk);
/* TODO: calculate good shift from rate and counter bit width */
@@ -478,7 +478,7 @@ static void sh_cmt_clock_event_start(struct sh_cmt_priv *p, int periodic)
ced->min_delta_ns = clockevent_delta2ns(0x1f, ced);
if (periodic)
- sh_cmt_set_next(p, (p->rate + HZ/2) / HZ);
+ sh_cmt_set_next(p, ((p->rate + HZ/2) / HZ) - 1);
else
sh_cmt_set_next(p, p->max_match_value);
}
@@ -523,9 +523,9 @@ static int sh_cmt_clock_event_next(unsigned long delta,
BUG_ON(ced->mode != CLOCK_EVT_MODE_ONESHOT);
if (likely(p->flags & FLAG_IRQCONTEXT))
- p->next_match_value = delta;
+ p->next_match_value = delta - 1;
else
- sh_cmt_set_next(p, delta);
+ sh_cmt_set_next(p, delta - 1);
return 0;
}
@@ -610,8 +610,7 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev)
p->irqaction.name = dev_name(&p->pdev->dev);
p->irqaction.handler = sh_cmt_interrupt;
p->irqaction.dev_id = p;
- p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | \
- IRQF_IRQPOLL | IRQF_NOBALANCING;
+ p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_NOBALANCING;
/* get hold of clock */
p->clk = clk_get(&p->pdev->dev, "cmt_fck");
diff --git a/drivers/clocksource/sh_mtu2.c b/drivers/clocksource/sh_mtu2.c
index ef7a5be8a09f..9fe3507a453d 100644
--- a/drivers/clocksource/sh_mtu2.c
+++ b/drivers/clocksource/sh_mtu2.c
@@ -281,8 +281,7 @@ static int sh_mtu2_setup(struct sh_mtu2_priv *p, struct platform_device *pdev)
p->irqaction.handler = sh_mtu2_interrupt;
p->irqaction.dev_id = p;
p->irqaction.irq = irq;
- p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | \
- IRQF_IRQPOLL | IRQF_NOBALANCING;
+ p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_NOBALANCING;
/* get hold of clock */
p->clk = clk_get(&p->pdev->dev, "mtu2_fck");
diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c
index de715901b82a..75967f8e028e 100644
--- a/drivers/clocksource/sh_tmu.c
+++ b/drivers/clocksource/sh_tmu.c
@@ -387,8 +387,7 @@ static int sh_tmu_setup(struct sh_tmu_priv *p, struct platform_device *pdev)
p->irqaction.handler = sh_tmu_interrupt;
p->irqaction.dev_id = p;
p->irqaction.irq = irq;
- p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | \
- IRQF_IRQPOLL | IRQF_NOBALANCING;
+ p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_NOBALANCING;
/* get hold of clock */
p->clk = clk_get(&p->pdev->dev, "tmu_fck");
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 199dcb9f0b83..c63a43823744 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -918,8 +918,8 @@ static int cpufreq_add_dev_interface(unsigned int cpu,
spin_lock_irqsave(&cpufreq_driver_lock, flags);
for_each_cpu(j, policy->cpus) {
- if (!cpu_online(j))
- continue;
+ if (!cpu_online(j))
+ continue;
per_cpu(cpufreq_cpu_data, j) = policy;
per_cpu(cpufreq_policy_cpu, j) = policy->cpu;
}
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index 9520cf02edc8..f82ef10a8361 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -49,6 +49,14 @@ config INTEL_MID_DMAC
config ASYNC_TX_DISABLE_CHANNEL_SWITCH
bool
+config AMBA_PL08X
+ bool "ARM PrimeCell PL080 or PL081 support"
+ depends on ARM_AMBA && EXPERIMENTAL
+ select DMA_ENGINE
+ help
+ Platform has a PL08x DMAC device
+ which can provide DMA engine support
+
config INTEL_IOATDMA
tristate "Intel I/OAT DMA support"
depends on PCI && X86
diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
index 72bd70384d8a..0b690e7e4384 100644
--- a/drivers/dma/Makefile
+++ b/drivers/dma/Makefile
@@ -25,3 +25,4 @@ obj-$(CONFIG_TIMB_DMA) += timb_dma.o
obj-$(CONFIG_STE_DMA40) += ste_dma40.o ste_dma40_ll.o
obj-$(CONFIG_PL330_DMA) += pl330.o
obj-$(CONFIG_PCH_DMA) += pch_dma.o
+obj-$(CONFIG_AMBA_PL08X) += amba-pl08x.o
diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c
new file mode 100644
index 000000000000..fc5aaebacdfe
--- /dev/null
+++ b/drivers/dma/amba-pl08x.c
@@ -0,0 +1,2025 @@
+/*
+ * Copyright (c) 2006 ARM Ltd.
+ * Copyright (c) 2010 ST-Ericsson SA
+ *
+ * Author: Peter Pearse <peter.pearse@arm.com>
+ * Author: Linus Walleij <linus.walleij@stericsson.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59
+ * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The full GNU General Public License is iin this distribution in the
+ * file called COPYING.
+ *
+ * Documentation: ARM DDI 0196G == PL080
+ * Documentation: ARM DDI 0218E == PL081
+ *
+ * PL080 & PL081 both have 16 sets of DMA signals that can be routed to
+ * any channel.
+ *
+ * The PL080 has 8 channels available for simultaneous use, and the PL081
+ * has only two channels. So on these DMA controllers the number of channels
+ * and the number of incoming DMA signals are two totally different things.
+ * It is usually not possible to theoretically handle all physical signals,
+ * so a multiplexing scheme with possible denial of use is necessary.
+ *
+ * The PL080 has a dual bus master, PL081 has a single master.
+ *
+ * Memory to peripheral transfer may be visualized as
+ * Get data from memory to DMAC
+ * Until no data left
+ * On burst request from peripheral
+ * Destination burst from DMAC to peripheral
+ * Clear burst request
+ * Raise terminal count interrupt
+ *
+ * For peripherals with a FIFO:
+ * Source burst size == half the depth of the peripheral FIFO
+ * Destination burst size == the depth of the peripheral FIFO
+ *
+ * (Bursts are irrelevant for mem to mem transfers - there are no burst
+ * signals, the DMA controller will simply facilitate its AHB master.)
+ *
+ * ASSUMES default (little) endianness for DMA transfers
+ *
+ * Only DMAC flow control is implemented
+ *
+ * Global TODO:
+ * - Break out common code from arch/arm/mach-s3c64xx and share
+ */
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/interrupt.h>
+#include <linux/slab.h>
+#include <linux/dmapool.h>
+#include <linux/amba/bus.h>
+#include <linux/dmaengine.h>
+#include <linux/amba/pl08x.h>
+#include <linux/clk.h>
+
+#include <asm/hardware/pl080.h>
+#include <asm/dma.h>
+#include <asm/mach/dma.h>
+#include <asm/atomic.h>
+#include <asm/processor.h>
+#include <asm/cacheflush.h>
+
+#define DRIVER_NAME "pl08xdmac"
+
+/**
+ * struct vendor_data - vendor-specific config parameters
+ * for PL08x derivates
+ * @name: the name of this specific variant
+ * @channels: the number of channels available in this variant
+ * @dualmaster: whether this version supports dual AHB masters
+ * or not.
+ */
+struct vendor_data {
+ char *name;
+ u8 channels;
+ bool dualmaster;
+};
+
+/*
+ * PL08X private data structures
+ * An LLI struct - see pl08x TRM
+ * Note that next uses bit[0] as a bus bit,
+ * start & end do not - their bus bit info
+ * is in cctl
+ */
+struct lli {
+ dma_addr_t src;
+ dma_addr_t dst;
+ dma_addr_t next;
+ u32 cctl;
+};
+
+/**
+ * struct pl08x_driver_data - the local state holder for the PL08x
+ * @base: virtual memory base (remapped) for the PL08x
+ * @adev: the corresponding AMBA (PrimeCell) bus entry
+ * @vd: vendor data for this PL08x variant
+ * @pd: platform data passed in from the platform/machine
+ * @clk: a clock to be enabled for this device to run
+ * @phy_chans: array of data for the physical channels
+ * @pool: a pool for the LLI descriptors
+ * @pool_ctr: counter of LLIs in the pool
+ * @lock: a spinlock for this struct
+ */
+struct pl08x_driver_data {
+ void __iomem *base;
+ struct amba_device *adev;
+ struct vendor_data *vd;
+ struct pl08x_platform_data *pd;
+ struct clk *clk;
+ struct pl08x_phy_chan *phy_chans;
+ struct dma_pool *pool;
+ int pool_ctr;
+ spinlock_t lock;
+};
+
+#ifdef MODULE
+
+# error "AMBA PL08X DMA CANNOT BE COMPILED AS A LOADABLE MODULE AT PRESENT"
+
+/*
+ a) Some devices might make use of DMA during boot
+ (esp true for DMAENGINE implementation)
+ b) Memory allocation will need much more attention
+ before load/unload can be supported
+ */
+#endif
+
+/*
+ * PL08X specific defines
+ */
+
+/*
+ * Memory boundaries: the manual for PL08x says that the controller
+ * cannot read past a 1KiB boundary, so these defines are used to
+ * create transfer LLIs that do not cross such boundaries.
+ */
+#define PL08X_BOUNDARY_SHIFT (10) /* 1KB 0x400 */
+#define PL08X_BOUNDARY_SIZE (1 << PL08X_BOUNDARY_SHIFT)
+
+/* Minimum period between work queue runs */
+#define PL08X_WQ_PERIODMIN 20
+
+/* Size (bytes) of each LLI buffer allocated for one transfer */
+# define PL08X_LLI_TSFR_SIZE 0x2000
+
+/* Maximimum times we call dma_pool_alloc on this pool without freeing */
+#define PL08X_MAX_ALLOCS 0x40
+#define MAX_NUM_TSFR_LLIS (PL08X_LLI_TSFR_SIZE/sizeof(struct lli))
+#define PL08X_ALIGN 8
+
+static inline struct pl08x_dma_chan *to_pl08x_chan(struct dma_chan *chan)
+{
+ return container_of(chan, struct pl08x_dma_chan, chan);
+}
+
+/*
+ * Physical channel handling
+ */
+
+/* Whether a certain channel is busy or not */
+static int pl08x_phy_channel_busy(struct pl08x_phy_chan *ch)
+{
+ unsigned int val;
+
+ val = readl(ch->base + PL080_CH_CONFIG);
+ return val & PL080_CONFIG_ACTIVE;
+}
+
+/*
+ * Set the initial DMA register values i.e. those for the first LLI
+ * The next lli pointer and the configuration interrupt bit have
+ * been set when the LLIs were constructed
+ */
+static void pl08x_set_cregs(struct pl08x_driver_data *pl08x,
+ struct pl08x_phy_chan *ch)
+{
+ /* Wait for channel inactive */
+ while (pl08x_phy_channel_busy(ch))
+ ;
+
+ dev_vdbg(&pl08x->adev->dev,
+ "WRITE channel %d: csrc=%08x, cdst=%08x, "
+ "cctl=%08x, clli=%08x, ccfg=%08x\n",
+ ch->id,
+ ch->csrc,
+ ch->cdst,
+ ch->cctl,
+ ch->clli,
+ ch->ccfg);
+
+ writel(ch->csrc, ch->base + PL080_CH_SRC_ADDR);
+ writel(ch->cdst, ch->base + PL080_CH_DST_ADDR);
+ writel(ch->clli, ch->base + PL080_CH_LLI);
+ writel(ch->cctl, ch->base + PL080_CH_CONTROL);
+ writel(ch->ccfg, ch->base + PL080_CH_CONFIG);
+}
+
+static inline void pl08x_config_phychan_for_txd(struct pl08x_dma_chan *plchan)
+{
+ struct pl08x_channel_data *cd = plchan->cd;
+ struct pl08x_phy_chan *phychan = plchan->phychan;
+ struct pl08x_txd *txd = plchan->at;
+
+ /* Copy the basic control register calculated at transfer config */
+ phychan->csrc = txd->csrc;
+ phychan->cdst = txd->cdst;
+ phychan->clli = txd->clli;
+ phychan->cctl = txd->cctl;
+
+ /* Assign the signal to the proper control registers */
+ phychan->ccfg = cd->ccfg;
+ phychan->ccfg &= ~PL080_CONFIG_SRC_SEL_MASK;
+ phychan->ccfg &= ~PL080_CONFIG_DST_SEL_MASK;
+ /* If it wasn't set from AMBA, ignore it */
+ if (txd->direction == DMA_TO_DEVICE)
+ /* Select signal as destination */
+ phychan->ccfg |=
+ (phychan->signal << PL080_CONFIG_DST_SEL_SHIFT);
+ else if (txd->direction == DMA_FROM_DEVICE)
+ /* Select signal as source */
+ phychan->ccfg |=
+ (phychan->signal << PL080_CONFIG_SRC_SEL_SHIFT);
+ /* Always enable error interrupts */
+ phychan->ccfg |= PL080_CONFIG_ERR_IRQ_MASK;
+ /* Always enable terminal interrupts */
+ phychan->ccfg |= PL080_CONFIG_TC_IRQ_MASK;
+}
+
+/*
+ * Enable the DMA channel
+ * Assumes all other configuration bits have been set
+ * as desired before this code is called
+ */
+static void pl08x_enable_phy_chan(struct pl08x_driver_data *pl08x,
+ struct pl08x_phy_chan *ch)
+{
+ u32 val;
+
+ /*
+ * Do not access config register until channel shows as disabled
+ */
+ while (readl(pl08x->base + PL080_EN_CHAN) & (1 << ch->id))
+ ;
+
+ /*
+ * Do not access config register until channel shows as inactive
+ */
+ val = readl(ch->base + PL080_CH_CONFIG);
+ while ((val & PL080_CONFIG_ACTIVE) || (val & PL080_CONFIG_ENABLE))
+ val = readl(ch->base + PL080_CH_CONFIG);
+
+ writel(val | PL080_CONFIG_ENABLE, ch->base + PL080_CH_CONFIG);
+}
+
+/*
+ * Overall DMAC remains enabled always.
+ *
+ * Disabling individual channels could lose data.
+ *
+ * Disable the peripheral DMA after disabling the DMAC
+ * in order to allow the DMAC FIFO to drain, and
+ * hence allow the channel to show inactive
+ *
+ */
+static void pl08x_pause_phy_chan(struct pl08x_phy_chan *ch)
+{
+ u32 val;
+
+ /* Set the HALT bit and wait for the FIFO to drain */
+ val = readl(ch->base + PL080_CH_CONFIG);
+ val |= PL080_CONFIG_HALT;
+ writel(val, ch->base + PL080_CH_CONFIG);
+
+ /* Wait for channel inactive */
+ while (pl08x_phy_channel_busy(ch))
+ ;
+}
+
+static void pl08x_resume_phy_chan(struct pl08x_phy_chan *ch)
+{
+ u32 val;
+
+ /* Clear the HALT bit */
+ val = readl(ch->base + PL080_CH_CONFIG);
+ val &= ~PL080_CONFIG_HALT;
+ writel(val, ch->base + PL080_CH_CONFIG);
+}
+
+
+/* Stops the channel */
+static void pl08x_stop_phy_chan(struct pl08x_phy_chan *ch)
+{
+ u32 val;
+
+ pl08x_pause_phy_chan(ch);
+
+ /* Disable channel */
+ val = readl(ch->base + PL080_CH_CONFIG);
+ val &= ~PL080_CONFIG_ENABLE;
+ writel(val, ch->base + PL080_CH_CONFIG);
+}
+
+static inline u32 get_bytes_in_cctl(u32 cctl)
+{
+ /* The source width defines the number of bytes */
+ u32 bytes = cctl & PL080_CONTROL_TRANSFER_SIZE_MASK;
+
+ switch (cctl >> PL080_CONTROL_SWIDTH_SHIFT) {
+ case PL080_WIDTH_8BIT:
+ break;
+ case PL080_WIDTH_16BIT:
+ bytes *= 2;
+ break;
+ case PL080_WIDTH_32BIT:
+ bytes *= 4;
+ break;
+ }
+ return bytes;
+}
+
+/* The channel should be paused when calling this */
+static u32 pl08x_getbytes_chan(struct pl08x_dma_chan *plchan)
+{
+ struct pl08x_phy_chan *ch;
+ struct pl08x_txd *txdi = NULL;
+ struct pl08x_txd *txd;
+ unsigned long flags;
+ u32 bytes = 0;
+
+ spin_lock_irqsave(&plchan->lock, flags);
+
+ ch = plchan->phychan;
+ txd = plchan->at;
+
+ /*
+ * Next follow the LLIs to get the number of pending bytes in the
+ * currently active transaction.
+ */
+ if (ch && txd) {
+ struct lli *llis_va = txd->llis_va;
+ struct lli *llis_bus = (struct lli *) txd->llis_bus;
+ u32 clli = readl(ch->base + PL080_CH_LLI);
+
+ /* First get the bytes in the current active LLI */
+ bytes = get_bytes_in_cctl(readl(ch->base + PL080_CH_CONTROL));
+
+ if (clli) {
+ int i = 0;
+
+ /* Forward to the LLI pointed to by clli */
+ while ((clli != (u32) &(llis_bus[i])) &&
+ (i < MAX_NUM_TSFR_LLIS))
+ i++;
+
+ while (clli) {
+ bytes += get_bytes_in_cctl(llis_va[i].cctl);
+ /*
+ * A clli of 0x00000000 will terminate the
+ * LLI list
+ */
+ clli = llis_va[i].next;
+ i++;
+ }
+ }
+ }
+
+ /* Sum up all queued transactions */
+ if (!list_empty(&plchan->desc_list)) {
+ list_for_each_entry(txdi, &plchan->desc_list, node) {
+ bytes += txdi->len;
+ }
+
+ }
+
+ spin_unlock_irqrestore(&plchan->lock, flags);
+
+ return bytes;
+}
+
+/*
+ * Allocate a physical channel for a virtual channel
+ */
+static struct pl08x_phy_chan *
+pl08x_get_phy_channel(struct pl08x_driver_data *pl08x,
+ struct pl08x_dma_chan *virt_chan)
+{
+ struct pl08x_phy_chan *ch = NULL;
+ unsigned long flags;
+ int i;
+
+ /*
+ * Try to locate a physical channel to be used for
+ * this transfer. If all are taken return NULL and
+ * the requester will have to cope by using some fallback
+ * PIO mode or retrying later.
+ */
+ for (i = 0; i < pl08x->vd->channels; i++) {
+ ch = &pl08x->phy_chans[i];
+
+ spin_lock_irqsave(&ch->lock, flags);
+
+ if (!ch->serving) {
+ ch->serving = virt_chan;
+ ch->signal = -1;
+ spin_unlock_irqrestore(&ch->lock, flags);
+ break;
+ }
+
+ spin_unlock_irqrestore(&ch->lock, flags);
+ }
+
+ if (i == pl08x->vd->channels) {
+ /* No physical channel available, cope with it */
+ return NULL;
+ }
+
+ return ch;
+}
+
+static inline void pl08x_put_phy_channel(struct pl08x_driver_data *pl08x,
+ struct pl08x_phy_chan *ch)
+{
+ unsigned long flags;
+
+ /* Stop the channel and clear its interrupts */
+ pl08x_stop_phy_chan(ch);
+ writel((1 << ch->id), pl08x->base + PL080_ERR_CLEAR);
+ writel((1 << ch->id), pl08x->base + PL080_TC_CLEAR);
+
+ /* Mark it as free */
+ spin_lock_irqsave(&ch->lock, flags);
+ ch->serving = NULL;
+ ch->signal = -1;
+ spin_unlock_irqrestore(&ch->lock, flags);
+}
+
+/*
+ * LLI handling
+ */
+
+static inline unsigned int pl08x_get_bytes_for_cctl(unsigned int coded)
+{
+ switch (coded) {
+ case PL080_WIDTH_8BIT:
+ return 1;
+ case PL080_WIDTH_16BIT:
+ return 2;
+ case PL080_WIDTH_32BIT:
+ return 4;
+ default:
+ break;
+ }
+ BUG();
+ return 0;
+}
+
+static inline u32 pl08x_cctl_bits(u32 cctl, u8 srcwidth, u8 dstwidth,
+ u32 tsize)
+{
+ u32 retbits = cctl;
+
+ /* Remove all src, dst and transfersize bits */
+ retbits &= ~PL080_CONTROL_DWIDTH_MASK;
+ retbits &= ~PL080_CONTROL_SWIDTH_MASK;
+ retbits &= ~PL080_CONTROL_TRANSFER_SIZE_MASK;
+
+ /* Then set the bits according to the parameters */
+ switch (srcwidth) {
+ case 1:
+ retbits |= PL080_WIDTH_8BIT << PL080_CONTROL_SWIDTH_SHIFT;
+ break;
+ case 2:
+ retbits |= PL080_WIDTH_16BIT << PL080_CONTROL_SWIDTH_SHIFT;
+ break;
+ case 4:
+ retbits |= PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT;
+ break;
+ default:
+ BUG();
+ break;
+ }
+
+ switch (dstwidth) {
+ case 1:
+ retbits |= PL080_WIDTH_8BIT << PL080_CONTROL_DWIDTH_SHIFT;
+ break;
+ case 2:
+ retbits |= PL080_WIDTH_16BIT << PL080_CONTROL_DWIDTH_SHIFT;
+ break;
+ case 4:
+ retbits |= PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT;
+ break;
+ default:
+ BUG();
+ break;
+ }
+
+ retbits |= tsize << PL080_CONTROL_TRANSFER_SIZE_SHIFT;
+ return retbits;
+}
+
+/*
+ * Autoselect a master bus to use for the transfer
+ * this prefers the destination bus if both available
+ * if fixed address on one bus the other will be chosen
+ */
+void pl08x_choose_master_bus(struct pl08x_bus_data *src_bus,
+ struct pl08x_bus_data *dst_bus, struct pl08x_bus_data **mbus,
+ struct pl08x_bus_data **sbus, u32 cctl)
+{
+ if (!(cctl & PL080_CONTROL_DST_INCR)) {
+ *mbus = src_bus;
+ *sbus = dst_bus;
+ } else if (!(cctl & PL080_CONTROL_SRC_INCR)) {
+ *mbus = dst_bus;
+ *sbus = src_bus;
+ } else {
+ if (dst_bus->buswidth == 4) {
+ *mbus = dst_bus;
+ *sbus = src_bus;
+ } else if (src_bus->buswidth == 4) {
+ *mbus = src_bus;
+ *sbus = dst_bus;
+ } else if (dst_bus->buswidth == 2) {
+ *mbus = dst_bus;
+ *sbus = src_bus;
+ } else if (src_bus->buswidth == 2) {
+ *mbus = src_bus;
+ *sbus = dst_bus;
+ } else {
+ /* src_bus->buswidth == 1 */
+ *mbus = dst_bus;
+ *sbus = src_bus;
+ }
+ }
+}
+
+/*
+ * Fills in one LLI for a certain transfer descriptor
+ * and advance the counter
+ */
+int pl08x_fill_lli_for_desc(struct pl08x_driver_data *pl08x,
+ struct pl08x_txd *txd, int num_llis, int len,
+ u32 cctl, u32 *remainder)
+{
+ struct lli *llis_va = txd->llis_va;
+ struct lli *llis_bus = (struct lli *) txd->llis_bus;
+
+ BUG_ON(num_llis >= MAX_NUM_TSFR_LLIS);
+
+ llis_va[num_llis].cctl = cctl;
+ llis_va[num_llis].src = txd->srcbus.addr;
+ llis_va[num_llis].dst = txd->dstbus.addr;
+
+ /*
+ * On versions with dual masters, you can optionally AND on
+ * PL080_LLI_LM_AHB2 to the LLI to tell the hardware to read
+ * in new LLIs with that controller, but we always try to
+ * choose AHB1 to point into memory. The idea is to have AHB2
+ * fixed on the peripheral and AHB1 messing around in the
+ * memory. So we don't manipulate this bit currently.
+ */
+
+ llis_va[num_llis].next =
+ (dma_addr_t)((u32) &(llis_bus[num_llis + 1]));
+
+ if (cctl & PL080_CONTROL_SRC_INCR)
+ txd->srcbus.addr += len;
+ if (cctl & PL080_CONTROL_DST_INCR)
+ txd->dstbus.addr += len;
+
+ *remainder -= len;
+
+ return num_llis + 1;
+}
+
+/*
+ * Return number of bytes to fill to boundary, or len
+ */
+static inline u32 pl08x_pre_boundary(u32 addr, u32 len)
+{
+ u32 boundary;
+
+ boundary = ((addr >> PL08X_BOUNDARY_SHIFT) + 1)
+ << PL08X_BOUNDARY_SHIFT;
+
+ if (boundary < addr + len)
+ return boundary - addr;
+ else
+ return len;
+}
+
+/*
+ * This fills in the table of LLIs for the transfer descriptor
+ * Note that we assume we never have to change the burst sizes
+ * Return 0 for error
+ */
+static int pl08x_fill_llis_for_desc(struct pl08x_driver_data *pl08x,
+ struct pl08x_txd *txd)
+{
+ struct pl08x_channel_data *cd = txd->cd;
+ struct pl08x_bus_data *mbus, *sbus;
+ u32 remainder;
+ int num_llis = 0;
+ u32 cctl;
+ int max_bytes_per_lli;
+ int total_bytes = 0;
+ struct lli *llis_va;
+ struct lli *llis_bus;
+
+ if (!txd) {
+ dev_err(&pl08x->adev->dev, "%s no descriptor\n", __func__);
+ return 0;
+ }
+
+ txd->llis_va = dma_pool_alloc(pl08x->pool, GFP_KERNEL,
+ &txd->llis_bus);
+ if (!txd->llis_va) {
+ dev_err(&pl08x->adev->dev, "%s no memory for llis\n", __func__);
+ return 0;
+ }
+
+ pl08x->pool_ctr++;
+
+ /*
+ * Initialize bus values for this transfer
+ * from the passed optimal values
+ */
+ if (!cd) {
+ dev_err(&pl08x->adev->dev, "%s no channel data\n", __func__);
+ return 0;
+ }
+
+ /* Get the default CCTL from the platform data */
+ cctl = cd->cctl;
+
+ /*
+ * On the PL080 we have two bus masters and we
+ * should select one for source and one for
+ * destination. We try to use AHB2 for the
+ * bus which does not increment (typically the
+ * peripheral) else we just choose something.
+ */
+ cctl &= ~(PL080_CONTROL_DST_AHB2 | PL080_CONTROL_SRC_AHB2);
+ if (pl08x->vd->dualmaster) {
+ if (cctl & PL080_CONTROL_SRC_INCR)
+ /* Source increments, use AHB2 for destination */
+ cctl |= PL080_CONTROL_DST_AHB2;
+ else if (cctl & PL080_CONTROL_DST_INCR)
+ /* Destination increments, use AHB2 for source */
+ cctl |= PL080_CONTROL_SRC_AHB2;
+ else
+ /* Just pick something, source AHB1 dest AHB2 */
+ cctl |= PL080_CONTROL_DST_AHB2;
+ }
+
+ /* Find maximum width of the source bus */
+ txd->srcbus.maxwidth =
+ pl08x_get_bytes_for_cctl((cctl & PL080_CONTROL_SWIDTH_MASK) >>
+ PL080_CONTROL_SWIDTH_SHIFT);
+
+ /* Find maximum width of the destination bus */
+ txd->dstbus.maxwidth =
+ pl08x_get_bytes_for_cctl((cctl & PL080_CONTROL_DWIDTH_MASK) >>
+ PL080_CONTROL_DWIDTH_SHIFT);
+
+ /* Set up the bus widths to the maximum */
+ txd->srcbus.buswidth = txd->srcbus.maxwidth;
+ txd->dstbus.buswidth = txd->dstbus.maxwidth;
+ dev_vdbg(&pl08x->adev->dev,
+ "%s source bus is %d bytes wide, dest bus is %d bytes wide\n",
+ __func__, txd->srcbus.buswidth, txd->dstbus.buswidth);
+
+
+ /*
+ * Bytes transferred == tsize * MIN(buswidths), not max(buswidths)
+ */
+ max_bytes_per_lli = min(txd->srcbus.buswidth, txd->dstbus.buswidth) *
+ PL080_CONTROL_TRANSFER_SIZE_MASK;
+ dev_vdbg(&pl08x->adev->dev,
+ "%s max bytes per lli = %d\n",
+ __func__, max_bytes_per_lli);
+
+ /* We need to count this down to zero */
+ remainder = txd->len;
+ dev_vdbg(&pl08x->adev->dev,
+ "%s remainder = %d\n",
+ __func__, remainder);
+
+ /*
+ * Choose bus to align to
+ * - prefers destination bus if both available
+ * - if fixed address on one bus chooses other
+ * - modifies cctl to choose an apropriate master
+ */
+ pl08x_choose_master_bus(&txd->srcbus, &txd->dstbus,
+ &mbus, &sbus, cctl);
+
+
+ /*
+ * The lowest bit of the LLI register
+ * is also used to indicate which master to
+ * use for reading the LLIs.
+ */
+
+ if (txd->len < mbus->buswidth) {
+ /*
+ * Less than a bus width available
+ * - send as single bytes
+ */
+ while (remainder) {
+ dev_vdbg(&pl08x->adev->dev,
+ "%s single byte LLIs for a transfer of "
+ "less than a bus width (remain %08x)\n",
+ __func__, remainder);
+ cctl = pl08x_cctl_bits(cctl, 1, 1, 1);
+ num_llis =
+ pl08x_fill_lli_for_desc(pl08x, txd, num_llis, 1,
+ cctl, &remainder);
+ total_bytes++;
+ }
+ } else {
+ /*
+ * Make one byte LLIs until master bus is aligned
+ * - slave will then be aligned also
+ */
+ while ((mbus->addr) % (mbus->buswidth)) {
+ dev_vdbg(&pl08x->adev->dev,
+ "%s adjustment lli for less than bus width "
+ "(remain %08x)\n",
+ __func__, remainder);
+ cctl = pl08x_cctl_bits(cctl, 1, 1, 1);
+ num_llis = pl08x_fill_lli_for_desc
+ (pl08x, txd, num_llis, 1, cctl, &remainder);
+ total_bytes++;
+ }
+
+ /*
+ * Master now aligned
+ * - if slave is not then we must set its width down
+ */
+ if (sbus->addr % sbus->buswidth) {
+ dev_dbg(&pl08x->adev->dev,
+ "%s set down bus width to one byte\n",
+ __func__);
+
+ sbus->buswidth = 1;
+ }
+
+ /*
+ * Make largest possible LLIs until less than one bus
+ * width left
+ */
+ while (remainder > (mbus->buswidth - 1)) {
+ int lli_len, target_len;
+ int tsize;
+ int odd_bytes;
+
+ /*
+ * If enough left try to send max possible,
+ * otherwise try to send the remainder
+ */
+ target_len = remainder;
+ if (remainder > max_bytes_per_lli)
+ target_len = max_bytes_per_lli;
+
+ /*
+ * Set bus lengths for incrementing busses
+ * to number of bytes which fill to next memory
+ * boundary
+ */
+ if (cctl & PL080_CONTROL_SRC_INCR)
+ txd->srcbus.fill_bytes =
+ pl08x_pre_boundary(
+ txd->srcbus.addr,
+ remainder);
+ else
+ txd->srcbus.fill_bytes =
+ max_bytes_per_lli;
+
+ if (cctl & PL080_CONTROL_DST_INCR)
+ txd->dstbus.fill_bytes =
+ pl08x_pre_boundary(
+ txd->dstbus.addr,
+ remainder);
+ else
+ txd->dstbus.fill_bytes =
+ max_bytes_per_lli;
+
+ /*
+ * Find the nearest
+ */
+ lli_len = min(txd->srcbus.fill_bytes,
+ txd->dstbus.fill_bytes);
+
+ BUG_ON(lli_len > remainder);
+
+ if (lli_len <= 0) {
+ dev_err(&pl08x->adev->dev,
+ "%s lli_len is %d, <= 0\n",
+ __func__, lli_len);
+ return 0;
+ }
+
+ if (lli_len == target_len) {
+ /*
+ * Can send what we wanted
+ */
+ /*
+ * Maintain alignment
+ */
+ lli_len = (lli_len/mbus->buswidth) *
+ mbus->buswidth;
+ odd_bytes = 0;
+ } else {
+ /*
+ * So now we know how many bytes to transfer
+ * to get to the nearest boundary
+ * The next lli will past the boundary
+ * - however we may be working to a boundary
+ * on the slave bus
+ * We need to ensure the master stays aligned
+ */
+ odd_bytes = lli_len % mbus->buswidth;
+ /*
+ * - and that we are working in multiples
+ * of the bus widths
+ */
+ lli_len -= odd_bytes;
+
+ }
+
+ if (lli_len) {
+ /*
+ * Check against minimum bus alignment:
+ * Calculate actual transfer size in relation
+ * to bus width an get a maximum remainder of
+ * the smallest bus width - 1
+ */
+ /* FIXME: use round_down()? */
+ tsize = lli_len / min(mbus->buswidth,
+ sbus->buswidth);
+ lli_len = tsize * min(mbus->buswidth,
+ sbus->buswidth);
+
+ if (target_len != lli_len) {
+ dev_vdbg(&pl08x->adev->dev,
+ "%s can't send what we want. Desired %08x, lli of %08x bytes in txd of %08x\n",
+ __func__, target_len, lli_len, txd->len);
+ }
+
+ cctl = pl08x_cctl_bits(cctl,
+ txd->srcbus.buswidth,
+ txd->dstbus.buswidth,
+ tsize);
+
+ dev_vdbg(&pl08x->adev->dev,
+ "%s fill lli with single lli chunk of size %08x (remainder %08x)\n",
+ __func__, lli_len, remainder);
+ num_llis = pl08x_fill_lli_for_desc(pl08x, txd,
+ num_llis, lli_len, cctl,
+ &remainder);
+ total_bytes += lli_len;
+ }
+
+
+ if (odd_bytes) {
+ /*
+ * Creep past the boundary,
+ * maintaining master alignment
+ */
+ int j;
+ for (j = 0; (j < mbus->buswidth)
+ && (remainder); j++) {
+ cctl = pl08x_cctl_bits(cctl, 1, 1, 1);
+ dev_vdbg(&pl08x->adev->dev,
+ "%s align with boundardy, single byte (remain %08x)\n",
+ __func__, remainder);
+ num_llis =
+ pl08x_fill_lli_for_desc(pl08x,
+ txd, num_llis, 1,
+ cctl, &remainder);
+ total_bytes++;
+ }
+ }
+ }
+
+ /*
+ * Send any odd bytes
+ */
+ if (remainder < 0) {
+ dev_err(&pl08x->adev->dev, "%s remainder not fitted 0x%08x bytes\n",
+ __func__, remainder);
+ return 0;
+ }
+
+ while (remainder) {
+ cctl = pl08x_cctl_bits(cctl, 1, 1, 1);
+ dev_vdbg(&pl08x->adev->dev,
+ "%s align with boundardy, single odd byte (remain %d)\n",
+ __func__, remainder);
+ num_llis = pl08x_fill_lli_for_desc(pl08x, txd, num_llis,
+ 1, cctl, &remainder);
+ total_bytes++;
+ }
+ }
+ if (total_bytes != txd->len) {
+ dev_err(&pl08x->adev->dev,
+ "%s size of encoded lli:s don't match total txd, transferred 0x%08x from size 0x%08x\n",
+ __func__, total_bytes, txd->len);
+ return 0;
+ }
+
+ if (num_llis >= MAX_NUM_TSFR_LLIS) {
+ dev_err(&pl08x->adev->dev,
+ "%s need to increase MAX_NUM_TSFR_LLIS from 0x%08x\n",
+ __func__, (u32) MAX_NUM_TSFR_LLIS);
+ return 0;
+ }
+ /*
+ * Decide whether this is a loop or a terminated transfer
+ */
+ llis_va = txd->llis_va;
+ llis_bus = (struct lli *) txd->llis_bus;
+
+ if (cd->circular_buffer) {
+ /*
+ * Loop the circular buffer so that the next element
+ * points back to the beginning of the LLI.
+ */
+ llis_va[num_llis - 1].next =
+ (dma_addr_t)((unsigned int)&(llis_bus[0]));
+ } else {
+ /*
+ * On non-circular buffers, the final LLI terminates
+ * the LLI.
+ */
+ llis_va[num_llis - 1].next = 0;
+ /*
+ * The final LLI element shall also fire an interrupt
+ */
+ llis_va[num_llis - 1].cctl |= PL080_CONTROL_TC_IRQ_EN;
+ }
+
+ /* Now store the channel register values */
+ txd->csrc = llis_va[0].src;
+ txd->cdst = llis_va[0].dst;
+ if (num_llis > 1)
+ txd->clli = llis_va[0].next;
+ else
+ txd->clli = 0;
+
+ txd->cctl = llis_va[0].cctl;
+ /* ccfg will be set at physical channel allocation time */
+
+#ifdef VERBOSE_DEBUG
+ {
+ int i;
+
+ for (i = 0; i < num_llis; i++) {
+ dev_vdbg(&pl08x->adev->dev,
+ "lli %d @%p: csrc=%08x, cdst=%08x, cctl=%08x, clli=%08x\n",
+ i,
+ &llis_va[i],
+ llis_va[i].src,
+ llis_va[i].dst,
+ llis_va[i].cctl,
+ llis_va[i].next
+ );
+ }
+ }
+#endif
+
+ return num_llis;
+}
+
+/* You should call this with the struct pl08x lock held */
+static void pl08x_free_txd(struct pl08x_driver_data *pl08x,
+ struct pl08x_txd *txd)
+{
+ if (!txd)
+ dev_err(&pl08x->adev->dev,
+ "%s no descriptor to free\n",
+ __func__);
+
+ /* Free the LLI */
+ dma_pool_free(pl08x->pool, txd->llis_va,
+ txd->llis_bus);
+
+ pl08x->pool_ctr--;
+
+ kfree(txd);
+}
+
+static void pl08x_free_txd_list(struct pl08x_driver_data *pl08x,
+ struct pl08x_dma_chan *plchan)
+{
+ struct pl08x_txd *txdi = NULL;
+ struct pl08x_txd *next;
+
+ if (!list_empty(&plchan->desc_list)) {
+ list_for_each_entry_safe(txdi,
+ next, &plchan->desc_list, node) {
+ list_del(&txdi->node);
+ pl08x_free_txd(pl08x, txdi);
+ }
+
+ }
+}
+
+static void pl08x_tasklet(unsigned long data)
+{
+ struct pl08x_dma_chan *plchan = (struct pl08x_dma_chan *) data;
+ struct pl08x_phy_chan *phychan = plchan->phychan;
+ struct pl08x_driver_data *pl08x = plchan->host;
+ unsigned long flags;
+
+ if (!plchan)
+ BUG();
+
+ spin_lock_irqsave(&plchan->lock, flags);
+
+ if (plchan->at) {
+ dma_async_tx_callback callback =
+ plchan->at->tx.callback;
+ void *callback_param =
+ plchan->at->tx.callback_param;
+
+ /*
+ * Update last completed
+ */
+ plchan->lc =
+ (plchan->at->tx.cookie);
+
+ /*
+ * Callback to signal completion
+ */
+ if (callback)
+ callback(callback_param);
+
+ /*
+ * Device callbacks should NOT clear
+ * the current transaction on the channel
+ * Linus: sometimes they should?
+ */
+ if (!plchan->at)
+ BUG();
+
+ /*
+ * Free the descriptor if it's not for a device
+ * using a circular buffer
+ */
+ if (!plchan->at->cd->circular_buffer) {
+ pl08x_free_txd(pl08x, plchan->at);
+ plchan->at = NULL;
+ }
+ /*
+ * else descriptor for circular
+ * buffers only freed when
+ * client has disabled dma
+ */
+ }
+ /*
+ * If a new descriptor is queued, set it up
+ * plchan->at is NULL here
+ */
+ if (!list_empty(&plchan->desc_list)) {
+ struct pl08x_txd *next;
+
+ next = list_first_entry(&plchan->desc_list,
+ struct pl08x_txd,
+ node);
+ list_del(&next->node);
+ plchan->at = next;
+ /* Configure the physical channel for the next txd */
+ pl08x_config_phychan_for_txd(plchan);
+ pl08x_set_cregs(pl08x, plchan->phychan);
+ pl08x_enable_phy_chan(pl08x, plchan->phychan);
+ } else {
+ /*
+ * No more jobs, so free up the physical channel
+ * Free any allocated signal on slave transfers too
+ */
+ if ((phychan->signal >= 0) && pl08x->pd->put_signal)
+ pl08x->pd->put_signal(plchan);
+ pl08x_put_phy_channel(pl08x, phychan);
+ plchan->phychan = NULL;
+ }
+
+ spin_unlock_irqrestore(&plchan->lock, flags);
+}
+
+static irqreturn_t pl08x_irq(int irq, void *dev)
+{
+ struct pl08x_driver_data *pl08x = dev;
+ u32 mask = 0;
+ u32 val;
+ int i;
+
+ val = readl(pl08x->base + PL080_ERR_STATUS);
+ if (val) {
+ /*
+ * An error interrupt (on one or more channels)
+ */
+ dev_err(&pl08x->adev->dev,
+ "%s error interrupt, register value 0x%08x\n",
+ __func__, val);
+ /*
+ * Simply clear ALL PL08X error interrupts,
+ * regardless of channel and cause
+ * FIXME: should be 0x00000003 on PL081 really.
+ */
+ writel(0x000000FF, pl08x->base + PL080_ERR_CLEAR);
+ }
+ val = readl(pl08x->base + PL080_INT_STATUS);
+ for (i = 0; i < pl08x->vd->channels; i++) {
+ if ((1 << i) & val) {
+ /* Locate physical channel */
+ struct pl08x_phy_chan *phychan = &pl08x->phy_chans[i];
+ struct pl08x_dma_chan *plchan = phychan->serving;
+
+ /* Schedule tasklet on this channel */
+ tasklet_schedule(&plchan->tasklet);
+
+ mask |= (1 << i);
+ }
+ }
+ /*
+ * Clear only the terminal interrupts on channels we processed
+ */
+ writel(mask, pl08x->base + PL080_TC_CLEAR);
+
+ return mask ? IRQ_HANDLED : IRQ_NONE;
+}
+
+
+/*
+ * The DMA ENGINE API
+ */
+static int pl08x_alloc_chan_resources(struct dma_chan *chan)
+{
+ return 0;
+}
+
+static void pl08x_free_chan_resources(struct dma_chan *chan)
+{
+}
+
+/*
+ * This should be called with the channel plchan->lock held
+ */
+static int prep_phy_channel(struct pl08x_dma_chan *plchan,
+ struct pl08x_txd *txd)
+{
+ struct pl08x_driver_data *pl08x = plchan->host;
+ struct pl08x_phy_chan *ch;
+ int ret;
+
+ /* Check if we already have a channel */
+ if (plchan->phychan)
+ return 0;
+
+ ch = pl08x_get_phy_channel(pl08x, plchan);
+ if (!ch) {
+ /* No physical channel available, cope with it */
+ dev_dbg(&pl08x->adev->dev, "no physical channel available for xfer on %s\n", plchan->name);
+ return -EBUSY;
+ }
+
+ /*
+ * OK we have a physical channel: for memcpy() this is all we
+ * need, but for slaves the physical siglals may be muxed!
+ * Can the platform allow us to use this channel?
+ */
+ if ((txd->direction == DMA_FROM_DEVICE ||
+ txd->direction == DMA_TO_DEVICE) &&
+ pl08x->pd->get_signal) {
+ ret = pl08x->pd->get_signal(plchan);
+ if (ret < 0) {
+ dev_dbg(&pl08x->adev->dev,
+ "unable to use physical channel %d for transfer on %s due to platform restrictions\n",
+ ch->id, plchan->name);
+ /* Release physical channel & return */
+ pl08x_put_phy_channel(pl08x, ch);
+ return -EBUSY;
+ }
+ ch->signal = ret;
+ }
+
+ dev_dbg(&pl08x->adev->dev, "allocated physical channel %d and signal %d for xfer on %s\n",
+ ch->id,
+ ch->signal,
+ plchan->name);
+
+ plchan->phychan = ch;
+
+ return 0;
+}
+
+/*
+ * First make the LLIs (could/should we do this earlier??)
+ * slave (m/p) - no queued transactions allowed at present
+ * TODO allow queued transactions for non circular buffers
+ * Set up the channel active txd as inactive
+ * m2m - transactions may be queued
+ * If no active txd on channel
+ * set it up as inactive
+ * - issue_pending() will set active & start
+ * else
+ * queue it
+ * Lock channel since there may be (at least for m2m) multiple calls
+ *
+ * Return < 0 for error
+ */
+
+static dma_cookie_t pl08x_tx_submit(struct dma_async_tx_descriptor *tx)
+{
+ int num_llis;
+ unsigned long flags;
+ struct pl08x_txd *txd = container_of(tx, struct pl08x_txd, tx);
+ struct pl08x_dma_chan *plchan = to_pl08x_chan(tx->chan);
+ struct pl08x_driver_data *pl08x = plchan->host;
+ int ret;
+
+ num_llis = pl08x_fill_llis_for_desc(pl08x, txd);
+
+ if (!num_llis)
+ return -EINVAL;
+
+ spin_lock_irqsave(&plchan->lock, flags);
+
+ atomic_inc(&plchan->last_issued);
+ tx->cookie = atomic_read(&plchan->last_issued);
+
+ /*
+ * If this device is not using a circular buffer then
+ * queue this new descriptor for transfer.
+ * The descriptor for a circular buffer continues
+ * to be used until the channel is freed.
+ */
+ if (txd->cd->circular_buffer)
+ dev_err(&pl08x->adev->dev,
+ "%s attempting to queue a circular buffer\n",
+ __func__);
+ else
+ list_add_tail(&txd->node,
+ &plchan->desc_list);
+
+ /*
+ * See if we already have a physical channel allocated,
+ * else this is the time to try to get one.
+ */
+ ret = prep_phy_channel(plchan, txd);
+ if (ret) {
+ /* No physical channel available, cope with it */
+ spin_unlock_irqrestore(&plchan->lock, flags);
+ return -EBUSY;
+ }
+
+ spin_unlock_irqrestore(&plchan->lock, flags);
+
+ return tx->cookie;
+}
+
+static struct dma_async_tx_descriptor *pl08x_prep_dma_interrupt(
+ struct dma_chan *chan, unsigned long flags)
+{
+ struct dma_async_tx_descriptor *retval = NULL;
+
+ return retval;
+}
+
+/*
+ * Code accessing dma_async_is_complete() in a tight loop
+ * may give problems - could schedule where indicated.
+ * If slaves are relying on interrupts to signal completion this
+ * function must not be called with interrupts disabled
+ */
+static enum dma_status
+pl08x_dma_tx_status(struct dma_chan *chan,
+ dma_cookie_t cookie,
+ struct dma_tx_state *txstate)
+{
+ struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
+ dma_cookie_t last_used;
+ dma_cookie_t last_complete;
+ enum dma_status ret;
+ u32 bytesleft = 0;
+
+ last_used = atomic_read(&plchan->last_issued);
+ last_complete = plchan->lc;
+
+ ret = dma_async_is_complete(cookie, last_complete, last_used);
+ if (ret == DMA_SUCCESS) {
+ dma_set_tx_state(txstate, last_complete, last_used, 0);
+ return ret;
+ }
+
+ /*
+ * schedule(); could be inserted here
+ */
+
+ /*
+ * This cookie not complete yet
+ */
+ last_used = atomic_read(&plchan->last_issued);
+ last_complete = plchan->lc;
+
+ /* Get number of bytes left in the active transactions and queue */
+ bytesleft = pl08x_getbytes_chan(plchan);
+
+ dma_set_tx_state(txstate, last_complete, last_used,
+ bytesleft);
+
+ if (plchan->paused)
+ return DMA_PAUSED;
+
+ return DMA_IN_PROGRESS;
+}
+
+/* PrimeCell DMA extension */
+struct burst_table {
+ int burstwords;
+ u32 reg;
+};
+
+static const struct burst_table burst_sizes[] = {
+ {
+ .burstwords = 256,
+ .reg = (PL080_BSIZE_256 << PL080_CONTROL_SB_SIZE_SHIFT) |
+ (PL080_BSIZE_256 << PL080_CONTROL_DB_SIZE_SHIFT),
+ },
+ {
+ .burstwords = 128,
+ .reg = (PL080_BSIZE_128 << PL080_CONTROL_SB_SIZE_SHIFT) |
+ (PL080_BSIZE_128 << PL080_CONTROL_DB_SIZE_SHIFT),
+ },
+ {
+ .burstwords = 64,
+ .reg = (PL080_BSIZE_64 << PL080_CONTROL_SB_SIZE_SHIFT) |
+ (PL080_BSIZE_64 << PL080_CONTROL_DB_SIZE_SHIFT),
+ },
+ {
+ .burstwords = 32,
+ .reg = (PL080_BSIZE_32 << PL080_CONTROL_SB_SIZE_SHIFT) |
+ (PL080_BSIZE_32 << PL080_CONTROL_DB_SIZE_SHIFT),
+ },
+ {
+ .burstwords = 16,
+ .reg = (PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT) |
+ (PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT),
+ },
+ {
+ .burstwords = 8,
+ .reg = (PL080_BSIZE_8 << PL080_CONTROL_SB_SIZE_SHIFT) |
+ (PL080_BSIZE_8 << PL080_CONTROL_DB_SIZE_SHIFT),
+ },
+ {
+ .burstwords = 4,
+ .reg = (PL080_BSIZE_4 << PL080_CONTROL_SB_SIZE_SHIFT) |
+ (PL080_BSIZE_4 << PL080_CONTROL_DB_SIZE_SHIFT),
+ },
+ {
+ .burstwords = 1,
+ .reg = (PL080_BSIZE_1 << PL080_CONTROL_SB_SIZE_SHIFT) |
+ (PL080_BSIZE_1 << PL080_CONTROL_DB_SIZE_SHIFT),
+ },
+};
+
+static void dma_set_runtime_config(struct dma_chan *chan,
+ struct dma_slave_config *config)
+{
+ struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
+ struct pl08x_driver_data *pl08x = plchan->host;
+ struct pl08x_channel_data *cd = plchan->cd;
+ enum dma_slave_buswidth addr_width;
+ u32 maxburst;
+ u32 cctl = 0;
+ /* Mask out all except src and dst channel */
+ u32 ccfg = cd->ccfg & 0x000003DEU;
+ int i = 0;
+
+ /* Transfer direction */
+ plchan->runtime_direction = config->direction;
+ if (config->direction == DMA_TO_DEVICE) {
+ plchan->runtime_addr = config->dst_addr;
+ cctl |= PL080_CONTROL_SRC_INCR;
+ ccfg |= PL080_FLOW_MEM2PER << PL080_CONFIG_FLOW_CONTROL_SHIFT;
+ addr_width = config->dst_addr_width;
+ maxburst = config->dst_maxburst;
+ } else if (config->direction == DMA_FROM_DEVICE) {
+ plchan->runtime_addr = config->src_addr;
+ cctl |= PL080_CONTROL_DST_INCR;
+ ccfg |= PL080_FLOW_PER2MEM << PL080_CONFIG_FLOW_CONTROL_SHIFT;
+ addr_width = config->src_addr_width;
+ maxburst = config->src_maxburst;
+ } else {
+ dev_err(&pl08x->adev->dev,
+ "bad runtime_config: alien transfer direction\n");
+ return;
+ }
+
+ switch (addr_width) {
+ case DMA_SLAVE_BUSWIDTH_1_BYTE:
+ cctl |= (PL080_WIDTH_8BIT << PL080_CONTROL_SWIDTH_SHIFT) |
+ (PL080_WIDTH_8BIT << PL080_CONTROL_DWIDTH_SHIFT);
+ break;
+ case DMA_SLAVE_BUSWIDTH_2_BYTES:
+ cctl |= (PL080_WIDTH_16BIT << PL080_CONTROL_SWIDTH_SHIFT) |
+ (PL080_WIDTH_16BIT << PL080_CONTROL_DWIDTH_SHIFT);
+ break;
+ case DMA_SLAVE_BUSWIDTH_4_BYTES:
+ cctl |= (PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT) |
+ (PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT);
+ break;
+ default:
+ dev_err(&pl08x->adev->dev,
+ "bad runtime_config: alien address width\n");
+ return;
+ }
+
+ /*
+ * Now decide on a maxburst:
+ * If this channel will only request single transfers, set
+ * this down to ONE element.
+ */
+ if (plchan->cd->single) {
+ cctl |= (PL080_BSIZE_1 << PL080_CONTROL_SB_SIZE_SHIFT) |
+ (PL080_BSIZE_1 << PL080_CONTROL_DB_SIZE_SHIFT);
+ } else {
+ while (i < ARRAY_SIZE(burst_sizes)) {
+ if (burst_sizes[i].burstwords <= maxburst)
+ break;
+ i++;
+ }
+ cctl |= burst_sizes[i].reg;
+ }
+
+ /* Access the cell in privileged mode, non-bufferable, non-cacheable */
+ cctl &= ~PL080_CONTROL_PROT_MASK;
+ cctl |= PL080_CONTROL_PROT_SYS;
+
+ /* Modify the default channel data to fit PrimeCell request */
+ cd->cctl = cctl;
+ cd->ccfg = ccfg;
+
+ dev_dbg(&pl08x->adev->dev,
+ "configured channel %s (%s) for %s, data width %d, "
+ "maxburst %d words, LE, CCTL=%08x, CCFG=%08x\n",
+ dma_chan_name(chan), plchan->name,
+ (config->direction == DMA_FROM_DEVICE) ? "RX" : "TX",
+ addr_width,
+ maxburst,
+ cctl, ccfg);
+}
+
+/*
+ * Slave transactions callback to the slave device to allow
+ * synchronization of slave DMA signals with the DMAC enable
+ */
+static void pl08x_issue_pending(struct dma_chan *chan)
+{
+ struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
+ struct pl08x_driver_data *pl08x = plchan->host;
+ unsigned long flags;
+
+
+ spin_lock_irqsave(&plchan->lock, flags);
+ /* Something is already active */
+ if (plchan->at) {
+ spin_unlock_irqrestore(&plchan->lock, flags);
+ return;
+ }
+
+ /* Take the first element in the queue and execute it */
+ if (!list_empty(&plchan->desc_list)) {
+ struct pl08x_txd *next;
+
+ next = list_first_entry(&plchan->desc_list,
+ struct pl08x_txd,
+ node);
+ list_del(&next->node);
+ plchan->at = next;
+
+ /* Configure the physical channel for the active txd */
+ pl08x_config_phychan_for_txd(plchan);
+ pl08x_set_cregs(pl08x, plchan->phychan);
+ pl08x_enable_phy_chan(pl08x, plchan->phychan);
+ }
+
+ spin_unlock_irqrestore(&plchan->lock, flags);
+}
+
+/*
+ * Initialize a descriptor to be used by memcpy submit
+ */
+static struct dma_async_tx_descriptor *pl08x_prep_dma_memcpy(
+ struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
+ size_t len, unsigned long flags)
+{
+ struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
+ struct pl08x_driver_data *pl08x = plchan->host;
+ struct pl08x_txd *txd;
+
+ txd = kzalloc(sizeof(struct pl08x_txd), GFP_KERNEL);
+ if (!txd) {
+ dev_err(&pl08x->adev->dev,
+ "%s no memory for descriptor\n", __func__);
+ return NULL;
+ }
+
+ dma_async_tx_descriptor_init(&txd->tx, chan);
+ txd->direction = DMA_NONE;
+ txd->srcbus.addr = src;
+ txd->dstbus.addr = dest;
+
+ /* Set platform data for m2m */
+ txd->cd = &pl08x->pd->memcpy_channel;
+ /* Both to be incremented or the code will break */
+ txd->cd->cctl |= PL080_CONTROL_SRC_INCR | PL080_CONTROL_DST_INCR;
+ txd->tx.tx_submit = pl08x_tx_submit;
+ txd->tx.callback = NULL;
+ txd->tx.callback_param = NULL;
+ txd->len = len;
+
+ INIT_LIST_HEAD(&txd->node);
+
+ return &txd->tx;
+}
+
+struct dma_async_tx_descriptor *pl08x_prep_slave_sg(
+ struct dma_chan *chan, struct scatterlist *sgl,
+ unsigned int sg_len, enum dma_data_direction direction,
+ unsigned long flags)
+{
+ struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
+ struct pl08x_driver_data *pl08x = plchan->host;
+ struct pl08x_txd *txd;
+
+ /*
+ * Current implementation ASSUMES only one sg
+ */
+ if (sg_len != 1) {
+ dev_err(&pl08x->adev->dev, "%s prepared too long sglist\n",
+ __func__);
+ BUG();
+ }
+
+ dev_dbg(&pl08x->adev->dev, "%s prepare transaction of %d bytes from %s\n",
+ __func__, sgl->length, plchan->name);
+
+ txd = kzalloc(sizeof(struct pl08x_txd), GFP_KERNEL);
+ if (!txd) {
+ dev_err(&pl08x->adev->dev, "%s no txd\n", __func__);
+ return NULL;
+ }
+
+ dma_async_tx_descriptor_init(&txd->tx, chan);
+
+ if (direction != plchan->runtime_direction)
+ dev_err(&pl08x->adev->dev, "%s DMA setup does not match "
+ "the direction configured for the PrimeCell\n",
+ __func__);
+
+ /*
+ * Set up addresses, the PrimeCell configured address
+ * will take precedence since this may configure the
+ * channel target address dynamically at runtime.
+ */
+ txd->direction = direction;
+ if (direction == DMA_TO_DEVICE) {
+ txd->srcbus.addr = sgl->dma_address;
+ if (plchan->runtime_addr)
+ txd->dstbus.addr = plchan->runtime_addr;
+ else
+ txd->dstbus.addr = plchan->cd->addr;
+ } else if (direction == DMA_FROM_DEVICE) {
+ if (plchan->runtime_addr)
+ txd->srcbus.addr = plchan->runtime_addr;
+ else
+ txd->srcbus.addr = plchan->cd->addr;
+ txd->dstbus.addr = sgl->dma_address;
+ } else {
+ dev_err(&pl08x->adev->dev,
+ "%s direction unsupported\n", __func__);
+ return NULL;
+ }
+ txd->cd = plchan->cd;
+ txd->tx.tx_submit = pl08x_tx_submit;
+ txd->tx.callback = NULL;
+ txd->tx.callback_param = NULL;
+ txd->len = sgl->length;
+ INIT_LIST_HEAD(&txd->node);
+
+ return &txd->tx;
+}
+
+static int pl08x_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
+ unsigned long arg)
+{
+ struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
+ struct pl08x_driver_data *pl08x = plchan->host;
+ unsigned long flags;
+ int ret = 0;
+
+ /* Controls applicable to inactive channels */
+ if (cmd == DMA_SLAVE_CONFIG) {
+ dma_set_runtime_config(chan,
+ (struct dma_slave_config *)
+ arg);
+ return 0;
+ }
+
+ /*
+ * Anything succeeds on channels with no physical allocation and
+ * no queued transfers.
+ */
+ spin_lock_irqsave(&plchan->lock, flags);
+ if (!plchan->phychan && !plchan->at) {
+ spin_unlock_irqrestore(&plchan->lock, flags);
+ return 0;
+ }
+
+ switch (cmd) {
+ case DMA_TERMINATE_ALL:
+ plchan->paused = false;
+
+ if (plchan->phychan) {
+ pl08x_stop_phy_chan(plchan->phychan);
+
+ /*
+ * Mark physical channel as free and free any slave
+ * signal
+ */
+ if ((plchan->phychan->signal >= 0) &&
+ pl08x->pd->put_signal)
+ pl08x->pd->put_signal(plchan);
+ pl08x_put_phy_channel(pl08x, plchan->phychan);
+ plchan->phychan = NULL;
+ }
+
+ /* Dequeue jobs and free LLIs */
+ if (plchan->at) {
+ pl08x_free_txd(pl08x, plchan->at);
+ pl08x_free_txd_list(pl08x, plchan);
+ plchan->at = NULL;
+ }
+ break;
+ case DMA_PAUSE:
+ pl08x_pause_phy_chan(plchan->phychan);
+ plchan->paused = true;
+ break;
+ case DMA_RESUME:
+ pl08x_resume_phy_chan(plchan->phychan);
+ plchan->paused = false;
+ break;
+ default:
+ /* Unknown command */
+ ret = -ENXIO;
+ break;
+ }
+
+ spin_unlock_irqrestore(&plchan->lock, flags);
+
+ return ret;
+}
+
+bool pl08x_filter_id(struct dma_chan *chan, void *chan_id)
+{
+ struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
+ char *name = chan_id;
+
+ /* Check that the channel is not taken! */
+ if (!strcmp(plchan->name, name))
+ return true;
+
+ return false;
+}
+
+static struct dma_device dmac_memcpy = {
+ .device_alloc_chan_resources = pl08x_alloc_chan_resources,
+ .device_free_chan_resources = pl08x_free_chan_resources,
+ .device_prep_dma_memcpy = pl08x_prep_dma_memcpy,
+ .device_prep_dma_xor = NULL,
+ .device_prep_dma_memset = NULL,
+ .device_prep_dma_interrupt = pl08x_prep_dma_interrupt,
+ .device_tx_status = pl08x_dma_tx_status,
+ .device_issue_pending = pl08x_issue_pending,
+ .device_control = pl08x_control,
+ /*
+ * Align to 4-byte boundary
+ * This makes the DMAtests fail with grace on PB1176
+ * broken DMA hardware instead of locking everything
+ * up.
+ */
+ /* .copy_align = 2, */
+};
+
+static struct dma_device dmac_slave = {
+ .device_alloc_chan_resources = pl08x_alloc_chan_resources,
+ .device_free_chan_resources = pl08x_free_chan_resources,
+ .device_prep_dma_xor = NULL,
+ .device_prep_dma_memset = NULL,
+ .device_prep_dma_interrupt = pl08x_prep_dma_interrupt,
+ .device_tx_status = pl08x_dma_tx_status,
+ .device_issue_pending = pl08x_issue_pending,
+ .device_prep_slave_sg = pl08x_prep_slave_sg,
+ .device_control = pl08x_control,
+};
+
+
+/*
+ * Just check that the device is there and active
+ * TODO: turn this bit on/off depending on the number of
+ * physical channels actually used, if it is zero... well
+ * shut it off. That will save some power. Cut the clock
+ * at the same time.
+ */
+static void pl08x_ensure_on(struct pl08x_driver_data *pl08x)
+{
+ u32 val;
+
+ val = readl(pl08x->base + PL080_CONFIG);
+ val &= ~(PL080_CONFIG_M2_BE | PL080_CONFIG_M1_BE | PL080_CONFIG_ENABLE);
+ /* We implictly clear bit 1 and that means little-endian mode */
+ val |= PL080_CONFIG_ENABLE;
+ writel(val, pl08x->base + PL080_CONFIG);
+}
+
+/*
+ * Initialise the DMAC memcpy/slave channels.
+ * Make a local wrapper to hold required data
+ */
+static int pl08x_dma_init_virtual_channels(struct pl08x_driver_data *pl08x,
+ struct dma_device *dmadev,
+ unsigned int channels,
+ bool slave)
+{
+ struct pl08x_dma_chan *chan;
+ int i;
+
+ INIT_LIST_HEAD(&dmadev->channels);
+ /*
+ * Register as many many memcpy as we have physical channels,
+ * we won't always be able to use all but the code will have
+ * to cope with that situation.
+ */
+ for (i = 0; i < channels; i++) {
+ chan = kzalloc(sizeof(struct pl08x_dma_chan), GFP_KERNEL);
+ if (!chan) {
+ dev_err(&pl08x->adev->dev,
+ "%s no memory for channel\n", __func__);
+ return -ENOMEM;
+ }
+
+ chan->host = pl08x;
+
+ if (slave) {
+ chan->name = pl08x->pd->slave_channels[i].bus_id;
+ chan->cd = &pl08x->pd->slave_channels[i];
+ } else {
+ chan->cd = &pl08x->pd->memcpy_channel;
+ chan->name = kasprintf(GFP_KERNEL, "memcpy%d", i);
+ if (!chan->name) {
+ kfree(chan);
+ return -ENOMEM;
+ }
+ }
+ dev_info(&pl08x->adev->dev,
+ "initialize virtual channel \"%s\"\n",
+ chan->name);
+
+ chan->chan.device = dmadev;
+ atomic_set(&chan->last_issued, 0);
+ chan->lc = atomic_read(&chan->last_issued);
+
+ spin_lock_init(&chan->lock);
+ INIT_LIST_HEAD(&chan->desc_list);
+ tasklet_init(&chan->tasklet, pl08x_tasklet,
+ (unsigned long) chan);
+
+ list_add_tail(&chan->chan.device_node, &dmadev->channels);
+ }
+ dev_info(&pl08x->adev->dev, "initialized %d virtual %s channels\n",
+ i, slave ? "slave" : "memcpy");
+ return i;
+}
+
+static int pl08x_probe(struct amba_device *adev, struct amba_id *id)
+{
+ struct pl08x_driver_data *pl08x;
+ struct vendor_data *vd = id->data;
+ int ret = 0;
+ int i;
+
+ ret = amba_request_regions(adev, NULL);
+ if (ret)
+ return ret;
+
+ /* Create the driver state holder */
+ pl08x = kzalloc(sizeof(struct pl08x_driver_data), GFP_KERNEL);
+ if (!pl08x) {
+ ret = -ENOMEM;
+ goto out_no_pl08x;
+ }
+
+ /* Assign useful pointers to the driver state */
+ pl08x->adev = adev;
+ pl08x->vd = vd;
+
+ pl08x->clk = clk_get(&adev->dev, NULL);
+ if (IS_ERR(pl08x->clk)) {
+ ret = PTR_ERR(pl08x->clk);
+ if (ret == -ENOENT) {
+ dev_info(&adev->dev, "no clock supplied, assume always on\n");
+ pl08x->clk = NULL;
+ } else
+ goto out_no_clk;
+ }
+ /* Constantly enabled for now, we can control this dynamically */
+ if (pl08x->clk)
+ clk_enable(pl08x->clk);
+
+ /* A DMA memory pool for LLIs, align on 1-byte boundary */
+ pl08x->pool = dma_pool_create(DRIVER_NAME, &pl08x->adev->dev,
+ PL08X_LLI_TSFR_SIZE, PL08X_ALIGN, 0);
+ if (!pl08x->pool) {
+ ret = -ENOMEM;
+ goto out_no_lli_pool;
+ }
+
+ spin_lock_init(&pl08x->lock);
+
+ pl08x->base = ioremap(adev->res.start, resource_size(&adev->res));
+ if (!pl08x->base) {
+ ret = -ENOMEM;
+ goto out_no_ioremap;
+ }
+
+ /* Turn on the PL08x */
+ pl08x_ensure_on(pl08x);
+
+ /*
+ * Attach the interrupt handler
+ */
+ writel(0x000000FF, pl08x->base + PL080_ERR_CLEAR);
+ writel(0x000000FF, pl08x->base + PL080_TC_CLEAR);
+
+ ret = request_irq(adev->irq[0], pl08x_irq, IRQF_DISABLED,
+ vd->name, pl08x);
+ if (ret) {
+ dev_err(&adev->dev, "%s failed to request interrupt %d\n",
+ __func__, adev->irq[0]);
+ goto out_no_irq;
+ }
+
+ /* Initialize physical channels */
+ pl08x->phy_chans = kmalloc((vd->channels * sizeof(struct pl08x_phy_chan)),
+ GFP_KERNEL);
+ if (!pl08x->phy_chans) {
+ dev_err(&adev->dev, "%s failed to allocate "
+ "physical channel holders\n",
+ __func__);
+ goto out_no_phychans;
+ }
+
+ for (i = 0; i < vd->channels; i++) {
+ struct pl08x_phy_chan *ch = &pl08x->phy_chans[i];
+
+ ch->id = i;
+ ch->base = pl08x->base + PL080_Cx_BASE(i);
+ spin_lock_init(&ch->lock);
+ ch->serving = NULL;
+ ch->signal = -1;
+ dev_info(&adev->dev,
+ "physical channel %d is %s\n", i,
+ pl08x_phy_channel_busy(ch) ? "BUSY" : "FREE");
+ }
+
+ /* Get the platform data */
+ pl08x->pd = dev_get_platdata(&adev->dev);
+
+ /* Set caps */
+ dma_cap_set(DMA_MEMCPY, dmac_memcpy.cap_mask);
+ dma_cap_set(DMA_SLAVE, dmac_slave.cap_mask);
+ dmac_memcpy.dev = &adev->dev;
+ dmac_slave.dev = &adev->dev;
+
+ /* Register as many memcpy channels as there are physical channels */
+ ret = pl08x_dma_init_virtual_channels(pl08x, &dmac_memcpy,
+ pl08x->vd->channels, false);
+ if (ret <= 0) {
+ dev_warn(&pl08x->adev->dev,
+ "%s failed to enumerate memcpy channels - %d\n",
+ __func__, ret);
+ goto out_no_memcpy;
+ }
+ dmac_memcpy.chancnt = ret;
+
+ /* Register slave channels */
+ ret = pl08x_dma_init_virtual_channels(pl08x, &dmac_slave,
+ pl08x->pd->num_slave_channels,
+ true);
+ if (ret <= 0) {
+ dev_warn(&pl08x->adev->dev,
+ "%s failed to enumerate slave channels - %d\n",
+ __func__, ret);
+ goto out_no_slave;
+ }
+ dmac_slave.chancnt = ret;
+
+ ret = dma_async_device_register(&dmac_memcpy);
+ if (ret) {
+ dev_warn(&pl08x->adev->dev,
+ "%s failed to register memcpy as an async device - %d\n",
+ __func__, ret);
+ goto out_no_memcpy_reg;
+ }
+
+ ret = dma_async_device_register(&dmac_slave);
+ if (ret) {
+ dev_warn(&pl08x->adev->dev,
+ "%s failed to register slave as an async device - %d\n",
+ __func__, ret);
+ goto out_no_slave_reg;
+ }
+
+ amba_set_drvdata(adev, pl08x);
+ dev_info(&pl08x->adev->dev, "ARM(R) %s DMA block initialized @%08x\n",
+ vd->name, adev->res.start);
+ return 0;
+
+out_no_slave_reg:
+ dma_async_device_unregister(&dmac_memcpy);
+out_no_memcpy_reg:
+ /* FIXME: free slave channels */
+out_no_slave:
+ /* FIXME: free memcpy channels */
+out_no_memcpy:
+ kfree(pl08x->phy_chans);
+out_no_phychans:
+ free_irq(adev->irq[0], pl08x);
+out_no_irq:
+ iounmap(pl08x->base);
+out_no_ioremap:
+ dma_pool_destroy(pl08x->pool);
+out_no_lli_pool:
+ clk_put(pl08x->clk);
+out_no_clk:
+ kfree(pl08x);
+out_no_pl08x:
+ amba_release_regions(adev);
+ return ret;
+}
+
+/* PL080 has 8 channels and the PL080 have just 2 */
+static struct vendor_data vendor_pl080 = {
+ .name = "PL080",
+ .channels = 8,
+ .dualmaster = true,
+};
+
+static struct vendor_data vendor_pl081 = {
+ .name = "PL081",
+ .channels = 2,
+ .dualmaster = false,
+};
+
+static struct amba_id pl08x_ids[] = {
+ /* PL080 */
+ {
+ .id = 0x00041080,
+ .mask = 0x000fffff,
+ .data = &vendor_pl080,
+ },
+ /* PL081 */
+ {
+ .id = 0x00041081,
+ .mask = 0x000fffff,
+ .data = &vendor_pl081,
+ },
+ /* Nomadik 8815 PL080 variant */
+ {
+ .id = 0x00280880,
+ .mask = 0x00ffffff,
+ .data = &vendor_pl080,
+ },
+ { 0, 0 },
+};
+
+static struct amba_driver pl08x_amba_driver = {
+ .drv.name = DRIVER_NAME,
+ .id_table = pl08x_ids,
+ .probe = pl08x_probe,
+};
+
+static int __init pl08x_init(void)
+{
+ int retval;
+ retval = amba_driver_register(&pl08x_amba_driver);
+ if (retval)
+ printk(KERN_WARNING DRIVER_NAME
+ "failed to register as an amba device (%d)\n",
+ retval);
+ return retval;
+}
+subsys_initcall(pl08x_init);
diff --git a/drivers/dma/shdma.c b/drivers/dma/shdma.c
index fb64cf36ba61..eb6b54dbb806 100644
--- a/drivers/dma/shdma.c
+++ b/drivers/dma/shdma.c
@@ -580,7 +580,6 @@ static struct dma_async_tx_descriptor *sh_dmae_prep_slave_sg(
sh_chan = to_sh_chan(chan);
param = chan->private;
- slave_addr = param->config->addr;
/* Someone calling slave DMA on a public channel? */
if (!param || !sg_len) {
@@ -589,6 +588,8 @@ static struct dma_async_tx_descriptor *sh_dmae_prep_slave_sg(
return NULL;
}
+ slave_addr = param->config->addr;
+
/*
* if (param != NULL), this is a successfully requested slave channel,
* therefore param->config != NULL too.
diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c
index da17d409a244..51e8a35ebd7e 100644
--- a/drivers/firewire/net.c
+++ b/drivers/firewire/net.c
@@ -8,7 +8,6 @@
#include <linux/bug.h>
#include <linux/device.h>
-#include <linux/ethtool.h>
#include <linux/firewire.h>
#include <linux/firewire-constants.h>
#include <linux/highmem.h>
@@ -1359,17 +1358,6 @@ static int fwnet_change_mtu(struct net_device *net, int new_mtu)
return 0;
}
-static void fwnet_get_drvinfo(struct net_device *net,
- struct ethtool_drvinfo *info)
-{
- strcpy(info->driver, KBUILD_MODNAME);
- strcpy(info->bus_info, "ieee1394");
-}
-
-static const struct ethtool_ops fwnet_ethtool_ops = {
- .get_drvinfo = fwnet_get_drvinfo,
-};
-
static const struct net_device_ops fwnet_netdev_ops = {
.ndo_open = fwnet_open,
.ndo_stop = fwnet_stop,
@@ -1388,7 +1376,6 @@ static void fwnet_init_dev(struct net_device *net)
net->hard_header_len = FWNET_HLEN;
net->type = ARPHRD_IEEE1394;
net->tx_queue_len = 10;
- SET_ETHTOOL_OPS(net, &fwnet_ethtool_ops);
}
/* caller must hold fwnet_device_mutex */
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index fcc79b5d22d1..6d64a2705f12 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -268,7 +268,7 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
}
r = radeon_ib_schedule(rdev, parser.ib);
if (r) {
- DRM_ERROR("Faild to schedule IB !\n");
+ DRM_ERROR("Failed to schedule IB !\n");
}
radeon_cs_parser_fini(&parser, r);
mutex_unlock(&rdev->cs_mutex);
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 6369ba7f96f8..34402bb5f6a0 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -176,6 +176,12 @@ config HID_KYE
---help---
Support for Kye/Genius Ergo Mouse.
+config HID_UCLOGIC
+ tristate "UC-Logic"
+ depends on USB_HID
+ ---help---
+ Support for UC-Logic tablets.
+
config HID_GYRATION
tristate "Gyration"
depends on USB_HID
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index 46f037f3df80..8c4a5107df77 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -61,6 +61,7 @@ obj-$(CONFIG_HID_GREENASIA) += hid-gaff.o
obj-$(CONFIG_HID_THRUSTMASTER) += hid-tmff.o
obj-$(CONFIG_HID_TOPSEED) += hid-topseed.o
obj-$(CONFIG_HID_TWINHAN) += hid-twinhan.o
+obj-$(CONFIG_HID_UCLOGIC) += hid-uclogic.o
obj-$(CONFIG_HID_ZEROPLUS) += hid-zpff.o
obj-$(CONFIG_HID_ZYDACRON) += hid-zydacron.o
obj-$(CONFIG_HID_WACOM) += hid-wacom.o
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
index bba05d0a8980..eaeca564a8d3 100644
--- a/drivers/hid/hid-apple.c
+++ b/drivers/hid/hid-apple.c
@@ -246,17 +246,18 @@ static int apple_event(struct hid_device *hdev, struct hid_field *field,
/*
* MacBook JIS keyboard has wrong logical maximum
*/
-static void apple_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *apple_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
struct apple_sc *asc = hid_get_drvdata(hdev);
- if ((asc->quirks & APPLE_RDESC_JIS) && rsize >= 60 &&
+ if ((asc->quirks & APPLE_RDESC_JIS) && *rsize >= 60 &&
rdesc[53] == 0x65 && rdesc[59] == 0x65) {
dev_info(&hdev->dev, "fixing up MacBook JIS keyboard report "
"descriptor\n");
rdesc[53] = rdesc[59] = 0xe7;
}
+ return rdesc;
}
static void apple_setup_input(struct input_dev *input)
diff --git a/drivers/hid/hid-cherry.c b/drivers/hid/hid-cherry.c
index 24663a8717b1..e880086c2311 100644
--- a/drivers/hid/hid-cherry.c
+++ b/drivers/hid/hid-cherry.c
@@ -26,15 +26,16 @@
* Cherry Cymotion keyboard have an invalid HID report descriptor,
* that needs fixing before we can parse it.
*/
-static void ch_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *ch_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
- if (rsize >= 17 && rdesc[11] == 0x3c && rdesc[12] == 0x02) {
+ if (*rsize >= 17 && rdesc[11] == 0x3c && rdesc[12] == 0x02) {
dev_info(&hdev->dev, "fixing up Cherry Cymotion report "
"descriptor\n");
rdesc[11] = rdesc[16] = 0xff;
rdesc[12] = rdesc[17] = 0x03;
}
+ return rdesc;
}
#define ch_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index e635199a0cd2..b737a50dbe68 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -651,7 +651,7 @@ int hid_parse_report(struct hid_device *device, __u8 *start,
};
if (device->driver->report_fixup)
- device->driver->report_fixup(device, start, size);
+ start = device->driver->report_fixup(device, start, &size);
device->rdesc = kmemdup(start, size, GFP_KERNEL);
if (device->rdesc == NULL)
@@ -1299,6 +1299,7 @@ static const struct hid_device_id hid_blacklist[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
{ HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) },
{ HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
@@ -1383,6 +1384,9 @@ static const struct hid_device_id hid_blacklist[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) },
{ HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) },
{ HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U) },
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
diff --git a/drivers/hid/hid-cypress.c b/drivers/hid/hid-cypress.c
index 998b6f443d7d..4cd0e2345991 100644
--- a/drivers/hid/hid-cypress.c
+++ b/drivers/hid/hid-cypress.c
@@ -31,16 +31,16 @@
* Some USB barcode readers from cypress have usage min and usage max in
* the wrong order
*/
-static void cp_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
unsigned int i;
if (!(quirks & CP_RDESC_SWAPPED_MIN_MAX))
- return;
+ return rdesc;
- for (i = 0; i < rsize - 4; i++)
+ for (i = 0; i < *rsize - 4; i++)
if (rdesc[i] == 0x29 && rdesc[i + 2] == 0x19) {
__u8 tmp;
@@ -50,6 +50,7 @@ static void cp_report_fixup(struct hid_device *hdev, __u8 *rdesc,
rdesc[i + 3] = rdesc[i + 1];
rdesc[i + 1] = tmp;
}
+ return rdesc;
}
static int cp_input_mapped(struct hid_device *hdev, struct hid_input *hi,
diff --git a/drivers/hid/hid-egalax.c b/drivers/hid/hid-egalax.c
index f44bdc084cb2..8ca7f65cf2f8 100644
--- a/drivers/hid/hid-egalax.c
+++ b/drivers/hid/hid-egalax.c
@@ -159,6 +159,13 @@ static int egalax_event(struct hid_device *hid, struct hid_field *field,
{
struct egalax_data *td = hid_get_drvdata(hid);
+ /* Note, eGalax has two product lines: the first is resistive and
+ * uses a standard parallel multitouch protocol (product ID ==
+ * 48xx). The second is capacitive and uses an unusual "serial"
+ * protocol with a different message for each multitouch finger
+ * (product ID == 72xx). We do not yet generate a correct event
+ * sequence for the capacitive/serial protocol.
+ */
if (hid->claimed & HID_CLAIMED_INPUT) {
struct input_dev *input = field->hidinput->input;
@@ -246,6 +253,8 @@ static void egalax_remove(struct hid_device *hdev)
static const struct hid_device_id egalax_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
+ USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1) },
{ }
};
MODULE_DEVICE_TABLE(hid, egalax_devices);
diff --git a/drivers/hid/hid-elecom.c b/drivers/hid/hid-elecom.c
index 7a40878f46b4..6e31f305397d 100644
--- a/drivers/hid/hid-elecom.c
+++ b/drivers/hid/hid-elecom.c
@@ -20,14 +20,15 @@
#include "hid-ids.h"
-static void elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
- if (rsize >= 48 && rdesc[46] == 0x05 && rdesc[47] == 0x0c) {
+ if (*rsize >= 48 && rdesc[46] == 0x05 && rdesc[47] == 0x0c) {
dev_info(&hdev->dev, "Fixing up Elecom BM084 "
"report descriptor.\n");
rdesc[47] = 0x00;
}
+ return rdesc;
}
static const struct hid_device_id elecom_devices[] = {
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index d3fc13ae094d..720e497795d5 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -188,6 +188,7 @@
#define USB_VENDOR_ID_DWAV 0x0eef
#define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER 0x0001
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH 0x480d
+#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1 0x720c
#define USB_VENDOR_ID_ELECOM 0x056e
#define USB_DEVICE_ID_ELECOM_BM084 0x0061
@@ -506,6 +507,8 @@
#define USB_VENDOR_ID_UCLOGIC 0x5543
#define USB_DEVICE_ID_UCLOGIC_TABLET_PF1209 0x0042
#define USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U 0x0003
+#define USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U 0x0004
+#define USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U 0x0005
#define USB_VENDOR_ID_VERNIER 0x08f7
#define USB_DEVICE_ID_VERNIER_LABPRO 0x0001
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 6c03dcc5760a..0c2908f2dbe3 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -336,6 +336,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
map_key_clear(BTN_STYLUS);
break;
+ case 0x46: /* TabletPick */
+ map_key_clear(BTN_STYLUS2);
+ break;
+
default: goto unknown;
}
break;
diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c
index f8871712b7b5..817247ee006c 100644
--- a/drivers/hid/hid-kye.c
+++ b/drivers/hid/hid-kye.c
@@ -23,10 +23,10 @@
* - report size 8 count 1 must be size 1 count 8 for button bitfield
* - change the button usage range to 4-7 for the extra buttons
*/
-static void kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
- if (rsize >= 74 &&
+ if (*rsize >= 74 &&
rdesc[61] == 0x05 && rdesc[62] == 0x08 &&
rdesc[63] == 0x19 && rdesc[64] == 0x08 &&
rdesc[65] == 0x29 && rdesc[66] == 0x0f &&
@@ -40,6 +40,7 @@ static void kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
rdesc[72] = 0x01;
rdesc[74] = 0x08;
}
+ return rdesc;
}
static const struct hid_device_id kye_devices[] = {
diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
index f6433d8050a9..68c0b68856c7 100644
--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -41,25 +41,26 @@
* above the logical maximum described in descriptor. This extends
* the original value of 0x28c of logical maximum to 0x104d
*/
-static void lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
- if ((quirks & LG_RDESC) && rsize >= 90 && rdesc[83] == 0x26 &&
+ if ((quirks & LG_RDESC) && *rsize >= 90 && rdesc[83] == 0x26 &&
rdesc[84] == 0x8c && rdesc[85] == 0x02) {
dev_info(&hdev->dev, "fixing up Logitech keyboard report "
"descriptor\n");
rdesc[84] = rdesc[89] = 0x4d;
rdesc[85] = rdesc[90] = 0x10;
}
- if ((quirks & LG_RDESC_REL_ABS) && rsize >= 50 &&
+ if ((quirks & LG_RDESC_REL_ABS) && *rsize >= 50 &&
rdesc[32] == 0x81 && rdesc[33] == 0x06 &&
rdesc[49] == 0x81 && rdesc[50] == 0x06) {
dev_info(&hdev->dev, "fixing up rel/abs in Logitech "
"report descriptor\n");
rdesc[33] = rdesc[50] = 0x02;
}
+ return rdesc;
}
#define lg_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
diff --git a/drivers/hid/hid-microsoft.c b/drivers/hid/hid-microsoft.c
index 359cc447c6c6..dc618c33d0a2 100644
--- a/drivers/hid/hid-microsoft.c
+++ b/drivers/hid/hid-microsoft.c
@@ -33,18 +33,19 @@
* Microsoft Wireless Desktop Receiver (Model 1028) has
* 'Usage Min/Max' where it ought to have 'Physical Min/Max'
*/
-static void ms_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *ms_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
- if ((quirks & MS_RDESC) && rsize == 571 && rdesc[557] == 0x19 &&
+ if ((quirks & MS_RDESC) && *rsize == 571 && rdesc[557] == 0x19 &&
rdesc[559] == 0x29) {
dev_info(&hdev->dev, "fixing up Microsoft Wireless Receiver "
"Model 1028 report descriptor\n");
rdesc[557] = 0x35;
rdesc[559] = 0x45;
}
+ return rdesc;
}
#define ms_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
diff --git a/drivers/hid/hid-monterey.c b/drivers/hid/hid-monterey.c
index 2cd05aa244b9..c95c31e2d869 100644
--- a/drivers/hid/hid-monterey.c
+++ b/drivers/hid/hid-monterey.c
@@ -22,14 +22,15 @@
#include "hid-ids.h"
-static void mr_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *mr_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
- if (rsize >= 30 && rdesc[29] == 0x05 && rdesc[30] == 0x09) {
+ if (*rsize >= 30 && rdesc[29] == 0x05 && rdesc[30] == 0x09) {
dev_info(&hdev->dev, "fixing up button/consumer in HID report "
"descriptor\n");
rdesc[30] = 0x0c;
}
+ return rdesc;
}
#define mr_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
diff --git a/drivers/hid/hid-ortek.c b/drivers/hid/hid-ortek.c
index aa9a960f73a4..2e79716dca31 100644
--- a/drivers/hid/hid-ortek.c
+++ b/drivers/hid/hid-ortek.c
@@ -19,14 +19,15 @@
#include "hid-ids.h"
-static void ortek_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *ortek_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
- if (rsize >= 56 && rdesc[54] == 0x25 && rdesc[55] == 0x01) {
+ if (*rsize >= 56 && rdesc[54] == 0x25 && rdesc[55] == 0x01) {
dev_info(&hdev->dev, "Fixing up Ortek WKB-2000 "
"report descriptor.\n");
rdesc[55] = 0x92;
}
+ return rdesc;
}
static const struct hid_device_id ortek_devices[] = {
diff --git a/drivers/hid/hid-petalynx.c b/drivers/hid/hid-petalynx.c
index 500fbd0652dc..308d6ae48a3e 100644
--- a/drivers/hid/hid-petalynx.c
+++ b/drivers/hid/hid-petalynx.c
@@ -23,10 +23,10 @@
#include "hid-ids.h"
/* Petalynx Maxter Remote has maximum for consumer page set too low */
-static void pl_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *pl_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
- if (rsize >= 60 && rdesc[39] == 0x2a && rdesc[40] == 0xf5 &&
+ if (*rsize >= 60 && rdesc[39] == 0x2a && rdesc[40] == 0xf5 &&
rdesc[41] == 0x00 && rdesc[59] == 0x26 &&
rdesc[60] == 0xf9 && rdesc[61] == 0x00) {
dev_info(&hdev->dev, "fixing up Petalynx Maxter Remote report "
@@ -34,6 +34,7 @@ static void pl_report_fixup(struct hid_device *hdev, __u8 *rdesc,
rdesc[60] = 0xfa;
rdesc[40] = 0xfa;
}
+ return rdesc;
}
#define pl_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
diff --git a/drivers/hid/hid-picolcd.c b/drivers/hid/hid-picolcd.c
index 346f0e34987e..bc2e07740628 100644
--- a/drivers/hid/hid-picolcd.c
+++ b/drivers/hid/hid-picolcd.c
@@ -547,11 +547,11 @@ static void picolcd_fb_destroy(struct fb_info *info)
ref_cnt--;
mutex_lock(&info->lock);
(*ref_cnt)--;
- may_release = !ref_cnt;
+ may_release = !*ref_cnt;
mutex_unlock(&info->lock);
if (may_release) {
- framebuffer_release(info);
vfree((u8 *)info->fix.smem_start);
+ framebuffer_release(info);
}
}
diff --git a/drivers/hid/hid-prodikeys.c b/drivers/hid/hid-prodikeys.c
index 845f428b8090..48eab84f53b5 100644
--- a/drivers/hid/hid-prodikeys.c
+++ b/drivers/hid/hid-prodikeys.c
@@ -740,10 +740,10 @@ int pcmidi_snd_terminate(struct pcmidi_snd *pm)
/*
* PC-MIDI report descriptor for report id is wrong.
*/
-static void pk_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *pk_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
- if (rsize == 178 &&
+ if (*rsize == 178 &&
rdesc[111] == 0x06 && rdesc[112] == 0x00 &&
rdesc[113] == 0xff) {
dev_info(&hdev->dev, "fixing up pc-midi keyboard report "
@@ -751,6 +751,7 @@ static void pk_report_fixup(struct hid_device *hdev, __u8 *rdesc,
rdesc[144] = 0x18; /* report 4: was 0x10 report count */
}
+ return rdesc;
}
static int pk_input_mapping(struct hid_device *hdev, struct hid_input *hi,
diff --git a/drivers/hid/hid-samsung.c b/drivers/hid/hid-samsung.c
index bda0fd60c98d..35894444e000 100644
--- a/drivers/hid/hid-samsung.c
+++ b/drivers/hid/hid-samsung.c
@@ -61,10 +61,10 @@ static inline void samsung_irda_dev_trace(struct hid_device *hdev,
"descriptor\n", rsize);
}
-static void samsung_irda_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *samsung_irda_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
- if (rsize == 184 && rdesc[175] == 0x25 && rdesc[176] == 0x40 &&
+ if (*rsize == 184 && rdesc[175] == 0x25 && rdesc[176] == 0x40 &&
rdesc[177] == 0x75 && rdesc[178] == 0x30 &&
rdesc[179] == 0x95 && rdesc[180] == 0x01 &&
rdesc[182] == 0x40) {
@@ -74,24 +74,25 @@ static void samsung_irda_report_fixup(struct hid_device *hdev, __u8 *rdesc,
rdesc[180] = 0x06;
rdesc[182] = 0x42;
} else
- if (rsize == 203 && rdesc[192] == 0x15 && rdesc[193] == 0x0 &&
+ if (*rsize == 203 && rdesc[192] == 0x15 && rdesc[193] == 0x0 &&
rdesc[194] == 0x25 && rdesc[195] == 0x12) {
samsung_irda_dev_trace(hdev, 203);
rdesc[193] = 0x1;
rdesc[195] = 0xf;
} else
- if (rsize == 135 && rdesc[124] == 0x15 && rdesc[125] == 0x0 &&
+ if (*rsize == 135 && rdesc[124] == 0x15 && rdesc[125] == 0x0 &&
rdesc[126] == 0x25 && rdesc[127] == 0x11) {
samsung_irda_dev_trace(hdev, 135);
rdesc[125] = 0x1;
rdesc[127] = 0xe;
} else
- if (rsize == 171 && rdesc[160] == 0x15 && rdesc[161] == 0x0 &&
+ if (*rsize == 171 && rdesc[160] == 0x15 && rdesc[161] == 0x0 &&
rdesc[162] == 0x25 && rdesc[163] == 0x01) {
samsung_irda_dev_trace(hdev, 171);
rdesc[161] = 0x1;
rdesc[163] = 0x3;
}
+ return rdesc;
}
#define samsung_kbd_mouse_map_key_clear(c) \
@@ -130,11 +131,12 @@ static int samsung_kbd_mouse_input_mapping(struct hid_device *hdev,
return 1;
}
-static void samsung_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *samsung_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
if (USB_DEVICE_ID_SAMSUNG_IR_REMOTE == hdev->product)
- samsung_irda_report_fixup(hdev, rdesc, rsize);
+ rdesc = samsung_irda_report_fixup(hdev, rdesc, rsize);
+ return rdesc;
}
static int samsung_input_mapping(struct hid_device *hdev, struct hid_input *hi,
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index 402d5574b574..9fa034915185 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -31,17 +31,18 @@ struct sony_sc {
};
/* Sony Vaio VGX has wrongly mouse pointer declared as constant */
-static void sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
struct sony_sc *sc = hid_get_drvdata(hdev);
if ((sc->quirks & VAIO_RDESC_CONSTANT) &&
- rsize >= 56 && rdesc[54] == 0x81 && rdesc[55] == 0x07) {
+ *rsize >= 56 && rdesc[54] == 0x81 && rdesc[55] == 0x07) {
dev_info(&hdev->dev, "Fixing up Sony Vaio VGX report "
"descriptor\n");
rdesc[55] = 0x06;
}
+ return rdesc;
}
/*
diff --git a/drivers/hid/hid-sunplus.c b/drivers/hid/hid-sunplus.c
index 438107d9f1b2..164ed568f6cf 100644
--- a/drivers/hid/hid-sunplus.c
+++ b/drivers/hid/hid-sunplus.c
@@ -22,16 +22,17 @@
#include "hid-ids.h"
-static void sp_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *sp_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
- if (rsize >= 107 && rdesc[104] == 0x26 && rdesc[105] == 0x80 &&
+ if (*rsize >= 107 && rdesc[104] == 0x26 && rdesc[105] == 0x80 &&
rdesc[106] == 0x03) {
dev_info(&hdev->dev, "fixing up Sunplus Wireless Desktop "
"report descriptor\n");
rdesc[105] = rdesc[110] = 0x03;
rdesc[106] = rdesc[111] = 0x21;
}
+ return rdesc;
}
#define sp_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
diff --git a/drivers/hid/hid-uclogic.c b/drivers/hid/hid-uclogic.c
new file mode 100644
index 000000000000..107aa9fb07f2
--- /dev/null
+++ b/drivers/hid/hid-uclogic.c
@@ -0,0 +1,404 @@
+/*
+ * HID driver for UC-Logic devices not fully compliant with HID standard
+ *
+ * Copyright (c) 2010 Nikolai Kondrashov
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ */
+
+#include <linux/device.h>
+#include <linux/hid.h>
+#include <linux/module.h>
+
+#include "hid-ids.h"
+
+/*
+ * The original descriptors of WPXXXXU tablets have three report IDs, of
+ * which only two are used (8 and 9), and the remaining (7) seems to have
+ * the originally intended pen description which was abandoned for some
+ * reason. From this unused description it is possible to extract the
+ * actual physical extents and resolution. All the models use the same
+ * descriptor with different extents for the unused report ID.
+ *
+ * Here it is:
+ *
+ * Usage Page (Digitizer), ; Digitizer (0Dh)
+ * Usage (Pen), ; Pen (02h, application collection)
+ * Collection (Application),
+ * Report ID (7),
+ * Usage (Stylus), ; Stylus (20h, logical collection)
+ * Collection (Physical),
+ * Usage (Tip Switch), ; Tip switch (42h, momentary control)
+ * Usage (Barrel Switch), ; Barrel switch (44h, momentary control)
+ * Usage (Eraser), ; Eraser (45h, momentary control)
+ * Logical Minimum (0),
+ * Logical Maximum (1),
+ * Report Size (1),
+ * Report Count (3),
+ * Input (Variable),
+ * Report Count (3),
+ * Input (Constant, Variable),
+ * Usage (In Range), ; In range (32h, momentary control)
+ * Report Count (1),
+ * Input (Variable),
+ * Report Count (1),
+ * Input (Constant, Variable),
+ * Usage Page (Desktop), ; Generic desktop controls (01h)
+ * Usage (X), ; X (30h, dynamic value)
+ * Report Size (16),
+ * Report Count (1),
+ * Push,
+ * Unit Exponent (13),
+ * Unit (Inch^3),
+ * Physical Minimum (0),
+ * Physical Maximum (Xpm),
+ * Logical Maximum (Xlm),
+ * Input (Variable),
+ * Usage (Y), ; Y (31h, dynamic value)
+ * Physical Maximum (Ypm),
+ * Logical Maximum (Ylm),
+ * Input (Variable),
+ * Pop,
+ * Usage Page (Digitizer), ; Digitizer (0Dh)
+ * Usage (Tip Pressure), ; Tip pressure (30h, dynamic value)
+ * Logical Maximum (1023),
+ * Input (Variable),
+ * Report Size (16),
+ * End Collection,
+ * End Collection,
+ * Usage Page (Desktop), ; Generic desktop controls (01h)
+ * Usage (Mouse), ; Mouse (02h, application collection)
+ * Collection (Application),
+ * Report ID (8),
+ * Usage (Pointer), ; Pointer (01h, physical collection)
+ * Collection (Physical),
+ * Usage Page (Button), ; Button (09h)
+ * Usage Minimum (01h),
+ * Usage Maximum (03h),
+ * Logical Minimum (0),
+ * Logical Maximum (1),
+ * Report Count (3),
+ * Report Size (1),
+ * Input (Variable),
+ * Report Count (5),
+ * Input (Constant),
+ * Usage Page (Desktop), ; Generic desktop controls (01h)
+ * Usage (X), ; X (30h, dynamic value)
+ * Usage (Y), ; Y (31h, dynamic value)
+ * Usage (Wheel), ; Wheel (38h, dynamic value)
+ * Usage (00h),
+ * Logical Minimum (-127),
+ * Logical Maximum (127),
+ * Report Size (8),
+ * Report Count (4),
+ * Input (Variable, Relative),
+ * End Collection,
+ * End Collection,
+ * Usage Page (Desktop), ; Generic desktop controls (01h)
+ * Usage (Mouse), ; Mouse (02h, application collection)
+ * Collection (Application),
+ * Report ID (9),
+ * Usage (Pointer), ; Pointer (01h, physical collection)
+ * Collection (Physical),
+ * Usage Page (Button), ; Button (09h)
+ * Usage Minimum (01h),
+ * Usage Maximum (03h),
+ * Logical Minimum (0),
+ * Logical Maximum (1),
+ * Report Count (3),
+ * Report Size (1),
+ * Input (Variable),
+ * Report Count (5),
+ * Input (Constant),
+ * Usage Page (Desktop), ; Generic desktop controls (01h)
+ * Usage (X), ; X (30h, dynamic value)
+ * Usage (Y), ; Y (31h, dynamic value)
+ * Logical Minimum (0),
+ * Logical Maximum (32767),
+ * Physical Minimum (0),
+ * Physical Maximum (32767),
+ * Report Count (2),
+ * Report Size (16),
+ * Input (Variable),
+ * Usage Page (Digitizer), ; Digitizer (0Dh)
+ * Usage (Tip Pressure), ; Tip pressure (30h, dynamic value)
+ * Logical Maximum (1023),
+ * Report Count (1),
+ * Report Size (16),
+ * Input (Variable),
+ * End Collection,
+ * End Collection
+ *
+ * Here are the extents values for the WPXXXXU models:
+ *
+ * Xpm Xlm Ypm Ylm
+ * WP4030U 4000 8000 3000 6000
+ * WP5540U 5500 11000 4000 8000
+ * WP8060U 8000 16000 6000 12000
+ *
+ * This suggests that all of them have 2000 LPI resolution, as advertised.
+ */
+
+/* Size of the original descriptor of WPXXXXU tablets */
+#define WPXXXXU_RDESC_ORIG_SIZE 212
+
+/*
+ * Fixed WP4030U report descriptor.
+ * Although the hardware might actually support it, the mouse description
+ * has been removed, since there seems to be no devices having one and it
+ * wouldn't make much sense because of the working area size.
+ */
+static __u8 wp4030u_rdesc_fixed[] = {
+ 0x05, 0x0D, /* Usage Page (Digitizer), */
+ 0x09, 0x02, /* Usage (Pen), */
+ 0xA1, 0x01, /* Collection (Application), */
+ 0x85, 0x09, /* Report ID (9), */
+ 0x09, 0x20, /* Usage (Stylus), */
+ 0xA0, /* Collection (Physical), */
+ 0x75, 0x01, /* Report Size (1), */
+ 0x09, 0x42, /* Usage (Tip Switch), */
+ 0x09, 0x44, /* Usage (Barrel Switch), */
+ 0x09, 0x46, /* Usage (Tablet Pick), */
+ 0x14, /* Logical Minimum (0), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x95, 0x03, /* Report Count (3), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x95, 0x05, /* Report Count (5), */
+ 0x81, 0x01, /* Input (Constant), */
+ 0x75, 0x10, /* Report Size (16), */
+ 0x95, 0x01, /* Report Count (1), */
+ 0x14, /* Logical Minimum (0), */
+ 0xA4, /* Push, */
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x55, 0xFD, /* Unit Exponent (-3), */
+ 0x65, 0x13, /* Unit (Inch), */
+ 0x34, /* Physical Minimum (0), */
+ 0x09, 0x30, /* Usage (X), */
+ 0x46, 0xA0, 0x0F, /* Physical Maximum (4000), */
+ 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x09, 0x31, /* Usage (Y), */
+ 0x46, 0xB8, 0x0B, /* Physical Maximum (3000), */
+ 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0xB4, /* Pop, */
+ 0x09, 0x30, /* Usage (Tip Pressure), */
+ 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0xC0, /* End Collection, */
+ 0xC0 /* End Collection */
+};
+
+/* Fixed WP5540U report descriptor */
+static __u8 wp5540u_rdesc_fixed[] = {
+ 0x05, 0x0D, /* Usage Page (Digitizer), */
+ 0x09, 0x02, /* Usage (Pen), */
+ 0xA1, 0x01, /* Collection (Application), */
+ 0x85, 0x09, /* Report ID (9), */
+ 0x09, 0x20, /* Usage (Stylus), */
+ 0xA0, /* Collection (Physical), */
+ 0x75, 0x01, /* Report Size (1), */
+ 0x09, 0x42, /* Usage (Tip Switch), */
+ 0x09, 0x44, /* Usage (Barrel Switch), */
+ 0x09, 0x46, /* Usage (Tablet Pick), */
+ 0x14, /* Logical Minimum (0), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x95, 0x03, /* Report Count (3), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x95, 0x05, /* Report Count (5), */
+ 0x81, 0x01, /* Input (Constant), */
+ 0x75, 0x10, /* Report Size (16), */
+ 0x95, 0x01, /* Report Count (1), */
+ 0x14, /* Logical Minimum (0), */
+ 0xA4, /* Push, */
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x55, 0xFD, /* Unit Exponent (-3), */
+ 0x65, 0x13, /* Unit (Inch), */
+ 0x34, /* Physical Minimum (0), */
+ 0x09, 0x30, /* Usage (X), */
+ 0x46, 0x7C, 0x15, /* Physical Maximum (5500), */
+ 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x09, 0x31, /* Usage (Y), */
+ 0x46, 0xA0, 0x0F, /* Physical Maximum (4000), */
+ 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0xB4, /* Pop, */
+ 0x09, 0x30, /* Usage (Tip Pressure), */
+ 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0xC0, /* End Collection, */
+ 0xC0, /* End Collection, */
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x09, 0x02, /* Usage (Mouse), */
+ 0xA1, 0x01, /* Collection (Application), */
+ 0x85, 0x08, /* Report ID (8), */
+ 0x09, 0x01, /* Usage (Pointer), */
+ 0xA0, /* Collection (Physical), */
+ 0x75, 0x01, /* Report Size (1), */
+ 0x05, 0x09, /* Usage Page (Button), */
+ 0x19, 0x01, /* Usage Minimum (01h), */
+ 0x29, 0x03, /* Usage Maximum (03h), */
+ 0x14, /* Logical Minimum (0), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x95, 0x03, /* Report Count (3), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x95, 0x05, /* Report Count (5), */
+ 0x81, 0x01, /* Input (Constant), */
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x75, 0x08, /* Report Size (8), */
+ 0x09, 0x30, /* Usage (X), */
+ 0x09, 0x31, /* Usage (Y), */
+ 0x15, 0x81, /* Logical Minimum (-127), */
+ 0x25, 0x7F, /* Logical Maximum (127), */
+ 0x95, 0x02, /* Report Count (2), */
+ 0x81, 0x06, /* Input (Variable, Relative), */
+ 0x09, 0x38, /* Usage (Wheel), */
+ 0x15, 0xFF, /* Logical Minimum (-1), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x95, 0x01, /* Report Count (1), */
+ 0x81, 0x06, /* Input (Variable, Relative), */
+ 0x81, 0x01, /* Input (Constant), */
+ 0xC0, /* End Collection, */
+ 0xC0 /* End Collection */
+};
+
+/* Fixed WP8060U report descriptor */
+static __u8 wp8060u_rdesc_fixed[] = {
+ 0x05, 0x0D, /* Usage Page (Digitizer), */
+ 0x09, 0x02, /* Usage (Pen), */
+ 0xA1, 0x01, /* Collection (Application), */
+ 0x85, 0x09, /* Report ID (9), */
+ 0x09, 0x20, /* Usage (Stylus), */
+ 0xA0, /* Collection (Physical), */
+ 0x75, 0x01, /* Report Size (1), */
+ 0x09, 0x42, /* Usage (Tip Switch), */
+ 0x09, 0x44, /* Usage (Barrel Switch), */
+ 0x09, 0x46, /* Usage (Tablet Pick), */
+ 0x14, /* Logical Minimum (0), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x95, 0x03, /* Report Count (3), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x95, 0x05, /* Report Count (5), */
+ 0x81, 0x01, /* Input (Constant), */
+ 0x75, 0x10, /* Report Size (16), */
+ 0x95, 0x01, /* Report Count (1), */
+ 0x14, /* Logical Minimum (0), */
+ 0xA4, /* Push, */
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x55, 0xFD, /* Unit Exponent (-3), */
+ 0x65, 0x13, /* Unit (Inch), */
+ 0x34, /* Physical Minimum (0), */
+ 0x09, 0x30, /* Usage (X), */
+ 0x46, 0x40, 0x1F, /* Physical Maximum (8000), */
+ 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x09, 0x31, /* Usage (Y), */
+ 0x46, 0x70, 0x17, /* Physical Maximum (6000), */
+ 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0xB4, /* Pop, */
+ 0x09, 0x30, /* Usage (Tip Pressure), */
+ 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0xC0, /* End Collection, */
+ 0xC0, /* End Collection, */
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x09, 0x02, /* Usage (Mouse), */
+ 0xA1, 0x01, /* Collection (Application), */
+ 0x85, 0x08, /* Report ID (8), */
+ 0x09, 0x01, /* Usage (Pointer), */
+ 0xA0, /* Collection (Physical), */
+ 0x75, 0x01, /* Report Size (1), */
+ 0x05, 0x09, /* Usage Page (Button), */
+ 0x19, 0x01, /* Usage Minimum (01h), */
+ 0x29, 0x03, /* Usage Maximum (03h), */
+ 0x14, /* Logical Minimum (0), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x95, 0x03, /* Report Count (3), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x95, 0x05, /* Report Count (5), */
+ 0x81, 0x01, /* Input (Constant), */
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x75, 0x08, /* Report Size (8), */
+ 0x09, 0x30, /* Usage (X), */
+ 0x09, 0x31, /* Usage (Y), */
+ 0x15, 0x81, /* Logical Minimum (-127), */
+ 0x25, 0x7F, /* Logical Maximum (127), */
+ 0x95, 0x02, /* Report Count (2), */
+ 0x81, 0x06, /* Input (Variable, Relative), */
+ 0x09, 0x38, /* Usage (Wheel), */
+ 0x15, 0xFF, /* Logical Minimum (-1), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x95, 0x01, /* Report Count (1), */
+ 0x81, 0x06, /* Input (Variable, Relative), */
+ 0x81, 0x01, /* Input (Constant), */
+ 0xC0, /* End Collection, */
+ 0xC0 /* End Collection */
+};
+
+static __u8 *uclogic_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
+{
+ switch (hdev->product) {
+ case USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U:
+ if (*rsize == WPXXXXU_RDESC_ORIG_SIZE)
+ {
+ rdesc = wp4030u_rdesc_fixed;
+ *rsize = sizeof(wp4030u_rdesc_fixed);
+ }
+ break;
+ case USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U:
+ if (*rsize == WPXXXXU_RDESC_ORIG_SIZE)
+ {
+ rdesc = wp5540u_rdesc_fixed;
+ *rsize = sizeof(wp5540u_rdesc_fixed);
+ }
+ break;
+ case USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U:
+ if (*rsize == WPXXXXU_RDESC_ORIG_SIZE)
+ {
+ rdesc = wp8060u_rdesc_fixed;
+ *rsize = sizeof(wp8060u_rdesc_fixed);
+ }
+ break;
+ }
+
+ return rdesc;
+}
+
+static const struct hid_device_id uclogic_devices[] = {
+ { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
+ USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
+ USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
+ USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U) },
+ { }
+};
+MODULE_DEVICE_TABLE(hid, uclogic_devices);
+
+static struct hid_driver uclogic_driver = {
+ .name = "uclogic",
+ .id_table = uclogic_devices,
+ .report_fixup = uclogic_report_fixup,
+};
+
+static int __init uclogic_init(void)
+{
+ return hid_register_driver(&uclogic_driver);
+}
+
+static void __exit uclogic_exit(void)
+{
+ hid_unregister_driver(&uclogic_driver);
+}
+
+module_init(uclogic_init);
+module_exit(uclogic_exit);
+MODULE_LICENSE("GPL");
diff --git a/drivers/hid/hid-zydacron.c b/drivers/hid/hid-zydacron.c
index 9e8d35a203e4..aac1f9273149 100644
--- a/drivers/hid/hid-zydacron.c
+++ b/drivers/hid/hid-zydacron.c
@@ -27,10 +27,10 @@ struct zc_device {
* Zydacron remote control has an invalid HID report descriptor,
* that needs fixing before we can parse it.
*/
-static void zc_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int rsize)
+static __u8 *zc_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
{
- if (rsize >= 253 &&
+ if (*rsize >= 253 &&
rdesc[0x96] == 0xbc && rdesc[0x97] == 0xff &&
rdesc[0xca] == 0xbc && rdesc[0xcb] == 0xff &&
rdesc[0xe1] == 0xbc && rdesc[0xe2] == 0xff) {
@@ -40,6 +40,7 @@ static void zc_report_fixup(struct hid_device *hdev, __u8 *rdesc,
rdesc[0x96] = rdesc[0xca] = rdesc[0xe1] = 0x0c;
rdesc[0x97] = rdesc[0xcb] = rdesc[0xe2] = 0x00;
}
+ return rdesc;
}
#define zc_map_key_clear(c) \
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
index 2643d3147621..162aa4b40205 100644
--- a/drivers/hid/usbhid/hid-quirks.c
+++ b/drivers/hid/usbhid/hid-quirks.c
@@ -68,7 +68,8 @@ static const struct hid_blacklist {
{ USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_PF1209, HID_QUIRK_MULTI_INPUT },
- { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U, HID_QUIRK_MULTI_INPUT },
+ { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U, HID_QUIRK_MULTI_INPUT },
+ { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U, HID_QUIRK_MULTI_INPUT },
{ USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
{ USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c
index 254a003af048..0a29c51114aa 100644
--- a/drivers/hid/usbhid/hiddev.c
+++ b/drivers/hid/usbhid/hiddev.c
@@ -266,13 +266,15 @@ static int hiddev_open(struct inode *inode, struct file *file)
{
struct hiddev_list *list;
struct usb_interface *intf;
+ struct hid_device *hid;
struct hiddev *hiddev;
int res;
intf = usb_find_interface(&hiddev_driver, iminor(inode));
if (!intf)
return -ENODEV;
- hiddev = usb_get_intfdata(intf);
+ hid = usb_get_intfdata(intf);
+ hiddev = hid->hiddev;
if (!(list = kzalloc(sizeof(struct hiddev_list), GFP_KERNEL)))
return -ENOMEM;
@@ -587,7 +589,7 @@ static long hiddev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
struct hiddev_list *list = file->private_data;
struct hiddev *hiddev = list->hiddev;
struct hid_device *hid = hiddev->hid;
- struct usb_device *dev = hid_to_usb_dev(hid);
+ struct usb_device *dev;
struct hiddev_collection_info cinfo;
struct hiddev_report_info rinfo;
struct hiddev_field_info finfo;
@@ -601,9 +603,11 @@ static long hiddev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
/* Called without BKL by compat methods so no BKL taken */
/* FIXME: Who or what stop this racing with a disconnect ?? */
- if (!hiddev->exist)
+ if (!hiddev->exist || !hid)
return -EIO;
+ dev = hid_to_usb_dev(hid);
+
switch (cmd) {
case HIDIOCGVERSION:
@@ -888,7 +892,6 @@ int hiddev_connect(struct hid_device *hid, unsigned int force)
hid->hiddev = hiddev;
hiddev->hid = hid;
hiddev->exist = 1;
- usb_set_intfdata(usbhid->intf, usbhid);
retval = usb_register_dev(usbhid->intf, &hiddev_class);
if (retval) {
err_hid("Not able to get a minor for this device.");
diff --git a/drivers/hwmon/ads7871.c b/drivers/hwmon/ads7871.c
index b300a2048af1..45f58297ed84 100644
--- a/drivers/hwmon/ads7871.c
+++ b/drivers/hwmon/ads7871.c
@@ -176,12 +176,6 @@ static int __devinit ads7871_probe(struct spi_device *spi)
if (status < 0)
goto error_free;
- pdata->hwmon_dev = hwmon_device_register(&spi->dev);
- if (IS_ERR(pdata->hwmon_dev)) {
- err = PTR_ERR(pdata->hwmon_dev);
- goto error_remove;
- }
-
spi_set_drvdata(spi, pdata);
/* Configure the SPI bus */
@@ -204,6 +198,12 @@ static int __devinit ads7871_probe(struct spi_device *spi)
goto error_remove;
}
+ pdata->hwmon_dev = hwmon_device_register(&spi->dev);
+ if (IS_ERR(pdata->hwmon_dev)) {
+ err = PTR_ERR(pdata->hwmon_dev);
+ goto error_remove;
+ }
+
return 0;
error_remove:
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
index c070c9714cbe..de8111114f46 100644
--- a/drivers/hwmon/coretemp.c
+++ b/drivers/hwmon/coretemp.c
@@ -518,7 +518,6 @@ static struct notifier_block coretemp_cpu_notifier __refdata = {
static int __init coretemp_init(void)
{
int i, err = -ENODEV;
- struct pdev_entry *p, *n;
/* quick check if we run Intel */
if (cpu_data(0).x86_vendor != X86_VENDOR_INTEL)
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c
index 598c49acaeb5..2707f5e17158 100644
--- a/drivers/i2c/busses/i2c-sh_mobile.c
+++ b/drivers/i2c/busses/i2c-sh_mobile.c
@@ -538,15 +538,17 @@ static int sh_mobile_i2c_hook_irqs(struct platform_device *dev, int hook)
{
struct resource *res;
int ret = -ENXIO;
- int q, m;
- int k = 0;
- int n = 0;
+ int n, k = 0;
while ((res = platform_get_resource(dev, IORESOURCE_IRQ, k))) {
for (n = res->start; hook && n <= res->end; n++) {
if (request_irq(n, sh_mobile_i2c_isr, IRQF_DISABLED,
- dev_name(&dev->dev), dev))
+ dev_name(&dev->dev), dev)) {
+ for (n--; n >= res->start; n--)
+ free_irq(n, dev);
+
goto rollback;
+ }
}
k++;
}
@@ -554,16 +556,17 @@ static int sh_mobile_i2c_hook_irqs(struct platform_device *dev, int hook)
if (hook)
return k > 0 ? 0 : -ENOENT;
- k--;
ret = 0;
rollback:
- for (q = k; k >= 0; k--) {
- for (m = n; m >= res->start; m--)
- free_irq(m, dev);
+ k--;
+
+ while (k >= 0) {
+ res = platform_get_resource(dev, IORESOURCE_IRQ, k);
+ for (n = res->start; n <= res->end; n++)
+ free_irq(n, dev);
- res = platform_get_resource(dev, IORESOURCE_IRQ, k - 1);
- m = res->end;
+ k--;
}
return ret;
diff --git a/drivers/ieee1394/eth1394.c b/drivers/ieee1394/eth1394.c
index bc289e367e30..63403822330e 100644
--- a/drivers/ieee1394/eth1394.c
+++ b/drivers/ieee1394/eth1394.c
@@ -58,7 +58,6 @@
#include <linux/tcp.h>
#include <linux/skbuff.h>
#include <linux/bitops.h>
-#include <linux/ethtool.h>
#include <asm/uaccess.h>
#include <asm/delay.h>
#include <asm/unaligned.h>
@@ -173,8 +172,6 @@ static netdev_tx_t ether1394_tx(struct sk_buff *skb,
struct net_device *dev);
static void ether1394_iso(struct hpsb_iso *iso);
-static const struct ethtool_ops ethtool_ops;
-
static int ether1394_write(struct hpsb_host *host, int srcid, int destid,
quadlet_t *data, u64 addr, size_t len, u16 flags);
static void ether1394_add_host(struct hpsb_host *host);
@@ -525,8 +522,6 @@ static void ether1394_init_dev(struct net_device *dev)
dev->header_ops = &ether1394_header_ops;
dev->netdev_ops = &ether1394_netdev_ops;
- SET_ETHTOOL_OPS(dev, &ethtool_ops);
-
dev->watchdog_timeo = ETHER1394_TIMEOUT;
dev->flags = IFF_BROADCAST | IFF_MULTICAST;
dev->features = NETIF_F_HIGHDMA;
@@ -1695,17 +1690,6 @@ fail:
return NETDEV_TX_OK;
}
-static void ether1394_get_drvinfo(struct net_device *dev,
- struct ethtool_drvinfo *info)
-{
- strcpy(info->driver, driver_name);
- strcpy(info->bus_info, "ieee1394"); /* FIXME provide more detail? */
-}
-
-static const struct ethtool_ops ethtool_ops = {
- .get_drvinfo = ether1394_get_drvinfo
-};
-
static int __init ether1394_init_module(void)
{
int err;
diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c
index d0dc1db80b29..50815022cff1 100644
--- a/drivers/ieee1394/ohci1394.c
+++ b/drivers/ieee1394/ohci1394.c
@@ -1106,7 +1106,7 @@ static int ohci_iso_recv_init(struct hpsb_iso *iso)
if (recv->block_irq_interval * 4 > iso->buf_packets)
recv->block_irq_interval = iso->buf_packets / 4;
if (recv->block_irq_interval < 1)
- recv->block_irq_interval = 1;
+ recv->block_irq_interval = 1;
/* choose a buffer stride */
/* must be a power of 2, and <= PAGE_SIZE */
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
index 32d352a88d50..ea54c6ae23bf 100644
--- a/drivers/infiniband/hw/cxgb4/cm.c
+++ b/drivers/infiniband/hw/cxgb4/cm.c
@@ -2323,7 +2323,7 @@ static int fw6_msg(struct c4iw_dev *dev, struct sk_buff *skb)
switch (rpl->type) {
case 1:
ret = (int)((be64_to_cpu(rpl->data[0]) >> 8) & 0xff);
- wr_waitp = (__force struct c4iw_wr_wait *)rpl->data[1];
+ wr_waitp = (struct c4iw_wr_wait *)(__force unsigned long) rpl->data[1];
PDBG("%s wr_waitp %p ret %u\n", __func__, wr_waitp, ret);
if (wr_waitp) {
wr_waitp->ret = ret;
diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c
index b3daf39eed4a..af684fca4a82 100644
--- a/drivers/infiniband/hw/cxgb4/cq.c
+++ b/drivers/infiniband/hw/cxgb4/cq.c
@@ -55,7 +55,7 @@ static int destroy_cq(struct c4iw_rdev *rdev, struct t4_cq *cq,
V_FW_RI_RES_WR_NRES(1) |
FW_WR_COMPL(1));
res_wr->len16_pkd = cpu_to_be32(DIV_ROUND_UP(wr_len, 16));
- res_wr->cookie = (u64)&wr_wait;
+ res_wr->cookie = (unsigned long) &wr_wait;
res = res_wr->res;
res->u.cq.restype = FW_RI_RES_TYPE_CQ;
res->u.cq.op = FW_RI_RES_OP_RESET;
@@ -132,7 +132,7 @@ static int create_cq(struct c4iw_rdev *rdev, struct t4_cq *cq,
V_FW_RI_RES_WR_NRES(1) |
FW_WR_COMPL(1));
res_wr->len16_pkd = cpu_to_be32(DIV_ROUND_UP(wr_len, 16));
- res_wr->cookie = (u64)&wr_wait;
+ res_wr->cookie = (unsigned long) &wr_wait;
res = res_wr->res;
res->u.cq.restype = FW_RI_RES_TYPE_CQ;
res->u.cq.op = FW_RI_RES_OP_WRITE;
diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c
index 269373a62f22..f61562cc7413 100644
--- a/drivers/infiniband/hw/cxgb4/mem.c
+++ b/drivers/infiniband/hw/cxgb4/mem.c
@@ -71,7 +71,7 @@ static int write_adapter_mem(struct c4iw_rdev *rdev, u32 addr, u32 len,
if (i == (num_wqe-1)) {
req->wr.wr_hi = cpu_to_be32(FW_WR_OP(FW_ULPTX_WR) |
FW_WR_COMPL(1));
- req->wr.wr_lo = (__force __be64)&wr_wait;
+ req->wr.wr_lo = (__force __be64)(unsigned long) &wr_wait;
} else
req->wr.wr_hi = cpu_to_be32(FW_WR_OP(FW_ULPTX_WR));
req->wr.wr_mid = cpu_to_be32(
diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c
index 93f6e5bf0ec5..5d11f8601599 100644
--- a/drivers/infiniband/hw/cxgb4/qp.c
+++ b/drivers/infiniband/hw/cxgb4/qp.c
@@ -144,7 +144,7 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq,
V_FW_RI_RES_WR_NRES(2) |
FW_WR_COMPL(1));
res_wr->len16_pkd = cpu_to_be32(DIV_ROUND_UP(wr_len, 16));
- res_wr->cookie = (u64)&wr_wait;
+ res_wr->cookie = (unsigned long) &wr_wait;
res = res_wr->res;
res->u.sqrq.restype = FW_RI_RES_TYPE_SQ;
res->u.sqrq.op = FW_RI_RES_OP_WRITE;
@@ -985,7 +985,7 @@ static int rdma_fini(struct c4iw_dev *rhp, struct c4iw_qp *qhp,
wqe->flowid_len16 = cpu_to_be32(
FW_WR_FLOWID(ep->hwtid) |
FW_WR_LEN16(DIV_ROUND_UP(sizeof *wqe, 16)));
- wqe->cookie = (u64)&wr_wait;
+ wqe->cookie = (unsigned long) &wr_wait;
wqe->u.fini.type = FW_RI_TYPE_FINI;
c4iw_init_wr_wait(&wr_wait);
@@ -1060,7 +1060,7 @@ static int rdma_init(struct c4iw_dev *rhp, struct c4iw_qp *qhp)
FW_WR_FLOWID(qhp->ep->hwtid) |
FW_WR_LEN16(DIV_ROUND_UP(sizeof *wqe, 16)));
- wqe->cookie = (u64)&wr_wait;
+ wqe->cookie = (unsigned long) &wr_wait;
wqe->u.init.type = FW_RI_TYPE_INIT;
wqe->u.init.mpareqbit_p2ptype =
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c
index 9046e6675686..b89972c6a357 100644
--- a/drivers/infiniband/hw/nes/nes_verbs.c
+++ b/drivers/infiniband/hw/nes/nes_verbs.c
@@ -476,9 +476,9 @@ static struct ib_fast_reg_page_list *nes_alloc_fast_reg_page_list(
}
nes_debug(NES_DBG_MR, "nes_alloc_fast_reg_pbl: nes_frpl = %p, "
"ibfrpl = %p, ibfrpl.page_list = %p, pbl.kva = %p, "
- "pbl.paddr= %p\n", pnesfrpl, &pnesfrpl->ibfrpl,
+ "pbl.paddr = %llx\n", pnesfrpl, &pnesfrpl->ibfrpl,
pnesfrpl->ibfrpl.page_list, pnesfrpl->nes_wqe_pbl.kva,
- (void *)pnesfrpl->nes_wqe_pbl.paddr);
+ (unsigned long long) pnesfrpl->nes_wqe_pbl.paddr);
return pifrpl;
}
@@ -3483,13 +3483,13 @@ static int nes_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
for (i = 0; i < ib_wr->wr.fast_reg.page_list_len; i++)
dst_page_list[i] = cpu_to_le64(src_page_list[i]);
- nes_debug(NES_DBG_IW_TX, "SQ_FMR: iova_start: %p, "
- "length: %d, rkey: %0x, pgl_paddr: %p, "
+ nes_debug(NES_DBG_IW_TX, "SQ_FMR: iova_start: %llx, "
+ "length: %d, rkey: %0x, pgl_paddr: %llx, "
"page_list_len: %u, wqe_misc: %x\n",
- (void *)ib_wr->wr.fast_reg.iova_start,
+ (unsigned long long) ib_wr->wr.fast_reg.iova_start,
ib_wr->wr.fast_reg.length,
ib_wr->wr.fast_reg.rkey,
- (void *)pnesfrpl->nes_wqe_pbl.paddr,
+ (unsigned long long) pnesfrpl->nes_wqe_pbl.paddr,
ib_wr->wr.fast_reg.page_list_len,
wqe_misc);
break;
diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c
index 4f9b2afc24e8..014dd4ad0d4f 100644
--- a/drivers/input/misc/twl4030-vibra.c
+++ b/drivers/input/misc/twl4030-vibra.c
@@ -271,7 +271,7 @@ static struct platform_driver twl4030_vibra_driver = {
.probe = twl4030_vibra_probe,
.remove = __devexit_p(twl4030_vibra_remove),
.driver = {
- .name = "twl4030_codec_vibra",
+ .name = "twl4030-vibra",
.owner = THIS_MODULE,
#ifdef CONFIG_PM
.pm = &twl4030_vibra_pm_ops,
@@ -291,7 +291,7 @@ static void __exit twl4030_vibra_exit(void)
}
module_exit(twl4030_vibra_exit);
-MODULE_ALIAS("platform:twl4030_codec_vibra");
+MODULE_ALIAS("platform:twl4030-vibra");
MODULE_DESCRIPTION("TWL4030 Vibra driver");
MODULE_LICENSE("GPL");
diff --git a/drivers/isdn/hisax/hfc_sx.c b/drivers/isdn/hisax/hfc_sx.c
index be5faf4aa868..5aa138eb0b3c 100644
--- a/drivers/isdn/hisax/hfc_sx.c
+++ b/drivers/isdn/hisax/hfc_sx.c
@@ -234,13 +234,14 @@ read_fifo(struct IsdnCardState *cs, u_char fifo, int trans_max)
count++;
if (count > trans_max)
count = trans_max; /* limit length */
- if ((skb = dev_alloc_skb(count))) {
- dst = skb_put(skb, count);
- while (count--)
+ skb = dev_alloc_skb(count);
+ if (skb) {
+ dst = skb_put(skb, count);
+ while (count--)
*dst++ = Read_hfc(cs, HFCSX_FIF_DRD);
- return(skb);
- }
- else return(NULL); /* no memory */
+ return skb;
+ } else
+ return NULL; /* no memory */
}
do {
diff --git a/drivers/isdn/mISDN/dsp_cmx.c b/drivers/isdn/mISDN/dsp_cmx.c
index 713ef2b805a2..76d9e673b4e1 100644
--- a/drivers/isdn/mISDN/dsp_cmx.c
+++ b/drivers/isdn/mISDN/dsp_cmx.c
@@ -1237,6 +1237,7 @@ dsp_cmx_receive(struct dsp *dsp, struct sk_buff *skb)
if (dsp->cmx_delay)
dsp->rx_W = (dsp->rx_R + dsp->cmx_delay)
& CMX_BUFF_MASK;
+ else
dsp->rx_W = (dsp->rx_R + (dsp_poll >> 1))
& CMX_BUFF_MASK;
} else {
diff --git a/drivers/isdn/mISDN/l1oip_core.c b/drivers/isdn/mISDN/l1oip_core.c
index 22f38e48ac4e..5b59796ed250 100644
--- a/drivers/isdn/mISDN/l1oip_core.c
+++ b/drivers/isdn/mISDN/l1oip_core.c
@@ -972,7 +972,7 @@ channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq)
if (debug & DEBUG_L1OIP_SOCKET)
printk(KERN_DEBUG "%s: got new ip address from user "
"space.\n", __func__);
- l1oip_socket_open(hc);
+ l1oip_socket_open(hc);
break;
case MISDN_CTRL_UNSETPEER:
if (debug & DEBUG_L1OIP_SOCKET)
diff --git a/drivers/media/video/zoran/videocodec.h b/drivers/media/video/zoran/videocodec.h
index 5c27b251354e..b654bfff8740 100644
--- a/drivers/media/video/zoran/videocodec.h
+++ b/drivers/media/video/zoran/videocodec.h
@@ -56,7 +56,7 @@
the slave is bound to it). Otherwise it doesn't need this functions and
therfor they may not be initialized.
- The other fuctions are just for convenience, as they are for sure used by
+ The other functions are just for convenience, as they are for sure used by
most/all of the codecs. The last ones may be ommited, too.
See the structure declaration below for more information and which data has
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c
index 720e099e506d..5d0fb60a4c14 100644
--- a/drivers/mfd/twl-core.c
+++ b/drivers/mfd/twl-core.c
@@ -698,17 +698,17 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features)
if (twl_has_codec() && pdata->codec && twl_class_is_4030()) {
sub_chip_id = twl_map[TWL_MODULE_AUDIO_VOICE].sid;
- child = add_child(sub_chip_id, "twl4030_codec",
+ child = add_child(sub_chip_id, "twl4030-audio",
pdata->codec, sizeof(*pdata->codec),
false, 0, 0);
if (IS_ERR(child))
return PTR_ERR(child);
}
- /* Phoenix*/
+ /* Phoenix codec driver is probed directly atm */
if (twl_has_codec() && pdata->codec && twl_class_is_6030()) {
sub_chip_id = twl_map[TWL_MODULE_AUDIO_VOICE].sid;
- child = add_child(sub_chip_id, "twl6040_codec",
+ child = add_child(sub_chip_id, "twl6040-codec",
pdata->codec, sizeof(*pdata->codec),
false, 0, 0);
if (IS_ERR(child))
diff --git a/drivers/mfd/twl4030-codec.c b/drivers/mfd/twl4030-codec.c
index add6f67d8032..9a4b196d6deb 100644
--- a/drivers/mfd/twl4030-codec.c
+++ b/drivers/mfd/twl4030-codec.c
@@ -207,14 +207,14 @@ static int __devinit twl4030_codec_probe(struct platform_device *pdev)
if (pdata->audio) {
cell = &codec->cells[childs];
- cell->name = "twl4030_codec_audio";
+ cell->name = "twl4030-codec";
cell->platform_data = pdata->audio;
cell->data_size = sizeof(*pdata->audio);
childs++;
}
if (pdata->vibra) {
cell = &codec->cells[childs];
- cell->name = "twl4030_codec_vibra";
+ cell->name = "twl4030-vibra";
cell->platform_data = pdata->vibra;
cell->data_size = sizeof(*pdata->vibra);
childs++;
@@ -249,14 +249,14 @@ static int __devexit twl4030_codec_remove(struct platform_device *pdev)
return 0;
}
-MODULE_ALIAS("platform:twl4030_codec");
+MODULE_ALIAS("platform:twl4030-audio");
static struct platform_driver twl4030_codec_driver = {
.probe = twl4030_codec_probe,
.remove = __devexit_p(twl4030_codec_remove),
.driver = {
.owner = THIS_MODULE,
- .name = "twl4030_codec",
+ .name = "twl4030-audio",
},
};
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 5a6895320b48..ecd66f3575ac 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -3336,4 +3336,18 @@ config VMXNET3
To compile this driver as a module, choose M here: the
module will be called vmxnet3.
+config VBUS_ENET
+ tristate "VBUS Ethernet Driver"
+ default n
+ depends on VBUS_PROXY
+ help
+ A virtualized 802.x network device based on the VBUS
+ "virtual-ethernet" interface. It can be used with any
+ hypervisor/kernel that supports the vbus+venet protocol.
+
+config VBUS_ENET_DEBUG
+ bool "Enable Debugging"
+ depends on VBUS_ENET
+ default n
+
endif # NETDEVICES
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 56e8c27f77ce..81a389f33037 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -289,6 +289,7 @@ obj-$(CONFIG_FS_ENET) += fs_enet/
obj-$(CONFIG_NETXEN_NIC) += netxen/
obj-$(CONFIG_NIU) += niu.o
obj-$(CONFIG_VIRTIO_NET) += virtio_net.o
+obj-$(CONFIG_VBUS_ENET) += vbus-enet.o
obj-$(CONFIG_SFC) += sfc/
obj-$(CONFIG_WIMAX) += wimax/
diff --git a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c
index 585c25f4b60c..1f5fc64b3224 100644
--- a/drivers/net/amd8111e.c
+++ b/drivers/net/amd8111e.c
@@ -396,7 +396,7 @@ static int amd8111e_set_coalesce(struct net_device * dev, enum coal_mode cmod)
event_count = coal_conf->rx_event_count;
if( timeout > MAX_TIMEOUT ||
event_count > MAX_EVENT_COUNT )
- return -EINVAL;
+ return -EINVAL;
timeout = timeout * DELAY_TIMER_CONV;
writel(VAL0|STINTEN, mmio+INTEN0);
@@ -409,7 +409,7 @@ static int amd8111e_set_coalesce(struct net_device * dev, enum coal_mode cmod)
event_count = coal_conf->tx_event_count;
if( timeout > MAX_TIMEOUT ||
event_count > MAX_EVENT_COUNT )
- return -EINVAL;
+ return -EINVAL;
timeout = timeout * DELAY_TIMER_CONV;
diff --git a/drivers/net/arm/am79c961a.c b/drivers/net/arm/am79c961a.c
index 8c496fb1ac9e..62f21106efec 100644
--- a/drivers/net/arm/am79c961a.c
+++ b/drivers/net/arm/am79c961a.c
@@ -300,8 +300,6 @@ am79c961_open(struct net_device *dev)
struct dev_priv *priv = netdev_priv(dev);
int ret;
- memset (&priv->stats, 0, sizeof (priv->stats));
-
ret = request_irq(dev->irq, am79c961_interrupt, 0, dev->name, dev);
if (ret)
return ret;
@@ -347,8 +345,7 @@ am79c961_close(struct net_device *dev)
*/
static struct net_device_stats *am79c961_getstats (struct net_device *dev)
{
- struct dev_priv *priv = netdev_priv(dev);
- return &priv->stats;
+ return &dev->stats;
}
static void am79c961_mc_hash(char *addr, unsigned short *hash)
@@ -510,14 +507,14 @@ am79c961_rx(struct net_device *dev, struct dev_priv *priv)
if ((status & (RMD_ERR|RMD_STP|RMD_ENP)) != (RMD_STP|RMD_ENP)) {
am_writeword (dev, hdraddr + 2, RMD_OWN);
- priv->stats.rx_errors ++;
+ dev->stats.rx_errors++;
if (status & RMD_ERR) {
if (status & RMD_FRAM)
- priv->stats.rx_frame_errors ++;
+ dev->stats.rx_frame_errors++;
if (status & RMD_CRC)
- priv->stats.rx_crc_errors ++;
+ dev->stats.rx_crc_errors++;
} else if (status & RMD_STP)
- priv->stats.rx_length_errors ++;
+ dev->stats.rx_length_errors++;
continue;
}
@@ -531,12 +528,12 @@ am79c961_rx(struct net_device *dev, struct dev_priv *priv)
am_writeword(dev, hdraddr + 2, RMD_OWN);
skb->protocol = eth_type_trans(skb, dev);
netif_rx(skb);
- priv->stats.rx_bytes += len;
- priv->stats.rx_packets ++;
+ dev->stats.rx_bytes += len;
+ dev->stats.rx_packets++;
} else {
am_writeword (dev, hdraddr + 2, RMD_OWN);
printk (KERN_WARNING "%s: memory squeeze, dropping packet.\n", dev->name);
- priv->stats.rx_dropped ++;
+ dev->stats.rx_dropped++;
break;
}
} while (1);
@@ -565,7 +562,7 @@ am79c961_tx(struct net_device *dev, struct dev_priv *priv)
if (status & TMD_ERR) {
u_int status2;
- priv->stats.tx_errors ++;
+ dev->stats.tx_errors++;
status2 = am_readword (dev, hdraddr + 6);
@@ -575,18 +572,18 @@ am79c961_tx(struct net_device *dev, struct dev_priv *priv)
am_writeword (dev, hdraddr + 6, 0);
if (status2 & TST_RTRY)
- priv->stats.collisions += 16;
+ dev->stats.collisions += 16;
if (status2 & TST_LCOL)
- priv->stats.tx_window_errors ++;
+ dev->stats.tx_window_errors++;
if (status2 & TST_LCAR)
- priv->stats.tx_carrier_errors ++;
+ dev->stats.tx_carrier_errors++;
if (status2 & TST_UFLO)
- priv->stats.tx_fifo_errors ++;
+ dev->stats.tx_fifo_errors++;
continue;
}
- priv->stats.tx_packets ++;
+ dev->stats.tx_packets++;
len = am_readword (dev, hdraddr + 4);
- priv->stats.tx_bytes += -len;
+ dev->stats.tx_bytes += -len;
} while (priv->txtail != priv->txhead);
netif_wake_queue(dev);
@@ -616,7 +613,7 @@ am79c961_interrupt(int irq, void *dev_id)
}
if (status & CSR0_MISS) {
handled = 1;
- priv->stats.rx_dropped ++;
+ dev->stats.rx_dropped++;
}
if (status & CSR0_CERR) {
handled = 1;
diff --git a/drivers/net/arm/am79c961a.h b/drivers/net/arm/am79c961a.h
index 483009fe6ec2..fd634d32756b 100644
--- a/drivers/net/arm/am79c961a.h
+++ b/drivers/net/arm/am79c961a.h
@@ -130,7 +130,6 @@
#define ISALED0_LNKST 0x8000
struct dev_priv {
- struct net_device_stats stats;
unsigned long rxbuffer[RX_BUFFERS];
unsigned long txbuffer[TX_BUFFERS];
unsigned char txhead;
diff --git a/drivers/net/bmac.c b/drivers/net/bmac.c
index 959add2410bf..9322699bb31c 100644
--- a/drivers/net/bmac.c
+++ b/drivers/net/bmac.c
@@ -1233,15 +1233,8 @@ static void bmac_reset_and_enable(struct net_device *dev)
}
spin_unlock_irqrestore(&bp->lock, flags);
}
-static void bmac_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
-{
- struct bmac_data *bp = netdev_priv(dev);
- strcpy(info->driver, "bmac");
- strcpy(info->bus_info, dev_name(&bp->mdev->ofdev.dev));
-}
static const struct ethtool_ops bmac_ethtool_ops = {
- .get_drvinfo = bmac_get_drvinfo,
.get_link = ethtool_op_get_link,
};
diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c
index 02bf710629a3..da96d1a18c20 100644
--- a/drivers/net/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/bnx2x/bnx2x_cmn.c
@@ -20,6 +20,7 @@
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <net/ip6_checksum.h>
+#include <linux/firmware.h>
#include "bnx2x_cmn.h"
#ifdef BCM_VLAN
@@ -1206,12 +1207,27 @@ static int bnx2x_set_num_queues(struct bnx2x *bp)
return rc;
}
+static void bnx2x_release_firmware(struct bnx2x *bp)
+{
+ kfree(bp->init_ops_offsets);
+ kfree(bp->init_ops);
+ kfree(bp->init_data);
+ release_firmware(bp->firmware);
+}
+
/* must be called with rtnl_lock */
int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
{
u32 load_code;
int i, rc;
+ /* Set init arrays */
+ rc = bnx2x_init_firmware(bp);
+ if (rc) {
+ BNX2X_ERR("Error loading firmware\n");
+ return rc;
+ }
+
#ifdef BNX2X_STOP_ON_ERROR
if (unlikely(bp->panic))
return -EPERM;
@@ -1427,6 +1443,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
#endif
bnx2x_inc_load_cnt(bp);
+ bnx2x_release_firmware(bp);
+
return 0;
#ifdef BCM_CNIC
@@ -1454,6 +1472,8 @@ load_error1:
netif_napi_del(&bnx2x_fp(bp, i, napi));
bnx2x_free_mem(bp);
+ bnx2x_release_firmware(bp);
+
return rc;
}
diff --git a/drivers/net/bnx2x/bnx2x_cmn.h b/drivers/net/bnx2x/bnx2x_cmn.h
index d1979b1a7ed2..32543c32805c 100644
--- a/drivers/net/bnx2x/bnx2x_cmn.h
+++ b/drivers/net/bnx2x/bnx2x_cmn.h
@@ -115,6 +115,15 @@ void bnx2x_int_enable(struct bnx2x *bp);
void bnx2x_int_disable_sync(struct bnx2x *bp, int disable_hw);
/**
+ * Loads device firmware
+ *
+ * @param bp
+ *
+ * @return int
+ */
+int bnx2x_init_firmware(struct bnx2x *bp);
+
+/**
* Init HW blocks according to current initialization stage:
* COMMON, PORT or FUNCTION.
*
diff --git a/drivers/net/bnx2x/bnx2x_link.c b/drivers/net/bnx2x/bnx2x_link.c
index 0383e3066313..0fa09913051d 100644
--- a/drivers/net/bnx2x/bnx2x_link.c
+++ b/drivers/net/bnx2x/bnx2x_link.c
@@ -1254,11 +1254,11 @@ static void bnx2x_set_autoneg(struct link_params *params,
PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)
reg_val |= MDIO_CL73_IEEEB1_AN_ADV2_ADVR_1000M_KX;
- CL45_WR_OVER_CL22(bp, params->port,
- params->phy_addr,
- MDIO_REG_BANK_CL73_IEEEB1,
- MDIO_CL73_IEEEB1_AN_ADV2,
- reg_val);
+ CL45_WR_OVER_CL22(bp, params->port,
+ params->phy_addr,
+ MDIO_REG_BANK_CL73_IEEEB1,
+ MDIO_CL73_IEEEB1_AN_ADV2,
+ reg_val);
/* CL73 Autoneg Enabled */
reg_val = MDIO_CL73_IEEEB0_CL73_AN_CONTROL_AN_EN;
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c
index b4ec2b02a465..13309f1717b9 100644
--- a/drivers/net/bnx2x/bnx2x_main.c
+++ b/drivers/net/bnx2x/bnx2x_main.c
@@ -7254,7 +7254,7 @@ static void __devinit bnx2x_get_pcie_width_speed(struct bnx2x *bp,
*speed = (val & PCICFG_LINK_SPEED) >> PCICFG_LINK_SPEED_SHIFT;
}
-static int __devinit bnx2x_check_firmware(struct bnx2x *bp)
+static int bnx2x_check_firmware(struct bnx2x *bp)
{
const struct firmware *firmware = bp->firmware;
struct bnx2x_fw_file_hdr *fw_hdr;
@@ -7365,7 +7365,7 @@ do { \
(u8 *)bp->arr, len); \
} while (0)
-static int __devinit bnx2x_init_firmware(struct bnx2x *bp, struct device *dev)
+int bnx2x_init_firmware(struct bnx2x *bp)
{
const char *fw_file_name;
struct bnx2x_fw_file_hdr *fw_hdr;
@@ -7376,21 +7376,21 @@ static int __devinit bnx2x_init_firmware(struct bnx2x *bp, struct device *dev)
else if (CHIP_IS_E1H(bp))
fw_file_name = FW_FILE_NAME_E1H;
else {
- dev_err(dev, "Unsupported chip revision\n");
+ BNX2X_ERR("Unsupported chip revision\n");
return -EINVAL;
}
- dev_info(dev, "Loading %s\n", fw_file_name);
+ BNX2X_DEV_INFO("Loading %s\n", fw_file_name);
- rc = request_firmware(&bp->firmware, fw_file_name, dev);
+ rc = request_firmware(&bp->firmware, fw_file_name, &bp->pdev->dev);
if (rc) {
- dev_err(dev, "Can't load firmware file %s\n", fw_file_name);
+ BNX2X_ERR("Can't load firmware file %s\n", fw_file_name);
goto request_firmware_exit;
}
rc = bnx2x_check_firmware(bp);
if (rc) {
- dev_err(dev, "Corrupt firmware file %s\n", fw_file_name);
+ BNX2X_ERR("Corrupt firmware file %s\n", fw_file_name);
goto request_firmware_exit;
}
@@ -7468,13 +7468,6 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev,
if (rc)
goto init_one_exit;
- /* Set init arrays */
- rc = bnx2x_init_firmware(bp, &pdev->dev);
- if (rc) {
- dev_err(&pdev->dev, "Error loading firmware\n");
- goto init_one_exit;
- }
-
rc = register_netdev(dev);
if (rc) {
dev_err(&pdev->dev, "Cannot register net device\n");
@@ -7525,11 +7518,6 @@ static void __devexit bnx2x_remove_one(struct pci_dev *pdev)
/* Make sure RESET task is not scheduled before continuing */
cancel_delayed_work_sync(&bp->reset_task);
- kfree(bp->init_ops_offsets);
- kfree(bp->init_ops);
- kfree(bp->init_data);
- release_firmware(bp->firmware);
-
if (bp->regview)
iounmap(bp->regview);
diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c
index 09610323a948..2ab6a7c4ffc1 100644
--- a/drivers/net/cnic.c
+++ b/drivers/net/cnic.c
@@ -1022,7 +1022,7 @@ static int cnic_alloc_bnx2x_context(struct cnic_dev *dev)
if (blks > cp->ethdev->ctx_tbl_len)
return -ENOMEM;
- cp->ctx_arr = kzalloc(blks * sizeof(struct cnic_ctx), GFP_KERNEL);
+ cp->ctx_arr = kcalloc(blks, sizeof(struct cnic_ctx), GFP_KERNEL);
if (cp->ctx_arr == NULL)
return -ENOMEM;
diff --git a/drivers/net/cpmac.c b/drivers/net/cpmac.c
index e1f6156b3710..8e142aaa05d4 100644
--- a/drivers/net/cpmac.c
+++ b/drivers/net/cpmac.c
@@ -38,7 +38,7 @@
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
#include <linux/clk.h>
-#include <asm/gpio.h>
+#include <linux/gpio.h>
#include <asm/atomic.h>
MODULE_AUTHOR("Eugene Konev <ejka@imfi.kspu.ru>");
@@ -108,7 +108,7 @@ MODULE_PARM_DESC(dumb_switch, "Assume switch is not connected to MDIO bus");
#define CPMAC_RX_INT_CLEAR 0x019c
#define CPMAC_MAC_INT_ENABLE 0x01a8
#define CPMAC_MAC_INT_CLEAR 0x01ac
-#define CPMAC_MAC_ADDR_LO(channel) (0x01b0 + (channel) * 4)
+#define CPMAC_MAC_ADDR_LO(channel) (0x01b0 + (channel) * 4)
#define CPMAC_MAC_ADDR_MID 0x01d0
#define CPMAC_MAC_ADDR_HI 0x01d4
#define CPMAC_MAC_HASH_LO 0x01d8
@@ -227,7 +227,7 @@ static void cpmac_dump_regs(struct net_device *dev)
for (i = 0; i < CPMAC_REG_END; i += 4) {
if (i % 16 == 0) {
if (i)
- printk("\n");
+ pr_cont("\n");
printk(KERN_DEBUG "%s: reg[%p]:", dev->name,
priv->regs + i);
}
@@ -262,7 +262,7 @@ static void cpmac_dump_skb(struct net_device *dev, struct sk_buff *skb)
for (i = 0; i < skb->len; i++) {
if (i % 16 == 0) {
if (i)
- printk("\n");
+ pr_cont("\n");
printk(KERN_DEBUG "%s: data[%p]:", dev->name,
skb->data + i);
}
@@ -506,7 +506,7 @@ static int cpmac_poll(struct napi_struct *napi, int budget)
"restart rx from a descriptor that's "
"not free: %p\n",
priv->dev->name, restart);
- goto fatal_error;
+ goto fatal_error;
}
cpmac_write(priv->regs, CPMAC_RX_PTR(0), restart->mapping);
@@ -873,7 +873,8 @@ static int cpmac_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
return -EINVAL;
}
-static void cpmac_get_ringparam(struct net_device *dev, struct ethtool_ringparam* ring)
+static void cpmac_get_ringparam(struct net_device *dev,
+ struct ethtool_ringparam *ring)
{
struct cpmac_priv *priv = netdev_priv(dev);
@@ -888,7 +889,8 @@ static void cpmac_get_ringparam(struct net_device *dev, struct ethtool_ringparam
ring->tx_pending = 1;
}
-static int cpmac_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ring)
+static int cpmac_set_ringparam(struct net_device *dev,
+ struct ethtool_ringparam *ring)
{
struct cpmac_priv *priv = netdev_priv(dev);
@@ -1012,8 +1014,8 @@ static int cpmac_open(struct net_device *dev)
priv->rx_head->prev->hw_next = (u32)0;
- if ((res = request_irq(dev->irq, cpmac_irq, IRQF_SHARED,
- dev->name, dev))) {
+ res = request_irq(dev->irq, cpmac_irq, IRQF_SHARED, dev->name, dev);
+ if (res) {
if (netif_msg_drv(priv))
printk(KERN_ERR "%s: failed to obtain irq\n",
dev->name);
@@ -1133,7 +1135,8 @@ static int __devinit cpmac_probe(struct platform_device *pdev)
}
if (phy_id == PHY_MAX_ADDR) {
- dev_err(&pdev->dev, "no PHY present, falling back to switch on MDIO bus 0\n");
+ dev_err(&pdev->dev, "no PHY present, falling back "
+ "to switch on MDIO bus 0\n");
strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); /* fixed phys bus */
phy_id = pdev->id;
}
@@ -1169,7 +1172,8 @@ static int __devinit cpmac_probe(struct platform_device *pdev)
priv->msg_enable = netif_msg_init(debug_level, 0xff);
memcpy(dev->dev_addr, pdata->dev_addr, sizeof(pdata->dev_addr));
- snprintf(priv->phy_name, MII_BUS_ID_SIZE, PHY_ID_FMT, mdio_bus_id, phy_id);
+ snprintf(priv->phy_name, MII_BUS_ID_SIZE, PHY_ID_FMT,
+ mdio_bus_id, phy_id);
priv->phy = phy_connect(dev, priv->phy_name, &cpmac_adjust_link, 0,
PHY_INTERFACE_MODE_MII);
@@ -1182,7 +1186,8 @@ static int __devinit cpmac_probe(struct platform_device *pdev)
goto fail;
}
- if ((rc = register_netdev(dev))) {
+ rc = register_netdev(dev);
+ if (rc) {
printk(KERN_ERR "cpmac: error %i registering device %s\n", rc,
dev->name);
goto fail;
@@ -1248,11 +1253,13 @@ int __devinit cpmac_init(void)
cpmac_mii->reset(cpmac_mii);
- for (i = 0; i < 300; i++)
- if ((mask = cpmac_read(cpmac_mii->priv, CPMAC_MDIO_ALIVE)))
+ for (i = 0; i < 300; i++) {
+ mask = cpmac_read(cpmac_mii->priv, CPMAC_MDIO_ALIVE);
+ if (mask)
break;
else
msleep(10);
+ }
mask &= 0x7fffffff;
if (mask & (mask - 1)) {
diff --git a/drivers/net/depca.c b/drivers/net/depca.c
index 44c0694c1f4e..91b3846ffc8a 100644
--- a/drivers/net/depca.c
+++ b/drivers/net/depca.c
@@ -1487,7 +1487,7 @@ static void __init depca_platform_probe (void)
if (!pldev->dev.driver) {
/* The driver was not bound to this device, there was
* no hardware at this address. Unregister it, as the
- * release fuction will take care of freeing the
+ * release function will take care of freeing the
* allocated structure */
depca_io_ports[i].device = NULL;
diff --git a/drivers/net/eepro.c b/drivers/net/eepro.c
index 8d97f168f018..7c826319ee5a 100644
--- a/drivers/net/eepro.c
+++ b/drivers/net/eepro.c
@@ -1457,11 +1457,11 @@ hardware_send_packet(struct net_device *dev, void *buf, short length)
if (net_debug > 5)
printk(KERN_DEBUG "%s: entering hardware_send_packet routine.\n", dev->name);
- /* determine how much of the transmit buffer space is available */
- if (lp->tx_end > lp->tx_start)
+ /* determine how much of the transmit buffer space is available */
+ if (lp->tx_end > lp->tx_start)
tx_available = lp->xmt_ram - (lp->tx_end - lp->tx_start);
- else if (lp->tx_end < lp->tx_start)
- tx_available = lp->tx_start - lp->tx_end;
+ else if (lp->tx_end < lp->tx_start)
+ tx_available = lp->tx_start - lp->tx_end;
else tx_available = lp->xmt_ram;
if (((((length + 3) >> 1) << 1) + 2*XMT_HEADER) >= tx_available) {
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c
index 897719b49f96..0f9b27b93a71 100644
--- a/drivers/net/ehea/ehea_main.c
+++ b/drivers/net/ehea/ehea_main.c
@@ -180,7 +180,7 @@ static void ehea_update_firmware_handles(void)
num_portres * EHEA_NUM_PORTRES_FW_HANDLES;
if (num_fw_handles) {
- arr = kzalloc(num_fw_handles * sizeof(*arr), GFP_KERNEL);
+ arr = kcalloc(num_fw_handles, sizeof(*arr), GFP_KERNEL);
if (!arr)
goto out; /* Keep the existing array */
} else
@@ -265,7 +265,7 @@ static void ehea_update_bcmc_registrations(void)
}
if (num_registrations) {
- arr = kzalloc(num_registrations * sizeof(*arr), GFP_ATOMIC);
+ arr = kcalloc(num_registrations, sizeof(*arr), GFP_ATOMIC);
if (!arr)
goto out; /* Keep the existing array */
} else
diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h
index f239aa8c6f4c..75869ed7226f 100644
--- a/drivers/net/enic/enic.h
+++ b/drivers/net/enic/enic.h
@@ -32,7 +32,7 @@
#define DRV_NAME "enic"
#define DRV_DESCRIPTION "Cisco VIC Ethernet NIC Driver"
-#define DRV_VERSION "1.4.1.1"
+#define DRV_VERSION "1.4.1.2"
#define DRV_COPYRIGHT "Copyright 2008-2010 Cisco Systems, Inc"
#define ENIC_BARS_MAX 6
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index 9aab85366d21..711077a2e345 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -911,7 +911,9 @@ static int enic_set_mac_address_dynamic(struct net_device *netdev, void *p)
static int enic_set_mac_address(struct net_device *netdev, void *p)
{
- return -EOPNOTSUPP;
+ struct sockaddr *saddr = p;
+
+ return enic_set_mac_addr(netdev, (char *)saddr->sa_data);
}
static int enic_dev_packet_filter(struct enic *enic, int directed,
@@ -2152,17 +2154,6 @@ void enic_dev_deinit(struct enic *enic)
enic_clear_intr_mode(enic);
}
-static int enic_dev_stats_clear(struct enic *enic)
-{
- int err;
-
- spin_lock(&enic->devcmd_lock);
- err = vnic_dev_stats_clear(enic->vdev);
- spin_unlock(&enic->devcmd_lock);
-
- return err;
-}
-
int enic_dev_init(struct enic *enic)
{
struct device *dev = enic_get_dev(enic);
@@ -2205,10 +2196,6 @@ int enic_dev_init(struct enic *enic)
enic_init_vnic_resources(enic);
- /* Clear LIF stats
- */
- enic_dev_stats_clear(enic);
-
err = enic_set_rq_alloc_buf(enic);
if (err) {
dev_err(dev, "Failed to set RQ buffer allocator, aborting\n");
diff --git a/drivers/net/enic/vnic_dev.c b/drivers/net/enic/vnic_dev.c
index 6a5b578a69e1..08d5d42da260 100644
--- a/drivers/net/enic/vnic_dev.c
+++ b/drivers/net/enic/vnic_dev.c
@@ -74,6 +74,7 @@ static int vnic_dev_discover_res(struct vnic_dev *vdev,
struct vnic_dev_bar *bar, unsigned int num_bars)
{
struct vnic_resource_header __iomem *rh;
+ struct mgmt_barmap_hdr __iomem *mrh;
struct vnic_resource __iomem *r;
u8 type;
@@ -85,22 +86,32 @@ static int vnic_dev_discover_res(struct vnic_dev *vdev,
return -EINVAL;
}
- rh = bar->vaddr;
+ rh = bar->vaddr;
+ mrh = bar->vaddr;
if (!rh) {
pr_err("vNIC BAR0 res hdr not mem-mapped\n");
return -EINVAL;
}
- if (ioread32(&rh->magic) != VNIC_RES_MAGIC ||
- ioread32(&rh->version) != VNIC_RES_VERSION) {
- pr_err("vNIC BAR0 res magic/version error "
- "exp (%lx/%lx) curr (%x/%x)\n",
+ /* Check for mgmt vnic in addition to normal vnic */
+ if ((ioread32(&rh->magic) != VNIC_RES_MAGIC) ||
+ (ioread32(&rh->version) != VNIC_RES_VERSION)) {
+ if ((ioread32(&mrh->magic) != MGMTVNIC_MAGIC) ||
+ (ioread32(&mrh->version) != MGMTVNIC_VERSION)) {
+ pr_err("vNIC BAR0 res magic/version error "
+ "exp (%lx/%lx) or (%lx/%lx), curr (%x/%x)\n",
VNIC_RES_MAGIC, VNIC_RES_VERSION,
+ MGMTVNIC_MAGIC, MGMTVNIC_VERSION,
ioread32(&rh->magic), ioread32(&rh->version));
- return -EINVAL;
+ return -EINVAL;
+ }
}
- r = (struct vnic_resource __iomem *)(rh + 1);
+ if (ioread32(&mrh->magic) == MGMTVNIC_MAGIC)
+ r = (struct vnic_resource __iomem *)(mrh + 1);
+ else
+ r = (struct vnic_resource __iomem *)(rh + 1);
+
while ((type = ioread8(&r->type)) != RES_TYPE_EOL) {
diff --git a/drivers/net/enic/vnic_devcmd.h b/drivers/net/enic/vnic_devcmd.h
index 20661755df6b..9abb3d51dea1 100644
--- a/drivers/net/enic/vnic_devcmd.h
+++ b/drivers/net/enic/vnic_devcmd.h
@@ -238,6 +238,18 @@ enum vnic_devcmd_cmd {
* out: (u32)a0=status of proxied cmd
* a1-a15=out args of proxied cmd */
CMD_PROXY_BY_BDF = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 42),
+
+ /*
+ * As for BY_BDF except a0 is index of hvnlink subordinate vnic
+ * or SR-IOV virtual vnic */
+ CMD_PROXY_BY_INDEX = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 43),
+
+ /*
+ * in: (u64)a0=paddr of buffer to put latest VIC VIF-CONFIG-INFO TLV in
+ * (u32)a1=length of buffer in a0
+ * out: (u64)a0=paddr of buffer with latest VIC VIF-CONFIG-INFO TLV
+ * (u32)a1=actual length of latest VIC VIF-CONFIG-INFO TLV */
+ CMD_CONFIG_INFO_GET = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 44),
};
/* flags for CMD_OPEN */
diff --git a/drivers/net/enic/vnic_enet.h b/drivers/net/enic/vnic_enet.h
index 3b3291248956..e8740e3704e4 100644
--- a/drivers/net/enic/vnic_enet.h
+++ b/drivers/net/enic/vnic_enet.h
@@ -30,7 +30,7 @@ struct vnic_enet_config {
u32 wq_desc_count;
u32 rq_desc_count;
u16 mtu;
- u16 intr_timer;
+ u16 intr_timer_deprecated;
u8 intr_timer_type;
u8 intr_mode;
char devname[16];
diff --git a/drivers/net/enic/vnic_resource.h b/drivers/net/enic/vnic_resource.h
index 810287beff14..e0a73f1ca6f4 100644
--- a/drivers/net/enic/vnic_resource.h
+++ b/drivers/net/enic/vnic_resource.h
@@ -22,6 +22,11 @@
#define VNIC_RES_MAGIC 0x766E6963L /* 'vnic' */
#define VNIC_RES_VERSION 0x00000000L
+#define MGMTVNIC_MAGIC 0x544d474dL /* 'MGMT' */
+#define MGMTVNIC_VERSION 0x00000000L
+
+/* The MAC address assigned to the CFG vNIC is fixed. */
+#define MGMTVNIC_MAC { 0x02, 0x00, 0x54, 0x4d, 0x47, 0x4d }
/* vNIC resource types */
enum vnic_res_type {
@@ -52,6 +57,14 @@ struct vnic_resource_header {
u32 version;
};
+struct mgmt_barmap_hdr {
+ u32 magic; /* magic number */
+ u32 version; /* header format version */
+ u16 lif; /* loopback lif for mgmt frames */
+ u16 pci_slot; /* installed pci slot */
+ char serial[16]; /* card serial number */
+};
+
struct vnic_resource {
u8 type;
u8 bar;
diff --git a/drivers/net/enic/vnic_rq.c b/drivers/net/enic/vnic_rq.c
index dbb2aca258b9..b236d7cbc137 100644
--- a/drivers/net/enic/vnic_rq.c
+++ b/drivers/net/enic/vnic_rq.c
@@ -77,8 +77,10 @@ void vnic_rq_free(struct vnic_rq *rq)
vnic_dev_free_desc_ring(vdev, &rq->ring);
for (i = 0; i < VNIC_RQ_BUF_BLKS_MAX; i++) {
- kfree(rq->bufs[i]);
- rq->bufs[i] = NULL;
+ if (rq->bufs[i]) {
+ kfree(rq->bufs[i]);
+ rq->bufs[i] = NULL;
+ }
}
rq->ctrl = NULL;
diff --git a/drivers/net/enic/vnic_vic.c b/drivers/net/enic/vnic_vic.c
index 197c9d24af82..4725b79de0ef 100644
--- a/drivers/net/enic/vnic_vic.c
+++ b/drivers/net/enic/vnic_vic.c
@@ -54,8 +54,8 @@ int vic_provinfo_add_tlv(struct vic_provinfo *vp, u16 type, u16 length,
if (!vp || !value)
return -EINVAL;
- if (ntohl(vp->length) + sizeof(*tlv) + length >
- VIC_PROVINFO_MAX_TLV_DATA)
+ if (ntohl(vp->length) + offsetof(struct vic_provinfo_tlv, value) +
+ length > VIC_PROVINFO_MAX_TLV_DATA)
return -ENOMEM;
tlv = (struct vic_provinfo_tlv *)((u8 *)vp->tlv +
@@ -66,7 +66,8 @@ int vic_provinfo_add_tlv(struct vic_provinfo *vp, u16 type, u16 length,
memcpy(tlv->value, value, length);
vp->num_tlvs = htonl(ntohl(vp->num_tlvs) + 1);
- vp->length = htonl(ntohl(vp->length) + sizeof(*tlv) + length);
+ vp->length = htonl(ntohl(vp->length) +
+ offsetof(struct vic_provinfo_tlv, value) + length);
return 0;
}
diff --git a/drivers/net/enic/vnic_wq.c b/drivers/net/enic/vnic_wq.c
index 122e33bcc578..4b2a6c6a569b 100644
--- a/drivers/net/enic/vnic_wq.c
+++ b/drivers/net/enic/vnic_wq.c
@@ -77,8 +77,10 @@ void vnic_wq_free(struct vnic_wq *wq)
vnic_dev_free_desc_ring(vdev, &wq->ring);
for (i = 0; i < VNIC_WQ_BUF_BLKS_MAX; i++) {
- kfree(wq->bufs[i]);
- wq->bufs[i] = NULL;
+ if (wq->bufs[i]) {
+ kfree(wq->bufs[i]);
+ wq->bufs[i] = NULL;
+ }
}
wq->ctrl = NULL;
diff --git a/drivers/net/fec_mpc52xx.c b/drivers/net/fec_mpc52xx.c
index e3e10b4add9c..e9f5d030bc26 100644
--- a/drivers/net/fec_mpc52xx.c
+++ b/drivers/net/fec_mpc52xx.c
@@ -771,11 +771,6 @@ static void mpc52xx_fec_reset(struct net_device *dev)
/* ethtool interface */
-static void mpc52xx_fec_get_drvinfo(struct net_device *dev,
- struct ethtool_drvinfo *info)
-{
- strcpy(info->driver, DRIVER_NAME);
-}
static int mpc52xx_fec_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
{
@@ -810,7 +805,6 @@ static void mpc52xx_fec_set_msglevel(struct net_device *dev, u32 level)
}
static const struct ethtool_ops mpc52xx_fec_ethtool_ops = {
- .get_drvinfo = mpc52xx_fec_get_drvinfo,
.get_settings = mpc52xx_fec_get_settings,
.set_settings = mpc52xx_fec_set_settings,
.get_link = ethtool_op_get_link,
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c
index 4f7c3f3ca234..3d9f958ebd2c 100644
--- a/drivers/net/gianfar.c
+++ b/drivers/net/gianfar.c
@@ -1859,7 +1859,7 @@ static int register_grp_irqs(struct gfar_priv_grp *grp)
printk(KERN_ERR "%s: Can't get IRQ %d\n",
dev->name, grp->interruptError);
- goto err_irq_fail;
+ goto err_irq_fail;
}
if ((err = request_irq(grp->interruptTransmit, gfar_transmit,
diff --git a/drivers/net/hamradio/scc.c b/drivers/net/hamradio/scc.c
index 9f64c8637208..33655814448e 100644
--- a/drivers/net/hamradio/scc.c
+++ b/drivers/net/hamradio/scc.c
@@ -1069,7 +1069,8 @@ static void scc_tx_done(struct scc_channel *scc)
case KISS_DUPLEX_LINK:
scc->stat.tx_state = TXS_IDLE2;
if (scc->kiss.idletime != TIMER_OFF)
- scc_start_tx_timer(scc, t_idle, scc->kiss.idletime*100);
+ scc_start_tx_timer(scc, t_idle,
+ scc->kiss.idletime*100);
break;
case KISS_DUPLEX_OPTIMA:
scc_notify(scc, HWEV_ALL_SENT);
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
index 9b4e5895f5f9..aaf506c56ccb 100644
--- a/drivers/net/igb/igb_main.c
+++ b/drivers/net/igb/igb_main.c
@@ -3527,7 +3527,7 @@ enum latency_range {
* Stores a new ITR value based on strictly on packet size. This
* algorithm is less sophisticated than that used in igb_update_itr,
* due to the difficulty of synchronizing statistics across multiple
- * receive rings. The divisors and thresholds used by this fuction
+ * receive rings. The divisors and thresholds used by this function
* were determined based on theoretical maximum wire speed and testing
* data, in order to minimize response time while increasing bulk
* throughput.
diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c
index 4441fa3389c2..e4e71f32746b 100644
--- a/drivers/net/irda/irda-usb.c
+++ b/drivers/net/irda/irda-usb.c
@@ -1124,11 +1124,12 @@ static int stir421x_patch_device(struct irda_usb_cb *self)
* The actual image starts after the "STMP" keyword
* so forward to the firmware header tag
*/
- for (i = 0; (fw->data[i] != STIR421X_PATCH_END_OF_HDR_TAG) &&
- (i < fw->size); i++) ;
+ for (i = 0; i < fw->size && fw->data[i] !=
+ STIR421X_PATCH_END_OF_HDR_TAG; i++)
+ ;
/* here we check for the out of buffer case */
- if ((STIR421X_PATCH_END_OF_HDR_TAG == fw->data[i]) &&
- (i < STIR421X_PATCH_CODE_OFFSET)) {
+ if (i < STIR421X_PATCH_CODE_OFFSET && i < fw->size &&
+ STIR421X_PATCH_END_OF_HDR_TAG == fw->data[i]) {
if (!memcmp(fw->data + i + 1, STIR421X_PATCH_STMP_TAG,
sizeof(STIR421X_PATCH_STMP_TAG) - 1)) {
diff --git a/drivers/net/irda/mcs7780.c b/drivers/net/irda/mcs7780.c
index 5b1036ac38d7..74b20f179cea 100644
--- a/drivers/net/irda/mcs7780.c
+++ b/drivers/net/irda/mcs7780.c
@@ -734,7 +734,7 @@ static int mcs_net_open(struct net_device *netdev)
}
if (!mcs_setup_urbs(mcs))
- goto error3;
+ goto error3;
ret = mcs_receive_start(mcs);
if (ret)
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index 3b1c54a9c6ef..42567279843e 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -84,26 +84,45 @@ static const struct proto_ops macvtap_socket_ops;
static DEFINE_SPINLOCK(macvtap_lock);
/*
- * Choose the next free queue, for now there is only one
+ * get_slot: return a [unused/occupied] slot in vlan->taps[]:
+ * - if 'q' is NULL, return the first empty slot;
+ * - otherwise, return the slot this pointer occupies.
*/
+static int get_slot(struct macvlan_dev *vlan, struct macvtap_queue *q)
+{
+ int i;
+
+ for (i = 0; i < MAX_MACVTAP_QUEUES; i++) {
+ if (rcu_dereference(vlan->taps[i]) == q)
+ return i;
+ }
+
+ /* Should never happen */
+ BUG_ON(1);
+}
+
static int macvtap_set_queue(struct net_device *dev, struct file *file,
struct macvtap_queue *q)
{
struct macvlan_dev *vlan = netdev_priv(dev);
+ int index;
int err = -EBUSY;
spin_lock(&macvtap_lock);
- if (rcu_dereference(vlan->tap))
+ if (vlan->numvtaps == MAX_MACVTAP_QUEUES)
goto out;
err = 0;
+ index = get_slot(vlan, NULL);
rcu_assign_pointer(q->vlan, vlan);
- rcu_assign_pointer(vlan->tap, q);
+ rcu_assign_pointer(vlan->taps[index], q);
sock_hold(&q->sk);
q->file = file;
file->private_data = q;
+ vlan->numvtaps++;
+
out:
spin_unlock(&macvtap_lock);
return err;
@@ -124,9 +143,12 @@ static void macvtap_put_queue(struct macvtap_queue *q)
spin_lock(&macvtap_lock);
vlan = rcu_dereference(q->vlan);
if (vlan) {
- rcu_assign_pointer(vlan->tap, NULL);
+ int index = get_slot(vlan, q);
+
+ rcu_assign_pointer(vlan->taps[index], NULL);
rcu_assign_pointer(q->vlan, NULL);
sock_put(&q->sk);
+ --vlan->numvtaps;
}
spin_unlock(&macvtap_lock);
@@ -136,39 +158,82 @@ static void macvtap_put_queue(struct macvtap_queue *q)
}
/*
- * Since we only support one queue, just dereference the pointer.
+ * Select a queue based on the rxq of the device on which this packet
+ * arrived. If the incoming device is not mq, calculate a flow hash
+ * to select a queue. If all fails, find the first available queue.
+ * Cache vlan->numvtaps since it can become zero during the execution
+ * of this function.
*/
static struct macvtap_queue *macvtap_get_queue(struct net_device *dev,
struct sk_buff *skb)
{
struct macvlan_dev *vlan = netdev_priv(dev);
+ struct macvtap_queue *tap = NULL;
+ int numvtaps = vlan->numvtaps;
+ __u32 rxq;
+
+ if (!numvtaps)
+ goto out;
+
+ if (likely(skb_rx_queue_recorded(skb))) {
+ rxq = skb_get_rx_queue(skb);
+
+ while (unlikely(rxq >= numvtaps))
+ rxq -= numvtaps;
+
+ tap = rcu_dereference(vlan->taps[rxq]);
+ if (tap)
+ goto out;
+ }
+
+ /* Check if we can use flow to select a queue */
+ rxq = skb_get_rxhash(skb);
+ if (rxq) {
+ tap = rcu_dereference(vlan->taps[rxq % numvtaps]);
+ if (tap)
+ goto out;
+ }
- return rcu_dereference(vlan->tap);
+ /* Everything failed - find first available queue */
+ for (rxq = 0; rxq < MAX_MACVTAP_QUEUES; rxq++) {
+ tap = rcu_dereference(vlan->taps[rxq]);
+ if (tap)
+ break;
+ }
+
+out:
+ return tap;
}
/*
* The net_device is going away, give up the reference
- * that it holds on the queue (all the queues one day)
- * and safely set the pointer from the queues to NULL.
+ * that it holds on all queues and safely set the pointer
+ * from the queues to NULL.
*/
static void macvtap_del_queues(struct net_device *dev)
{
struct macvlan_dev *vlan = netdev_priv(dev);
- struct macvtap_queue *q;
+ struct macvtap_queue *q, *qlist[MAX_MACVTAP_QUEUES];
+ int i, j = 0;
+ /* macvtap_put_queue can free some slots, so go through all slots */
spin_lock(&macvtap_lock);
- q = rcu_dereference(vlan->tap);
- if (!q) {
- spin_unlock(&macvtap_lock);
- return;
+ for (i = 0; i < MAX_MACVTAP_QUEUES && vlan->numvtaps; i++) {
+ q = rcu_dereference(vlan->taps[i]);
+ if (q) {
+ qlist[j++] = q;
+ rcu_assign_pointer(vlan->taps[i], NULL);
+ rcu_assign_pointer(q->vlan, NULL);
+ vlan->numvtaps--;
+ }
}
-
- rcu_assign_pointer(vlan->tap, NULL);
- rcu_assign_pointer(q->vlan, NULL);
+ BUG_ON(vlan->numvtaps != 0);
spin_unlock(&macvtap_lock);
synchronize_rcu();
- sock_put(&q->sk);
+
+ for (--j; j >= 0; j--)
+ sock_put(&qlist[j]->sk);
}
/*
diff --git a/drivers/net/mlx4/alloc.c b/drivers/net/mlx4/alloc.c
index 8c8515619b8e..537997f9443e 100644
--- a/drivers/net/mlx4/alloc.c
+++ b/drivers/net/mlx4/alloc.c
@@ -188,7 +188,7 @@ int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct,
buf->nbufs = (size + PAGE_SIZE - 1) / PAGE_SIZE;
buf->npages = buf->nbufs;
buf->page_shift = PAGE_SHIFT;
- buf->page_list = kzalloc(buf->nbufs * sizeof *buf->page_list,
+ buf->page_list = kcalloc(buf->nbufs, sizeof(*buf->page_list),
GFP_KERNEL);
if (!buf->page_list)
return -ENOMEM;
diff --git a/drivers/net/mlx4/en_rx.c b/drivers/net/mlx4/en_rx.c
index 8e2fcb7103c3..efc3fad468db 100644
--- a/drivers/net/mlx4/en_rx.c
+++ b/drivers/net/mlx4/en_rx.c
@@ -322,7 +322,7 @@ int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
ring->lro.ip_summed_aggr = CHECKSUM_UNNECESSARY;
ring->lro.max_desc = mdev->profile.num_lro;
ring->lro.max_aggr = MAX_SKB_FRAGS;
- ring->lro.lro_arr = kzalloc(mdev->profile.num_lro *
+ ring->lro.lro_arr = kcalloc(mdev->profile.num_lro,
sizeof(struct net_lro_desc),
GFP_KERNEL);
if (!ring->lro.lro_arr) {
diff --git a/drivers/net/mlx4/profile.c b/drivers/net/mlx4/profile.c
index 5caf0115fa5b..e749f82865fe 100644
--- a/drivers/net/mlx4/profile.c
+++ b/drivers/net/mlx4/profile.c
@@ -85,7 +85,7 @@ u64 mlx4_make_profile(struct mlx4_dev *dev,
struct mlx4_resource tmp;
int i, j;
- profile = kzalloc(MLX4_RES_NUM * sizeof *profile, GFP_KERNEL);
+ profile = kcalloc(MLX4_RES_NUM, sizeof(*profile), GFP_KERNEL);
if (!profile)
return -ENOMEM;
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c
index fb2c0927d3cc..24ab8a43c777 100644
--- a/drivers/net/myri10ge/myri10ge.c
+++ b/drivers/net/myri10ge/myri10ge.c
@@ -3753,8 +3753,8 @@ static void myri10ge_probe_slices(struct myri10ge_priv *mgp)
* slices. We give up on MSI-X if we can only get a single
* vector. */
- mgp->msix_vectors = kzalloc(mgp->num_slices *
- sizeof(*mgp->msix_vectors), GFP_KERNEL);
+ mgp->msix_vectors = kcalloc(mgp->num_slices, sizeof(*mgp->msix_vectors),
+ GFP_KERNEL);
if (mgp->msix_vectors == NULL)
goto disable_msix;
for (i = 0; i < mgp->num_slices; i++) {
diff --git a/drivers/net/niu.c b/drivers/net/niu.c
index bc695d53cdcc..b4cc61f1fc59 100644
--- a/drivers/net/niu.c
+++ b/drivers/net/niu.c
@@ -4504,7 +4504,7 @@ static int niu_alloc_channels(struct niu *np)
np->dev->real_num_tx_queues = np->num_tx_rings;
- np->rx_rings = kzalloc(np->num_rx_rings * sizeof(struct rx_ring_info),
+ np->rx_rings = kcalloc(np->num_rx_rings, sizeof(struct rx_ring_info),
GFP_KERNEL);
err = -ENOMEM;
if (!np->rx_rings)
@@ -4538,7 +4538,7 @@ static int niu_alloc_channels(struct niu *np)
return err;
}
- np->tx_rings = kzalloc(np->num_tx_rings * sizeof(struct tx_ring_info),
+ np->tx_rings = kcalloc(np->num_tx_rings, sizeof(struct tx_ring_info),
GFP_KERNEL);
err = -ENOMEM;
if (!np->tx_rings)
diff --git a/drivers/net/pasemi_mac_ethtool.c b/drivers/net/pasemi_mac_ethtool.c
index fefa79e34b95..4825959a0efe 100644
--- a/drivers/net/pasemi_mac_ethtool.c
+++ b/drivers/net/pasemi_mac_ethtool.c
@@ -90,21 +90,6 @@ pasemi_mac_ethtool_set_settings(struct net_device *netdev,
return phy_ethtool_sset(phydev, cmd);
}
-static void
-pasemi_mac_ethtool_get_drvinfo(struct net_device *netdev,
- struct ethtool_drvinfo *drvinfo)
-{
- struct pasemi_mac *mac;
- mac = netdev_priv(netdev);
-
- /* clear and fill out info */
- memset(drvinfo, 0, sizeof(struct ethtool_drvinfo));
- strncpy(drvinfo->driver, "pasemi_mac", 12);
- strcpy(drvinfo->version, "N/A");
- strcpy(drvinfo->fw_version, "N/A");
- strncpy(drvinfo->bus_info, pci_name(mac->pdev), 32);
-}
-
static u32
pasemi_mac_ethtool_get_msglevel(struct net_device *netdev)
{
@@ -164,7 +149,6 @@ static void pasemi_mac_get_strings(struct net_device *netdev, u32 stringset,
const struct ethtool_ops pasemi_mac_ethtool_ops = {
.get_settings = pasemi_mac_ethtool_get_settings,
.set_settings = pasemi_mac_ethtool_set_settings,
- .get_drvinfo = pasemi_mac_ethtool_get_drvinfo,
.get_msglevel = pasemi_mac_ethtool_get_msglevel,
.set_msglevel = pasemi_mac_ethtool_set_msglevel,
.get_link = ethtool_op_get_link,
diff --git a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c
index c683f77c6f42..9a1840b67e78 100644
--- a/drivers/net/pcmcia/3c574_cs.c
+++ b/drivers/net/pcmcia/3c574_cs.c
@@ -83,7 +83,6 @@ earlier 3Com products.
#include <linux/skbuff.h>
#include <linux/if_arp.h>
#include <linux/ioport.h>
-#include <linux/ethtool.h>
#include <linux/bitops.h>
#include <linux/mii.h>
@@ -238,7 +237,6 @@ static int el3_rx(struct net_device *dev, int worklimit);
static int el3_close(struct net_device *dev);
static void el3_tx_timeout(struct net_device *dev);
static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
-static const struct ethtool_ops netdev_ethtool_ops;
static void set_rx_mode(struct net_device *dev);
static void set_multicast_list(struct net_device *dev);
@@ -285,7 +283,6 @@ static int tc574_probe(struct pcmcia_device *link)
link->conf.ConfigIndex = 1;
dev->netdev_ops = &el3_netdev_ops;
- SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
dev->watchdog_timeo = TX_TIMEOUT;
return tc574_config(link);
@@ -1065,16 +1062,6 @@ static int el3_rx(struct net_device *dev, int worklimit)
return worklimit;
}
-static void netdev_get_drvinfo(struct net_device *dev,
- struct ethtool_drvinfo *info)
-{
- strcpy(info->driver, "3c574_cs");
-}
-
-static const struct ethtool_ops netdev_ethtool_ops = {
- .get_drvinfo = netdev_get_drvinfo,
-};
-
/* Provide ioctl() calls to examine the MII xcvr state. */
static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
{
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c
index 5f05ffb240cc..a6e37b29e3bf 100644
--- a/drivers/net/pcmcia/axnet_cs.c
+++ b/drivers/net/pcmcia/axnet_cs.c
@@ -32,7 +32,6 @@
#include <linux/timer.h>
#include <linux/delay.h>
#include <linux/spinlock.h>
-#include <linux/ethtool.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/crc32.h>
@@ -86,7 +85,6 @@ static netdev_tx_t axnet_start_xmit(struct sk_buff *skb,
static struct net_device_stats *get_stats(struct net_device *dev);
static void set_multicast_list(struct net_device *dev);
static void axnet_tx_timeout(struct net_device *dev);
-static const struct ethtool_ops netdev_ethtool_ops;
static irqreturn_t ei_irq_wrapper(int irq, void *dev_id);
static void ei_watchdog(u_long arg);
static void axnet_reset_8390(struct net_device *dev);
@@ -171,7 +169,6 @@ static int axnet_probe(struct pcmcia_device *link)
dev->netdev_ops = &axnet_netdev_ops;
- SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
dev->watchdog_timeo = TX_TIMEOUT;
return axnet_config(link);
@@ -658,16 +655,6 @@ reschedule:
add_timer(&info->watchdog);
}
-static void netdev_get_drvinfo(struct net_device *dev,
- struct ethtool_drvinfo *info)
-{
- strcpy(info->driver, "axnet_cs");
-}
-
-static const struct ethtool_ops netdev_ethtool_ops = {
- .get_drvinfo = netdev_get_drvinfo,
-};
-
/*====================================================================*/
static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
diff --git a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c
index b0d06a3d962f..cbcda123b1bf 100644
--- a/drivers/net/pcmcia/ibmtr_cs.c
+++ b/drivers/net/pcmcia/ibmtr_cs.c
@@ -52,7 +52,6 @@
#include <linux/string.h>
#include <linux/timer.h>
#include <linux/module.h>
-#include <linux/ethtool.h>
#include <linux/netdevice.h>
#include <linux/trdevice.h>
#include <linux/ibmtr.h>
@@ -107,16 +106,6 @@ typedef struct ibmtr_dev_t {
struct tok_info *ti;
} ibmtr_dev_t;
-static void netdev_get_drvinfo(struct net_device *dev,
- struct ethtool_drvinfo *info)
-{
- strcpy(info->driver, "ibmtr_cs");
-}
-
-static const struct ethtool_ops netdev_ethtool_ops = {
- .get_drvinfo = netdev_get_drvinfo,
-};
-
static irqreturn_t ibmtr_interrupt(int irq, void *dev_id) {
ibmtr_dev_t *info = dev_id;
struct net_device *dev = info->dev;
@@ -159,8 +148,6 @@ static int __devinit ibmtr_attach(struct pcmcia_device *link)
info->dev = dev;
- SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
-
return ibmtr_config(link);
} /* ibmtr_attach */
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c
index c3edfe4c2651..1815b2644b96 100644
--- a/drivers/net/pcmcia/pcnet_cs.c
+++ b/drivers/net/pcmcia/pcnet_cs.c
@@ -28,6 +28,8 @@
======================================================================*/
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
@@ -35,7 +37,6 @@
#include <linux/string.h>
#include <linux/timer.h>
#include <linux/delay.h>
-#include <linux/ethtool.h>
#include <linux/netdevice.h>
#include <linux/log2.h>
#include <linux/etherdevice.h>
@@ -100,7 +101,6 @@ static void pcnet_release(struct pcmcia_device *link);
static int pcnet_open(struct net_device *dev);
static int pcnet_close(struct net_device *dev);
static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
-static const struct ethtool_ops netdev_ethtool_ops;
static irqreturn_t ei_irq_wrapper(int irq, void *dev_id);
static void ei_watchdog(u_long arg);
static void pcnet_reset_8390(struct net_device *dev);
@@ -434,8 +434,6 @@ static hw_info_t *get_ax88190(struct pcmcia_device *link)
dev->dev_addr[i] = j & 0xff;
dev->dev_addr[i+1] = j >> 8;
}
- printk(KERN_NOTICE "pcnet_cs: this is an AX88190 card!\n");
- printk(KERN_NOTICE "pcnet_cs: use axnet_cs instead.\n");
return NULL;
}
@@ -570,15 +568,15 @@ static int pcnet_config(struct pcmcia_device *link)
if ((if_port == 1) || (if_port == 2))
dev->if_port = if_port;
else
- printk(KERN_NOTICE "pcnet_cs: invalid if_port requested\n");
+ pr_notice("invalid if_port requested\n");
} else {
dev->if_port = 0;
}
if ((link->conf.ConfigBase == 0x03c0) &&
(link->manf_id == 0x149) && (link->card_id == 0xc1ab)) {
- printk(KERN_INFO "pcnet_cs: this is an AX88190 card!\n");
- printk(KERN_INFO "pcnet_cs: use axnet_cs instead.\n");
+ pr_notice("this is an AX88190 card!\n");
+ pr_notice("use axnet_cs instead.\n");
goto failed;
}
@@ -593,8 +591,8 @@ static int pcnet_config(struct pcmcia_device *link)
local_hw_info = get_hwired(link);
if (local_hw_info == NULL) {
- printk(KERN_NOTICE "pcnet_cs: unable to read hardware net"
- " address for io base %#3lx\n", dev->base_addr);
+ pr_notice("unable to read hardware net address for io base %#3lx\n",
+ dev->base_addr);
goto failed;
}
@@ -628,33 +626,31 @@ static int pcnet_config(struct pcmcia_device *link)
ei_status.word16 = 1;
ei_status.reset_8390 = &pcnet_reset_8390;
- SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
-
if (info->flags & (IS_DL10019|IS_DL10022))
mii_phy_probe(dev);
SET_NETDEV_DEV(dev, &link->dev);
if (register_netdev(dev) != 0) {
- printk(KERN_NOTICE "pcnet_cs: register_netdev() failed\n");
+ pr_notice("register_netdev() failed\n");
goto failed;
}
if (info->flags & (IS_DL10019|IS_DL10022)) {
u_char id = inb(dev->base_addr + 0x1a);
- printk(KERN_INFO "%s: NE2000 (DL100%d rev %02x): ",
- dev->name, ((info->flags & IS_DL10022) ? 22 : 19), id);
+ netdev_info(dev, "NE2000 (DL100%d rev %02x): ",
+ (info->flags & IS_DL10022) ? 22 : 19, id);
if (info->pna_phy)
- printk("PNA, ");
+ pr_cont("PNA, ");
} else {
- printk(KERN_INFO "%s: NE2000 Compatible: ", dev->name);
+ netdev_info(dev, "NE2000 Compatible: ");
}
- printk("io %#3lx, irq %d,", dev->base_addr, dev->irq);
+ pr_cont("io %#3lx, irq %d,", dev->base_addr, dev->irq);
if (info->flags & USE_SHMEM)
- printk (" mem %#5lx,", dev->mem_start);
+ pr_cont(" mem %#5lx,", dev->mem_start);
if (info->flags & HAS_MISC_REG)
- printk(" %s xcvr,", if_names[dev->if_port]);
- printk(" hw_addr %pM\n", dev->dev_addr);
+ pr_cont(" %s xcvr,", if_names[dev->if_port]);
+ pr_cont(" hw_addr %pM\n", dev->dev_addr);
return 0;
failed:
@@ -928,7 +924,7 @@ static void mii_phy_probe(struct net_device *dev)
phyid = tmp << 16;
phyid |= mdio_read(mii_addr, i, MII_PHYID_REG2);
phyid &= MII_PHYID_REV_MASK;
- pr_debug("%s: MII at %d is 0x%08x\n", dev->name, i, phyid);
+ netdev_dbg(dev, "MII at %d is 0x%08x\n", i, phyid);
if (phyid == AM79C9XX_HOME_PHY) {
info->pna_phy = i;
} else if (phyid != AM79C9XX_ETH_PHY) {
@@ -1014,8 +1010,8 @@ static void pcnet_reset_8390(struct net_device *dev)
outb_p(ENISR_RESET, nic_base + EN0_ISR); /* Ack intr. */
if (i == 100)
- printk(KERN_ERR "%s: pcnet_reset_8390() did not complete.\n",
- dev->name);
+ netdev_err(dev, "pcnet_reset_8390() did not complete.\n");
+
set_misc_reg(dev);
} /* pcnet_reset_8390 */
@@ -1031,8 +1027,7 @@ static int set_config(struct net_device *dev, struct ifmap *map)
else if ((map->port < 1) || (map->port > 2))
return -EINVAL;
dev->if_port = map->port;
- printk(KERN_INFO "%s: switched to %s port\n",
- dev->name, if_names[dev->if_port]);
+ netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
NS8390_init(dev, 1);
}
return 0;
@@ -1067,7 +1062,7 @@ static void ei_watchdog(u_long arg)
this, we can limp along even if the interrupt is blocked */
if (info->stale++ && (inb_p(nic_base + EN0_ISR) & ENISR_ALL)) {
if (!info->fast_poll)
- printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
+ netdev_info(dev, "interrupt(s) dropped!\n");
ei_irq_wrapper(dev->irq, dev);
info->fast_poll = HZ;
}
@@ -1087,7 +1082,7 @@ static void ei_watchdog(u_long arg)
if (info->eth_phy) {
info->phy_id = info->eth_phy = 0;
} else {
- printk(KERN_INFO "%s: MII is missing!\n", dev->name);
+ netdev_info(dev, "MII is missing!\n");
info->flags &= ~HAS_MII;
}
goto reschedule;
@@ -1096,8 +1091,7 @@ static void ei_watchdog(u_long arg)
link &= 0x0004;
if (link != info->link_status) {
u_short p = mdio_read(mii_addr, info->phy_id, 5);
- printk(KERN_INFO "%s: %s link beat\n", dev->name,
- (link) ? "found" : "lost");
+ netdev_info(dev, "%s link beat\n", link ? "found" : "lost");
if (link && (info->flags & IS_DL10022)) {
/* Disable collision detection on full duplex links */
outb((p & 0x0140) ? 4 : 0, nic_base + DLINK_DIAG);
@@ -1108,13 +1102,12 @@ static void ei_watchdog(u_long arg)
if (link) {
if (info->phy_id == info->eth_phy) {
if (p)
- printk(KERN_INFO "%s: autonegotiation complete: "
- "%sbaseT-%cD selected\n", dev->name,
+ netdev_info(dev, "autonegotiation complete: "
+ "%sbaseT-%cD selected\n",
((p & 0x0180) ? "100" : "10"),
((p & 0x0140) ? 'F' : 'H'));
else
- printk(KERN_INFO "%s: link partner did not "
- "autonegotiate\n", dev->name);
+ netdev_info(dev, "link partner did not autonegotiate\n");
}
NS8390_init(dev, 1);
}
@@ -1127,7 +1120,7 @@ static void ei_watchdog(u_long arg)
/* isolate this MII and try flipping to the other one */
mdio_write(mii_addr, info->phy_id, 0, 0x0400);
info->phy_id ^= info->pna_phy ^ info->eth_phy;
- printk(KERN_INFO "%s: switched to %s transceiver\n", dev->name,
+ netdev_info(dev, "switched to %s transceiver\n",
(info->phy_id == info->eth_phy) ? "ethernet" : "PNA");
mdio_write(mii_addr, info->phy_id, 0,
(info->phy_id == info->eth_phy) ? 0x1000 : 0);
@@ -1143,18 +1136,6 @@ reschedule:
/*====================================================================*/
-static void netdev_get_drvinfo(struct net_device *dev,
- struct ethtool_drvinfo *info)
-{
- strcpy(info->driver, "pcnet_cs");
-}
-
-static const struct ethtool_ops netdev_ethtool_ops = {
- .get_drvinfo = netdev_get_drvinfo,
-};
-
-/*====================================================================*/
-
static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
{
@@ -1187,9 +1168,9 @@ static void dma_get_8390_hdr(struct net_device *dev,
unsigned int nic_base = dev->base_addr;
if (ei_status.dmaing) {
- printk(KERN_NOTICE "%s: DMAing conflict in dma_block_input."
+ netdev_notice(dev, "DMAing conflict in dma_block_input."
"[DMAstat:%1x][irqlock:%1x]\n",
- dev->name, ei_status.dmaing, ei_status.irqlock);
+ ei_status.dmaing, ei_status.irqlock);
return;
}
@@ -1220,11 +1201,11 @@ static void dma_block_input(struct net_device *dev, int count,
char *buf = skb->data;
if ((ei_debug > 4) && (count != 4))
- pr_debug("%s: [bi=%d]\n", dev->name, count+4);
+ netdev_dbg(dev, "[bi=%d]\n", count+4);
if (ei_status.dmaing) {
- printk(KERN_NOTICE "%s: DMAing conflict in dma_block_input."
+ netdev_notice(dev, "DMAing conflict in dma_block_input."
"[DMAstat:%1x][irqlock:%1x]\n",
- dev->name, ei_status.dmaing, ei_status.irqlock);
+ ei_status.dmaing, ei_status.irqlock);
return;
}
ei_status.dmaing |= 0x01;
@@ -1254,9 +1235,9 @@ static void dma_block_input(struct net_device *dev, int count,
break;
} while (--tries > 0);
if (tries <= 0)
- printk(KERN_NOTICE "%s: RX transfer address mismatch,"
+ netdev_notice(dev, "RX transfer address mismatch,"
"%#4.4x (expected) vs. %#4.4x (actual).\n",
- dev->name, ring_offset + xfer_count, addr);
+ ring_offset + xfer_count, addr);
}
#endif
outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
@@ -1277,7 +1258,7 @@ static void dma_block_output(struct net_device *dev, int count,
#ifdef PCMCIA_DEBUG
if (ei_debug > 4)
- printk(KERN_DEBUG "%s: [bo=%d]\n", dev->name, count);
+ netdev_dbg(dev, "[bo=%d]\n", count);
#endif
/* Round the count up for word writes. Do we need to do this?
@@ -1286,9 +1267,9 @@ static void dma_block_output(struct net_device *dev, int count,
if (count & 0x01)
count++;
if (ei_status.dmaing) {
- printk(KERN_NOTICE "%s: DMAing conflict in dma_block_output."
+ netdev_notice(dev, "DMAing conflict in dma_block_output."
"[DMAstat:%1x][irqlock:%1x]\n",
- dev->name, ei_status.dmaing, ei_status.irqlock);
+ ei_status.dmaing, ei_status.irqlock);
return;
}
ei_status.dmaing |= 0x01;
@@ -1325,9 +1306,9 @@ static void dma_block_output(struct net_device *dev, int count,
break;
} while (--tries > 0);
if (tries <= 0) {
- printk(KERN_NOTICE "%s: Tx packet transfer address mismatch,"
+ netdev_notice(dev, "Tx packet transfer address mismatch,"
"%#4.4x (expected) vs. %#4.4x (actual).\n",
- dev->name, (start_page << 8) + count, addr);
+ (start_page << 8) + count, addr);
if (retries++ == 0)
goto retry;
}
@@ -1336,8 +1317,7 @@ static void dma_block_output(struct net_device *dev, int count,
while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
if (time_after(jiffies, dma_start + PCNET_RDC_TIMEOUT)) {
- printk(KERN_NOTICE "%s: timeout waiting for Tx RDC.\n",
- dev->name);
+ netdev_notice(dev, "timeout waiting for Tx RDC.\n");
pcnet_reset_8390(dev);
NS8390_init(dev, 1);
break;
diff --git a/drivers/net/ps3_gelic_net.c b/drivers/net/ps3_gelic_net.c
index 87d6b8f36304..49f6700e2ec2 100644
--- a/drivers/net/ps3_gelic_net.c
+++ b/drivers/net/ps3_gelic_net.c
@@ -642,7 +642,7 @@ static inline void gelic_card_disable_rxdmac(struct gelic_card *card)
status = lv1_net_stop_rx_dma(bus_id(card), dev_id(card), 0);
if (status)
dev_err(ctodev(card),
- "lv1_net_stop_rx_dma faild, %d\n", status);
+ "lv1_net_stop_rx_dma failed, %d\n", status);
}
/**
@@ -660,7 +660,7 @@ static inline void gelic_card_disable_txdmac(struct gelic_card *card)
status = lv1_net_stop_tx_dma(bus_id(card), dev_id(card), 0);
if (status)
dev_err(ctodev(card),
- "lv1_net_stop_tx_dma faild, status=%d\n", status);
+ "lv1_net_stop_tx_dma failed, status=%d\n", status);
}
/**
diff --git a/drivers/net/qlcnic/qlcnic.h b/drivers/net/qlcnic/qlcnic.h
index 970389331bbc..f6b887d409d5 100644
--- a/drivers/net/qlcnic/qlcnic.h
+++ b/drivers/net/qlcnic/qlcnic.h
@@ -555,6 +555,7 @@ struct qlcnic_recv_context {
#define QLCNIC_CDRP_CMD_GET_ESWITCH_STATUS 0x00000026
#define QLCNIC_CDRP_CMD_SET_PORTMIRRORING 0x00000027
#define QLCNIC_CDRP_CMD_CONFIGURE_ESWITCH 0x00000028
+#define QLCNIC_CDRP_CMD_GET_ESWITCH_STATS 0x0000002a
#define QLCNIC_RCODE_SUCCESS 0
#define QLCNIC_RCODE_TIMEOUT 17
@@ -893,6 +894,7 @@ struct qlcnic_mac_req {
#define QLCNIC_MSI_ENABLED 0x02
#define QLCNIC_MSIX_ENABLED 0x04
#define QLCNIC_LRO_ENABLED 0x08
+#define QLCNIC_LRO_DISABLED 0x00
#define QLCNIC_BRIDGE_ENABLED 0X10
#define QLCNIC_DIAG_ENABLED 0x20
#define QLCNIC_ESWITCH_ENABLED 0x40
@@ -1126,6 +1128,31 @@ struct qlcnic_esw_func_cfg {
u8 reserved;
};
+#define QLCNIC_STATS_VERSION 1
+#define QLCNIC_STATS_PORT 1
+#define QLCNIC_STATS_ESWITCH 2
+#define QLCNIC_QUERY_RX_COUNTER 0
+#define QLCNIC_QUERY_TX_COUNTER 1
+struct __qlcnic_esw_statistics {
+ __le16 context_id;
+ __le16 version;
+ __le16 size;
+ __le16 unused;
+ __le64 unicast_frames;
+ __le64 multicast_frames;
+ __le64 broadcast_frames;
+ __le64 dropped_frames;
+ __le64 errors;
+ __le64 local_frames;
+ __le64 numbytes;
+ __le64 rsvd[3];
+};
+
+struct qlcnic_esw_statistics {
+ struct __qlcnic_esw_statistics rx;
+ struct __qlcnic_esw_statistics tx;
+};
+
int qlcnic_fw_cmd_query_phy(struct qlcnic_adapter *adapter, u32 reg, u32 *val);
int qlcnic_fw_cmd_set_phy(struct qlcnic_adapter *adapter, u32 reg, u32 val);
@@ -1252,6 +1279,11 @@ int qlcnic_toggle_eswitch(struct qlcnic_adapter *, u8, u8);
int qlcnic_config_switch_port(struct qlcnic_adapter *, u8, int, u8, u8,
u8, u8, u16);
int qlcnic_config_port_mirroring(struct qlcnic_adapter *, u8, u8, u8);
+int qlcnic_get_port_stats(struct qlcnic_adapter *, const u8, const u8,
+ struct __qlcnic_esw_statistics *);
+int qlcnic_get_eswitch_stats(struct qlcnic_adapter *, const u8, u8,
+ struct __qlcnic_esw_statistics *);
+int qlcnic_clear_esw_stats(struct qlcnic_adapter *adapter, u8, u8, u8);
extern int qlcnic_config_tso;
/*
diff --git a/drivers/net/qlcnic/qlcnic_ctx.c b/drivers/net/qlcnic/qlcnic_ctx.c
index cc5d861d9a12..57c9b09bd16a 100644
--- a/drivers/net/qlcnic/qlcnic_ctx.c
+++ b/drivers/net/qlcnic/qlcnic_ctx.c
@@ -983,3 +983,128 @@ int qlcnic_config_switch_port(struct qlcnic_adapter *adapter, u8 id,
return err;
}
+
+int qlcnic_get_port_stats(struct qlcnic_adapter *adapter, const u8 func,
+ const u8 rx_tx, struct __qlcnic_esw_statistics *esw_stats) {
+
+ size_t stats_size = sizeof(struct __qlcnic_esw_statistics);
+ dma_addr_t stats_dma_t;
+ void *stats_addr;
+ u32 arg1;
+ int err;
+
+ if (esw_stats == NULL)
+ return -ENOMEM;
+
+ if (adapter->op_mode != QLCNIC_MGMT_FUNC &&
+ func != adapter->ahw.pci_func) {
+ dev_err(&adapter->pdev->dev,
+ "Not privilege to query stats for func=%d", func);
+ return -EIO;
+ }
+
+ stats_addr = pci_alloc_consistent(adapter->pdev, stats_size,
+ &stats_dma_t);
+ if (!stats_addr) {
+ dev_err(&adapter->pdev->dev, "Unable to allocate memory\n");
+ return -ENOMEM;
+ }
+ memset(stats_addr, 0, stats_size);
+
+ arg1 = func | QLCNIC_STATS_VERSION << 8 | QLCNIC_STATS_PORT << 12;
+ arg1 |= rx_tx << 15 | stats_size << 16;
+
+ err = qlcnic_issue_cmd(adapter,
+ adapter->ahw.pci_func,
+ adapter->fw_hal_version,
+ arg1,
+ MSD(stats_dma_t),
+ LSD(stats_dma_t),
+ QLCNIC_CDRP_CMD_GET_ESWITCH_STATS);
+
+ if (!err)
+ memcpy(esw_stats, stats_addr, stats_size);
+
+ pci_free_consistent(adapter->pdev, stats_size, stats_addr,
+ stats_dma_t);
+ return err;
+}
+
+int qlcnic_get_eswitch_stats(struct qlcnic_adapter *adapter, const u8 eswitch,
+ const u8 rx_tx, struct __qlcnic_esw_statistics *esw_stats) {
+
+ struct __qlcnic_esw_statistics port_stats;
+ u8 i;
+ int ret = -EIO;
+
+ if (esw_stats == NULL)
+ return -ENOMEM;
+ if (adapter->op_mode != QLCNIC_MGMT_FUNC)
+ return -EIO;
+ if (adapter->npars == NULL)
+ return -EIO;
+
+ memset(esw_stats, 0, sizeof(struct __qlcnic_esw_statistics));
+ esw_stats->context_id = eswitch;
+
+ for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++) {
+ if (adapter->npars[i].phy_port != eswitch)
+ continue;
+
+ memset(&port_stats, 0, sizeof(struct __qlcnic_esw_statistics));
+ if (qlcnic_get_port_stats(adapter, i, rx_tx, &port_stats))
+ continue;
+
+ esw_stats->size = port_stats.size;
+ esw_stats->version = port_stats.version;
+ esw_stats->unicast_frames += port_stats.unicast_frames;
+ esw_stats->multicast_frames += port_stats.multicast_frames;
+ esw_stats->broadcast_frames += port_stats.broadcast_frames;
+ esw_stats->dropped_frames += port_stats.dropped_frames;
+ esw_stats->errors += port_stats.errors;
+ esw_stats->local_frames += port_stats.local_frames;
+ esw_stats->numbytes += port_stats.numbytes;
+
+ ret = 0;
+ }
+ return ret;
+}
+
+int qlcnic_clear_esw_stats(struct qlcnic_adapter *adapter, const u8 func_esw,
+ const u8 port, const u8 rx_tx)
+{
+
+ u32 arg1;
+
+ if (adapter->op_mode != QLCNIC_MGMT_FUNC)
+ return -EIO;
+
+ if (func_esw == QLCNIC_STATS_PORT) {
+ if (port >= QLCNIC_MAX_PCI_FUNC)
+ goto err_ret;
+ } else if (func_esw == QLCNIC_STATS_ESWITCH) {
+ if (port >= QLCNIC_NIU_MAX_XG_PORTS)
+ goto err_ret;
+ } else {
+ goto err_ret;
+ }
+
+ if (rx_tx > QLCNIC_QUERY_TX_COUNTER)
+ goto err_ret;
+
+ arg1 = port | QLCNIC_STATS_VERSION << 8 | func_esw << 12;
+ arg1 |= BIT_14 | rx_tx << 15;
+
+ return qlcnic_issue_cmd(adapter,
+ adapter->ahw.pci_func,
+ adapter->fw_hal_version,
+ arg1,
+ 0,
+ 0,
+ QLCNIC_CDRP_CMD_GET_ESWITCH_STATS);
+
+err_ret:
+ dev_err(&adapter->pdev->dev, "Invalid argument func_esw=%d port=%d"
+ "rx_ctx=%d\n", func_esw, port, rx_tx);
+ return -EIO;
+}
diff --git a/drivers/net/qlcnic/qlcnic_ethtool.c b/drivers/net/qlcnic/qlcnic_ethtool.c
index 9328d59e21e0..e38fc3d96d43 100644
--- a/drivers/net/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/qlcnic/qlcnic_ethtool.c
@@ -747,6 +747,14 @@ qlcnic_diag_test(struct net_device *dev, struct ethtool_test *eth_test,
{
memset(data, 0, sizeof(u64) * QLCNIC_TEST_LEN);
+ data[0] = qlcnic_reg_test(dev);
+ if (data[0])
+ eth_test->flags |= ETH_TEST_FL_FAILED;
+
+ data[1] = (u64) qlcnic_test_link(dev);
+ if (data[1])
+ eth_test->flags |= ETH_TEST_FL_FAILED;
+
if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
data[2] = qlcnic_irq_test(dev);
if (data[2])
@@ -757,15 +765,6 @@ qlcnic_diag_test(struct net_device *dev, struct ethtool_test *eth_test,
eth_test->flags |= ETH_TEST_FL_FAILED;
}
-
- data[0] = qlcnic_reg_test(dev);
- if (data[0])
- eth_test->flags |= ETH_TEST_FL_FAILED;
-
- /* link test */
- data[1] = (u64) qlcnic_test_link(dev);
- if (data[1])
- eth_test->flags |= ETH_TEST_FL_FAILED;
}
static void
@@ -819,7 +818,21 @@ static u32 qlcnic_get_rx_csum(struct net_device *dev)
static int qlcnic_set_rx_csum(struct net_device *dev, u32 data)
{
struct qlcnic_adapter *adapter = netdev_priv(dev);
+
+ if (!!data) {
+ adapter->rx_csum = !!data;
+ return 0;
+ }
+
+ if (adapter->flags & QLCNIC_LRO_ENABLED) {
+ if (qlcnic_config_hw_lro(adapter, QLCNIC_LRO_DISABLED))
+ return -EIO;
+
+ dev->features &= ~NETIF_F_LRO;
+ qlcnic_send_lro_cleanup(adapter);
+ }
adapter->rx_csum = !!data;
+ dev_info(&adapter->pdev->dev, "disabling LRO as rx_csum is off\n");
return 0;
}
@@ -1002,6 +1015,15 @@ static int qlcnic_set_flags(struct net_device *netdev, u32 data)
if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO))
return -EINVAL;
+ if (!adapter->rx_csum) {
+ dev_info(&adapter->pdev->dev, "rx csum is off, "
+ "cannot toggle lro\n");
+ return -EINVAL;
+ }
+
+ if ((data & ETH_FLAG_LRO) && (adapter->flags & QLCNIC_LRO_ENABLED))
+ return 0;
+
if (data & ETH_FLAG_LRO) {
hw_lro = QLCNIC_LRO_ENABLED;
netdev->features |= NETIF_F_LRO;
diff --git a/drivers/net/qlcnic/qlcnic_hdr.h b/drivers/net/qlcnic/qlcnic_hdr.h
index 15fc32070be3..bd346d9aac94 100644
--- a/drivers/net/qlcnic/qlcnic_hdr.h
+++ b/drivers/net/qlcnic/qlcnic_hdr.h
@@ -718,8 +718,9 @@ enum {
#define QLCNIC_DEV_FAILED 0x6
#define QLCNIC_DEV_QUISCENT 0x7
-#define QLCNIC_DEV_NPAR_NOT_RDY 0
-#define QLCNIC_DEV_NPAR_RDY 1
+#define QLCNIC_DEV_NPAR_NON_OPER 0 /* NON Operational */
+#define QLCNIC_DEV_NPAR_OPER 1 /* NPAR Operational */
+#define QLCNIC_DEV_NPAR_OPER_TIMEO 30 /* Operational time out */
#define QLC_DEV_CHECK_ACTIVE(VAL, FN) ((VAL) &= (1 << (FN * 4)))
#define QLC_DEV_SET_REF_CNT(VAL, FN) ((VAL) |= (1 << (FN * 4)))
diff --git a/drivers/net/qlcnic/qlcnic_hw.c b/drivers/net/qlcnic/qlcnic_hw.c
index e08c8b0556a4..9d40ce05cb17 100644
--- a/drivers/net/qlcnic/qlcnic_hw.c
+++ b/drivers/net/qlcnic/qlcnic_hw.c
@@ -1245,4 +1245,5 @@ void qlcnic_clear_ilb_mode(struct qlcnic_adapter *adapter)
mode = VPORT_MISS_MODE_ACCEPT_MULTI;
qlcnic_nic_set_promisc(adapter, mode);
+ msleep(1000);
}
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c
index bf6d87adda4f..abd7cd6db6fd 100644
--- a/drivers/net/qlcnic/qlcnic_main.c
+++ b/drivers/net/qlcnic/qlcnic_main.c
@@ -543,8 +543,6 @@ qlcnic_set_function_modes(struct qlcnic_adapter *adapter)
ret = qlcnic_api_lock(adapter);
if (ret)
goto err_lock;
- if (QLC_DEV_CLR_REF_CNT(ref_count, adapter->ahw.pci_func))
- goto err_npar;
if (qlcnic_config_npars) {
for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++) {
@@ -562,7 +560,6 @@ qlcnic_set_function_modes(struct qlcnic_adapter *adapter)
adapter->ahw.pci_func));
}
writel(data, priv_op);
-err_npar:
qlcnic_api_unlock(adapter);
err_lock:
return ret;
@@ -998,7 +995,7 @@ __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
qlcnic_config_intr_coalesce(adapter);
- if (adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO)
+ if (netdev->features & NETIF_F_LRO)
qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED);
qlcnic_napi_enable(adapter);
@@ -1947,14 +1944,14 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup)
struct net_device *netdev = adapter->netdev;
if (adapter->ahw.linkup && !linkup) {
- dev_info(&netdev->dev, "NIC Link is down\n");
+ netdev_info(netdev, "NIC Link is down\n");
adapter->ahw.linkup = 0;
if (netif_running(netdev)) {
netif_carrier_off(netdev);
netif_stop_queue(netdev);
}
} else if (!adapter->ahw.linkup && linkup) {
- dev_info(&netdev->dev, "NIC Link is up\n");
+ netdev_info(netdev, "NIC Link is up\n");
adapter->ahw.linkup = 1;
if (netif_running(netdev)) {
netif_carrier_on(netdev);
@@ -2398,7 +2395,7 @@ qlcnic_fwinit_work(struct work_struct *work)
{
struct qlcnic_adapter *adapter = container_of(work,
struct qlcnic_adapter, fw_work.work);
- u32 dev_state = 0xf, npar_state;
+ u32 dev_state = 0xf;
if (qlcnic_api_lock(adapter))
goto err_ret;
@@ -2412,16 +2409,8 @@ qlcnic_fwinit_work(struct work_struct *work)
}
if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC) {
- npar_state = QLCRD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE);
- if (npar_state == QLCNIC_DEV_NPAR_RDY) {
- qlcnic_api_unlock(adapter);
- goto wait_npar;
- } else {
- qlcnic_schedule_work(adapter, qlcnic_fwinit_work,
- FW_POLL_DELAY);
- qlcnic_api_unlock(adapter);
- return;
- }
+ qlcnic_api_unlock(adapter);
+ goto wait_npar;
}
if (adapter->fw_wait_cnt++ > adapter->reset_ack_timeo) {
@@ -2470,20 +2459,17 @@ wait_npar:
QLCDB(adapter, HW, "Func waiting: Device state=%u\n", dev_state);
switch (dev_state) {
- case QLCNIC_DEV_QUISCENT:
- case QLCNIC_DEV_NEED_QUISCENT:
- case QLCNIC_DEV_NEED_RESET:
- qlcnic_schedule_work(adapter,
- qlcnic_fwinit_work, FW_POLL_DELAY);
- return;
- case QLCNIC_DEV_FAILED:
- break;
-
- default:
+ case QLCNIC_DEV_READY:
if (!adapter->nic_ops->start_firmware(adapter)) {
qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
return;
}
+ case QLCNIC_DEV_FAILED:
+ break;
+ default:
+ qlcnic_schedule_work(adapter,
+ qlcnic_fwinit_work, FW_POLL_DELAY);
+ return;
}
err_ret:
@@ -2530,6 +2516,22 @@ err_ret:
}
+/*Transit NPAR state to NON Operational */
+static void
+qlcnic_set_npar_non_operational(struct qlcnic_adapter *adapter)
+{
+ u32 state;
+
+ state = QLCRD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE);
+ if (state == QLCNIC_DEV_NPAR_NON_OPER)
+ return;
+
+ if (qlcnic_api_lock(adapter))
+ return;
+ QLCWR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE, QLCNIC_DEV_NPAR_NON_OPER);
+ qlcnic_api_unlock(adapter);
+}
+
/*Transit to RESET state from READY state only */
static void
qlcnic_dev_request_reset(struct qlcnic_adapter *adapter)
@@ -2548,6 +2550,7 @@ qlcnic_dev_request_reset(struct qlcnic_adapter *adapter)
qlcnic_idc_debug_info(adapter, 0);
}
+ QLCWR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE, QLCNIC_DEV_NPAR_NON_OPER);
qlcnic_api_unlock(adapter);
}
@@ -2555,21 +2558,14 @@ qlcnic_dev_request_reset(struct qlcnic_adapter *adapter)
static void
qlcnic_dev_set_npar_ready(struct qlcnic_adapter *adapter)
{
- u32 state;
-
if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED) ||
- adapter->op_mode == QLCNIC_NON_PRIV_FUNC)
+ adapter->op_mode != QLCNIC_MGMT_FUNC)
return;
if (qlcnic_api_lock(adapter))
return;
- state = QLCRD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE);
-
- if (state != QLCNIC_DEV_NPAR_RDY) {
- QLCWR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE,
- QLCNIC_DEV_NPAR_RDY);
- QLCDB(adapter, DRV, "NPAR READY state set\n");
- }
+ QLCWR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE, QLCNIC_DEV_NPAR_OPER);
+ QLCDB(adapter, DRV, "NPAR operational state set\n");
qlcnic_api_unlock(adapter);
}
@@ -2631,8 +2627,11 @@ qlcnic_check_health(struct qlcnic_adapter *adapter)
qlcnic_dev_request_reset(adapter);
state = QLCRD32(adapter, QLCNIC_CRB_DEV_STATE);
- if (state == QLCNIC_DEV_NEED_RESET || state == QLCNIC_DEV_NEED_QUISCENT)
+ if (state == QLCNIC_DEV_NEED_RESET ||
+ state == QLCNIC_DEV_NEED_QUISCENT) {
+ qlcnic_set_npar_non_operational(adapter);
adapter->need_fw_reset = 1;
+ }
heartbit = QLCRD32(adapter, QLCNIC_PEG_ALIVE_COUNTER);
if (heartbit != adapter->heartbit) {
@@ -2733,7 +2732,7 @@ static int qlcnic_attach_func(struct pci_dev *pdev)
if (qlcnic_api_lock(adapter))
return -EINVAL;
- if (first_func) {
+ if (adapter->op_mode != QLCNIC_NON_PRIV_FUNC && first_func) {
adapter->need_fw_reset = 1;
set_bit(__QLCNIC_START_FW, &adapter->state);
QLCWR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_INITIALIZING);
@@ -2822,11 +2821,25 @@ static int
qlcnicvf_start_firmware(struct qlcnic_adapter *adapter)
{
int err;
+ u8 npar_opt_timeo = QLCNIC_DEV_NPAR_OPER_TIMEO;
+ u32 npar_state;
err = qlcnic_can_start_firmware(adapter);
if (err)
return err;
+ npar_state = QLCRD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE);
+ while (npar_state != QLCNIC_DEV_NPAR_OPER && --npar_opt_timeo) {
+ msleep(1000);
+ npar_state = QLCRD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE);
+ }
+
+ if (!npar_opt_timeo) {
+ dev_err(&adapter->pdev->dev,
+ "Waiting for NPAR state to opertional timeout\n");
+ return -EIO;
+ }
+
qlcnic_check_options(adapter);
adapter->need_fw_reset = 0;
@@ -3365,6 +3378,115 @@ qlcnic_sysfs_read_npar_config(struct file *file, struct kobject *kobj,
}
static ssize_t
+qlcnic_sysfs_get_port_stats(struct file *file, struct kobject *kobj,
+ struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
+{
+ struct device *dev = container_of(kobj, struct device, kobj);
+ struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
+ struct qlcnic_esw_statistics port_stats;
+ int ret;
+
+ if (size != sizeof(struct qlcnic_esw_statistics))
+ return QL_STATUS_INVALID_PARAM;
+
+ if (offset >= QLCNIC_MAX_PCI_FUNC)
+ return QL_STATUS_INVALID_PARAM;
+
+ memset(&port_stats, 0, size);
+ ret = qlcnic_get_port_stats(adapter, offset, QLCNIC_QUERY_RX_COUNTER,
+ &port_stats.rx);
+ if (ret)
+ return ret;
+
+ ret = qlcnic_get_port_stats(adapter, offset, QLCNIC_QUERY_TX_COUNTER,
+ &port_stats.tx);
+ if (ret)
+ return ret;
+
+ memcpy(buf, &port_stats, size);
+ return size;
+}
+
+static ssize_t
+qlcnic_sysfs_get_esw_stats(struct file *file, struct kobject *kobj,
+ struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
+{
+ struct device *dev = container_of(kobj, struct device, kobj);
+ struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
+ struct qlcnic_esw_statistics esw_stats;
+ int ret;
+
+ if (size != sizeof(struct qlcnic_esw_statistics))
+ return QL_STATUS_INVALID_PARAM;
+
+ if (offset >= QLCNIC_NIU_MAX_XG_PORTS)
+ return QL_STATUS_INVALID_PARAM;
+
+ memset(&esw_stats, 0, size);
+ ret = qlcnic_get_eswitch_stats(adapter, offset, QLCNIC_QUERY_RX_COUNTER,
+ &esw_stats.rx);
+ if (ret)
+ return ret;
+
+ ret = qlcnic_get_eswitch_stats(adapter, offset, QLCNIC_QUERY_TX_COUNTER,
+ &esw_stats.tx);
+ if (ret)
+ return ret;
+
+ memcpy(buf, &esw_stats, size);
+ return size;
+}
+
+static ssize_t
+qlcnic_sysfs_clear_esw_stats(struct file *file, struct kobject *kobj,
+ struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
+{
+ struct device *dev = container_of(kobj, struct device, kobj);
+ struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
+ int ret;
+
+ if (offset >= QLCNIC_NIU_MAX_XG_PORTS)
+ return QL_STATUS_INVALID_PARAM;
+
+ ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_ESWITCH, offset,
+ QLCNIC_QUERY_RX_COUNTER);
+ if (ret)
+ return ret;
+
+ ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_ESWITCH, offset,
+ QLCNIC_QUERY_TX_COUNTER);
+ if (ret)
+ return ret;
+
+ return size;
+}
+
+static ssize_t
+qlcnic_sysfs_clear_port_stats(struct file *file, struct kobject *kobj,
+ struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
+{
+
+ struct device *dev = container_of(kobj, struct device, kobj);
+ struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
+ int ret;
+
+ if (offset >= QLCNIC_MAX_PCI_FUNC)
+ return QL_STATUS_INVALID_PARAM;
+
+ ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_PORT, offset,
+ QLCNIC_QUERY_RX_COUNTER);
+ if (ret)
+ return ret;
+
+ ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_PORT, offset,
+ QLCNIC_QUERY_TX_COUNTER);
+ if (ret)
+ return ret;
+
+ return size;
+}
+
+static ssize_t
qlcnic_sysfs_read_pci_config(struct file *file, struct kobject *kobj,
struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
{
@@ -3413,6 +3535,20 @@ static struct bin_attribute bin_attr_pci_config = {
.write = NULL,
};
+static struct bin_attribute bin_attr_port_stats = {
+ .attr = {.name = "port_stats", .mode = (S_IRUGO | S_IWUSR)},
+ .size = 0,
+ .read = qlcnic_sysfs_get_port_stats,
+ .write = qlcnic_sysfs_clear_port_stats,
+};
+
+static struct bin_attribute bin_attr_esw_stats = {
+ .attr = {.name = "esw_stats", .mode = (S_IRUGO | S_IWUSR)},
+ .size = 0,
+ .read = qlcnic_sysfs_get_esw_stats,
+ .write = qlcnic_sysfs_clear_esw_stats,
+};
+
static struct bin_attribute bin_attr_esw_config = {
.attr = {.name = "esw_config", .mode = (S_IRUGO | S_IWUSR)},
.size = 0,
@@ -3452,6 +3588,9 @@ qlcnic_create_diag_entries(struct qlcnic_adapter *adapter)
{
struct device *dev = &adapter->pdev->dev;
+ if (device_create_bin_file(dev, &bin_attr_port_stats))
+ dev_info(dev, "failed to create port stats sysfs entry");
+
if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC)
return;
if (device_create_file(dev, &dev_attr_diag_mode))
@@ -3471,7 +3610,8 @@ qlcnic_create_diag_entries(struct qlcnic_adapter *adapter)
dev_info(dev, "failed to create esw config sysfs entry");
if (device_create_bin_file(dev, &bin_attr_pm_config))
dev_info(dev, "failed to create pm config sysfs entry");
-
+ if (device_create_bin_file(dev, &bin_attr_esw_stats))
+ dev_info(dev, "failed to create eswitch stats sysfs entry");
}
static void
@@ -3479,6 +3619,8 @@ qlcnic_remove_diag_entries(struct qlcnic_adapter *adapter)
{
struct device *dev = &adapter->pdev->dev;
+ device_remove_bin_file(dev, &bin_attr_port_stats);
+
if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC)
return;
device_remove_file(dev, &dev_attr_diag_mode);
@@ -3491,6 +3633,7 @@ qlcnic_remove_diag_entries(struct qlcnic_adapter *adapter)
device_remove_bin_file(dev, &bin_attr_npar_config);
device_remove_bin_file(dev, &bin_attr_esw_config);
device_remove_bin_file(dev, &bin_attr_pm_config);
+ device_remove_bin_file(dev, &bin_attr_esw_stats);
}
#ifdef CONFIG_INET
diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c
index 142c381e1d73..0a00850da79d 100644
--- a/drivers/net/r6040.c
+++ b/drivers/net/r6040.c
@@ -200,7 +200,7 @@ struct r6040_private {
int old_duplex;
};
-static char version[] __devinitdata = KERN_INFO DRV_NAME
+static char version[] __devinitdata = DRV_NAME
": RDC R6040 NAPI net driver,"
"version "DRV_VERSION " (" DRV_RELDATE ")";
@@ -224,7 +224,8 @@ static int r6040_phy_read(void __iomem *ioaddr, int phy_addr, int reg)
}
/* Write a word data from PHY Chip */
-static void r6040_phy_write(void __iomem *ioaddr, int phy_addr, int reg, u16 val)
+static void r6040_phy_write(void __iomem *ioaddr,
+ int phy_addr, int reg, u16 val)
{
int limit = 2048;
u16 cmd;
@@ -348,8 +349,8 @@ static int r6040_alloc_rxbufs(struct net_device *dev)
}
desc->skb_ptr = skb;
desc->buf = cpu_to_le32(pci_map_single(lp->pdev,
- desc->skb_ptr->data,
- MAX_BUF_SIZE, PCI_DMA_FROMDEVICE));
+ desc->skb_ptr->data,
+ MAX_BUF_SIZE, PCI_DMA_FROMDEVICE));
desc->status = DSC_OWNER_MAC;
desc = desc->vndescp;
} while (desc != lp->rx_ring);
@@ -491,12 +492,14 @@ static int r6040_close(struct net_device *dev)
/* Free Descriptor memory */
if (lp->rx_ring) {
- pci_free_consistent(pdev, RX_DESC_SIZE, lp->rx_ring, lp->rx_ring_dma);
+ pci_free_consistent(pdev,
+ RX_DESC_SIZE, lp->rx_ring, lp->rx_ring_dma);
lp->rx_ring = NULL;
}
if (lp->tx_ring) {
- pci_free_consistent(pdev, TX_DESC_SIZE, lp->tx_ring, lp->tx_ring_dma);
+ pci_free_consistent(pdev,
+ TX_DESC_SIZE, lp->tx_ring, lp->tx_ring_dma);
lp->tx_ring = NULL;
}
@@ -547,7 +550,7 @@ static int r6040_rx(struct net_device *dev, int limit)
}
goto next_descr;
}
-
+
/* Packet successfully received */
new_skb = netdev_alloc_skb(dev, MAX_BUF_SIZE);
if (!new_skb) {
@@ -556,13 +559,13 @@ static int r6040_rx(struct net_device *dev, int limit)
}
skb_ptr = descptr->skb_ptr;
skb_ptr->dev = priv->dev;
-
+
/* Do not count the CRC */
skb_put(skb_ptr, descptr->len - 4);
pci_unmap_single(priv->pdev, le32_to_cpu(descptr->buf),
MAX_BUF_SIZE, PCI_DMA_FROMDEVICE);
skb_ptr->protocol = eth_type_trans(skb_ptr, priv->dev);
-
+
/* Send to upper layer */
netif_receive_skb(skb_ptr);
dev->stats.rx_packets++;
@@ -710,8 +713,10 @@ static int r6040_up(struct net_device *dev)
return ret;
/* improve performance (by RDC guys) */
- r6040_phy_write(ioaddr, 30, 17, (r6040_phy_read(ioaddr, 30, 17) | 0x4000));
- r6040_phy_write(ioaddr, 30, 17, ~((~r6040_phy_read(ioaddr, 30, 17)) | 0x2000));
+ r6040_phy_write(ioaddr, 30, 17,
+ (r6040_phy_read(ioaddr, 30, 17) | 0x4000));
+ r6040_phy_write(ioaddr, 30, 17,
+ ~((~r6040_phy_read(ioaddr, 30, 17)) | 0x2000));
r6040_phy_write(ioaddr, 0, 19, 0x0000);
r6040_phy_write(ioaddr, 0, 30, 0x01F0);
@@ -946,7 +951,7 @@ static const struct net_device_ops r6040_netdev_ops = {
.ndo_set_multicast_list = r6040_multicast_list,
.ndo_change_mtu = eth_change_mtu,
.ndo_validate_addr = eth_validate_addr,
- .ndo_set_mac_address = eth_mac_addr,
+ .ndo_set_mac_address = eth_mac_addr,
.ndo_do_ioctl = r6040_ioctl,
.ndo_tx_timeout = r6040_tx_timeout,
#ifdef CONFIG_NET_POLL_CONTROLLER
@@ -1039,7 +1044,7 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
u16 *adrp;
int i;
- printk("%s\n", version);
+ pr_info("%s\n", version);
err = pci_enable_device(pdev);
if (err)
@@ -1113,7 +1118,8 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
/* Some bootloader/BIOSes do not initialize
* MAC address, warn about that */
if (!(adrp[0] || adrp[1] || adrp[2])) {
- netdev_warn(dev, "MAC address not initialized, generating random\n");
+ netdev_warn(dev, "MAC address not initialized, "
+ "generating random\n");
random_ether_addr(dev->dev_addr);
}
diff --git a/drivers/net/sc92031.c b/drivers/net/sc92031.c
index 8c4067af32b0..31b92f5f32cb 100644
--- a/drivers/net/sc92031.c
+++ b/drivers/net/sc92031.c
@@ -1251,16 +1251,6 @@ static int sc92031_ethtool_set_settings(struct net_device *dev,
return 0;
}
-static void sc92031_ethtool_get_drvinfo(struct net_device *dev,
- struct ethtool_drvinfo *drvinfo)
-{
- struct sc92031_priv *priv = netdev_priv(dev);
- struct pci_dev *pdev = priv->pdev;
-
- strcpy(drvinfo->driver, SC92031_NAME);
- strcpy(drvinfo->bus_info, pci_name(pdev));
-}
-
static void sc92031_ethtool_get_wol(struct net_device *dev,
struct ethtool_wolinfo *wolinfo)
{
@@ -1382,7 +1372,6 @@ static void sc92031_ethtool_get_ethtool_stats(struct net_device *dev,
static const struct ethtool_ops sc92031_ethtool_ops = {
.get_settings = sc92031_ethtool_get_settings,
.set_settings = sc92031_ethtool_set_settings,
- .get_drvinfo = sc92031_ethtool_get_drvinfo,
.get_wol = sc92031_ethtool_get_wol,
.set_wol = sc92031_ethtool_set_wol,
.nway_reset = sc92031_ethtool_nway_reset,
diff --git a/drivers/net/skfp/hwt.c b/drivers/net/skfp/hwt.c
index 053151468f93..465565e53a68 100644
--- a/drivers/net/skfp/hwt.c
+++ b/drivers/net/skfp/hwt.c
@@ -221,7 +221,7 @@ u_long hwt_quick_read(struct s_smc *smc)
* para start start time
* duration time to wait
*
- * NOTE: The fuction will return immediately, if the timer is not
+ * NOTE: The function will return immediately, if the timer is not
* started
************************/
void hwt_wait_time(struct s_smc *smc, u_long start, long int duration)
diff --git a/drivers/net/skfp/skfddi.c b/drivers/net/skfp/skfddi.c
index 31b2dabf094c..0ade12a21d16 100644
--- a/drivers/net/skfp/skfddi.c
+++ b/drivers/net/skfp/skfddi.c
@@ -33,7 +33,7 @@
* The driver architecture is based on the DEC FDDI driver by
* Lawrence V. Stefani and several ethernet drivers.
* I also used an existing Windows NT miniport driver.
- * All hardware dependent fuctions are handled by the SysKonnect
+ * All hardware dependent functions are handled by the SysKonnect
* Hardware Module.
* The only headerfiles that are directly related to this source
* are skfddi.c, h/types.h, h/osdef1st.h, h/targetos.h.
diff --git a/drivers/net/tulip/pnic2.c b/drivers/net/tulip/pnic2.c
index b8197666021e..4690c8e69207 100644
--- a/drivers/net/tulip/pnic2.c
+++ b/drivers/net/tulip/pnic2.c
@@ -59,7 +59,7 @@
* Bit 14:12 - autonegotiation state (write 001 to start autonegotiate)
* Bit 3 - Autopolarity state
* Bit 2 - LS10B - link state of 10baseT 0 - good, 1 - failed
- * Bit 1 - LS100B - link state of 100baseT 0 - good, 1- faild
+ * Bit 1 - LS100B - link state of 100baseT 0 - good, 1 - failed
*
*
* Data Port Selection Info
diff --git a/drivers/net/tulip/xircom_cb.c b/drivers/net/tulip/xircom_cb.c
index a439e93be22d..5a73752be2ca 100644
--- a/drivers/net/tulip/xircom_cb.c
+++ b/drivers/net/tulip/xircom_cb.c
@@ -29,7 +29,6 @@
#include <linux/skbuff.h>
#include <linux/delay.h>
#include <linux/init.h>
-#include <linux/ethtool.h>
#include <linux/bitops.h>
#include <asm/uaccess.h>
@@ -181,19 +180,6 @@ static void print_binary(unsigned int number)
}
#endif
-static void netdev_get_drvinfo(struct net_device *dev,
- struct ethtool_drvinfo *info)
-{
- struct xircom_private *private = netdev_priv(dev);
-
- strcpy(info->driver, "xircom_cb");
- strcpy(info->bus_info, pci_name(private->pdev));
-}
-
-static const struct ethtool_ops netdev_ethtool_ops = {
- .get_drvinfo = netdev_get_drvinfo,
-};
-
static const struct net_device_ops netdev_ops = {
.ndo_open = xircom_open,
.ndo_stop = xircom_close,
@@ -279,7 +265,6 @@ static int __devinit xircom_probe(struct pci_dev *pdev, const struct pci_device_
setup_descriptors(private);
dev->netdev_ops = &netdev_ops;
- SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
pci_set_drvdata(pdev, dev);
if (register_netdev(dev)) {
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index 6efca66b8766..4f123f869bdc 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -843,16 +843,7 @@ static netdev_tx_t hso_net_start_xmit(struct sk_buff *skb,
return NETDEV_TX_OK;
}
-static void hso_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info)
-{
- struct hso_net *odev = netdev_priv(net);
-
- strncpy(info->driver, driver_name, ETHTOOL_BUSINFO_LEN);
- usb_make_path(odev->parent->usb, info->bus_info, sizeof info->bus_info);
-}
-
static const struct ethtool_ops ops = {
- .get_drvinfo = hso_get_drvinfo,
.get_link = ethtool_op_get_link
};
diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c
index 2b7b39cad1ce..5e98643a4a21 100644
--- a/drivers/net/usb/kaweth.c
+++ b/drivers/net/usb/kaweth.c
@@ -759,14 +759,6 @@ static int kaweth_close(struct net_device *net)
return 0;
}
-static void kaweth_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
-{
- struct kaweth_device *kaweth = netdev_priv(dev);
-
- strlcpy(info->driver, driver_name, sizeof(info->driver));
- usb_make_path(kaweth->dev, info->bus_info, sizeof (info->bus_info));
-}
-
static u32 kaweth_get_link(struct net_device *dev)
{
struct kaweth_device *kaweth = netdev_priv(dev);
@@ -775,7 +767,6 @@ static u32 kaweth_get_link(struct net_device *dev)
}
static const struct ethtool_ops ops = {
- .get_drvinfo = kaweth_get_drvinfo,
.get_link = kaweth_get_link
};
diff --git a/drivers/net/vbus-enet.c b/drivers/net/vbus-enet.c
new file mode 100644
index 000000000000..94b86d482cee
--- /dev/null
+++ b/drivers/net/vbus-enet.c
@@ -0,0 +1,1560 @@
+/*
+ * vbus_enet - A virtualized 802.x network device based on the VBUS interface
+ *
+ * Copyright (C) 2009 Novell, Gregory Haskins <ghaskins@novell.com>
+ *
+ * Derived from the SNULL example from the book "Linux Device Drivers" by
+ * Alessandro Rubini, Jonathan Corbet, and Greg Kroah-Hartman, published
+ * by O'Reilly & Associates.
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/moduleparam.h>
+
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/errno.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+
+#include <linux/in.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/ethtool.h>
+#include <linux/ip.h>
+#include <linux/tcp.h>
+#include <linux/skbuff.h>
+#include <linux/ioq.h>
+#include <linux/vbus_driver.h>
+
+#include <linux/in6.h>
+#include <asm/checksum.h>
+
+#include <linux/venet.h>
+
+MODULE_AUTHOR("Gregory Haskins");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("virtual-ethernet");
+MODULE_VERSION("1");
+
+static int rx_ringlen = 256;
+module_param(rx_ringlen, int, 0444);
+static int tx_ringlen = 256;
+module_param(tx_ringlen, int, 0444);
+static int sg_enabled = 1;
+module_param(sg_enabled, int, 0444);
+
+#define PDEBUG(_dev, fmt, args...) dev_dbg(&(_dev)->dev, fmt, ## args)
+
+#define SG_DESC_SIZE VSG_DESC_SIZE(MAX_SKB_FRAGS)
+
+struct vbus_enet_queue {
+ struct ioq *queue;
+ struct ioq_notifier notifier;
+ unsigned long count;
+};
+
+struct vbus_enet_priv {
+ spinlock_t lock;
+ struct net_device *dev;
+ struct vbus_device_proxy *vdev;
+ struct napi_struct napi;
+ struct vbus_enet_queue rxq;
+ struct {
+ struct vbus_enet_queue veq;
+ struct tasklet_struct task;
+ struct sk_buff_head outstanding;
+ } tx;
+ bool sg;
+ struct {
+ bool enabled;
+ char *pool;
+ } pmtd; /* pre-mapped transmit descriptors */
+ struct {
+ bool enabled;
+ bool linkstate;
+ bool txc;
+ unsigned long evsize;
+ struct vbus_enet_queue veq;
+ struct tasklet_struct task;
+ char *pool;
+ } evq;
+ struct {
+ bool available;
+ char *pool;
+ struct vbus_enet_queue pageq;
+ } l4ro;
+
+ struct sk_buff *(*import)(struct vbus_enet_priv *priv,
+ struct ioq_ring_desc *desc);
+};
+
+static void vbus_enet_tx_reap(struct vbus_enet_priv *priv);
+
+static struct vbus_enet_priv *
+napi_to_priv(struct napi_struct *napi)
+{
+ return container_of(napi, struct vbus_enet_priv, napi);
+}
+
+static int
+queue_init(struct vbus_enet_priv *priv,
+ struct vbus_enet_queue *q,
+ const char *name,
+ int qid,
+ size_t ringsize,
+ void (*func)(struct ioq_notifier *))
+{
+ struct vbus_device_proxy *dev = priv->vdev;
+ int ret;
+ char _name[64];
+
+ if (name)
+ snprintf(_name, sizeof(_name), "%s-%s", priv->dev->name, name);
+
+ ret = vbus_driver_ioq_alloc(dev, name ? _name : NULL, qid, 0,
+ ringsize, &q->queue);
+ if (ret < 0)
+ panic("ioq_alloc failed: %d\n", ret);
+
+ if (func) {
+ q->notifier.signal = func;
+ q->queue->notifier = &q->notifier;
+ }
+
+ q->count = ringsize;
+
+ return 0;
+}
+
+static int
+devcall(struct vbus_enet_priv *priv, u32 func, void *data, size_t len)
+{
+ struct vbus_device_proxy *dev = priv->vdev;
+
+ return dev->ops->call(dev, func, data, len, 0);
+}
+
+/*
+ * ---------------
+ * rx descriptors
+ * ---------------
+ */
+
+static void
+rxdesc_alloc(struct vbus_enet_priv *priv, struct ioq_ring_desc *desc, size_t len)
+{
+ struct net_device *dev = priv->dev;
+ struct sk_buff *skb;
+
+ len += ETH_HLEN;
+
+ skb = netdev_alloc_skb(dev, len + NET_IP_ALIGN);
+ BUG_ON(!skb);
+
+ skb_reserve(skb, NET_IP_ALIGN); /* align IP on 16B boundary */
+
+ if (priv->l4ro.available) {
+ /*
+ * We will populate an SG descriptor initially with one
+ * IOV filled with an MTU SKB. If the packet needs to be
+ * larger than MTU, the host will grab pages out of the
+ * page-queue and populate additional IOVs
+ */
+ struct venet_sg *vsg = (struct venet_sg *)(unsigned long)desc->cookie;
+ struct venet_iov *iov = &vsg->iov[0];
+
+ memset(vsg, 0, SG_DESC_SIZE);
+
+ vsg->cookie = (u64)(unsigned long)skb;
+ vsg->count = 1;
+
+ iov->ptr = (u64)__pa(skb->data);
+ iov->len = len;
+ } else {
+ desc->cookie = (u64)(unsigned long)skb;
+ desc->ptr = cpu_to_le64(__pa(skb->data));
+ desc->len = cpu_to_le64(len); /* total length */
+ }
+
+ desc->valid = 1;
+}
+
+static void
+rx_pageq_refill(struct vbus_enet_priv *priv, gfp_t gfp_mask)
+{
+ struct ioq *ioq = priv->l4ro.pageq.queue;
+ struct ioq_iterator iter;
+ int ret, added = 0;
+
+ if (ioq_full(ioq, ioq_idxtype_inuse))
+ /* nothing to do if the pageq is already fully populated */
+ return;
+
+ ret = ioq_iter_init(ioq, &iter, ioq_idxtype_inuse, 0);
+ BUG_ON(ret < 0); /* will never fail unless seriously broken */
+
+ ret = ioq_iter_seek(&iter, ioq_seek_tail, 0, 0);
+ BUG_ON(ret < 0);
+
+ /*
+ * Now populate each descriptor with an empty page
+ */
+ while (!iter.desc->sown) {
+ struct page *page = NULL;
+
+ page = alloc_page(gfp_mask);
+
+ if (!page)
+ break;
+
+ added = 1;
+ iter.desc->cookie = (u64)(unsigned long)page;
+ iter.desc->ptr = cpu_to_le64(__pa(page_address(page)));
+ iter.desc->len = cpu_to_le64(PAGE_SIZE);
+
+ ret = ioq_iter_push(&iter, 0);
+ BUG_ON(ret < 0);
+ }
+
+ if (added)
+ ioq_signal(ioq, 0);
+}
+
+static void
+rx_setup(struct vbus_enet_priv *priv)
+{
+ struct ioq *ioq = priv->rxq.queue;
+ struct ioq_iterator iter;
+ int ret;
+ int i = 0;
+
+ /*
+ * We want to iterate on the "valid" index. By default the iterator
+ * will not "autoupdate" which means it will not hypercall the host
+ * with our changes. This is good, because we are really just
+ * initializing stuff here anyway. Note that you can always manually
+ * signal the host with ioq_signal() if the autoupdate feature is not
+ * used.
+ */
+ ret = ioq_iter_init(ioq, &iter, ioq_idxtype_valid, 0);
+ BUG_ON(ret < 0); /* will never fail unless seriously broken */
+
+ /*
+ * Seek to the tail of the valid index (which should be our first
+ * item, since the queue is brand-new)
+ */
+ ret = ioq_iter_seek(&iter, ioq_seek_tail, 0, 0);
+ BUG_ON(ret < 0);
+
+ /*
+ * Now populate each descriptor with an empty buffer and mark it valid
+ */
+ while (!iter.desc->valid) {
+ if (priv->l4ro.available) {
+ size_t offset = (i * SG_DESC_SIZE);
+ void *addr = &priv->l4ro.pool[offset];
+
+ iter.desc->ptr = cpu_to_le64(offset);
+ iter.desc->cookie = (u64)(unsigned long)addr;
+ iter.desc->len = cpu_to_le64(SG_DESC_SIZE);
+ }
+
+ rxdesc_alloc(priv, iter.desc, priv->dev->mtu);
+
+ /*
+ * This push operation will simultaneously advance the
+ * valid-head index and increment our position in the queue
+ * by one.
+ */
+ ret = ioq_iter_push(&iter, 0);
+ BUG_ON(ret < 0);
+
+ i++;
+ }
+
+ if (priv->l4ro.available)
+ rx_pageq_refill(priv, GFP_KERNEL);
+}
+
+static void
+rx_rxq_teardown(struct vbus_enet_priv *priv)
+{
+ struct ioq *ioq = priv->rxq.queue;
+ struct ioq_iterator iter;
+ int ret;
+
+ ret = ioq_iter_init(ioq, &iter, ioq_idxtype_valid, 0);
+ BUG_ON(ret < 0);
+
+ ret = ioq_iter_seek(&iter, ioq_seek_head, 0, 0);
+ BUG_ON(ret < 0);
+
+ /*
+ * free each valid descriptor
+ */
+ while (iter.desc->valid) {
+ struct sk_buff *skb;
+
+ if (priv->l4ro.available) {
+ struct venet_sg *vsg;
+ int i;
+
+ vsg = (struct venet_sg *)(unsigned long)iter.desc->cookie;
+
+ /* skip i=0, since that is the skb->data IOV */
+ for (i = 1; i < vsg->count; i++) {
+ struct venet_iov *iov = &vsg->iov[i];
+ struct page *page = (struct page *)(unsigned long)iov->ptr;
+
+ put_page(page);
+ }
+
+ skb = (struct sk_buff *)(unsigned long)vsg->cookie;
+ } else
+ skb = (struct sk_buff *)(unsigned long)iter.desc->cookie;
+
+ iter.desc->valid = 0;
+ wmb();
+
+ iter.desc->ptr = 0;
+ iter.desc->cookie = 0;
+
+ ret = ioq_iter_pop(&iter, 0);
+ BUG_ON(ret < 0);
+
+ dev_kfree_skb(skb);
+ }
+}
+
+static void
+rx_l4ro_teardown(struct vbus_enet_priv *priv)
+{
+ struct ioq *ioq = priv->l4ro.pageq.queue;
+ struct ioq_iterator iter;
+ int ret;
+
+ ret = ioq_iter_init(ioq, &iter, ioq_idxtype_inuse, 0);
+ BUG_ON(ret < 0);
+
+ ret = ioq_iter_seek(&iter, ioq_seek_head, 0, 0);
+ BUG_ON(ret < 0);
+
+ /*
+ * free each valid descriptor
+ */
+ while (iter.desc->sown) {
+ struct page *page = (struct page *)(unsigned long)iter.desc->cookie;
+
+ iter.desc->valid = 0;
+ wmb();
+
+ iter.desc->ptr = 0;
+ iter.desc->cookie = 0;
+
+ ret = ioq_iter_pop(&iter, 0);
+ BUG_ON(ret < 0);
+
+ put_page(page);
+ }
+
+ ioq_put(ioq);
+ kfree(priv->l4ro.pool);
+}
+
+static void
+rx_teardown(struct vbus_enet_priv *priv)
+{
+ rx_rxq_teardown(priv);
+
+ if (priv->l4ro.available)
+ rx_l4ro_teardown(priv);
+}
+
+static int
+tx_setup(struct vbus_enet_priv *priv)
+{
+ struct ioq *ioq = priv->tx.veq.queue;
+ struct ioq_iterator iter;
+ int i;
+ int ret;
+
+ if (!priv->sg)
+ /*
+ * There is nothing to do for a ring that is not using
+ * scatter-gather
+ */
+ return 0;
+
+ /* pre-allocate our descriptor pool if pmtd is enabled */
+ if (priv->pmtd.enabled) {
+ struct vbus_device_proxy *dev = priv->vdev;
+ size_t poollen = SG_DESC_SIZE * priv->tx.veq.count;
+ char *pool;
+ int shmid;
+
+ /* pmtdquery will return the shm-id to use for the pool */
+ ret = devcall(priv, VENET_FUNC_PMTDQUERY, NULL, 0);
+ BUG_ON(ret < 0);
+
+ shmid = ret;
+
+ pool = kzalloc(poollen, GFP_KERNEL | GFP_DMA);
+ if (!pool)
+ return -ENOMEM;
+
+ priv->pmtd.pool = pool;
+
+ ret = dev->ops->shm(dev, NULL, shmid, 0, pool, poollen,
+ NULL, NULL, 0);
+ BUG_ON(ret < 0);
+ }
+
+ ret = ioq_iter_init(ioq, &iter, ioq_idxtype_valid, 0);
+ BUG_ON(ret < 0);
+
+ ret = ioq_iter_seek(&iter, ioq_seek_set, 0, 0);
+ BUG_ON(ret < 0);
+
+ /*
+ * Now populate each descriptor with an empty SG descriptor
+ */
+ for (i = 0; i < priv->tx.veq.count; i++) {
+ struct venet_sg *vsg;
+
+ if (priv->pmtd.enabled) {
+ size_t offset = (i * SG_DESC_SIZE);
+
+ vsg = (struct venet_sg *)&priv->pmtd.pool[offset];
+ iter.desc->ptr = cpu_to_le64(offset);
+ } else {
+ vsg = kzalloc(SG_DESC_SIZE, GFP_KERNEL);
+ if (!vsg)
+ return -ENOMEM;
+
+ iter.desc->ptr = cpu_to_le64(__pa(vsg));
+ }
+
+ iter.desc->cookie = (u64)(unsigned long)vsg;
+ iter.desc->len = cpu_to_le64(SG_DESC_SIZE);
+
+ ret = ioq_iter_seek(&iter, ioq_seek_next, 0, 0);
+ BUG_ON(ret < 0);
+ }
+
+ return 0;
+}
+
+static void
+tx_teardown(struct vbus_enet_priv *priv)
+{
+ struct ioq *ioq = priv->tx.veq.queue;
+ struct ioq_iterator iter;
+ struct sk_buff *skb;
+ int ret;
+
+ /* forcefully free all outstanding transmissions */
+ while ((skb = __skb_dequeue(&priv->tx.outstanding)))
+ dev_kfree_skb(skb);
+
+ if (!priv->sg)
+ /*
+ * There is nothing else to do for a ring that is not using
+ * scatter-gather
+ */
+ return;
+
+ if (priv->pmtd.enabled) {
+ /*
+ * PMTD mode means we only need to free the pool
+ */
+ kfree(priv->pmtd.pool);
+ return;
+ }
+
+ ret = ioq_iter_init(ioq, &iter, ioq_idxtype_valid, 0);
+ BUG_ON(ret < 0);
+
+ /* seek to position 0 */
+ ret = ioq_iter_seek(&iter, ioq_seek_set, 0, 0);
+ BUG_ON(ret < 0);
+
+ /*
+ * free each valid descriptor
+ */
+ while (iter.desc->cookie) {
+ struct venet_sg *vsg = (struct venet_sg *)(unsigned long)iter.desc->cookie;
+
+ iter.desc->valid = 0;
+ wmb();
+
+ iter.desc->ptr = 0;
+ iter.desc->cookie = 0;
+
+ ret = ioq_iter_seek(&iter, ioq_seek_next, 0, 0);
+ BUG_ON(ret < 0);
+
+ kfree(vsg);
+ }
+}
+
+static void
+evq_teardown(struct vbus_enet_priv *priv)
+{
+ if (!priv->evq.enabled)
+ return;
+
+ ioq_put(priv->evq.veq.queue);
+ kfree(priv->evq.pool);
+}
+
+/*
+ * Open and close
+ */
+
+static int
+vbus_enet_open(struct net_device *dev)
+{
+ struct vbus_enet_priv *priv = netdev_priv(dev);
+ int ret;
+
+ ret = devcall(priv, VENET_FUNC_LINKUP, NULL, 0);
+ BUG_ON(ret < 0);
+
+ napi_enable(&priv->napi);
+
+ return 0;
+}
+
+static int
+vbus_enet_stop(struct net_device *dev)
+{
+ struct vbus_enet_priv *priv = netdev_priv(dev);
+ int ret;
+
+ napi_disable(&priv->napi);
+
+ ret = devcall(priv, VENET_FUNC_LINKDOWN, NULL, 0);
+ BUG_ON(ret < 0);
+
+ return 0;
+}
+
+/*
+ * Configuration changes (passed on by ifconfig)
+ */
+static int
+vbus_enet_config(struct net_device *dev, struct ifmap *map)
+{
+ if (dev->flags & IFF_UP) /* can't act on a running interface */
+ return -EBUSY;
+
+ /* Don't allow changing the I/O address */
+ if (map->base_addr != dev->base_addr) {
+ dev_warn(&dev->dev, "Can't change I/O address\n");
+ return -EOPNOTSUPP;
+ }
+
+ /* ignore other fields */
+ return 0;
+}
+
+static void
+vbus_enet_schedule_rx(struct vbus_enet_priv *priv)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&priv->lock, flags);
+
+ if (napi_schedule_prep(&priv->napi)) {
+ /* Disable further interrupts */
+ ioq_notify_disable(priv->rxq.queue, 0);
+ __napi_schedule(&priv->napi);
+ }
+
+ spin_unlock_irqrestore(&priv->lock, flags);
+}
+
+static int
+vbus_enet_change_mtu(struct net_device *dev, int new_mtu)
+{
+ struct vbus_enet_priv *priv = netdev_priv(dev);
+ int ret;
+
+ dev->mtu = new_mtu;
+
+ /*
+ * FLUSHRX will cause the device to flush any outstanding
+ * RX buffers. They will appear to come in as 0 length
+ * packets which we can simply discard and replace with new_mtu
+ * buffers for the future.
+ */
+ ret = devcall(priv, VENET_FUNC_FLUSHRX, NULL, 0);
+ BUG_ON(ret < 0);
+
+ vbus_enet_schedule_rx(priv);
+
+ return 0;
+}
+
+static struct sk_buff *
+vbus_enet_l4ro_import(struct vbus_enet_priv *priv, struct ioq_ring_desc *desc)
+{
+ struct venet_sg *vsg = (struct venet_sg *)(unsigned long)desc->cookie;
+ struct sk_buff *skb = (struct sk_buff *)(unsigned long)vsg->cookie;
+ struct skb_shared_info *sinfo = skb_shinfo(skb);
+ int i;
+
+ rx_pageq_refill(priv, GFP_ATOMIC);
+
+ if (!vsg->len)
+ /*
+ * the device may send a zero-length packet when its
+ * flushing references on the ring. We can just drop
+ * these on the floor
+ */
+ goto fail;
+
+ /* advance only by the linear portion in IOV[0] */
+ skb_put(skb, vsg->iov[0].len);
+
+ /* skip i=0, since that is the skb->data IOV */
+ for (i = 1; i < vsg->count; i++) {
+ struct venet_iov *iov = &vsg->iov[i];
+ struct page *page = (struct page *)(unsigned long)iov->ptr;
+ skb_frag_t *f = &sinfo->frags[i-1];
+
+ f->page = page;
+ f->page_offset = 0;
+ f->size = iov->len;
+
+ PDEBUG(priv->dev, "SG: Importing %d byte page[%i]\n",
+ f->size, i);
+
+ skb->data_len += f->size;
+ skb->len += f->size;
+ skb->truesize += f->size;
+ sinfo->nr_frags++;
+ }
+
+ if (vsg->flags & VENET_SG_FLAG_NEEDS_CSUM
+ && !skb_partial_csum_set(skb, vsg->csum.start,
+ vsg->csum.offset)) {
+ priv->dev->stats.rx_frame_errors++;
+ goto fail;
+ }
+
+ if (vsg->flags & VENET_SG_FLAG_GSO) {
+ PDEBUG(priv->dev, "L4RO packet detected\n");
+
+ switch (vsg->gso.type) {
+ case VENET_GSO_TYPE_TCPV4:
+ sinfo->gso_type = SKB_GSO_TCPV4;
+ break;
+ case VENET_GSO_TYPE_TCPV6:
+ sinfo->gso_type = SKB_GSO_TCPV6;
+ break;
+ case VENET_GSO_TYPE_UDP:
+ sinfo->gso_type = SKB_GSO_UDP;
+ break;
+ default:
+ PDEBUG(priv->dev, "Illegal L4RO type: %d\n",
+ vsg->gso.type);
+ priv->dev->stats.rx_frame_errors++;
+ goto fail;
+ }
+
+ if (vsg->flags & VENET_SG_FLAG_ECN)
+ sinfo->gso_type |= SKB_GSO_TCP_ECN;
+
+ sinfo->gso_size = vsg->gso.size;
+ if (sinfo->gso_size == 0) {
+ PDEBUG(priv->dev, "Illegal L4RO size: %d\n",
+ vsg->gso.size);
+ priv->dev->stats.rx_frame_errors++;
+ goto fail;
+ }
+
+ /*
+ * Header must be checked, and gso_segs
+ * computed.
+ */
+ sinfo->gso_type |= SKB_GSO_DODGY;
+ sinfo->gso_segs = 0;
+ }
+
+ return skb;
+
+fail:
+ dev_kfree_skb(skb);
+
+ return NULL;
+}
+
+static struct sk_buff *
+vbus_enet_flat_import(struct vbus_enet_priv *priv, struct ioq_ring_desc *desc)
+{
+ struct sk_buff *skb = (struct sk_buff *)(unsigned long)desc->cookie;
+
+ if (!desc->len) {
+ /*
+ * the device may send a zero-length packet when its
+ * flushing references on the ring. We can just drop
+ * these on the floor
+ */
+ dev_kfree_skb(skb);
+ return NULL;
+ }
+
+ skb_put(skb, le64_to_cpu(desc->len));
+
+ return skb;
+}
+
+/*
+ * The poll implementation.
+ */
+static int
+vbus_enet_poll(struct napi_struct *napi, int budget)
+{
+ struct vbus_enet_priv *priv = napi_to_priv(napi);
+ int npackets = 0;
+ struct ioq_iterator iter;
+ int ret;
+
+ PDEBUG(priv->dev, "polling...\n");
+
+ /* We want to iterate on the head of the in-use index */
+ ret = ioq_iter_init(priv->rxq.queue, &iter, ioq_idxtype_inuse,
+ IOQ_ITER_AUTOUPDATE);
+ BUG_ON(ret < 0);
+
+ ret = ioq_iter_seek(&iter, ioq_seek_head, 0, 0);
+ BUG_ON(ret < 0);
+
+ /*
+ * We stop if we have met the quota or there are no more packets.
+ * The EOM is indicated by finding a packet that is still owned by
+ * the south side
+ */
+ while ((npackets < budget) && (!iter.desc->sown)) {
+ struct sk_buff *skb;
+
+ skb = priv->import(priv, iter.desc);
+ if (skb) {
+ /* Maintain stats */
+ npackets++;
+ priv->dev->stats.rx_packets++;
+ priv->dev->stats.rx_bytes += skb->len;
+
+ /* Pass the buffer up to the stack */
+ skb->dev = priv->dev;
+ skb->protocol = eth_type_trans(skb, priv->dev);
+ netif_receive_skb(skb);
+
+ mb();
+ }
+
+ /* Grab a new buffer to put in the ring */
+ rxdesc_alloc(priv, iter.desc, priv->dev->mtu);
+
+ /* Advance the in-use tail */
+ ret = ioq_iter_pop(&iter, 0);
+ BUG_ON(ret < 0);
+ }
+
+ PDEBUG(priv->dev, "%d packets received\n", npackets);
+
+ /*
+ * If we processed all packets, we're done; tell the kernel and
+ * reenable ints
+ */
+ if (ioq_empty(priv->rxq.queue, ioq_idxtype_inuse)) {
+ napi_complete(napi);
+ ioq_notify_enable(priv->rxq.queue, 0);
+ ret = 0;
+ } else
+ /* We couldn't process everything. */
+ ret = 1;
+
+ return ret;
+}
+
+/*
+ * Transmit a packet (called by the kernel)
+ */
+static int
+vbus_enet_tx_start(struct sk_buff *skb, struct net_device *dev)
+{
+ struct vbus_enet_priv *priv = netdev_priv(dev);
+ struct ioq_iterator iter;
+ int ret;
+ unsigned long flags;
+
+ PDEBUG(priv->dev, "sending %d bytes\n", skb->len);
+
+ spin_lock_irqsave(&priv->lock, flags);
+
+ if (ioq_full(priv->tx.veq.queue, ioq_idxtype_valid)) {
+ /*
+ * We must flow-control the kernel by disabling the
+ * queue
+ */
+ spin_unlock_irqrestore(&priv->lock, flags);
+ netif_stop_queue(dev);
+ dev_err(&priv->dev->dev, "tx on full queue bug\n");
+ return 1;
+ }
+
+ /*
+ * We want to iterate on the tail of both the "inuse" and "valid" index
+ * so we specify the "both" index
+ */
+ ret = ioq_iter_init(priv->tx.veq.queue, &iter, ioq_idxtype_both,
+ IOQ_ITER_AUTOUPDATE);
+ BUG_ON(ret < 0);
+
+ ret = ioq_iter_seek(&iter, ioq_seek_tail, 0, 0);
+ BUG_ON(ret < 0);
+ BUG_ON(iter.desc->sown);
+
+ if (priv->sg) {
+ struct venet_sg *vsg = (struct venet_sg *)(unsigned long)iter.desc->cookie;
+ struct scatterlist sgl[MAX_SKB_FRAGS+1];
+ struct scatterlist *sg;
+ int count, maxcount = ARRAY_SIZE(sgl);
+
+ sg_init_table(sgl, maxcount);
+
+ memset(vsg, 0, sizeof(*vsg));
+
+ vsg->cookie = (u64)(unsigned long)skb;
+ vsg->len = skb->len;
+
+ if (skb->ip_summed == CHECKSUM_PARTIAL) {
+ vsg->flags |= VENET_SG_FLAG_NEEDS_CSUM;
+ vsg->csum.start = skb->csum_start - skb_headroom(skb);
+ vsg->csum.offset = skb->csum_offset;
+ }
+
+ if (skb_is_gso(skb)) {
+ struct skb_shared_info *sinfo = skb_shinfo(skb);
+
+ vsg->flags |= VENET_SG_FLAG_GSO;
+
+ vsg->gso.hdrlen = skb_headlen(skb);
+ vsg->gso.size = sinfo->gso_size;
+ if (sinfo->gso_type & SKB_GSO_TCPV4)
+ vsg->gso.type = VENET_GSO_TYPE_TCPV4;
+ else if (sinfo->gso_type & SKB_GSO_TCPV6)
+ vsg->gso.type = VENET_GSO_TYPE_TCPV6;
+ else if (sinfo->gso_type & SKB_GSO_UDP)
+ vsg->gso.type = VENET_GSO_TYPE_UDP;
+ else
+ panic("Virtual-Ethernet: unknown GSO type " \
+ "0x%x\n", sinfo->gso_type);
+
+ if (sinfo->gso_type & SKB_GSO_TCP_ECN)
+ vsg->flags |= VENET_SG_FLAG_ECN;
+ }
+
+ count = skb_to_sgvec(skb, sgl, 0, skb->len);
+
+ BUG_ON(count > maxcount);
+
+ for (sg = &sgl[0]; sg; sg = sg_next(sg)) {
+ struct venet_iov *iov = &vsg->iov[vsg->count++];
+
+ iov->len = sg->length;
+ iov->ptr = (u64)sg_phys(sg);
+ }
+
+ iter.desc->len = cpu_to_le64(VSG_DESC_SIZE(vsg->count));
+
+ } else {
+ /*
+ * non scatter-gather mode: simply put the skb right onto the
+ * ring.
+ */
+ iter.desc->cookie = (u64)(unsigned long)skb;
+ iter.desc->len = cpu_to_le64(skb->len);
+ iter.desc->ptr = cpu_to_le64(__pa(skb->data));
+ }
+
+ iter.desc->valid = 1;
+
+ priv->dev->stats.tx_packets++;
+ priv->dev->stats.tx_bytes += skb->len;
+
+ skb_queue_tail(&priv->tx.outstanding, skb);
+
+ /*
+ * This advances both indexes together implicitly, and then
+ * signals the south side to consume the packet
+ */
+ ret = ioq_iter_push(&iter, 0);
+ BUG_ON(ret < 0);
+
+ dev->trans_start = jiffies; /* save the timestamp */
+
+ if (ioq_full(priv->tx.veq.queue, ioq_idxtype_valid)) {
+ /*
+ * If the queue is congested, we must flow-control the kernel
+ */
+ PDEBUG(priv->dev, "backpressure tx queue\n");
+ netif_stop_queue(dev);
+ }
+
+ spin_unlock_irqrestore(&priv->lock, flags);
+
+ return 0;
+}
+
+/* assumes priv->lock held */
+static void
+vbus_enet_skb_complete(struct vbus_enet_priv *priv, struct sk_buff *skb)
+{
+ PDEBUG(priv->dev, "completed sending %d bytes\n",
+ skb->len);
+
+ skb_unlink(skb, &priv->tx.outstanding);
+ dev_kfree_skb(skb);
+}
+
+/*
+ * reclaim any outstanding completed tx packets
+ *
+ * assumes priv->lock held
+ */
+static struct sk_buff *
+vbus_enet_tx_reap_one(struct vbus_enet_priv *priv)
+{
+ struct sk_buff *skb = NULL;
+ struct ioq_iterator iter;
+ unsigned long flags;
+ int ret;
+
+ spin_lock_irqsave(&priv->lock, flags);
+
+ /*
+ * We want to iterate on the head of the valid index, but we
+ * do not want the iter_pop (below) to flip the ownership, so
+ * we set the NOFLIPOWNER option
+ */
+ ret = ioq_iter_init(priv->tx.veq.queue, &iter, ioq_idxtype_valid,
+ IOQ_ITER_NOFLIPOWNER);
+ BUG_ON(ret < 0);
+
+ ret = ioq_iter_seek(&iter, ioq_seek_head, 0, 0);
+ BUG_ON(ret < 0);
+
+ if (iter.desc->valid && !iter.desc->sown) {
+
+ if (priv->sg) {
+ struct venet_sg *vsg;
+
+ vsg = (struct venet_sg *)(unsigned long)iter.desc->cookie;
+ skb = (struct sk_buff *)(unsigned long)vsg->cookie;
+ } else
+ skb = (struct sk_buff *)(unsigned long)iter.desc->cookie;
+
+ /* Reset the descriptor */
+ iter.desc->valid = 0;
+
+ /* Advance the valid-index head */
+ ret = ioq_iter_pop(&iter, 0);
+ BUG_ON(ret < 0);
+ }
+
+ /*
+ * If we were previously stopped due to flow control, restart the
+ * processing
+ */
+ if (netif_queue_stopped(priv->dev)
+ && !ioq_full(priv->tx.veq.queue, ioq_idxtype_valid)) {
+ PDEBUG(priv->dev, "re-enabling tx queue\n");
+ netif_wake_queue(priv->dev);
+ }
+
+ spin_unlock_irqrestore(&priv->lock, flags);
+
+ return skb;
+}
+
+static void
+vbus_enet_tx_reap(struct vbus_enet_priv *priv)
+{
+ struct sk_buff *skb;
+
+ while ((skb = vbus_enet_tx_reap_one(priv))) {
+ if (!priv->evq.txc)
+ /*
+ * We are responsible for freeing the packet upon
+ * reap if TXC is not enabled
+ */
+ vbus_enet_skb_complete(priv, skb);
+ }
+}
+
+static void
+vbus_enet_timeout(struct net_device *dev)
+{
+ struct vbus_enet_priv *priv = netdev_priv(dev);
+
+ dev_dbg(&dev->dev, "Transmit timeout\n");
+
+ vbus_enet_tx_reap(priv);
+}
+
+static void
+rx_isr(struct ioq_notifier *notifier)
+{
+ struct vbus_enet_priv *priv;
+ struct net_device *dev;
+
+ priv = container_of(notifier, struct vbus_enet_priv, rxq.notifier);
+ dev = priv->dev;
+
+ if (!ioq_empty(priv->rxq.queue, ioq_idxtype_inuse))
+ vbus_enet_schedule_rx(priv);
+}
+
+static void
+deferred_tx_isr(unsigned long data)
+{
+ struct vbus_enet_priv *priv = (struct vbus_enet_priv *)data;
+
+ PDEBUG(priv->dev, "deferred_tx_isr\n");
+
+ vbus_enet_tx_reap(priv);
+
+ ioq_notify_enable(priv->tx.veq.queue, 0);
+}
+
+static void
+tx_isr(struct ioq_notifier *notifier)
+{
+ struct vbus_enet_priv *priv;
+
+ priv = container_of(notifier, struct vbus_enet_priv, tx.veq.notifier);
+
+ PDEBUG(priv->dev, "tx_isr\n");
+
+ ioq_notify_disable(priv->tx.veq.queue, 0);
+ tasklet_schedule(&priv->tx.task);
+}
+
+static void
+evq_linkstate_event(struct vbus_enet_priv *priv,
+ struct venet_event_header *header)
+{
+ struct venet_event_linkstate *event =
+ (struct venet_event_linkstate *)header;
+
+ switch (event->state) {
+ case 0:
+ netif_carrier_off(priv->dev);
+ break;
+ case 1:
+ netif_carrier_on(priv->dev);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+evq_txc_event(struct vbus_enet_priv *priv,
+ struct venet_event_header *header)
+{
+ struct venet_event_txc *event =
+ (struct venet_event_txc *)header;
+
+ vbus_enet_tx_reap(priv);
+
+ vbus_enet_skb_complete(priv, (struct sk_buff *)(unsigned long)event->cookie);
+}
+
+static void
+deferred_evq_isr(unsigned long data)
+{
+ struct vbus_enet_priv *priv = (struct vbus_enet_priv *)data;
+ int nevents = 0;
+ struct ioq_iterator iter;
+ int ret;
+
+ PDEBUG(priv->dev, "evq: polling...\n");
+
+ /* We want to iterate on the head of the in-use index */
+ ret = ioq_iter_init(priv->evq.veq.queue, &iter, ioq_idxtype_inuse,
+ IOQ_ITER_AUTOUPDATE);
+ BUG_ON(ret < 0);
+
+ ret = ioq_iter_seek(&iter, ioq_seek_head, 0, 0);
+ BUG_ON(ret < 0);
+
+ /*
+ * The EOM is indicated by finding a packet that is still owned by
+ * the south side
+ */
+ while (!iter.desc->sown) {
+ struct venet_event_header *header;
+
+ header = (struct venet_event_header *)(unsigned long)iter.desc->cookie;
+
+ switch (header->id) {
+ case VENET_EVENT_LINKSTATE:
+ evq_linkstate_event(priv, header);
+ break;
+ case VENET_EVENT_TXC:
+ evq_txc_event(priv, header);
+ break;
+ default:
+ panic("venet: unexpected event id:%d of size %d\n",
+ header->id, header->size);
+ break;
+ }
+
+ memset((void *)(unsigned long)iter.desc->cookie, 0, priv->evq.evsize);
+
+ /* Advance the in-use tail */
+ ret = ioq_iter_pop(&iter, 0);
+ BUG_ON(ret < 0);
+
+ nevents++;
+ }
+
+ PDEBUG(priv->dev, "%d events received\n", nevents);
+
+ ioq_notify_enable(priv->evq.veq.queue, 0);
+}
+
+static void
+evq_isr(struct ioq_notifier *notifier)
+{
+ struct vbus_enet_priv *priv;
+
+ priv = container_of(notifier, struct vbus_enet_priv, evq.veq.notifier);
+
+ PDEBUG(priv->dev, "evq_isr\n");
+
+ ioq_notify_disable(priv->evq.veq.queue, 0);
+ tasklet_schedule(&priv->evq.task);
+}
+
+static int
+vbus_enet_sg_negcap(struct vbus_enet_priv *priv)
+{
+ struct net_device *dev = priv->dev;
+ struct venet_capabilities caps;
+ int ret;
+
+ memset(&caps, 0, sizeof(caps));
+
+ if (sg_enabled) {
+ caps.gid = VENET_CAP_GROUP_SG;
+ caps.bits |= (VENET_CAP_SG|VENET_CAP_TSO4|VENET_CAP_TSO6
+ |VENET_CAP_ECN|VENET_CAP_PMTD);
+ /* note: exclude UFO for now due to stack bug */
+ }
+
+ ret = devcall(priv, VENET_FUNC_NEGCAP, &caps, sizeof(caps));
+ if (ret < 0)
+ return ret;
+
+ if (caps.bits & VENET_CAP_SG) {
+ priv->sg = true;
+
+ dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM|NETIF_F_FRAGLIST;
+
+ if (caps.bits & VENET_CAP_TSO4)
+ dev->features |= NETIF_F_TSO;
+ if (caps.bits & VENET_CAP_UFO)
+ dev->features |= NETIF_F_UFO;
+ if (caps.bits & VENET_CAP_TSO6)
+ dev->features |= NETIF_F_TSO6;
+ if (caps.bits & VENET_CAP_ECN)
+ dev->features |= NETIF_F_TSO_ECN;
+
+ if (caps.bits & VENET_CAP_PMTD)
+ priv->pmtd.enabled = true;
+ }
+
+ return 0;
+}
+
+static int
+vbus_enet_evq_negcap(struct vbus_enet_priv *priv, unsigned long count)
+{
+ struct venet_capabilities caps;
+ int ret;
+
+ memset(&caps, 0, sizeof(caps));
+
+ caps.gid = VENET_CAP_GROUP_EVENTQ;
+ caps.bits |= VENET_CAP_EVQ_LINKSTATE;
+ caps.bits |= VENET_CAP_EVQ_TXC;
+
+ ret = devcall(priv, VENET_FUNC_NEGCAP, &caps, sizeof(caps));
+ if (ret < 0)
+ return ret;
+
+ if (caps.bits) {
+ struct vbus_device_proxy *dev = priv->vdev;
+ struct venet_eventq_query query;
+ size_t poollen;
+ struct ioq_iterator iter;
+ char *pool;
+ int i;
+
+ priv->evq.enabled = true;
+
+ if (caps.bits & VENET_CAP_EVQ_LINKSTATE) {
+ /*
+ * We will assume there is no carrier until we get
+ * an event telling us otherwise
+ */
+ netif_carrier_off(priv->dev);
+ priv->evq.linkstate = true;
+ }
+
+ if (caps.bits & VENET_CAP_EVQ_TXC)
+ priv->evq.txc = true;
+
+ memset(&query, 0, sizeof(query));
+
+ ret = devcall(priv, VENET_FUNC_EVQQUERY, &query, sizeof(query));
+ if (ret < 0)
+ return ret;
+
+ priv->evq.evsize = query.evsize;
+ poollen = query.evsize * count;
+
+ pool = kzalloc(poollen, GFP_KERNEL | GFP_DMA);
+ if (!pool)
+ return -ENOMEM;
+
+ priv->evq.pool = pool;
+
+ ret = dev->ops->shm(dev, NULL, query.dpid, 0,
+ pool, poollen, NULL, NULL, 0);
+ if (ret < 0)
+ return ret;
+
+ queue_init(priv, &priv->evq.veq, "evq",
+ query.qid, count, evq_isr);
+
+ ret = ioq_iter_init(priv->evq.veq.queue,
+ &iter, ioq_idxtype_valid, 0);
+ BUG_ON(ret < 0);
+
+ ret = ioq_iter_seek(&iter, ioq_seek_set, 0, 0);
+ BUG_ON(ret < 0);
+
+ /* Now populate each descriptor with an empty event */
+ for (i = 0; i < count; i++) {
+ size_t offset = (i * query.evsize);
+ void *addr = &priv->evq.pool[offset];
+
+ iter.desc->ptr = cpu_to_le64(offset);
+ iter.desc->cookie = (u64)(unsigned long)addr;
+ iter.desc->len = cpu_to_le64(query.evsize);
+
+ ret = ioq_iter_push(&iter, 0);
+ BUG_ON(ret < 0);
+ }
+
+ /* Finally, enable interrupts */
+ tasklet_init(&priv->evq.task, deferred_evq_isr,
+ (unsigned long)priv);
+ ioq_notify_enable(priv->evq.veq.queue, 0);
+ }
+
+ return 0;
+}
+
+static int
+vbus_enet_l4ro_negcap(struct vbus_enet_priv *priv, unsigned long count)
+{
+ struct venet_capabilities caps;
+ int ret;
+
+ memset(&caps, 0, sizeof(caps));
+
+ caps.gid = VENET_CAP_GROUP_L4RO;
+ caps.bits |= (VENET_CAP_SG|VENET_CAP_TSO4|VENET_CAP_TSO6
+ |VENET_CAP_ECN);
+
+ ret = devcall(priv, VENET_FUNC_NEGCAP, &caps, sizeof(caps));
+ if (ret < 0) {
+ printk(KERN_ERR "Error negotiating L4RO: %d\n", ret);
+ return ret;
+ }
+
+ if (caps.bits & VENET_CAP_SG) {
+ struct vbus_device_proxy *dev = priv->vdev;
+ size_t poollen = SG_DESC_SIZE * count;
+ struct venet_l4ro_query query;
+ char *pool;
+
+ memset(&query, 0, sizeof(query));
+
+ ret = devcall(priv, VENET_FUNC_L4ROQUERY, &query, sizeof(query));
+ if (ret < 0) {
+ printk(KERN_ERR "Error querying L4RO: %d\n", ret);
+ return ret;
+ }
+
+ pool = kzalloc(poollen, GFP_KERNEL | GFP_DMA);
+ if (!pool)
+ return -ENOMEM;
+
+ /*
+ * pre-mapped descriptor pool
+ */
+ ret = dev->ops->shm(dev, NULL, query.dpid, 0,
+ pool, poollen, NULL, NULL, 0);
+ if (ret < 0) {
+ printk(KERN_ERR "Error registering L4RO pool: %d\n",
+ ret);
+ kfree(pool);
+ return ret;
+ }
+
+ /*
+ * page-queue: contains a ring of arbitrary pages for
+ * consumption by the host for when the SG::IOV count exceeds
+ * one MTU frame. All we need to do is keep it populated
+ * with free pages.
+ */
+ queue_init(priv, &priv->l4ro.pageq, "pageq", query.pqid,
+ count, NULL);
+
+ priv->l4ro.pool = pool;
+ priv->l4ro.available = true;
+ }
+
+ return 0;
+}
+
+static int
+vbus_enet_negcap(struct vbus_enet_priv *priv)
+{
+ int ret;
+
+ ret = vbus_enet_sg_negcap(priv);
+ if (ret < 0)
+ return ret;
+
+ ret = vbus_enet_evq_negcap(priv, tx_ringlen);
+ if (ret < 0)
+ return ret;
+
+ ret = vbus_enet_l4ro_negcap(priv, rx_ringlen);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
+static int vbus_enet_set_tx_csum(struct net_device *dev, u32 data)
+{
+ struct vbus_enet_priv *priv = netdev_priv(dev);
+
+ if (data && !priv->sg)
+ return -ENOSYS;
+
+ return ethtool_op_set_tx_hw_csum(dev, data);
+}
+
+static struct ethtool_ops vbus_enet_ethtool_ops = {
+ .set_tx_csum = vbus_enet_set_tx_csum,
+ .set_sg = ethtool_op_set_sg,
+ .set_tso = ethtool_op_set_tso,
+ .get_link = ethtool_op_get_link,
+};
+
+static const struct net_device_ops vbus_enet_netdev_ops = {
+ .ndo_open = vbus_enet_open,
+ .ndo_stop = vbus_enet_stop,
+ .ndo_set_config = vbus_enet_config,
+ .ndo_start_xmit = vbus_enet_tx_start,
+ .ndo_change_mtu = vbus_enet_change_mtu,
+ .ndo_tx_timeout = vbus_enet_timeout,
+ .ndo_set_mac_address = eth_mac_addr,
+ .ndo_validate_addr = eth_validate_addr,
+};
+
+/*
+ * This is called whenever a new vbus_device_proxy is added to the vbus
+ * with the matching VENET_ID
+ */
+static int
+vbus_enet_probe(struct vbus_device_proxy *vdev)
+{
+ struct net_device *dev;
+ struct vbus_enet_priv *priv;
+ int ret;
+
+ printk(KERN_INFO "VENET: Found new device at %lld\n", vdev->id);
+
+ ret = vdev->ops->open(vdev, VENET_VERSION, 0);
+ if (ret < 0)
+ return ret;
+
+ dev = alloc_etherdev(sizeof(struct vbus_enet_priv));
+ if (!dev)
+ return -ENOMEM;
+
+ /*
+ * establish our device-name early so we can incorporate it into
+ * the signal-path names, etc
+ */
+ rtnl_lock();
+
+ ret = dev_alloc_name(dev, dev->name);
+ if (ret < 0)
+ goto out_free;
+
+ priv = netdev_priv(dev);
+
+ spin_lock_init(&priv->lock);
+ priv->dev = dev;
+ priv->vdev = vdev;
+
+ ret = vbus_enet_negcap(priv);
+ if (ret < 0) {
+ printk(KERN_INFO "VENET: Error negotiating capabilities for " \
+ "%lld\n",
+ priv->vdev->id);
+ goto out_free;
+ }
+
+ if (priv->l4ro.available)
+ priv->import = &vbus_enet_l4ro_import;
+ else
+ priv->import = &vbus_enet_flat_import;
+
+ skb_queue_head_init(&priv->tx.outstanding);
+
+ queue_init(priv, &priv->rxq, "rx", VENET_QUEUE_RX, rx_ringlen,
+ rx_isr);
+ queue_init(priv, &priv->tx.veq, "tx", VENET_QUEUE_TX, tx_ringlen,
+ tx_isr);
+
+ rx_setup(priv);
+ tx_setup(priv);
+
+ ioq_notify_enable(priv->rxq.queue, 0); /* enable rx interrupts */
+
+ if (!priv->evq.txc) {
+ /*
+ * If the TXC feature is present, we will recieve our
+ * tx-complete notification via the event-channel. Therefore,
+ * we only enable txq interrupts if the TXC feature is not
+ * present.
+ */
+ tasklet_init(&priv->tx.task, deferred_tx_isr,
+ (unsigned long)priv);
+ ioq_notify_enable(priv->tx.veq.queue, 0);
+ }
+
+ dev->netdev_ops = &vbus_enet_netdev_ops;
+ dev->watchdog_timeo = 5 * HZ;
+ SET_ETHTOOL_OPS(dev, &vbus_enet_ethtool_ops);
+ SET_NETDEV_DEV(dev, &vdev->dev);
+
+ netif_napi_add(dev, &priv->napi, vbus_enet_poll, 128);
+
+ ret = devcall(priv, VENET_FUNC_MACQUERY, priv->dev->dev_addr, ETH_ALEN);
+ if (ret < 0) {
+ printk(KERN_INFO "VENET: Error obtaining MAC address for " \
+ "%lld\n",
+ priv->vdev->id);
+ goto out_free;
+ }
+
+ dev->features |= NETIF_F_HIGHDMA;
+
+ ret = register_netdevice(dev);
+ if (ret < 0) {
+ printk(KERN_INFO "VENET: error %i registering device \"%s\"\n",
+ ret, dev->name);
+ goto out_free;
+ }
+
+ rtnl_unlock();
+
+ vdev->priv = priv;
+
+ return 0;
+
+ out_free:
+ rtnl_unlock();
+
+ free_netdev(dev);
+
+ return ret;
+}
+
+static int
+vbus_enet_remove(struct vbus_device_proxy *vdev)
+{
+ struct vbus_enet_priv *priv = (struct vbus_enet_priv *)vdev->priv;
+ struct vbus_device_proxy *dev = priv->vdev;
+
+ unregister_netdev(priv->dev);
+ napi_disable(&priv->napi);
+
+ rx_teardown(priv);
+ ioq_put(priv->rxq.queue);
+
+ tx_teardown(priv);
+ ioq_put(priv->tx.veq.queue);
+
+ if (priv->evq.enabled)
+ evq_teardown(priv);
+
+ dev->ops->close(dev, 0);
+
+ free_netdev(priv->dev);
+
+ return 0;
+}
+
+/*
+ * Finally, the module stuff
+ */
+
+static struct vbus_driver_ops vbus_enet_driver_ops = {
+ .probe = vbus_enet_probe,
+ .remove = vbus_enet_remove,
+};
+
+static struct vbus_driver vbus_enet_driver = {
+ .type = VENET_TYPE,
+ .owner = THIS_MODULE,
+ .ops = &vbus_enet_driver_ops,
+};
+
+static __init int
+vbus_enet_init_module(void)
+{
+ printk(KERN_INFO "Virtual Ethernet: Copyright (C) 2009 Novell, Gregory Haskins\n");
+ printk(KERN_DEBUG "VENET: Using %d/%d queue depth\n",
+ rx_ringlen, tx_ringlen);
+ return vbus_driver_register(&vbus_enet_driver);
+}
+
+static __exit void
+vbus_enet_cleanup(void)
+{
+ vbus_driver_unregister(&vbus_enet_driver);
+}
+
+module_init(vbus_enet_init_module);
+module_exit(vbus_enet_cleanup);
+
+VBUS_DRIVER_AUTOPROBE(VENET_TYPE);
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 4598e9d2608f..bb6b67f6b0cc 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -705,19 +705,6 @@ static int virtnet_close(struct net_device *dev)
return 0;
}
-static void virtnet_get_drvinfo(struct net_device *dev,
- struct ethtool_drvinfo *drvinfo)
-{
- struct virtnet_info *vi = netdev_priv(dev);
- struct virtio_device *vdev = vi->vdev;
-
- strncpy(drvinfo->driver, KBUILD_MODNAME, ARRAY_SIZE(drvinfo->driver));
- strncpy(drvinfo->version, "N/A", ARRAY_SIZE(drvinfo->version));
- strncpy(drvinfo->fw_version, "N/A", ARRAY_SIZE(drvinfo->fw_version));
- strncpy(drvinfo->bus_info, dev_name(&vdev->dev),
- ARRAY_SIZE(drvinfo->bus_info));
-}
-
static int virtnet_set_tx_csum(struct net_device *dev, u32 data)
{
struct virtnet_info *vi = netdev_priv(dev);
@@ -830,7 +817,6 @@ static void virtnet_vlan_rx_kill_vid(struct net_device *dev, u16 vid)
}
static const struct ethtool_ops virtnet_ethtool_ops = {
- .get_drvinfo = virtnet_get_drvinfo,
.set_tx_csum = virtnet_set_tx_csum,
.set_sg = ethtool_op_set_sg,
.set_tso = ethtool_op_set_tso,
diff --git a/drivers/net/vxge/vxge-main.c b/drivers/net/vxge/vxge-main.c
index c7c5605b3728..f5334b287fdb 100644
--- a/drivers/net/vxge/vxge-main.c
+++ b/drivers/net/vxge/vxge-main.c
@@ -2159,8 +2159,8 @@ start:
/* Alarm MSIX Vectors count */
vdev->intr_cnt++;
- vdev->entries = kzalloc(vdev->intr_cnt * sizeof(struct msix_entry),
- GFP_KERNEL);
+ vdev->entries = kcalloc(vdev->intr_cnt, sizeof(struct msix_entry),
+ GFP_KERNEL);
if (!vdev->entries) {
vxge_debug_init(VXGE_ERR,
"%s: memory allocation failed",
@@ -2169,9 +2169,9 @@ start:
goto alloc_entries_failed;
}
- vdev->vxge_entries =
- kzalloc(vdev->intr_cnt * sizeof(struct vxge_msix_entry),
- GFP_KERNEL);
+ vdev->vxge_entries = kcalloc(vdev->intr_cnt,
+ sizeof(struct vxge_msix_entry),
+ GFP_KERNEL);
if (!vdev->vxge_entries) {
vxge_debug_init(VXGE_ERR, "%s: memory allocation failed",
VXGE_DRIVER_NAME);
diff --git a/drivers/net/wan/c101.c b/drivers/net/wan/c101.c
index 0bd898c94759..4ac85a09c5a6 100644
--- a/drivers/net/wan/c101.c
+++ b/drivers/net/wan/c101.c
@@ -264,7 +264,7 @@ static int c101_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
new_line.clock_type != CLOCK_TXFROMRX &&
new_line.clock_type != CLOCK_INT &&
new_line.clock_type != CLOCK_TXINT)
- return -EINVAL; /* No such clock setting */
+ return -EINVAL; /* No such clock setting */
if (new_line.loopback != 0 && new_line.loopback != 1)
return -EINVAL;
diff --git a/drivers/net/wan/n2.c b/drivers/net/wan/n2.c
index 5394b51bdb2f..7a3720f09ce3 100644
--- a/drivers/net/wan/n2.c
+++ b/drivers/net/wan/n2.c
@@ -282,7 +282,7 @@ static int n2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
new_line.clock_type != CLOCK_TXFROMRX &&
new_line.clock_type != CLOCK_INT &&
new_line.clock_type != CLOCK_TXINT)
- return -EINVAL; /* No such clock setting */
+ return -EINVAL; /* No such clock setting */
if (new_line.loopback != 0 && new_line.loopback != 1)
return -EINVAL;
diff --git a/drivers/net/wan/pci200syn.c b/drivers/net/wan/pci200syn.c
index e2cff64a446a..fd7375955e41 100644
--- a/drivers/net/wan/pci200syn.c
+++ b/drivers/net/wan/pci200syn.c
@@ -220,7 +220,7 @@ static int pci200_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
new_line.clock_type != CLOCK_TXFROMRX &&
new_line.clock_type != CLOCK_INT &&
new_line.clock_type != CLOCK_TXINT)
- return -EINVAL; /* No such clock setting */
+ return -EINVAL; /* No such clock setting */
if (new_line.loopback != 0 && new_line.loopback != 1)
return -EINVAL;
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
index 1d05445d4ba3..7d26506957d7 100644
--- a/drivers/net/wireless/airo.c
+++ b/drivers/net/wireless/airo.c
@@ -2723,9 +2723,8 @@ static int airo_networks_allocate(struct airo_info *ai)
if (ai->networks)
return 0;
- ai->networks =
- kzalloc(AIRO_MAX_NETWORK_COUNT * sizeof(BSSListElement),
- GFP_KERNEL);
+ ai->networks = kcalloc(AIRO_MAX_NETWORK_COUNT, sizeof(BSSListElement),
+ GFP_KERNEL);
if (!ai->networks) {
airo_print_warn("", "Out of memory allocating beacons");
return -ENOMEM;
diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c
index d5140a87f073..a267bf55574c 100644
--- a/drivers/net/wireless/at76c50x-usb.c
+++ b/drivers/net/wireless/at76c50x-usb.c
@@ -2061,11 +2061,12 @@ static int at76_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
int i;
- at76_dbg(DBG_MAC80211, "%s(): cmd %d key->alg %d key->keyidx %d "
+ at76_dbg(DBG_MAC80211, "%s(): cmd %d key->cipher %d key->keyidx %d "
"key->keylen %d",
- __func__, cmd, key->alg, key->keyidx, key->keylen);
+ __func__, cmd, key->cipher, key->keyidx, key->keylen);
- if (key->alg != ALG_WEP)
+ if ((key->cipher != WLAN_CIPHER_SUITE_WEP40) &&
+ (key->cipher != WLAN_CIPHER_SUITE_WEP104))
return -EOPNOTSUPP;
key->hw_key_idx = key->keyidx;
diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c
index c67b05f3bcbd..29d2253ad7e4 100644
--- a/drivers/net/wireless/ath/ar9170/main.c
+++ b/drivers/net/wireless/ath/ar9170/main.c
@@ -1190,14 +1190,13 @@ static int ar9170_tx_prepare(struct ar9170 *ar, struct sk_buff *skb)
if (info->control.hw_key) {
icv = info->control.hw_key->icv_len;
- switch (info->control.hw_key->alg) {
- case ALG_WEP:
+ switch (info->control.hw_key->cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
+ case WLAN_CIPHER_SUITE_TKIP:
keytype = AR9170_TX_MAC_ENCR_RC4;
break;
- case ALG_TKIP:
- keytype = AR9170_TX_MAC_ENCR_RC4;
- break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
keytype = AR9170_TX_MAC_ENCR_AES;
break;
default:
@@ -1778,17 +1777,17 @@ static int ar9170_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
if ((!ar->vif) || (ar->disable_offload))
return -EOPNOTSUPP;
- switch (key->alg) {
- case ALG_WEP:
- if (key->keylen == WLAN_KEY_LEN_WEP40)
- ktype = AR9170_ENC_ALG_WEP64;
- else
- ktype = AR9170_ENC_ALG_WEP128;
+ switch (key->cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ ktype = AR9170_ENC_ALG_WEP64;
+ break;
+ case WLAN_CIPHER_SUITE_WEP104:
+ ktype = AR9170_ENC_ALG_WEP128;
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
ktype = AR9170_ENC_ALG_TKIP;
break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
ktype = AR9170_ENC_ALG_AESCCMP;
break;
default:
@@ -1827,7 +1826,7 @@ static int ar9170_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
if (err)
goto out;
- if (key->alg == ALG_TKIP) {
+ if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
err = ar9170_upload_key(ar, i, sta ? sta->addr : NULL,
ktype, 1, key->key + 16, 16);
if (err)
@@ -1864,7 +1863,7 @@ static int ar9170_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
if (err)
goto out;
- if (key->alg == ALG_TKIP) {
+ if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
err = ar9170_upload_key(ar, key->hw_key_idx,
NULL,
AR9170_ENC_ALG_NONE, 1,
diff --git a/drivers/net/wireless/ath/ath5k/ani.c b/drivers/net/wireless/ath/ath5k/ani.c
index 26dbe65fedb0..e4a5f046bba4 100644
--- a/drivers/net/wireless/ath/ath5k/ani.c
+++ b/drivers/net/wireless/ath/ath5k/ani.c
@@ -552,9 +552,9 @@ ath5k_ani_mib_intr(struct ath5k_hw *ah)
if (ah->ah_sc->ani_state.ani_mode != ATH5K_ANI_MODE_AUTO)
return;
- /* if one of the errors triggered, we can get a superfluous second
- * interrupt, even though we have already reset the register. the
- * function detects that so we can return early */
+ /* If one of the errors triggered, we can get a superfluous second
+ * interrupt, even though we have already reset the register. The
+ * function detects that so we can return early. */
if (ath5k_ani_save_and_clear_phy_errors(ah, as) == 0)
return;
diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h
index ea6362a8988d..f399c4dd8e69 100644
--- a/drivers/net/wireless/ath/ath5k/ath5k.h
+++ b/drivers/net/wireless/ath/ath5k/ath5k.h
@@ -175,7 +175,7 @@
#define AR5K_TUNE_ADDITIONAL_SWBA_BACKOFF 0
#define AR5K_TUNE_RADAR_ALERT false
#define AR5K_TUNE_MIN_TX_FIFO_THRES 1
-#define AR5K_TUNE_MAX_TX_FIFO_THRES ((IEEE80211_MAX_LEN / 64) + 1)
+#define AR5K_TUNE_MAX_TX_FIFO_THRES ((IEEE80211_MAX_FRAME_LEN / 64) + 1)
#define AR5K_TUNE_REGISTER_TIMEOUT 20000
/* Register for RSSI threshold has a mask of 0xff, so 255 seems to
* be the max value. */
@@ -343,9 +343,6 @@ struct ath5k_srev_name {
#define AR5K_SREV_PHY_5413 0x61
#define AR5K_SREV_PHY_2425 0x70
-/* IEEE defs */
-#define IEEE80211_MAX_LEN 2500
-
/* TODO add support to mac80211 for vendor-specific rates and modes */
/*
@@ -1190,7 +1187,7 @@ extern int ath5k_hw_set_opmode(struct ath5k_hw *ah, enum nl80211_iftype opmode);
void ath5k_hw_set_coverage_class(struct ath5k_hw *ah, u8 coverage_class);
/* BSSID Functions */
int ath5k_hw_set_lladdr(struct ath5k_hw *ah, const u8 *mac);
-void ath5k_hw_set_associd(struct ath5k_hw *ah);
+void ath5k_hw_set_bssid(struct ath5k_hw *ah);
void ath5k_hw_set_bssid_mask(struct ath5k_hw *ah, const u8 *mask);
/* Receive start/stop functions */
void ath5k_hw_start_rx_pcu(struct ath5k_hw *ah);
diff --git a/drivers/net/wireless/ath/ath5k/attach.c b/drivers/net/wireless/ath/ath5k/attach.c
index b32e28caeee2..aabad4f13e2a 100644
--- a/drivers/net/wireless/ath/ath5k/attach.c
+++ b/drivers/net/wireless/ath/ath5k/attach.c
@@ -139,12 +139,12 @@ int ath5k_hw_attach(struct ath5k_softc *sc)
else
ah->ah_version = AR5K_AR5212;
- /*Fill the ath5k_hw struct with the needed functions*/
+ /* Fill the ath5k_hw struct with the needed functions */
ret = ath5k_hw_init_desc_functions(ah);
if (ret)
goto err_free;
- /* Bring device out of sleep and reset it's units */
+ /* Bring device out of sleep and reset its units */
ret = ath5k_hw_nic_wakeup(ah, 0, true);
if (ret)
goto err_free;
@@ -158,7 +158,7 @@ int ath5k_hw_attach(struct ath5k_softc *sc)
CHANNEL_5GHZ);
ah->ah_phy = AR5K_PHY(0);
- /* Try to identify radio chip based on it's srev */
+ /* Try to identify radio chip based on its srev */
switch (ah->ah_radio_5ghz_revision & 0xf0) {
case AR5K_SREV_RAD_5111:
ah->ah_radio = AR5K_RF5111;
@@ -329,7 +329,7 @@ int ath5k_hw_attach(struct ath5k_softc *sc)
/* Set BSSID to bcast address: ff:ff:ff:ff:ff:ff for now */
memcpy(common->curbssid, ath_bcast_mac, ETH_ALEN);
- ath5k_hw_set_associd(ah);
+ ath5k_hw_set_bssid(ah);
ath5k_hw_set_opmode(ah, sc->opmode);
ath5k_hw_rfgain_opt_init(ah);
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index 0d5de2574dd1..f2fceb10c9fc 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -48,6 +48,7 @@
#include <linux/netdevice.h>
#include <linux/cache.h>
#include <linux/pci.h>
+#include <linux/pci-aspm.h>
#include <linux/ethtool.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
@@ -476,6 +477,26 @@ ath5k_pci_probe(struct pci_dev *pdev,
int ret;
u8 csz;
+ /*
+ * L0s needs to be disabled on all ath5k cards.
+ *
+ * For distributions shipping with CONFIG_PCIEASPM (this will be enabled
+ * by default in the future in 2.6.36) this will also mean both L1 and
+ * L0s will be disabled when a pre 1.1 PCIe device is detected. We do
+ * know L1 works correctly even for all ath5k pre 1.1 PCIe devices
+ * though but cannot currently undue the effect of a blacklist, for
+ * details you can read pcie_aspm_sanity_check() and see how it adjusts
+ * the device link capability.
+ *
+ * It may be possible in the future to implement some PCI API to allow
+ * drivers to override blacklists for pre 1.1 PCIe but for now it is
+ * best to accept that both L0s and L1 will be disabled completely for
+ * distributions shipping with CONFIG_PCIEASPM rather than having this
+ * issue present. Motivation for adding this new API will be to help
+ * with power consumption for some of these devices.
+ */
+ pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S);
+
ret = pci_enable_device(pdev);
if (ret) {
dev_err(&pdev->dev, "can't enable device\n");
@@ -591,7 +612,7 @@ ath5k_pci_probe(struct pci_dev *pdev,
goto err_free;
}
- /*If we passed the test malloc a ath5k_hw struct*/
+ /* If we passed the test, malloc an ath5k_hw struct */
sc->ah = kzalloc(sizeof(struct ath5k_hw), GFP_KERNEL);
if (!sc->ah) {
ret = -ENOMEM;
@@ -765,8 +786,8 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
/*
* Check if the MAC has multi-rate retry support.
* We do this by trying to setup a fake extended
- * descriptor. MAC's that don't have support will
- * return false w/o doing anything. MAC's that do
+ * descriptor. MACs that don't have support will
+ * return false w/o doing anything. MACs that do
* support it will return true w/o doing anything.
*/
ret = ath5k_hw_setup_mrr_tx_desc(ah, NULL, 0, 0, 0, 0, 0, 0);
@@ -806,7 +827,7 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
/*
* Allocate hardware transmit queues: one queue for
* beacon frames and one data queue for each QoS
- * priority. Note that hw functions handle reseting
+ * priority. Note that hw functions handle resetting
* these queues at the needed time.
*/
ret = ath5k_beaconq_setup(ah);
@@ -888,7 +909,7 @@ ath5k_detach(struct pci_dev *pdev, struct ieee80211_hw *hw)
/*
* NB: the order of these is important:
* o call the 802.11 layer before detaching ath5k_hw to
- * insure callbacks into the driver to delete global
+ * ensure callbacks into the driver to delete global
* key cache entries can be handled
* o reclaim the tx queue data structures after calling
* the 802.11 layer as we'll get called back to reclaim
@@ -1493,7 +1514,7 @@ ath5k_txq_setup(struct ath5k_softc *sc,
/*
* Enable interrupts only for EOL and DESC conditions.
* We mark tx descriptors to receive a DESC interrupt
- * when a tx queue gets deep; otherwise waiting for the
+ * when a tx queue gets deep; otherwise we wait for the
* EOL to reap descriptors. Note that this is done to
* reduce interrupt load and this only defers reaping
* descriptors, never transmitting frames. Aside from
@@ -1688,7 +1709,7 @@ ath5k_rx_start(struct ath5k_softc *sc)
struct ath5k_buf *bf;
int ret;
- common->rx_bufsize = roundup(IEEE80211_MAX_LEN, common->cachelsz);
+ common->rx_bufsize = roundup(IEEE80211_MAX_FRAME_LEN, common->cachelsz);
ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "cachelsz %u rx_bufsize %u\n",
common->cachelsz, common->rx_bufsize);
@@ -1838,7 +1859,7 @@ ath5k_update_beacon_rssi(struct ath5k_softc *sc, struct sk_buff *skb, int rssi)
}
/*
- * Compute padding position. skb must contains an IEEE 802.11 frame
+ * Compute padding position. skb must contain an IEEE 802.11 frame
*/
static int ath5k_common_padpos(struct sk_buff *skb)
{
@@ -1857,10 +1878,9 @@ static int ath5k_common_padpos(struct sk_buff *skb)
}
/*
- * This function expects a 802.11 frame and returns the number of
- * bytes added, or -1 if we don't have enought header room.
+ * This function expects an 802.11 frame and returns the number of
+ * bytes added, or -1 if we don't have enough header room.
*/
-
static int ath5k_add_padding(struct sk_buff *skb)
{
int padpos = ath5k_common_padpos(skb);
@@ -1880,10 +1900,18 @@ static int ath5k_add_padding(struct sk_buff *skb)
}
/*
- * This function expects a 802.11 frame and returns the number of
- * bytes removed
+ * The MAC header is padded to have 32-bit boundary if the
+ * packet payload is non-zero. The general calculation for
+ * padsize would take into account odd header lengths:
+ * padsize = 4 - (hdrlen & 3); however, since only
+ * even-length headers are used, padding can only be 0 or 2
+ * bytes and we can optimize this a bit. We must not try to
+ * remove padding from short control frames that do not have a
+ * payload.
+ *
+ * This function expects an 802.11 frame and returns the number of
+ * bytes removed.
*/
-
static int ath5k_remove_padding(struct sk_buff *skb)
{
int padpos = ath5k_common_padpos(skb);
@@ -1904,14 +1932,6 @@ ath5k_receive_frame(struct ath5k_softc *sc, struct sk_buff *skb,
{
struct ieee80211_rx_status *rxs;
- /* The MAC header is padded to have 32-bit boundary if the
- * packet payload is non-zero. The general calculation for
- * padsize would take into account odd header lengths:
- * padsize = (4 - hdrlen % 4) % 4; However, since only
- * even-length headers are used, padding can only be 0 or 2
- * bytes and we can optimize this a bit. In addition, we must
- * not try to remove padding from short control frames that do
- * not have payload. */
ath5k_remove_padding(skb);
rxs = IEEE80211_SKB_RXCB(skb);
@@ -2015,9 +2035,8 @@ ath5k_receive_frame_ok(struct ath5k_softc *sc, struct ath5k_rx_status *rs)
return true;
}
- /* let crypto-error packets fall through in MNTR */
- if ((rs->rs_status & ~(AR5K_RXERR_DECRYPT|AR5K_RXERR_MIC)) ||
- sc->opmode != NL80211_IFTYPE_MONITOR)
+ /* reject any frames with non-crypto errors */
+ if (rs->rs_status & ~(AR5K_RXERR_DECRYPT))
return false;
}
@@ -2260,10 +2279,11 @@ ath5k_beacon_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
* default antenna which is supposed to be an omni.
*
* Note2: On sectored scenarios it's possible to have
- * multiple antennas (1omni -the default- and 14 sectors)
- * so if we choose to actually support this mode we need
- * to allow user to set how many antennas we have and tweak
- * the code below to send beacons on all of them.
+ * multiple antennas (1 omni -- the default -- and 14
+ * sectors), so if we choose to actually support this
+ * mode, we need to allow the user to set how many antennas
+ * we have and tweak the code below to send beacons
+ * on all of them.
*/
if (ah->ah_ant_mode == AR5K_ANTMODE_SECTOR_AP)
antenna = sc->bsent & 4 ? 2 : 1;
@@ -2305,14 +2325,13 @@ ath5k_beacon_send(struct ath5k_softc *sc)
ATH5K_DBG_UNLIMIT(sc, ATH5K_DEBUG_BEACON, "in beacon_send\n");
- if (unlikely(bf->skb == NULL || sc->opmode == NL80211_IFTYPE_STATION ||
- sc->opmode == NL80211_IFTYPE_MONITOR)) {
+ if (unlikely(bf->skb == NULL || sc->opmode == NL80211_IFTYPE_STATION)) {
ATH5K_WARN(sc, "bf=%p bf_skb=%p\n", bf, bf ? bf->skb : NULL);
return;
}
/*
* Check if the previous beacon has gone out. If
- * not don't don't try to post another, skip this
+ * not, don't don't try to post another: skip this
* period and wait for the next. Missed beacons
* indicate a problem and should not occur. If we
* miss too many consecutive beacons reset the device.
@@ -2880,12 +2899,9 @@ static int ath5k_tx_queue(struct ieee80211_hw *hw, struct sk_buff *skb,
ath5k_debug_dump_skb(sc, skb, "TX ", 1);
- if (sc->opmode == NL80211_IFTYPE_MONITOR)
- ATH5K_DBG(sc, ATH5K_DEBUG_XMIT, "tx in monitor (scan?)\n");
-
/*
- * the hardware expects the header padded to 4 byte boundaries
- * if this is not the case we add the padding after the header
+ * The hardware expects the header padded to 4 byte boundaries.
+ * If this is not the case, we add the padding after the header.
*/
padsize = ath5k_add_padding(skb);
if (padsize < 0) {
@@ -3028,7 +3044,6 @@ static int ath5k_add_interface(struct ieee80211_hw *hw,
case NL80211_IFTYPE_STATION:
case NL80211_IFTYPE_ADHOC:
case NL80211_IFTYPE_MESH_POINT:
- case NL80211_IFTYPE_MONITOR:
sc->opmode = vif->type;
break;
default:
@@ -3212,9 +3227,9 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
rfilt |= AR5K_RX_FILTER_PHYERR;
/* FIF_BCN_PRBRESP_PROMISC really means to enable beacons
- * and probes for any BSSID, this needs testing */
+ * and probes for any BSSID */
if (*new_flags & FIF_BCN_PRBRESP_PROMISC)
- rfilt |= AR5K_RX_FILTER_BEACON | AR5K_RX_FILTER_PROBEREQ;
+ rfilt |= AR5K_RX_FILTER_BEACON;
/* FIF_CONTROL doc says that if FIF_PROMISC_IN_BSS is not
* set we should only pass on control frames for this
@@ -3230,7 +3245,6 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
switch (sc->opmode) {
case NL80211_IFTYPE_MESH_POINT:
- case NL80211_IFTYPE_MONITOR:
rfilt |= AR5K_RX_FILTER_CONTROL |
AR5K_RX_FILTER_BEACON |
AR5K_RX_FILTER_PROBEREQ |
@@ -3253,7 +3267,7 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
/* Set multicast bits */
ath5k_hw_set_mcast_filter(ah, mfilt[0], mfilt[1]);
- /* Set the cached hw filter flags, this will alter actually
+ /* Set the cached hw filter flags, this will later actually
* be set in HW */
sc->filter_flags = rfilt;
@@ -3276,11 +3290,12 @@ ath5k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
if (sc->opmode == NL80211_IFTYPE_AP)
return -EOPNOTSUPP;
- switch (key->alg) {
- case ALG_WEP:
- case ALG_TKIP:
+ switch (key->cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
+ case WLAN_CIPHER_SUITE_TKIP:
break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
if (sc->ah->ah_aes_support)
break;
@@ -3454,7 +3469,7 @@ static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
/* Cache for later use during resets */
memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
common->curaid = 0;
- ath5k_hw_set_associd(ah);
+ ath5k_hw_set_bssid(ah);
mmiowb();
}
@@ -3472,7 +3487,7 @@ static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
"Bss Info ASSOC %d, bssid: %pM\n",
bss_conf->aid, common->curbssid);
common->curaid = bss_conf->aid;
- ath5k_hw_set_associd(ah);
+ ath5k_hw_set_bssid(ah);
/* Once ANI is available you would start it here */
}
}
diff --git a/drivers/net/wireless/ath/ath5k/dma.c b/drivers/net/wireless/ath/ath5k/dma.c
index 484f31870ba8..58bb6c5dda7b 100644
--- a/drivers/net/wireless/ath/ath5k/dma.c
+++ b/drivers/net/wireless/ath/ath5k/dma.c
@@ -377,11 +377,11 @@ int ath5k_hw_set_txdp(struct ath5k_hw *ah, unsigned int queue, u32 phys_addr)
*
* This function increases/decreases the tx trigger level for the tx fifo
* buffer (aka FIFO threshold) that is used to indicate when PCU flushes
- * the buffer and transmits it's data. Lowering this results sending small
+ * the buffer and transmits its data. Lowering this results sending small
* frames more quickly but can lead to tx underruns, raising it a lot can
* result other problems (i think bmiss is related). Right now we start with
* the lowest possible (64Bytes) and if we get tx underrun we increase it using
- * the increase flag. Returns -EIO if we have have reached maximum/minimum.
+ * the increase flag. Returns -EIO if we have reached maximum/minimum.
*
* XXX: Link this with tx DMA size ?
* XXX: Use it to save interrupts ?
diff --git a/drivers/net/wireless/ath/ath5k/eeprom.c b/drivers/net/wireless/ath/ath5k/eeprom.c
index ae316fec4a6a..39722dd73e43 100644
--- a/drivers/net/wireless/ath/ath5k/eeprom.c
+++ b/drivers/net/wireless/ath/ath5k/eeprom.c
@@ -661,7 +661,7 @@ ath5k_eeprom_init_11bg_2413(struct ath5k_hw *ah, unsigned int mode, int offset)
* (eeprom versions < 4). For RF5111 we have 11 pre-defined PCDAC
* steps that match with the power values we read from eeprom. On
* older eeprom versions (< 3.2) these steps are equaly spaced at
- * 10% of the pcdac curve -until the curve reaches it's maximum-
+ * 10% of the pcdac curve -until the curve reaches its maximum-
* (11 steps from 0 to 100%) but on newer eeprom versions (>= 3.2)
* these 11 steps are spaced in a different way. This function returns
* the pcdac steps based on eeprom version and curve min/max so that we
@@ -1113,7 +1113,7 @@ ath5k_eeprom_read_pcal_info_5112(struct ath5k_hw *ah, int mode)
*/
/* For RF2413 power calibration data doesn't start on a fixed location and
- * if a mode is not supported, it's section is missing -not zeroed-.
+ * if a mode is not supported, its section is missing -not zeroed-.
* So we need to calculate the starting offset for each section by using
* these two functions */
diff --git a/drivers/net/wireless/ath/ath5k/pcu.c b/drivers/net/wireless/ath/ath5k/pcu.c
index 86fdb6ddfaaa..3fef5931ec3a 100644
--- a/drivers/net/wireless/ath/ath5k/pcu.c
+++ b/drivers/net/wireless/ath/ath5k/pcu.c
@@ -308,27 +308,26 @@ int ath5k_hw_set_lladdr(struct ath5k_hw *ah, const u8 *mac)
}
/**
- * ath5k_hw_set_associd - Set BSSID for association
+ * ath5k_hw_set_bssid - Set current BSSID on hw
*
* @ah: The &struct ath5k_hw
- * @bssid: BSSID
- * @assoc_id: Assoc id
*
- * Sets the BSSID which trigers the "SME Join" operation
+ * Sets the current BSSID and BSSID mask we have from the
+ * common struct into the hardware
*/
-void ath5k_hw_set_associd(struct ath5k_hw *ah)
+void ath5k_hw_set_bssid(struct ath5k_hw *ah)
{
struct ath_common *common = ath5k_hw_common(ah);
u16 tim_offset = 0;
/*
- * Set simple BSSID mask on 5212
+ * Set BSSID mask on 5212
*/
if (ah->ah_version == AR5K_AR5212)
ath_hw_setbssidmask(common);
/*
- * Set BSSID which triggers the "SME Join" operation
+ * Set BSSID
*/
ath5k_hw_reg_write(ah,
get_unaligned_le32(common->curbssid),
@@ -695,21 +694,18 @@ int ath5k_hw_reset_key(struct ath5k_hw *ah, u16 entry)
static
int ath5k_keycache_type(const struct ieee80211_key_conf *key)
{
- switch (key->alg) {
- case ALG_TKIP:
+ switch (key->cipher) {
+ case WLAN_CIPHER_SUITE_TKIP:
return AR5K_KEYTABLE_TYPE_TKIP;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
return AR5K_KEYTABLE_TYPE_CCM;
- case ALG_WEP:
- if (key->keylen == WLAN_KEY_LEN_WEP40)
- return AR5K_KEYTABLE_TYPE_40;
- else if (key->keylen == WLAN_KEY_LEN_WEP104)
- return AR5K_KEYTABLE_TYPE_104;
- return -EINVAL;
+ case WLAN_CIPHER_SUITE_WEP40:
+ return AR5K_KEYTABLE_TYPE_40;
+ case WLAN_CIPHER_SUITE_WEP104:
+ return AR5K_KEYTABLE_TYPE_104;
default:
return -EINVAL;
}
- return -EINVAL;
}
/*
@@ -728,7 +724,7 @@ int ath5k_hw_set_key(struct ath5k_hw *ah, u16 entry,
bool is_tkip;
const u8 *key_ptr;
- is_tkip = (key->alg == ALG_TKIP);
+ is_tkip = (key->cipher == WLAN_CIPHER_SUITE_TKIP);
/*
* key->keylen comes in from mac80211 in bytes.
diff --git a/drivers/net/wireless/ath/ath5k/phy.c b/drivers/net/wireless/ath/ath5k/phy.c
index 6284c389ba18..c7c446592374 100644
--- a/drivers/net/wireless/ath/ath5k/phy.c
+++ b/drivers/net/wireless/ath/ath5k/phy.c
@@ -115,7 +115,7 @@ static unsigned int ath5k_hw_rfb_op(struct ath5k_hw *ah,
\**********************/
/*
- * This code is used to optimize rf gain on different environments
+ * This code is used to optimize RF gain on different environments
* (temperature mostly) based on feedback from a power detector.
*
* It's only used on RF5111 and RF5112, later RF chips seem to have
@@ -302,7 +302,7 @@ static bool ath5k_hw_rf_check_gainf_readback(struct ath5k_hw *ah)
}
/* Perform gain_F adjustment by choosing the right set
- * of parameters from rf gain optimization ladder */
+ * of parameters from RF gain optimization ladder */
static s8 ath5k_hw_rf_gainf_adjust(struct ath5k_hw *ah)
{
const struct ath5k_gain_opt *go;
@@ -367,7 +367,7 @@ done:
return ret;
}
-/* Main callback for thermal rf gain calibration engine
+/* Main callback for thermal RF gain calibration engine
* Check for a new gain reading and schedule an adjustment
* if needed.
*
@@ -433,7 +433,7 @@ done:
return ah->ah_gain.g_state;
}
-/* Write initial rf gain table to set the RF sensitivity
+/* Write initial RF gain table to set the RF sensitivity
* this one works on all RF chips and has nothing to do
* with gain_F calibration */
int ath5k_hw_rfgain_init(struct ath5k_hw *ah, unsigned int freq)
@@ -496,7 +496,7 @@ int ath5k_hw_rfgain_init(struct ath5k_hw *ah, unsigned int freq)
/*
- * Setup RF registers by writing rf buffer on hw
+ * Setup RF registers by writing RF buffer on hw
*/
int ath5k_hw_rfregs_init(struct ath5k_hw *ah, struct ieee80211_channel *channel,
unsigned int mode)
@@ -571,7 +571,7 @@ int ath5k_hw_rfregs_init(struct ath5k_hw *ah, struct ieee80211_channel *channel,
return -EINVAL;
}
- /* If it's the first time we set rf buffer, allocate
+ /* If it's the first time we set RF buffer, allocate
* ah->ah_rf_banks based on ah->ah_rf_banks_size
* we set above */
if (ah->ah_rf_banks == NULL) {
@@ -3035,9 +3035,6 @@ ath5k_hw_txpower(struct ath5k_hw *ah, struct ieee80211_channel *channel,
/* Limit max power if we have a CTL available */
ath5k_get_max_ctl_power(ah, channel);
- /* FIXME: Tx power limit for this regdomain
- * XXX: Mac80211/CRDA will do that anyway ? */
-
/* FIXME: Antenna reduction stuff */
/* FIXME: Limit power on turbo modes */
diff --git a/drivers/net/wireless/ath/ath5k/reg.h b/drivers/net/wireless/ath/ath5k/reg.h
index 55b4ac6d236f..05ef587ad2b4 100644
--- a/drivers/net/wireless/ath/ath5k/reg.h
+++ b/drivers/net/wireless/ath/ath5k/reg.h
@@ -1911,7 +1911,7 @@
#define AR5K_PHY_TURBO 0x9804 /* Register Address */
#define AR5K_PHY_TURBO_MODE 0x00000001 /* Enable turbo mode */
#define AR5K_PHY_TURBO_SHORT 0x00000002 /* Set short symbols to turbo mode */
-#define AR5K_PHY_TURBO_MIMO 0x00000004 /* Set turbo for mimo mimo */
+#define AR5K_PHY_TURBO_MIMO 0x00000004 /* Set turbo for mimo */
/*
* PHY agility command register
diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c
index 498aa28ea9e6..4154959125b6 100644
--- a/drivers/net/wireless/ath/ath5k/reset.c
+++ b/drivers/net/wireless/ath/ath5k/reset.c
@@ -959,7 +959,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
AR5K_QUEUE_DCU_SEQNUM(0));
}
- /* TSF accelerates on AR5211 durring reset
+ /* TSF accelerates on AR5211 during reset
* As a workaround save it here and restore
* it later so that it's back in time after
* reset. This way it'll get re-synced on the
@@ -1080,7 +1080,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
return ret;
/* Spur info is available only from EEPROM versions
- * bigger than 5.3 but but the EEPOM routines will use
+ * greater than 5.3, but the EEPROM routines will use
* static values for older versions */
if (ah->ah_mac_srev >= AR5K_SREV_AR5424)
ath5k_hw_set_spur_mitigation_filter(ah,
@@ -1160,7 +1160,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
*/
/* Restore bssid and bssid mask */
- ath5k_hw_set_associd(ah);
+ ath5k_hw_set_bssid(ah);
/* Set PCU config */
ath5k_hw_set_opmode(ah, op_mode);
@@ -1173,11 +1173,11 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
/* Set RSSI/BRSSI thresholds
*
* Note: If we decide to set this value
- * dynamicaly, have in mind that when AR5K_RSSI_THR
- * register is read it might return 0x40 if we haven't
- * wrote anything to it plus BMISS RSSI threshold is zeroed.
+ * dynamically, keep in mind that when AR5K_RSSI_THR
+ * register is read, it might return 0x40 if we haven't
+ * written anything to it. Also, BMISS RSSI threshold is zeroed.
* So doing a save/restore procedure here isn't the right
- * choice. Instead store it on ath5k_hw */
+ * choice. Instead, store it in ath5k_hw */
ath5k_hw_reg_write(ah, (AR5K_TUNE_RSSI_THRES |
AR5K_TUNE_BMISS_THRES <<
AR5K_RSSI_THR_BMISS_S),
@@ -1235,7 +1235,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
/*
* Perform ADC test to see if baseband is ready
- * Set tx hold and check adc test register
+ * Set TX hold and check ADC test register
*/
phy_tst1 = ath5k_hw_reg_read(ah, AR5K_PHY_TST1);
ath5k_hw_reg_write(ah, AR5K_PHY_TST1_TXHOLD, AR5K_PHY_TST1);
@@ -1254,15 +1254,15 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
*
* This method is used to calibrate some static offsets
* used together with on-the fly I/Q calibration (the
- * one performed via ath5k_hw_phy_calibrate), that doesn't
+ * one performed via ath5k_hw_phy_calibrate), which doesn't
* interrupt rx path.
*
* While rx path is re-routed to the power detector we also
- * start a noise floor calibration, to measure the
+ * start a noise floor calibration to measure the
* card's noise floor (the noise we measure when we are not
- * transmiting or receiving anything).
+ * transmitting or receiving anything).
*
- * If we are in a noisy environment AGC calibration may time
+ * If we are in a noisy environment, AGC calibration may time
* out and/or noise floor calibration might timeout.
*/
AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_AGCCTL,
diff --git a/drivers/net/wireless/ath/ath5k/rfbuffer.h b/drivers/net/wireless/ath/ath5k/rfbuffer.h
index e50baff66175..3ac4cff4239d 100644
--- a/drivers/net/wireless/ath/ath5k/rfbuffer.h
+++ b/drivers/net/wireless/ath/ath5k/rfbuffer.h
@@ -25,10 +25,10 @@
*
* We don't write on those registers directly but
* we send a data packet on the chip, using a special register,
- * that holds all the settings we need. After we 've sent the
+ * that holds all the settings we need. After we've sent the
* data packet, we write on another special register to notify hw
* to apply the settings. This is done so that control registers
- * can be dynamicaly programmed during operation and the settings
+ * can be dynamically programmed during operation and the settings
* are applied faster on the hw.
*
* We call each data packet an "RF Bank" and all the data we write
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
index 5b995bee70ae..a462da23e87e 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
@@ -185,7 +185,7 @@ static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
ath_print(common, ATH_DBG_INTERRUPT,
"AR_INTR_SYNC_LOCAL_TIMEOUT\n");
- REG_WRITE(ah, AR_INTR_SYNC_CAUSE_CLR, sync_cause);
+ REG_WRITE(ah, AR_INTR_SYNC_CAUSE_CLR, sync_cause);
(void) REG_READ(ah, AR_INTR_SYNC_CAUSE_CLR);
}
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index 07f26ee7a723..def0cd308fdd 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -423,6 +423,7 @@ int ath_beaconq_config(struct ath_softc *sc);
#define ATH_AP_SHORT_CALINTERVAL 100 /* 100 ms */
#define ATH_ANI_POLLINTERVAL_OLD 100 /* 100 ms */
#define ATH_ANI_POLLINTERVAL_NEW 1000 /* 1000 ms */
+#define ATH_LONG_CALINTERVAL_INT 1000 /* 1000 ms */
#define ATH_LONG_CALINTERVAL 30000 /* 30 seconds */
#define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes */
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c
index 4d4b22d52dfd..081192e78a46 100644
--- a/drivers/net/wireless/ath/ath9k/beacon.c
+++ b/drivers/net/wireless/ath/ath9k/beacon.c
@@ -359,11 +359,12 @@ void ath_beacon_tasklet(unsigned long data)
sc->beacon.bmisscnt++;
if (sc->beacon.bmisscnt < BSTUCK_THRESH) {
- ath_print(common, ATH_DBG_BEACON,
+ ath_print(common, ATH_DBG_BSTUCK,
"missed %u consecutive beacons\n",
sc->beacon.bmisscnt);
+ ath9k_hw_bstuck_nfcal(ah);
} else if (sc->beacon.bmisscnt >= BSTUCK_THRESH) {
- ath_print(common, ATH_DBG_BEACON,
+ ath_print(common, ATH_DBG_BSTUCK,
"beacon is officially stuck\n");
sc->sc_flags |= SC_OP_TSF_RESET;
ath_reset(sc, false);
@@ -373,7 +374,7 @@ void ath_beacon_tasklet(unsigned long data)
}
if (sc->beacon.bmisscnt != 0) {
- ath_print(common, ATH_DBG_BEACON,
+ ath_print(common, ATH_DBG_BSTUCK,
"resume beacon xmit after %u misses\n",
sc->beacon.bmisscnt);
sc->beacon.bmisscnt = 0;
diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c
index 45208690c0ec..67ee5d735cc1 100644
--- a/drivers/net/wireless/ath/ath9k/calib.c
+++ b/drivers/net/wireless/ath/ath9k/calib.c
@@ -19,8 +19,7 @@
/* Common calibration code */
-/* We can tune this as we go by monitoring really low values */
-#define ATH9K_NF_TOO_LOW -60
+#define ATH9K_NF_TOO_HIGH -60
static int16_t ath9k_hw_get_nf_hist_mid(int16_t *nfCalBuffer)
{
@@ -45,11 +44,39 @@ static int16_t ath9k_hw_get_nf_hist_mid(int16_t *nfCalBuffer)
return nfval;
}
-static void ath9k_hw_update_nfcal_hist_buffer(struct ath9k_nfcal_hist *h,
+static struct ath_nf_limits *ath9k_hw_get_nf_limits(struct ath_hw *ah,
+ struct ath9k_channel *chan)
+{
+ struct ath_nf_limits *limit;
+
+ if (!chan || IS_CHAN_2GHZ(chan))
+ limit = &ah->nf_2g;
+ else
+ limit = &ah->nf_5g;
+
+ return limit;
+}
+
+static s16 ath9k_hw_get_default_nf(struct ath_hw *ah,
+ struct ath9k_channel *chan)
+{
+ return ath9k_hw_get_nf_limits(ah, chan)->nominal;
+}
+
+
+static void ath9k_hw_update_nfcal_hist_buffer(struct ath_hw *ah,
+ struct ath9k_hw_cal_data *cal,
int16_t *nfarray)
{
+ struct ath_common *common = ath9k_hw_common(ah);
+ struct ath_nf_limits *limit;
+ struct ath9k_nfcal_hist *h;
+ bool high_nf_mid = false;
int i;
+ h = cal->nfCalHist;
+ limit = ath9k_hw_get_nf_limits(ah, ah->curchan);
+
for (i = 0; i < NUM_NF_READINGS; i++) {
h[i].nfCalBuffer[h[i].currIndex] = nfarray[i];
@@ -63,7 +90,39 @@ static void ath9k_hw_update_nfcal_hist_buffer(struct ath9k_nfcal_hist *h,
h[i].privNF =
ath9k_hw_get_nf_hist_mid(h[i].nfCalBuffer);
}
+
+ if (!h[i].privNF)
+ continue;
+
+ if (h[i].privNF > limit->max) {
+ high_nf_mid = true;
+
+ ath_print(common, ATH_DBG_CALIBRATE,
+ "NFmid[%d] (%d) > MAX (%d), %s\n",
+ i, h[i].privNF, limit->max,
+ (cal->nfcal_interference ?
+ "not corrected (due to interference)" :
+ "correcting to MAX"));
+
+ /*
+ * Normally we limit the average noise floor by the
+ * hardware specific maximum here. However if we have
+ * encountered stuck beacons because of interference,
+ * we bypass this limit here in order to better deal
+ * with our environment.
+ */
+ if (!cal->nfcal_interference)
+ h[i].privNF = limit->max;
+ }
}
+
+ /*
+ * If the noise floor seems normal for all chains, assume that
+ * there is no significant interference in the environment anymore.
+ * Re-enable the enforcement of the NF maximum again.
+ */
+ if (!high_nf_mid)
+ cal->nfcal_interference = false;
}
static bool ath9k_hw_get_nf_thresh(struct ath_hw *ah,
@@ -104,19 +163,6 @@ void ath9k_hw_reset_calibration(struct ath_hw *ah,
ah->cal_samples = 0;
}
-static s16 ath9k_hw_get_default_nf(struct ath_hw *ah,
- struct ath9k_channel *chan)
-{
- struct ath_nf_limits *limit;
-
- if (!chan || IS_CHAN_2GHZ(chan))
- limit = &ah->nf_2g;
- else
- limit = &ah->nf_5g;
-
- return limit->nominal;
-}
-
/* This is done for the currently configured channel */
bool ath9k_hw_reset_calvalid(struct ath_hw *ah)
{
@@ -277,10 +323,10 @@ static void ath9k_hw_nf_sanitize(struct ath_hw *ah, s16 *nf)
"NF calibrated [%s] [chain %d] is %d\n",
(i >= 3 ? "ext" : "ctl"), i % 3, nf[i]);
- if (nf[i] > limit->max) {
+ if (nf[i] > ATH9K_NF_TOO_HIGH) {
ath_print(common, ATH_DBG_CALIBRATE,
"NF[%d] (%d) > MAX (%d), correcting to MAX",
- i, nf[i], limit->max);
+ i, nf[i], ATH9K_NF_TOO_HIGH);
nf[i] = limit->max;
} else if (nf[i] < limit->min) {
ath_print(common, ATH_DBG_CALIBRATE,
@@ -326,7 +372,7 @@ bool ath9k_hw_getnf(struct ath_hw *ah, struct ath9k_channel *chan)
h = caldata->nfCalHist;
caldata->nfcal_pending = false;
- ath9k_hw_update_nfcal_hist_buffer(h, nfarray);
+ ath9k_hw_update_nfcal_hist_buffer(ah, caldata, nfarray);
caldata->rawNoiseFloor = h[0].privNF;
return true;
}
@@ -361,3 +407,28 @@ s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan)
return ah->caldata->rawNoiseFloor;
}
EXPORT_SYMBOL(ath9k_hw_getchan_noise);
+
+void ath9k_hw_bstuck_nfcal(struct ath_hw *ah)
+{
+ struct ath9k_hw_cal_data *caldata = ah->caldata;
+
+ if (unlikely(!caldata))
+ return;
+
+ /*
+ * If beacons are stuck, the most likely cause is interference.
+ * Triggering a noise floor calibration at this point helps the
+ * hardware adapt to a noisy environment much faster.
+ * To ensure that we recover from stuck beacons quickly, let
+ * the baseband update the internal NF value itself, similar to
+ * what is being done after a full reset.
+ */
+ if (!caldata->nfcal_pending)
+ ath9k_hw_start_nfcal(ah, true);
+ else if (!(REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF))
+ ath9k_hw_getnf(ah, ah->curchan);
+
+ caldata->nfcal_interference = true;
+}
+EXPORT_SYMBOL(ath9k_hw_bstuck_nfcal);
+
diff --git a/drivers/net/wireless/ath/ath9k/calib.h b/drivers/net/wireless/ath/ath9k/calib.h
index 0a304b3eeeb6..5b053a6260b2 100644
--- a/drivers/net/wireless/ath/ath9k/calib.h
+++ b/drivers/net/wireless/ath/ath9k/calib.h
@@ -113,6 +113,7 @@ void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan);
bool ath9k_hw_getnf(struct ath_hw *ah, struct ath9k_channel *chan);
void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah,
struct ath9k_channel *chan);
+void ath9k_hw_bstuck_nfcal(struct ath_hw *ah);
s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan);
void ath9k_hw_reset_calibration(struct ath_hw *ah,
struct ath9k_cal_list *currCal);
diff --git a/drivers/net/wireless/ath/ath9k/common.c b/drivers/net/wireless/ath/ath9k/common.c
index c86f7d3593ab..3100c87a4fcd 100644
--- a/drivers/net/wireless/ath/ath9k/common.c
+++ b/drivers/net/wireless/ath/ath9k/common.c
@@ -46,12 +46,17 @@ int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb)
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
if (tx_info->control.hw_key) {
- if (tx_info->control.hw_key->alg == ALG_WEP)
+ switch (tx_info->control.hw_key->cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
return ATH9K_KEY_TYPE_WEP;
- else if (tx_info->control.hw_key->alg == ALG_TKIP)
+ case WLAN_CIPHER_SUITE_TKIP:
return ATH9K_KEY_TYPE_TKIP;
- else if (tx_info->control.hw_key->alg == ALG_CCMP)
+ case WLAN_CIPHER_SUITE_CCMP:
return ATH9K_KEY_TYPE_AES;
+ default:
+ break;
+ }
}
return ATH9K_KEY_TYPE_CLEAR;
@@ -212,11 +217,11 @@ static int ath_reserve_key_cache_slot_tkip(struct ath_common *common)
}
static int ath_reserve_key_cache_slot(struct ath_common *common,
- enum ieee80211_key_alg alg)
+ u32 cipher)
{
int i;
- if (alg == ALG_TKIP)
+ if (cipher == WLAN_CIPHER_SUITE_TKIP)
return ath_reserve_key_cache_slot_tkip(common);
/* First, try to find slots that would not be available for TKIP. */
@@ -293,14 +298,15 @@ int ath9k_cmn_key_config(struct ath_common *common,
memset(&hk, 0, sizeof(hk));
- switch (key->alg) {
- case ALG_WEP:
+ switch (key->cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
hk.kv_type = ATH9K_CIPHER_WEP;
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
hk.kv_type = ATH9K_CIPHER_TKIP;
break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
hk.kv_type = ATH9K_CIPHER_AES_CCM;
break;
default:
@@ -316,7 +322,7 @@ int ath9k_cmn_key_config(struct ath_common *common,
memcpy(gmac, vif->addr, ETH_ALEN);
gmac[0] |= 0x01;
mac = gmac;
- idx = ath_reserve_key_cache_slot(common, key->alg);
+ idx = ath_reserve_key_cache_slot(common, key->cipher);
break;
case NL80211_IFTYPE_ADHOC:
if (!sta) {
@@ -326,7 +332,7 @@ int ath9k_cmn_key_config(struct ath_common *common,
memcpy(gmac, sta->addr, ETH_ALEN);
gmac[0] |= 0x01;
mac = gmac;
- idx = ath_reserve_key_cache_slot(common, key->alg);
+ idx = ath_reserve_key_cache_slot(common, key->cipher);
break;
default:
idx = key->keyidx;
@@ -348,13 +354,13 @@ int ath9k_cmn_key_config(struct ath_common *common,
return -EOPNOTSUPP;
mac = sta->addr;
- idx = ath_reserve_key_cache_slot(common, key->alg);
+ idx = ath_reserve_key_cache_slot(common, key->cipher);
}
if (idx < 0)
return -ENOSPC; /* no free key cache entries */
- if (key->alg == ALG_TKIP)
+ if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
ret = ath_setkey_tkip(common, idx, key->key, &hk, mac,
vif->type == NL80211_IFTYPE_AP);
else
@@ -364,7 +370,7 @@ int ath9k_cmn_key_config(struct ath_common *common,
return -EIO;
set_bit(idx, common->keymap);
- if (key->alg == ALG_TKIP) {
+ if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
set_bit(idx + 64, common->keymap);
if (common->splitmic) {
set_bit(idx + 32, common->keymap);
@@ -389,7 +395,7 @@ void ath9k_cmn_key_delete(struct ath_common *common,
return;
clear_bit(key->hw_key_idx, common->keymap);
- if (key->alg != ALG_TKIP)
+ if (key->cipher != WLAN_CIPHER_SUITE_TKIP)
return;
clear_bit(key->hw_key_idx + 64, common->keymap);
diff --git a/drivers/net/wireless/ath/ath9k/eeprom.h b/drivers/net/wireless/ath/ath9k/eeprom.h
index 8750c558c221..7f48df1e2903 100644
--- a/drivers/net/wireless/ath/ath9k/eeprom.h
+++ b/drivers/net/wireless/ath/ath9k/eeprom.h
@@ -191,6 +191,7 @@
#define AR9287_EEP_NO_BACK_VER AR9287_EEP_MINOR_VER_1
#define AR9287_EEP_START_LOC 128
+#define AR9287_HTC_EEP_START_LOC 256
#define AR9287_NUM_2G_CAL_PIERS 3
#define AR9287_NUM_2G_CCK_TARGET_POWERS 3
#define AR9287_NUM_2G_20_TARGET_POWERS 3
diff --git a/drivers/net/wireless/ath/ath9k/eeprom_9287.c b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
index 4a52cf03808b..dff2da777312 100644
--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
@@ -34,9 +34,14 @@ static bool ath9k_hw_ar9287_fill_eeprom(struct ath_hw *ah)
struct ar9287_eeprom *eep = &ah->eeprom.map9287;
struct ath_common *common = ath9k_hw_common(ah);
u16 *eep_data;
- int addr, eep_start_loc = AR9287_EEP_START_LOC;
+ int addr, eep_start_loc;
eep_data = (u16 *)eep;
+ if (ah->hw_version.devid == 0x7015)
+ eep_start_loc = AR9287_HTC_EEP_START_LOC;
+ else
+ eep_start_loc = AR9287_EEP_START_LOC;
+
if (!ath9k_hw_use_flash(ah)) {
ath_print(common, ATH_DBG_EEPROM,
"Reading from EEPROM, not flash\n");
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
index 61c1bee3f26a..17e7a9a367e7 100644
--- a/drivers/net/wireless/ath/ath9k/hif_usb.c
+++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
@@ -799,7 +799,7 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev)
}
kfree(buf);
- if (hif_dev->device_id == 0x7010)
+ if ((hif_dev->device_id == 0x7010) || (hif_dev->device_id == 0x7015))
firm_offset = AR7010_FIRMWARE_TEXT;
else
firm_offset = AR9271_FIRMWARE_TEXT;
@@ -901,6 +901,7 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
switch(hif_dev->device_id) {
case 0x7010:
+ case 0x7015:
case 0x9018:
if (le16_to_cpu(udev->descriptor.bcdDevice) == 0x0202)
hif_dev->fw_name = FIRMWARE_AR7010_1_1;
@@ -912,11 +913,6 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
break;
}
- if (!hif_dev->fw_name) {
- dev_err(&udev->dev, "Can't determine firmware !\n");
- goto err_htc_hw_alloc;
- }
-
ret = ath9k_hif_usb_dev_init(hif_dev);
if (ret) {
ret = -EINVAL;
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
index 148b43317fdb..2d4279191d7a 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
@@ -245,6 +245,7 @@ static int ath9k_init_htc_services(struct ath9k_htc_priv *priv, u16 devid)
switch(devid) {
case 0x7010:
+ case 0x7015:
case 0x9018:
priv->htc->credits = 45;
break;
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
index ebed9d1691a5..4e345be62435 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
@@ -366,7 +366,8 @@ static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv,
caps = WLAN_RC_HT_FLAG;
if (sta->ht_cap.mcs.rx_mask[1])
caps |= WLAN_RC_DS_FLAG;
- if (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
+ if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) &&
+ (conf_is_ht40(&priv->hw->conf)))
caps |= WLAN_RC_40_FLAG;
if (conf_is_ht40(&priv->hw->conf) &&
(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
@@ -1584,9 +1585,10 @@ static int ath9k_htc_set_key(struct ieee80211_hw *hw,
key->hw_key_idx = ret;
/* push IV and Michael MIC generation to stack */
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
- if (key->alg == ALG_TKIP)
+ if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
- if (priv->ah->sw_mgmt_crypto && key->alg == ALG_CCMP)
+ if (priv->ah->sw_mgmt_crypto &&
+ key->cipher == WLAN_CIPHER_SUITE_CCMP)
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
ret = 0;
}
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
index bd0b4acc3ece..2a6e45a293a9 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
@@ -78,18 +78,23 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, struct sk_buff *skb)
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
struct ieee80211_sta *sta = tx_info->control.sta;
struct ath9k_htc_sta *ista;
- struct ath9k_htc_vif *avp;
struct ath9k_htc_tx_ctl tx_ctl;
enum htc_endpoint_id epid;
u16 qnum;
__le16 fc;
u8 *tx_fhdr;
- u8 sta_idx;
+ u8 sta_idx, vif_idx;
hdr = (struct ieee80211_hdr *) skb->data;
fc = hdr->frame_control;
- avp = (struct ath9k_htc_vif *) tx_info->control.vif->drv_priv;
+ if (tx_info->control.vif &&
+ (struct ath9k_htc_vif *) tx_info->control.vif->drv_priv)
+ vif_idx = ((struct ath9k_htc_vif *)
+ tx_info->control.vif->drv_priv)->index;
+ else
+ vif_idx = priv->nvifs;
+
if (sta) {
ista = (struct ath9k_htc_sta *) sta->drv_priv;
sta_idx = ista->index;
@@ -106,7 +111,7 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, struct sk_buff *skb)
memset(&tx_hdr, 0, sizeof(struct tx_frame_hdr));
tx_hdr.node_idx = sta_idx;
- tx_hdr.vif_idx = avp->index;
+ tx_hdr.vif_idx = vif_idx;
if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) {
tx_ctl.type = ATH9K_HTC_AMPDU;
@@ -169,7 +174,7 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, struct sk_buff *skb)
tx_ctl.type = ATH9K_HTC_NORMAL;
mgmt_hdr.node_idx = sta_idx;
- mgmt_hdr.vif_idx = avp->index;
+ mgmt_hdr.vif_idx = vif_idx;
mgmt_hdr.tidno = 0;
mgmt_hdr.flags = 0;
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index 399f7c1283cd..1601dd439890 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -355,6 +355,7 @@ struct ath9k_hw_cal_data {
int16_t rawNoiseFloor;
bool paprd_done;
bool nfcal_pending;
+ bool nfcal_interference;
u16 small_signal_gain[AR9300_MAX_CHAINS];
u32 pa_table[AR9300_MAX_CHAINS][PAPRD_TABLE_SZ];
struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS];
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 3caa32316e7b..1165f909ef04 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -226,9 +226,10 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
caldata = &aphy->caldata;
ath_print(common, ATH_DBG_CONFIG,
- "(%u MHz) -> (%u MHz), conf_is_ht40: %d\n",
+ "(%u MHz) -> (%u MHz), conf_is_ht40: %d fastcc: %d\n",
sc->sc_ah->curchan->channel,
- channel->center_freq, conf_is_ht40(conf));
+ channel->center_freq, conf_is_ht40(conf),
+ fastcc);
spin_lock_bh(&sc->sc_resetlock);
@@ -395,7 +396,12 @@ void ath_ani_calibrate(unsigned long data)
bool shortcal = false;
bool aniflag = false;
unsigned int timestamp = jiffies_to_msecs(jiffies);
- u32 cal_interval, short_cal_interval;
+ u32 cal_interval, short_cal_interval, long_cal_interval;
+
+ if (ah->caldata && ah->caldata->nfcal_interference)
+ long_cal_interval = ATH_LONG_CALINTERVAL_INT;
+ else
+ long_cal_interval = ATH_LONG_CALINTERVAL;
short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ?
ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL;
@@ -407,7 +413,7 @@ void ath_ani_calibrate(unsigned long data)
ath9k_ps_wakeup(sc);
/* Long calibration runs independently of short calibration. */
- if ((timestamp - common->ani.longcal_timer) >= ATH_LONG_CALINTERVAL) {
+ if ((timestamp - common->ani.longcal_timer) >= long_cal_interval) {
longcal = true;
ath_print(common, ATH_DBG_ANI, "longcal @%lu\n", jiffies);
common->ani.longcal_timer = timestamp;
@@ -1776,9 +1782,10 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
key->hw_key_idx = ret;
/* push IV and Michael MIC generation to stack */
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
- if (key->alg == ALG_TKIP)
+ if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
- if (sc->sc_ah->sw_mgmt_crypto && key->alg == ALG_CCMP)
+ if (sc->sc_ah->sw_mgmt_crypto &&
+ key->cipher == WLAN_CIPHER_SUITE_CCMP)
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
ret = 0;
}
diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h
index 633e3d949ec0..d01c4adab8d6 100644
--- a/drivers/net/wireless/ath/ath9k/reg.h
+++ b/drivers/net/wireless/ath/ath9k/reg.h
@@ -899,6 +899,7 @@
#define AR_DEVID_7010(_ah) \
(((_ah)->hw_version.devid == 0x7010) || \
+ ((_ah)->hw_version.devid == 0x7015) || \
((_ah)->hw_version.devid == 0x9018))
#define AR_RADIO_SREV_MAJOR 0xf0
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 4dda14e36227..457f07692ac7 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1407,22 +1407,6 @@ static enum ath9k_pkt_type get_hw_packet_type(struct sk_buff *skb)
return htype;
}
-static int get_hw_crypto_keytype(struct sk_buff *skb)
-{
- struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
-
- if (tx_info->control.hw_key) {
- if (tx_info->control.hw_key->alg == ALG_WEP)
- return ATH9K_KEY_TYPE_WEP;
- else if (tx_info->control.hw_key->alg == ALG_TKIP)
- return ATH9K_KEY_TYPE_TKIP;
- else if (tx_info->control.hw_key->alg == ALG_CCMP)
- return ATH9K_KEY_TYPE_AES;
- }
-
- return ATH9K_KEY_TYPE_CLEAR;
-}
-
static void assign_aggr_tid_seqno(struct sk_buff *skb,
struct ath_buf *bf)
{
@@ -1661,7 +1645,7 @@ static int ath_tx_setup_buffer(struct ieee80211_hw *hw, struct ath_buf *bf,
bf->bf_state.bfs_paprd_timestamp = jiffies;
bf->bf_flags = setup_tx_flags(skb, use_ldpc);
- bf->bf_keytype = get_hw_crypto_keytype(skb);
+ bf->bf_keytype = ath9k_cmn_get_hw_crypto_keytype(skb);
if (bf->bf_keytype != ATH9K_KEY_TYPE_CLEAR) {
bf->bf_frmlen += tx_info->control.hw_key->icv_len;
bf->bf_keyix = tx_info->control.hw_key->hw_key_idx;
diff --git a/drivers/net/wireless/ath/debug.h b/drivers/net/wireless/ath/debug.h
index 873bf526e11f..fd3a020682dc 100644
--- a/drivers/net/wireless/ath/debug.h
+++ b/drivers/net/wireless/ath/debug.h
@@ -36,6 +36,7 @@
* @ATH_DBG_PS: power save processing
* @ATH_DBG_HWTIMER: hardware timer handling
* @ATH_DBG_BTCOEX: bluetooth coexistance
+ * @ATH_DBG_BSTUCK: stuck beacons
* @ATH_DBG_ANY: enable all debugging
*
* The debug level is used to control the amount and type of debugging output
@@ -60,6 +61,7 @@ enum ATH_DEBUG {
ATH_DBG_HWTIMER = 0x00001000,
ATH_DBG_BTCOEX = 0x00002000,
ATH_DBG_WMI = 0x00004000,
+ ATH_DBG_BSTUCK = 0x00008000,
ATH_DBG_ANY = 0xffffffff
};
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 20631ae2ddd7..a1186525c70d 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -2280,6 +2280,7 @@ out:
static int b43_upload_microcode(struct b43_wldev *dev)
{
+ struct wiphy *wiphy = dev->wl->hw->wiphy;
const size_t hdr_len = sizeof(struct b43_fw_header);
const __be32 *data;
unsigned int i, len;
@@ -2405,6 +2406,10 @@ static int b43_upload_microcode(struct b43_wldev *dev)
}
}
+ snprintf(wiphy->fw_version, sizeof(wiphy->fw_version), "%u.%u",
+ dev->fw.rev, dev->fw.patch);
+ wiphy->hw_version = dev->dev->id.coreid;
+
if (b43_is_old_txhdr_format(dev)) {
/* We're over the deadline, but we keep support for old fw
* until it turns out to be in major conflict with something new. */
@@ -3754,17 +3759,17 @@ static int b43_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
}
err = -EINVAL;
- switch (key->alg) {
- case ALG_WEP:
- if (key->keylen == WLAN_KEY_LEN_WEP40)
- algorithm = B43_SEC_ALGO_WEP40;
- else
- algorithm = B43_SEC_ALGO_WEP104;
+ switch (key->cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ algorithm = B43_SEC_ALGO_WEP40;
+ break;
+ case WLAN_CIPHER_SUITE_WEP104:
+ algorithm = B43_SEC_ALGO_WEP104;
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
algorithm = B43_SEC_ALGO_TKIP;
break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
algorithm = B43_SEC_ALGO_AES;
break;
default:
@@ -4250,6 +4255,10 @@ static void b43_wireless_core_exit(struct b43_wldev *dev)
B43_WARN_ON(dev && b43_status(dev) > B43_STAT_INITIALIZED);
if (!dev || b43_status(dev) != B43_STAT_INITIALIZED)
return;
+
+ /* Unregister HW RNG driver */
+ b43_rng_exit(dev->wl);
+
b43_set_status(dev, B43_STAT_UNINIT);
/* Stop the microcode PSM. */
@@ -4379,6 +4388,9 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
b43_set_status(dev, B43_STAT_INITIALIZED);
+ /* Register HW RNG driver */
+ b43_rng_init(dev->wl);
+
out:
return err;
@@ -4984,7 +4996,6 @@ static int b43_probe(struct ssb_device *dev, const struct ssb_device_id *id)
if (err)
goto err_one_core_detach;
b43_leds_register(wl->current_dev);
- b43_rng_init(wl);
}
out:
@@ -5020,7 +5031,6 @@ static void b43_remove(struct ssb_device *dev)
b43_one_core_detach(dev);
if (list_empty(&wl->devlist)) {
- b43_rng_exit(wl);
b43_leds_unregister(wl);
/* Last core on the chip unregistered.
* We can destroy common struct b43_wl.
diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c
index 5a725703770c..d116229c3347 100644
--- a/drivers/net/wireless/b43/phy_n.c
+++ b/drivers/net/wireless/b43/phy_n.c
@@ -893,7 +893,7 @@ static void b43_nphy_adjust_lna_gain_table(struct b43_wldev *dev)
}
/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/WorkaroundsGainCtrl */
-static void b43_nphy_gain_crtl_workarounds(struct b43_wldev *dev)
+static void b43_nphy_gain_ctrl_workarounds(struct b43_wldev *dev)
{
struct b43_phy_n *nphy = dev->phy.n;
u8 i, j;
@@ -1094,11 +1094,12 @@ static void b43_nphy_workarounds(struct b43_wldev *dev)
b43_nphy_set_rf_sequence(dev, 0, events1, delays1, 7);
b43_nphy_set_rf_sequence(dev, 1, events2, delays2, 7);
- b43_nphy_gain_crtl_workarounds(dev);
+ b43_nphy_gain_ctrl_workarounds(dev);
if (dev->phy.rev < 2) {
if (b43_phy_read(dev, B43_NPHY_RXCTL) & 0x2)
- ; /*TODO: b43_mhf(dev, 2, 0x0010, 0x0010, 3);*/
+ b43_hf_write(dev, b43_hf_read(dev) |
+ B43_HF_MLADVW);
} else if (dev->phy.rev == 2) {
b43_phy_write(dev, B43_NPHY_CRSCHECK2, 0);
b43_phy_write(dev, B43_NPHY_CRSCHECK3, 0);
@@ -1182,7 +1183,7 @@ static u16 b43_nphy_gen_load_samples(struct b43_wldev *dev, u32 freq, u16 max,
len = bw << 1;
}
- samples = kzalloc(len * sizeof(struct b43_c32), GFP_KERNEL);
+ samples = kcalloc(len, sizeof(struct b43_c32), GFP_KERNEL);
if (!samples) {
b43err(dev->wl, "allocation for samples generation failed\n");
return 0;
@@ -3073,6 +3074,55 @@ static int b43_nphy_cal_rx_iq(struct b43_wldev *dev,
return b43_nphy_rev2_cal_rx_iq(dev, target, type, debug);
}
+/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/MacPhyClkSet */
+static void b43_nphy_mac_phy_clock_set(struct b43_wldev *dev, bool on)
+{
+ u32 tmslow = ssb_read32(dev->dev, SSB_TMSLOW);
+ if (on)
+ tmslow |= SSB_TMSLOW_PHYCLK;
+ else
+ tmslow &= ~SSB_TMSLOW_PHYCLK;
+ ssb_write32(dev->dev, SSB_TMSLOW, tmslow);
+}
+
+/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RxCoreSetState */
+static void b43_nphy_set_rx_core_state(struct b43_wldev *dev, u8 mask)
+{
+ struct b43_phy *phy = &dev->phy;
+ struct b43_phy_n *nphy = phy->n;
+ u16 buf[16];
+
+ if (0 /* FIXME clk */)
+ return;
+
+ b43_mac_suspend(dev);
+
+ if (nphy->hang_avoid)
+ b43_nphy_stay_in_carrier_search(dev, true);
+
+ b43_phy_maskset(dev, B43_NPHY_RFSEQCA, ~B43_NPHY_RFSEQCA_RXEN,
+ (mask & 0x3) << B43_NPHY_RFSEQCA_RXEN_SHIFT);
+
+ if (mask & 0x3 != 0x3) {
+ b43_phy_write(dev, B43_NPHY_HPANT_SWTHRES, 1);
+ if (dev->phy.rev >= 3) {
+ /* TODO */
+ }
+ } else {
+ b43_phy_write(dev, B43_NPHY_HPANT_SWTHRES, 0x1E);
+ if (dev->phy.rev >= 3) {
+ /* TODO */
+ }
+ }
+
+ b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RESET2RX);
+
+ if (nphy->hang_avoid)
+ b43_nphy_stay_in_carrier_search(dev, false);
+
+ b43_mac_enable(dev);
+}
+
/*
* Init N-PHY
* http://bcm-v4.sipsolutions.net/802.11/PHY/Init/N
@@ -3173,7 +3223,7 @@ int b43_phy_initn(struct b43_wldev *dev)
b43_phy_write(dev, B43_NPHY_BBCFG, tmp & ~B43_NPHY_BBCFG_RSTCCA);
b43_nphy_bmac_clock_fgc(dev, 0);
- /* TODO N PHY MAC PHY Clock Set with argument 1 */
+ b43_nphy_mac_phy_clock_set(dev, true);
b43_nphy_pa_override(dev, false);
b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RX2TX);
@@ -3199,7 +3249,7 @@ int b43_phy_initn(struct b43_wldev *dev)
}
if (nphy->phyrxchain != 3)
- ;/* TODO N PHY RX Core Set State with phyrxchain as argument */
+ b43_nphy_set_rx_core_state(dev, nphy->phyrxchain);
if (nphy->mphase_cal_phase_id > 0)
;/* TODO PHY Periodic Calibration Multi-Phase Restart */
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
index 1713f5f7a58b..67f18ecdb3bf 100644
--- a/drivers/net/wireless/b43legacy/main.c
+++ b/drivers/net/wireless/b43legacy/main.c
@@ -1623,6 +1623,7 @@ error:
static int b43legacy_upload_microcode(struct b43legacy_wldev *dev)
{
+ struct wiphy *wiphy = dev->wl->hw->wiphy;
const size_t hdr_len = sizeof(struct b43legacy_fw_header);
const __be32 *data;
unsigned int i;
@@ -1732,6 +1733,10 @@ static int b43legacy_upload_microcode(struct b43legacy_wldev *dev)
dev->fw.rev = fwrev;
dev->fw.patch = fwpatch;
+ snprintf(wiphy->fw_version, sizeof(wiphy->fw_version), "%u.%u",
+ dev->fw.rev, dev->fw.patch);
+ wiphy->hw_version = dev->dev->id.coreid;
+
return 0;
error:
diff --git a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c
index a85e43a8d758..6038633ef361 100644
--- a/drivers/net/wireless/hostap/hostap_ioctl.c
+++ b/drivers/net/wireless/hostap/hostap_ioctl.c
@@ -1696,7 +1696,7 @@ static int prism2_request_scan(struct net_device *dev)
hostap_set_word(dev, HFA384X_RID_CNFROAMINGMODE,
HFA384X_ROAMING_FIRMWARE);
- return 0;
+ return ret;
}
#else /* !PRISM2_NO_STATION_MODES */
diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c
index 16bbfa3189a5..61915f371416 100644
--- a/drivers/net/wireless/ipw2x00/ipw2100.c
+++ b/drivers/net/wireless/ipw2x00/ipw2100.c
@@ -1921,9 +1921,9 @@ static int ipw2100_net_init(struct net_device *dev)
bg_band->band = IEEE80211_BAND_2GHZ;
bg_band->n_channels = geo->bg_channels;
- bg_band->channels =
- kzalloc(geo->bg_channels *
- sizeof(struct ieee80211_channel), GFP_KERNEL);
+ bg_band->channels = kcalloc(geo->bg_channels,
+ sizeof(struct ieee80211_channel),
+ GFP_KERNEL);
if (!bg_band->channels) {
ipw2100_down(priv);
return -ENOMEM;
@@ -2723,14 +2723,6 @@ static void __ipw2100_rx_process(struct ipw2100_priv *priv)
packet = &priv->rx_buffers[i];
- /* Sync the DMA for the STATUS buffer so CPU is sure to get
- * the correct values */
- pci_dma_sync_single_for_cpu(priv->pci_dev,
- sq->nic +
- sizeof(struct ipw2100_status) * i,
- sizeof(struct ipw2100_status),
- PCI_DMA_FROMDEVICE);
-
/* Sync the DMA for the RX buffer so CPU is sure to get
* the correct values */
pci_dma_sync_single_for_cpu(priv->pci_dev, packet->dma_addr,
@@ -3064,9 +3056,9 @@ static void ipw2100_tx_send_commands(struct ipw2100_priv *priv)
packet = list_entry(element, struct ipw2100_tx_packet, list);
- IPW_DEBUG_TX("using TBD at virt=%p, phys=%p\n",
+ IPW_DEBUG_TX("using TBD at virt=%p, phys=%04X\n",
&txq->drv[txq->next],
- (void *)(txq->nic + txq->next *
+ (u32) (txq->nic + txq->next *
sizeof(struct ipw2100_bd)));
packet->index = txq->next;
@@ -6665,12 +6657,13 @@ static int __init ipw2100_init(void)
printk(KERN_INFO DRV_NAME ": %s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
printk(KERN_INFO DRV_NAME ": %s\n", DRV_COPYRIGHT);
+ pm_qos_add_request(&ipw2100_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+ PM_QOS_DEFAULT_VALUE);
+
ret = pci_register_driver(&ipw2100_pci_driver);
if (ret)
goto out;
- pm_qos_add_request(&ipw2100_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
- PM_QOS_DEFAULT_VALUE);
#ifdef CONFIG_IPW2100_DEBUG
ipw2100_debug_level = debug;
ret = driver_create_file(&ipw2100_pci_driver.driver,
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c
index cb2552a6777c..0f2508384c75 100644
--- a/drivers/net/wireless/ipw2x00/ipw2200.c
+++ b/drivers/net/wireless/ipw2x00/ipw2200.c
@@ -11467,9 +11467,9 @@ static int ipw_net_init(struct net_device *dev)
bg_band->band = IEEE80211_BAND_2GHZ;
bg_band->n_channels = geo->bg_channels;
- bg_band->channels =
- kzalloc(geo->bg_channels *
- sizeof(struct ieee80211_channel), GFP_KERNEL);
+ bg_band->channels = kcalloc(geo->bg_channels,
+ sizeof(struct ieee80211_channel),
+ GFP_KERNEL);
/* translate geo->bg to bg_band.channels */
for (i = 0; i < geo->bg_channels; i++) {
bg_band->channels[i].band = IEEE80211_BAND_2GHZ;
@@ -11502,9 +11502,9 @@ static int ipw_net_init(struct net_device *dev)
a_band->band = IEEE80211_BAND_5GHZ;
a_band->n_channels = geo->a_channels;
- a_band->channels =
- kzalloc(geo->a_channels *
- sizeof(struct ieee80211_channel), GFP_KERNEL);
+ a_band->channels = kcalloc(geo->a_channels,
+ sizeof(struct ieee80211_channel),
+ GFP_KERNEL);
/* translate geo->bg to a_band.channels */
for (i = 0; i < geo->a_channels; i++) {
a_band->channels[i].band = IEEE80211_BAND_2GHZ;
diff --git a/drivers/net/wireless/iwlwifi/Makefile b/drivers/net/wireless/iwlwifi/Makefile
index 728bb858ba97..493163925a45 100644
--- a/drivers/net/wireless/iwlwifi/Makefile
+++ b/drivers/net/wireless/iwlwifi/Makefile
@@ -12,6 +12,7 @@ obj-$(CONFIG_IWLAGN) += iwlagn.o
iwlagn-objs := iwl-agn.o iwl-agn-rs.o iwl-agn-led.o iwl-agn-ict.o
iwlagn-objs += iwl-agn-ucode.o iwl-agn-hcmd.o iwl-agn-tx.o
iwlagn-objs += iwl-agn-lib.o iwl-agn-rx.o iwl-agn-calib.o
+iwlagn-objs += iwl-agn-tt.o
iwlagn-$(CONFIG_IWLWIFI_DEBUGFS) += iwl-agn-debugfs.o
iwlagn-$(CONFIG_IWL4965) += iwl-4965.o
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
index fec026212326..3bf5a30828be 100644
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
@@ -229,6 +229,11 @@ static struct iwl_lib_ops iwl1000_lib = {
.check_ack_health = iwl_good_ack_health,
.txfifo_flush = iwlagn_txfifo_flush,
.dev_txfifo_flush = iwlagn_dev_txfifo_flush,
+ .tt_ops = {
+ .lower_power_detection = iwl_tt_is_low_power_state,
+ .tt_power_mode = iwl_tt_current_power_mode,
+ .ct_kill_check = iwl_check_for_ct_kill,
+ }
};
static const struct iwl_ops iwl1000_ops = {
@@ -265,7 +270,7 @@ struct iwl_cfg iwl1000_bgn_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 128,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -297,7 +302,7 @@ struct iwl_cfg iwl1000_bg_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 128,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
index 6950a783913b..8ccfcd08218d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945.c
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.c
@@ -2731,7 +2731,7 @@ static struct iwl_cfg iwl3945_bg_cfg = {
.led_compensation = 64,
.broken_powersave = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 512,
.tx_power_by_driver = true,
};
@@ -2752,7 +2752,7 @@ static struct iwl_cfg iwl3945_abg_cfg = {
.led_compensation = 64,
.broken_powersave = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 512,
.tx_power_by_driver = true,
};
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
index d6da356608fa..d92b72909233 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
@@ -2322,7 +2322,7 @@ struct iwl_cfg iwl4965_agn_cfg = {
.led_compensation = 61,
.chain_noise_num_beacons = IWL4965_CAL_NUM_BEACONS,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.temperature_kelvin = true,
.max_event_log_size = 512,
.tx_power_by_driver = true,
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
index aacf3770f075..173f556645b2 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -405,6 +405,11 @@ static struct iwl_lib_ops iwl5000_lib = {
.check_ack_health = iwl_good_ack_health,
.txfifo_flush = iwlagn_txfifo_flush,
.dev_txfifo_flush = iwlagn_dev_txfifo_flush,
+ .tt_ops = {
+ .lower_power_detection = iwl_tt_is_low_power_state,
+ .tt_power_mode = iwl_tt_current_power_mode,
+ .ct_kill_check = iwl_check_for_ct_kill,
+ }
};
static struct iwl_lib_ops iwl5150_lib = {
@@ -470,6 +475,11 @@ static struct iwl_lib_ops iwl5150_lib = {
.check_ack_health = iwl_good_ack_health,
.txfifo_flush = iwlagn_txfifo_flush,
.dev_txfifo_flush = iwlagn_dev_txfifo_flush,
+ .tt_ops = {
+ .lower_power_detection = iwl_tt_is_low_power_state,
+ .tt_power_mode = iwl_tt_current_power_mode,
+ .ct_kill_check = iwl_check_for_ct_kill,
+ }
};
static const struct iwl_ops iwl5000_ops = {
@@ -510,7 +520,7 @@ struct iwl_cfg iwl5300_agn_cfg = {
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_LONG_MONITORING_PERIOD,
.max_event_log_size = 512,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -541,7 +551,7 @@ struct iwl_cfg iwl5100_bgn_cfg = {
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_LONG_MONITORING_PERIOD,
.max_event_log_size = 512,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -570,7 +580,7 @@ struct iwl_cfg iwl5100_abg_cfg = {
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_LONG_MONITORING_PERIOD,
.max_event_log_size = 512,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -601,7 +611,7 @@ struct iwl_cfg iwl5100_agn_cfg = {
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_LONG_MONITORING_PERIOD,
.max_event_log_size = 512,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -632,7 +642,7 @@ struct iwl_cfg iwl5350_agn_cfg = {
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_LONG_MONITORING_PERIOD,
.max_event_log_size = 512,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -663,7 +673,7 @@ struct iwl_cfg iwl5150_agn_cfg = {
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 512,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -693,7 +703,7 @@ struct iwl_cfg iwl5150_abg_cfg = {
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 512,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
index af4fd50f3405..a7af5e3a0a24 100644
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
@@ -330,6 +330,11 @@ static struct iwl_lib_ops iwl6000_lib = {
.check_ack_health = iwl_good_ack_health,
.txfifo_flush = iwlagn_txfifo_flush,
.dev_txfifo_flush = iwlagn_dev_txfifo_flush,
+ .tt_ops = {
+ .lower_power_detection = iwl_tt_is_low_power_state,
+ .tt_power_mode = iwl_tt_current_power_mode,
+ .ct_kill_check = iwl_check_for_ct_kill,
+ }
};
static const struct iwl_ops iwl6000_ops = {
@@ -388,7 +393,7 @@ struct iwl_cfg iwl6000g2a_2agn_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 512,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -424,7 +429,7 @@ struct iwl_cfg iwl6000g2a_2abg_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 512,
.sensitivity_calib_by_driver = true,
.chain_noise_calib_by_driver = true,
@@ -459,7 +464,7 @@ struct iwl_cfg iwl6000g2a_2bg_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 512,
.sensitivity_calib_by_driver = true,
.chain_noise_calib_by_driver = true,
@@ -496,7 +501,7 @@ struct iwl_cfg iwl6000g2b_2agn_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_LONG_MONITORING_PERIOD,
.max_event_log_size = 512,
.sensitivity_calib_by_driver = true,
.chain_noise_calib_by_driver = true,
@@ -532,7 +537,7 @@ struct iwl_cfg iwl6000g2b_2abg_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_LONG_MONITORING_PERIOD,
.max_event_log_size = 512,
.sensitivity_calib_by_driver = true,
.chain_noise_calib_by_driver = true,
@@ -570,7 +575,7 @@ struct iwl_cfg iwl6000g2b_2bgn_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_LONG_MONITORING_PERIOD,
.max_event_log_size = 512,
.sensitivity_calib_by_driver = true,
.chain_noise_calib_by_driver = true,
@@ -606,7 +611,7 @@ struct iwl_cfg iwl6000g2b_2bg_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_LONG_MONITORING_PERIOD,
.max_event_log_size = 512,
.sensitivity_calib_by_driver = true,
.chain_noise_calib_by_driver = true,
@@ -644,7 +649,7 @@ struct iwl_cfg iwl6000g2b_bgn_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_LONG_MONITORING_PERIOD,
.max_event_log_size = 512,
.sensitivity_calib_by_driver = true,
.chain_noise_calib_by_driver = true,
@@ -680,7 +685,7 @@ struct iwl_cfg iwl6000g2b_bg_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_LONG_MONITORING_PERIOD,
.max_event_log_size = 512,
.sensitivity_calib_by_driver = true,
.chain_noise_calib_by_driver = true,
@@ -721,7 +726,7 @@ struct iwl_cfg iwl6000i_2agn_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 1024,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -756,7 +761,7 @@ struct iwl_cfg iwl6000i_2abg_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 1024,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -791,7 +796,7 @@ struct iwl_cfg iwl6000i_2bg_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 1024,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -828,7 +833,7 @@ struct iwl_cfg iwl6050_2agn_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1500,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 1024,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -866,7 +871,7 @@ struct iwl_cfg iwl6050g2_bgn_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1500,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 1024,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -902,7 +907,7 @@ struct iwl_cfg iwl6050_2abg_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1500,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 1024,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
@@ -940,7 +945,7 @@ struct iwl_cfg iwl6000_3agn_cfg = {
.support_ct_kill_exit = true,
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
.chain_noise_scale = 1000,
- .monitor_recover_period = IWL_MONITORING_PERIOD,
+ .monitor_recover_period = IWL_DEF_MONITORING_PERIOD,
.max_event_log_size = 1024,
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tt.c b/drivers/net/wireless/iwlwifi/iwl-agn-tt.c
new file mode 100644
index 000000000000..30298ea56a24
--- /dev/null
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-tt.c
@@ -0,0 +1,696 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2010 Intel Corporation. All rights reserved.
+ *
+ * Portions of this file are derived from the ipw3945 project, as well
+ * as portions of the ieee80211 subsystem header files.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * Intel Linux Wireless <ilw@linux.intel.com>
+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+ *****************************************************************************/
+
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+
+#include <net/mac80211.h>
+
+#include "iwl-eeprom.h"
+#include "iwl-dev.h"
+#include "iwl-core.h"
+#include "iwl-io.h"
+#include "iwl-commands.h"
+#include "iwl-debug.h"
+#include "iwl-agn-tt.h"
+
+/* default Thermal Throttling transaction table
+ * Current state | Throttling Down | Throttling Up
+ *=============================================================================
+ * Condition Nxt State Condition Nxt State Condition Nxt State
+ *-----------------------------------------------------------------------------
+ * IWL_TI_0 T >= 114 CT_KILL 114>T>=105 TI_1 N/A N/A
+ * IWL_TI_1 T >= 114 CT_KILL 114>T>=110 TI_2 T<=95 TI_0
+ * IWL_TI_2 T >= 114 CT_KILL T<=100 TI_1
+ * IWL_CT_KILL N/A N/A N/A N/A T<=95 TI_0
+ *=============================================================================
+ */
+static const struct iwl_tt_trans tt_range_0[IWL_TI_STATE_MAX - 1] = {
+ {IWL_TI_0, IWL_ABSOLUTE_ZERO, 104},
+ {IWL_TI_1, 105, CT_KILL_THRESHOLD - 1},
+ {IWL_TI_CT_KILL, CT_KILL_THRESHOLD, IWL_ABSOLUTE_MAX}
+};
+static const struct iwl_tt_trans tt_range_1[IWL_TI_STATE_MAX - 1] = {
+ {IWL_TI_0, IWL_ABSOLUTE_ZERO, 95},
+ {IWL_TI_2, 110, CT_KILL_THRESHOLD - 1},
+ {IWL_TI_CT_KILL, CT_KILL_THRESHOLD, IWL_ABSOLUTE_MAX}
+};
+static const struct iwl_tt_trans tt_range_2[IWL_TI_STATE_MAX - 1] = {
+ {IWL_TI_1, IWL_ABSOLUTE_ZERO, 100},
+ {IWL_TI_CT_KILL, CT_KILL_THRESHOLD, IWL_ABSOLUTE_MAX},
+ {IWL_TI_CT_KILL, CT_KILL_THRESHOLD, IWL_ABSOLUTE_MAX}
+};
+static const struct iwl_tt_trans tt_range_3[IWL_TI_STATE_MAX - 1] = {
+ {IWL_TI_0, IWL_ABSOLUTE_ZERO, CT_KILL_EXIT_THRESHOLD},
+ {IWL_TI_CT_KILL, CT_KILL_EXIT_THRESHOLD + 1, IWL_ABSOLUTE_MAX},
+ {IWL_TI_CT_KILL, CT_KILL_EXIT_THRESHOLD + 1, IWL_ABSOLUTE_MAX}
+};
+
+/* Advance Thermal Throttling default restriction table */
+static const struct iwl_tt_restriction restriction_range[IWL_TI_STATE_MAX] = {
+ {IWL_ANT_OK_MULTI, IWL_ANT_OK_MULTI, true },
+ {IWL_ANT_OK_SINGLE, IWL_ANT_OK_MULTI, true },
+ {IWL_ANT_OK_SINGLE, IWL_ANT_OK_SINGLE, false },
+ {IWL_ANT_OK_NONE, IWL_ANT_OK_NONE, false }
+};
+
+bool iwl_tt_is_low_power_state(struct iwl_priv *priv)
+{
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+
+ if (tt->state >= IWL_TI_1)
+ return true;
+ return false;
+}
+
+u8 iwl_tt_current_power_mode(struct iwl_priv *priv)
+{
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+
+ return tt->tt_power_mode;
+}
+
+bool iwl_ht_enabled(struct iwl_priv *priv)
+{
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+ struct iwl_tt_restriction *restriction;
+
+ if (!priv->thermal_throttle.advanced_tt)
+ return true;
+ restriction = tt->restriction + tt->state;
+ return restriction->is_ht;
+}
+
+static bool iwl_within_ct_kill_margin(struct iwl_priv *priv)
+{
+ s32 temp = priv->temperature; /* degrees CELSIUS except specified */
+ bool within_margin = false;
+
+ if (priv->cfg->temperature_kelvin)
+ temp = KELVIN_TO_CELSIUS(priv->temperature);
+
+ if (!priv->thermal_throttle.advanced_tt)
+ within_margin = ((temp + IWL_TT_CT_KILL_MARGIN) >=
+ CT_KILL_THRESHOLD_LEGACY) ? true : false;
+ else
+ within_margin = ((temp + IWL_TT_CT_KILL_MARGIN) >=
+ CT_KILL_THRESHOLD) ? true : false;
+ return within_margin;
+}
+
+bool iwl_check_for_ct_kill(struct iwl_priv *priv)
+{
+ bool is_ct_kill = false;
+
+ if (iwl_within_ct_kill_margin(priv)) {
+ iwl_tt_enter_ct_kill(priv);
+ is_ct_kill = true;
+ }
+ return is_ct_kill;
+}
+
+enum iwl_antenna_ok iwl_tx_ant_restriction(struct iwl_priv *priv)
+{
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+ struct iwl_tt_restriction *restriction;
+
+ if (!priv->thermal_throttle.advanced_tt)
+ return IWL_ANT_OK_MULTI;
+ restriction = tt->restriction + tt->state;
+ return restriction->tx_stream;
+}
+
+enum iwl_antenna_ok iwl_rx_ant_restriction(struct iwl_priv *priv)
+{
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+ struct iwl_tt_restriction *restriction;
+
+ if (!priv->thermal_throttle.advanced_tt)
+ return IWL_ANT_OK_MULTI;
+ restriction = tt->restriction + tt->state;
+ return restriction->rx_stream;
+}
+
+#define CT_KILL_EXIT_DURATION (5) /* 5 seconds duration */
+#define CT_KILL_WAITING_DURATION (300) /* 300ms duration */
+
+/*
+ * toggle the bit to wake up uCode and check the temperature
+ * if the temperature is below CT, uCode will stay awake and send card
+ * state notification with CT_KILL bit clear to inform Thermal Throttling
+ * Management to change state. Otherwise, uCode will go back to sleep
+ * without doing anything, driver should continue the 5 seconds timer
+ * to wake up uCode for temperature check until temperature drop below CT
+ */
+static void iwl_tt_check_exit_ct_kill(unsigned long data)
+{
+ struct iwl_priv *priv = (struct iwl_priv *)data;
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+ unsigned long flags;
+
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
+ return;
+
+ if (tt->state == IWL_TI_CT_KILL) {
+ if (priv->thermal_throttle.ct_kill_toggle) {
+ iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR,
+ CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
+ priv->thermal_throttle.ct_kill_toggle = false;
+ } else {
+ iwl_write32(priv, CSR_UCODE_DRV_GP1_SET,
+ CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
+ priv->thermal_throttle.ct_kill_toggle = true;
+ }
+ iwl_read32(priv, CSR_UCODE_DRV_GP1);
+ spin_lock_irqsave(&priv->reg_lock, flags);
+ if (!iwl_grab_nic_access(priv))
+ iwl_release_nic_access(priv);
+ spin_unlock_irqrestore(&priv->reg_lock, flags);
+
+ /* Reschedule the ct_kill timer to occur in
+ * CT_KILL_EXIT_DURATION seconds to ensure we get a
+ * thermal update */
+ IWL_DEBUG_POWER(priv, "schedule ct_kill exit timer\n");
+ mod_timer(&priv->thermal_throttle.ct_kill_exit_tm,
+ jiffies + CT_KILL_EXIT_DURATION * HZ);
+ }
+}
+
+static void iwl_perform_ct_kill_task(struct iwl_priv *priv,
+ bool stop)
+{
+ if (stop) {
+ IWL_DEBUG_POWER(priv, "Stop all queues\n");
+ if (priv->mac80211_registered)
+ ieee80211_stop_queues(priv->hw);
+ IWL_DEBUG_POWER(priv,
+ "Schedule 5 seconds CT_KILL Timer\n");
+ mod_timer(&priv->thermal_throttle.ct_kill_exit_tm,
+ jiffies + CT_KILL_EXIT_DURATION * HZ);
+ } else {
+ IWL_DEBUG_POWER(priv, "Wake all queues\n");
+ if (priv->mac80211_registered)
+ ieee80211_wake_queues(priv->hw);
+ }
+}
+
+static void iwl_tt_ready_for_ct_kill(unsigned long data)
+{
+ struct iwl_priv *priv = (struct iwl_priv *)data;
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
+ return;
+
+ /* temperature timer expired, ready to go into CT_KILL state */
+ if (tt->state != IWL_TI_CT_KILL) {
+ IWL_DEBUG_POWER(priv, "entering CT_KILL state when "
+ "temperature timer expired\n");
+ tt->state = IWL_TI_CT_KILL;
+ set_bit(STATUS_CT_KILL, &priv->status);
+ iwl_perform_ct_kill_task(priv, true);
+ }
+}
+
+static void iwl_prepare_ct_kill_task(struct iwl_priv *priv)
+{
+ IWL_DEBUG_POWER(priv, "Prepare to enter IWL_TI_CT_KILL\n");
+ /* make request to retrieve statistics information */
+ iwl_send_statistics_request(priv, CMD_SYNC, false);
+ /* Reschedule the ct_kill wait timer */
+ mod_timer(&priv->thermal_throttle.ct_kill_waiting_tm,
+ jiffies + msecs_to_jiffies(CT_KILL_WAITING_DURATION));
+}
+
+#define IWL_MINIMAL_POWER_THRESHOLD (CT_KILL_THRESHOLD_LEGACY)
+#define IWL_REDUCED_PERFORMANCE_THRESHOLD_2 (100)
+#define IWL_REDUCED_PERFORMANCE_THRESHOLD_1 (90)
+
+/*
+ * Legacy thermal throttling
+ * 1) Avoid NIC destruction due to high temperatures
+ * Chip will identify dangerously high temperatures that can
+ * harm the device and will power down
+ * 2) Avoid the NIC power down due to high temperature
+ * Throttle early enough to lower the power consumption before
+ * drastic steps are needed
+ */
+static void iwl_legacy_tt_handler(struct iwl_priv *priv, s32 temp, bool force)
+{
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+ enum iwl_tt_state old_state;
+
+#ifdef CONFIG_IWLWIFI_DEBUG
+ if ((tt->tt_previous_temp) &&
+ (temp > tt->tt_previous_temp) &&
+ ((temp - tt->tt_previous_temp) >
+ IWL_TT_INCREASE_MARGIN)) {
+ IWL_DEBUG_POWER(priv,
+ "Temperature increase %d degree Celsius\n",
+ (temp - tt->tt_previous_temp));
+ }
+#endif
+ old_state = tt->state;
+ /* in Celsius */
+ if (temp >= IWL_MINIMAL_POWER_THRESHOLD)
+ tt->state = IWL_TI_CT_KILL;
+ else if (temp >= IWL_REDUCED_PERFORMANCE_THRESHOLD_2)
+ tt->state = IWL_TI_2;
+ else if (temp >= IWL_REDUCED_PERFORMANCE_THRESHOLD_1)
+ tt->state = IWL_TI_1;
+ else
+ tt->state = IWL_TI_0;
+
+#ifdef CONFIG_IWLWIFI_DEBUG
+ tt->tt_previous_temp = temp;
+#endif
+ /* stop ct_kill_waiting_tm timer */
+ del_timer_sync(&priv->thermal_throttle.ct_kill_waiting_tm);
+ if (tt->state != old_state) {
+ switch (tt->state) {
+ case IWL_TI_0:
+ /*
+ * When the system is ready to go back to IWL_TI_0
+ * we only have to call iwl_power_update_mode() to
+ * do so.
+ */
+ break;
+ case IWL_TI_1:
+ tt->tt_power_mode = IWL_POWER_INDEX_3;
+ break;
+ case IWL_TI_2:
+ tt->tt_power_mode = IWL_POWER_INDEX_4;
+ break;
+ default:
+ tt->tt_power_mode = IWL_POWER_INDEX_5;
+ break;
+ }
+ mutex_lock(&priv->mutex);
+ if (old_state == IWL_TI_CT_KILL)
+ clear_bit(STATUS_CT_KILL, &priv->status);
+ if (tt->state != IWL_TI_CT_KILL &&
+ iwl_power_update_mode(priv, true)) {
+ /* TT state not updated
+ * try again during next temperature read
+ */
+ if (old_state == IWL_TI_CT_KILL)
+ set_bit(STATUS_CT_KILL, &priv->status);
+ tt->state = old_state;
+ IWL_ERR(priv, "Cannot update power mode, "
+ "TT state not updated\n");
+ } else {
+ if (tt->state == IWL_TI_CT_KILL) {
+ if (force) {
+ set_bit(STATUS_CT_KILL, &priv->status);
+ iwl_perform_ct_kill_task(priv, true);
+ } else {
+ iwl_prepare_ct_kill_task(priv);
+ tt->state = old_state;
+ }
+ } else if (old_state == IWL_TI_CT_KILL &&
+ tt->state != IWL_TI_CT_KILL)
+ iwl_perform_ct_kill_task(priv, false);
+ IWL_DEBUG_POWER(priv, "Temperature state changed %u\n",
+ tt->state);
+ IWL_DEBUG_POWER(priv, "Power Index change to %u\n",
+ tt->tt_power_mode);
+ }
+ mutex_unlock(&priv->mutex);
+ }
+}
+
+/*
+ * Advance thermal throttling
+ * 1) Avoid NIC destruction due to high temperatures
+ * Chip will identify dangerously high temperatures that can
+ * harm the device and will power down
+ * 2) Avoid the NIC power down due to high temperature
+ * Throttle early enough to lower the power consumption before
+ * drastic steps are needed
+ * Actions include relaxing the power down sleep thresholds and
+ * decreasing the number of TX streams
+ * 3) Avoid throughput performance impact as much as possible
+ *
+ *=============================================================================
+ * Condition Nxt State Condition Nxt State Condition Nxt State
+ *-----------------------------------------------------------------------------
+ * IWL_TI_0 T >= 114 CT_KILL 114>T>=105 TI_1 N/A N/A
+ * IWL_TI_1 T >= 114 CT_KILL 114>T>=110 TI_2 T<=95 TI_0
+ * IWL_TI_2 T >= 114 CT_KILL T<=100 TI_1
+ * IWL_CT_KILL N/A N/A N/A N/A T<=95 TI_0
+ *=============================================================================
+ */
+static void iwl_advance_tt_handler(struct iwl_priv *priv, s32 temp, bool force)
+{
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+ int i;
+ bool changed = false;
+ enum iwl_tt_state old_state;
+ struct iwl_tt_trans *transaction;
+
+ old_state = tt->state;
+ for (i = 0; i < IWL_TI_STATE_MAX - 1; i++) {
+ /* based on the current TT state,
+ * find the curresponding transaction table
+ * each table has (IWL_TI_STATE_MAX - 1) entries
+ * tt->transaction + ((old_state * (IWL_TI_STATE_MAX - 1))
+ * will advance to the correct table.
+ * then based on the current temperature
+ * find the next state need to transaction to
+ * go through all the possible (IWL_TI_STATE_MAX - 1) entries
+ * in the current table to see if transaction is needed
+ */
+ transaction = tt->transaction +
+ ((old_state * (IWL_TI_STATE_MAX - 1)) + i);
+ if (temp >= transaction->tt_low &&
+ temp <= transaction->tt_high) {
+#ifdef CONFIG_IWLWIFI_DEBUG
+ if ((tt->tt_previous_temp) &&
+ (temp > tt->tt_previous_temp) &&
+ ((temp - tt->tt_previous_temp) >
+ IWL_TT_INCREASE_MARGIN)) {
+ IWL_DEBUG_POWER(priv,
+ "Temperature increase %d "
+ "degree Celsius\n",
+ (temp - tt->tt_previous_temp));
+ }
+ tt->tt_previous_temp = temp;
+#endif
+ if (old_state !=
+ transaction->next_state) {
+ changed = true;
+ tt->state =
+ transaction->next_state;
+ }
+ break;
+ }
+ }
+ /* stop ct_kill_waiting_tm timer */
+ del_timer_sync(&priv->thermal_throttle.ct_kill_waiting_tm);
+ if (changed) {
+ struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
+
+ if (tt->state >= IWL_TI_1) {
+ /* force PI = IWL_POWER_INDEX_5 in the case of TI > 0 */
+ tt->tt_power_mode = IWL_POWER_INDEX_5;
+ if (!iwl_ht_enabled(priv))
+ /* disable HT */
+ rxon->flags &= ~(RXON_FLG_CHANNEL_MODE_MSK |
+ RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK |
+ RXON_FLG_HT40_PROT_MSK |
+ RXON_FLG_HT_PROT_MSK);
+ else {
+ /* check HT capability and set
+ * according to the system HT capability
+ * in case get disabled before */
+ iwl_set_rxon_ht(priv, &priv->current_ht_config);
+ }
+
+ } else {
+ /*
+ * restore system power setting -- it will be
+ * recalculated automatically.
+ */
+
+ /* check HT capability and set
+ * according to the system HT capability
+ * in case get disabled before */
+ iwl_set_rxon_ht(priv, &priv->current_ht_config);
+ }
+ mutex_lock(&priv->mutex);
+ if (old_state == IWL_TI_CT_KILL)
+ clear_bit(STATUS_CT_KILL, &priv->status);
+ if (tt->state != IWL_TI_CT_KILL &&
+ iwl_power_update_mode(priv, true)) {
+ /* TT state not updated
+ * try again during next temperature read
+ */
+ IWL_ERR(priv, "Cannot update power mode, "
+ "TT state not updated\n");
+ if (old_state == IWL_TI_CT_KILL)
+ set_bit(STATUS_CT_KILL, &priv->status);
+ tt->state = old_state;
+ } else {
+ IWL_DEBUG_POWER(priv,
+ "Thermal Throttling to new state: %u\n",
+ tt->state);
+ if (old_state != IWL_TI_CT_KILL &&
+ tt->state == IWL_TI_CT_KILL) {
+ if (force) {
+ IWL_DEBUG_POWER(priv,
+ "Enter IWL_TI_CT_KILL\n");
+ set_bit(STATUS_CT_KILL, &priv->status);
+ iwl_perform_ct_kill_task(priv, true);
+ } else {
+ iwl_prepare_ct_kill_task(priv);
+ tt->state = old_state;
+ }
+ } else if (old_state == IWL_TI_CT_KILL &&
+ tt->state != IWL_TI_CT_KILL) {
+ IWL_DEBUG_POWER(priv, "Exit IWL_TI_CT_KILL\n");
+ iwl_perform_ct_kill_task(priv, false);
+ }
+ }
+ mutex_unlock(&priv->mutex);
+ }
+}
+
+/* Card State Notification indicated reach critical temperature
+ * if PSP not enable, no Thermal Throttling function will be performed
+ * just set the GP1 bit to acknowledge the event
+ * otherwise, go into IWL_TI_CT_KILL state
+ * since Card State Notification will not provide any temperature reading
+ * for Legacy mode
+ * so just pass the CT_KILL temperature to iwl_legacy_tt_handler()
+ * for advance mode
+ * pass CT_KILL_THRESHOLD+1 to make sure move into IWL_TI_CT_KILL state
+ */
+static void iwl_bg_ct_enter(struct work_struct *work)
+{
+ struct iwl_priv *priv = container_of(work, struct iwl_priv, ct_enter);
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
+ return;
+
+ if (!iwl_is_ready(priv))
+ return;
+
+ if (tt->state != IWL_TI_CT_KILL) {
+ IWL_ERR(priv, "Device reached critical temperature "
+ "- ucode going to sleep!\n");
+ if (!priv->thermal_throttle.advanced_tt)
+ iwl_legacy_tt_handler(priv,
+ IWL_MINIMAL_POWER_THRESHOLD,
+ true);
+ else
+ iwl_advance_tt_handler(priv,
+ CT_KILL_THRESHOLD + 1, true);
+ }
+}
+
+/* Card State Notification indicated out of critical temperature
+ * since Card State Notification will not provide any temperature reading
+ * so pass the IWL_REDUCED_PERFORMANCE_THRESHOLD_2 temperature
+ * to iwl_legacy_tt_handler() to get out of IWL_CT_KILL state
+ */
+static void iwl_bg_ct_exit(struct work_struct *work)
+{
+ struct iwl_priv *priv = container_of(work, struct iwl_priv, ct_exit);
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
+ return;
+
+ if (!iwl_is_ready(priv))
+ return;
+
+ /* stop ct_kill_exit_tm timer */
+ del_timer_sync(&priv->thermal_throttle.ct_kill_exit_tm);
+
+ if (tt->state == IWL_TI_CT_KILL) {
+ IWL_ERR(priv,
+ "Device temperature below critical"
+ "- ucode awake!\n");
+ /*
+ * exit from CT_KILL state
+ * reset the current temperature reading
+ */
+ priv->temperature = 0;
+ if (!priv->thermal_throttle.advanced_tt)
+ iwl_legacy_tt_handler(priv,
+ IWL_REDUCED_PERFORMANCE_THRESHOLD_2,
+ true);
+ else
+ iwl_advance_tt_handler(priv, CT_KILL_EXIT_THRESHOLD,
+ true);
+ }
+}
+
+void iwl_tt_enter_ct_kill(struct iwl_priv *priv)
+{
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
+ return;
+
+ IWL_DEBUG_POWER(priv, "Queueing critical temperature enter.\n");
+ queue_work(priv->workqueue, &priv->ct_enter);
+}
+EXPORT_SYMBOL(iwl_tt_enter_ct_kill);
+
+void iwl_tt_exit_ct_kill(struct iwl_priv *priv)
+{
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
+ return;
+
+ IWL_DEBUG_POWER(priv, "Queueing critical temperature exit.\n");
+ queue_work(priv->workqueue, &priv->ct_exit);
+}
+EXPORT_SYMBOL(iwl_tt_exit_ct_kill);
+
+static void iwl_bg_tt_work(struct work_struct *work)
+{
+ struct iwl_priv *priv = container_of(work, struct iwl_priv, tt_work);
+ s32 temp = priv->temperature; /* degrees CELSIUS except specified */
+
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
+ return;
+
+ if (priv->cfg->temperature_kelvin)
+ temp = KELVIN_TO_CELSIUS(priv->temperature);
+
+ if (!priv->thermal_throttle.advanced_tt)
+ iwl_legacy_tt_handler(priv, temp, false);
+ else
+ iwl_advance_tt_handler(priv, temp, false);
+}
+
+void iwl_tt_handler(struct iwl_priv *priv)
+{
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
+ return;
+
+ IWL_DEBUG_POWER(priv, "Queueing thermal throttling work.\n");
+ queue_work(priv->workqueue, &priv->tt_work);
+}
+EXPORT_SYMBOL(iwl_tt_handler);
+
+/* Thermal throttling initialization
+ * For advance thermal throttling:
+ * Initialize Thermal Index and temperature threshold table
+ * Initialize thermal throttling restriction table
+ */
+void iwl_tt_initialize(struct iwl_priv *priv)
+{
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+ int size = sizeof(struct iwl_tt_trans) * (IWL_TI_STATE_MAX - 1);
+ struct iwl_tt_trans *transaction;
+
+ IWL_DEBUG_POWER(priv, "Initialize Thermal Throttling\n");
+
+ memset(tt, 0, sizeof(struct iwl_tt_mgmt));
+
+ tt->state = IWL_TI_0;
+ init_timer(&priv->thermal_throttle.ct_kill_exit_tm);
+ priv->thermal_throttle.ct_kill_exit_tm.data = (unsigned long)priv;
+ priv->thermal_throttle.ct_kill_exit_tm.function =
+ iwl_tt_check_exit_ct_kill;
+ init_timer(&priv->thermal_throttle.ct_kill_waiting_tm);
+ priv->thermal_throttle.ct_kill_waiting_tm.data =
+ (unsigned long)priv;
+ priv->thermal_throttle.ct_kill_waiting_tm.function =
+ iwl_tt_ready_for_ct_kill;
+ /* setup deferred ct kill work */
+ INIT_WORK(&priv->tt_work, iwl_bg_tt_work);
+ INIT_WORK(&priv->ct_enter, iwl_bg_ct_enter);
+ INIT_WORK(&priv->ct_exit, iwl_bg_ct_exit);
+
+ if (priv->cfg->adv_thermal_throttle) {
+ IWL_DEBUG_POWER(priv, "Advanced Thermal Throttling\n");
+ tt->restriction = kzalloc(sizeof(struct iwl_tt_restriction) *
+ IWL_TI_STATE_MAX, GFP_KERNEL);
+ tt->transaction = kzalloc(sizeof(struct iwl_tt_trans) *
+ IWL_TI_STATE_MAX * (IWL_TI_STATE_MAX - 1),
+ GFP_KERNEL);
+ if (!tt->restriction || !tt->transaction) {
+ IWL_ERR(priv, "Fallback to Legacy Throttling\n");
+ priv->thermal_throttle.advanced_tt = false;
+ kfree(tt->restriction);
+ tt->restriction = NULL;
+ kfree(tt->transaction);
+ tt->transaction = NULL;
+ } else {
+ transaction = tt->transaction +
+ (IWL_TI_0 * (IWL_TI_STATE_MAX - 1));
+ memcpy(transaction, &tt_range_0[0], size);
+ transaction = tt->transaction +
+ (IWL_TI_1 * (IWL_TI_STATE_MAX - 1));
+ memcpy(transaction, &tt_range_1[0], size);
+ transaction = tt->transaction +
+ (IWL_TI_2 * (IWL_TI_STATE_MAX - 1));
+ memcpy(transaction, &tt_range_2[0], size);
+ transaction = tt->transaction +
+ (IWL_TI_CT_KILL * (IWL_TI_STATE_MAX - 1));
+ memcpy(transaction, &tt_range_3[0], size);
+ size = sizeof(struct iwl_tt_restriction) *
+ IWL_TI_STATE_MAX;
+ memcpy(tt->restriction,
+ &restriction_range[0], size);
+ priv->thermal_throttle.advanced_tt = true;
+ }
+ } else {
+ IWL_DEBUG_POWER(priv, "Legacy Thermal Throttling\n");
+ priv->thermal_throttle.advanced_tt = false;
+ }
+}
+EXPORT_SYMBOL(iwl_tt_initialize);
+
+/* cleanup thermal throttling management related memory and timer */
+void iwl_tt_exit(struct iwl_priv *priv)
+{
+ struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
+
+ /* stop ct_kill_exit_tm timer if activated */
+ del_timer_sync(&priv->thermal_throttle.ct_kill_exit_tm);
+ /* stop ct_kill_waiting_tm timer if activated */
+ del_timer_sync(&priv->thermal_throttle.ct_kill_waiting_tm);
+ cancel_work_sync(&priv->tt_work);
+ cancel_work_sync(&priv->ct_enter);
+ cancel_work_sync(&priv->ct_exit);
+
+ if (priv->thermal_throttle.advanced_tt) {
+ /* free advance thermal throttling memory */
+ kfree(tt->restriction);
+ tt->restriction = NULL;
+ kfree(tt->transaction);
+ tt->transaction = NULL;
+ }
+}
+EXPORT_SYMBOL(iwl_tt_exit);
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tt.h b/drivers/net/wireless/iwlwifi/iwl-agn-tt.h
new file mode 100644
index 000000000000..d55060427cac
--- /dev/null
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-tt.h
@@ -0,0 +1,129 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2010 Intel Corporation. All rights reserved.
+ *
+ * Portions of this file are derived from the ipw3945 project, as well
+ * as portions of the ieee80211 subsystem header files.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * Intel Linux Wireless <ilw@linux.intel.com>
+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+ *****************************************************************************/
+#ifndef __iwl_tt_setting_h__
+#define __iwl_tt_setting_h__
+
+#include "iwl-commands.h"
+
+#define IWL_ABSOLUTE_ZERO 0
+#define IWL_ABSOLUTE_MAX 0xFFFFFFFF
+#define IWL_TT_INCREASE_MARGIN 5
+#define IWL_TT_CT_KILL_MARGIN 3
+
+enum iwl_antenna_ok {
+ IWL_ANT_OK_NONE,
+ IWL_ANT_OK_SINGLE,
+ IWL_ANT_OK_MULTI,
+};
+
+/* Thermal Throttling State Machine states */
+enum iwl_tt_state {
+ IWL_TI_0, /* normal temperature, system power state */
+ IWL_TI_1, /* high temperature detect, low power state */
+ IWL_TI_2, /* higher temperature detected, lower power state */
+ IWL_TI_CT_KILL, /* critical temperature detected, lowest power state */
+ IWL_TI_STATE_MAX
+};
+
+/**
+ * struct iwl_tt_restriction - Thermal Throttling restriction table
+ * @tx_stream: number of tx stream allowed
+ * @is_ht: ht enable/disable
+ * @rx_stream: number of rx stream allowed
+ *
+ * This table is used by advance thermal throttling management
+ * based on the current thermal throttling state, and determines
+ * the number of tx/rx streams and the status of HT operation.
+ */
+struct iwl_tt_restriction {
+ enum iwl_antenna_ok tx_stream;
+ enum iwl_antenna_ok rx_stream;
+ bool is_ht;
+};
+
+/**
+ * struct iwl_tt_trans - Thermal Throttling transaction table
+ * @next_state: next thermal throttling mode
+ * @tt_low: low temperature threshold to change state
+ * @tt_high: high temperature threshold to change state
+ *
+ * This is used by the advanced thermal throttling algorithm
+ * to determine the next thermal state to go based on the
+ * current temperature.
+ */
+struct iwl_tt_trans {
+ enum iwl_tt_state next_state;
+ u32 tt_low;
+ u32 tt_high;
+};
+
+/**
+ * struct iwl_tt_mgnt - Thermal Throttling Management structure
+ * @advanced_tt: advanced thermal throttle required
+ * @state: current Thermal Throttling state
+ * @tt_power_mode: Thermal Throttling power mode index
+ * being used to set power level when
+ * when thermal throttling state != IWL_TI_0
+ * the tt_power_mode should set to different
+ * power mode based on the current tt state
+ * @tt_previous_temperature: last measured temperature
+ * @iwl_tt_restriction: ptr to restriction tbl, used by advance
+ * thermal throttling to determine how many tx/rx streams
+ * should be used in tt state; and can HT be enabled or not
+ * @iwl_tt_trans: ptr to adv trans table, used by advance thermal throttling
+ * state transaction
+ * @ct_kill_toggle: used to toggle the CSR bit when checking uCode temperature
+ * @ct_kill_exit_tm: timer to exit thermal kill
+ */
+struct iwl_tt_mgmt {
+ enum iwl_tt_state state;
+ bool advanced_tt;
+ u8 tt_power_mode;
+ bool ct_kill_toggle;
+#ifdef CONFIG_IWLWIFI_DEBUG
+ s32 tt_previous_temp;
+#endif
+ struct iwl_tt_restriction *restriction;
+ struct iwl_tt_trans *transaction;
+ struct timer_list ct_kill_exit_tm;
+ struct timer_list ct_kill_waiting_tm;
+};
+
+u8 iwl_tt_current_power_mode(struct iwl_priv *priv);
+bool iwl_tt_is_low_power_state(struct iwl_priv *priv);
+bool iwl_ht_enabled(struct iwl_priv *priv);
+bool iwl_check_for_ct_kill(struct iwl_priv *priv);
+enum iwl_antenna_ok iwl_tx_ant_restriction(struct iwl_priv *priv);
+enum iwl_antenna_ok iwl_rx_ant_restriction(struct iwl_priv *priv);
+void iwl_tt_enter_ct_kill(struct iwl_priv *priv);
+void iwl_tt_exit_ct_kill(struct iwl_priv *priv);
+void iwl_tt_handler(struct iwl_priv *priv);
+void iwl_tt_initialize(struct iwl_priv *priv);
+void iwl_tt_exit(struct iwl_priv *priv);
+
+#endif /* __iwl_tt_setting_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
index 69155aa448fb..3fc982e87921 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
@@ -470,8 +470,8 @@ static void iwlagn_tx_cmd_build_hwcrypto(struct iwl_priv *priv,
{
struct ieee80211_key_conf *keyconf = info->control.hw_key;
- switch (keyconf->alg) {
- case ALG_CCMP:
+ switch (keyconf->cipher) {
+ case WLAN_CIPHER_SUITE_CCMP:
tx_cmd->sec_ctl = TX_CMD_SEC_CCM;
memcpy(tx_cmd->key, keyconf->key, keyconf->keylen);
if (info->flags & IEEE80211_TX_CTL_AMPDU)
@@ -479,20 +479,20 @@ static void iwlagn_tx_cmd_build_hwcrypto(struct iwl_priv *priv,
IWL_DEBUG_TX(priv, "tx_cmd with AES hwcrypto\n");
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
tx_cmd->sec_ctl = TX_CMD_SEC_TKIP;
ieee80211_get_tkip_key(keyconf, skb_frag,
IEEE80211_TKIP_P2_KEY, tx_cmd->key);
IWL_DEBUG_TX(priv, "tx_cmd with tkip hwcrypto\n");
break;
- case ALG_WEP:
+ case WLAN_CIPHER_SUITE_WEP104:
+ tx_cmd->sec_ctl |= TX_CMD_SEC_KEY128;
+ /* fall through */
+ case WLAN_CIPHER_SUITE_WEP40:
tx_cmd->sec_ctl |= (TX_CMD_SEC_WEP |
(keyconf->keyidx & TX_CMD_SEC_MSK) << TX_CMD_SEC_SHIFT);
- if (keyconf->keylen == WEP_KEY_LEN_128)
- tx_cmd->sec_ctl |= TX_CMD_SEC_KEY128;
-
memcpy(&tx_cmd->key[3], keyconf->key, keyconf->keylen);
IWL_DEBUG_TX(priv, "Configuring packet for WEP encryption "
@@ -500,7 +500,7 @@ static void iwlagn_tx_cmd_build_hwcrypto(struct iwl_priv *priv,
break;
default:
- IWL_ERR(priv, "Unknown encode alg %d\n", keyconf->alg);
+ IWL_ERR(priv, "Unknown encode cipher %x\n", keyconf->cipher);
break;
}
}
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index c1882fd8345d..c8dec4a5f16d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -33,6 +33,7 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/pci.h>
+#include <linux/pci-aspm.h>
#include <linux/slab.h>
#include <linux/dma-mapping.h>
#include <linux/delay.h>
@@ -763,10 +764,10 @@ static void iwl_bg_ucode_trace(unsigned long data)
static void iwl_rx_beacon_notif(struct iwl_priv *priv,
struct iwl_rx_mem_buffer *rxb)
{
-#ifdef CONFIG_IWLWIFI_DEBUG
struct iwl_rx_packet *pkt = rxb_addr(rxb);
struct iwl4965_beacon_notif *beacon =
(struct iwl4965_beacon_notif *)pkt->u.raw;
+#ifdef CONFIG_IWLWIFI_DEBUG
u8 rate = iwl_hw_get_rate(beacon->beacon_notify_hdr.rate_n_flags);
IWL_DEBUG_RX(priv, "beacon status %x retries %d iss %d "
@@ -778,6 +779,8 @@ static void iwl_rx_beacon_notif(struct iwl_priv *priv,
le32_to_cpu(beacon->low_tsf), rate);
#endif
+ priv->ibss_manager = le32_to_cpu(beacon->ibss_mgr_status);
+
if ((priv->iw_mode == NL80211_IFTYPE_AP) &&
(!test_bit(STATUS_EXIT_PENDING, &priv->status)))
queue_work(priv->workqueue, &priv->beacon_update);
@@ -2589,6 +2592,52 @@ int iwl_dump_nic_event_log(struct iwl_priv *priv, bool full_log,
return pos;
}
+static void iwl_rf_kill_ct_config(struct iwl_priv *priv)
+{
+ struct iwl_ct_kill_config cmd;
+ struct iwl_ct_kill_throttling_config adv_cmd;
+ unsigned long flags;
+ int ret = 0;
+
+ spin_lock_irqsave(&priv->lock, flags);
+ iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR,
+ CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
+ spin_unlock_irqrestore(&priv->lock, flags);
+ priv->thermal_throttle.ct_kill_toggle = false;
+
+ if (priv->cfg->support_ct_kill_exit) {
+ adv_cmd.critical_temperature_enter =
+ cpu_to_le32(priv->hw_params.ct_kill_threshold);
+ adv_cmd.critical_temperature_exit =
+ cpu_to_le32(priv->hw_params.ct_kill_exit_threshold);
+
+ ret = iwl_send_cmd_pdu(priv, REPLY_CT_KILL_CONFIG_CMD,
+ sizeof(adv_cmd), &adv_cmd);
+ if (ret)
+ IWL_ERR(priv, "REPLY_CT_KILL_CONFIG_CMD failed\n");
+ else
+ IWL_DEBUG_INFO(priv, "REPLY_CT_KILL_CONFIG_CMD "
+ "succeeded, "
+ "critical temperature enter is %d,"
+ "exit is %d\n",
+ priv->hw_params.ct_kill_threshold,
+ priv->hw_params.ct_kill_exit_threshold);
+ } else {
+ cmd.critical_temperature_R =
+ cpu_to_le32(priv->hw_params.ct_kill_threshold);
+
+ ret = iwl_send_cmd_pdu(priv, REPLY_CT_KILL_CONFIG_CMD,
+ sizeof(cmd), &cmd);
+ if (ret)
+ IWL_ERR(priv, "REPLY_CT_KILL_CONFIG_CMD failed\n");
+ else
+ IWL_DEBUG_INFO(priv, "REPLY_CT_KILL_CONFIG_CMD "
+ "succeeded, "
+ "critical temperature is %d\n",
+ priv->hw_params.ct_kill_threshold);
+ }
+}
+
/**
* iwl_alive_start - called after REPLY_ALIVE notification received
* from protocol/runtime uCode (initialization uCode's
@@ -3386,7 +3435,9 @@ static int iwl_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
* in 1X mode.
* In legacy wep mode, we use another host command to the uCode.
*/
- if (key->alg == ALG_WEP && !sta && vif->type != NL80211_IFTYPE_AP) {
+ if ((key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
+ key->cipher == WLAN_CIPHER_SUITE_WEP104) &&
+ !sta && vif->type != NL80211_IFTYPE_AP) {
if (cmd == SET_KEY)
is_default_wep_key = !priv->key_mapping_key;
else
@@ -3667,6 +3718,49 @@ out_exit:
IWL_DEBUG_MAC80211(priv, "leave\n");
}
+static void iwlagn_configure_filter(struct ieee80211_hw *hw,
+ unsigned int changed_flags,
+ unsigned int *total_flags,
+ u64 multicast)
+{
+ struct iwl_priv *priv = hw->priv;
+ __le32 filter_or = 0, filter_nand = 0;
+
+#define CHK(test, flag) do { \
+ if (*total_flags & (test)) \
+ filter_or |= (flag); \
+ else \
+ filter_nand |= (flag); \
+ } while (0)
+
+ IWL_DEBUG_MAC80211(priv, "Enter: changed: 0x%x, total: 0x%x\n",
+ changed_flags, *total_flags);
+
+ CHK(FIF_OTHER_BSS | FIF_PROMISC_IN_BSS, RXON_FILTER_PROMISC_MSK);
+ CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK);
+ CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
+
+#undef CHK
+
+ mutex_lock(&priv->mutex);
+
+ priv->staging_rxon.filter_flags &= ~filter_nand;
+ priv->staging_rxon.filter_flags |= filter_or;
+
+ iwlcore_commit_rxon(priv);
+
+ mutex_unlock(&priv->mutex);
+
+ /*
+ * Receiving all multicast frames is always enabled by the
+ * default flags setup in iwl_connection_init_rx_config()
+ * since we currently do not support programming multicast
+ * filters into the device.
+ */
+ *total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
+ FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
+}
+
static void iwl_mac_flush(struct ieee80211_hw *hw, bool drop)
{
struct iwl_priv *priv = hw->priv;
@@ -3867,7 +3961,7 @@ static struct ieee80211_ops iwl_hw_ops = {
.add_interface = iwl_mac_add_interface,
.remove_interface = iwl_mac_remove_interface,
.config = iwl_mac_config,
- .configure_filter = iwl_configure_filter,
+ .configure_filter = iwlagn_configure_filter,
.set_key = iwl_mac_set_key,
.update_tkip_key = iwl_mac_update_tkip_key,
.conf_tx = iwl_mac_conf_tx,
@@ -3880,8 +3974,35 @@ static struct ieee80211_ops iwl_hw_ops = {
.sta_remove = iwl_mac_sta_remove,
.channel_switch = iwl_mac_channel_switch,
.flush = iwl_mac_flush,
+ .tx_last_beacon = iwl_mac_tx_last_beacon,
};
+static void iwl_hw_detect(struct iwl_priv *priv)
+{
+ priv->hw_rev = _iwl_read32(priv, CSR_HW_REV);
+ priv->hw_wa_rev = _iwl_read32(priv, CSR_HW_REV_WA_REG);
+ pci_read_config_byte(priv->pci_dev, PCI_REVISION_ID, &priv->rev_id);
+ IWL_DEBUG_INFO(priv, "HW Revision ID = 0x%X\n", priv->rev_id);
+}
+
+static int iwl_set_hw_params(struct iwl_priv *priv)
+{
+ priv->hw_params.max_rxq_size = RX_QUEUE_SIZE;
+ priv->hw_params.max_rxq_log = RX_QUEUE_SIZE_LOG;
+ if (priv->cfg->mod_params->amsdu_size_8K)
+ priv->hw_params.rx_page_order = get_order(IWL_RX_BUF_SIZE_8K);
+ else
+ priv->hw_params.rx_page_order = get_order(IWL_RX_BUF_SIZE_4K);
+
+ priv->hw_params.max_beacon_itrvl = IWL_MAX_UCODE_BEACON_INTERVAL;
+
+ if (priv->cfg->mod_params->disable_11n)
+ priv->cfg->sku &= ~IWL_SKU_N;
+
+ /* Device-specific setup */
+ return priv->cfg->ops->lib->set_hw_params(priv);
+}
+
static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
int err = 0;
@@ -3925,6 +4046,9 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
/**************************
* 2. Initializing PCI bus
**************************/
+ pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
+ PCIE_LINK_STATE_CLKPM);
+
if (pci_enable_device(pdev)) {
err = -ENODEV;
goto out_ieee80211_free_hw;
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
index 60725a5c1b69..9435fd934d5e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
+++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
@@ -2919,6 +2919,11 @@ struct iwl_scancomplete_notification {
*
*****************************************************************************/
+enum iwl_ibss_manager {
+ IWL_NOT_IBSS_MANAGER = 0,
+ IWL_IBSS_MANAGER = 1,
+};
+
/*
* BEACON_NOTIFICATION = 0x90 (notification only, not a command)
*/
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index 2c03c6e20a72..98cd710ff975 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -183,14 +183,6 @@ out:
}
EXPORT_SYMBOL(iwl_alloc_all);
-void iwl_hw_detect(struct iwl_priv *priv)
-{
- priv->hw_rev = _iwl_read32(priv, CSR_HW_REV);
- priv->hw_wa_rev = _iwl_read32(priv, CSR_HW_REV_WA_REG);
- pci_read_config_byte(priv->pci_dev, PCI_REVISION_ID, &priv->rev_id);
-}
-EXPORT_SYMBOL(iwl_hw_detect);
-
/*
* QoS support
*/
@@ -1328,70 +1320,6 @@ out:
EXPORT_SYMBOL(iwl_apm_init);
-
-void iwl_configure_filter(struct ieee80211_hw *hw,
- unsigned int changed_flags,
- unsigned int *total_flags,
- u64 multicast)
-{
- struct iwl_priv *priv = hw->priv;
- __le32 filter_or = 0, filter_nand = 0;
-
-#define CHK(test, flag) do { \
- if (*total_flags & (test)) \
- filter_or |= (flag); \
- else \
- filter_nand |= (flag); \
- } while (0)
-
- IWL_DEBUG_MAC80211(priv, "Enter: changed: 0x%x, total: 0x%x\n",
- changed_flags, *total_flags);
-
- CHK(FIF_OTHER_BSS | FIF_PROMISC_IN_BSS, RXON_FILTER_PROMISC_MSK);
- CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK);
- CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
-
-#undef CHK
-
- mutex_lock(&priv->mutex);
-
- priv->staging_rxon.filter_flags &= ~filter_nand;
- priv->staging_rxon.filter_flags |= filter_or;
-
- iwlcore_commit_rxon(priv);
-
- mutex_unlock(&priv->mutex);
-
- /*
- * Receiving all multicast frames is always enabled by the
- * default flags setup in iwl_connection_init_rx_config()
- * since we currently do not support programming multicast
- * filters into the device.
- */
- *total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
- FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
-}
-EXPORT_SYMBOL(iwl_configure_filter);
-
-int iwl_set_hw_params(struct iwl_priv *priv)
-{
- priv->hw_params.max_rxq_size = RX_QUEUE_SIZE;
- priv->hw_params.max_rxq_log = RX_QUEUE_SIZE_LOG;
- if (priv->cfg->mod_params->amsdu_size_8K)
- priv->hw_params.rx_page_order = get_order(IWL_RX_BUF_SIZE_8K);
- else
- priv->hw_params.rx_page_order = get_order(IWL_RX_BUF_SIZE_4K);
-
- priv->hw_params.max_beacon_itrvl = IWL_MAX_UCODE_BEACON_INTERVAL;
-
- if (priv->cfg->mod_params->disable_11n)
- priv->cfg->sku &= ~IWL_SKU_N;
-
- /* Device-specific setup */
- return priv->cfg->ops->lib->set_hw_params(priv);
-}
-EXPORT_SYMBOL(iwl_set_hw_params);
-
int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
{
int ret = 0;
@@ -1541,54 +1469,6 @@ int iwl_send_statistics_request(struct iwl_priv *priv, u8 flags, bool clear)
}
EXPORT_SYMBOL(iwl_send_statistics_request);
-void iwl_rf_kill_ct_config(struct iwl_priv *priv)
-{
- struct iwl_ct_kill_config cmd;
- struct iwl_ct_kill_throttling_config adv_cmd;
- unsigned long flags;
- int ret = 0;
-
- spin_lock_irqsave(&priv->lock, flags);
- iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR,
- CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
- spin_unlock_irqrestore(&priv->lock, flags);
- priv->thermal_throttle.ct_kill_toggle = false;
-
- if (priv->cfg->support_ct_kill_exit) {
- adv_cmd.critical_temperature_enter =
- cpu_to_le32(priv->hw_params.ct_kill_threshold);
- adv_cmd.critical_temperature_exit =
- cpu_to_le32(priv->hw_params.ct_kill_exit_threshold);
-
- ret = iwl_send_cmd_pdu(priv, REPLY_CT_KILL_CONFIG_CMD,
- sizeof(adv_cmd), &adv_cmd);
- if (ret)
- IWL_ERR(priv, "REPLY_CT_KILL_CONFIG_CMD failed\n");
- else
- IWL_DEBUG_INFO(priv, "REPLY_CT_KILL_CONFIG_CMD "
- "succeeded, "
- "critical temperature enter is %d,"
- "exit is %d\n",
- priv->hw_params.ct_kill_threshold,
- priv->hw_params.ct_kill_exit_threshold);
- } else {
- cmd.critical_temperature_R =
- cpu_to_le32(priv->hw_params.ct_kill_threshold);
-
- ret = iwl_send_cmd_pdu(priv, REPLY_CT_KILL_CONFIG_CMD,
- sizeof(cmd), &cmd);
- if (ret)
- IWL_ERR(priv, "REPLY_CT_KILL_CONFIG_CMD failed\n");
- else
- IWL_DEBUG_INFO(priv, "REPLY_CT_KILL_CONFIG_CMD "
- "succeeded, "
- "critical temperature is %d\n",
- priv->hw_params.ct_kill_threshold);
- }
-}
-EXPORT_SYMBOL(iwl_rf_kill_ct_config);
-
-
/*
* CARD_STATE_CMD
*
@@ -1693,6 +1573,14 @@ int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
}
EXPORT_SYMBOL(iwl_mac_conf_tx);
+int iwl_mac_tx_last_beacon(struct ieee80211_hw *hw)
+{
+ struct iwl_priv *priv = hw->priv;
+
+ return priv->ibss_manager == IWL_IBSS_MANAGER;
+}
+EXPORT_SYMBOL_GPL(iwl_mac_tx_last_beacon);
+
static void iwl_ht_conf(struct iwl_priv *priv,
struct ieee80211_vif *vif)
{
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index 4a71dfb10a15..b9611ad1ae34 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -136,6 +136,12 @@ struct iwl_temp_ops {
void (*set_calib_version)(struct iwl_priv *priv);
};
+struct iwl_tt_ops {
+ bool (*lower_power_detection)(struct iwl_priv *priv);
+ u8 (*tt_power_mode)(struct iwl_priv *priv);
+ bool (*ct_kill_check)(struct iwl_priv *priv);
+};
+
struct iwl_lib_ops {
/* set hw dependent parameters */
int (*set_hw_params)(struct iwl_priv *priv);
@@ -212,6 +218,9 @@ struct iwl_lib_ops {
void (*dev_txfifo_flush)(struct iwl_priv *priv, u16 flush_control);
struct iwl_debugfs_ops debugfs_ops;
+
+ /* thermal throttling */
+ struct iwl_tt_ops tt_ops;
};
struct iwl_led_ops {
@@ -347,10 +356,10 @@ struct iwl_cfg {
struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg,
struct ieee80211_ops *hw_ops);
-void iwl_hw_detect(struct iwl_priv *priv);
void iwl_activate_qos(struct iwl_priv *priv);
int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
const struct ieee80211_tx_queue_params *params);
+int iwl_mac_tx_last_beacon(struct ieee80211_hw *hw);
void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, int hw_decrypt);
int iwl_check_rxon_cmd(struct iwl_priv *priv);
int iwl_full_rxon_required(struct iwl_priv *priv);
@@ -372,10 +381,6 @@ int iwl_set_decrypted_flag(struct iwl_priv *priv,
u32 decrypt_res,
struct ieee80211_rx_status *stats);
void iwl_irq_handle_error(struct iwl_priv *priv);
-void iwl_configure_filter(struct ieee80211_hw *hw,
- unsigned int changed_flags,
- unsigned int *total_flags, u64 multicast);
-int iwl_set_hw_params(struct iwl_priv *priv);
void iwl_post_associate(struct iwl_priv *priv, struct ieee80211_vif *vif);
void iwl_bss_info_changed(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
@@ -530,7 +535,6 @@ int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms);
int iwl_mac_hw_scan(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
struct cfg80211_scan_request *req);
-void iwl_bg_start_internal_scan(struct work_struct *work);
void iwl_internal_short_hw_scan(struct iwl_priv *priv);
int iwl_force_reset(struct iwl_priv *priv, int mode, bool external);
u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
@@ -542,9 +546,6 @@ u16 iwl_get_active_dwell_time(struct iwl_priv *priv,
u16 iwl_get_passive_dwell_time(struct iwl_priv *priv,
enum ieee80211_band band,
struct ieee80211_vif *vif);
-void iwl_bg_scan_check(struct work_struct *data);
-void iwl_bg_abort_scan(struct work_struct *work);
-void iwl_bg_scan_completed(struct work_struct *work);
void iwl_setup_scan_deferred_work(struct iwl_priv *priv);
/* For faster active scanning, scan will move to the next channel if fewer than
@@ -698,7 +699,6 @@ static inline int iwl_is_ready_rf(struct iwl_priv *priv)
return iwl_is_ready(priv);
}
-extern void iwl_rf_kill_ct_config(struct iwl_priv *priv);
extern void iwl_send_bt_config(struct iwl_priv *priv);
extern int iwl_send_statistics_request(struct iwl_priv *priv,
u8 flags, bool clear);
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index f35bcad56e36..a36b4f953224 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -47,6 +47,7 @@
#include "iwl-led.h"
#include "iwl-power.h"
#include "iwl-agn-rs.h"
+#include "iwl-agn-tt.h"
struct iwl_tx_queue;
@@ -420,7 +421,7 @@ struct iwl_tid_data {
};
struct iwl_hw_key {
- enum ieee80211_key_alg alg;
+ u32 cipher;
int keylen;
u8 keyidx;
u8 key[32];
@@ -1049,7 +1050,8 @@ struct iwl_event_log {
#define IWL_DELAY_NEXT_FORCE_FW_RELOAD (HZ*5)
/* timer constants use to monitor and recover stuck tx queues in mSecs */
-#define IWL_MONITORING_PERIOD (1000)
+#define IWL_DEF_MONITORING_PERIOD (1000)
+#define IWL_LONG_MONITORING_PERIOD (5000)
#define IWL_ONE_HUNDRED_MSECS (100)
#define IWL_SIXTY_SECS (60000)
@@ -1109,6 +1111,9 @@ struct iwl_priv {
u32 ucode_beacon_time;
int missed_beacon_threshold;
+ /* track IBSS manager (last beacon) status */
+ u32 ibss_manager;
+
/* storing the jiffies when the plcp error rate is received */
unsigned long plcp_jiffies;
diff --git a/drivers/net/wireless/iwlwifi/iwl-power.c b/drivers/net/wireless/iwlwifi/iwl-power.c
index cda6a94d6cc9..63c0ab46261f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-power.c
+++ b/drivers/net/wireless/iwlwifi/iwl-power.c
@@ -192,47 +192,6 @@ static void iwl_static_sleep_cmd(struct iwl_priv *priv,
IWL_DEBUG_POWER(priv, "Sleep command for index %d\n", lvl + 1);
}
-/* default Thermal Throttling transaction table
- * Current state | Throttling Down | Throttling Up
- *=============================================================================
- * Condition Nxt State Condition Nxt State Condition Nxt State
- *-----------------------------------------------------------------------------
- * IWL_TI_0 T >= 114 CT_KILL 114>T>=105 TI_1 N/A N/A
- * IWL_TI_1 T >= 114 CT_KILL 114>T>=110 TI_2 T<=95 TI_0
- * IWL_TI_2 T >= 114 CT_KILL T<=100 TI_1
- * IWL_CT_KILL N/A N/A N/A N/A T<=95 TI_0
- *=============================================================================
- */
-static const struct iwl_tt_trans tt_range_0[IWL_TI_STATE_MAX - 1] = {
- {IWL_TI_0, IWL_ABSOLUTE_ZERO, 104},
- {IWL_TI_1, 105, CT_KILL_THRESHOLD - 1},
- {IWL_TI_CT_KILL, CT_KILL_THRESHOLD, IWL_ABSOLUTE_MAX}
-};
-static const struct iwl_tt_trans tt_range_1[IWL_TI_STATE_MAX - 1] = {
- {IWL_TI_0, IWL_ABSOLUTE_ZERO, 95},
- {IWL_TI_2, 110, CT_KILL_THRESHOLD - 1},
- {IWL_TI_CT_KILL, CT_KILL_THRESHOLD, IWL_ABSOLUTE_MAX}
-};
-static const struct iwl_tt_trans tt_range_2[IWL_TI_STATE_MAX - 1] = {
- {IWL_TI_1, IWL_ABSOLUTE_ZERO, 100},
- {IWL_TI_CT_KILL, CT_KILL_THRESHOLD, IWL_ABSOLUTE_MAX},
- {IWL_TI_CT_KILL, CT_KILL_THRESHOLD, IWL_ABSOLUTE_MAX}
-};
-static const struct iwl_tt_trans tt_range_3[IWL_TI_STATE_MAX - 1] = {
- {IWL_TI_0, IWL_ABSOLUTE_ZERO, CT_KILL_EXIT_THRESHOLD},
- {IWL_TI_CT_KILL, CT_KILL_EXIT_THRESHOLD + 1, IWL_ABSOLUTE_MAX},
- {IWL_TI_CT_KILL, CT_KILL_EXIT_THRESHOLD + 1, IWL_ABSOLUTE_MAX}
-};
-
-/* Advance Thermal Throttling default restriction table */
-static const struct iwl_tt_restriction restriction_range[IWL_TI_STATE_MAX] = {
- {IWL_ANT_OK_MULTI, IWL_ANT_OK_MULTI, true },
- {IWL_ANT_OK_SINGLE, IWL_ANT_OK_MULTI, true },
- {IWL_ANT_OK_SINGLE, IWL_ANT_OK_SINGLE, false },
- {IWL_ANT_OK_NONE, IWL_ANT_OK_NONE, false }
-};
-
-
static void iwl_power_sleep_cam_cmd(struct iwl_priv *priv,
struct iwl_powertable_cmd *cmd)
{
@@ -308,7 +267,6 @@ static int iwl_set_power(struct iwl_priv *priv, struct iwl_powertable_cmd *cmd)
int iwl_power_update_mode(struct iwl_priv *priv, bool force)
{
int ret = 0;
- struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
bool enabled = priv->hw->conf.flags & IEEE80211_CONF_PS;
bool update_chains;
struct iwl_powertable_cmd cmd;
@@ -325,9 +283,13 @@ int iwl_power_update_mode(struct iwl_priv *priv, bool force)
else if (priv->cfg->supports_idle &&
priv->hw->conf.flags & IEEE80211_CONF_IDLE)
iwl_static_sleep_cmd(priv, &cmd, IWL_POWER_INDEX_5, 20);
- else if (tt->state >= IWL_TI_1)
- iwl_static_sleep_cmd(priv, &cmd, tt->tt_power_mode, dtimper);
- else if (!enabled)
+ else if (priv->cfg->ops->lib->tt_ops.lower_power_detection &&
+ priv->cfg->ops->lib->tt_ops.tt_power_mode &&
+ priv->cfg->ops->lib->tt_ops.lower_power_detection(priv)) {
+ /* in thermal throttling low power state */
+ iwl_static_sleep_cmd(priv, &cmd,
+ priv->cfg->ops->lib->tt_ops.tt_power_mode(priv), dtimper);
+ } else if (!enabled)
iwl_power_sleep_cam_cmd(priv, &cmd);
else if (priv->power_data.debug_sleep_level_override >= 0)
iwl_static_sleep_cmd(priv, &cmd,
@@ -367,592 +329,6 @@ int iwl_power_update_mode(struct iwl_priv *priv, bool force)
}
EXPORT_SYMBOL(iwl_power_update_mode);
-bool iwl_ht_enabled(struct iwl_priv *priv)
-{
- struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
- struct iwl_tt_restriction *restriction;
-
- if (!priv->thermal_throttle.advanced_tt)
- return true;
- restriction = tt->restriction + tt->state;
- return restriction->is_ht;
-}
-EXPORT_SYMBOL(iwl_ht_enabled);
-
-bool iwl_within_ct_kill_margin(struct iwl_priv *priv)
-{
- s32 temp = priv->temperature; /* degrees CELSIUS except specified */
- bool within_margin = false;
-
- if (priv->cfg->temperature_kelvin)
- temp = KELVIN_TO_CELSIUS(priv->temperature);
-
- if (!priv->thermal_throttle.advanced_tt)
- within_margin = ((temp + IWL_TT_CT_KILL_MARGIN) >=
- CT_KILL_THRESHOLD_LEGACY) ? true : false;
- else
- within_margin = ((temp + IWL_TT_CT_KILL_MARGIN) >=
- CT_KILL_THRESHOLD) ? true : false;
- return within_margin;
-}
-
-enum iwl_antenna_ok iwl_tx_ant_restriction(struct iwl_priv *priv)
-{
- struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
- struct iwl_tt_restriction *restriction;
-
- if (!priv->thermal_throttle.advanced_tt)
- return IWL_ANT_OK_MULTI;
- restriction = tt->restriction + tt->state;
- return restriction->tx_stream;
-}
-EXPORT_SYMBOL(iwl_tx_ant_restriction);
-
-enum iwl_antenna_ok iwl_rx_ant_restriction(struct iwl_priv *priv)
-{
- struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
- struct iwl_tt_restriction *restriction;
-
- if (!priv->thermal_throttle.advanced_tt)
- return IWL_ANT_OK_MULTI;
- restriction = tt->restriction + tt->state;
- return restriction->rx_stream;
-}
-
-#define CT_KILL_EXIT_DURATION (5) /* 5 seconds duration */
-#define CT_KILL_WAITING_DURATION (300) /* 300ms duration */
-
-/*
- * toggle the bit to wake up uCode and check the temperature
- * if the temperature is below CT, uCode will stay awake and send card
- * state notification with CT_KILL bit clear to inform Thermal Throttling
- * Management to change state. Otherwise, uCode will go back to sleep
- * without doing anything, driver should continue the 5 seconds timer
- * to wake up uCode for temperature check until temperature drop below CT
- */
-static void iwl_tt_check_exit_ct_kill(unsigned long data)
-{
- struct iwl_priv *priv = (struct iwl_priv *)data;
- struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
- unsigned long flags;
-
- if (test_bit(STATUS_EXIT_PENDING, &priv->status))
- return;
-
- if (tt->state == IWL_TI_CT_KILL) {
- if (priv->thermal_throttle.ct_kill_toggle) {
- iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR,
- CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
- priv->thermal_throttle.ct_kill_toggle = false;
- } else {
- iwl_write32(priv, CSR_UCODE_DRV_GP1_SET,
- CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
- priv->thermal_throttle.ct_kill_toggle = true;
- }
- iwl_read32(priv, CSR_UCODE_DRV_GP1);
- spin_lock_irqsave(&priv->reg_lock, flags);
- if (!iwl_grab_nic_access(priv))
- iwl_release_nic_access(priv);
- spin_unlock_irqrestore(&priv->reg_lock, flags);
-
- /* Reschedule the ct_kill timer to occur in
- * CT_KILL_EXIT_DURATION seconds to ensure we get a
- * thermal update */
- IWL_DEBUG_POWER(priv, "schedule ct_kill exit timer\n");
- mod_timer(&priv->thermal_throttle.ct_kill_exit_tm, jiffies +
- CT_KILL_EXIT_DURATION * HZ);
- }
-}
-
-static void iwl_perform_ct_kill_task(struct iwl_priv *priv,
- bool stop)
-{
- if (stop) {
- IWL_DEBUG_POWER(priv, "Stop all queues\n");
- if (priv->mac80211_registered)
- ieee80211_stop_queues(priv->hw);
- IWL_DEBUG_POWER(priv,
- "Schedule 5 seconds CT_KILL Timer\n");
- mod_timer(&priv->thermal_throttle.ct_kill_exit_tm, jiffies +
- CT_KILL_EXIT_DURATION * HZ);
- } else {
- IWL_DEBUG_POWER(priv, "Wake all queues\n");
- if (priv->mac80211_registered)
- ieee80211_wake_queues(priv->hw);
- }
-}
-
-static void iwl_tt_ready_for_ct_kill(unsigned long data)
-{
- struct iwl_priv *priv = (struct iwl_priv *)data;
- struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
-
- if (test_bit(STATUS_EXIT_PENDING, &priv->status))
- return;
-
- /* temperature timer expired, ready to go into CT_KILL state */
- if (tt->state != IWL_TI_CT_KILL) {
- IWL_DEBUG_POWER(priv, "entering CT_KILL state when temperature timer expired\n");
- tt->state = IWL_TI_CT_KILL;
- set_bit(STATUS_CT_KILL, &priv->status);
- iwl_perform_ct_kill_task(priv, true);
- }
-}
-
-static void iwl_prepare_ct_kill_task(struct iwl_priv *priv)
-{
- IWL_DEBUG_POWER(priv, "Prepare to enter IWL_TI_CT_KILL\n");
- /* make request to retrieve statistics information */
- iwl_send_statistics_request(priv, CMD_SYNC, false);
- /* Reschedule the ct_kill wait timer */
- mod_timer(&priv->thermal_throttle.ct_kill_waiting_tm,
- jiffies + msecs_to_jiffies(CT_KILL_WAITING_DURATION));
-}
-
-#define IWL_MINIMAL_POWER_THRESHOLD (CT_KILL_THRESHOLD_LEGACY)
-#define IWL_REDUCED_PERFORMANCE_THRESHOLD_2 (100)
-#define IWL_REDUCED_PERFORMANCE_THRESHOLD_1 (90)
-
-/*
- * Legacy thermal throttling
- * 1) Avoid NIC destruction due to high temperatures
- * Chip will identify dangerously high temperatures that can
- * harm the device and will power down
- * 2) Avoid the NIC power down due to high temperature
- * Throttle early enough to lower the power consumption before
- * drastic steps are needed
- */
-static void iwl_legacy_tt_handler(struct iwl_priv *priv, s32 temp, bool force)
-{
- struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
- enum iwl_tt_state old_state;
-
-#ifdef CONFIG_IWLWIFI_DEBUG
- if ((tt->tt_previous_temp) &&
- (temp > tt->tt_previous_temp) &&
- ((temp - tt->tt_previous_temp) >
- IWL_TT_INCREASE_MARGIN)) {
- IWL_DEBUG_POWER(priv,
- "Temperature increase %d degree Celsius\n",
- (temp - tt->tt_previous_temp));
- }
-#endif
- old_state = tt->state;
- /* in Celsius */
- if (temp >= IWL_MINIMAL_POWER_THRESHOLD)
- tt->state = IWL_TI_CT_KILL;
- else if (temp >= IWL_REDUCED_PERFORMANCE_THRESHOLD_2)
- tt->state = IWL_TI_2;
- else if (temp >= IWL_REDUCED_PERFORMANCE_THRESHOLD_1)
- tt->state = IWL_TI_1;
- else
- tt->state = IWL_TI_0;
-
-#ifdef CONFIG_IWLWIFI_DEBUG
- tt->tt_previous_temp = temp;
-#endif
- /* stop ct_kill_waiting_tm timer */
- del_timer_sync(&priv->thermal_throttle.ct_kill_waiting_tm);
- if (tt->state != old_state) {
- switch (tt->state) {
- case IWL_TI_0:
- /*
- * When the system is ready to go back to IWL_TI_0
- * we only have to call iwl_power_update_mode() to
- * do so.
- */
- break;
- case IWL_TI_1:
- tt->tt_power_mode = IWL_POWER_INDEX_3;
- break;
- case IWL_TI_2:
- tt->tt_power_mode = IWL_POWER_INDEX_4;
- break;
- default:
- tt->tt_power_mode = IWL_POWER_INDEX_5;
- break;
- }
- mutex_lock(&priv->mutex);
- if (old_state == IWL_TI_CT_KILL)
- clear_bit(STATUS_CT_KILL, &priv->status);
- if (tt->state != IWL_TI_CT_KILL &&
- iwl_power_update_mode(priv, true)) {
- /* TT state not updated
- * try again during next temperature read
- */
- if (old_state == IWL_TI_CT_KILL)
- set_bit(STATUS_CT_KILL, &priv->status);
- tt->state = old_state;
- IWL_ERR(priv, "Cannot update power mode, "
- "TT state not updated\n");
- } else {
- if (tt->state == IWL_TI_CT_KILL) {
- if (force) {
- set_bit(STATUS_CT_KILL, &priv->status);
- iwl_perform_ct_kill_task(priv, true);
- } else {
- iwl_prepare_ct_kill_task(priv);
- tt->state = old_state;
- }
- } else if (old_state == IWL_TI_CT_KILL &&
- tt->state != IWL_TI_CT_KILL)
- iwl_perform_ct_kill_task(priv, false);
- IWL_DEBUG_POWER(priv, "Temperature state changed %u\n",
- tt->state);
- IWL_DEBUG_POWER(priv, "Power Index change to %u\n",
- tt->tt_power_mode);
- }
- mutex_unlock(&priv->mutex);
- }
-}
-
-/*
- * Advance thermal throttling
- * 1) Avoid NIC destruction due to high temperatures
- * Chip will identify dangerously high temperatures that can
- * harm the device and will power down
- * 2) Avoid the NIC power down due to high temperature
- * Throttle early enough to lower the power consumption before
- * drastic steps are needed
- * Actions include relaxing the power down sleep thresholds and
- * decreasing the number of TX streams
- * 3) Avoid throughput performance impact as much as possible
- *
- *=============================================================================
- * Condition Nxt State Condition Nxt State Condition Nxt State
- *-----------------------------------------------------------------------------
- * IWL_TI_0 T >= 114 CT_KILL 114>T>=105 TI_1 N/A N/A
- * IWL_TI_1 T >= 114 CT_KILL 114>T>=110 TI_2 T<=95 TI_0
- * IWL_TI_2 T >= 114 CT_KILL T<=100 TI_1
- * IWL_CT_KILL N/A N/A N/A N/A T<=95 TI_0
- *=============================================================================
- */
-static void iwl_advance_tt_handler(struct iwl_priv *priv, s32 temp, bool force)
-{
- struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
- int i;
- bool changed = false;
- enum iwl_tt_state old_state;
- struct iwl_tt_trans *transaction;
-
- old_state = tt->state;
- for (i = 0; i < IWL_TI_STATE_MAX - 1; i++) {
- /* based on the current TT state,
- * find the curresponding transaction table
- * each table has (IWL_TI_STATE_MAX - 1) entries
- * tt->transaction + ((old_state * (IWL_TI_STATE_MAX - 1))
- * will advance to the correct table.
- * then based on the current temperature
- * find the next state need to transaction to
- * go through all the possible (IWL_TI_STATE_MAX - 1) entries
- * in the current table to see if transaction is needed
- */
- transaction = tt->transaction +
- ((old_state * (IWL_TI_STATE_MAX - 1)) + i);
- if (temp >= transaction->tt_low &&
- temp <= transaction->tt_high) {
-#ifdef CONFIG_IWLWIFI_DEBUG
- if ((tt->tt_previous_temp) &&
- (temp > tt->tt_previous_temp) &&
- ((temp - tt->tt_previous_temp) >
- IWL_TT_INCREASE_MARGIN)) {
- IWL_DEBUG_POWER(priv,
- "Temperature increase %d "
- "degree Celsius\n",
- (temp - tt->tt_previous_temp));
- }
- tt->tt_previous_temp = temp;
-#endif
- if (old_state !=
- transaction->next_state) {
- changed = true;
- tt->state =
- transaction->next_state;
- }
- break;
- }
- }
- /* stop ct_kill_waiting_tm timer */
- del_timer_sync(&priv->thermal_throttle.ct_kill_waiting_tm);
- if (changed) {
- struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
-
- if (tt->state >= IWL_TI_1) {
- /* force PI = IWL_POWER_INDEX_5 in the case of TI > 0 */
- tt->tt_power_mode = IWL_POWER_INDEX_5;
- if (!iwl_ht_enabled(priv))
- /* disable HT */
- rxon->flags &= ~(RXON_FLG_CHANNEL_MODE_MSK |
- RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK |
- RXON_FLG_HT40_PROT_MSK |
- RXON_FLG_HT_PROT_MSK);
- else {
- /* check HT capability and set
- * according to the system HT capability
- * in case get disabled before */
- iwl_set_rxon_ht(priv, &priv->current_ht_config);
- }
-
- } else {
- /*
- * restore system power setting -- it will be
- * recalculated automatically.
- */
-
- /* check HT capability and set
- * according to the system HT capability
- * in case get disabled before */
- iwl_set_rxon_ht(priv, &priv->current_ht_config);
- }
- mutex_lock(&priv->mutex);
- if (old_state == IWL_TI_CT_KILL)
- clear_bit(STATUS_CT_KILL, &priv->status);
- if (tt->state != IWL_TI_CT_KILL &&
- iwl_power_update_mode(priv, true)) {
- /* TT state not updated
- * try again during next temperature read
- */
- IWL_ERR(priv, "Cannot update power mode, "
- "TT state not updated\n");
- if (old_state == IWL_TI_CT_KILL)
- set_bit(STATUS_CT_KILL, &priv->status);
- tt->state = old_state;
- } else {
- IWL_DEBUG_POWER(priv,
- "Thermal Throttling to new state: %u\n",
- tt->state);
- if (old_state != IWL_TI_CT_KILL &&
- tt->state == IWL_TI_CT_KILL) {
- if (force) {
- IWL_DEBUG_POWER(priv,
- "Enter IWL_TI_CT_KILL\n");
- set_bit(STATUS_CT_KILL, &priv->status);
- iwl_perform_ct_kill_task(priv, true);
- } else {
- iwl_prepare_ct_kill_task(priv);
- tt->state = old_state;
- }
- } else if (old_state == IWL_TI_CT_KILL &&
- tt->state != IWL_TI_CT_KILL) {
- IWL_DEBUG_POWER(priv, "Exit IWL_TI_CT_KILL\n");
- iwl_perform_ct_kill_task(priv, false);
- }
- }
- mutex_unlock(&priv->mutex);
- }
-}
-
-/* Card State Notification indicated reach critical temperature
- * if PSP not enable, no Thermal Throttling function will be performed
- * just set the GP1 bit to acknowledge the event
- * otherwise, go into IWL_TI_CT_KILL state
- * since Card State Notification will not provide any temperature reading
- * for Legacy mode
- * so just pass the CT_KILL temperature to iwl_legacy_tt_handler()
- * for advance mode
- * pass CT_KILL_THRESHOLD+1 to make sure move into IWL_TI_CT_KILL state
- */
-static void iwl_bg_ct_enter(struct work_struct *work)
-{
- struct iwl_priv *priv = container_of(work, struct iwl_priv, ct_enter);
- struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
-
- if (test_bit(STATUS_EXIT_PENDING, &priv->status))
- return;
-
- if (!iwl_is_ready(priv))
- return;
-
- if (tt->state != IWL_TI_CT_KILL) {
- IWL_ERR(priv, "Device reached critical temperature "
- "- ucode going to sleep!\n");
- if (!priv->thermal_throttle.advanced_tt)
- iwl_legacy_tt_handler(priv,
- IWL_MINIMAL_POWER_THRESHOLD,
- true);
- else
- iwl_advance_tt_handler(priv,
- CT_KILL_THRESHOLD + 1, true);
- }
-}
-
-/* Card State Notification indicated out of critical temperature
- * since Card State Notification will not provide any temperature reading
- * so pass the IWL_REDUCED_PERFORMANCE_THRESHOLD_2 temperature
- * to iwl_legacy_tt_handler() to get out of IWL_CT_KILL state
- */
-static void iwl_bg_ct_exit(struct work_struct *work)
-{
- struct iwl_priv *priv = container_of(work, struct iwl_priv, ct_exit);
- struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
-
- if (test_bit(STATUS_EXIT_PENDING, &priv->status))
- return;
-
- if (!iwl_is_ready(priv))
- return;
-
- /* stop ct_kill_exit_tm timer */
- del_timer_sync(&priv->thermal_throttle.ct_kill_exit_tm);
-
- if (tt->state == IWL_TI_CT_KILL) {
- IWL_ERR(priv,
- "Device temperature below critical"
- "- ucode awake!\n");
- /*
- * exit from CT_KILL state
- * reset the current temperature reading
- */
- priv->temperature = 0;
- if (!priv->thermal_throttle.advanced_tt)
- iwl_legacy_tt_handler(priv,
- IWL_REDUCED_PERFORMANCE_THRESHOLD_2,
- true);
- else
- iwl_advance_tt_handler(priv, CT_KILL_EXIT_THRESHOLD,
- true);
- }
-}
-
-void iwl_tt_enter_ct_kill(struct iwl_priv *priv)
-{
- if (test_bit(STATUS_EXIT_PENDING, &priv->status))
- return;
-
- IWL_DEBUG_POWER(priv, "Queueing critical temperature enter.\n");
- queue_work(priv->workqueue, &priv->ct_enter);
-}
-EXPORT_SYMBOL(iwl_tt_enter_ct_kill);
-
-void iwl_tt_exit_ct_kill(struct iwl_priv *priv)
-{
- if (test_bit(STATUS_EXIT_PENDING, &priv->status))
- return;
-
- IWL_DEBUG_POWER(priv, "Queueing critical temperature exit.\n");
- queue_work(priv->workqueue, &priv->ct_exit);
-}
-EXPORT_SYMBOL(iwl_tt_exit_ct_kill);
-
-static void iwl_bg_tt_work(struct work_struct *work)
-{
- struct iwl_priv *priv = container_of(work, struct iwl_priv, tt_work);
- s32 temp = priv->temperature; /* degrees CELSIUS except specified */
-
- if (test_bit(STATUS_EXIT_PENDING, &priv->status))
- return;
-
- if (priv->cfg->temperature_kelvin)
- temp = KELVIN_TO_CELSIUS(priv->temperature);
-
- if (!priv->thermal_throttle.advanced_tt)
- iwl_legacy_tt_handler(priv, temp, false);
- else
- iwl_advance_tt_handler(priv, temp, false);
-}
-
-void iwl_tt_handler(struct iwl_priv *priv)
-{
- if (test_bit(STATUS_EXIT_PENDING, &priv->status))
- return;
-
- IWL_DEBUG_POWER(priv, "Queueing thermal throttling work.\n");
- queue_work(priv->workqueue, &priv->tt_work);
-}
-EXPORT_SYMBOL(iwl_tt_handler);
-
-/* Thermal throttling initialization
- * For advance thermal throttling:
- * Initialize Thermal Index and temperature threshold table
- * Initialize thermal throttling restriction table
- */
-void iwl_tt_initialize(struct iwl_priv *priv)
-{
- struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
- int size = sizeof(struct iwl_tt_trans) * (IWL_TI_STATE_MAX - 1);
- struct iwl_tt_trans *transaction;
-
- IWL_DEBUG_POWER(priv, "Initialize Thermal Throttling\n");
-
- memset(tt, 0, sizeof(struct iwl_tt_mgmt));
-
- tt->state = IWL_TI_0;
- init_timer(&priv->thermal_throttle.ct_kill_exit_tm);
- priv->thermal_throttle.ct_kill_exit_tm.data = (unsigned long)priv;
- priv->thermal_throttle.ct_kill_exit_tm.function =
- iwl_tt_check_exit_ct_kill;
- init_timer(&priv->thermal_throttle.ct_kill_waiting_tm);
- priv->thermal_throttle.ct_kill_waiting_tm.data = (unsigned long)priv;
- priv->thermal_throttle.ct_kill_waiting_tm.function =
- iwl_tt_ready_for_ct_kill;
- /* setup deferred ct kill work */
- INIT_WORK(&priv->tt_work, iwl_bg_tt_work);
- INIT_WORK(&priv->ct_enter, iwl_bg_ct_enter);
- INIT_WORK(&priv->ct_exit, iwl_bg_ct_exit);
-
- if (priv->cfg->adv_thermal_throttle) {
- IWL_DEBUG_POWER(priv, "Advanced Thermal Throttling\n");
- tt->restriction = kzalloc(sizeof(struct iwl_tt_restriction) *
- IWL_TI_STATE_MAX, GFP_KERNEL);
- tt->transaction = kzalloc(sizeof(struct iwl_tt_trans) *
- IWL_TI_STATE_MAX * (IWL_TI_STATE_MAX - 1),
- GFP_KERNEL);
- if (!tt->restriction || !tt->transaction) {
- IWL_ERR(priv, "Fallback to Legacy Throttling\n");
- priv->thermal_throttle.advanced_tt = false;
- kfree(tt->restriction);
- tt->restriction = NULL;
- kfree(tt->transaction);
- tt->transaction = NULL;
- } else {
- transaction = tt->transaction +
- (IWL_TI_0 * (IWL_TI_STATE_MAX - 1));
- memcpy(transaction, &tt_range_0[0], size);
- transaction = tt->transaction +
- (IWL_TI_1 * (IWL_TI_STATE_MAX - 1));
- memcpy(transaction, &tt_range_1[0], size);
- transaction = tt->transaction +
- (IWL_TI_2 * (IWL_TI_STATE_MAX - 1));
- memcpy(transaction, &tt_range_2[0], size);
- transaction = tt->transaction +
- (IWL_TI_CT_KILL * (IWL_TI_STATE_MAX - 1));
- memcpy(transaction, &tt_range_3[0], size);
- size = sizeof(struct iwl_tt_restriction) *
- IWL_TI_STATE_MAX;
- memcpy(tt->restriction,
- &restriction_range[0], size);
- priv->thermal_throttle.advanced_tt = true;
- }
- } else {
- IWL_DEBUG_POWER(priv, "Legacy Thermal Throttling\n");
- priv->thermal_throttle.advanced_tt = false;
- }
-}
-EXPORT_SYMBOL(iwl_tt_initialize);
-
-/* cleanup thermal throttling management related memory and timer */
-void iwl_tt_exit(struct iwl_priv *priv)
-{
- struct iwl_tt_mgmt *tt = &priv->thermal_throttle;
-
- /* stop ct_kill_exit_tm timer if activated */
- del_timer_sync(&priv->thermal_throttle.ct_kill_exit_tm);
- /* stop ct_kill_waiting_tm timer if activated */
- del_timer_sync(&priv->thermal_throttle.ct_kill_waiting_tm);
- cancel_work_sync(&priv->tt_work);
- cancel_work_sync(&priv->ct_enter);
- cancel_work_sync(&priv->ct_exit);
-
- if (priv->thermal_throttle.advanced_tt) {
- /* free advance thermal throttling memory */
- kfree(tt->restriction);
- tt->restriction = NULL;
- kfree(tt->transaction);
- tt->transaction = NULL;
- }
-}
-EXPORT_SYMBOL(iwl_tt_exit);
-
/* initialize to default */
void iwl_power_initialize(struct iwl_priv *priv)
{
diff --git a/drivers/net/wireless/iwlwifi/iwl-power.h b/drivers/net/wireless/iwlwifi/iwl-power.h
index 5db91c10dcc8..df81565a7cc4 100644
--- a/drivers/net/wireless/iwlwifi/iwl-power.h
+++ b/drivers/net/wireless/iwlwifi/iwl-power.h
@@ -30,90 +30,6 @@
#include "iwl-commands.h"
-#define IWL_ABSOLUTE_ZERO 0
-#define IWL_ABSOLUTE_MAX 0xFFFFFFFF
-#define IWL_TT_INCREASE_MARGIN 5
-#define IWL_TT_CT_KILL_MARGIN 3
-
-enum iwl_antenna_ok {
- IWL_ANT_OK_NONE,
- IWL_ANT_OK_SINGLE,
- IWL_ANT_OK_MULTI,
-};
-
-/* Thermal Throttling State Machine states */
-enum iwl_tt_state {
- IWL_TI_0, /* normal temperature, system power state */
- IWL_TI_1, /* high temperature detect, low power state */
- IWL_TI_2, /* higher temperature detected, lower power state */
- IWL_TI_CT_KILL, /* critical temperature detected, lowest power state */
- IWL_TI_STATE_MAX
-};
-
-/**
- * struct iwl_tt_restriction - Thermal Throttling restriction table
- * @tx_stream: number of tx stream allowed
- * @is_ht: ht enable/disable
- * @rx_stream: number of rx stream allowed
- *
- * This table is used by advance thermal throttling management
- * based on the current thermal throttling state, and determines
- * the number of tx/rx streams and the status of HT operation.
- */
-struct iwl_tt_restriction {
- enum iwl_antenna_ok tx_stream;
- enum iwl_antenna_ok rx_stream;
- bool is_ht;
-};
-
-/**
- * struct iwl_tt_trans - Thermal Throttling transaction table
- * @next_state: next thermal throttling mode
- * @tt_low: low temperature threshold to change state
- * @tt_high: high temperature threshold to change state
- *
- * This is used by the advanced thermal throttling algorithm
- * to determine the next thermal state to go based on the
- * current temperature.
- */
-struct iwl_tt_trans {
- enum iwl_tt_state next_state;
- u32 tt_low;
- u32 tt_high;
-};
-
-/**
- * struct iwl_tt_mgnt - Thermal Throttling Management structure
- * @advanced_tt: advanced thermal throttle required
- * @state: current Thermal Throttling state
- * @tt_power_mode: Thermal Throttling power mode index
- * being used to set power level when
- * when thermal throttling state != IWL_TI_0
- * the tt_power_mode should set to different
- * power mode based on the current tt state
- * @tt_previous_temperature: last measured temperature
- * @iwl_tt_restriction: ptr to restriction tbl, used by advance
- * thermal throttling to determine how many tx/rx streams
- * should be used in tt state; and can HT be enabled or not
- * @iwl_tt_trans: ptr to adv trans table, used by advance thermal throttling
- * state transaction
- * @ct_kill_toggle: used to toggle the CSR bit when checking uCode temperature
- * @ct_kill_exit_tm: timer to exit thermal kill
- */
-struct iwl_tt_mgmt {
- enum iwl_tt_state state;
- bool advanced_tt;
- u8 tt_power_mode;
- bool ct_kill_toggle;
-#ifdef CONFIG_IWLWIFI_DEBUG
- s32 tt_previous_temp;
-#endif
- struct iwl_tt_restriction *restriction;
- struct iwl_tt_trans *transaction;
- struct timer_list ct_kill_exit_tm;
- struct timer_list ct_kill_waiting_tm;
-};
-
enum iwl_power_level {
IWL_POWER_INDEX_1,
IWL_POWER_INDEX_2,
@@ -130,15 +46,6 @@ struct iwl_power_mgr {
};
int iwl_power_update_mode(struct iwl_priv *priv, bool force);
-bool iwl_ht_enabled(struct iwl_priv *priv);
-bool iwl_within_ct_kill_margin(struct iwl_priv *priv);
-enum iwl_antenna_ok iwl_tx_ant_restriction(struct iwl_priv *priv);
-enum iwl_antenna_ok iwl_rx_ant_restriction(struct iwl_priv *priv);
-void iwl_tt_enter_ct_kill(struct iwl_priv *priv);
-void iwl_tt_exit_ct_kill(struct iwl_priv *priv);
-void iwl_tt_handler(struct iwl_priv *priv);
-void iwl_tt_initialize(struct iwl_priv *priv);
-void iwl_tt_exit(struct iwl_priv *priv);
void iwl_power_initialize(struct iwl_priv *priv);
extern bool no_sleep_autoadjust;
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
index a4b3663a262f..ac510840519c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
+++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
@@ -378,7 +378,7 @@ void iwl_internal_short_hw_scan(struct iwl_priv *priv)
queue_work(priv->workqueue, &priv->start_internal_scan);
}
-void iwl_bg_start_internal_scan(struct work_struct *work)
+static void iwl_bg_start_internal_scan(struct work_struct *work)
{
struct iwl_priv *priv =
container_of(work, struct iwl_priv, start_internal_scan);
@@ -418,9 +418,8 @@ void iwl_bg_start_internal_scan(struct work_struct *work)
unlock:
mutex_unlock(&priv->mutex);
}
-EXPORT_SYMBOL(iwl_bg_start_internal_scan);
-void iwl_bg_scan_check(struct work_struct *data)
+static void iwl_bg_scan_check(struct work_struct *data)
{
struct iwl_priv *priv =
container_of(data, struct iwl_priv, scan_check.work);
@@ -439,7 +438,6 @@ void iwl_bg_scan_check(struct work_struct *data)
}
mutex_unlock(&priv->mutex);
}
-EXPORT_SYMBOL(iwl_bg_scan_check);
/**
* iwl_fill_probe_req - fill in all required fields and IE for probe request
@@ -489,7 +487,7 @@ u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
}
EXPORT_SYMBOL(iwl_fill_probe_req);
-void iwl_bg_abort_scan(struct work_struct *work)
+static void iwl_bg_abort_scan(struct work_struct *work)
{
struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan);
@@ -504,9 +502,8 @@ void iwl_bg_abort_scan(struct work_struct *work)
iwl_send_scan_abort(priv);
mutex_unlock(&priv->mutex);
}
-EXPORT_SYMBOL(iwl_bg_abort_scan);
-void iwl_bg_scan_completed(struct work_struct *work)
+static void iwl_bg_scan_completed(struct work_struct *work)
{
struct iwl_priv *priv =
container_of(work, struct iwl_priv, scan_completed);
@@ -555,7 +552,6 @@ void iwl_bg_scan_completed(struct work_struct *work)
if (!internal)
ieee80211_scan_completed(priv->hw, false);
}
-EXPORT_SYMBOL(iwl_bg_scan_completed);
void iwl_setup_scan_deferred_work(struct iwl_priv *priv)
{
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c
index 7e0829be5e78..d5e8db37b86e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-sta.c
+++ b/drivers/net/wireless/iwlwifi/iwl-sta.c
@@ -818,7 +818,7 @@ int iwl_set_default_wep_key(struct iwl_priv *priv,
keyconf->flags &= ~IEEE80211_KEY_FLAG_GENERATE_IV;
keyconf->hw_key_idx = HW_KEY_DEFAULT;
- priv->stations[IWL_AP_ID].keyinfo.alg = ALG_WEP;
+ priv->stations[IWL_AP_ID].keyinfo.cipher = keyconf->cipher;
priv->wep_keys[keyconf->keyidx].key_size = keyconf->keylen;
memcpy(&priv->wep_keys[keyconf->keyidx].key, &keyconf->key,
@@ -856,7 +856,7 @@ static int iwl_set_wep_dynamic_key_info(struct iwl_priv *priv,
spin_lock_irqsave(&priv->sta_lock, flags);
- priv->stations[sta_id].keyinfo.alg = keyconf->alg;
+ priv->stations[sta_id].keyinfo.cipher = keyconf->cipher;
priv->stations[sta_id].keyinfo.keylen = keyconf->keylen;
priv->stations[sta_id].keyinfo.keyidx = keyconf->keyidx;
@@ -906,7 +906,7 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv,
keyconf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
spin_lock_irqsave(&priv->sta_lock, flags);
- priv->stations[sta_id].keyinfo.alg = keyconf->alg;
+ priv->stations[sta_id].keyinfo.cipher = keyconf->cipher;
priv->stations[sta_id].keyinfo.keylen = keyconf->keylen;
memcpy(priv->stations[sta_id].keyinfo.key, keyconf->key,
@@ -955,7 +955,7 @@ static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv,
spin_lock_irqsave(&priv->sta_lock, flags);
- priv->stations[sta_id].keyinfo.alg = keyconf->alg;
+ priv->stations[sta_id].keyinfo.cipher = keyconf->cipher;
priv->stations[sta_id].keyinfo.keylen = 16;
if ((priv->stations[sta_id].sta.key.key_flags & STA_KEY_FLG_ENCRYPT_MSK)
@@ -1090,24 +1090,26 @@ int iwl_set_dynamic_key(struct iwl_priv *priv,
priv->key_mapping_key++;
keyconf->hw_key_idx = HW_KEY_DYNAMIC;
- switch (keyconf->alg) {
- case ALG_CCMP:
+ switch (keyconf->cipher) {
+ case WLAN_CIPHER_SUITE_CCMP:
ret = iwl_set_ccmp_dynamic_key_info(priv, keyconf, sta_id);
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
ret = iwl_set_tkip_dynamic_key_info(priv, keyconf, sta_id);
break;
- case ALG_WEP:
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
ret = iwl_set_wep_dynamic_key_info(priv, keyconf, sta_id);
break;
default:
IWL_ERR(priv,
- "Unknown alg: %s alg = %d\n", __func__, keyconf->alg);
+ "Unknown alg: %s cipher = %x\n", __func__,
+ keyconf->cipher);
ret = -EINVAL;
}
- IWL_DEBUG_WEP(priv, "Set dynamic key: alg= %d len=%d idx=%d sta=%d ret=%d\n",
- keyconf->alg, keyconf->keylen, keyconf->keyidx,
+ IWL_DEBUG_WEP(priv, "Set dynamic key: cipher=%x len=%d idx=%d sta=%d ret=%d\n",
+ keyconf->cipher, keyconf->keylen, keyconf->keyidx,
sta_id, ret);
return ret;
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c
index a81989c06983..c308dab14673 100644
--- a/drivers/net/wireless/iwlwifi/iwl-tx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-tx.c
@@ -422,6 +422,7 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
int len;
u32 idx;
u16 fix_size;
+ bool is_ct_kill = false;
cmd->len = priv->cfg->ops->utils->get_hcmd_size(cmd->id, cmd->len);
fix_size = (u16)(cmd->len + sizeof(out_cmd->hdr));
@@ -443,9 +444,11 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
if (iwl_queue_space(q) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) {
IWL_ERR(priv, "No space in command queue\n");
- if (iwl_within_ct_kill_margin(priv))
- iwl_tt_enter_ct_kill(priv);
- else {
+ if (priv->cfg->ops->lib->tt_ops.ct_kill_check) {
+ is_ct_kill =
+ priv->cfg->ops->lib->tt_ops.ct_kill_check(priv);
+ }
+ if (!is_ct_kill) {
IWL_ERR(priv, "Restarting adapter due to queue full\n");
queue_work(priv->workqueue, &priv->restart);
}
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index 70c4b8fba0ee..bef5b1723132 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -33,6 +33,7 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/pci.h>
+#include <linux/pci-aspm.h>
#include <linux/slab.h>
#include <linux/dma-mapping.h>
#include <linux/delay.h>
@@ -151,7 +152,7 @@ static int iwl3945_set_ccmp_dynamic_key_info(struct iwl_priv *priv,
key_flags &= ~STA_KEY_FLG_INVALID;
spin_lock_irqsave(&priv->sta_lock, flags);
- priv->stations[sta_id].keyinfo.alg = keyconf->alg;
+ priv->stations[sta_id].keyinfo.cipher = keyconf->cipher;
priv->stations[sta_id].keyinfo.keylen = keyconf->keylen;
memcpy(priv->stations[sta_id].keyinfo.key, keyconf->key,
keyconf->keylen);
@@ -222,23 +223,25 @@ static int iwl3945_set_dynamic_key(struct iwl_priv *priv,
keyconf->hw_key_idx = HW_KEY_DYNAMIC;
- switch (keyconf->alg) {
- case ALG_CCMP:
+ switch (keyconf->cipher) {
+ case WLAN_CIPHER_SUITE_CCMP:
ret = iwl3945_set_ccmp_dynamic_key_info(priv, keyconf, sta_id);
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
ret = iwl3945_set_tkip_dynamic_key_info(priv, keyconf, sta_id);
break;
- case ALG_WEP:
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
ret = iwl3945_set_wep_dynamic_key_info(priv, keyconf, sta_id);
break;
default:
- IWL_ERR(priv, "Unknown alg: %s alg = %d\n", __func__, keyconf->alg);
+ IWL_ERR(priv, "Unknown alg: %s alg=%x\n", __func__,
+ keyconf->cipher);
ret = -EINVAL;
}
- IWL_DEBUG_WEP(priv, "Set dynamic key: alg= %d len=%d idx=%d sta=%d ret=%d\n",
- keyconf->alg, keyconf->keylen, keyconf->keyidx,
+ IWL_DEBUG_WEP(priv, "Set dynamic key: alg=%x len=%d idx=%d sta=%d ret=%d\n",
+ keyconf->cipher, keyconf->keylen, keyconf->keyidx,
sta_id, ret);
return ret;
@@ -254,10 +257,11 @@ static int iwl3945_remove_static_key(struct iwl_priv *priv)
static int iwl3945_set_static_key(struct iwl_priv *priv,
struct ieee80211_key_conf *key)
{
- if (key->alg == ALG_WEP)
+ if (key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
+ key->cipher == WLAN_CIPHER_SUITE_WEP104)
return -EOPNOTSUPP;
- IWL_ERR(priv, "Static key invalid: alg %d\n", key->alg);
+ IWL_ERR(priv, "Static key invalid: cipher %x\n", key->cipher);
return -EINVAL;
}
@@ -369,23 +373,25 @@ static void iwl3945_build_tx_cmd_hwcrypto(struct iwl_priv *priv,
struct iwl3945_tx_cmd *tx_cmd = (struct iwl3945_tx_cmd *)cmd->cmd.payload;
struct iwl_hw_key *keyinfo = &priv->stations[sta_id].keyinfo;
- switch (keyinfo->alg) {
- case ALG_CCMP:
+ tx_cmd->sec_ctl = 0;
+
+ switch (keyinfo->cipher) {
+ case WLAN_CIPHER_SUITE_CCMP:
tx_cmd->sec_ctl = TX_CMD_SEC_CCM;
memcpy(tx_cmd->key, keyinfo->key, keyinfo->keylen);
IWL_DEBUG_TX(priv, "tx_cmd with AES hwcrypto\n");
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
break;
- case ALG_WEP:
- tx_cmd->sec_ctl = TX_CMD_SEC_WEP |
+ case WLAN_CIPHER_SUITE_WEP104:
+ tx_cmd->sec_ctl |= TX_CMD_SEC_KEY128;
+ /* fall through */
+ case WLAN_CIPHER_SUITE_WEP40:
+ tx_cmd->sec_ctl |= TX_CMD_SEC_WEP |
(info->control.hw_key->hw_key_idx & TX_CMD_SEC_MSK) << TX_CMD_SEC_SHIFT;
- if (keyinfo->keylen == 13)
- tx_cmd->sec_ctl |= TX_CMD_SEC_KEY128;
-
memcpy(&tx_cmd->key[3], keyinfo->key, keyinfo->keylen);
IWL_DEBUG_TX(priv, "Configuring packet for WEP encryption "
@@ -393,7 +399,7 @@ static void iwl3945_build_tx_cmd_hwcrypto(struct iwl_priv *priv,
break;
default:
- IWL_ERR(priv, "Unknown encode alg %d\n", keyinfo->alg);
+ IWL_ERR(priv, "Unknown encode cipher %x\n", keyinfo->cipher);
break;
}
}
@@ -813,9 +819,9 @@ static void iwl3945_bg_beacon_update(struct work_struct *work)
static void iwl3945_rx_beacon_notif(struct iwl_priv *priv,
struct iwl_rx_mem_buffer *rxb)
{
-#ifdef CONFIG_IWLWIFI_DEBUG
struct iwl_rx_packet *pkt = rxb_addr(rxb);
struct iwl3945_beacon_notif *beacon = &(pkt->u.beacon_status);
+#ifdef CONFIG_IWLWIFI_DEBUG
u8 rate = beacon->beacon_notify_hdr.rate;
IWL_DEBUG_RX(priv, "beacon status %x retries %d iss %d "
@@ -827,6 +833,8 @@ static void iwl3945_rx_beacon_notif(struct iwl_priv *priv,
le32_to_cpu(beacon->low_tsf), rate);
#endif
+ priv->ibss_manager = le32_to_cpu(beacon->ibss_mgr_status);
+
if ((priv->iw_mode == NL80211_IFTYPE_AP) &&
(!test_bit(STATUS_EXIT_PENDING, &priv->status)))
queue_work(priv->workqueue, &priv->beacon_update);
@@ -3391,6 +3399,55 @@ static int iwl3945_mac_sta_add(struct ieee80211_hw *hw,
return 0;
}
+
+static void iwl3945_configure_filter(struct ieee80211_hw *hw,
+ unsigned int changed_flags,
+ unsigned int *total_flags,
+ u64 multicast)
+{
+ struct iwl_priv *priv = hw->priv;
+ __le32 filter_or = 0, filter_nand = 0;
+
+#define CHK(test, flag) do { \
+ if (*total_flags & (test)) \
+ filter_or |= (flag); \
+ else \
+ filter_nand |= (flag); \
+ } while (0)
+
+ IWL_DEBUG_MAC80211(priv, "Enter: changed: 0x%x, total: 0x%x\n",
+ changed_flags, *total_flags);
+
+ CHK(FIF_OTHER_BSS | FIF_PROMISC_IN_BSS, RXON_FILTER_PROMISC_MSK);
+ CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK);
+ CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
+
+#undef CHK
+
+ mutex_lock(&priv->mutex);
+
+ priv->staging_rxon.filter_flags &= ~filter_nand;
+ priv->staging_rxon.filter_flags |= filter_or;
+
+ /*
+ * Committing directly here breaks for some reason,
+ * but we'll eventually commit the filter flags
+ * change anyway.
+ */
+
+ mutex_unlock(&priv->mutex);
+
+ /*
+ * Receiving all multicast frames is always enabled by the
+ * default flags setup in iwl_connection_init_rx_config()
+ * since we currently do not support programming multicast
+ * filters into the device.
+ */
+ *total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
+ FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
+}
+
+
/*****************************************************************************
*
* sysfs attributes
@@ -3736,10 +3793,8 @@ static void iwl3945_setup_deferred_work(struct iwl_priv *priv)
INIT_DELAYED_WORK(&priv->init_alive_start, iwl3945_bg_init_alive_start);
INIT_DELAYED_WORK(&priv->alive_start, iwl3945_bg_alive_start);
INIT_DELAYED_WORK(&priv->_3945.rfkill_poll, iwl3945_rfkill_poll);
- INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed);
- INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan);
- INIT_WORK(&priv->start_internal_scan, iwl_bg_start_internal_scan);
- INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check);
+
+ iwl_setup_scan_deferred_work(priv);
iwl3945_hw_setup_deferred_work(priv);
@@ -3796,7 +3851,7 @@ static struct ieee80211_ops iwl3945_hw_ops = {
.add_interface = iwl_mac_add_interface,
.remove_interface = iwl_mac_remove_interface,
.config = iwl_mac_config,
- .configure_filter = iwl_configure_filter,
+ .configure_filter = iwl3945_configure_filter,
.set_key = iwl3945_mac_set_key,
.conf_tx = iwl_mac_conf_tx,
.reset_tsf = iwl_mac_reset_tsf,
@@ -3804,6 +3859,7 @@ static struct ieee80211_ops iwl3945_hw_ops = {
.hw_scan = iwl_mac_hw_scan,
.sta_add = iwl3945_mac_sta_add,
.sta_remove = iwl_mac_sta_remove,
+ .tx_last_beacon = iwl_mac_tx_last_beacon,
};
static int iwl3945_init_drv(struct iwl_priv *priv)
@@ -3960,6 +4016,9 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
/***************************
* 2. Initializing PCI bus
* *************************/
+ pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
+ PCIE_LINK_STATE_CLKPM);
+
if (pci_enable_device(pdev)) {
err = -ENODEV;
goto out_ieee80211_free_hw;
diff --git a/drivers/net/wireless/iwmc3200wifi/rx.c b/drivers/net/wireless/iwmc3200wifi/rx.c
index c02fcedea9fa..a944893ae3ca 100644
--- a/drivers/net/wireless/iwmc3200wifi/rx.c
+++ b/drivers/net/wireless/iwmc3200wifi/rx.c
@@ -1195,11 +1195,8 @@ static int iwm_ntf_wifi_if_wrapper(struct iwm_priv *iwm, u8 *buf,
IWM_DBG_NTF(iwm, DBG, "WIFI_IF_WRAPPER cmd is delivered to UMAC: "
"oid is 0x%x\n", hdr->oid);
- if (hdr->oid <= WIFI_IF_NTFY_MAX) {
- set_bit(hdr->oid, &iwm->wifi_ntfy[0]);
- wake_up_interruptible(&iwm->wifi_ntfy_queue);
- } else
- return -EINVAL;
+ set_bit(hdr->oid, &iwm->wifi_ntfy[0]);
+ wake_up_interruptible(&iwm->wifi_ntfy_queue);
switch (hdr->oid) {
case UMAC_WIFI_IF_CMD_SET_PROFILE:
diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c
index 3e82f1627209..317f086ced0a 100644
--- a/drivers/net/wireless/libertas/cfg.c
+++ b/drivers/net/wireless/libertas/cfg.c
@@ -10,6 +10,7 @@
#include <linux/wait.h>
#include <linux/slab.h>
#include <linux/sched.h>
+#include <linux/wait.h>
#include <linux/ieee80211.h>
#include <net/cfg80211.h>
#include <asm/unaligned.h>
@@ -526,20 +527,31 @@ static int lbs_ret_scan(struct lbs_private *priv, unsigned long dummy,
pos = scanresp->bssdesc_and_tlvbuffer;
+ lbs_deb_hex(LBS_DEB_SCAN, "SCAN_RSP", scanresp->bssdesc_and_tlvbuffer,
+ scanresp->bssdescriptsize);
+
tsfdesc = pos + bsssize;
tsfsize = 4 + 8 * scanresp->nr_sets;
+ lbs_deb_hex(LBS_DEB_SCAN, "SCAN_TSF", (u8 *) tsfdesc, tsfsize);
/* Validity check: we expect a Marvell-Local TLV */
i = get_unaligned_le16(tsfdesc);
tsfdesc += 2;
- if (i != TLV_TYPE_TSFTIMESTAMP)
+ if (i != TLV_TYPE_TSFTIMESTAMP) {
+ lbs_deb_scan("scan response: invalid TSF Timestamp %d\n", i);
goto done;
+ }
+
/* Validity check: the TLV holds TSF values with 8 bytes each, so
* the size in the TLV must match the nr_sets value */
i = get_unaligned_le16(tsfdesc);
tsfdesc += 2;
- if (i / 8 != scanresp->nr_sets)
+ if (i / 8 != scanresp->nr_sets) {
+ lbs_deb_scan("scan response: invalid number of TSF timestamp "
+ "sets (expected %d got %d)\n", scanresp->nr_sets,
+ i / 8);
goto done;
+ }
for (i = 0; i < scanresp->nr_sets; i++) {
const u8 *bssid;
@@ -581,8 +593,11 @@ static int lbs_ret_scan(struct lbs_private *priv, unsigned long dummy,
id = *pos++;
elen = *pos++;
left -= 2;
- if (elen > left || elen == 0)
+ if (elen > left || elen == 0) {
+ lbs_deb_scan("scan response: invalid IE fmt\n");
goto done;
+ }
+
if (id == WLAN_EID_DS_PARAMS)
chan_no = *pos;
if (id == WLAN_EID_SSID) {
@@ -613,7 +628,9 @@ static int lbs_ret_scan(struct lbs_private *priv, unsigned long dummy,
capa, intvl, ie, ielen,
LBS_SCAN_RSSI_TO_MBM(rssi),
GFP_KERNEL);
- }
+ } else
+ lbs_deb_scan("scan response: missing BSS channel IE\n");
+
tsfdesc += 8;
}
ret = 0;
@@ -1103,7 +1120,7 @@ static int lbs_associate(struct lbs_private *priv,
lbs_deb_hex(LBS_DEB_ASSOC, "Common Rates", tmp, pos - tmp);
/* add auth type TLV */
- if (priv->fwrelease >= 0x09000000)
+ if (MRVL_FW_MAJOR_REV(priv->fwrelease) >= 9)
pos += lbs_add_auth_type_tlv(pos, sme->auth_type);
/* add WPA/WPA2 TLV */
@@ -1114,6 +1131,9 @@ static int lbs_associate(struct lbs_private *priv,
(u16)(pos - (u8 *) &cmd->iebuf);
cmd->hdr.size = cpu_to_le16(len);
+ lbs_deb_hex(LBS_DEB_ASSOC, "ASSOC_CMD", (u8 *) cmd,
+ le16_to_cpu(cmd->hdr.size));
+
/* store for later use */
memcpy(priv->assoc_bss, bss->bssid, ETH_ALEN);
@@ -1121,14 +1141,28 @@ static int lbs_associate(struct lbs_private *priv,
if (ret)
goto done;
-
/* generate connect message to cfg80211 */
resp = (void *) cmd; /* recast for easier field access */
status = le16_to_cpu(resp->statuscode);
- /* Convert statis code of old firmware */
- if (priv->fwrelease < 0x09000000)
+ /* Older FW versions map the IEEE 802.11 Status Code in the association
+ * response to the following values returned in resp->statuscode:
+ *
+ * IEEE Status Code Marvell Status Code
+ * 0 -> 0x0000 ASSOC_RESULT_SUCCESS
+ * 13 -> 0x0004 ASSOC_RESULT_AUTH_REFUSED
+ * 14 -> 0x0004 ASSOC_RESULT_AUTH_REFUSED
+ * 15 -> 0x0004 ASSOC_RESULT_AUTH_REFUSED
+ * 16 -> 0x0004 ASSOC_RESULT_AUTH_REFUSED
+ * others -> 0x0003 ASSOC_RESULT_REFUSED
+ *
+ * Other response codes:
+ * 0x0001 -> ASSOC_RESULT_INVALID_PARAMETERS (unused)
+ * 0x0002 -> ASSOC_RESULT_TIMEOUT (internal timer expired waiting for
+ * association response from the AP)
+ */
+ if (MRVL_FW_MAJOR_REV(priv->fwrelease) <= 8) {
switch (status) {
case 0:
break;
@@ -1150,11 +1184,16 @@ static int lbs_associate(struct lbs_private *priv,
break;
default:
lbs_deb_assoc("association failure %d\n", status);
- status = WLAN_STATUS_UNSPECIFIED_FAILURE;
+ /* v5 OLPC firmware does return the AP status code if
+ * it's not one of the values above. Let that through.
+ */
+ break;
+ }
}
- lbs_deb_assoc("status %d, capability 0x%04x\n", status,
- le16_to_cpu(resp->capability));
+ lbs_deb_assoc("status %d, statuscode 0x%04x, capability 0x%04x, "
+ "aid 0x%04x\n", status, le16_to_cpu(resp->statuscode),
+ le16_to_cpu(resp->capability), le16_to_cpu(resp->aid));
resp_ie_len = le16_to_cpu(resp->hdr.size)
- sizeof(resp->hdr)
@@ -1174,7 +1213,6 @@ static int lbs_associate(struct lbs_private *priv,
netif_tx_wake_all_queues(priv->dev);
}
-
done:
lbs_deb_leave_args(LBS_DEB_CFG80211, "ret %d", ret);
return ret;
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 1d141fefd767..2ae752d10065 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -8,7 +8,14 @@
#define _LBS_DECL_H_
#include <linux/netdevice.h>
+#include <linux/firmware.h>
+/* Should be terminated by a NULL entry */
+struct lbs_fw_table {
+ int model;
+ const char *helper;
+ const char *fwname;
+};
struct lbs_private;
struct sk_buff;
@@ -53,4 +60,10 @@ int lbs_exit_auto_deep_sleep(struct lbs_private *priv);
u32 lbs_fw_index_to_data_rate(u8 index);
u8 lbs_data_rate_to_fw_index(u32 rate);
+int lbs_get_firmware(struct device *dev, const char *user_helper,
+ const char *user_mainfw, u32 card_model,
+ const struct lbs_fw_table *fw_table,
+ const struct firmware **helper,
+ const struct firmware **mainfw);
+
#endif
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c
index 9c298396be50..e213a5dc049d 100644
--- a/drivers/net/wireless/libertas/if_cs.c
+++ b/drivers/net/wireless/libertas/if_cs.c
@@ -48,7 +48,6 @@
MODULE_AUTHOR("Holger Schurig <hs4233@mail.mn-solutions.de>");
MODULE_DESCRIPTION("Driver for Marvell 83xx compact flash WLAN cards");
MODULE_LICENSE("GPL");
-MODULE_FIRMWARE("libertas_cs_helper.fw");
@@ -61,9 +60,34 @@ struct if_cs_card {
struct lbs_private *priv;
void __iomem *iobase;
bool align_regs;
+ u32 model;
};
+enum {
+ MODEL_UNKNOWN = 0x00,
+ MODEL_8305 = 0x01,
+ MODEL_8381 = 0x02,
+ MODEL_8385 = 0x03
+};
+
+static const struct lbs_fw_table fw_table[] = {
+ { MODEL_8305, "libertas/cf8305.bin", NULL },
+ { MODEL_8305, "libertas_cs_helper.fw", NULL },
+ { MODEL_8381, "libertas/cf8381_helper.bin", "libertas/cf8381.bin" },
+ { MODEL_8381, "libertas_cs_helper.fw", "libertas_cs.fw" },
+ { MODEL_8385, "libertas/cf8385_helper.bin", "libertas/cf8385.bin" },
+ { MODEL_8385, "libertas_cs_helper.fw", "libertas_cs.fw" },
+ { 0, NULL, NULL }
+};
+MODULE_FIRMWARE("libertas/cf8305.bin");
+MODULE_FIRMWARE("libertas/cf8381_helper.bin");
+MODULE_FIRMWARE("libertas/cf8381.bin");
+MODULE_FIRMWARE("libertas/cf8385_helper.bin");
+MODULE_FIRMWARE("libertas/cf8385.bin");
+MODULE_FIRMWARE("libertas_cs_helper.fw");
+MODULE_FIRMWARE("libertas_cs.fw");
+
/********************************************************************/
/* Hardware access */
@@ -289,22 +313,19 @@ static int if_cs_poll_while_fw_download(struct if_cs_card *card, uint addr, u8 r
#define CF8385_MANFID 0x02df
#define CF8385_CARDID 0x8103
-static inline int if_cs_hw_is_cf8305(struct pcmcia_device *p_dev)
-{
- return (p_dev->manf_id == CF8305_MANFID &&
- p_dev->card_id == CF8305_CARDID);
-}
-
-static inline int if_cs_hw_is_cf8381(struct pcmcia_device *p_dev)
-{
- return (p_dev->manf_id == CF8381_MANFID &&
- p_dev->card_id == CF8381_CARDID);
-}
-
-static inline int if_cs_hw_is_cf8385(struct pcmcia_device *p_dev)
+/* FIXME: just use the 'driver_info' field of 'struct pcmcia_device_id' when
+ * that gets fixed. Currently there's no way to access it from the probe hook.
+ */
+static inline u32 get_model(u16 manf_id, u16 card_id)
{
- return (p_dev->manf_id == CF8385_MANFID &&
- p_dev->card_id == CF8385_CARDID);
+ /* NOTE: keep in sync with if_cs_ids */
+ if (manf_id == CF8305_MANFID && card_id == CF8305_CARDID)
+ return MODEL_8305;
+ else if (manf_id == CF8381_MANFID && card_id == CF8381_CARDID)
+ return MODEL_8381;
+ else if (manf_id == CF8385_MANFID && card_id == CF8385_CARDID)
+ return MODEL_8385;
+ return MODEL_UNKNOWN;
}
/********************************************************************/
@@ -558,12 +579,11 @@ static irqreturn_t if_cs_interrupt(int irq, void *data)
*
* Return 0 on success
*/
-static int if_cs_prog_helper(struct if_cs_card *card)
+static int if_cs_prog_helper(struct if_cs_card *card, const struct firmware *fw)
{
int ret = 0;
int sent = 0;
u8 scratch;
- const struct firmware *fw;
lbs_deb_enter(LBS_DEB_CS);
@@ -589,14 +609,6 @@ static int if_cs_prog_helper(struct if_cs_card *card)
goto done;
}
- /* TODO: make firmware file configurable */
- ret = request_firmware(&fw, "libertas_cs_helper.fw",
- &card->p_dev->dev);
- if (ret) {
- lbs_pr_err("can't load helper firmware\n");
- ret = -ENODEV;
- goto done;
- }
lbs_deb_cs("helper size %td\n", fw->size);
/* "Set the 5 bytes of the helper image to 0" */
@@ -635,7 +647,7 @@ static int if_cs_prog_helper(struct if_cs_card *card)
if (ret < 0) {
lbs_pr_err("can't download helper at 0x%x, ret %d\n",
sent, ret);
- goto err_release;
+ goto done;
}
if (count == 0)
@@ -644,17 +656,14 @@ static int if_cs_prog_helper(struct if_cs_card *card)
sent += count;
}
-err_release:
- release_firmware(fw);
done:
lbs_deb_leave_args(LBS_DEB_CS, "ret %d", ret);
return ret;
}
-static int if_cs_prog_real(struct if_cs_card *card)
+static int if_cs_prog_real(struct if_cs_card *card, const struct firmware *fw)
{
- const struct firmware *fw;
int ret = 0;
int retry = 0;
int len = 0;
@@ -662,21 +671,13 @@ static int if_cs_prog_real(struct if_cs_card *card)
lbs_deb_enter(LBS_DEB_CS);
- /* TODO: make firmware file configurable */
- ret = request_firmware(&fw, "libertas_cs.fw",
- &card->p_dev->dev);
- if (ret) {
- lbs_pr_err("can't load firmware\n");
- ret = -ENODEV;
- goto done;
- }
lbs_deb_cs("fw size %td\n", fw->size);
ret = if_cs_poll_while_fw_download(card, IF_CS_SQ_READ_LOW,
IF_CS_SQ_HELPER_OK);
if (ret < 0) {
lbs_pr_err("helper firmware doesn't answer\n");
- goto err_release;
+ goto done;
}
for (sent = 0; sent < fw->size; sent += len) {
@@ -691,7 +692,7 @@ static int if_cs_prog_real(struct if_cs_card *card)
if (retry > 20) {
lbs_pr_err("could not download firmware\n");
ret = -ENODEV;
- goto err_release;
+ goto done;
}
if (retry) {
sent -= len;
@@ -710,7 +711,7 @@ static int if_cs_prog_real(struct if_cs_card *card)
IF_CS_BIT_COMMAND);
if (ret < 0) {
lbs_pr_err("can't download firmware at 0x%x\n", sent);
- goto err_release;
+ goto done;
}
}
@@ -718,9 +719,6 @@ static int if_cs_prog_real(struct if_cs_card *card)
if (ret < 0)
lbs_pr_err("firmware download failed\n");
-err_release:
- release_firmware(fw);
-
done:
lbs_deb_leave_args(LBS_DEB_CS, "ret %d", ret);
return ret;
@@ -824,6 +822,8 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
unsigned int prod_id;
struct lbs_private *priv;
struct if_cs_card *card;
+ const struct firmware *helper = NULL;
+ const struct firmware *mainfw = NULL;
lbs_deb_enter(LBS_DEB_CS);
@@ -843,7 +843,6 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
goto out1;
}
-
/*
* Allocate an interrupt line. Note that this does not assign
* a handler to the interrupt, unless the 'Handler' member of
@@ -881,34 +880,47 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
*/
card->align_regs = 0;
+ card->model = get_model(p_dev->manf_id, p_dev->card_id);
+ if (card->model == MODEL_UNKNOWN) {
+ lbs_pr_err("unsupported manf_id 0x%04x / card_id 0x%04x\n",
+ p_dev->manf_id, p_dev->card_id);
+ goto out2;
+ }
+
/* Check if we have a current silicon */
prod_id = if_cs_read8(card, IF_CS_PRODUCT_ID);
- if (if_cs_hw_is_cf8305(p_dev)) {
+ if (card->model == MODEL_8305) {
card->align_regs = 1;
if (prod_id < IF_CS_CF8305_B1_REV) {
- lbs_pr_err("old chips like 8305 rev B3 "
- "aren't supported\n");
+ lbs_pr_err("8305 rev B0 and older are not supported\n");
ret = -ENODEV;
goto out2;
}
}
- if (if_cs_hw_is_cf8381(p_dev) && prod_id < IF_CS_CF8381_B3_REV) {
- lbs_pr_err("old chips like 8381 rev B3 aren't supported\n");
+ if ((card->model == MODEL_8381) && prod_id < IF_CS_CF8381_B3_REV) {
+ lbs_pr_err("8381 rev B2 and older are not supported\n");
ret = -ENODEV;
goto out2;
}
- if (if_cs_hw_is_cf8385(p_dev) && prod_id < IF_CS_CF8385_B1_REV) {
- lbs_pr_err("old chips like 8385 rev B1 aren't supported\n");
+ if ((card->model == MODEL_8385) && prod_id < IF_CS_CF8385_B1_REV) {
+ lbs_pr_err("8385 rev B0 and older are not supported\n");
ret = -ENODEV;
goto out2;
}
+ ret = lbs_get_firmware(&p_dev->dev, NULL, NULL, card->model,
+ &fw_table[0], &helper, &mainfw);
+ if (ret) {
+ lbs_pr_err("failed to find firmware (%d)\n", ret);
+ goto out2;
+ }
+
/* Load the firmware early, before calling into libertas.ko */
- ret = if_cs_prog_helper(card);
- if (ret == 0 && !if_cs_hw_is_cf8305(p_dev))
- ret = if_cs_prog_real(card);
+ ret = if_cs_prog_helper(card, helper);
+ if (ret == 0 && (card->model != MODEL_8305))
+ ret = if_cs_prog_real(card, mainfw);
if (ret)
goto out2;
@@ -957,6 +969,11 @@ out2:
out1:
pcmcia_disable_device(p_dev);
out:
+ if (helper)
+ release_firmware(helper);
+ if (mainfw)
+ release_firmware(mainfw);
+
lbs_deb_leave_args(LBS_DEB_CS, "ret %d", ret);
return ret;
}
@@ -993,6 +1010,7 @@ static struct pcmcia_device_id if_cs_ids[] = {
PCMCIA_DEVICE_MANF_CARD(CF8305_MANFID, CF8305_CARDID),
PCMCIA_DEVICE_MANF_CARD(CF8381_MANFID, CF8381_CARDID),
PCMCIA_DEVICE_MANF_CARD(CF8385_MANFID, CF8385_CARDID),
+ /* NOTE: keep in sync with get_model() */
PCMCIA_DEVICE_NULL,
};
MODULE_DEVICE_TABLE(pcmcia, if_cs_ids);
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
index ba854c70ab94..024e5ca7b7f3 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -76,36 +76,32 @@ static const struct sdio_device_id if_sdio_ids[] = {
MODULE_DEVICE_TABLE(sdio, if_sdio_ids);
-struct if_sdio_model {
- int model;
- const char *helper;
- const char *firmware;
-};
-
-static struct if_sdio_model if_sdio_models[] = {
- {
- /* 8385 */
- .model = IF_SDIO_MODEL_8385,
- .helper = "sd8385_helper.bin",
- .firmware = "sd8385.bin",
- },
- {
- /* 8686 */
- .model = IF_SDIO_MODEL_8686,
- .helper = "sd8686_helper.bin",
- .firmware = "sd8686.bin",
- },
- {
- /* 8688 */
- .model = IF_SDIO_MODEL_8688,
- .helper = "sd8688_helper.bin",
- .firmware = "sd8688.bin",
- },
+#define MODEL_8385 0x04
+#define MODEL_8686 0x0b
+#define MODEL_8688 0x10
+
+static const struct lbs_fw_table fw_table[] = {
+ { MODEL_8385, "libertas/sd8385_helper.bin", "libertas/sd8385.bin" },
+ { MODEL_8385, "sd8385_helper.bin", "sd8385.bin" },
+ { MODEL_8686, "libertas/sd8686_v9_helper.bin", "libertas/sd8686_v9.bin" },
+ { MODEL_8686, "libertas/sd8686_v8_helper.bin", "libertas/sd8686_v8.bin" },
+ { MODEL_8686, "sd8686_helper.bin", "sd8686.bin" },
+ { MODEL_8688, "libertas/sd8688_helper.bin", "libertas/sd8688.bin" },
+ { MODEL_8688, "sd8688_helper.bin", "sd8688.bin" },
+ { 0, NULL, NULL }
};
+MODULE_FIRMWARE("libertas/sd8385_helper.bin");
+MODULE_FIRMWARE("libertas/sd8385.bin");
MODULE_FIRMWARE("sd8385_helper.bin");
MODULE_FIRMWARE("sd8385.bin");
+MODULE_FIRMWARE("libertas/sd8686_v9_helper.bin");
+MODULE_FIRMWARE("libertas/sd8686_v9.bin");
+MODULE_FIRMWARE("libertas/sd8686_v8_helper.bin");
+MODULE_FIRMWARE("libertas/sd8686_v8.bin");
MODULE_FIRMWARE("sd8686_helper.bin");
MODULE_FIRMWARE("sd8686.bin");
+MODULE_FIRMWARE("libertas/sd8688_helper.bin");
+MODULE_FIRMWARE("libertas/sd8688.bin");
MODULE_FIRMWARE("sd8688_helper.bin");
MODULE_FIRMWARE("sd8688.bin");
@@ -125,8 +121,6 @@ struct if_sdio_card {
const char *helper;
const char *firmware;
- bool helper_allocated;
- bool firmware_allocated;
u8 buffer[65536];
@@ -187,11 +181,11 @@ static u16 if_sdio_read_rx_len(struct if_sdio_card *card, int *err)
u16 rx_len;
switch (card->model) {
- case IF_SDIO_MODEL_8385:
- case IF_SDIO_MODEL_8686:
+ case MODEL_8385:
+ case MODEL_8686:
rx_len = if_sdio_read_scratch(card, &ret);
break;
- case IF_SDIO_MODEL_8688:
+ case MODEL_8688:
default: /* for newer chipsets */
rx_len = sdio_readb(card->func, IF_SDIO_RX_LEN, &ret);
if (!ret)
@@ -288,7 +282,7 @@ static int if_sdio_handle_event(struct if_sdio_card *card,
lbs_deb_enter(LBS_DEB_SDIO);
- if (card->model == IF_SDIO_MODEL_8385) {
+ if (card->model == MODEL_8385) {
event = sdio_readb(card->func, IF_SDIO_EVENT, &ret);
if (ret)
goto out;
@@ -466,10 +460,10 @@ static void if_sdio_host_to_card_worker(struct work_struct *work)
#define FW_DL_READY_STATUS (IF_SDIO_IO_RDY | IF_SDIO_DL_RDY)
-static int if_sdio_prog_helper(struct if_sdio_card *card)
+static int if_sdio_prog_helper(struct if_sdio_card *card,
+ const struct firmware *fw)
{
int ret;
- const struct firmware *fw;
unsigned long timeout;
u8 *chunk_buffer;
u32 chunk_size;
@@ -478,16 +472,10 @@ static int if_sdio_prog_helper(struct if_sdio_card *card)
lbs_deb_enter(LBS_DEB_SDIO);
- ret = request_firmware(&fw, card->helper, &card->func->dev);
- if (ret) {
- lbs_pr_err("can't load helper firmware\n");
- goto out;
- }
-
chunk_buffer = kzalloc(64, GFP_KERNEL);
if (!chunk_buffer) {
ret = -ENOMEM;
- goto release_fw;
+ goto out;
}
sdio_claim_host(card->func);
@@ -562,22 +550,19 @@ static int if_sdio_prog_helper(struct if_sdio_card *card)
release:
sdio_release_host(card->func);
kfree(chunk_buffer);
-release_fw:
- release_firmware(fw);
out:
if (ret)
lbs_pr_err("failed to load helper firmware\n");
lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
-
return ret;
}
-static int if_sdio_prog_real(struct if_sdio_card *card)
+static int if_sdio_prog_real(struct if_sdio_card *card,
+ const struct firmware *fw)
{
int ret;
- const struct firmware *fw;
unsigned long timeout;
u8 *chunk_buffer;
u32 chunk_size;
@@ -586,16 +571,10 @@ static int if_sdio_prog_real(struct if_sdio_card *card)
lbs_deb_enter(LBS_DEB_SDIO);
- ret = request_firmware(&fw, card->firmware, &card->func->dev);
- if (ret) {
- lbs_pr_err("can't load firmware\n");
- goto out;
- }
-
chunk_buffer = kzalloc(512, GFP_KERNEL);
if (!chunk_buffer) {
ret = -ENOMEM;
- goto release_fw;
+ goto out;
}
sdio_claim_host(card->func);
@@ -685,15 +664,12 @@ static int if_sdio_prog_real(struct if_sdio_card *card)
release:
sdio_release_host(card->func);
kfree(chunk_buffer);
-release_fw:
- release_firmware(fw);
out:
if (ret)
lbs_pr_err("failed to load firmware\n");
lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
-
return ret;
}
@@ -701,6 +677,8 @@ static int if_sdio_prog_firmware(struct if_sdio_card *card)
{
int ret;
u16 scratch;
+ const struct firmware *helper = NULL;
+ const struct firmware *mainfw = NULL;
lbs_deb_enter(LBS_DEB_SDIO);
@@ -718,11 +696,18 @@ static int if_sdio_prog_firmware(struct if_sdio_card *card)
goto success;
}
- ret = if_sdio_prog_helper(card);
+ ret = lbs_get_firmware(&card->func->dev, lbs_helper_name, lbs_fw_name,
+ card->model, &fw_table[0], &helper, &mainfw);
+ if (ret) {
+ lbs_pr_err("failed to find firmware (%d)\n", ret);
+ goto out;
+ }
+
+ ret = if_sdio_prog_helper(card, helper);
if (ret)
goto out;
- ret = if_sdio_prog_real(card);
+ ret = if_sdio_prog_real(card, mainfw);
if (ret)
goto out;
@@ -733,8 +718,12 @@ success:
ret = 0;
out:
- lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
+ if (helper)
+ release_firmware(helper);
+ if (mainfw)
+ release_firmware(mainfw);
+ lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
return ret;
}
@@ -938,7 +927,7 @@ static int if_sdio_probe(struct sdio_func *func,
"ID: %x", &model) == 1)
break;
if (!strcmp(func->card->info[i], "IBIS Wireless SDIO Card")) {
- model = IF_SDIO_MODEL_8385;
+ model = MODEL_8385;
break;
}
}
@@ -956,13 +945,13 @@ static int if_sdio_probe(struct sdio_func *func,
card->model = model;
switch (card->model) {
- case IF_SDIO_MODEL_8385:
+ case MODEL_8385:
card->scratch_reg = IF_SDIO_SCRATCH_OLD;
break;
- case IF_SDIO_MODEL_8686:
+ case MODEL_8686:
card->scratch_reg = IF_SDIO_SCRATCH;
break;
- case IF_SDIO_MODEL_8688:
+ case MODEL_8688:
default: /* for newer chipsets */
card->scratch_reg = IF_SDIO_FW_STATUS;
break;
@@ -972,49 +961,17 @@ static int if_sdio_probe(struct sdio_func *func,
card->workqueue = create_workqueue("libertas_sdio");
INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker);
- for (i = 0;i < ARRAY_SIZE(if_sdio_models);i++) {
- if (card->model == if_sdio_models[i].model)
+ /* Check if we support this card */
+ for (i = 0; i < ARRAY_SIZE(fw_table); i++) {
+ if (card->model == fw_table[i].model)
break;
}
-
- if (i == ARRAY_SIZE(if_sdio_models)) {
+ if (i == ARRAY_SIZE(fw_table)) {
lbs_pr_err("unknown card model 0x%x\n", card->model);
ret = -ENODEV;
goto free;
}
- card->helper = if_sdio_models[i].helper;
- card->firmware = if_sdio_models[i].firmware;
-
- kparam_block_sysfs_write(helper_name);
- if (lbs_helper_name) {
- char *helper = kstrdup(lbs_helper_name, GFP_KERNEL);
- if (!helper) {
- kparam_unblock_sysfs_write(helper_name);
- ret = -ENOMEM;
- goto free;
- }
- lbs_deb_sdio("overriding helper firmware: %s\n",
- lbs_helper_name);
- card->helper = helper;
- card->helper_allocated = true;
- }
- kparam_unblock_sysfs_write(helper_name);
-
- kparam_block_sysfs_write(fw_name);
- if (lbs_fw_name) {
- char *fw_name = kstrdup(lbs_fw_name, GFP_KERNEL);
- if (!fw_name) {
- kparam_unblock_sysfs_write(fw_name);
- ret = -ENOMEM;
- goto free;
- }
- lbs_deb_sdio("overriding firmware: %s\n", lbs_fw_name);
- card->firmware = fw_name;
- card->firmware_allocated = true;
- }
- kparam_unblock_sysfs_write(fw_name);
-
sdio_claim_host(func);
ret = sdio_enable_func(func);
@@ -1028,7 +985,7 @@ static int if_sdio_probe(struct sdio_func *func,
/* For 1-bit transfers to the 8686 model, we need to enable the
* interrupt flag in the CCCR register. Set the MMC_QUIRK_LENIENT_FN0
* bit to allow access to non-vendor registers. */
- if ((card->model == IF_SDIO_MODEL_8686) &&
+ if ((card->model == MODEL_8686) &&
(host->caps & MMC_CAP_SDIO_IRQ) &&
(host->ios.bus_width == MMC_BUS_WIDTH_1)) {
u8 reg;
@@ -1091,8 +1048,8 @@ static int if_sdio_probe(struct sdio_func *func,
* Get rx_unit if the chip is SD8688 or newer.
* SD8385 & SD8686 do not have rx_unit.
*/
- if ((card->model != IF_SDIO_MODEL_8385)
- && (card->model != IF_SDIO_MODEL_8686))
+ if ((card->model != MODEL_8385)
+ && (card->model != MODEL_8686))
card->rx_unit = if_sdio_read_rx_unit(card);
else
card->rx_unit = 0;
@@ -1108,7 +1065,7 @@ static int if_sdio_probe(struct sdio_func *func,
/*
* FUNC_INIT is required for SD8688 WLAN/BT multiple functions
*/
- if (card->model == IF_SDIO_MODEL_8688) {
+ if (card->model == MODEL_8688) {
struct cmd_header cmd;
memset(&cmd, 0, sizeof(cmd));
@@ -1147,10 +1104,6 @@ free:
kfree(packet);
}
- if (card->helper_allocated)
- kfree(card->helper);
- if (card->firmware_allocated)
- kfree(card->firmware);
kfree(card);
goto out;
@@ -1165,7 +1118,7 @@ static void if_sdio_remove(struct sdio_func *func)
card = sdio_get_drvdata(func);
- if (user_rmmod && (card->model == IF_SDIO_MODEL_8688)) {
+ if (user_rmmod && (card->model == MODEL_8688)) {
/*
* FUNC_SHUTDOWN is required for SD8688 WLAN/BT
* multiple functions
@@ -1201,10 +1154,6 @@ static void if_sdio_remove(struct sdio_func *func)
kfree(packet);
}
- if (card->helper_allocated)
- kfree(card->helper);
- if (card->firmware_allocated)
- kfree(card->firmware);
kfree(card);
lbs_deb_leave(LBS_DEB_SDIO);
diff --git a/drivers/net/wireless/libertas/if_sdio.h b/drivers/net/wireless/libertas/if_sdio.h
index 12179c1dc9c9..62fda3592f67 100644
--- a/drivers/net/wireless/libertas/if_sdio.h
+++ b/drivers/net/wireless/libertas/if_sdio.h
@@ -12,10 +12,6 @@
#ifndef _LBS_IF_SDIO_H
#define _LBS_IF_SDIO_H
-#define IF_SDIO_MODEL_8385 0x04
-#define IF_SDIO_MODEL_8686 0x0b
-#define IF_SDIO_MODEL_8688 0x10
-
#define IF_SDIO_IOPORT 0x00
#define IF_SDIO_H_INT_MASK 0x04
diff --git a/drivers/net/wireless/libertas/if_spi.c b/drivers/net/wireless/libertas/if_spi.c
index fe3f08028eb3..79bcb4e5d2ca 100644
--- a/drivers/net/wireless/libertas/if_spi.c
+++ b/drivers/net/wireless/libertas/if_spi.c
@@ -39,9 +39,6 @@ struct if_spi_card {
struct lbs_private *priv;
struct libertas_spi_platform_data *pdata;
- char helper_fw_name[IF_SPI_FW_NAME_MAX];
- char main_fw_name[IF_SPI_FW_NAME_MAX];
-
/* The card ID and card revision, as reported by the hardware. */
u16 card_id;
u8 card_rev;
@@ -70,10 +67,28 @@ static void free_if_spi_card(struct if_spi_card *card)
kfree(card);
}
-static struct chip_ident chip_id_to_device_name[] = {
- { .chip_id = 0x04, .name = 8385 },
- { .chip_id = 0x0b, .name = 8686 },
+#define MODEL_8385 0x04
+#define MODEL_8686 0x0b
+#define MODEL_8688 0x10
+
+static const struct lbs_fw_table fw_table[] = {
+ { MODEL_8385, "libertas/gspi8385_helper.bin", "libertas/gspi8385.bin" },
+ { MODEL_8385, "libertas/gspi8385_hlp.bin", "libertas/gspi8385.bin" },
+ { MODEL_8686, "libertas/gspi8686_v9_helper.bin", "libertas/gspi8686_v9.bin" },
+ { MODEL_8686, "libertas/gspi8686_hlp.bin", "libertas/gspi8686.bin" },
+ { MODEL_8688, "libertas/gspi8688_helper.bin", "libertas/gspi8688.bin" },
+ { 0, NULL, NULL }
};
+MODULE_FIRMWARE("libertas/gspi8385_helper.bin");
+MODULE_FIRMWARE("libertas/gspi8385_hlp.bin");
+MODULE_FIRMWARE("libertas/gspi8385.bin");
+MODULE_FIRMWARE("libertas/gspi8686_v9_helper.bin");
+MODULE_FIRMWARE("libertas/gspi8686_v9.bin");
+MODULE_FIRMWARE("libertas/gspi8686_hlp.bin");
+MODULE_FIRMWARE("libertas/gspi8686.bin");
+MODULE_FIRMWARE("libertas/gspi8688_helper.bin");
+MODULE_FIRMWARE("libertas/gspi8688.bin");
+
/*
* SPI Interface Unit Routines
@@ -399,26 +414,20 @@ static int spu_init(struct if_spi_card *card, int use_dummy_writes)
* Firmware Loading
*/
-static int if_spi_prog_helper_firmware(struct if_spi_card *card)
+static int if_spi_prog_helper_firmware(struct if_spi_card *card,
+ const struct firmware *firmware)
{
int err = 0;
- const struct firmware *firmware = NULL;
int bytes_remaining;
const u8 *fw;
u8 temp[HELPER_FW_LOAD_CHUNK_SZ];
- struct spi_device *spi = card->spi;
lbs_deb_enter(LBS_DEB_SPI);
err = spu_set_interrupt_mode(card, 1, 0);
if (err)
goto out;
- /* Get helper firmware image */
- err = request_firmware(&firmware, card->helper_fw_name, &spi->dev);
- if (err) {
- lbs_pr_err("request_firmware failed with err = %d\n", err);
- goto out;
- }
+
bytes_remaining = firmware->size;
fw = firmware->data;
@@ -429,13 +438,13 @@ static int if_spi_prog_helper_firmware(struct if_spi_card *card)
err = spu_write_u16(card, IF_SPI_SCRATCH_1_REG,
HELPER_FW_LOAD_CHUNK_SZ);
if (err)
- goto release_firmware;
+ goto out;
err = spu_wait_for_u16(card, IF_SPI_HOST_INT_STATUS_REG,
IF_SPI_HIST_CMD_DOWNLOAD_RDY,
IF_SPI_HIST_CMD_DOWNLOAD_RDY);
if (err)
- goto release_firmware;
+ goto out;
/* Feed the data into the command read/write port reg
* in chunks of 64 bytes */
@@ -446,16 +455,16 @@ static int if_spi_prog_helper_firmware(struct if_spi_card *card)
err = spu_write(card, IF_SPI_CMD_RDWRPORT_REG,
temp, HELPER_FW_LOAD_CHUNK_SZ);
if (err)
- goto release_firmware;
+ goto out;
/* Interrupt the boot code */
err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_REG, 0);
if (err)
- goto release_firmware;
+ goto out;
err = spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG,
IF_SPI_CIC_CMD_DOWNLOAD_OVER);
if (err)
- goto release_firmware;
+ goto out;
bytes_remaining -= HELPER_FW_LOAD_CHUNK_SZ;
fw += HELPER_FW_LOAD_CHUNK_SZ;
}
@@ -465,18 +474,16 @@ static int if_spi_prog_helper_firmware(struct if_spi_card *card)
* bootloader. This completes the helper download. */
err = spu_write_u16(card, IF_SPI_SCRATCH_1_REG, FIRMWARE_DNLD_OK);
if (err)
- goto release_firmware;
+ goto out;
err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_REG, 0);
if (err)
- goto release_firmware;
+ goto out;
err = spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG,
IF_SPI_CIC_CMD_DOWNLOAD_OVER);
- goto release_firmware;
+ goto out;
lbs_deb_spi("waiting for helper to boot...\n");
-release_firmware:
- release_firmware(firmware);
out:
if (err)
lbs_pr_err("failed to load helper firmware (err=%d)\n", err);
@@ -523,13 +530,12 @@ static int if_spi_prog_main_firmware_check_len(struct if_spi_card *card,
return len;
}
-static int if_spi_prog_main_firmware(struct if_spi_card *card)
+static int if_spi_prog_main_firmware(struct if_spi_card *card,
+ const struct firmware *firmware)
{
int len, prev_len;
int bytes, crc_err = 0, err = 0;
- const struct firmware *firmware = NULL;
const u8 *fw;
- struct spi_device *spi = card->spi;
u16 num_crc_errs;
lbs_deb_enter(LBS_DEB_SPI);
@@ -538,19 +544,11 @@ static int if_spi_prog_main_firmware(struct if_spi_card *card)
if (err)
goto out;
- /* Get firmware image */
- err = request_firmware(&firmware, card->main_fw_name, &spi->dev);
- if (err) {
- lbs_pr_err("%s: can't get firmware '%s' from kernel. "
- "err = %d\n", __func__, card->main_fw_name, err);
- goto out;
- }
-
err = spu_wait_for_u16(card, IF_SPI_SCRATCH_1_REG, 0, 0);
if (err) {
lbs_pr_err("%s: timed out waiting for initial "
"scratch reg = 0\n", __func__);
- goto release_firmware;
+ goto out;
}
num_crc_errs = 0;
@@ -560,7 +558,7 @@ static int if_spi_prog_main_firmware(struct if_spi_card *card)
while ((len = if_spi_prog_main_firmware_check_len(card, &crc_err))) {
if (len < 0) {
err = len;
- goto release_firmware;
+ goto out;
}
if (bytes < 0) {
/* If there are no more bytes left, we would normally
@@ -575,7 +573,7 @@ static int if_spi_prog_main_firmware(struct if_spi_card *card)
lbs_pr_err("Too many CRC errors encountered "
"in firmware load.\n");
err = -EIO;
- goto release_firmware;
+ goto out;
}
} else {
/* Previous transfer succeeded. Advance counters. */
@@ -590,15 +588,15 @@ static int if_spi_prog_main_firmware(struct if_spi_card *card)
err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_REG, 0);
if (err)
- goto release_firmware;
+ goto out;
err = spu_write(card, IF_SPI_CMD_RDWRPORT_REG,
card->cmd_buffer, len);
if (err)
- goto release_firmware;
+ goto out;
err = spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG ,
IF_SPI_CIC_CMD_DOWNLOAD_OVER);
if (err)
- goto release_firmware;
+ goto out;
prev_len = len;
}
if (bytes > prev_len) {
@@ -611,12 +609,9 @@ static int if_spi_prog_main_firmware(struct if_spi_card *card)
SUCCESSFUL_FW_DOWNLOAD_MAGIC);
if (err) {
lbs_pr_err("failed to confirm the firmware download\n");
- goto release_firmware;
+ goto out;
}
-release_firmware:
- release_firmware(firmware);
-
out:
if (err)
lbs_pr_err("failed to load firmware (err=%d)\n", err);
@@ -800,14 +795,16 @@ static int lbs_spi_thread(void *data)
goto err;
}
- if (hiStatus & IF_SPI_HIST_CMD_UPLOAD_RDY)
+ if (hiStatus & IF_SPI_HIST_CMD_UPLOAD_RDY) {
err = if_spi_c2h_cmd(card);
if (err)
goto err;
- if (hiStatus & IF_SPI_HIST_RX_UPLOAD_RDY)
+ }
+ if (hiStatus & IF_SPI_HIST_RX_UPLOAD_RDY) {
err = if_spi_c2h_data(card);
if (err)
goto err;
+ }
/* workaround: in PS mode, the card does not set the Command
* Download Ready bit, but it sets TX Download Ready. */
@@ -886,37 +883,16 @@ static irqreturn_t if_spi_host_interrupt(int irq, void *dev_id)
* SPI callbacks
*/
-static int if_spi_calculate_fw_names(u16 card_id,
- char *helper_fw, char *main_fw)
-{
- int i;
- for (i = 0; i < ARRAY_SIZE(chip_id_to_device_name); ++i) {
- if (card_id == chip_id_to_device_name[i].chip_id)
- break;
- }
- if (i == ARRAY_SIZE(chip_id_to_device_name)) {
- lbs_pr_err("Unsupported chip_id: 0x%02x\n", card_id);
- return -EAFNOSUPPORT;
- }
- snprintf(helper_fw, IF_SPI_FW_NAME_MAX, "libertas/gspi%d_hlp.bin",
- chip_id_to_device_name[i].name);
- snprintf(main_fw, IF_SPI_FW_NAME_MAX, "libertas/gspi%d.bin",
- chip_id_to_device_name[i].name);
- return 0;
-}
-MODULE_FIRMWARE("libertas/gspi8385_hlp.bin");
-MODULE_FIRMWARE("libertas/gspi8385.bin");
-MODULE_FIRMWARE("libertas/gspi8686_hlp.bin");
-MODULE_FIRMWARE("libertas/gspi8686.bin");
-
static int __devinit if_spi_probe(struct spi_device *spi)
{
struct if_spi_card *card;
struct lbs_private *priv = NULL;
struct libertas_spi_platform_data *pdata = spi->dev.platform_data;
- int err = 0;
+ int err = 0, i;
u32 scratch;
struct sched_param param = { .sched_priority = 1 };
+ const struct firmware *helper = NULL;
+ const struct firmware *mainfw = NULL;
lbs_deb_enter(LBS_DEB_SPI);
@@ -961,10 +937,25 @@ static int __devinit if_spi_probe(struct spi_device *spi)
lbs_deb_spi("Firmware is already loaded for "
"Marvell WLAN 802.11 adapter\n");
else {
- err = if_spi_calculate_fw_names(card->card_id,
- card->helper_fw_name, card->main_fw_name);
- if (err)
+ /* Check if we support this card */
+ for (i = 0; i < ARRAY_SIZE(fw_table); i++) {
+ if (card->card_id == fw_table[i].model)
+ break;
+ }
+ if (i == ARRAY_SIZE(fw_table)) {
+ lbs_pr_err("Unsupported chip_id: 0x%02x\n",
+ card->card_id);
+ err = -ENODEV;
goto free_card;
+ }
+
+ err = lbs_get_firmware(&card->spi->dev, NULL, NULL,
+ card->card_id, &fw_table[0], &helper,
+ &mainfw);
+ if (err) {
+ lbs_pr_err("failed to find firmware (%d)\n", err);
+ goto free_card;
+ }
lbs_deb_spi("Initializing FW for Marvell WLAN 802.11 adapter "
"(chip_id = 0x%04x, chip_rev = 0x%02x) "
@@ -973,10 +964,10 @@ static int __devinit if_spi_probe(struct spi_device *spi)
card->card_id, card->card_rev,
spi->master->bus_num, spi->chip_select,
spi->max_speed_hz);
- err = if_spi_prog_helper_firmware(card);
+ err = if_spi_prog_helper_firmware(card, helper);
if (err)
goto free_card;
- err = if_spi_prog_main_firmware(card);
+ err = if_spi_prog_main_firmware(card, mainfw);
if (err)
goto free_card;
lbs_deb_spi("loaded FW for Marvell WLAN 802.11 adapter\n");
@@ -1044,6 +1035,11 @@ remove_card:
free_card:
free_if_spi_card(card);
out:
+ if (helper)
+ release_firmware(helper);
+ if (mainfw)
+ release_firmware(mainfw);
+
lbs_deb_leave_args(LBS_DEB_SPI, "err %d\n", err);
return err;
}
diff --git a/drivers/net/wireless/libertas/if_spi.h b/drivers/net/wireless/libertas/if_spi.h
index f87eec410848..8b1417d3b71b 100644
--- a/drivers/net/wireless/libertas/if_spi.h
+++ b/drivers/net/wireless/libertas/if_spi.h
@@ -25,11 +25,6 @@
#define IF_SPI_FW_NAME_MAX 30
-struct chip_ident {
- u16 chip_id;
- u16 name;
-};
-
#define MAX_MAIN_FW_LOAD_CRC_ERR 10
/* Chunk size when loading the helper firmware */
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 3ff61063671a..e906616232a2 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -26,15 +26,25 @@
#define MESSAGE_HEADER_LEN 4
-static char *lbs_fw_name = "usb8388.bin";
+static char *lbs_fw_name = NULL;
module_param_named(fw_name, lbs_fw_name, charp, 0644);
+MODULE_FIRMWARE("libertas/usb8388_v9.bin");
+MODULE_FIRMWARE("libertas/usb8388_v5.bin");
+MODULE_FIRMWARE("libertas/usb8388.bin");
+MODULE_FIRMWARE("libertas/usb8682.bin");
MODULE_FIRMWARE("usb8388.bin");
+enum {
+ MODEL_UNKNOWN = 0x0,
+ MODEL_8388 = 0x1,
+ MODEL_8682 = 0x2
+};
+
static struct usb_device_id if_usb_table[] = {
/* Enter the device signature inside */
- { USB_DEVICE(0x1286, 0x2001) },
- { USB_DEVICE(0x05a3, 0x8388) },
+ { USB_DEVICE(0x1286, 0x2001), .driver_info = MODEL_8388 },
+ { USB_DEVICE(0x05a3, 0x8388), .driver_info = MODEL_8388 },
{} /* Terminating entry */
};
@@ -66,6 +76,8 @@ static ssize_t if_usb_firmware_set(struct device *dev,
struct if_usb_card *cardp = priv->card;
int ret;
+ BUG_ON(buf == NULL);
+
ret = if_usb_prog_firmware(cardp, buf, BOOT_CMD_UPDATE_FW);
if (ret == 0)
return count;
@@ -91,6 +103,8 @@ static ssize_t if_usb_boot2_set(struct device *dev,
struct if_usb_card *cardp = priv->card;
int ret;
+ BUG_ON(buf == NULL);
+
ret = if_usb_prog_firmware(cardp, buf, BOOT_CMD_UPDATE_BOOT2);
if (ret == 0)
return count;
@@ -244,6 +258,7 @@ static int if_usb_probe(struct usb_interface *intf,
init_waitqueue_head(&cardp->fw_wq);
cardp->udev = udev;
+ cardp->model = (uint32_t) id->driver_info;
iface_desc = intf->cur_altsetting;
lbs_deb_usbd(&udev->dev, "bcdUSB = 0x%X bDeviceClass = 0x%X"
@@ -924,6 +939,38 @@ static int if_usb_prog_firmware(struct if_usb_card *cardp,
return ret;
}
+/* table of firmware file names */
+static const struct {
+ u32 model;
+ const char *fwname;
+} fw_table[] = {
+ { MODEL_8388, "libertas/usb8388_v9.bin" },
+ { MODEL_8388, "libertas/usb8388_v5.bin" },
+ { MODEL_8388, "libertas/usb8388.bin" },
+ { MODEL_8388, "usb8388.bin" },
+ { MODEL_8682, "libertas/usb8682.bin" }
+};
+
+static int get_fw(struct if_usb_card *cardp, const char *fwname)
+{
+ int i;
+
+ /* Try user-specified firmware first */
+ if (fwname)
+ return request_firmware(&cardp->fw, fwname, &cardp->udev->dev);
+
+ /* Otherwise search for firmware to use */
+ for (i = 0; i < ARRAY_SIZE(fw_table); i++) {
+ if (fw_table[i].model != cardp->model)
+ continue;
+ if (request_firmware(&cardp->fw, fw_table[i].fwname,
+ &cardp->udev->dev) == 0)
+ return 0;
+ }
+
+ return -ENOENT;
+}
+
static int __if_usb_prog_firmware(struct if_usb_card *cardp,
const char *fwname, int cmd)
{
@@ -933,10 +980,9 @@ static int __if_usb_prog_firmware(struct if_usb_card *cardp,
lbs_deb_enter(LBS_DEB_USB);
- ret = request_firmware(&cardp->fw, fwname, &cardp->udev->dev);
- if (ret < 0) {
- lbs_pr_err("request_firmware() failed with %#x\n", ret);
- lbs_pr_err("firmware %s not found\n", fwname);
+ ret = get_fw(cardp, fwname);
+ if (ret) {
+ lbs_pr_err("failed to find firmware (%d)\n", ret);
goto done;
}
diff --git a/drivers/net/wireless/libertas/if_usb.h b/drivers/net/wireless/libertas/if_usb.h
index 5ba0aee0eb2f..d819e7e3c9aa 100644
--- a/drivers/net/wireless/libertas/if_usb.h
+++ b/drivers/net/wireless/libertas/if_usb.h
@@ -43,6 +43,7 @@ struct bootcmdresp
/** USB card description structure*/
struct if_usb_card {
struct usb_device *udev;
+ uint32_t model; /* MODEL_* */
struct urb *rx_urb, *tx_urb;
struct lbs_private *priv;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 24958a86747b..47ce5a6ba120 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -1047,6 +1047,111 @@ void lbs_notify_command_response(struct lbs_private *priv, u8 resp_idx)
}
EXPORT_SYMBOL_GPL(lbs_notify_command_response);
+/**
+ * @brief Retrieves two-stage firmware
+ *
+ * @param dev A pointer to device structure
+ * @param user_helper User-defined helper firmware file
+ * @param user_mainfw User-defined main firmware file
+ * @param card_model Bus-specific card model ID used to filter firmware table
+ * elements
+ * @param fw_table Table of firmware file names and device model numbers
+ * terminated by an entry with a NULL helper name
+ * @param helper On success, the helper firmware; caller must free
+ * @param mainfw On success, the main firmware; caller must free
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int lbs_get_firmware(struct device *dev, const char *user_helper,
+ const char *user_mainfw, u32 card_model,
+ const struct lbs_fw_table *fw_table,
+ const struct firmware **helper,
+ const struct firmware **mainfw)
+{
+ const struct lbs_fw_table *iter;
+ int ret;
+
+ BUG_ON(helper == NULL);
+ BUG_ON(mainfw == NULL);
+
+ /* Try user-specified firmware first */
+ if (user_helper) {
+ ret = request_firmware(helper, user_helper, dev);
+ if (ret) {
+ lbs_pr_err("couldn't find helper firmware %s",
+ user_helper);
+ goto fail;
+ }
+ }
+ if (user_mainfw) {
+ ret = request_firmware(mainfw, user_mainfw, dev);
+ if (ret) {
+ lbs_pr_err("couldn't find main firmware %s",
+ user_mainfw);
+ goto fail;
+ }
+ }
+
+ if (*helper && *mainfw)
+ return 0;
+
+ /* Otherwise search for firmware to use. If neither the helper or
+ * the main firmware were specified by the user, then we need to
+ * make sure that found helper & main are from the same entry in
+ * fw_table.
+ */
+ iter = fw_table;
+ while (iter && iter->helper) {
+ if (iter->model != card_model)
+ goto next;
+
+ if (*helper == NULL) {
+ ret = request_firmware(helper, iter->helper, dev);
+ if (ret)
+ goto next;
+
+ /* If the device has one-stage firmware (ie cf8305) and
+ * we've got it then we don't need to bother with the
+ * main firmware.
+ */
+ if (iter->fwname == NULL)
+ return 0;
+ }
+
+ if (*mainfw == NULL) {
+ ret = request_firmware(mainfw, iter->fwname, dev);
+ if (ret && !user_helper) {
+ /* Clear the helper if it wasn't user-specified
+ * and the main firmware load failed, to ensure
+ * we don't have mismatched firmware pairs.
+ */
+ release_firmware(*helper);
+ *helper = NULL;
+ }
+ }
+
+ if (*helper && *mainfw)
+ return 0;
+
+ next:
+ iter++;
+ }
+
+ fail:
+ /* Failed */
+ if (*helper) {
+ release_firmware(*helper);
+ *helper = NULL;
+ }
+ if (*mainfw) {
+ release_firmware(*mainfw);
+ *mainfw = NULL;
+ }
+
+ return -ENOENT;
+}
+EXPORT_SYMBOL_GPL(lbs_get_firmware);
+
static int __init lbs_init_module(void)
{
lbs_deb_enter(LBS_DEB_MAIN);
diff --git a/drivers/net/wireless/libertas_tf/if_usb.c b/drivers/net/wireless/libertas_tf/if_usb.c
index 41a4f214ade1..ba7d96584cb6 100644
--- a/drivers/net/wireless/libertas_tf/if_usb.c
+++ b/drivers/net/wireless/libertas_tf/if_usb.c
@@ -54,7 +54,7 @@ static int if_usb_reset_device(struct if_usb_card *cardp);
/**
* if_usb_wrike_bulk_callback - call back to handle URB status
*
- * @param urb pointer to urb structure
+ * @param urb pointer to urb structure
*/
static void if_usb_write_bulk_callback(struct urb *urb)
{
@@ -178,16 +178,19 @@ static int if_usb_probe(struct usb_interface *intf,
le16_to_cpu(endpoint->wMaxPacketSize);
cardp->ep_in = usb_endpoint_num(endpoint);
- lbtf_deb_usbd(&udev->dev, "in_endpoint = %d\n", cardp->ep_in);
- lbtf_deb_usbd(&udev->dev, "Bulk in size is %d\n", cardp->ep_in_size);
+ lbtf_deb_usbd(&udev->dev, "in_endpoint = %d\n",
+ cardp->ep_in);
+ lbtf_deb_usbd(&udev->dev, "Bulk in size is %d\n",
+ cardp->ep_in_size);
} else if (usb_endpoint_is_bulk_out(endpoint)) {
cardp->ep_out_size =
le16_to_cpu(endpoint->wMaxPacketSize);
cardp->ep_out = usb_endpoint_num(endpoint);
- lbtf_deb_usbd(&udev->dev, "out_endpoint = %d\n", cardp->ep_out);
+ lbtf_deb_usbd(&udev->dev, "out_endpoint = %d\n",
+ cardp->ep_out);
lbtf_deb_usbd(&udev->dev, "Bulk out size is %d\n",
- cardp->ep_out_size);
+ cardp->ep_out_size);
}
}
if (!cardp->ep_out_size || !cardp->ep_in_size) {
@@ -318,10 +321,12 @@ static int if_usb_send_fw_pkt(struct if_usb_card *cardp)
if (fwdata->hdr.dnldcmd == cpu_to_le32(FW_HAS_DATA_TO_RECV)) {
lbtf_deb_usb2(&cardp->udev->dev, "There are data to follow\n");
- lbtf_deb_usb2(&cardp->udev->dev, "seqnum = %d totalbytes = %d\n",
- cardp->fwseqnum, cardp->totalbytes);
+ lbtf_deb_usb2(&cardp->udev->dev,
+ "seqnum = %d totalbytes = %d\n",
+ cardp->fwseqnum, cardp->totalbytes);
} else if (fwdata->hdr.dnldcmd == cpu_to_le32(FW_HAS_LAST_BLOCK)) {
- lbtf_deb_usb2(&cardp->udev->dev, "Host has finished FW downloading\n");
+ lbtf_deb_usb2(&cardp->udev->dev,
+ "Host has finished FW downloading\n");
lbtf_deb_usb2(&cardp->udev->dev, "Donwloading FW JUMP BLOCK\n");
/* Host has finished FW downloading
@@ -367,7 +372,7 @@ EXPORT_SYMBOL_GPL(if_usb_reset_device);
/**
* usb_tx_block - transfer data to the device
*
- * @priv pointer to struct lbtf_private
+ * @priv pointer to struct lbtf_private
* @payload pointer to payload data
* @nb data length
* @data non-zero for data, zero for commands
@@ -400,7 +405,8 @@ static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload,
urb->transfer_flags |= URB_ZERO_PACKET;
if (usb_submit_urb(urb, GFP_ATOMIC)) {
- lbtf_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed: %d\n", ret);
+ lbtf_deb_usbd(&cardp->udev->dev,
+ "usb_submit_urb failed: %d\n", ret);
goto tx_ret;
}
@@ -438,10 +444,12 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;
- lbtf_deb_usb2(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb);
+ lbtf_deb_usb2(&cardp->udev->dev, "Pointer for rx_urb %p\n",
+ cardp->rx_urb);
ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC);
if (ret) {
- lbtf_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed: %d\n", ret);
+ lbtf_deb_usbd(&cardp->udev->dev,
+ "Submit Rx URB failed: %d\n", ret);
kfree_skb(skb);
cardp->rx_skb = NULL;
lbtf_deb_leave(LBTF_DEB_USB);
@@ -522,14 +530,14 @@ static void if_usb_receive_fwload(struct urb *urb)
}
} else if (bcmdresp.cmd != BOOT_CMD_FW_BY_USB) {
pr_info("boot cmd response cmd_tag error (%d)\n",
- bcmdresp.cmd);
+ bcmdresp.cmd);
} else if (bcmdresp.result != BOOT_CMD_RESP_OK) {
pr_info("boot cmd response result error (%d)\n",
- bcmdresp.result);
+ bcmdresp.result);
} else {
cardp->bootcmdresp = 1;
lbtf_deb_usbd(&cardp->udev->dev,
- "Received valid boot command response\n");
+ "Received valid boot command response\n");
}
kfree_skb(skb);
@@ -541,19 +549,23 @@ static void if_usb_receive_fwload(struct urb *urb)
syncfwheader = kmemdup(skb->data, sizeof(struct fwsyncheader),
GFP_ATOMIC);
if (!syncfwheader) {
- lbtf_deb_usbd(&cardp->udev->dev, "Failure to allocate syncfwheader\n");
+ lbtf_deb_usbd(&cardp->udev->dev,
+ "Failure to allocate syncfwheader\n");
kfree_skb(skb);
lbtf_deb_leave(LBTF_DEB_USB);
return;
}
if (!syncfwheader->cmd) {
- lbtf_deb_usb2(&cardp->udev->dev, "FW received Blk with correct CRC\n");
- lbtf_deb_usb2(&cardp->udev->dev, "FW received Blk seqnum = %d\n",
- le32_to_cpu(syncfwheader->seqnum));
+ lbtf_deb_usb2(&cardp->udev->dev,
+ "FW received Blk with correct CRC\n");
+ lbtf_deb_usb2(&cardp->udev->dev,
+ "FW received Blk seqnum = %d\n",
+ le32_to_cpu(syncfwheader->seqnum));
cardp->CRC_OK = 1;
} else {
- lbtf_deb_usbd(&cardp->udev->dev, "FW received Blk with CRC error\n");
+ lbtf_deb_usbd(&cardp->udev->dev,
+ "FW received Blk with CRC error\n");
cardp->CRC_OK = 0;
}
@@ -666,7 +678,8 @@ static void if_usb_receive(struct urb *urb)
{
/* Event cause handling */
u32 event_cause = le32_to_cpu(pkt[1]);
- lbtf_deb_usbd(&cardp->udev->dev, "**EVENT** 0x%X\n", event_cause);
+ lbtf_deb_usbd(&cardp->udev->dev, "**EVENT** 0x%X\n",
+ event_cause);
/* Icky undocumented magic special case */
if (event_cause & 0xffff0000) {
@@ -689,7 +702,7 @@ static void if_usb_receive(struct urb *urb)
}
default:
lbtf_deb_usbd(&cardp->udev->dev,
- "libertastf: unknown command type 0x%X\n", recvtype);
+ "libertastf: unknown command type 0x%X\n", recvtype);
kfree_skb(skb);
break;
}
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index 01ad7f77383a..d9dd9f9d3040 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -9,7 +9,8 @@
/*
* TODO:
- * - IBSS mode simulation (Beacon transmission with competition for "air time")
+ * - Add TSF sync and fix IBSS beacon transmission by adding
+ * competition for "air time" at TBTT
* - RX filtering based on filter configuration (data->rx_filter)
*/
@@ -620,7 +621,8 @@ static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
hwsim_check_magic(vif);
if (vif->type != NL80211_IFTYPE_AP &&
- vif->type != NL80211_IFTYPE_MESH_POINT)
+ vif->type != NL80211_IFTYPE_MESH_POINT &&
+ vif->type != NL80211_IFTYPE_ADHOC)
return;
skb = ieee80211_beacon_get(hw, vif);
@@ -1295,6 +1297,7 @@ static int __init init_mac80211_hwsim(void)
hw->wiphy->interface_modes =
BIT(NL80211_IFTYPE_STATION) |
BIT(NL80211_IFTYPE_AP) |
+ BIT(NL80211_IFTYPE_ADHOC) |
BIT(NL80211_IFTYPE_MESH_POINT);
hw->flags = IEEE80211_HW_MFP_CAPABLE |
diff --git a/drivers/net/wireless/p54/Kconfig b/drivers/net/wireless/p54/Kconfig
index b0342a520bf1..60a930e45a8b 100644
--- a/drivers/net/wireless/p54/Kconfig
+++ b/drivers/net/wireless/p54/Kconfig
@@ -2,6 +2,7 @@ config P54_COMMON
tristate "Softmac Prism54 support"
depends on MAC80211 && EXPERIMENTAL
select FW_LOADER
+ select CRC_CCITT
---help---
This is common code for isl38xx/stlc45xx based modules.
This module does nothing by itself - the USB/PCI/SPI front-ends
diff --git a/drivers/net/wireless/p54/eeprom.c b/drivers/net/wireless/p54/eeprom.c
index d687cb7f2a59..32d3f99b0844 100644
--- a/drivers/net/wireless/p54/eeprom.c
+++ b/drivers/net/wireless/p54/eeprom.c
@@ -23,6 +23,7 @@
#include <linux/slab.h>
#include <net/mac80211.h>
+#include <linux/crc-ccitt.h>
#include "p54.h"
#include "eeprom.h"
@@ -540,6 +541,7 @@ int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)
int err;
u8 *end = (u8 *)eeprom + len;
u16 synth = 0;
+ u16 crc16 = ~0;
wrap = (struct eeprom_pda_wrap *) eeprom;
entry = (void *)wrap->data + le16_to_cpu(wrap->len);
@@ -655,16 +657,29 @@ int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)
}
break;
case PDR_END:
- /* make it overrun */
- entry_len = len;
+ crc16 = ~crc_ccitt(crc16, (u8 *) entry, sizeof(*entry));
+ if (crc16 != le16_to_cpup((__le16 *)entry->data)) {
+ wiphy_err(dev->wiphy, "eeprom failed checksum "
+ "test!\n");
+ err = -ENOMSG;
+ goto err;
+ } else {
+ goto good_eeprom;
+ }
break;
default:
break;
}
- entry = (void *)entry + (entry_len + 1)*2;
+ crc16 = crc_ccitt(crc16, (u8 *)entry, (entry_len + 1) * 2);
+ entry = (void *)entry + (entry_len + 1) * 2;
}
+ wiphy_err(dev->wiphy, "unexpected end of eeprom data.\n");
+ err = -ENODATA;
+ goto err;
+
+good_eeprom:
if (!synth || !priv->iq_autocal || !priv->output_limit ||
!priv->curve_data) {
wiphy_err(dev->wiphy,
diff --git a/drivers/net/wireless/p54/fwio.c b/drivers/net/wireless/p54/fwio.c
index 47006bca4852..6f027ab4c775 100644
--- a/drivers/net/wireless/p54/fwio.c
+++ b/drivers/net/wireless/p54/fwio.c
@@ -123,10 +123,14 @@ int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw)
bootrec = (struct bootrec *)&bootrec->data[len];
}
- if (fw_version)
+ if (fw_version) {
wiphy_info(priv->hw->wiphy,
"fw rev %s - softmac protocol %x.%x\n",
fw_version, priv->fw_var >> 8, priv->fw_var & 0xff);
+ snprintf(dev->wiphy->fw_version, sizeof(dev->wiphy->fw_version),
+ "%s - %x.%x", fw_version,
+ priv->fw_var >> 8, priv->fw_var & 0xff);
+ }
if (priv->fw_var < 0x500)
wiphy_info(priv->hw->wiphy,
diff --git a/drivers/net/wireless/p54/main.c b/drivers/net/wireless/p54/main.c
index 47db439b63bf..622d27b6d8f2 100644
--- a/drivers/net/wireless/p54/main.c
+++ b/drivers/net/wireless/p54/main.c
@@ -429,8 +429,8 @@ static int p54_set_key(struct ieee80211_hw *dev, enum set_key_cmd cmd,
mutex_lock(&priv->conf_mutex);
if (cmd == SET_KEY) {
- switch (key->alg) {
- case ALG_TKIP:
+ switch (key->cipher) {
+ case WLAN_CIPHER_SUITE_TKIP:
if (!(priv->privacy_caps & (BR_DESC_PRIV_CAP_MICHAEL |
BR_DESC_PRIV_CAP_TKIP))) {
ret = -EOPNOTSUPP;
@@ -439,7 +439,8 @@ static int p54_set_key(struct ieee80211_hw *dev, enum set_key_cmd cmd,
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
algo = P54_CRYPTO_TKIPMICHAEL;
break;
- case ALG_WEP:
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
if (!(priv->privacy_caps & BR_DESC_PRIV_CAP_WEP)) {
ret = -EOPNOTSUPP;
goto out_unlock;
@@ -447,7 +448,7 @@ static int p54_set_key(struct ieee80211_hw *dev, enum set_key_cmd cmd,
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
algo = P54_CRYPTO_WEP;
break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
if (!(priv->privacy_caps & BR_DESC_PRIV_CAP_AESCCMP)) {
ret = -EOPNOTSUPP;
goto out_unlock;
diff --git a/drivers/net/wireless/p54/p54spi_eeprom.h b/drivers/net/wireless/p54/p54spi_eeprom.h
index 1ea1050911d9..d592cbd34d78 100644
--- a/drivers/net/wireless/p54/p54spi_eeprom.h
+++ b/drivers/net/wireless/p54/p54spi_eeprom.h
@@ -671,7 +671,7 @@ static unsigned char p54spi_eeprom[] = {
0xa8, 0x09, 0x25, 0x00, 0xf5, 0xff, 0xf9, 0xff, 0x00, 0x01,
0x02, 0x00, 0x00, 0x00, /* PDR_END */
- 0xa8, 0xf5 /* bogus data */
+ 0x67, 0x99,
};
#endif /* P54SPI_EEPROM_H */
diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c
index 427b46f558ed..e53f8cec7798 100644
--- a/drivers/net/wireless/p54/txrx.c
+++ b/drivers/net/wireless/p54/txrx.c
@@ -683,14 +683,15 @@ static void p54_tx_80211_header(struct p54_common *priv, struct sk_buff *skb,
}
}
-static u8 p54_convert_algo(enum ieee80211_key_alg alg)
+static u8 p54_convert_algo(u32 cipher)
{
- switch (alg) {
- case ALG_WEP:
+ switch (cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
return P54_CRYPTO_WEP;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
return P54_CRYPTO_TKIPMICHAEL;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
return P54_CRYPTO_AESCCMP;
default:
return 0;
@@ -731,7 +732,7 @@ int p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb)
if (info->control.hw_key) {
crypt_offset = ieee80211_get_hdrlen_from_skb(skb);
- if (info->control.hw_key->alg == ALG_TKIP) {
+ if (info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
u8 *iv = (u8 *)(skb->data + crypt_offset);
/*
* The firmware excepts that the IV has to have
@@ -827,10 +828,10 @@ int p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb)
hdr->tries = ridx;
txhdr->rts_rate_idx = 0;
if (info->control.hw_key) {
- txhdr->key_type = p54_convert_algo(info->control.hw_key->alg);
+ txhdr->key_type = p54_convert_algo(info->control.hw_key->cipher);
txhdr->key_len = min((u8)16, info->control.hw_key->keylen);
memcpy(txhdr->key, info->control.hw_key->key, txhdr->key_len);
- if (info->control.hw_key->alg == ALG_TKIP) {
+ if (info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
/* reserve space for the MIC key */
len += 8;
memcpy(skb_put(skb, 8), &(info->control.hw_key->key
diff --git a/drivers/net/wireless/prism54/isl_ioctl.c b/drivers/net/wireless/prism54/isl_ioctl.c
index 77cd65db8500..d97a2caf582b 100644
--- a/drivers/net/wireless/prism54/isl_ioctl.c
+++ b/drivers/net/wireless/prism54/isl_ioctl.c
@@ -3234,7 +3234,7 @@ prism54_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
switch (cmd) {
case PRISM54_HOSTAPD:
if (!capable(CAP_NET_ADMIN))
- return -EPERM;
+ return -EPERM;
ret = prism54_hostapd(ndev, &wrq->u.data);
return ret;
}
diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c
index 88560d0ae50a..3bd9cf76517d 100644
--- a/drivers/net/wireless/ray_cs.c
+++ b/drivers/net/wireless/ray_cs.c
@@ -43,7 +43,6 @@
#include <linux/if_arp.h>
#include <linux/ioport.h>
#include <linux/skbuff.h>
-#include <linux/ethtool.h>
#include <linux/ieee80211.h>
#include <pcmcia/cs.h>
@@ -80,8 +79,6 @@ static int ray_dev_config(struct net_device *dev, struct ifmap *map);
static struct net_device_stats *ray_get_stats(struct net_device *dev);
static int ray_dev_init(struct net_device *dev);
-static const struct ethtool_ops netdev_ethtool_ops;
-
static int ray_open(struct net_device *dev);
static netdev_tx_t ray_dev_start_xmit(struct sk_buff *skb,
struct net_device *dev);
@@ -333,7 +330,6 @@ static int ray_probe(struct pcmcia_device *p_dev)
/* Raylink entries in the device structure */
dev->netdev_ops = &ray_netdev_ops;
- SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
dev->wireless_handlers = &ray_handler_def;
#ifdef WIRELESS_SPY
local->wireless_data.spy_data = &local->spy_data;
@@ -1062,18 +1058,6 @@ AP to AP 1 1 dest AP src AP dest source
}
} /* end encapsulate_frame */
-/*===========================================================================*/
-
-static void netdev_get_drvinfo(struct net_device *dev,
- struct ethtool_drvinfo *info)
-{
- strcpy(info->driver, "ray_cs");
-}
-
-static const struct ethtool_ops netdev_ethtool_ops = {
- .get_drvinfo = netdev_get_drvinfo,
-};
-
/*====================================================================*/
/*------------------------------------------------------------------*/
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 5063e01410e5..8e3fbdf48889 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -1481,7 +1481,7 @@ static int rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
/*
* Create channel information array
*/
- info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
+ info = kcalloc(spec->num_channels, sizeof(*info), GFP_KERNEL);
if (!info)
return -ENOMEM;
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index c2a555d5376b..1d174e42f11e 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -1795,7 +1795,7 @@ static int rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
/*
* Create channel information array
*/
- info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
+ info = kcalloc(spec->num_channels, sizeof(*info), GFP_KERNEL);
if (!info)
return -ENOMEM;
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index cdaf93f48263..baadf03a800e 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -355,7 +355,9 @@ static int rt2500usb_config_key(struct rt2x00_dev *rt2x00dev,
* it is known that not work at least on some hardware.
* SW crypto will be used in that case.
*/
- if (key->alg == ALG_WEP && key->keyidx != 0)
+ if ((key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
+ key->cipher == WLAN_CIPHER_SUITE_WEP104) &&
+ key->keyidx != 0)
return -EOPNOTSUPP;
/*
@@ -1698,7 +1700,7 @@ static int rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
/*
* Create channel information array
*/
- info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
+ info = kcalloc(spec->num_channels, sizeof(*info), GFP_KERNEL);
if (!info)
return -ENOMEM;
diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
index ed4ebcdde7c9..cf1f16bfcd5e 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -1318,7 +1318,25 @@
#define TX_STA_CNT2_TX_UNDER_FLOW_COUNT FIELD32(0xffff0000)
/*
- * TX_STA_FIFO: TX Result for specific PID status fifo register
+ * TX_STA_FIFO: TX Result for specific PID status fifo register.
+ *
+ * This register is implemented as FIFO with 16 entries in the HW. Each
+ * register read fetches the next tx result. If the FIFO is full because
+ * it wasn't read fast enough after the according interrupt (TX_FIFO_STATUS)
+ * triggered, the hw seems to simply drop further tx results.
+ *
+ * VALID: 1: this tx result is valid
+ * 0: no valid tx result -> driver should stop reading
+ * PID_TYPE: The PID latched from the PID field in the TXWI, can be used
+ * to match a frame with its tx result (even though the PID is
+ * only 4 bits wide).
+ * TX_SUCCESS: Indicates tx success (1) or failure (0)
+ * TX_AGGRE: Indicates if the frame was part of an aggregate (1) or not (0)
+ * TX_ACK_REQUIRED: Indicates if the frame needed to get ack'ed (1) or not (0)
+ * WCID: The wireless client ID.
+ * MCS: The tx rate used during the last transmission of this frame, be it
+ * successful or not.
+ * PHYMODE: The phymode used for the transmission.
*/
#define TX_STA_FIFO 0x1718
#define TX_STA_FIFO_VALID FIELD32(0x00000001)
@@ -1945,6 +1963,13 @@ struct mac_iveiv_entry {
/*
* Word1
+ * ACK: 0: No Ack needed, 1: Ack needed
+ * NSEQ: 0: Don't assign hw sequence number, 1: Assign hw sequence number
+ * BW_WIN_SIZE: BA windows size of the recipient
+ * WIRELESS_CLI_ID: Client ID for WCID table access
+ * MPDU_TOTAL_BYTE_COUNT: Length of 802.11 frame
+ * PACKETID: Will be latched into the TX_STA_FIFO register once the according
+ * frame was processed. 0: Don't report tx status for this frame.
*/
#define TXWI_W1_ACK FIELD32(0x00000001)
#define TXWI_W1_NSEQ FIELD32(0x00000002)
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index b66e0fd8f0fa..6a0cb2d924d8 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -1,4 +1,5 @@
/*
+ Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
Copyright (C) 2010 Ivo van Doorn <IvDoorn@gmail.com>
Copyright (C) 2009 Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Copyright (C) 2009 Gertjan van Wingerde <gwingerde@gmail.com>
@@ -427,8 +428,10 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
}
EXPORT_SYMBOL_GPL(rt2800_load_firmware);
-void rt2800_write_txwi(__le32 *txwi, struct txentry_desc *txdesc)
+void rt2800_write_tx_data(struct queue_entry *entry,
+ struct txentry_desc *txdesc)
{
+ __le32 *txwi = rt2800_drv_get_txwi(entry);
u32 word;
/*
@@ -437,7 +440,8 @@ void rt2800_write_txwi(__le32 *txwi, struct txentry_desc *txdesc)
rt2x00_desc_read(txwi, 0, &word);
rt2x00_set_field32(&word, TXWI_W0_FRAG,
test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags));
- rt2x00_set_field32(&word, TXWI_W0_MIMO_PS, 0);
+ rt2x00_set_field32(&word, TXWI_W0_MIMO_PS,
+ test_bit(ENTRY_TXD_HT_MIMO_PS, &txdesc->flags));
rt2x00_set_field32(&word, TXWI_W0_CF_ACK, 0);
rt2x00_set_field32(&word, TXWI_W0_TS,
test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags));
@@ -478,7 +482,7 @@ void rt2800_write_txwi(__le32 *txwi, struct txentry_desc *txdesc)
_rt2x00_desc_write(txwi, 2, 0 /* skbdesc->iv[0] */);
_rt2x00_desc_write(txwi, 3, 0 /* skbdesc->iv[1] */);
}
-EXPORT_SYMBOL_GPL(rt2800_write_txwi);
+EXPORT_SYMBOL_GPL(rt2800_write_tx_data);
static int rt2800_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxwi_w2)
{
@@ -490,7 +494,7 @@ static int rt2800_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxwi_w2)
u8 offset1;
u8 offset2;
- if (rt2x00dev->rx_status.band == IEEE80211_BAND_2GHZ) {
+ if (rt2x00dev->curr_band == IEEE80211_BAND_2GHZ) {
rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG, &eeprom);
offset0 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG_OFFSET0);
offset1 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG_OFFSET1);
@@ -569,6 +573,122 @@ void rt2800_process_rxwi(struct queue_entry *entry,
}
EXPORT_SYMBOL_GPL(rt2800_process_rxwi);
+void rt2800_txdone(struct rt2x00_dev *rt2x00dev)
+{
+ struct data_queue *queue;
+ struct queue_entry *entry;
+ __le32 *txwi;
+ struct txdone_entry_desc txdesc;
+ u32 word;
+ u32 reg;
+ int wcid, ack, pid, tx_wcid, tx_ack, tx_pid;
+ u16 mcs, real_mcs;
+ int i;
+
+ /*
+ * TX_STA_FIFO is a stack of X entries, hence read TX_STA_FIFO
+ * at most X times and also stop processing once the TX_STA_FIFO_VALID
+ * flag is not set anymore.
+ *
+ * The legacy drivers use X=TX_RING_SIZE but state in a comment
+ * that the TX_STA_FIFO stack has a size of 16. We stick to our
+ * tx ring size for now.
+ */
+ for (i = 0; i < TX_ENTRIES; i++) {
+ rt2800_register_read(rt2x00dev, TX_STA_FIFO, &reg);
+ if (!rt2x00_get_field32(reg, TX_STA_FIFO_VALID))
+ break;
+
+ wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
+ ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);
+ pid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE);
+
+ /*
+ * Skip this entry when it contains an invalid
+ * queue identication number.
+ */
+ if (pid <= 0 || pid > QID_RX)
+ continue;
+
+ queue = rt2x00queue_get_queue(rt2x00dev, pid - 1);
+ if (unlikely(!queue))
+ continue;
+
+ /*
+ * Inside each queue, we process each entry in a chronological
+ * order. We first check that the queue is not empty.
+ */
+ entry = NULL;
+ while (!rt2x00queue_empty(queue)) {
+ entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
+ if (!test_bit(ENTRY_DATA_IO_FAILED, &entry->flags))
+ break;
+
+ rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);
+ }
+
+ if (!entry || rt2x00queue_empty(queue))
+ break;
+
+ /*
+ * Check if we got a match by looking at WCID/ACK/PID
+ * fields
+ */
+ txwi = rt2800_drv_get_txwi(entry);
+
+ rt2x00_desc_read(txwi, 1, &word);
+ tx_wcid = rt2x00_get_field32(word, TXWI_W1_WIRELESS_CLI_ID);
+ tx_ack = rt2x00_get_field32(word, TXWI_W1_ACK);
+ tx_pid = rt2x00_get_field32(word, TXWI_W1_PACKETID);
+
+ if ((wcid != tx_wcid) || (ack != tx_ack) || (pid != tx_pid))
+ WARNING(rt2x00dev, "invalid TX_STA_FIFO content");
+
+ /*
+ * Obtain the status about this packet.
+ */
+ txdesc.flags = 0;
+ rt2x00_desc_read(txwi, 0, &word);
+ mcs = rt2x00_get_field32(word, TXWI_W0_MCS);
+ mcs = rt2x00_get_field32(reg, TX_STA_FIFO_MCS);
+ real_mcs = rt2x00_get_field32(reg, TX_STA_FIFO_MCS);
+
+ /*
+ * Ralink has a retry mechanism using a global fallback
+ * table. We setup this fallback table to try the immediate
+ * lower rate for all rates. In the TX_STA_FIFO, the MCS field
+ * always contains the MCS used for the last transmission, be
+ * it successful or not.
+ */
+ if (rt2x00_get_field32(reg, TX_STA_FIFO_TX_SUCCESS)) {
+ /*
+ * Transmission succeeded. The number of retries is
+ * mcs - real_mcs
+ */
+ __set_bit(TXDONE_SUCCESS, &txdesc.flags);
+ txdesc.retry = ((mcs > real_mcs) ? mcs - real_mcs : 0);
+ } else {
+ /*
+ * Transmission failed. The number of retries is
+ * always 7 in this case (for a total number of 8
+ * frames sent).
+ */
+ __set_bit(TXDONE_FAILURE, &txdesc.flags);
+ txdesc.retry = rt2x00dev->long_retry;
+ }
+
+ /*
+ * the frame was retried at least once
+ * -> hw used fallback rates
+ */
+ if (txdesc.retry)
+ __set_bit(TXDONE_FALLBACK, &txdesc.flags);
+
+ rt2x00lib_txdone(entry, &txdesc);
+ }
+}
+EXPORT_SYMBOL_GPL(rt2800_txdone);
+
void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
{
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
@@ -600,7 +720,7 @@ void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
/*
* Add the TXWI for the beacon to the skb.
*/
- rt2800_write_txwi((__le32 *)entry->skb->data, txdesc);
+ rt2800_write_tx_data(entry, txdesc);
/*
* Dump beacon to userspace through debugfs.
@@ -2865,7 +2985,7 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
/*
* Create channel information array
*/
- info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
+ info = kcalloc(spec->num_channels, sizeof(*info), GFP_KERNEL);
if (!info)
return -ENOMEM;
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.h b/drivers/net/wireless/rt2x00/rt2800lib.h
index 091641e3c5e2..3b572c63382d 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.h
+++ b/drivers/net/wireless/rt2x00/rt2800lib.h
@@ -1,4 +1,6 @@
/*
+ Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
+ Copyright (C) 2010 Ivo van Doorn <IvDoorn@gmail.com>
Copyright (C) 2009 Bartlomiej Zolnierkiewicz
This program is free software; you can redistribute it and/or modify
@@ -44,6 +46,7 @@ struct rt2800_ops {
int (*drv_write_firmware)(struct rt2x00_dev *rt2x00dev,
const u8 *data, const size_t len);
int (*drv_init_registers)(struct rt2x00_dev *rt2x00dev);
+ __le32 *(*drv_get_txwi)(struct queue_entry *entry);
};
static inline void rt2800_register_read(struct rt2x00_dev *rt2x00dev,
@@ -126,6 +129,13 @@ static inline int rt2800_drv_init_registers(struct rt2x00_dev *rt2x00dev)
return rt2800ops->drv_init_registers(rt2x00dev);
}
+static inline __le32 *rt2800_drv_get_txwi(struct queue_entry *entry)
+{
+ const struct rt2800_ops *rt2800ops = entry->queue->rt2x00dev->ops->drv;
+
+ return rt2800ops->drv_get_txwi(entry);
+}
+
void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev,
const u8 command, const u8 token,
const u8 arg0, const u8 arg1);
@@ -135,9 +145,12 @@ int rt2800_check_firmware(struct rt2x00_dev *rt2x00dev,
int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
const u8 *data, const size_t len);
-void rt2800_write_txwi(__le32 *txwi, struct txentry_desc *txdesc);
+void rt2800_write_tx_data(struct queue_entry *entry,
+ struct txentry_desc *txdesc);
void rt2800_process_rxwi(struct queue_entry *entry, struct rxdone_entry_desc *txdesc);
+void rt2800_txdone(struct rt2x00_dev *rt2x00dev);
+
void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc);
extern const struct rt2x00debug rt2800_rt2x00debug;
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index 39b3846fa340..4390f2b74b2e 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2009 Ivo van Doorn <IvDoorn@gmail.com>
+ Copyright (C) 2009 - 2010 Ivo van Doorn <IvDoorn@gmail.com>
Copyright (C) 2009 Alban Browaeys <prahal@yahoo.com>
Copyright (C) 2009 Felix Fietkau <nbd@openwrt.org>
Copyright (C) 2009 Luis Correia <luis.f.correia@gmail.com>
@@ -566,15 +566,11 @@ static int rt2800pci_set_device_state(struct rt2x00_dev *rt2x00dev,
/*
* TX descriptor initialization
*/
-static void rt2800pci_write_tx_data(struct queue_entry* entry,
- struct txentry_desc *txdesc)
+static __le32 *rt2800pci_get_txwi(struct queue_entry *entry)
{
- __le32 *txwi = (__le32 *) entry->skb->data;
-
- rt2800_write_txwi(txwi, txdesc);
+ return (__le32 *) entry->skb->data;
}
-
static void rt2800pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
struct sk_buff *skb,
struct txentry_desc *txdesc)
@@ -728,110 +724,6 @@ static void rt2800pci_fill_rxdone(struct queue_entry *entry,
/*
* Interrupt functions.
*/
-static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
-{
- struct data_queue *queue;
- struct queue_entry *entry;
- __le32 *txwi;
- struct txdone_entry_desc txdesc;
- u32 word;
- u32 reg;
- int wcid, ack, pid, tx_wcid, tx_ack, tx_pid;
- u16 mcs, real_mcs;
- int i;
-
- /*
- * TX_STA_FIFO is a stack of X entries, hence read TX_STA_FIFO
- * at most X times and also stop processing once the TX_STA_FIFO_VALID
- * flag is not set anymore.
- *
- * The legacy drivers use X=TX_RING_SIZE but state in a comment
- * that the TX_STA_FIFO stack has a size of 16. We stick to our
- * tx ring size for now.
- */
- for (i = 0; i < TX_ENTRIES; i++) {
- rt2800_register_read(rt2x00dev, TX_STA_FIFO, &reg);
- if (!rt2x00_get_field32(reg, TX_STA_FIFO_VALID))
- break;
-
- wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
- ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);
- pid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE);
-
- /*
- * Skip this entry when it contains an invalid
- * queue identication number.
- */
- if (pid <= 0 || pid > QID_RX)
- continue;
-
- queue = rt2x00queue_get_queue(rt2x00dev, pid - 1);
- if (unlikely(!queue))
- continue;
-
- /*
- * Inside each queue, we process each entry in a chronological
- * order. We first check that the queue is not empty.
- */
- if (rt2x00queue_empty(queue))
- continue;
- entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
-
- /* Check if we got a match by looking at WCID/ACK/PID
- * fields */
- txwi = (__le32 *) entry->skb->data;
-
- rt2x00_desc_read(txwi, 1, &word);
- tx_wcid = rt2x00_get_field32(word, TXWI_W1_WIRELESS_CLI_ID);
- tx_ack = rt2x00_get_field32(word, TXWI_W1_ACK);
- tx_pid = rt2x00_get_field32(word, TXWI_W1_PACKETID);
-
- if ((wcid != tx_wcid) || (ack != tx_ack) || (pid != tx_pid))
- WARNING(rt2x00dev, "invalid TX_STA_FIFO content\n");
-
- /*
- * Obtain the status about this packet.
- */
- txdesc.flags = 0;
- rt2x00_desc_read(txwi, 0, &word);
- mcs = rt2x00_get_field32(word, TXWI_W0_MCS);
- real_mcs = rt2x00_get_field32(reg, TX_STA_FIFO_MCS);
-
- /*
- * Ralink has a retry mechanism using a global fallback
- * table. We setup this fallback table to try the immediate
- * lower rate for all rates. In the TX_STA_FIFO, the MCS field
- * always contains the MCS used for the last transmission, be
- * it successful or not.
- */
- if (rt2x00_get_field32(reg, TX_STA_FIFO_TX_SUCCESS)) {
- /*
- * Transmission succeeded. The number of retries is
- * mcs - real_mcs
- */
- __set_bit(TXDONE_SUCCESS, &txdesc.flags);
- txdesc.retry = ((mcs > real_mcs) ? mcs - real_mcs : 0);
- } else {
- /*
- * Transmission failed. The number of retries is
- * always 7 in this case (for a total number of 8
- * frames sent).
- */
- __set_bit(TXDONE_FAILURE, &txdesc.flags);
- txdesc.retry = 7;
- }
-
- /*
- * the frame was retried at least once
- * -> hw used fallback rates
- */
- if (txdesc.retry)
- __set_bit(TXDONE_FALLBACK, &txdesc.flags);
-
- rt2x00lib_txdone(entry, &txdesc);
- }
-}
-
static void rt2800pci_wakeup(struct rt2x00_dev *rt2x00dev)
{
struct ieee80211_conf conf = { .flags = 0 };
@@ -867,7 +759,7 @@ static irqreturn_t rt2800pci_interrupt_thread(int irq, void *dev_instance)
* 4 - Tx done interrupt.
*/
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS))
- rt2800pci_txdone(rt2x00dev);
+ rt2800_txdone(rt2x00dev);
/*
* 5 - Auto wakeup interrupt.
@@ -1011,6 +903,7 @@ static const struct rt2800_ops rt2800pci_rt2800_ops = {
.regbusy_read = rt2x00pci_regbusy_read,
.drv_write_firmware = rt2800pci_write_firmware,
.drv_init_registers = rt2800pci_init_registers,
+ .drv_get_txwi = rt2800pci_get_txwi,
};
static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
@@ -1030,7 +923,7 @@ static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
.reset_tuner = rt2800_reset_tuner,
.link_tuner = rt2800_link_tuner,
.write_tx_desc = rt2800pci_write_tx_desc,
- .write_tx_data = rt2800pci_write_tx_data,
+ .write_tx_data = rt2800_write_tx_data,
.write_beacon = rt2800_write_beacon,
.kick_tx_queue = rt2800pci_kick_tx_queue,
.kill_tx_queue = rt2800pci_kill_tx_queue,
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index 5a2dfe87c6b6..9ad28be294eb 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -1,5 +1,6 @@
/*
- Copyright (C) 2009 Ivo van Doorn <IvDoorn@gmail.com>
+ Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
+ Copyright (C) 2009 - 2010 Ivo van Doorn <IvDoorn@gmail.com>
Copyright (C) 2009 Mattias Nissler <mattias.nissler@gmx.de>
Copyright (C) 2009 Felix Fietkau <nbd@openwrt.org>
Copyright (C) 2009 Xose Vazquez Perez <xose.vazquez@gmail.com>
@@ -320,15 +321,14 @@ static int rt2800usb_set_device_state(struct rt2x00_dev *rt2x00dev,
/*
* TX descriptor initialization
*/
-static void rt2800usb_write_tx_data(struct queue_entry* entry,
- struct txentry_desc *txdesc)
+static __le32 *rt2800usb_get_txwi(struct queue_entry *entry)
{
- __le32 *txwi = (__le32 *) (entry->skb->data + TXINFO_DESC_SIZE);
-
- rt2800_write_txwi(txwi, txdesc);
+ if (entry->queue->qid == QID_BEACON)
+ return (__le32 *) (entry->skb->data);
+ else
+ return (__le32 *) (entry->skb->data + TXINFO_DESC_SIZE);
}
-
static void rt2800usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
struct sk_buff *skb,
struct txentry_desc *txdesc)
@@ -379,6 +379,38 @@ static int rt2800usb_get_tx_data_len(struct queue_entry *entry)
}
/*
+ * TX control handlers
+ */
+static void rt2800usb_work_txdone(struct work_struct *work)
+{
+ struct rt2x00_dev *rt2x00dev =
+ container_of(work, struct rt2x00_dev, txdone_work);
+ struct data_queue *queue;
+ struct queue_entry *entry;
+
+ rt2800_txdone(rt2x00dev);
+
+ /*
+ * Process any trailing TX status reports for IO failures,
+ * we loop until we find the first non-IO error entry. This
+ * can either be a frame which is free, is being uploaded,
+ * or has completed the upload but didn't have an entry
+ * in the TX_STAT_FIFO register yet.
+ */
+ tx_queue_for_each(rt2x00dev, queue) {
+ while (!rt2x00queue_empty(queue)) {
+ entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
+
+ if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) ||
+ !test_bit(ENTRY_DATA_IO_FAILED, &entry->flags))
+ break;
+
+ rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);
+ }
+ }
+}
+
+/*
* RX control handlers
*/
static void rt2800usb_fill_rxdone(struct queue_entry *entry,
@@ -514,6 +546,11 @@ static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev)
*/
rt2x00dev->rssi_offset = DEFAULT_RSSI_OFFSET;
+ /*
+ * Overwrite TX done handler
+ */
+ PREPARE_WORK(&rt2x00dev->txdone_work, rt2800usb_work_txdone);
+
return 0;
}
@@ -549,6 +586,7 @@ static const struct rt2800_ops rt2800usb_rt2800_ops = {
.regbusy_read = rt2x00usb_regbusy_read,
.drv_write_firmware = rt2800usb_write_firmware,
.drv_init_registers = rt2800usb_init_registers,
+ .drv_get_txwi = rt2800usb_get_txwi,
};
static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {
@@ -566,7 +604,7 @@ static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {
.link_tuner = rt2800_link_tuner,
.watchdog = rt2x00usb_watchdog,
.write_tx_desc = rt2800usb_write_tx_desc,
- .write_tx_data = rt2800usb_write_tx_data,
+ .write_tx_data = rt2800_write_tx_data,
.write_beacon = rt2800_write_beacon,
.get_tx_data_len = rt2800usb_get_tx_data_len,
.kick_tx_queue = rt2x00usb_kick_tx_queue,
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index c21af38cc5af..8c65244a847a 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -1,5 +1,6 @@
/*
- Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
+ Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
+ Copyright (C) 2004 - 2010 Ivo van Doorn <IvDoorn@gmail.com>
Copyright (C) 2004 - 2009 Gertjan van Wingerde <gwingerde@gmail.com>
<http://rt2x00.serialmonkey.com>
@@ -698,6 +699,7 @@ struct rt2x00_dev {
struct ieee80211_hw *hw;
struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS];
enum ieee80211_band curr_band;
+ int curr_freq;
/*
* If enabled, the debugfs interface structures
@@ -850,11 +852,6 @@ struct rt2x00_dev {
struct ieee80211_low_level_stats low_level_stats;
/*
- * RX configuration information.
- */
- struct ieee80211_rx_status rx_status;
-
- /*
* Scheduled work.
* NOTE: intf_work will use ieee80211_iterate_active_interfaces()
* which means it cannot be placed on the hw->workqueue
@@ -862,6 +859,12 @@ struct rt2x00_dev {
*/
struct work_struct intf_work;
+ /**
+ * Scheduled work for TX/RX done handling (USB devices)
+ */
+ struct work_struct rxdone_work;
+ struct work_struct txdone_work;
+
/*
* Data queue arrays for RX, TX and Beacon.
* The Beacon array also contains the Atim queue
@@ -1071,6 +1074,7 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev);
void rt2x00lib_pretbtt(struct rt2x00_dev *rt2x00dev);
void rt2x00lib_txdone(struct queue_entry *entry,
struct txdone_entry_desc *txdesc);
+void rt2x00lib_txdone_noinfo(struct queue_entry *entry, u32 status);
void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
struct queue_entry *entry);
diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c
index 953dc4f2c6af..34f34fa7f53a 100644
--- a/drivers/net/wireless/rt2x00/rt2x00config.c
+++ b/drivers/net/wireless/rt2x00/rt2x00config.c
@@ -126,11 +126,6 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
* ANTENNA_SW_DIVERSITY state to the driver.
* If that happens, fallback to hardware defaults,
* or our own default.
- * If diversity handling is active for a particular antenna,
- * we shouldn't overwrite that antenna.
- * The calls to rt2x00lib_config_antenna_check()
- * might have caused that we restore back to the already
- * active setting. If that has happened we can quit.
*/
if (!(ant->flags & ANTENNA_RX_DIVERSITY))
config.rx = rt2x00lib_config_antenna_check(config.rx, def->rx);
@@ -142,9 +137,6 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
else
config.tx = active->tx;
- if (config.rx == active->rx && config.tx == active->tx)
- return;
-
/*
* Antenna setup changes require the RX to be disabled,
* else the changes will be ignored by the device.
@@ -209,10 +201,8 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
rt2x00link_reset_tuner(rt2x00dev, false);
rt2x00dev->curr_band = conf->channel->band;
+ rt2x00dev->curr_freq = conf->channel->center_freq;
rt2x00dev->tx_power = conf->power_level;
rt2x00dev->short_retry = conf->short_frame_max_tx_count;
rt2x00dev->long_retry = conf->long_frame_max_tx_count;
-
- rt2x00dev->rx_status.band = conf->channel->band;
- rt2x00dev->rx_status.freq = conf->channel->center_freq;
}
diff --git a/drivers/net/wireless/rt2x00/rt2x00crypto.c b/drivers/net/wireless/rt2x00/rt2x00crypto.c
index 583dacd8d241..5e9074bf2b8e 100644
--- a/drivers/net/wireless/rt2x00/rt2x00crypto.c
+++ b/drivers/net/wireless/rt2x00/rt2x00crypto.c
@@ -31,15 +31,14 @@
enum cipher rt2x00crypto_key_to_cipher(struct ieee80211_key_conf *key)
{
- switch (key->alg) {
- case ALG_WEP:
- if (key->keylen == WLAN_KEY_LEN_WEP40)
- return CIPHER_WEP64;
- else
- return CIPHER_WEP128;
- case ALG_TKIP:
+ switch (key->cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ return CIPHER_WEP64;
+ case WLAN_CIPHER_SUITE_WEP104:
+ return CIPHER_WEP128;
+ case WLAN_CIPHER_SUITE_TKIP:
return CIPHER_TKIP;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
return CIPHER_AES;
default:
return CIPHER_NONE;
@@ -95,7 +94,7 @@ unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev,
overhead += key->iv_len;
if (!(key->flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) {
- if (key->alg == ALG_TKIP)
+ if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
overhead += 8;
}
diff --git a/drivers/net/wireless/rt2x00/rt2x00debug.c b/drivers/net/wireless/rt2x00/rt2x00debug.c
index b0498e7e7aae..2d018ceffc54 100644
--- a/drivers/net/wireless/rt2x00/rt2x00debug.c
+++ b/drivers/net/wireless/rt2x00/rt2x00debug.c
@@ -333,7 +333,7 @@ static ssize_t rt2x00debug_read_queue_stats(struct file *file,
if (*offset)
return 0;
- data = kzalloc(lines * MAX_LINE_LENGTH, GFP_KERNEL);
+ data = kcalloc(lines, MAX_LINE_LENGTH, GFP_KERNEL);
if (!data)
return -ENOMEM;
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index 585e8166f22a..e692608bee8b 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -1,5 +1,6 @@
/*
- Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
+ Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
+ Copyright (C) 2004 - 2010 Ivo van Doorn <IvDoorn@gmail.com>
<http://rt2x00.serialmonkey.com>
This program is free software; you can redistribute it and/or modify
@@ -383,15 +384,7 @@ void rt2x00lib_txdone(struct queue_entry *entry,
* send the status report back.
*/
if (!(skbdesc_flags & SKBDESC_NOT_MAC80211))
- /*
- * Only PCI and SOC devices process the tx status in process
- * context. Hence use ieee80211_tx_status for PCI and SOC
- * devices and stick to ieee80211_tx_status_irqsafe for USB.
- */
- if (rt2x00_is_usb(rt2x00dev))
- ieee80211_tx_status_irqsafe(rt2x00dev->hw, entry->skb);
- else
- ieee80211_tx_status(rt2x00dev->hw, entry->skb);
+ ieee80211_tx_status(rt2x00dev->hw, entry->skb);
else
dev_kfree_skb_any(entry->skb);
@@ -403,7 +396,6 @@ void rt2x00lib_txdone(struct queue_entry *entry,
rt2x00dev->ops->lib->clear_entry(entry);
- clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE);
/*
@@ -416,6 +408,18 @@ void rt2x00lib_txdone(struct queue_entry *entry,
}
EXPORT_SYMBOL_GPL(rt2x00lib_txdone);
+void rt2x00lib_txdone_noinfo(struct queue_entry *entry, u32 status)
+{
+ struct txdone_entry_desc txdesc;
+
+ txdesc.flags = 0;
+ __set_bit(status, &txdesc.flags);
+ txdesc.retry = 0;
+
+ rt2x00lib_txdone(entry, &txdesc);
+}
+EXPORT_SYMBOL_GPL(rt2x00lib_txdone_noinfo);
+
static int rt2x00lib_rxdone_read_signal(struct rt2x00_dev *rt2x00dev,
struct rxdone_entry_desc *rxdesc)
{
@@ -460,9 +464,13 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
{
struct rxdone_entry_desc rxdesc;
struct sk_buff *skb;
- struct ieee80211_rx_status *rx_status = &rt2x00dev->rx_status;
+ struct ieee80211_rx_status *rx_status;
unsigned int header_length;
int rate_idx;
+
+ if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags))
+ goto submit_entry;
+
/*
* Allocate a new sk_buffer. If no new buffer available, drop the
* received frame and reuse the existing buffer.
@@ -527,39 +535,32 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
*/
rt2x00link_update_stats(rt2x00dev, entry->skb, &rxdesc);
rt2x00debug_update_crypto(rt2x00dev, &rxdesc);
+ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_RXDONE, entry->skb);
+ /*
+ * Initialize RX status information, and send frame
+ * to mac80211.
+ */
+ rx_status = IEEE80211_SKB_RXCB(entry->skb);
rx_status->mactime = rxdesc.timestamp;
+ rx_status->band = rt2x00dev->curr_band;
+ rx_status->freq = rt2x00dev->curr_freq;
rx_status->rate_idx = rate_idx;
rx_status->signal = rxdesc.rssi;
rx_status->flag = rxdesc.flags;
rx_status->antenna = rt2x00dev->link.ant.active.rx;
- /*
- * Send frame to mac80211 & debugfs.
- * mac80211 will clean up the skb structure.
- */
- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_RXDONE, entry->skb);
- memcpy(IEEE80211_SKB_RXCB(entry->skb), rx_status, sizeof(*rx_status));
-
- /*
- * Currently only PCI and SOC devices handle rx interrupts in process
- * context. Hence, use ieee80211_rx_irqsafe for USB and ieee80211_rx_ni
- * for PCI and SOC devices.
- */
- if (rt2x00_is_usb(rt2x00dev))
- ieee80211_rx_irqsafe(rt2x00dev->hw, entry->skb);
- else
- ieee80211_rx_ni(rt2x00dev->hw, entry->skb);
+ ieee80211_rx_ni(rt2x00dev->hw, entry->skb);
/*
* Replace the skb with the freshly allocated one.
*/
entry->skb = skb;
- entry->flags = 0;
+submit_entry:
rt2x00dev->ops->lib->clear_entry(entry);
-
rt2x00queue_index_inc(entry->queue, Q_INDEX);
+ rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE);
}
EXPORT_SYMBOL_GPL(rt2x00lib_rxdone);
@@ -1017,6 +1018,8 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
* Stop all work.
*/
cancel_work_sync(&rt2x00dev->intf_work);
+ cancel_work_sync(&rt2x00dev->rxdone_work);
+ cancel_work_sync(&rt2x00dev->txdone_work);
/*
* Uninitialize device.
diff --git a/drivers/net/wireless/rt2x00/rt2x00firmware.c b/drivers/net/wireless/rt2x00/rt2x00firmware.c
index b818a43c4672..f0e1eb72befc 100644
--- a/drivers/net/wireless/rt2x00/rt2x00firmware.c
+++ b/drivers/net/wireless/rt2x00/rt2x00firmware.c
@@ -63,6 +63,9 @@ static int rt2x00lib_request_firmware(struct rt2x00_dev *rt2x00dev)
INFO(rt2x00dev, "Firmware detected - version: %d.%d.\n",
fw->data[fw->size - 4], fw->data[fw->size - 3]);
+ snprintf(rt2x00dev->hw->wiphy->fw_version,
+ sizeof(rt2x00dev->hw->wiphy->fw_version), "%d.%d",
+ fw->data[fw->size - 4], fw->data[fw->size - 3]);
retval = rt2x00dev->ops->lib->check_firmware(rt2x00dev, fw->data, fw->size);
switch (retval) {
diff --git a/drivers/net/wireless/rt2x00/rt2x00ht.c b/drivers/net/wireless/rt2x00/rt2x00ht.c
index c004cd3a8847..ad3c7ff4837b 100644
--- a/drivers/net/wireless/rt2x00/rt2x00ht.c
+++ b/drivers/net/wireless/rt2x00/rt2x00ht.c
@@ -54,6 +54,16 @@ void rt2x00ht_create_tx_descriptor(struct queue_entry *entry,
*/
if (txrate->flags & IEEE80211_TX_RC_MCS) {
txdesc->mcs = txrate->idx;
+
+ /*
+ * MIMO PS should be set to 1 for STA's using dynamic SM PS
+ * when using more then one tx stream (>MCS7).
+ */
+ if (tx_info->control.sta && txdesc->mcs > 7 &&
+ (tx_info->control.sta->ht_cap.cap &
+ (WLAN_HT_CAP_SM_PS_DYNAMIC <<
+ IEEE80211_HT_CAP_SM_PS_SHIFT)))
+ __set_bit(ENTRY_TXD_HT_MIMO_PS, &txdesc->flags);
} else {
txdesc->mcs = rt2x00_get_rate_mcs(hwrate->mcs);
if (txrate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index a3401d301058..480d33a3ce42 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -1,5 +1,6 @@
/*
- Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
+ Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
+ Copyright (C) 2004 - 2010 Ivo van Doorn <IvDoorn@gmail.com>
Copyright (C) 2004 - 2009 Gertjan van Wingerde <gwingerde@gmail.com>
<http://rt2x00.serialmonkey.com>
@@ -730,9 +731,9 @@ void rt2x00queue_init_queues(struct rt2x00_dev *rt2x00dev)
rt2x00queue_reset(queue);
for (i = 0; i < queue->limit; i++) {
- queue->entries[i].flags = 0;
-
rt2x00dev->ops->lib->clear_entry(&queue->entries[i]);
+ if (queue->qid == QID_RX)
+ rt2x00queue_index_inc(queue, Q_INDEX);
}
}
}
@@ -755,7 +756,7 @@ static int rt2x00queue_alloc_entries(struct data_queue *queue,
* Allocate all queue entries.
*/
entry_size = sizeof(*entries) + qdesc->priv_size;
- entries = kzalloc(queue->limit * entry_size, GFP_KERNEL);
+ entries = kcalloc(queue->limit, entry_size, GFP_KERNEL);
if (!entries)
return -ENOMEM;
@@ -891,7 +892,7 @@ int rt2x00queue_allocate(struct rt2x00_dev *rt2x00dev)
*/
rt2x00dev->data_queues = 2 + rt2x00dev->ops->tx_queues + req_atim;
- queue = kzalloc(rt2x00dev->data_queues * sizeof(*queue), GFP_KERNEL);
+ queue = kcalloc(rt2x00dev->data_queues, sizeof(*queue), GFP_KERNEL);
if (!queue) {
ERROR(rt2x00dev, "Queue allocation failed.\n");
return -ENOMEM;
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h
index 191e7775a9c0..2d3bf843735f 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.h
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
+ Copyright (C) 2004 - 2010 Ivo van Doorn <IvDoorn@gmail.com>
<http://rt2x00.serialmonkey.com>
This program is free software; you can redistribute it and/or modify
@@ -268,6 +268,7 @@ struct txdone_entry_desc {
* @ENTRY_TXD_HT_AMPDU: This frame is part of an AMPDU.
* @ENTRY_TXD_HT_BW_40: Use 40MHz Bandwidth.
* @ENTRY_TXD_HT_SHORT_GI: Use short GI.
+ * @ENTRY_TXD_HT_MIMO_PS: The receiving STA is in dynamic SM PS mode.
*/
enum txentry_desc_flags {
ENTRY_TXD_RTS_FRAME,
@@ -286,6 +287,7 @@ enum txentry_desc_flags {
ENTRY_TXD_HT_AMPDU,
ENTRY_TXD_HT_BW_40,
ENTRY_TXD_HT_SHORT_GI,
+ ENTRY_TXD_HT_MIMO_PS,
};
/**
@@ -363,12 +365,16 @@ struct txentry_desc {
* the device has signaled it is done with it.
* @ENTRY_DATA_PENDING: This entry contains a valid frame and is waiting
* for the signal to start sending.
+ * @ENTRY_DATA_IO_FAILED: Hardware indicated that an IO error occured
+ * while transfering the data to the hardware. No TX status report will
+ * be expected from the hardware.
*/
enum queue_entry_flags {
ENTRY_BCN_ASSIGNED,
ENTRY_OWNER_DEVICE_DATA,
ENTRY_OWNER_DEVICE_CRYPTO,
ENTRY_DATA_PENDING,
+ ENTRY_DATA_IO_FAILED
};
/**
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c
index ff3a36622d1b..f76014f732ce 100644
--- a/drivers/net/wireless/rt2x00/rt2x00usb.c
+++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
@@ -1,5 +1,6 @@
/*
- Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
+ Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
+ Copyright (C) 2004 - 2010 Ivo van Doorn <IvDoorn@gmail.com>
<http://rt2x00.serialmonkey.com>
This program is free software; you can redistribute it and/or modify
@@ -167,33 +168,61 @@ EXPORT_SYMBOL_GPL(rt2x00usb_regbusy_read);
/*
* TX data handlers.
*/
+static void rt2x00usb_work_txdone_entry(struct queue_entry *entry)
+{
+ /*
+ * If the transfer to hardware succeeded, it does not mean the
+ * frame was send out correctly. It only means the frame
+ * was succesfully pushed to the hardware, we have no
+ * way to determine the transmission status right now.
+ * (Only indirectly by looking at the failed TX counters
+ * in the register).
+ */
+ if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags))
+ rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);
+ else
+ rt2x00lib_txdone_noinfo(entry, TXDONE_UNKNOWN);
+}
+
+static void rt2x00usb_work_txdone(struct work_struct *work)
+{
+ struct rt2x00_dev *rt2x00dev =
+ container_of(work, struct rt2x00_dev, txdone_work);
+ struct data_queue *queue;
+ struct queue_entry *entry;
+
+ tx_queue_for_each(rt2x00dev, queue) {
+ while (!rt2x00queue_empty(queue)) {
+ entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
+
+ if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
+ break;
+
+ rt2x00usb_work_txdone_entry(entry);
+ }
+ }
+}
+
static void rt2x00usb_interrupt_txdone(struct urb *urb)
{
struct queue_entry *entry = (struct queue_entry *)urb->context;
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
- struct txdone_entry_desc txdesc;
if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags) ||
- !test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
+ !__test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
return;
/*
- * Obtain the status about this packet.
- * Note that when the status is 0 it does not mean the
- * frame was send out correctly. It only means the frame
- * was succesfully pushed to the hardware, we have no
- * way to determine the transmission status right now.
- * (Only indirectly by looking at the failed TX counters
- * in the register).
+ * Check if the frame was correctly uploaded
*/
- txdesc.flags = 0;
- if (!urb->status)
- __set_bit(TXDONE_UNKNOWN, &txdesc.flags);
- else
- __set_bit(TXDONE_FAILURE, &txdesc.flags);
- txdesc.retry = 0;
+ if (urb->status)
+ __set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
- rt2x00lib_txdone(entry, &txdesc);
+ /*
+ * Schedule the delayed work for reading the TX status
+ * from the device.
+ */
+ ieee80211_queue_work(rt2x00dev->hw, &rt2x00dev->txdone_work);
}
static inline void rt2x00usb_kick_tx_entry(struct queue_entry *entry)
@@ -294,6 +323,7 @@ EXPORT_SYMBOL_GPL(rt2x00usb_kill_tx_queue);
static void rt2x00usb_watchdog_reset_tx(struct data_queue *queue)
{
+ struct queue_entry *entry;
struct queue_entry_priv_usb *entry_priv;
unsigned short threshold = queue->threshold;
@@ -313,14 +343,22 @@ static void rt2x00usb_watchdog_reset_tx(struct data_queue *queue)
* Reset all currently uploaded TX frames.
*/
while (!rt2x00queue_empty(queue)) {
- entry_priv = rt2x00queue_get_entry(queue, Q_INDEX_DONE)->priv_data;
+ entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
+ entry_priv = entry->priv_data;
usb_kill_urb(entry_priv->urb);
/*
* We need a short delay here to wait for
- * the URB to be canceled and invoked the tx_done handler.
+ * the URB to be canceled
+ */
+ do {
+ udelay(100);
+ } while (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags));
+
+ /*
+ * Invoke the TX done handler
*/
- udelay(200);
+ rt2x00usb_work_txdone_entry(entry);
}
/*
@@ -345,15 +383,41 @@ EXPORT_SYMBOL_GPL(rt2x00usb_watchdog);
/*
* RX data handlers.
*/
+static void rt2x00usb_work_rxdone(struct work_struct *work)
+{
+ struct rt2x00_dev *rt2x00dev =
+ container_of(work, struct rt2x00_dev, rxdone_work);
+ struct queue_entry *entry;
+ struct skb_frame_desc *skbdesc;
+ u8 rxd[32];
+
+ while (!rt2x00queue_empty(rt2x00dev->rx)) {
+ entry = rt2x00queue_get_entry(rt2x00dev->rx, Q_INDEX_DONE);
+
+ if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
+ break;
+
+ /*
+ * Fill in desc fields of the skb descriptor
+ */
+ skbdesc = get_skb_frame_desc(entry->skb);
+ skbdesc->desc = rxd;
+ skbdesc->desc_len = entry->queue->desc_size;
+
+ /*
+ * Send the frame to rt2x00lib for further processing.
+ */
+ rt2x00lib_rxdone(rt2x00dev, entry);
+ }
+}
+
static void rt2x00usb_interrupt_rxdone(struct urb *urb)
{
struct queue_entry *entry = (struct queue_entry *)urb->context;
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
- struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
- u8 rxd[32];
if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags) ||
- !test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
+ !__test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
return;
/*
@@ -361,22 +425,14 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
* to be actually valid, or if the urb is signaling
* a problem.
*/
- if (urb->actual_length < entry->queue->desc_size || urb->status) {
- set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
- usb_submit_urb(urb, GFP_ATOMIC);
- return;
- }
-
- /*
- * Fill in desc fields of the skb descriptor
- */
- skbdesc->desc = rxd;
- skbdesc->desc_len = entry->queue->desc_size;
+ if (urb->actual_length < entry->queue->desc_size || urb->status)
+ __set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
/*
- * Send the frame to rt2x00lib for further processing.
+ * Schedule the delayed work for reading the RX status
+ * from the device.
*/
- rt2x00lib_rxdone(rt2x00dev, entry);
+ ieee80211_queue_work(rt2x00dev->hw, &rt2x00dev->rxdone_work);
}
/*
@@ -405,6 +461,8 @@ void rt2x00usb_clear_entry(struct queue_entry *entry)
struct queue_entry_priv_usb *entry_priv = entry->priv_data;
int pipe;
+ entry->flags = 0;
+
if (entry->queue->qid == QID_RX) {
pipe = usb_rcvbulkpipe(usb_dev, entry->queue->usb_endpoint);
usb_fill_bulk_urb(entry_priv->urb, usb_dev, pipe,
@@ -413,8 +471,6 @@ void rt2x00usb_clear_entry(struct queue_entry *entry)
set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
- } else {
- entry->flags = 0;
}
}
EXPORT_SYMBOL_GPL(rt2x00usb_clear_entry);
@@ -659,6 +715,9 @@ int rt2x00usb_probe(struct usb_interface *usb_intf,
rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_USB);
+ INIT_WORK(&rt2x00dev->rxdone_work, rt2x00usb_work_rxdone);
+ INIT_WORK(&rt2x00dev->txdone_work, rt2x00usb_work_txdone);
+
retval = rt2x00usb_alloc_reg(rt2x00dev);
if (retval)
goto exit_free_device;
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index e539c6cb636f..3f8d10b76fee 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -1050,7 +1050,7 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev,
/*
* Determine r17 bounds.
*/
- if (rt2x00dev->rx_status.band == IEEE80211_BAND_5GHZ) {
+ if (rt2x00dev->curr_band == IEEE80211_BAND_5GHZ) {
low_bound = 0x28;
up_bound = 0x48;
if (test_bit(CONFIG_EXTERNAL_LNA_A, &rt2x00dev->flags)) {
@@ -1972,7 +1972,7 @@ static int rt61pci_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
return 0;
}
- if (rt2x00dev->rx_status.band == IEEE80211_BAND_5GHZ) {
+ if (rt2x00dev->curr_band == IEEE80211_BAND_5GHZ) {
if (lna == 3 || lna == 2)
offset += 10;
}
@@ -2107,11 +2107,7 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
"TX status report missed for entry %d\n",
entry_done->entry_idx);
- txdesc.flags = 0;
- __set_bit(TXDONE_UNKNOWN, &txdesc.flags);
- txdesc.retry = 0;
-
- rt2x00lib_txdone(entry_done, &txdesc);
+ rt2x00lib_txdone_noinfo(entry, TXDONE_UNKNOWN);
entry_done = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
}
@@ -2654,7 +2650,7 @@ static int rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
/*
* Create channel information array
*/
- info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
+ info = kcalloc(spec->num_channels, sizeof(*info), GFP_KERNEL);
if (!info)
return -ENOMEM;
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index aa9de18fd410..8ca19f70aea7 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -929,7 +929,7 @@ static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev,
/*
* Determine r17 bounds.
*/
- if (rt2x00dev->rx_status.band == IEEE80211_BAND_5GHZ) {
+ if (rt2x00dev->curr_band == IEEE80211_BAND_5GHZ) {
low_bound = 0x28;
up_bound = 0x48;
@@ -1597,7 +1597,7 @@ static int rt73usb_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
return 0;
}
- if (rt2x00dev->rx_status.band == IEEE80211_BAND_5GHZ) {
+ if (rt2x00dev->curr_band == IEEE80211_BAND_5GHZ) {
if (test_bit(CONFIG_EXTERNAL_LNA_A, &rt2x00dev->flags)) {
if (lna == 3 || lna == 2)
offset += 10;
@@ -2084,7 +2084,7 @@ static int rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
/*
* Create channel information array
*/
- info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
+ info = kcalloc(spec->num_channels, sizeof(*info), GFP_KERNEL);
if (!info)
return -ENOMEM;
diff --git a/drivers/net/wireless/rtl818x/rtl8180_dev.c b/drivers/net/wireless/rtl818x/rtl8180_dev.c
index b50c39aaec05..9544eb1a23dc 100644
--- a/drivers/net/wireless/rtl818x/rtl8180_dev.c
+++ b/drivers/net/wireless/rtl818x/rtl8180_dev.c
@@ -99,19 +99,66 @@ void rtl8180_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data)
}
}
-static void rtl8180_handle_rx(struct ieee80211_hw *dev)
+static void rtl8180_handle_tx(struct ieee80211_hw *dev)
{
struct rtl8180_priv *priv = dev->priv;
- unsigned int count = 32;
+ struct rtl8180_tx_ring *ring;
+ int prio;
+
+ spin_lock(&priv->lock);
+
+ for (prio = 3; prio >= 0; prio--) {
+ ring = &priv->tx_ring[prio];
+
+ while (skb_queue_len(&ring->queue)) {
+ struct rtl8180_tx_desc *entry = &ring->desc[ring->idx];
+ struct sk_buff *skb;
+ struct ieee80211_tx_info *info;
+ u32 flags = le32_to_cpu(entry->flags);
+
+ if (flags & RTL818X_TX_DESC_FLAG_OWN)
+ break;
+
+ ring->idx = (ring->idx + 1) % ring->entries;
+ skb = __skb_dequeue(&ring->queue);
+ pci_unmap_single(priv->pdev, le32_to_cpu(entry->tx_buf),
+ skb->len, PCI_DMA_TODEVICE);
+
+ info = IEEE80211_SKB_CB(skb);
+ ieee80211_tx_info_clear_status(info);
+
+ if (!(info->flags & IEEE80211_TX_CTL_NO_ACK) &&
+ (flags & RTL818X_TX_DESC_FLAG_TX_OK))
+ info->flags |= IEEE80211_TX_STAT_ACK;
+
+ info->status.rates[0].count = (flags & 0xFF) + 1;
+ info->status.rates[1].idx = -1;
+
+ ieee80211_tx_status(dev, skb);
+ if (ring->entries - skb_queue_len(&ring->queue) == 2)
+ ieee80211_wake_queue(dev, prio);
+ }
+ }
+
+ spin_unlock(&priv->lock);
+}
+
+static int rtl8180_poll(struct ieee80211_hw *dev, int budget)
+{
+ struct rtl8180_priv *priv = dev->priv;
+ unsigned int count = 0;
u8 signal, agc, sq;
- while (count--) {
+ /* handle pending Tx queue cleanup */
+ rtl8180_handle_tx(dev);
+
+ while (count++ < budget) {
struct rtl8180_rx_desc *entry = &priv->rx_ring[priv->rx_idx];
struct sk_buff *skb = priv->rx_buf[priv->rx_idx];
u32 flags = le32_to_cpu(entry->flags);
if (flags & RTL818X_RX_DESC_FLAG_OWN)
- return;
+ break;
if (unlikely(flags & (RTL818X_RX_DESC_FLAG_DMA_FAIL |
RTL818X_RX_DESC_FLAG_FOF |
@@ -151,7 +198,7 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
rx_status.flag |= RX_FLAG_FAILED_FCS_CRC;
memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status));
- ieee80211_rx_irqsafe(dev, skb);
+ ieee80211_rx(dev, skb);
skb = new_skb;
priv->rx_buf[priv->rx_idx] = skb;
@@ -168,41 +215,16 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
entry->flags |= cpu_to_le32(RTL818X_RX_DESC_FLAG_EOR);
priv->rx_idx = (priv->rx_idx + 1) % 32;
}
-}
-static void rtl8180_handle_tx(struct ieee80211_hw *dev, unsigned int prio)
-{
- struct rtl8180_priv *priv = dev->priv;
- struct rtl8180_tx_ring *ring = &priv->tx_ring[prio];
+ if (count < budget) {
+ /* disable polling */
+ ieee80211_napi_complete(dev);
- while (skb_queue_len(&ring->queue)) {
- struct rtl8180_tx_desc *entry = &ring->desc[ring->idx];
- struct sk_buff *skb;
- struct ieee80211_tx_info *info;
- u32 flags = le32_to_cpu(entry->flags);
-
- if (flags & RTL818X_TX_DESC_FLAG_OWN)
- return;
-
- ring->idx = (ring->idx + 1) % ring->entries;
- skb = __skb_dequeue(&ring->queue);
- pci_unmap_single(priv->pdev, le32_to_cpu(entry->tx_buf),
- skb->len, PCI_DMA_TODEVICE);
-
- info = IEEE80211_SKB_CB(skb);
- ieee80211_tx_info_clear_status(info);
-
- if (!(info->flags & IEEE80211_TX_CTL_NO_ACK) &&
- (flags & RTL818X_TX_DESC_FLAG_TX_OK))
- info->flags |= IEEE80211_TX_STAT_ACK;
-
- info->status.rates[0].count = (flags & 0xFF) + 1;
- info->status.rates[1].idx = -1;
-
- ieee80211_tx_status_irqsafe(dev, skb);
- if (ring->entries - skb_queue_len(&ring->queue) == 2)
- ieee80211_wake_queue(dev, prio);
+ /* enable interrupts */
+ rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0xFFFF);
}
+
+ return count;
}
static irqreturn_t rtl8180_interrupt(int irq, void *dev_id)
@@ -211,31 +233,17 @@ static irqreturn_t rtl8180_interrupt(int irq, void *dev_id)
struct rtl8180_priv *priv = dev->priv;
u16 reg;
- spin_lock(&priv->lock);
reg = rtl818x_ioread16(priv, &priv->map->INT_STATUS);
- if (unlikely(reg == 0xFFFF)) {
- spin_unlock(&priv->lock);
+ if (unlikely(reg == 0xFFFF))
return IRQ_HANDLED;
- }
rtl818x_iowrite16(priv, &priv->map->INT_STATUS, reg);
- if (reg & (RTL818X_INT_TXB_OK | RTL818X_INT_TXB_ERR))
- rtl8180_handle_tx(dev, 3);
-
- if (reg & (RTL818X_INT_TXH_OK | RTL818X_INT_TXH_ERR))
- rtl8180_handle_tx(dev, 2);
-
- if (reg & (RTL818X_INT_TXN_OK | RTL818X_INT_TXN_ERR))
- rtl8180_handle_tx(dev, 1);
-
- if (reg & (RTL818X_INT_TXL_OK | RTL818X_INT_TXL_ERR))
- rtl8180_handle_tx(dev, 0);
-
- if (reg & (RTL818X_INT_RX_OK | RTL818X_INT_RX_ERR))
- rtl8180_handle_rx(dev);
+ /* disable interrupts */
+ rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0);
- spin_unlock(&priv->lock);
+ /* enable polling */
+ ieee80211_napi_schedule(dev);
return IRQ_HANDLED;
}
@@ -247,7 +255,6 @@ static int rtl8180_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
struct rtl8180_priv *priv = dev->priv;
struct rtl8180_tx_ring *ring;
struct rtl8180_tx_desc *entry;
- unsigned long flags;
unsigned int idx, prio;
dma_addr_t mapping;
u32 tx_flags;
@@ -294,7 +301,7 @@ static int rtl8180_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
plcp_len |= 1 << 15;
}
- spin_lock_irqsave(&priv->lock, flags);
+ spin_lock(&priv->lock);
if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
@@ -318,7 +325,7 @@ static int rtl8180_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
if (ring->entries - skb_queue_len(&ring->queue) < 2)
ieee80211_stop_queue(dev, prio);
- spin_unlock_irqrestore(&priv->lock, flags);
+ spin_unlock(&priv->lock);
rtl818x_iowrite8(priv, &priv->map->TX_DMA_POLLING, (1 << (prio + 4)));
@@ -783,6 +790,7 @@ static void rtl8180_bss_info_changed(struct ieee80211_hw *dev,
struct rtl8180_priv *priv = dev->priv;
struct rtl8180_vif *vif_priv;
int i;
+ u8 reg;
vif_priv = (struct rtl8180_vif *)&vif->drv_priv;
@@ -791,12 +799,14 @@ static void rtl8180_bss_info_changed(struct ieee80211_hw *dev,
rtl818x_iowrite8(priv, &priv->map->BSSID[i],
info->bssid[i]);
- if (is_valid_ether_addr(info->bssid))
- rtl818x_iowrite8(priv, &priv->map->MSR,
- RTL818X_MSR_INFRA);
- else
- rtl818x_iowrite8(priv, &priv->map->MSR,
- RTL818X_MSR_NO_LINK);
+ if (is_valid_ether_addr(info->bssid)) {
+ if (vif->type == NL80211_IFTYPE_ADHOC)
+ reg = RTL818X_MSR_ADHOC;
+ else
+ reg = RTL818X_MSR_INFRA;
+ } else
+ reg = RTL818X_MSR_NO_LINK;
+ rtl818x_iowrite8(priv, &priv->map->MSR, reg);
}
if (changed & BSS_CHANGED_ERP_SLOT && priv->rf->conf_erp)
@@ -861,6 +871,7 @@ static const struct ieee80211_ops rtl8180_ops = {
.prepare_multicast = rtl8180_prepare_multicast,
.configure_filter = rtl8180_configure_filter,
.get_tsf = rtl8180_get_tsf,
+ .napi_poll = rtl8180_poll,
};
static void rtl8180_eeprom_register_read(struct eeprom_93cx6 *eeprom)
@@ -992,6 +1003,8 @@ static int __devinit rtl8180_probe(struct pci_dev *pdev,
dev->queues = 1;
dev->max_signal = 65;
+ dev->napi_weight = 64;
+
reg = rtl818x_ioread32(priv, &priv->map->TX_CONF);
reg &= RTL818X_TX_CONF_HWVER_MASK;
switch (reg) {
diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c
index 5738a55c1b06..0801c1d7c8d4 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_dev.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c
@@ -1176,13 +1176,12 @@ static void rtl8187_bss_info_changed(struct ieee80211_hw *dev,
else
reg = 0;
- if (is_valid_ether_addr(info->bssid)) {
+ if (is_valid_ether_addr(info->bssid))
reg |= RTL818X_MSR_INFRA;
- rtl818x_iowrite8(priv, &priv->map->MSR, reg);
- } else {
+ else
reg |= RTL818X_MSR_NO_LINK;
- rtl818x_iowrite8(priv, &priv->map->MSR, reg);
- }
+
+ rtl818x_iowrite8(priv, &priv->map->MSR, reg);
mutex_unlock(&priv->conf_mutex);
}
diff --git a/drivers/net/wireless/wl12xx/wl1251_acx.c b/drivers/net/wireless/wl12xx/wl1251_acx.c
index 91891f928070..2f8a2ba744dc 100644
--- a/drivers/net/wireless/wl12xx/wl1251_acx.c
+++ b/drivers/net/wireless/wl12xx/wl1251_acx.c
@@ -380,7 +380,7 @@ int wl1251_acx_pd_threshold(struct wl1251 *wl)
out:
kfree(pd);
- return 0;
+ return ret;
}
int wl1251_acx_slot(struct wl1251 *wl, enum acx_slot_type slot_time)
diff --git a/drivers/net/wireless/wl12xx/wl1251_cmd.c b/drivers/net/wireless/wl12xx/wl1251_cmd.c
index a37b30cef489..15fb68c6b542 100644
--- a/drivers/net/wireless/wl12xx/wl1251_cmd.c
+++ b/drivers/net/wireless/wl12xx/wl1251_cmd.c
@@ -200,7 +200,7 @@ int wl1251_cmd_vbm(struct wl1251 *wl, u8 identity,
out:
kfree(vbm);
- return 0;
+ return ret;
}
int wl1251_cmd_data_path(struct wl1251 *wl, u8 channel, bool enable)
@@ -484,7 +484,7 @@ int wl1251_cmd_trigger_scan_to(struct wl1251 *wl, u32 timeout)
cmd->timeout = timeout;
- ret = wl1251_cmd_send(wl, CMD_SCAN, cmd, sizeof(*cmd));
+ ret = wl1251_cmd_send(wl, CMD_TRIGGER_SCAN_TO, cmd, sizeof(*cmd));
if (ret < 0) {
wl1251_error("cmd trigger scan to failed: %d", ret);
goto out;
diff --git a/drivers/net/wireless/wl12xx/wl1251_main.c b/drivers/net/wireless/wl12xx/wl1251_main.c
index 861a5f33761e..6d31c855fcfe 100644
--- a/drivers/net/wireless/wl12xx/wl1251_main.c
+++ b/drivers/net/wireless/wl12xx/wl1251_main.c
@@ -725,8 +725,9 @@ static int wl1251_set_key_type(struct wl1251 *wl,
struct ieee80211_key_conf *mac80211_key,
const u8 *addr)
{
- switch (mac80211_key->alg) {
- case ALG_WEP:
+ switch (mac80211_key->cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
if (is_broadcast_ether_addr(addr))
key->key_type = KEY_WEP_DEFAULT;
else
@@ -734,7 +735,7 @@ static int wl1251_set_key_type(struct wl1251 *wl,
mac80211_key->hw_key_idx = mac80211_key->keyidx;
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
if (is_broadcast_ether_addr(addr))
key->key_type = KEY_TKIP_MIC_GROUP;
else
@@ -742,7 +743,7 @@ static int wl1251_set_key_type(struct wl1251 *wl,
mac80211_key->hw_key_idx = mac80211_key->keyidx;
break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
if (is_broadcast_ether_addr(addr))
key->key_type = KEY_AES_GROUP;
else
@@ -750,7 +751,7 @@ static int wl1251_set_key_type(struct wl1251 *wl,
mac80211_key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
break;
default:
- wl1251_error("Unknown key algo 0x%x", mac80211_key->alg);
+ wl1251_error("Unknown key cipher 0x%x", mac80211_key->cipher);
return -EOPNOTSUPP;
}
@@ -783,7 +784,7 @@ static int wl1251_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
wl1251_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
wl1251_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
wl1251_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
- key->alg, key->keyidx, key->keylen, key->flags);
+ key->cipher, key->keyidx, key->keylen, key->flags);
wl1251_dump(DEBUG_CRYPT, "KEY: ", key->key, key->keylen);
if (is_zero_ether_addr(addr)) {
diff --git a/drivers/net/wireless/wl12xx/wl1251_tx.c b/drivers/net/wireless/wl12xx/wl1251_tx.c
index a38ec199187a..6634b3e27cfc 100644
--- a/drivers/net/wireless/wl12xx/wl1251_tx.c
+++ b/drivers/net/wireless/wl12xx/wl1251_tx.c
@@ -189,7 +189,7 @@ static int wl1251_tx_send_packet(struct wl1251 *wl, struct sk_buff *skb,
tx_hdr = (struct tx_double_buffer_desc *) skb->data;
if (control->control.hw_key &&
- control->control.hw_key->alg == ALG_TKIP) {
+ control->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
int hdrlen;
__le16 fc;
u16 length;
@@ -399,7 +399,7 @@ static void wl1251_tx_packet_cb(struct wl1251 *wl,
*/
frame = skb_pull(skb, sizeof(struct tx_double_buffer_desc));
if (info->control.hw_key &&
- info->control.hw_key->alg == ALG_TKIP) {
+ info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
hdrlen = ieee80211_get_hdrlen_from_skb(skb);
memmove(frame + WL1251_TKIP_IV_SPACE, frame, hdrlen);
skb_pull(skb, WL1251_TKIP_IV_SPACE);
diff --git a/drivers/net/wireless/wl12xx/wl1271_acx.c b/drivers/net/wireless/wl12xx/wl1271_acx.c
index bb245f05af49..f03ad088db8b 100644
--- a/drivers/net/wireless/wl12xx/wl1271_acx.c
+++ b/drivers/net/wireless/wl12xx/wl1271_acx.c
@@ -269,7 +269,7 @@ int wl1271_acx_pd_threshold(struct wl1271 *wl)
out:
kfree(pd);
- return 0;
+ return ret;
}
int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time)
diff --git a/drivers/net/wireless/wl12xx/wl1271_main.c b/drivers/net/wireless/wl12xx/wl1271_main.c
index 9d68f0012f05..30194c0f36a9 100644
--- a/drivers/net/wireless/wl12xx/wl1271_main.c
+++ b/drivers/net/wireless/wl12xx/wl1271_main.c
@@ -1439,7 +1439,7 @@ static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
wl1271_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
- key_conf->alg, key_conf->keyidx,
+ key_conf->cipher, key_conf->keyidx,
key_conf->keylen, key_conf->flags);
wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
@@ -1455,20 +1455,21 @@ static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
if (ret < 0)
goto out_unlock;
- switch (key_conf->alg) {
- case ALG_WEP:
+ switch (key_conf->cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
key_type = KEY_WEP;
key_conf->hw_key_idx = key_conf->keyidx;
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
key_type = KEY_TKIP;
key_conf->hw_key_idx = key_conf->keyidx;
tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
key_type = KEY_AES;
key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
@@ -1476,7 +1477,7 @@ static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
break;
default:
- wl1271_error("Unknown key algo 0x%x", key_conf->alg);
+ wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
ret = -EOPNOTSUPP;
goto out_sleep;
diff --git a/drivers/net/wireless/wl12xx/wl1271_scan.c b/drivers/net/wireless/wl12xx/wl1271_scan.c
index fec43eed8c55..30dc1000f563 100644
--- a/drivers/net/wireless/wl12xx/wl1271_scan.c
+++ b/drivers/net/wireless/wl12xx/wl1271_scan.c
@@ -248,7 +248,7 @@ int wl1271_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len,
wl->scan.req = req;
- wl->scan.scanned_ch = kzalloc(req->n_channels *
+ wl->scan.scanned_ch = kcalloc(req->n_channels,
sizeof(*wl->scan.scanned_ch),
GFP_KERNEL);
wl1271_scan_stm(wl);
diff --git a/drivers/net/wireless/wl12xx/wl1271_tx.c b/drivers/net/wireless/wl12xx/wl1271_tx.c
index c592cc2e9fe8..dc0b46c93c4b 100644
--- a/drivers/net/wireless/wl12xx/wl1271_tx.c
+++ b/drivers/net/wireless/wl12xx/wl1271_tx.c
@@ -193,7 +193,7 @@ static int wl1271_tx_frame(struct wl1271 *wl, struct sk_buff *skb)
info = IEEE80211_SKB_CB(skb);
if (info->control.hw_key &&
- info->control.hw_key->alg == ALG_TKIP)
+ info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
extra = WL1271_TKIP_IV_SPACE;
if (info->control.hw_key) {
@@ -347,7 +347,7 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
/* remove TKIP header space if present */
if (info->control.hw_key &&
- info->control.hw_key->alg == ALG_TKIP) {
+ info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
memmove(skb->data + WL1271_TKIP_IV_SPACE, skb->data, hdrlen);
skb_pull(skb, WL1271_TKIP_IV_SPACE);
diff --git a/drivers/net/wireless/wl3501_cs.c b/drivers/net/wireless/wl3501_cs.c
index a1cc2d498a1c..420e9e986a18 100644
--- a/drivers/net/wireless/wl3501_cs.c
+++ b/drivers/net/wireless/wl3501_cs.c
@@ -29,7 +29,6 @@
#include <linux/delay.h>
#include <linux/types.h>
-#include <linux/ethtool.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/in.h>
@@ -1411,15 +1410,6 @@ static struct iw_statistics *wl3501_get_wireless_stats(struct net_device *dev)
return wstats;
}
-static void wl3501_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
-{
- strlcpy(info->driver, "wl3501_cs", sizeof(info->driver));
-}
-
-static const struct ethtool_ops ops = {
- .get_drvinfo = wl3501_get_drvinfo
-};
-
/**
* wl3501_detach - deletes a driver "instance"
* @link - FILL_IN
@@ -1905,7 +1895,6 @@ static int wl3501_probe(struct pcmcia_device *p_dev)
this->p_dev = p_dev;
dev->wireless_data = &this->wireless_data;
dev->wireless_handlers = &wl3501_handler_def;
- SET_ETHTOOL_OPS(dev, &ops);
netif_stop_queue(dev);
p_dev->priv = dev;
diff --git a/drivers/net/wireless/zd1211rw/zd_chip.c b/drivers/net/wireless/zd1211rw/zd_chip.c
index b2af3c549bb3..87a95bcfee57 100644
--- a/drivers/net/wireless/zd1211rw/zd_chip.c
+++ b/drivers/net/wireless/zd1211rw/zd_chip.c
@@ -973,6 +973,7 @@ static void dump_fw_registers(struct zd_chip *chip)
static int print_fw_version(struct zd_chip *chip)
{
+ struct wiphy *wiphy = zd_chip_to_mac(chip)->hw->wiphy;
int r;
u16 version;
@@ -982,6 +983,10 @@ static int print_fw_version(struct zd_chip *chip)
return r;
dev_info(zd_chip_dev(chip),"firmware version %04hx\n", version);
+
+ snprintf(wiphy->fw_version, sizeof(wiphy->fw_version),
+ "%04hx", version);
+
return 0;
}
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 7fa3cbd742c5..cc232c016ef9 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -2689,7 +2689,7 @@ int pcie_get_readrq(struct pci_dev *dev)
ret = pci_read_config_word(dev, cap + PCI_EXP_DEVCTL, &ctl);
if (!ret)
- ret = 128 << ((ctl & PCI_EXP_DEVCTL_READRQ) >> 12);
+ ret = 128 << ((ctl & PCI_EXP_DEVCTL_READRQ) >> 12);
return ret;
}
diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c
index 01f0306525a5..297b72c880a1 100644
--- a/drivers/pci/proc.c
+++ b/drivers/pci/proc.c
@@ -212,8 +212,6 @@ static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd,
#endif /* HAVE_PCI_MMAP */
int ret = 0;
- lock_kernel();
-
switch (cmd) {
case PCIIOC_CONTROLLER:
ret = pci_domain_nr(dev->bus);
@@ -242,7 +240,6 @@ static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd,
break;
};
- unlock_kernel();
return ret;
}
@@ -306,6 +303,7 @@ static const struct file_operations proc_bus_pci_operations = {
.read = proc_bus_pci_read,
.write = proc_bus_pci_write,
.unlocked_ioctl = proc_bus_pci_ioctl,
+ .compat_ioctl = proc_bus_pci_ioctl,
#ifdef HAVE_PCI_MMAP
.open = proc_bus_pci_open,
.release = proc_bus_pci_release,
diff --git a/drivers/regulator/ab8500.c b/drivers/regulator/ab8500.c
index dc3f1a491675..cc7cbafc5b94 100644
--- a/drivers/regulator/ab8500.c
+++ b/drivers/regulator/ab8500.c
@@ -344,13 +344,14 @@ static inline struct ab8500_regulator_info *find_regulator_info(int id)
static __devinit int ab8500_regulator_probe(struct platform_device *pdev)
{
struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
- struct ab8500_platform_data *pdata = dev_get_platdata(ab8500->dev);
+ struct ab8500_platform_data *pdata;
int i, err;
if (!ab8500) {
dev_err(&pdev->dev, "null mfd parent\n");
return -EINVAL;
}
+ pdata = dev_get_platdata(ab8500->dev);
/* register all regulators */
for (i = 0; i < ARRAY_SIZE(ab8500_regulator_info); i++) {
diff --git a/drivers/rtc/rtc-nuc900.c b/drivers/rtc/rtc-nuc900.c
index 62de66af0a68..ddb0857e15a4 100644
--- a/drivers/rtc/rtc-nuc900.c
+++ b/drivers/rtc/rtc-nuc900.c
@@ -274,7 +274,7 @@ static int __devinit nuc900_rtc_probe(struct platform_device *pdev)
nuc900_rtc->rtcdev = rtc_device_register(pdev->name, &pdev->dev,
&nuc900_rtc_ops, THIS_MODULE);
if (IS_ERR(nuc900_rtc->rtcdev)) {
- dev_err(&pdev->dev, "rtc device register faild\n");
+ dev_err(&pdev->dev, "rtc device register failed\n");
err = PTR_ERR(nuc900_rtc->rtcdev);
goto fail3;
}
diff --git a/drivers/s390/block/dasd_3990_erp.c b/drivers/s390/block/dasd_3990_erp.c
index 85bfd8794856..e82d427ff5eb 100644
--- a/drivers/s390/block/dasd_3990_erp.c
+++ b/drivers/s390/block/dasd_3990_erp.c
@@ -2197,7 +2197,7 @@ dasd_3990_erp_inspect_32(struct dasd_ccw_req * erp, char *sense)
/*
*****************************************************************************
- * main ERP control fuctions (24 and 32 byte sense)
+ * main ERP control functions (24 and 32 byte sense)
*****************************************************************************
*/
diff --git a/drivers/s390/char/tape_3590.c b/drivers/s390/char/tape_3590.c
index fc993acf99b6..deff2c3361e4 100644
--- a/drivers/s390/char/tape_3590.c
+++ b/drivers/s390/char/tape_3590.c
@@ -31,7 +31,7 @@ debug_info_t *TAPE_DBF_AREA = NULL;
EXPORT_SYMBOL(TAPE_DBF_AREA);
/*******************************************************************
- * Error Recovery fuctions:
+ * Error Recovery functions:
* - Read Opposite: implemented
* - Read Device (buffered) log: BRA
* - Read Library log: BRA
@@ -798,7 +798,7 @@ tape_3590_done(struct tape_device *device, struct tape_request *request)
}
/*
- * This fuction is called, when error recovery was successfull
+ * This function is called, when error recovery was successful
*/
static inline int
tape_3590_erp_succeded(struct tape_device *device, struct tape_request *request)
@@ -809,7 +809,7 @@ tape_3590_erp_succeded(struct tape_device *device, struct tape_request *request)
}
/*
- * This fuction is called, when error recovery was not successfull
+ * This function is called, when error recovery was not successful
*/
static inline int
tape_3590_erp_failed(struct tape_device *device, struct tape_request *request,
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
index 1f62ea8c165d..ddd8c8096eea 100644
--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
+++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
@@ -5507,7 +5507,7 @@ lpfc_get_rec_conf23(uint8_t *buff, uint32_t size, uint8_t rec_type)
* @buff: Buffer containing config region 23 data.
* @size: Size of the data buffer.
*
- * This fuction parse the FCoE config parameters in config region 23 and
+ * This function parses the FCoE config parameters in config region 23 and
* populate driver data structure with the parameters.
*/
void
diff --git a/drivers/serial/8250_early.c b/drivers/serial/8250_early.c
index b745792ec25a..eaafb98debed 100644
--- a/drivers/serial/8250_early.c
+++ b/drivers/serial/8250_early.c
@@ -203,13 +203,13 @@ static int __init parse_options(struct early_serial8250_device *device,
if (mmio || mmio32)
printk(KERN_INFO
- "Early serial console at MMIO%s 0x%llu (options '%s')\n",
+ "Early serial console at MMIO%s 0x%llx (options '%s')\n",
mmio32 ? "32" : "",
(unsigned long long)port->mapbase,
device->options);
else
printk(KERN_INFO
- "Early serial console at I/O port 0x%lu (options '%s')\n",
+ "Early serial console at I/O port 0x%lx (options '%s')\n",
port->iobase,
device->options);
diff --git a/drivers/serial/kgdboc.c b/drivers/serial/kgdboc.c
index 39f9a1adaa75..62b6edc54754 100644
--- a/drivers/serial/kgdboc.c
+++ b/drivers/serial/kgdboc.c
@@ -18,6 +18,7 @@
#include <linux/tty.h>
#include <linux/console.h>
#include <linux/vt_kern.h>
+#include <linux/kbd_kern.h>
#define MAX_CONFIG_LEN 40
@@ -37,12 +38,16 @@ static struct tty_driver *kgdb_tty_driver;
static int kgdb_tty_line;
#ifdef CONFIG_KDB_KEYBOARD
+static bool kgdboc_use_kbd;
+
static int kgdboc_register_kbd(char **cptr)
{
+ kgdboc_use_kbd = false;
if (strncmp(*cptr, "kbd", 3) == 0) {
if (kdb_poll_idx < KDB_POLL_FUNC_MAX) {
kdb_poll_funcs[kdb_poll_idx] = kdb_get_kbd_char;
kdb_poll_idx++;
+ kgdboc_use_kbd = true;
if (cptr[0][3] == ',')
*cptr += 4;
else
@@ -65,9 +70,16 @@ static void kgdboc_unregister_kbd(void)
}
}
}
+
+static inline void kgdboc_clear_kbd(void)
+{
+ if (kgdboc_use_kbd)
+ kbd_dbg_clear_keys(); /* Release all pressed keys */
+}
#else /* ! CONFIG_KDB_KEYBOARD */
#define kgdboc_register_kbd(x) 0
#define kgdboc_unregister_kbd()
+#define kgdboc_clear_kbd()
#endif /* ! CONFIG_KDB_KEYBOARD */
static int kgdboc_option_setup(char *opt)
@@ -231,6 +243,7 @@ static void kgdboc_post_exp_handler(void)
dbg_restore_graphics = 0;
con_debug_leave();
}
+ kgdboc_clear_kbd();
}
static struct kgdb_io kgdboc_io_ops = {
diff --git a/drivers/serial/sh-sci.h b/drivers/serial/sh-sci.h
index 9b52f77a9305..d2352ac437c5 100644
--- a/drivers/serial/sh-sci.h
+++ b/drivers/serial/sh-sci.h
@@ -140,7 +140,15 @@
# define SCSPTR0 0xffe00024 /* 16 bit SCIF */
# define SCSPTR1 0xffe10024 /* 16 bit SCIF */
# define SCIF_ORER 0x0001 /* Overrun error bit */
-# define SCSCR_INIT(port) 0x3a /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
+
+#if defined(CONFIG_SH_SH2007)
+/* TIE=0,RIE=0,TE=1,RE=1,REIE=1,CKE1=0 */
+# define SCSCR_INIT(port) 0x38
+#else
+/* TIE=0,RIE=0,TE=1,RE=1,REIE=1,CKE1=1 */
+# define SCSCR_INIT(port) 0x3a
+#endif
+
#elif defined(CONFIG_CPU_SUBTYPE_SH7785) || \
defined(CONFIG_CPU_SUBTYPE_SH7786)
# define SCSPTR0 0xffea0024 /* 16 bit SCIF */
@@ -616,9 +624,10 @@ static inline int sci_rxd_in(struct uart_port *port)
* -- Mitch Davis - 15 Jul 2000
*/
-#if defined(CONFIG_CPU_SUBTYPE_SH7780) || \
- defined(CONFIG_CPU_SUBTYPE_SH7785) || \
- defined(CONFIG_CPU_SUBTYPE_SH7786)
+#if (defined(CONFIG_CPU_SUBTYPE_SH7780) || \
+ defined(CONFIG_CPU_SUBTYPE_SH7785) || \
+ defined(CONFIG_CPU_SUBTYPE_SH7786)) && \
+ !defined(CONFIG_SH_SH2007)
#define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(16*bps)-1)
#elif defined(CONFIG_CPU_SUBTYPE_SH7705) || \
defined(CONFIG_CPU_SUBTYPE_SH7720) || \
diff --git a/drivers/serial/suncore.c b/drivers/serial/suncore.c
index 544f2e25d0e5..6381a0282ee7 100644
--- a/drivers/serial/suncore.c
+++ b/drivers/serial/suncore.c
@@ -55,7 +55,12 @@ EXPORT_SYMBOL(sunserial_unregister_minors);
int sunserial_console_match(struct console *con, struct device_node *dp,
struct uart_driver *drv, int line, bool ignore_line)
{
- if (!con || of_console_device != dp)
+ if (!con)
+ return 0;
+
+ drv->cons = con;
+
+ if (of_console_device != dp)
return 0;
if (!ignore_line) {
@@ -69,12 +74,10 @@ int sunserial_console_match(struct console *con, struct device_node *dp,
return 0;
}
- con->index = line;
- drv->cons = con;
-
- if (!console_set_on_cmdline)
+ if (!console_set_on_cmdline) {
+ con->index = line;
add_preferred_console(con->name, line, NULL);
-
+ }
return 1;
}
EXPORT_SYMBOL(sunserial_console_match);
diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c
index 9b03d7b3e456..c0fae0da6ec7 100644
--- a/drivers/serial/uartlite.c
+++ b/drivers/serial/uartlite.c
@@ -322,6 +322,26 @@ static int ulite_verify_port(struct uart_port *port, struct serial_struct *ser)
return -EINVAL;
}
+#ifdef CONFIG_CONSOLE_POLL
+static int ulite_get_poll_char(struct uart_port *port)
+{
+ while (!(ioread32be(port->membase + ULITE_STATUS)
+ & ULITE_STATUS_RXVALID))
+ return NO_POLL_CHAR;
+
+ return ioread32be(port->membase + ULITE_RX);
+}
+
+static void ulite_put_poll_char(struct uart_port *port, unsigned char ch)
+{
+ while (ioread32be(port->membase + ULITE_STATUS) & ULITE_STATUS_TXFULL)
+ cpu_relax();
+
+ /* write char to device */
+ iowrite32be(ch, port->membase + ULITE_TX);
+}
+#endif
+
static struct uart_ops ulite_ops = {
.tx_empty = ulite_tx_empty,
.set_mctrl = ulite_set_mctrl,
@@ -338,7 +358,11 @@ static struct uart_ops ulite_ops = {
.release_port = ulite_release_port,
.request_port = ulite_request_port,
.config_port = ulite_config_port,
- .verify_port = ulite_verify_port
+ .verify_port = ulite_verify_port,
+#ifdef CONFIG_CONSOLE_POLL
+ .poll_get_char = ulite_get_poll_char,
+ .poll_put_char = ulite_put_poll_char,
+#endif
};
/* ---------------------------------------------------------------------
diff --git a/drivers/sh/clk.c b/drivers/sh/clk.c
index 5d84adac9ec4..cede14e34507 100644
--- a/drivers/sh/clk.c
+++ b/drivers/sh/clk.c
@@ -73,22 +73,14 @@ long clk_rate_table_round(struct clk *clk,
{
unsigned long rate_error, rate_error_prev = ~0UL;
unsigned long rate_best_fit = rate;
- unsigned long highest, lowest;
int i;
- highest = lowest = 0;
-
for (i = 0; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
unsigned long freq = freq_table[i].frequency;
if (freq == CPUFREQ_ENTRY_INVALID)
continue;
- if (freq > highest)
- highest = freq;
- if (freq < lowest)
- lowest = freq;
-
rate_error = abs(freq - rate);
if (rate_error < rate_error_prev) {
rate_best_fit = freq;
@@ -99,11 +91,6 @@ long clk_rate_table_round(struct clk *clk,
break;
}
- if (rate >= highest)
- rate_best_fit = highest;
- if (rate <= lowest)
- rate_best_fit = lowest;
-
return rate_best_fit;
}
@@ -354,10 +341,10 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
ret = clk_reparent(clk, parent);
if (ret == 0) {
- pr_debug("clock: set parent of %s to %s (new rate %ld)\n",
- clk->name, clk->parent->name, clk->rate);
if (clk->ops->recalc)
clk->rate = clk->ops->recalc(clk);
+ pr_debug("clock: set parent of %s to %s (new rate %ld)\n",
+ clk->name, clk->parent->name, clk->rate);
propagate_rate(clk);
}
} else
diff --git a/drivers/spi/coldfire_qspi.c b/drivers/spi/coldfire_qspi.c
index 59be3efe0636..052b3c7fa6a0 100644
--- a/drivers/spi/coldfire_qspi.c
+++ b/drivers/spi/coldfire_qspi.c
@@ -24,6 +24,7 @@
#include <linux/interrupt.h>
#include <linux/errno.h>
#include <linux/platform_device.h>
+#include <linux/sched.h>
#include <linux/workqueue.h>
#include <linux/delay.h>
#include <linux/io.h>
diff --git a/drivers/staging/spectra/ffsport.c b/drivers/staging/spectra/ffsport.c
index d0c5c97eda3e..44a7fbe7eccd 100644
--- a/drivers/staging/spectra/ffsport.c
+++ b/drivers/staging/spectra/ffsport.c
@@ -27,6 +27,7 @@
#include <linux/kthread.h>
#include <linux/log2.h>
#include <linux/init.h>
+#include <linux/smp_lock.h>
/**** Helper functions used for Div, Remainder operation on u64 ****/
@@ -113,7 +114,6 @@ u64 GLOB_u64_Remainder(u64 addr, u32 divisor_type)
#define GLOB_SBD_NAME "nd"
#define GLOB_SBD_IRQ_NUM (29)
-#define GLOB_VERSION "driver version 20091110"
#define GLOB_SBD_IOCTL_GC (0x7701)
#define GLOB_SBD_IOCTL_WL (0x7702)
@@ -272,13 +272,6 @@ static int get_res_blk_num_os(void)
return res_blks;
}
-static void SBD_prepare_flush(struct request_queue *q, struct request *rq)
-{
- rq->cmd_type = REQ_TYPE_LINUX_BLOCK;
- /* rq->timeout = 5 * HZ; */
- rq->cmd[0] = REQ_LB_OP_FLUSH;
-}
-
/* Transfer a full request. */
static int do_transfer(struct spectra_nand_dev *tr, struct request *req)
{
@@ -296,8 +289,7 @@ static int do_transfer(struct spectra_nand_dev *tr, struct request *req)
IdentifyDeviceData.PagesPerBlock *
res_blks_os;
- if (req->cmd_type == REQ_TYPE_LINUX_BLOCK &&
- req->cmd[0] == REQ_LB_OP_FLUSH) {
+ if (req->cmd_type & REQ_FLUSH) {
if (force_flush_cache()) /* Fail to flush cache */
return -EIO;
else
@@ -597,11 +589,23 @@ int GLOB_SBD_ioctl(struct block_device *bdev, fmode_t mode,
return -ENOTTY;
}
+int GLOB_SBD_unlocked_ioctl(struct block_device *bdev, fmode_t mode,
+ unsigned int cmd, unsigned long arg)
+{
+ int ret;
+
+ lock_kernel();
+ ret = GLOB_SBD_ioctl(bdev, mode, cmd, arg);
+ unlock_kernel();
+
+ return ret;
+}
+
static struct block_device_operations GLOB_SBD_ops = {
.owner = THIS_MODULE,
.open = GLOB_SBD_open,
.release = GLOB_SBD_release,
- .locked_ioctl = GLOB_SBD_ioctl,
+ .ioctl = GLOB_SBD_unlocked_ioctl,
.getgeo = GLOB_SBD_getgeo,
};
@@ -650,8 +654,7 @@ static int SBD_setup_device(struct spectra_nand_dev *dev, int which)
/* Here we force report 512 byte hardware sector size to Kernel */
blk_queue_logical_block_size(dev->queue, 512);
- blk_queue_ordered(dev->queue, QUEUE_ORDERED_DRAIN_FLUSH,
- SBD_prepare_flush);
+ blk_queue_ordered(dev->queue, QUEUE_ORDERED_DRAIN_FLUSH);
dev->thread = kthread_run(spectra_trans_thread, dev, "nand_thd");
if (IS_ERR(dev->thread)) {
diff --git a/drivers/staging/spectra/flash.c b/drivers/staging/spectra/flash.c
index 134aa5166a8d..9b5218b6ada8 100644
--- a/drivers/staging/spectra/flash.c
+++ b/drivers/staging/spectra/flash.c
@@ -61,7 +61,6 @@ static void FTL_Cache_Read_Page(u8 *pData, u64 dwPageAddr,
static void FTL_Cache_Write_Page(u8 *pData, u64 dwPageAddr,
u8 cache_blk, u16 flag);
static int FTL_Cache_Write(void);
-static int FTL_Cache_Write_Back(u8 *pData, u64 blk_addr);
static void FTL_Calculate_LRU(void);
static u32 FTL_Get_Block_Index(u32 wBlockNum);
@@ -86,8 +85,6 @@ static u32 FTL_Replace_MWBlock(void);
static int FTL_Replace_Block(u64 blk_addr);
static int FTL_Adjust_Relative_Erase_Count(u32 Index_of_MAX);
-static int FTL_Flash_Error_Handle(u8 *pData, u64 old_page_addr, u64 blk_addr);
-
struct device_info_tag DeviceInfo;
struct flash_cache_tag Cache;
static struct spectra_l2_cache_info cache_l2;
@@ -775,7 +772,7 @@ static void dump_cache_l2_table(void)
{
struct list_head *p;
struct spectra_l2_cache_list *pnd;
- int n, i;
+ int n;
n = 0;
list_for_each(p, &cache_l2.table.list) {
@@ -1538,79 +1535,6 @@ static int FTL_Cache_Write_All(u8 *pData, u64 blk_addr)
}
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
-* Function: FTL_Cache_Update_Block
-* Inputs: pointer to buffer,page address,block address
-* Outputs: PASS=0 / FAIL=1
-* Description: It updates the cache
-*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
-static int FTL_Cache_Update_Block(u8 *pData,
- u64 old_page_addr, u64 blk_addr)
-{
- int i, j;
- u8 *buf = pData;
- int wResult = PASS;
- int wFoundInCache;
- u64 page_addr;
- u64 addr;
- u64 old_blk_addr;
- u16 page_offset;
-
- nand_dbg_print(NAND_DBG_TRACE, "%s, Line %d, Function: %s\n",
- __FILE__, __LINE__, __func__);
-
- old_blk_addr = (u64)(old_page_addr >>
- DeviceInfo.nBitsInBlockDataSize) * DeviceInfo.wBlockDataSize;
- page_offset = (u16)(GLOB_u64_Remainder(old_page_addr, 2) >>
- DeviceInfo.nBitsInPageDataSize);
-
- for (i = 0; i < DeviceInfo.wPagesPerBlock; i += Cache.pages_per_item) {
- page_addr = old_blk_addr + i * DeviceInfo.wPageDataSize;
- if (i != page_offset) {
- wFoundInCache = FAIL;
- for (j = 0; j < CACHE_ITEM_NUM; j++) {
- addr = Cache.array[j].address;
- addr = FTL_Get_Physical_Block_Addr(addr) +
- GLOB_u64_Remainder(addr, 2);
- if ((addr >= page_addr) && addr <
- (page_addr + Cache.cache_item_size)) {
- wFoundInCache = PASS;
- buf = Cache.array[j].buf;
- Cache.array[j].changed = SET;
-#if CMD_DMA
-#if RESTORE_CACHE_ON_CDMA_CHAIN_FAILURE
- int_cache[ftl_cmd_cnt].item = j;
- int_cache[ftl_cmd_cnt].cache.address =
- Cache.array[j].address;
- int_cache[ftl_cmd_cnt].cache.changed =
- Cache.array[j].changed;
-#endif
-#endif
- break;
- }
- }
- if (FAIL == wFoundInCache) {
- if (ERR == FTL_Cache_Read_All(g_pTempBuf,
- page_addr)) {
- wResult = FAIL;
- break;
- }
- buf = g_pTempBuf;
- }
- } else {
- buf = pData;
- }
-
- if (FAIL == FTL_Cache_Write_All(buf,
- blk_addr + (page_addr - old_blk_addr))) {
- wResult = FAIL;
- break;
- }
- }
-
- return wResult;
-}
-
-/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
* Function: FTL_Copy_Block
* Inputs: source block address
* Destination block address
@@ -1698,7 +1622,7 @@ static int get_l2_cache_blks(void)
static int erase_l2_cache_blocks(void)
{
int i, ret = PASS;
- u32 pblk, lblk;
+ u32 pblk, lblk = BAD_BLOCK;
u64 addr;
u32 *pbt = (u32 *)g_pBlockTable;
@@ -2004,87 +1928,6 @@ static int search_l2_cache(u8 *buf, u64 logical_addr)
return ret;
}
-/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
-* Function: FTL_Cache_Write_Back
-* Inputs: pointer to data cached in sys memory
-* address of free block in flash
-* Outputs: PASS=0 / FAIL=1
-* Description: writes all the pages of Cache Block to flash
-*
-*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
-static int FTL_Cache_Write_Back(u8 *pData, u64 blk_addr)
-{
- int i, j, iErase;
- u64 old_page_addr, addr, phy_addr;
- u32 *pbt = (u32 *)g_pBlockTable;
- u32 lba;
-
- nand_dbg_print(NAND_DBG_TRACE, "%s, Line %d, Function: %s\n",
- __FILE__, __LINE__, __func__);
-
- old_page_addr = FTL_Get_Physical_Block_Addr(blk_addr) +
- GLOB_u64_Remainder(blk_addr, 2);
-
- iErase = (FAIL == FTL_Replace_Block(blk_addr)) ? PASS : FAIL;
-
- pbt[BLK_FROM_ADDR(blk_addr)] &= (~SPARE_BLOCK);
-
-#if CMD_DMA
- p_BTableChangesDelta = (struct BTableChangesDelta *)g_pBTDelta_Free;
- g_pBTDelta_Free += sizeof(struct BTableChangesDelta);
-
- p_BTableChangesDelta->ftl_cmd_cnt = ftl_cmd_cnt;
- p_BTableChangesDelta->BT_Index = (u32)(blk_addr >>
- DeviceInfo.nBitsInBlockDataSize);
- p_BTableChangesDelta->BT_Entry_Value =
- pbt[(u32)(blk_addr >> DeviceInfo.nBitsInBlockDataSize)];
- p_BTableChangesDelta->ValidFields = 0x0C;
-#endif
-
- if (IN_PROGRESS_BLOCK_TABLE != g_cBlockTableStatus) {
- g_cBlockTableStatus = IN_PROGRESS_BLOCK_TABLE;
- FTL_Write_IN_Progress_Block_Table_Page();
- }
-
- for (i = 0; i < RETRY_TIMES; i++) {
- if (PASS == iErase) {
- phy_addr = FTL_Get_Physical_Block_Addr(blk_addr);
- if (FAIL == GLOB_FTL_Block_Erase(phy_addr)) {
- lba = BLK_FROM_ADDR(blk_addr);
- MARK_BLOCK_AS_BAD(pbt[lba]);
- i = RETRY_TIMES;
- break;
- }
- }
-
- for (j = 0; j < CACHE_ITEM_NUM; j++) {
- addr = Cache.array[j].address;
- if ((addr <= blk_addr) &&
- ((addr + Cache.cache_item_size) > blk_addr))
- cache_block_to_write = j;
- }
-
- phy_addr = FTL_Get_Physical_Block_Addr(blk_addr);
- if (PASS == FTL_Cache_Update_Block(pData,
- old_page_addr, phy_addr)) {
- cache_block_to_write = UNHIT_CACHE_ITEM;
- break;
- } else {
- iErase = PASS;
- }
- }
-
- if (i >= RETRY_TIMES) {
- if (ERR == FTL_Flash_Error_Handle(pData,
- old_page_addr, blk_addr))
- return ERR;
- else
- return FAIL;
- }
-
- return PASS;
-}
-
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
* Function: FTL_Cache_Write_Page
* Inputs: Pointer to buffer, page address, cache block number
@@ -2370,159 +2213,6 @@ static int FTL_Write_Block_Table(int wForce)
return 1;
}
-/******************************************************************
-* Function: GLOB_FTL_Flash_Format
-* Inputs: none
-* Outputs: PASS
-* Description: The block table stores bad block info, including MDF+
-* blocks gone bad over the ages. Therefore, if we have a
-* block table in place, then use it to scan for bad blocks
-* If not, then scan for MDF.
-* Now, a block table will only be found if spectra was already
-* being used. For a fresh flash, we'll go thru scanning for
-* MDF. If spectra was being used, then there is a chance that
-* the MDF has been corrupted. Spectra avoids writing to the
-* first 2 bytes of the spare area to all pages in a block. This
-* covers all known flash devices. However, since flash
-* manufacturers have no standard of where the MDF is stored,
-* this cannot guarantee that the MDF is protected for future
-* devices too. The initial scanning for the block table assures
-* this. It is ok even if the block table is outdated, as all
-* we're looking for are bad block markers.
-* Use this when mounting a file system or starting a
-* new flash.
-*
-*********************************************************************/
-static int FTL_Format_Flash(u8 valid_block_table)
-{
- u32 i, j;
- u32 *pbt = (u32 *)g_pBlockTable;
- u32 tempNode;
- int ret;
-
-#if CMD_DMA
- u32 *pbtStartingCopy = (u32 *)g_pBTStartingCopy;
- if (ftl_cmd_cnt)
- return FAIL;
-#endif
-
- if (FAIL == FTL_Check_Block_Table(FAIL))
- valid_block_table = 0;
-
- if (valid_block_table) {
- u8 switched = 1;
- u32 block, k;
-
- k = DeviceInfo.wSpectraStartBlock;
- while (switched && (k < DeviceInfo.wSpectraEndBlock)) {
- switched = 0;
- k++;
- for (j = DeviceInfo.wSpectraStartBlock, i = 0;
- j <= DeviceInfo.wSpectraEndBlock;
- j++, i++) {
- block = (pbt[i] & ~BAD_BLOCK) -
- DeviceInfo.wSpectraStartBlock;
- if (block != i) {
- switched = 1;
- tempNode = pbt[i];
- pbt[i] = pbt[block];
- pbt[block] = tempNode;
- }
- }
- }
- if ((k == DeviceInfo.wSpectraEndBlock) && switched)
- valid_block_table = 0;
- }
-
- if (!valid_block_table) {
- memset(g_pBlockTable, 0,
- DeviceInfo.wDataBlockNum * sizeof(u32));
- memset(g_pWearCounter, 0,
- DeviceInfo.wDataBlockNum * sizeof(u8));
- if (DeviceInfo.MLCDevice)
- memset(g_pReadCounter, 0,
- DeviceInfo.wDataBlockNum * sizeof(u16));
-#if CMD_DMA
- memset(g_pBTStartingCopy, 0,
- DeviceInfo.wDataBlockNum * sizeof(u32));
- memset(g_pWearCounterCopy, 0,
- DeviceInfo.wDataBlockNum * sizeof(u8));
- if (DeviceInfo.MLCDevice)
- memset(g_pReadCounterCopy, 0,
- DeviceInfo.wDataBlockNum * sizeof(u16));
-#endif
- for (j = DeviceInfo.wSpectraStartBlock, i = 0;
- j <= DeviceInfo.wSpectraEndBlock;
- j++, i++) {
- if (GLOB_LLD_Get_Bad_Block((u32)j))
- pbt[i] = (u32)(BAD_BLOCK | j);
- }
- }
-
- nand_dbg_print(NAND_DBG_WARN, "Erasing all blocks in the NAND\n");
-
- for (j = DeviceInfo.wSpectraStartBlock, i = 0;
- j <= DeviceInfo.wSpectraEndBlock;
- j++, i++) {
- if ((pbt[i] & BAD_BLOCK) != BAD_BLOCK) {
- ret = GLOB_LLD_Erase_Block(j);
- if (FAIL == ret) {
- pbt[i] = (u32)(j);
- MARK_BLOCK_AS_BAD(pbt[i]);
- nand_dbg_print(NAND_DBG_WARN,
- "NAND Program fail in %s, Line %d, "
- "Function: %s, new Bad Block %d generated!\n",
- __FILE__, __LINE__, __func__, (int)j);
- } else {
- pbt[i] = (u32)(SPARE_BLOCK | j);
- }
- }
-#if CMD_DMA
- pbtStartingCopy[i] = pbt[i];
-#endif
- }
-
- g_wBlockTableOffset = 0;
- for (i = 0; (i <= (DeviceInfo.wSpectraEndBlock -
- DeviceInfo.wSpectraStartBlock))
- && ((pbt[i] & BAD_BLOCK) == BAD_BLOCK); i++)
- ;
- if (i > (DeviceInfo.wSpectraEndBlock - DeviceInfo.wSpectraStartBlock)) {
- printk(KERN_ERR "All blocks bad!\n");
- return FAIL;
- } else {
- g_wBlockTableIndex = pbt[i] & ~BAD_BLOCK;
- if (i != BLOCK_TABLE_INDEX) {
- tempNode = pbt[i];
- pbt[i] = pbt[BLOCK_TABLE_INDEX];
- pbt[BLOCK_TABLE_INDEX] = tempNode;
- }
- }
- pbt[BLOCK_TABLE_INDEX] &= (~SPARE_BLOCK);
-
-#if CMD_DMA
- pbtStartingCopy[BLOCK_TABLE_INDEX] &= (~SPARE_BLOCK);
-#endif
-
- g_cBlockTableStatus = IN_PROGRESS_BLOCK_TABLE;
- memset(g_pBTBlocks, 0xFF,
- (1 + LAST_BT_ID - FIRST_BT_ID) * sizeof(u32));
- g_pBTBlocks[FIRST_BT_ID-FIRST_BT_ID] = g_wBlockTableIndex;
- FTL_Write_Block_Table(FAIL);
-
- for (i = 0; i < CACHE_ITEM_NUM; i++) {
- Cache.array[i].address = NAND_CACHE_INIT_ADDR;
- Cache.array[i].use_cnt = 0;
- Cache.array[i].changed = CLEAR;
- }
-
-#if (RESTORE_CACHE_ON_CDMA_CHAIN_FAILURE && CMD_DMA)
- memcpy((void *)&cache_start_copy, (void *)&Cache,
- sizeof(struct flash_cache_tag));
-#endif
- return PASS;
-}
-
static int force_format_nand(void)
{
u32 i;
@@ -3031,112 +2721,6 @@ static int FTL_Read_Block_Table(void)
return wResult;
}
-
-/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
-* Function: FTL_Flash_Error_Handle
-* Inputs: Pointer to data
-* Page address
-* Block address
-* Outputs: PASS=0 / FAIL=1
-* Description: It handles any error occured during Spectra operation
-*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
-static int FTL_Flash_Error_Handle(u8 *pData, u64 old_page_addr,
- u64 blk_addr)
-{
- u32 i;
- int j;
- u32 tmp_node, blk_node = BLK_FROM_ADDR(blk_addr);
- u64 phy_addr;
- int wErase = FAIL;
- int wResult = FAIL;
- u32 *pbt = (u32 *)g_pBlockTable;
-
- nand_dbg_print(NAND_DBG_TRACE, "%s, Line %d, Function: %s\n",
- __FILE__, __LINE__, __func__);
-
- if (ERR == GLOB_FTL_Garbage_Collection())
- return ERR;
-
- do {
- for (i = DeviceInfo.wSpectraEndBlock -
- DeviceInfo.wSpectraStartBlock;
- i > 0; i--) {
- if (IS_SPARE_BLOCK(i)) {
- tmp_node = (u32)(BAD_BLOCK |
- pbt[blk_node]);
- pbt[blk_node] = (u32)(pbt[i] &
- (~SPARE_BLOCK));
- pbt[i] = tmp_node;
-#if CMD_DMA
- p_BTableChangesDelta =
- (struct BTableChangesDelta *)
- g_pBTDelta_Free;
- g_pBTDelta_Free +=
- sizeof(struct BTableChangesDelta);
-
- p_BTableChangesDelta->ftl_cmd_cnt =
- ftl_cmd_cnt;
- p_BTableChangesDelta->BT_Index =
- blk_node;
- p_BTableChangesDelta->BT_Entry_Value =
- pbt[blk_node];
- p_BTableChangesDelta->ValidFields = 0x0C;
-
- p_BTableChangesDelta =
- (struct BTableChangesDelta *)
- g_pBTDelta_Free;
- g_pBTDelta_Free +=
- sizeof(struct BTableChangesDelta);
-
- p_BTableChangesDelta->ftl_cmd_cnt =
- ftl_cmd_cnt;
- p_BTableChangesDelta->BT_Index = i;
- p_BTableChangesDelta->BT_Entry_Value = pbt[i];
- p_BTableChangesDelta->ValidFields = 0x0C;
-#endif
- wResult = PASS;
- break;
- }
- }
-
- if (FAIL == wResult) {
- if (FAIL == GLOB_FTL_Garbage_Collection())
- break;
- else
- continue;
- }
-
- if (IN_PROGRESS_BLOCK_TABLE != g_cBlockTableStatus) {
- g_cBlockTableStatus = IN_PROGRESS_BLOCK_TABLE;
- FTL_Write_IN_Progress_Block_Table_Page();
- }
-
- phy_addr = FTL_Get_Physical_Block_Addr(blk_addr);
-
- for (j = 0; j < RETRY_TIMES; j++) {
- if (PASS == wErase) {
- if (FAIL == GLOB_FTL_Block_Erase(phy_addr)) {
- MARK_BLOCK_AS_BAD(pbt[blk_node]);
- break;
- }
- }
- if (PASS == FTL_Cache_Update_Block(pData,
- old_page_addr,
- phy_addr)) {
- wResult = PASS;
- break;
- } else {
- wResult = FAIL;
- wErase = PASS;
- }
- }
- } while (FAIL == wResult);
-
- FTL_Write_Block_Table(FAIL);
-
- return wResult;
-}
-
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
* Function: FTL_Get_Page_Num
* Inputs: Size in bytes
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 5cca00a6d09d..2d6e53a180fd 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -2278,6 +2278,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
"request interrupt %d failed\n", irqnum);
goto err_request_irq;
}
+ watch_irq(irqnum, hcd);
hcd->irq = irqnum;
dev_info(hcd->self.controller, "irq %d, %s 0x%08llx\n", irqnum,
(hcd->driver->flags & HCD_MEMORY) ?
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c
index 93ead19507b6..d90c9e89688e 100644
--- a/drivers/usb/gadget/at91_udc.c
+++ b/drivers/usb/gadget/at91_udc.c
@@ -1266,7 +1266,6 @@ write_in:
csr |= AT91_UDP_TXPKTRDY;
__raw_writel(csr, creg);
udc->req_pending = 0;
- return;
}
static void handle_ep0(struct at91_udc *udc)
diff --git a/drivers/usb/gadget/f_audio.c b/drivers/usb/gadget/f_audio.c
index 1f48ceb55a77..00975ed903d1 100644
--- a/drivers/usb/gadget/f_audio.c
+++ b/drivers/usb/gadget/f_audio.c
@@ -317,8 +317,6 @@ static void f_audio_playback_work(struct work_struct *data)
u_audio_playback(&audio->card, play_buf->buf, play_buf->actual);
f_audio_buffer_free(play_buf);
-
- return;
}
static int f_audio_out_ep_complete(struct usb_ep *ep, struct usb_request *req)
diff --git a/drivers/usb/gadget/f_hid.c b/drivers/usb/gadget/f_hid.c
index 53e120208e99..111b85ca7ac0 100644
--- a/drivers/usb/gadget/f_hid.c
+++ b/drivers/usb/gadget/f_hid.c
@@ -318,8 +318,6 @@ static void hidg_set_report_complete(struct usb_ep *ep, struct usb_request *req)
spin_unlock(&hidg->spinlock);
wake_up(&hidg->read_queue);
-
- return;
}
static int hidg_setup(struct usb_function *f,
@@ -413,8 +411,6 @@ static void hidg_disable(struct usb_function *f)
usb_ep_disable(hidg->in_ep);
hidg->in_ep->driver_data = NULL;
-
- return;
}
static int hidg_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c
index 08a9a62a39e3..d933e6398412 100644
--- a/drivers/usb/gadget/fsl_udc_core.c
+++ b/drivers/usb/gadget/fsl_udc_core.c
@@ -287,8 +287,6 @@ static void dr_controller_run(struct fsl_udc *udc)
temp = fsl_readl(&dr_regs->usbcmd);
temp |= USB_CMD_RUN_STOP;
fsl_writel(temp, &dr_regs->usbcmd);
-
- return;
}
static void dr_controller_stop(struct fsl_udc *udc)
@@ -308,8 +306,6 @@ static void dr_controller_stop(struct fsl_udc *udc)
tmp = fsl_readl(&dr_regs->usbcmd);
tmp &= ~USB_CMD_RUN_STOP;
fsl_writel(tmp, &dr_regs->usbcmd);
-
- return;
}
static void dr_ep_setup(unsigned char ep_num, unsigned char dir,
@@ -416,8 +412,6 @@ static void struct_ep_qh_setup(struct fsl_udc *udc, unsigned char ep_num,
p_QH->max_pkt_length = cpu_to_le32(tmp);
p_QH->next_dtd_ptr = 1;
p_QH->size_ioc_int_sts = 0;
-
- return;
}
/* Setup qh structure and ep register for ep0. */
diff --git a/drivers/usb/gadget/langwell_udc.c b/drivers/usb/gadget/langwell_udc.c
index c2d2a201f84b..d41b69cf508b 100644
--- a/drivers/usb/gadget/langwell_udc.c
+++ b/drivers/usb/gadget/langwell_udc.c
@@ -284,7 +284,6 @@ static void ep0_reset(struct langwell_udc *dev)
}
VDBG(dev, "<--- %s()\n", __func__);
- return;
}
@@ -1486,7 +1485,6 @@ static void langwell_udc_start(struct langwell_udc *dev)
writel(usbcmd, &dev->op_regs->usbcmd);
DBG(dev, "<--- %s()\n", __func__);
- return;
}
@@ -1509,7 +1507,6 @@ static void langwell_udc_stop(struct langwell_udc *dev)
writel(usbcmd, &dev->op_regs->usbcmd);
DBG(dev, "<--- %s()\n", __func__);
- return;
}
diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c
index 980762453a9c..98dfa181449f 100644
--- a/drivers/usb/gadget/pxa27x_udc.c
+++ b/drivers/usb/gadget/pxa27x_udc.c
@@ -1394,8 +1394,6 @@ static void pxa_ep_fifo_flush(struct usb_ep *_ep)
}
spin_unlock_irqrestore(&ep->lock, flags);
-
- return;
}
/**
diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c
index 020fa5a25fda..eb61ab4b302c 100644
--- a/drivers/usb/gadget/rndis.c
+++ b/drivers/usb/gadget/rndis.c
@@ -916,8 +916,6 @@ void rndis_deregister (int configNr)
if (configNr >= RNDIS_MAX_CONFIGS) return;
rndis_per_dev_params [configNr].used = 0;
-
- return;
}
int rndis_set_param_dev(u8 configNr, struct net_device *dev, u16 *cdc_filter)
diff --git a/drivers/usb/gadget/uvc_v4l2.c b/drivers/usb/gadget/uvc_v4l2.c
index 2dcffdac86d2..5e807f083bc8 100644
--- a/drivers/usb/gadget/uvc_v4l2.c
+++ b/drivers/usb/gadget/uvc_v4l2.c
@@ -94,7 +94,7 @@ uvc_v4l2_set_format(struct uvc_video *video, struct v4l2_format *fmt)
break;
}
- if (format == NULL || format->fcc != fmt->fmt.pix.pixelformat) {
+ if (i == ARRAY_SIZE(uvc_formats)) {
printk(KERN_INFO "Unsupported format 0x%08x.\n",
fmt->fmt.pix.pixelformat);
return -EINVAL;
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 34a928d3b7d2..ac0f7a4b0341 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -1080,7 +1080,6 @@ nogood:
ep->hcpriv = NULL;
done:
spin_unlock_irqrestore (&ehci->lock, flags);
- return;
}
static void
diff --git a/drivers/usb/host/imx21-hcd.c b/drivers/usb/host/imx21-hcd.c
index 3e5630369c31..d0abb9b0e673 100644
--- a/drivers/usb/host/imx21-hcd.c
+++ b/drivers/usb/host/imx21-hcd.c
@@ -27,8 +27,8 @@
* * 32 transfer descriptors (called ETDs)
* * 4Kb of Data memory
*
- * The data memory is shared between the host and fuction controlers
- * (but this driver only supports the host controler)
+ * The data memory is shared between the host and function controllers
+ * (but this driver only supports the host controller)
*
* So setting up a transfer involves:
* * Allocating a ETD
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c
index d1a3dfc9a408..bdba8c5d844a 100644
--- a/drivers/usb/host/isp1760-hcd.c
+++ b/drivers/usb/host/isp1760-hcd.c
@@ -829,6 +829,7 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
* almost immediately. With ISP1761, this register requires a delay of
* 195ns between a write and subsequent read (see section 15.1.1.3).
*/
+ mmiowb();
ndelay(195);
skip_map = isp1760_readl(hcd->regs + HC_ATL_PTD_SKIPMAP_REG);
@@ -870,6 +871,7 @@ static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
* almost immediately. With ISP1761, this register requires a delay of
* 195ns between a write and subsequent read (see section 15.1.1.3).
*/
+ mmiowb();
ndelay(195);
skip_map = isp1760_readl(hcd->regs + HC_INT_PTD_SKIPMAP_REG);
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
index c3b4ccc7337b..15ae39d6cc24 100644
--- a/drivers/usb/host/ohci-hcd.c
+++ b/drivers/usb/host/ohci-hcd.c
@@ -370,7 +370,6 @@ sanitize:
}
ep->hcpriv = NULL;
spin_unlock_irqrestore (&ohci->lock, flags);
- return;
}
static int ohci_get_frame (struct usb_hcd *hcd)
diff --git a/drivers/usb/host/oxu210hp-hcd.c b/drivers/usb/host/oxu210hp-hcd.c
index d9c85a292737..8026dc85996c 100644
--- a/drivers/usb/host/oxu210hp-hcd.c
+++ b/drivers/usb/host/oxu210hp-hcd.c
@@ -544,8 +544,6 @@ static void oxu_buf_free(struct oxu_hcd *oxu, struct ehci_qtd *qtd)
qtd->buffer = NULL;
spin_unlock(&oxu->mem_lock);
-
- return;
}
static inline void ehci_qtd_init(struct ehci_qtd *qtd, dma_addr_t dma)
@@ -571,8 +569,6 @@ static inline void oxu_qtd_free(struct oxu_hcd *oxu, struct ehci_qtd *qtd)
oxu->qtd_used[index] = 0;
spin_unlock(&oxu->mem_lock);
-
- return;
}
static struct ehci_qtd *ehci_qtd_alloc(struct oxu_hcd *oxu)
@@ -615,8 +611,6 @@ static void oxu_qh_free(struct oxu_hcd *oxu, struct ehci_qh *qh)
oxu->qh_used[index] = 0;
spin_unlock(&oxu->mem_lock);
-
- return;
}
static void qh_destroy(struct kref *kref)
@@ -693,8 +687,6 @@ static void oxu_murb_free(struct oxu_hcd *oxu, struct oxu_murb *murb)
oxu->murb_used[index] = 0;
spin_unlock(&oxu->mem_lock);
-
- return;
}
static struct oxu_murb *oxu_murb_alloc(struct oxu_hcd *oxu)
@@ -3070,7 +3062,6 @@ nogood:
ep->hcpriv = NULL;
done:
spin_unlock_irqrestore(&oxu->lock, flags);
- return;
}
static int oxu_get_frame(struct usb_hcd *hcd)
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c
index 83b5f9cea85a..5b37b08e0d80 100644
--- a/drivers/usb/host/pci-quirks.c
+++ b/drivers/usb/host/pci-quirks.c
@@ -338,8 +338,6 @@ static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev)
writel(0x3f, op_reg_base + EHCI_USBSTS);
iounmap(base);
-
- return;
}
/*
diff --git a/drivers/usb/host/u132-hcd.c b/drivers/usb/host/u132-hcd.c
index 5b31bae92dbc..fab764946c74 100644
--- a/drivers/usb/host/u132-hcd.c
+++ b/drivers/usb/host/u132-hcd.c
@@ -316,7 +316,6 @@ static void u132_ring_requeue_work(struct u132 *u132, struct u132_ring *ring,
} else if (queue_delayed_work(workqueue, &ring->scheduler, 0))
return;
kref_put(&u132->kref, u132_hcd_delete);
- return;
}
static void u132_ring_queue_work(struct u132 *u132, struct u132_ring *ring,
@@ -324,7 +323,6 @@ static void u132_ring_queue_work(struct u132 *u132, struct u132_ring *ring,
{
kref_get(&u132->kref);
u132_ring_requeue_work(u132, ring, delta);
- return;
}
static void u132_ring_cancel_work(struct u132 *u132, struct u132_ring *ring)
@@ -543,7 +541,6 @@ static void u132_hcd_giveback_urb(struct u132 *u132, struct u132_endp *endp,
mutex_unlock(&u132->scheduler_lock);
u132_endp_put_kref(u132, endp);
usb_hcd_giveback_urb(hcd, urb, status);
- return;
}
static void u132_hcd_forget_urb(struct u132 *u132, struct u132_endp *endp,
@@ -574,8 +571,8 @@ static void u132_hcd_abandon_urb(struct u132 *u132, struct u132_endp *endp,
endp->active = 0;
spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
kfree(urbq);
- } usb_hcd_giveback_urb(hcd, urb, status);
- return;
+ }
+ usb_hcd_giveback_urb(hcd, urb, status);
}
static inline int edset_input(struct u132 *u132, struct u132_ring *ring,
@@ -3085,7 +3082,6 @@ static void u132_initialise(struct u132 *u132, struct platform_device *pdev)
u132->endp[endps] = NULL;
mutex_unlock(&u132->sw_lock);
- return;
}
static int __devinit u132_probe(struct platform_device *pdev)
diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c
index 3a6bcd5fee09..5a47805d9580 100644
--- a/drivers/usb/image/microtek.c
+++ b/drivers/usb/image/microtek.c
@@ -398,7 +398,6 @@ void mts_int_submit_urb (struct urb* transfer,
context->srb->result = DID_ERROR << 16;
mts_transfer_cleanup(transfer);
}
- return;
}
@@ -409,7 +408,6 @@ static void mts_transfer_cleanup( struct urb *transfer )
if ( likely(context->final_callback != NULL) )
context->final_callback(context->srb);
-
}
static void mts_transfer_done( struct urb *transfer )
@@ -420,8 +418,6 @@ static void mts_transfer_done( struct urb *transfer )
context->srb->result |= (unsigned)(*context->scsi_status)<<1;
mts_transfer_cleanup(transfer);
-
- return;
}
@@ -452,8 +448,6 @@ static void mts_data_done( struct urb* transfer )
}
mts_get_status(transfer);
-
- return;
}
@@ -496,8 +490,6 @@ static void mts_command_done( struct urb *transfer )
mts_get_status(transfer);
}
}
-
- return;
}
static void mts_do_sg (struct urb* transfer)
@@ -522,7 +514,6 @@ static void mts_do_sg (struct urb* transfer)
sg[context->fragment].length,
context->fragment + 1 == scsi_sg_count(context->srb) ?
mts_data_done : mts_do_sg);
- return;
}
static const u8 mts_read_image_sig[] = { 0x28, 00, 00, 00 };
diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c
index aecf380f6ecc..c5b571050d8c 100644
--- a/drivers/usb/misc/ftdi-elan.c
+++ b/drivers/usb/misc/ftdi-elan.c
@@ -456,7 +456,6 @@ static void ftdi_elan_cancel_targets(struct usb_ftdi *ftdi)
static void ftdi_elan_kick_command_queue(struct usb_ftdi *ftdi)
{
ftdi_command_queue_work(ftdi, 0);
- return;
}
static void ftdi_elan_command_work(struct work_struct *work)
@@ -483,7 +482,6 @@ static void ftdi_elan_command_work(struct work_struct *work)
static void ftdi_elan_kick_respond_queue(struct usb_ftdi *ftdi)
{
ftdi_respond_queue_work(ftdi, 0);
- return;
}
static void ftdi_elan_respond_work(struct work_struct *work)
diff --git a/drivers/usb/mon/mon_main.c b/drivers/usb/mon/mon_main.c
index 812dc288bb8c..10405119985c 100644
--- a/drivers/usb/mon/mon_main.c
+++ b/drivers/usb/mon/mon_main.c
@@ -90,7 +90,6 @@ static void mon_bus_submit(struct mon_bus *mbus, struct urb *urb)
r->rnf_submit(r->r_data, urb);
}
spin_unlock_irqrestore(&mbus->lock, flags);
- return;
}
static void mon_submit(struct usb_bus *ubus, struct urb *urb)
@@ -117,7 +116,6 @@ static void mon_bus_submit_error(struct mon_bus *mbus, struct urb *urb, int erro
r->rnf_error(r->r_data, urb, error);
}
spin_unlock_irqrestore(&mbus->lock, flags);
- return;
}
static void mon_submit_error(struct usb_bus *ubus, struct urb *urb, int error)
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index 6fca870e957e..a83a139da5bc 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -829,7 +829,6 @@ void musb_g_rx(struct musb *musb, u8 epnum)
DBG(3, "packet waiting for %s%s request\n",
musb_ep->desc ? "" : "inactive ",
musb_ep->end_point.name);
- return;
}
/* ------------------------------------------------------------ */
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
index f5d06746cc3b..2edf238b00b9 100644
--- a/drivers/usb/serial/cypress_m8.c
+++ b/drivers/usb/serial/cypress_m8.c
@@ -1320,8 +1320,6 @@ continue_read:
cypress_set_dead(port);
}
}
-
- return;
} /* cypress_read_int_callback */
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index eb12d9b096b4..4fc588cc4716 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -2069,7 +2069,6 @@ static void ftdi_set_termios(struct tty_struct *tty,
/* lower DTR/RTS */
clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
}
- return;
}
static int ftdi_tiocmget(struct tty_struct *tty, struct file *file)
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c
index a42b29a695b2..26710b189918 100644
--- a/drivers/usb/serial/garmin_gps.c
+++ b/drivers/usb/serial/garmin_gps.c
@@ -1264,7 +1264,6 @@ static void garmin_read_bulk_callback(struct urb *urb)
garmin_data_p->flags &= ~FLAGS_BULK_IN_ACTIVE;
spin_unlock_irqrestore(&garmin_data_p->lock, flags);
}
- return;
}
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
index 76e6fb3aab7a..892e916ef67e 100644
--- a/drivers/usb/serial/io_edgeport.c
+++ b/drivers/usb/serial/io_edgeport.c
@@ -1465,8 +1465,6 @@ static void edge_throttle(struct tty_struct *tty)
if (status != 0)
return;
}
-
- return;
}
@@ -1770,8 +1768,6 @@ static void edge_break(struct tty_struct *tty, int break_state)
dbg("%s - error sending break set/clear command.",
__func__);
}
-
- return;
}
@@ -2042,7 +2038,6 @@ static void process_rcvd_status(struct edgeport_serial *edge_serial,
dbg("%s - Unrecognized IOSP status code %u", __func__, code);
break;
}
- return;
}
@@ -2095,8 +2090,6 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr)
/* Save the new modem status */
edge_port->shadowMSR = newMsr & 0xf0;
-
- return;
}
@@ -2143,8 +2136,6 @@ static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData,
icount->parity++;
if (newLsr & LSR_FRM_ERR)
icount->frame++;
-
- return;
}
@@ -2720,7 +2711,6 @@ static void change_port_settings(struct tty_struct *tty,
baud = tty_termios_baud_rate(old_termios);
tty_encode_baud_rate(tty, baud, baud);
}
- return;
}
@@ -2922,7 +2912,6 @@ static void load_application_firmware(struct edgeport_serial *edge_serial)
0x40, 0x4000, 0x0001, NULL, 0, 3000);
release_firmware(fw);
- return;
}
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
index dc47f986df57..9d6be304dff9 100644
--- a/drivers/usb/serial/io_ti.c
+++ b/drivers/usb/serial/io_ti.c
@@ -1571,8 +1571,6 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 msr)
}
}
tty_kref_put(tty);
-
- return;
}
static void handle_new_lsr(struct edgeport_port *edge_port, int lsr_data,
@@ -2424,7 +2422,6 @@ static void change_port_settings(struct tty_struct *tty,
dbg("%s - error %d when trying to write config to device",
__func__, status);
kfree(config);
- return;
}
static void edge_set_termios(struct tty_struct *tty,
@@ -2445,7 +2442,6 @@ static void edge_set_termios(struct tty_struct *tty,
return;
/* change the port settings to the new ones specified */
change_port_settings(tty, edge_port, old_termios);
- return;
}
static int edge_tiocmset(struct tty_struct *tty, struct file *file,
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c
index efc72113216b..12ed594f5f80 100644
--- a/drivers/usb/serial/iuu_phoenix.c
+++ b/drivers/usb/serial/iuu_phoenix.c
@@ -807,7 +807,6 @@ static void read_rxcmd_callback(struct urb *urb)
iuu_uart_read_callback, port);
result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
dbg("%s - submit result = %d", __func__, result);
- return;
}
static int iuu_uart_on(struct usb_serial_port *port)
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c
index 185fe9a7d4e0..a10dd5676ccc 100644
--- a/drivers/usb/serial/keyspan_pda.c
+++ b/drivers/usb/serial/keyspan_pda.c
@@ -292,7 +292,6 @@ static void keyspan_pda_rx_unthrottle(struct tty_struct *tty)
port->interrupt_in_urb->dev = port->serial->dev;
if (usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL))
dbg(" usb_submit_urb(read urb) failed");
- return;
}
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c
index 30922a7e3347..f442333dfa99 100644
--- a/drivers/usb/serial/mos7720.c
+++ b/drivers/usb/serial/mos7720.c
@@ -827,7 +827,6 @@ exit:
dev_err(&urb->dev->dev,
"%s - Error %d submitting control urb\n",
__func__, result);
- return;
}
/*
@@ -907,7 +906,6 @@ exit:
dev_err(&urb->dev->dev,
"%s - Error %d submitting control urb\n",
__func__, result);
- return;
}
/*
@@ -1227,8 +1225,6 @@ static void mos7720_break(struct tty_struct *tty, int break_state)
mos7720_port->shadowLCR = data;
write_mos_reg(serial, port->number - port->serial->minor,
LCR, mos7720_port->shadowLCR);
-
- return;
}
/*
@@ -1746,7 +1742,6 @@ static void change_port_settings(struct tty_struct *tty,
dbg("usb_submit_urb(read bulk) failed, status = %d",
status);
}
- return;
}
/*
@@ -1803,7 +1798,6 @@ static void mos7720_set_termios(struct tty_struct *tty,
dbg("usb_submit_urb(read bulk) failed, status = %d",
status);
}
- return;
}
/*
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
index 585b7e663740..d3fc30c5959d 100644
--- a/drivers/usb/serial/mos7840.c
+++ b/drivers/usb/serial/mos7840.c
@@ -1355,8 +1355,6 @@ static void mos7840_break(struct tty_struct *tty, int break_state)
mos7840_port->shadowLCR);
mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER,
mos7840_port->shadowLCR);
-
- return;
}
/*****************************************************************************
@@ -1587,8 +1585,6 @@ static void mos7840_throttle(struct tty_struct *tty)
if (status < 0)
return;
}
-
- return;
}
/*****************************************************************************
@@ -2063,8 +2059,6 @@ static void mos7840_change_port_settings(struct tty_struct *tty,
mos7840_port->delta_msr_cond = 1;
dbg("mos7840_change_port_settings mos7840_port->shadowLCR is End %x",
mos7840_port->shadowLCR);
-
- return;
}
/*****************************************************************************
@@ -2133,7 +2127,6 @@ static void mos7840_set_termios(struct tty_struct *tty,
mos7840_port->read_urb_busy = false;
}
}
- return;
}
/*****************************************************************************
diff --git a/drivers/usb/serial/navman.c b/drivers/usb/serial/navman.c
index a6b207c84917..1f00f243c26c 100644
--- a/drivers/usb/serial/navman.c
+++ b/drivers/usb/serial/navman.c
@@ -25,6 +25,7 @@ static int debug;
static const struct usb_device_id id_table[] = {
{ USB_DEVICE(0x0a99, 0x0001) }, /* Talon Technology device */
+ { USB_DEVICE(0x0df7, 0x0900) }, /* Mobile Action i-gotU */
{ },
};
MODULE_DEVICE_TABLE(usb, id_table);
diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c
index 89c724c0ac0a..60f38d5e64fc 100644
--- a/drivers/usb/serial/omninet.c
+++ b/drivers/usb/serial/omninet.c
@@ -246,8 +246,6 @@ static void omninet_read_bulk_callback(struct urb *urb)
dev_err(&port->dev,
"%s - failed resubmitting read urb, error %d\n",
__func__, result);
-
- return;
}
static int omninet_write(struct tty_struct *tty, struct usb_serial_port *port,
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index 9fc6ea2c681f..adcbdb994de3 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -365,6 +365,10 @@ static void option_instat_callback(struct urb *urb);
#define OLIVETTI_VENDOR_ID 0x0b3c
#define OLIVETTI_PRODUCT_OLICARD100 0xc000
+/* Celot products */
+#define CELOT_VENDOR_ID 0x211f
+#define CELOT_PRODUCT_CT680M 0x6801
+
/* some devices interfaces need special handling due to a number of reasons */
enum option_blacklist_reason {
OPTION_BLACKLIST_NONE = 0,
@@ -887,10 +891,9 @@ static const struct usb_device_id option_ids[] = {
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100F) },
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1011)},
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1012)},
-
{ USB_DEVICE(CINTERION_VENDOR_ID, 0x0047) },
-
{ USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) },
+ { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */
{ } /* Terminating entry */
};
MODULE_DEVICE_TABLE(usb, option_ids);
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
index 6b6001822279..c98f0fb675ba 100644
--- a/drivers/usb/serial/pl2303.c
+++ b/drivers/usb/serial/pl2303.c
@@ -86,6 +86,7 @@ static const struct usb_device_id id_table[] = {
{ USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
{ USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
{ USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
+ { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
{ USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
{ USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
{ USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h
index a871645389dd..43eb9bdad422 100644
--- a/drivers/usb/serial/pl2303.h
+++ b/drivers/usb/serial/pl2303.h
@@ -128,6 +128,10 @@
#define CRESSI_VENDOR_ID 0x04b8
#define CRESSI_EDY_PRODUCT_ID 0x0521
+/* Zeagle dive computer interface */
+#define ZEAGLE_VENDOR_ID 0x04b8
+#define ZEAGLE_N2ITION3_PRODUCT_ID 0x0522
+
/* Sony, USB data cable for CMD-Jxx mobile phones */
#define SONY_VENDOR_ID 0x054c
#define SONY_QN3USB_PRODUCT_ID 0x0437
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
index d47b56e9e8ce..7481ff8a49e4 100644
--- a/drivers/usb/serial/sierra.c
+++ b/drivers/usb/serial/sierra.c
@@ -620,8 +620,6 @@ static void sierra_indat_callback(struct urb *urb)
dev_err(&port->dev, "resubmit read urb failed."
"(%d)\n", err);
}
-
- return;
}
static void sierra_instat_callback(struct urb *urb)
diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c
index 329d311a35d9..765aa983bf58 100644
--- a/drivers/usb/serial/spcp8x5.c
+++ b/drivers/usb/serial/spcp8x5.c
@@ -441,7 +441,6 @@ static void spcp8x5_set_termios(struct tty_struct *tty,
spcp8x5_set_workMode(serial->dev, 0x000a,
SET_WORKING_MODE_U2C, priv->type);
}
- return;
}
/* open the serial port. do some usb system call. set termios and get the line
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 2a982e62963b..7a2177c79bde 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -736,6 +736,7 @@ int usb_serial_probe(struct usb_interface *interface,
serial = create_serial(dev, interface, type);
if (!serial) {
+ module_put(type->driver.owner);
dev_err(&interface->dev, "%s - out of memory\n", __func__);
return -ENOMEM;
}
@@ -746,11 +747,11 @@ int usb_serial_probe(struct usb_interface *interface,
id = get_iface_id(type, interface);
retval = type->probe(serial, id);
- module_put(type->driver.owner);
if (retval) {
dbg("sub driver rejected device");
kfree(serial);
+ module_put(type->driver.owner);
return retval;
}
}
@@ -822,6 +823,7 @@ int usb_serial_probe(struct usb_interface *interface,
if (num_bulk_in == 0 || num_bulk_out == 0) {
dev_info(&interface->dev, "PL-2303 hack: descriptors matched but endpoints did not\n");
kfree(serial);
+ module_put(type->driver.owner);
return -ENODEV;
}
}
@@ -835,22 +837,15 @@ int usb_serial_probe(struct usb_interface *interface,
dev_err(&interface->dev,
"Generic device with no bulk out, not allowed.\n");
kfree(serial);
+ module_put(type->driver.owner);
return -EIO;
}
}
#endif
if (!num_ports) {
/* if this device type has a calc_num_ports function, call it */
- if (type->calc_num_ports) {
- if (!try_module_get(type->driver.owner)) {
- dev_err(&interface->dev,
- "module get failed, exiting\n");
- kfree(serial);
- return -EIO;
- }
+ if (type->calc_num_ports)
num_ports = type->calc_num_ports(serial);
- module_put(type->driver.owner);
- }
if (!num_ports)
num_ports = type->num_ports;
}
@@ -1039,13 +1034,7 @@ int usb_serial_probe(struct usb_interface *interface,
/* if this device type has an attach function, call it */
if (type->attach) {
- if (!try_module_get(type->driver.owner)) {
- dev_err(&interface->dev,
- "module get failed, exiting\n");
- goto probe_error;
- }
retval = type->attach(serial);
- module_put(type->driver.owner);
if (retval < 0)
goto probe_error;
serial->attached = 1;
@@ -1088,10 +1077,12 @@ int usb_serial_probe(struct usb_interface *interface,
exit:
/* success */
usb_set_intfdata(interface, serial);
+ module_put(type->driver.owner);
return 0;
probe_error:
usb_serial_put(serial);
+ module_put(type->driver.owner);
return -EIO;
}
EXPORT_SYMBOL_GPL(usb_serial_probe);
diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c
index 0c70b4a621bb..fbc946797801 100644
--- a/drivers/usb/serial/usb_wwan.c
+++ b/drivers/usb/serial/usb_wwan.c
@@ -234,7 +234,6 @@ static void usb_wwan_indat_callback(struct urb *urb)
}
}
- return;
}
static void usb_wwan_outdat_callback(struct urb *urb)
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c
index 12ed8209ca72..3f9ac88d588c 100644
--- a/drivers/usb/serial/whiteheat.c
+++ b/drivers/usb/serial/whiteheat.c
@@ -655,8 +655,6 @@ static void whiteheat_release(struct usb_serial *serial)
}
kfree(info);
}
-
- return;
}
static int whiteheat_open(struct tty_struct *tty, struct usb_serial_port *port)
@@ -955,8 +953,6 @@ static void whiteheat_throttle(struct tty_struct *tty)
spin_lock_irq(&info->lock);
info->flags |= THROTTLED;
spin_unlock_irq(&info->lock);
-
- return;
}
@@ -975,8 +971,6 @@ static void whiteheat_unthrottle(struct tty_struct *tty)
if (actually_throttled)
rx_data_softint(&info->rx_work);
-
- return;
}
diff --git a/drivers/uwb/i1480/i1480u-wlp/lc.c b/drivers/uwb/i1480/i1480u-wlp/lc.c
index def778cf2216..daf793559bcf 100644
--- a/drivers/uwb/i1480/i1480u-wlp/lc.c
+++ b/drivers/uwb/i1480/i1480u-wlp/lc.c
@@ -93,28 +93,28 @@ void i1480u_init(struct i1480u *i1480u)
* information elements have intuitive mappings, other not.
*/
static
-void i1480u_fill_device_info(struct wlp *wlp, struct wlp_device_info *dev_info)
+void i1480u_fill_device_info(struct wlp *wlp, struct wlp_device_info *wdi)
{
struct i1480u *i1480u = container_of(wlp, struct i1480u, wlp);
struct usb_device *usb_dev = i1480u->usb_dev;
/* Treat device name and model name the same */
if (usb_dev->descriptor.iProduct) {
usb_string(usb_dev, usb_dev->descriptor.iProduct,
- dev_info->name, sizeof(dev_info->name));
+ wdi->name, sizeof(wdi->name));
usb_string(usb_dev, usb_dev->descriptor.iProduct,
- dev_info->model_name, sizeof(dev_info->model_name));
+ wdi->model_name, sizeof(wdi->model_name));
}
if (usb_dev->descriptor.iManufacturer)
usb_string(usb_dev, usb_dev->descriptor.iManufacturer,
- dev_info->manufacturer,
- sizeof(dev_info->manufacturer));
- scnprintf(dev_info->model_nr, sizeof(dev_info->model_nr), "%04x",
+ wdi->manufacturer,
+ sizeof(wdi->manufacturer));
+ scnprintf(wdi->model_nr, sizeof(wdi->model_nr), "%04x",
__le16_to_cpu(usb_dev->descriptor.bcdDevice));
if (usb_dev->descriptor.iSerialNumber)
usb_string(usb_dev, usb_dev->descriptor.iSerialNumber,
- dev_info->serial, sizeof(dev_info->serial));
+ wdi->serial, sizeof(wdi->serial));
/* FIXME: where should we obtain category? */
- dev_info->prim_dev_type.category = cpu_to_le16(WLP_DEV_CAT_OTHER);
+ wdi->prim_dev_type.category = cpu_to_le16(WLP_DEV_CAT_OTHER);
/* FIXME: Complete OUI and OUIsubdiv attributes */
}
diff --git a/drivers/uwb/wlp/messages.c b/drivers/uwb/wlp/messages.c
index 3a8e033dce21..6daa464bed24 100644
--- a/drivers/uwb/wlp/messages.c
+++ b/drivers/uwb/wlp/messages.c
@@ -713,7 +713,7 @@ static int wlp_build_assoc_d1(struct wlp *wlp, struct wlp_wss *wss,
struct sk_buff *_skb;
void *d1_itr;
- if (wlp->dev_info == NULL) {
+ if (wlp->wdi == NULL) {
result = __wlp_setup_device_info(wlp);
if (result < 0) {
dev_err(dev, "WLP: Unable to setup device "
@@ -721,7 +721,7 @@ static int wlp_build_assoc_d1(struct wlp *wlp, struct wlp_wss *wss,
goto error;
}
}
- info = wlp->dev_info;
+ info = wlp->wdi;
_skb = dev_alloc_skb(sizeof(*_d1)
+ sizeof(struct wlp_attr_uuid_e)
+ sizeof(struct wlp_attr_wss_sel_mthd)
@@ -795,7 +795,7 @@ int wlp_build_assoc_d2(struct wlp *wlp, struct wlp_wss *wss,
void *d2_itr;
size_t mem_needed;
- if (wlp->dev_info == NULL) {
+ if (wlp->wdi == NULL) {
result = __wlp_setup_device_info(wlp);
if (result < 0) {
dev_err(dev, "WLP: Unable to setup device "
@@ -803,7 +803,7 @@ int wlp_build_assoc_d2(struct wlp *wlp, struct wlp_wss *wss,
goto error;
}
}
- info = wlp->dev_info;
+ info = wlp->wdi;
mem_needed = sizeof(*_d2)
+ sizeof(struct wlp_attr_uuid_e)
+ sizeof(struct wlp_attr_uuid_r)
@@ -971,7 +971,7 @@ error_parse:
*/
static
int wlp_get_variable_info(struct wlp *wlp, void *data,
- struct wlp_device_info *dev_info, ssize_t len)
+ struct wlp_device_info *wdi, ssize_t len)
{
struct device *dev = &wlp->rc->uwb_dev.dev;
size_t used = 0;
@@ -994,7 +994,7 @@ int wlp_get_variable_info(struct wlp *wlp, void *data,
goto error_parse;
}
result = wlp_get_manufacturer(wlp, data + used,
- dev_info->manufacturer,
+ wdi->manufacturer,
len - used);
if (result < 0) {
dev_err(dev, "WLP: Unable to obtain "
@@ -1012,7 +1012,7 @@ int wlp_get_variable_info(struct wlp *wlp, void *data,
goto error_parse;
}
result = wlp_get_model_name(wlp, data + used,
- dev_info->model_name,
+ wdi->model_name,
len - used);
if (result < 0) {
dev_err(dev, "WLP: Unable to obtain Model "
@@ -1029,7 +1029,7 @@ int wlp_get_variable_info(struct wlp *wlp, void *data,
goto error_parse;
}
result = wlp_get_model_nr(wlp, data + used,
- dev_info->model_nr,
+ wdi->model_nr,
len - used);
if (result < 0) {
dev_err(dev, "WLP: Unable to obtain Model "
@@ -1046,7 +1046,7 @@ int wlp_get_variable_info(struct wlp *wlp, void *data,
goto error_parse;
}
result = wlp_get_serial(wlp, data + used,
- dev_info->serial, len - used);
+ wdi->serial, len - used);
if (result < 0) {
dev_err(dev, "WLP: Unable to obtain Serial "
"number attribute from D1 message.\n");
@@ -1062,7 +1062,7 @@ int wlp_get_variable_info(struct wlp *wlp, void *data,
goto error_parse;
}
result = wlp_get_prim_dev_type(wlp, data + used,
- &dev_info->prim_dev_type,
+ &wdi->prim_dev_type,
len - used);
if (result < 0) {
dev_err(dev, "WLP: Unable to obtain Primary "
@@ -1070,10 +1070,10 @@ int wlp_get_variable_info(struct wlp *wlp, void *data,
"message.\n");
goto error_parse;
}
- dev_info->prim_dev_type.category =
- le16_to_cpu(dev_info->prim_dev_type.category);
- dev_info->prim_dev_type.subID =
- le16_to_cpu(dev_info->prim_dev_type.subID);
+ wdi->prim_dev_type.category =
+ le16_to_cpu(wdi->prim_dev_type.category);
+ wdi->prim_dev_type.subID =
+ le16_to_cpu(wdi->prim_dev_type.subID);
last = WLP_ATTR_PRI_DEV_TYPE;
used += result;
break;
@@ -1099,7 +1099,7 @@ static
int wlp_parse_d1_frame(struct wlp *wlp, struct sk_buff *skb,
struct wlp_uuid *uuid_e,
enum wlp_wss_sel_mthd *sel_mthd,
- struct wlp_device_info *dev_info,
+ struct wlp_device_info *wdi,
enum wlp_assc_error *assc_err)
{
struct device *dev = &wlp->rc->uwb_dev.dev;
@@ -1124,7 +1124,7 @@ int wlp_parse_d1_frame(struct wlp *wlp, struct sk_buff *skb,
goto error_parse;
}
used += result;
- result = wlp_get_dev_name(wlp, ptr + used, dev_info->name,
+ result = wlp_get_dev_name(wlp, ptr + used, wdi->name,
len - used);
if (result < 0) {
dev_err(dev, "WLP: unable to obtain Device Name from D1 "
@@ -1132,7 +1132,7 @@ int wlp_parse_d1_frame(struct wlp *wlp, struct sk_buff *skb,
goto error_parse;
}
used += result;
- result = wlp_get_variable_info(wlp, ptr + used, dev_info, len - used);
+ result = wlp_get_variable_info(wlp, ptr + used, wdi, len - used);
if (result < 0) {
dev_err(dev, "WLP: unable to obtain Device Information from "
"D1 message.\n");
@@ -1172,15 +1172,15 @@ void wlp_handle_d1_frame(struct work_struct *ws)
struct device *dev = &wlp->rc->uwb_dev.dev;
struct wlp_uuid uuid_e;
enum wlp_wss_sel_mthd sel_mthd = 0;
- struct wlp_device_info dev_info;
+ struct wlp_device_info wdi;
enum wlp_assc_error assc_err;
struct sk_buff *resp = NULL;
/* Parse D1 frame */
mutex_lock(&wss->mutex);
mutex_lock(&wlp->mutex); /* to access wlp->uuid */
- memset(&dev_info, 0, sizeof(dev_info));
- result = wlp_parse_d1_frame(wlp, skb, &uuid_e, &sel_mthd, &dev_info,
+ memset(&wdi, 0, sizeof(wdi));
+ result = wlp_parse_d1_frame(wlp, skb, &uuid_e, &sel_mthd, &wdi,
&assc_err);
if (result < 0) {
dev_err(dev, "WLP: Unable to parse incoming D1 frame.\n");
diff --git a/drivers/uwb/wlp/sysfs.c b/drivers/uwb/wlp/sysfs.c
index 6627c94cc854..b24751c3430b 100644
--- a/drivers/uwb/wlp/sysfs.c
+++ b/drivers/uwb/wlp/sysfs.c
@@ -333,12 +333,12 @@ ssize_t wlp_dev_##type##_show(struct wlp *wlp, char *buf) \
{ \
ssize_t result = 0; \
mutex_lock(&wlp->mutex); \
- if (wlp->dev_info == NULL) { \
+ if (wlp->wdi == NULL) { \
result = __wlp_setup_device_info(wlp); \
if (result < 0) \
goto out; \
} \
- result = scnprintf(buf, PAGE_SIZE, "%s\n", wlp->dev_info->type);\
+ result = scnprintf(buf, PAGE_SIZE, "%s\n", wlp->wdi->type); \
out: \
mutex_unlock(&wlp->mutex); \
return result; \
@@ -360,14 +360,14 @@ ssize_t wlp_dev_##type##_store(struct wlp *wlp, const char *buf, size_t size)\
ssize_t result; \
char format[10]; \
mutex_lock(&wlp->mutex); \
- if (wlp->dev_info == NULL) { \
+ if (wlp->wdi == NULL) { \
result = __wlp_alloc_device_info(wlp); \
if (result < 0) \
goto out; \
} \
- memset(wlp->dev_info->type, 0, sizeof(wlp->dev_info->type)); \
+ memset(wlp->wdi->type, 0, sizeof(wlp->wdi->type)); \
sprintf(format, "%%%uc", len); \
- result = sscanf(buf, format, wlp->dev_info->type); \
+ result = sscanf(buf, format, wlp->wdi->type); \
out: \
mutex_unlock(&wlp->mutex); \
return result < 0 ? result : size; \
@@ -409,13 +409,13 @@ ssize_t wlp_dev_prim_category_show(struct wlp *wlp, char *buf)
{
ssize_t result = 0;
mutex_lock(&wlp->mutex);
- if (wlp->dev_info == NULL) {
+ if (wlp->wdi == NULL) {
result = __wlp_setup_device_info(wlp);
if (result < 0)
goto out;
}
result = scnprintf(buf, PAGE_SIZE, "%s\n",
- wlp_dev_category_str(wlp->dev_info->prim_dev_type.category));
+ wlp_dev_category_str(wlp->wdi->prim_dev_type.category));
out:
mutex_unlock(&wlp->mutex);
return result;
@@ -428,7 +428,7 @@ ssize_t wlp_dev_prim_category_store(struct wlp *wlp, const char *buf,
ssize_t result;
u16 cat;
mutex_lock(&wlp->mutex);
- if (wlp->dev_info == NULL) {
+ if (wlp->wdi == NULL) {
result = __wlp_alloc_device_info(wlp);
if (result < 0)
goto out;
@@ -436,7 +436,7 @@ ssize_t wlp_dev_prim_category_store(struct wlp *wlp, const char *buf,
result = sscanf(buf, "%hu", &cat);
if ((cat >= WLP_DEV_CAT_COMPUTER && cat <= WLP_DEV_CAT_TELEPHONE)
|| cat == WLP_DEV_CAT_OTHER)
- wlp->dev_info->prim_dev_type.category = cat;
+ wlp->wdi->prim_dev_type.category = cat;
else
result = -EINVAL;
out:
@@ -449,15 +449,15 @@ ssize_t wlp_dev_prim_OUI_show(struct wlp *wlp, char *buf)
{
ssize_t result = 0;
mutex_lock(&wlp->mutex);
- if (wlp->dev_info == NULL) {
+ if (wlp->wdi == NULL) {
result = __wlp_setup_device_info(wlp);
if (result < 0)
goto out;
}
result = scnprintf(buf, PAGE_SIZE, "%02x:%02x:%02x\n",
- wlp->dev_info->prim_dev_type.OUI[0],
- wlp->dev_info->prim_dev_type.OUI[1],
- wlp->dev_info->prim_dev_type.OUI[2]);
+ wlp->wdi->prim_dev_type.OUI[0],
+ wlp->wdi->prim_dev_type.OUI[1],
+ wlp->wdi->prim_dev_type.OUI[2]);
out:
mutex_unlock(&wlp->mutex);
return result;
@@ -469,7 +469,7 @@ ssize_t wlp_dev_prim_OUI_store(struct wlp *wlp, const char *buf, size_t size)
ssize_t result;
u8 OUI[3];
mutex_lock(&wlp->mutex);
- if (wlp->dev_info == NULL) {
+ if (wlp->wdi == NULL) {
result = __wlp_alloc_device_info(wlp);
if (result < 0)
goto out;
@@ -480,7 +480,7 @@ ssize_t wlp_dev_prim_OUI_store(struct wlp *wlp, const char *buf, size_t size)
result = -EINVAL;
goto out;
} else
- memcpy(wlp->dev_info->prim_dev_type.OUI, OUI, sizeof(OUI));
+ memcpy(wlp->wdi->prim_dev_type.OUI, OUI, sizeof(OUI));
out:
mutex_unlock(&wlp->mutex);
return result < 0 ? result : size;
@@ -492,13 +492,13 @@ ssize_t wlp_dev_prim_OUI_sub_show(struct wlp *wlp, char *buf)
{
ssize_t result = 0;
mutex_lock(&wlp->mutex);
- if (wlp->dev_info == NULL) {
+ if (wlp->wdi == NULL) {
result = __wlp_setup_device_info(wlp);
if (result < 0)
goto out;
}
result = scnprintf(buf, PAGE_SIZE, "%u\n",
- wlp->dev_info->prim_dev_type.OUIsubdiv);
+ wlp->wdi->prim_dev_type.OUIsubdiv);
out:
mutex_unlock(&wlp->mutex);
return result;
@@ -512,14 +512,14 @@ ssize_t wlp_dev_prim_OUI_sub_store(struct wlp *wlp, const char *buf,
unsigned sub;
u8 max_sub = ~0;
mutex_lock(&wlp->mutex);
- if (wlp->dev_info == NULL) {
+ if (wlp->wdi == NULL) {
result = __wlp_alloc_device_info(wlp);
if (result < 0)
goto out;
}
result = sscanf(buf, "%u", &sub);
if (sub <= max_sub)
- wlp->dev_info->prim_dev_type.OUIsubdiv = sub;
+ wlp->wdi->prim_dev_type.OUIsubdiv = sub;
else
result = -EINVAL;
out:
@@ -532,13 +532,13 @@ ssize_t wlp_dev_prim_subcat_show(struct wlp *wlp, char *buf)
{
ssize_t result = 0;
mutex_lock(&wlp->mutex);
- if (wlp->dev_info == NULL) {
+ if (wlp->wdi == NULL) {
result = __wlp_setup_device_info(wlp);
if (result < 0)
goto out;
}
result = scnprintf(buf, PAGE_SIZE, "%u\n",
- wlp->dev_info->prim_dev_type.subID);
+ wlp->wdi->prim_dev_type.subID);
out:
mutex_unlock(&wlp->mutex);
return result;
@@ -552,14 +552,14 @@ ssize_t wlp_dev_prim_subcat_store(struct wlp *wlp, const char *buf,
unsigned sub;
__le16 max_sub = ~0;
mutex_lock(&wlp->mutex);
- if (wlp->dev_info == NULL) {
+ if (wlp->wdi == NULL) {
result = __wlp_alloc_device_info(wlp);
if (result < 0)
goto out;
}
result = sscanf(buf, "%u", &sub);
if (sub <= max_sub)
- wlp->dev_info->prim_dev_type.subID = sub;
+ wlp->wdi->prim_dev_type.subID = sub;
else
result = -EINVAL;
out:
diff --git a/drivers/uwb/wlp/wlp-lc.c b/drivers/uwb/wlp/wlp-lc.c
index 7f6a630bf26c..202655d4fc20 100644
--- a/drivers/uwb/wlp/wlp-lc.c
+++ b/drivers/uwb/wlp/wlp-lc.c
@@ -40,9 +40,9 @@ void wlp_neighbor_init(struct wlp_neighbor_e *neighbor)
int __wlp_alloc_device_info(struct wlp *wlp)
{
struct device *dev = &wlp->rc->uwb_dev.dev;
- BUG_ON(wlp->dev_info != NULL);
- wlp->dev_info = kzalloc(sizeof(struct wlp_device_info), GFP_KERNEL);
- if (wlp->dev_info == NULL) {
+ BUG_ON(wlp->wdi != NULL);
+ wlp->wdi = kzalloc(sizeof(struct wlp_device_info), GFP_KERNEL);
+ if (wlp->wdi == NULL) {
dev_err(dev, "WLP: Unable to allocate memory for "
"device information.\n");
return -ENOMEM;
@@ -59,7 +59,7 @@ int __wlp_alloc_device_info(struct wlp *wlp)
static
void __wlp_fill_device_info(struct wlp *wlp)
{
- wlp->fill_device_info(wlp, wlp->dev_info);
+ wlp->fill_device_info(wlp, wlp->wdi);
}
/**
@@ -539,8 +539,8 @@ void wlp_remove(struct wlp *wlp)
uwb_notifs_deregister(wlp->rc, &wlp->uwb_notifs_handler);
wlp_eda_release(&wlp->eda);
mutex_lock(&wlp->mutex);
- if (wlp->dev_info != NULL)
- kfree(wlp->dev_info);
+ if (wlp->wdi != NULL)
+ kfree(wlp->wdi);
mutex_unlock(&wlp->mutex);
wlp->rc = NULL;
}
diff --git a/drivers/vbus/Kconfig b/drivers/vbus/Kconfig
new file mode 100644
index 000000000000..f51cba10913e
--- /dev/null
+++ b/drivers/vbus/Kconfig
@@ -0,0 +1,25 @@
+#
+# Virtual-Bus (VBus) driver configuration
+#
+
+config VBUS_PROXY
+ bool "Virtual-Bus support"
+ select SHM_SIGNAL
+ select IOQ
+ default n
+ help
+ Adds support for a virtual-bus model drivers in a guest to connect
+ to host side virtual-bus resources. If you are using this kernel
+ in a virtualization solution which implements virtual-bus devices
+ on the backend, say Y. If unsure, say N.
+
+config VBUS_PCIBRIDGE
+ bool "PCI to Virtual-Bus bridge"
+ depends on PCI
+ depends on VBUS_PROXY
+ select IOQ
+ default n
+ help
+ Provides a way to bridge host side vbus devices via a PCI-BRIDGE
+ object. If you are running virtualization with vbus devices on the
+ host, and the vbus is exposed via PCI, say Y. Otherwise, say N.
diff --git a/drivers/vbus/Makefile b/drivers/vbus/Makefile
new file mode 100644
index 000000000000..944b7f1fec90
--- /dev/null
+++ b/drivers/vbus/Makefile
@@ -0,0 +1,6 @@
+
+vbus-proxy-objs += bus-proxy.o
+obj-$(CONFIG_VBUS_PROXY) += vbus-proxy.o
+
+vbus-pcibridge-objs += pci-bridge.o
+obj-$(CONFIG_VBUS_PCIBRIDGE) += vbus-pcibridge.o
diff --git a/drivers/vbus/bus-proxy.c b/drivers/vbus/bus-proxy.c
new file mode 100644
index 000000000000..ae11f679d34e
--- /dev/null
+++ b/drivers/vbus/bus-proxy.c
@@ -0,0 +1,248 @@
+/*
+ * Copyright 2009 Novell. All Rights Reserved.
+ *
+ * Author:
+ * Gregory Haskins <ghaskins@novell.com>
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/vbus_driver.h>
+
+MODULE_AUTHOR("Gregory Haskins");
+MODULE_LICENSE("GPL");
+
+#define VBUS_PROXY_NAME "vbus-proxy"
+
+static struct vbus_device_proxy *to_dev(struct device *_dev)
+{
+ return _dev ? container_of(_dev, struct vbus_device_proxy, dev) : NULL;
+}
+
+static struct vbus_driver *to_drv(struct device_driver *_drv)
+{
+ return container_of(_drv, struct vbus_driver, drv);
+}
+
+/*
+ * This function is invoked whenever a new driver and/or device is added
+ * to check if there is a match
+ */
+static int vbus_dev_proxy_match(struct device *_dev, struct device_driver *_drv)
+{
+ struct vbus_device_proxy *dev = to_dev(_dev);
+ struct vbus_driver *drv = to_drv(_drv);
+
+ return !strcmp(dev->type, drv->type);
+}
+
+static int vbus_dev_proxy_uevent(struct device *_dev, struct kobj_uevent_env *env)
+{
+ struct vbus_device_proxy *dev = to_dev(_dev);
+
+ if (add_uevent_var(env, "MODALIAS=vbus-proxy:%s", dev->type))
+ return -ENOMEM;
+
+ return 0;
+}
+
+/*
+ * This function is invoked after the bus infrastructure has already made a
+ * match. The device will contain a reference to the paired driver which
+ * we will extract.
+ */
+static int vbus_dev_proxy_probe(struct device *_dev)
+{
+ int ret = 0;
+ struct vbus_device_proxy *dev = to_dev(_dev);
+ struct vbus_driver *drv = to_drv(_dev->driver);
+
+ if (drv->ops->probe)
+ ret = drv->ops->probe(dev);
+
+ return ret;
+}
+
+static struct bus_type vbus_proxy = {
+ .name = VBUS_PROXY_NAME,
+ .match = vbus_dev_proxy_match,
+ .uevent = vbus_dev_proxy_uevent,
+};
+
+static struct device vbus_proxy_rootdev = {
+ .parent = NULL,
+ .init_name = VBUS_PROXY_NAME,
+};
+
+static int __init vbus_init(void)
+{
+ int ret;
+
+ ret = bus_register(&vbus_proxy);
+ BUG_ON(ret < 0);
+
+ ret = device_register(&vbus_proxy_rootdev);
+ BUG_ON(ret < 0);
+
+ return 0;
+}
+
+postcore_initcall(vbus_init);
+
+static void device_release(struct device *dev)
+{
+ struct vbus_device_proxy *_dev;
+
+ _dev = container_of(dev, struct vbus_device_proxy, dev);
+
+ _dev->ops->release(_dev);
+}
+
+static ssize_t _show_modalias(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return sprintf(buf, "vbus-proxy:%s\n", to_dev(dev)->type);
+}
+static DEVICE_ATTR(modalias, S_IRUSR | S_IRGRP | S_IROTH, _show_modalias, NULL);
+
+int vbus_device_proxy_register(struct vbus_device_proxy *new)
+{
+ int ret;
+
+ new->dev.parent = &vbus_proxy_rootdev;
+ new->dev.bus = &vbus_proxy;
+ new->dev.release = &device_release;
+
+ ret = device_register(&new->dev);
+ if (ret < 0)
+ return ret;
+
+ ret = device_create_file(&new->dev, &dev_attr_modalias);
+ if (ret < 0) {
+ device_unregister(&new->dev);
+ return ret;
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(vbus_device_proxy_register);
+
+void vbus_device_proxy_unregister(struct vbus_device_proxy *dev)
+{
+ device_remove_file(&dev->dev, &dev_attr_modalias);
+ device_unregister(&dev->dev);
+}
+EXPORT_SYMBOL_GPL(vbus_device_proxy_unregister);
+
+static int match_device_id(struct device *_dev, void *data)
+{
+ struct vbus_device_proxy *dev = to_dev(_dev);
+ u64 id = *(u64 *)data;
+
+ return dev->id == id;
+}
+
+struct vbus_device_proxy *vbus_device_proxy_find(u64 id)
+{
+ struct device *dev;
+
+ dev = bus_find_device(&vbus_proxy, NULL, &id, &match_device_id);
+
+ return to_dev(dev);
+}
+EXPORT_SYMBOL_GPL(vbus_device_proxy_find);
+
+int vbus_driver_register(struct vbus_driver *new)
+{
+ new->drv.bus = &vbus_proxy;
+ new->drv.name = new->type;
+ new->drv.owner = new->owner;
+ new->drv.probe = vbus_dev_proxy_probe;
+
+ return driver_register(&new->drv);
+}
+EXPORT_SYMBOL_GPL(vbus_driver_register);
+
+void vbus_driver_unregister(struct vbus_driver *drv)
+{
+ driver_unregister(&drv->drv);
+}
+EXPORT_SYMBOL_GPL(vbus_driver_unregister);
+
+/*
+ *---------------------------------
+ * driver-side IOQ helper
+ *---------------------------------
+ */
+static void
+vbus_driver_ioq_release(struct ioq *ioq)
+{
+ kfree(ioq->head_desc);
+ kfree(ioq);
+}
+
+static struct ioq_ops vbus_driver_ioq_ops = {
+ .release = vbus_driver_ioq_release,
+};
+
+
+int vbus_driver_ioq_alloc(struct vbus_device_proxy *dev, const char *name,
+ int id, int prio, size_t count, struct ioq **ioq)
+{
+ struct ioq *_ioq;
+ struct ioq_ring_head *head = NULL;
+ struct shm_signal *signal = NULL;
+ size_t len = IOQ_HEAD_DESC_SIZE(count);
+ int ret = -ENOMEM;
+
+ _ioq = kzalloc(sizeof(*_ioq), GFP_KERNEL);
+ if (!_ioq)
+ goto error;
+
+ head = kzalloc(len, GFP_KERNEL | GFP_DMA);
+ if (!head)
+ goto error;
+
+ head->magic = IOQ_RING_MAGIC;
+ head->ver = IOQ_RING_VER;
+ head->count = cpu_to_le32(count);
+
+ ret = dev->ops->shm(dev, name, id, prio, head, len,
+ &head->signal, &signal, 0);
+ if (ret < 0)
+ goto error;
+
+ ioq_init(_ioq,
+ &vbus_driver_ioq_ops,
+ ioq_locality_north,
+ head,
+ signal,
+ count);
+
+ *ioq = _ioq;
+
+ return 0;
+
+ error:
+ kfree(_ioq);
+ kfree(head);
+
+ if (signal)
+ shm_signal_put(signal);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(vbus_driver_ioq_alloc);
diff --git a/drivers/vbus/pci-bridge.c b/drivers/vbus/pci-bridge.c
new file mode 100644
index 000000000000..36de7c48891c
--- /dev/null
+++ b/drivers/vbus/pci-bridge.c
@@ -0,0 +1,1016 @@
+/*
+ * Copyright (C) 2009 Novell. All Rights Reserved.
+ *
+ * Author:
+ * Gregory Haskins <ghaskins@novell.com>
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/mm.h>
+#include <linux/workqueue.h>
+#include <linux/slab.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
+#include <linux/ioq.h>
+#include <linux/interrupt.h>
+#include <linux/vbus_driver.h>
+#include <linux/vbus_pci.h>
+
+MODULE_AUTHOR("Gregory Haskins");
+MODULE_LICENSE("GPL");
+MODULE_VERSION("1");
+
+#define VBUS_PCI_NAME "pci-to-vbus-bridge"
+
+struct vbus_pci {
+ spinlock_t lock;
+ struct pci_dev *dev;
+ struct ioq eventq;
+ struct vbus_pci_event *ring;
+ struct vbus_pci_regs *regs;
+ struct vbus_pci_signals *signals;
+ int irq;
+ bool enabled;
+ struct {
+ struct dentry *fs;
+ int events;
+ int qnotify;
+ int qinject;
+ int notify;
+ int inject;
+ int bridgecalls;
+ int buscalls;
+ } stats;
+};
+
+static struct vbus_pci vbus_pci;
+
+struct vbus_pci_device {
+ char type[VBUS_MAX_DEVTYPE_LEN];
+ u64 handle;
+ struct list_head shms;
+ struct vbus_device_proxy vdev;
+ struct work_struct drop;
+};
+
+static DEFINE_PER_CPU(struct vbus_pci_fastcall_desc, vbus_pci_percpu_fastcall)
+____cacheline_aligned;
+
+/*
+ * -------------------
+ * common routines
+ * -------------------
+ */
+
+static int
+vbus_pci_bridgecall(unsigned long nr, void *data, unsigned long len)
+{
+ struct vbus_pci_call_desc params = {
+ .vector = nr,
+ .len = len,
+ .datap = __pa(data),
+ };
+ unsigned long flags;
+ int ret;
+
+ spin_lock_irqsave(&vbus_pci.lock, flags);
+
+ memcpy_toio(&vbus_pci.regs->bridgecall, &params, sizeof(params));
+ ret = ioread32(&vbus_pci.regs->bridgecall);
+
+ spin_unlock_irqrestore(&vbus_pci.lock, flags);
+
+ vbus_pci.stats.bridgecalls++;
+
+ return ret;
+}
+
+static int
+vbus_pci_buscall(unsigned long nr, void *data, unsigned long len)
+{
+ struct vbus_pci_fastcall_desc *params;
+ int ret;
+
+ preempt_disable();
+
+ params = &get_cpu_var(vbus_pci_percpu_fastcall);
+
+ params->call.vector = nr;
+ params->call.len = len;
+ params->call.datap = __pa(data);
+
+ iowrite32(smp_processor_id(), &vbus_pci.signals->fastcall);
+
+ ret = params->result;
+
+ preempt_enable();
+
+ vbus_pci.stats.buscalls++;
+
+ return ret;
+}
+
+static struct vbus_pci_device *
+to_dev(struct vbus_device_proxy *vdev)
+{
+ return container_of(vdev, struct vbus_pci_device, vdev);
+}
+
+static void
+_signal_init(struct shm_signal *signal, struct shm_signal_desc *desc,
+ struct shm_signal_ops *ops)
+{
+ desc->magic = SHM_SIGNAL_MAGIC;
+ desc->ver = SHM_SIGNAL_VER;
+
+ shm_signal_init(signal, shm_locality_north, ops, desc);
+}
+
+/*
+ * -------------------
+ * _signal
+ * -------------------
+ */
+
+struct _signal {
+ char name[64];
+ struct vbus_pci *pcivbus;
+ struct shm_signal signal;
+ u32 handle;
+ struct rb_node node;
+ struct list_head list;
+ int irq;
+ struct irq_desc *desc;
+};
+
+static struct _signal *
+to_signal(struct shm_signal *signal)
+{
+ return container_of(signal, struct _signal, signal);
+}
+
+static int
+_signal_inject(struct shm_signal *signal)
+{
+ struct _signal *_signal = to_signal(signal);
+
+ vbus_pci.stats.inject++;
+ iowrite32(_signal->handle, &vbus_pci.signals->shmsignal);
+
+ return 0;
+}
+
+static void
+_signal_release(struct shm_signal *signal)
+{
+ struct _signal *_signal = to_signal(signal);
+
+ kfree(_signal);
+}
+
+static struct shm_signal_ops _signal_ops = {
+ .inject = _signal_inject,
+ .release = _signal_release,
+};
+
+static void shmsignal_disconnect(struct _signal *_signal);
+
+/*
+ * -------------------
+ * vbus_device_proxy routines
+ * -------------------
+ */
+
+static int
+vbus_pci_device_open(struct vbus_device_proxy *vdev, int version, int flags)
+{
+ struct vbus_pci_device *dev = to_dev(vdev);
+ struct vbus_pci_deviceopen params;
+ int ret;
+
+ if (dev->handle)
+ return -EINVAL;
+
+ params.devid = vdev->id;
+ params.version = version;
+
+ ret = vbus_pci_buscall(VBUS_PCI_HC_DEVOPEN,
+ &params, sizeof(params));
+ if (ret < 0)
+ return ret;
+
+ dev->handle = params.handle;
+
+ return 0;
+}
+
+static int
+vbus_pci_device_close(struct vbus_device_proxy *vdev, int flags)
+{
+ struct vbus_pci_device *dev = to_dev(vdev);
+ unsigned long iflags;
+ int ret;
+
+ if (!dev->handle)
+ return -EINVAL;
+
+ spin_lock_irqsave(&vbus_pci.lock, iflags);
+
+ while (!list_empty(&dev->shms)) {
+ struct _signal *_signal;
+
+ _signal = list_first_entry(&dev->shms, struct _signal, list);
+
+ list_del(&_signal->list);
+ shmsignal_disconnect(_signal);
+
+ spin_unlock_irqrestore(&vbus_pci.lock, iflags);
+ shm_signal_put(&_signal->signal);
+ spin_lock_irqsave(&vbus_pci.lock, iflags);
+ }
+
+ spin_unlock_irqrestore(&vbus_pci.lock, iflags);
+
+ /*
+ * The DEVICECLOSE will implicitly close all of the shm on the
+ * host-side, so there is no need to do an explicit per-shm
+ * hypercall
+ */
+ ret = vbus_pci_buscall(VBUS_PCI_HC_DEVCLOSE,
+ &dev->handle, sizeof(dev->handle));
+
+ if (ret < 0)
+ printk(KERN_ERR "VBUS-PCI: Error closing device %s/%lld: %d\n",
+ vdev->type, vdev->id, ret);
+
+ dev->handle = 0;
+
+ return 0;
+}
+
+/*
+ * -------------------
+ * shmsignal interrupt routines
+ * -------------------
+ */
+
+/* We abstract these routines so that we can drop in irqchip later */
+
+static void
+shmsignal_wakeup(struct _signal *_signal)
+{
+ _shm_signal_wakeup(&_signal->signal);
+}
+
+static int
+shmsignal_connect(struct _signal *_signal)
+{
+ return 0;
+}
+
+static void
+shmsignal_disconnect(struct _signal *_signal)
+{
+
+}
+
+static int
+vbus_pci_device_shm(struct vbus_device_proxy *vdev, const char *name,
+ int id, int prio,
+ void *ptr, size_t len,
+ struct shm_signal_desc *sdesc, struct shm_signal **signal,
+ int flags)
+{
+ struct vbus_pci_device *dev = to_dev(vdev);
+ struct _signal *_signal = NULL;
+ struct vbus_pci_deviceshm params;
+ unsigned long iflags;
+ int ret;
+
+ if (!dev->handle)
+ return -EINVAL;
+
+ params.devh = dev->handle;
+ params.id = id;
+ params.flags = flags;
+ params.datap = (u64)__pa(ptr);
+ params.len = len;
+
+ if (signal) {
+ /*
+ * The signal descriptor must be embedded within the
+ * provided ptr
+ */
+ if (!sdesc
+ || (len < sizeof(*sdesc))
+ || ((void *)sdesc < ptr)
+ || ((void *)sdesc > (ptr + len - sizeof(*sdesc))))
+ return -EINVAL;
+
+ _signal = kzalloc(sizeof(*_signal), GFP_KERNEL);
+ if (!_signal)
+ return -ENOMEM;
+
+ _signal_init(&_signal->signal, sdesc, &_signal_ops);
+
+ /*
+ * take another reference for the host. This is dropped
+ * by a SHMCLOSE event
+ */
+ shm_signal_get(&_signal->signal);
+
+ params.signal.offset = (u64)(unsigned long)sdesc -
+ (u64)(unsigned long)ptr;
+ params.signal.prio = prio;
+ params.signal.cookie = (u64)(unsigned long)_signal;
+
+ } else
+ params.signal.offset = -1; /* yes, this is a u32, but its ok */
+
+ ret = vbus_pci_buscall(VBUS_PCI_HC_DEVSHM,
+ &params, sizeof(params));
+ if (ret < 0)
+ goto fail;
+
+ if (signal) {
+
+ BUG_ON(ret < 0);
+
+ _signal->handle = ret;
+
+ if (!name)
+ snprintf(_signal->name, sizeof(_signal->name),
+ "dev%lld-id%d", vdev->id, id);
+ else
+ snprintf(_signal->name, sizeof(_signal->name),
+ "%s", name);
+
+ shmsignal_connect(_signal);
+
+ spin_lock_irqsave(&vbus_pci.lock, iflags);
+ list_add_tail(&_signal->list, &dev->shms);
+ spin_unlock_irqrestore(&vbus_pci.lock, iflags);
+
+ shm_signal_get(&_signal->signal);
+ *signal = &_signal->signal;
+ }
+
+ return 0;
+
+fail:
+ if (_signal) {
+ /*
+ * We held two references above, so we need to drop
+ * both of them
+ */
+ shm_signal_put(&_signal->signal);
+ shm_signal_put(&_signal->signal);
+ }
+
+ return ret;
+}
+
+static int
+vbus_pci_device_call(struct vbus_device_proxy *vdev, u32 func, void *data,
+ size_t len, int flags)
+{
+ struct vbus_pci_device *dev = to_dev(vdev);
+ struct vbus_pci_devicecall params = {
+ .devh = dev->handle,
+ .func = func,
+ .datap = (u64)__pa(data),
+ .len = len,
+ .flags = flags,
+ };
+
+ if (!dev->handle)
+ return -EINVAL;
+
+ return vbus_pci_buscall(VBUS_PCI_HC_DEVCALL, &params, sizeof(params));
+}
+
+static void
+vbus_pci_device_release(struct vbus_device_proxy *vdev)
+{
+ struct vbus_pci_device *_dev = to_dev(vdev);
+
+ vbus_pci_device_close(vdev, 0);
+
+ kfree(_dev);
+}
+
+static struct vbus_device_proxy_ops vbus_pci_device_ops = {
+ .open = vbus_pci_device_open,
+ .close = vbus_pci_device_close,
+ .shm = vbus_pci_device_shm,
+ .call = vbus_pci_device_call,
+ .release = vbus_pci_device_release,
+};
+
+/*
+ * -------------------
+ * vbus events
+ * -------------------
+ */
+
+struct deferred_devadd_event {
+ struct work_struct work;
+ struct vbus_pci_add_event event;
+};
+
+static void deferred_devdrop(struct work_struct *work);
+
+static void
+deferred_devadd(struct work_struct *work)
+{
+ struct deferred_devadd_event *_event;
+ struct vbus_pci_device *new;
+ int ret;
+
+ _event = container_of(work, struct deferred_devadd_event, work);
+
+ new = kzalloc(sizeof(*new), GFP_KERNEL);
+ if (!new) {
+ printk(KERN_ERR "VBUS_PCI: Out of memory on add_event\n");
+ return;
+ }
+
+ INIT_LIST_HEAD(&new->shms);
+
+ memcpy(new->type, _event->event.type, VBUS_MAX_DEVTYPE_LEN);
+ new->vdev.type = new->type;
+ new->vdev.id = _event->event.id;
+ new->vdev.ops = &vbus_pci_device_ops;
+
+ dev_set_name(&new->vdev.dev, "%lld", _event->event.id);
+
+ INIT_WORK(&new->drop, deferred_devdrop);
+
+ ret = vbus_device_proxy_register(&new->vdev);
+ if (ret < 0)
+ panic("failed to register device %lld(%s): %d\n",
+ new->vdev.id, new->type, ret);
+
+ kfree(_event);
+}
+
+static void
+deferred_devdrop(struct work_struct *work)
+{
+ struct vbus_pci_device *dev;
+
+ dev = container_of(work, struct vbus_pci_device, drop);
+ vbus_device_proxy_unregister(&dev->vdev);
+}
+
+static void
+event_devadd(struct vbus_pci_add_event *event)
+{
+ struct deferred_devadd_event *_event;
+
+ _event = kzalloc(sizeof(*_event), GFP_ATOMIC);
+ if (!_event) {
+ printk(KERN_ERR \
+ "VBUS_PCI: Out of ATOMIC memory on add_event\n");
+ return;
+ }
+
+ INIT_WORK(&_event->work, deferred_devadd);
+ memcpy(&_event->event, event, sizeof(*event));
+
+ schedule_work(&_event->work);
+}
+
+static void
+event_devdrop(struct vbus_pci_handle_event *event)
+{
+ struct vbus_device_proxy *dev = vbus_device_proxy_find(event->handle);
+
+ if (!dev) {
+ printk(KERN_WARNING "VBUS-PCI: devdrop failed: %lld\n",
+ event->handle);
+ return;
+ }
+
+ schedule_work(&to_dev(dev)->drop);
+}
+
+static void
+event_shmsignal(struct vbus_pci_handle_event *event)
+{
+ struct _signal *_signal = (struct _signal *)(unsigned long)event->handle;
+
+ vbus_pci.stats.notify++;
+
+ shmsignal_wakeup(_signal);
+}
+
+static void
+event_shmclose(struct vbus_pci_handle_event *event)
+{
+ struct _signal *_signal = (struct _signal *)(unsigned long)event->handle;
+
+ /*
+ * This reference was taken during the DEVICESHM call
+ */
+ shm_signal_put(&_signal->signal);
+}
+
+/*
+ * -------------------
+ * eventq routines
+ * -------------------
+ */
+
+static struct ioq_notifier eventq_notifier;
+
+static int __devinit
+eventq_init(int qlen)
+{
+ struct ioq_iterator iter;
+ int ret;
+ int i;
+
+ vbus_pci.ring = kzalloc(sizeof(struct vbus_pci_event) * qlen,
+ GFP_KERNEL);
+ if (!vbus_pci.ring)
+ return -ENOMEM;
+
+ /*
+ * We want to iterate on the "valid" index. By default the iterator
+ * will not "autoupdate" which means it will not hypercall the host
+ * with our changes. This is good, because we are really just
+ * initializing stuff here anyway. Note that you can always manually
+ * signal the host with ioq_signal() if the autoupdate feature is not
+ * used.
+ */
+ ret = ioq_iter_init(&vbus_pci.eventq, &iter, ioq_idxtype_valid, 0);
+ BUG_ON(ret < 0);
+
+ /*
+ * Seek to the tail of the valid index (which should be our first
+ * item since the queue is brand-new)
+ */
+ ret = ioq_iter_seek(&iter, ioq_seek_tail, 0, 0);
+ BUG_ON(ret < 0);
+
+ /*
+ * Now populate each descriptor with an empty vbus_event and mark it
+ * valid
+ */
+ for (i = 0; i < qlen; i++) {
+ struct vbus_pci_event *event = &vbus_pci.ring[i];
+ size_t len = sizeof(*event);
+ struct ioq_ring_desc *desc = iter.desc;
+
+ BUG_ON(iter.desc->valid);
+
+ desc->cookie = (u64)(unsigned long)event;
+ desc->ptr = cpu_to_le64(__pa(event));
+ desc->len = cpu_to_le64(len); /* total length */
+ desc->valid = 1;
+
+ /*
+ * This push operation will simultaneously advance the
+ * valid-tail index and increment our position in the queue
+ * by one.
+ */
+ ret = ioq_iter_push(&iter, 0);
+ BUG_ON(ret < 0);
+ }
+
+ vbus_pci.eventq.notifier = &eventq_notifier;
+
+ /*
+ * And finally, ensure that we can receive notification
+ */
+ ioq_notify_enable(&vbus_pci.eventq, 0);
+
+ return 0;
+}
+
+/* Invoked whenever the hypervisor ioq_signal()s our eventq */
+static void
+eventq_wakeup(struct ioq_notifier *notifier)
+{
+ struct ioq_iterator iter;
+ int ret;
+
+ /* We want to iterate on the head of the in-use index */
+ ret = ioq_iter_init(&vbus_pci.eventq, &iter, ioq_idxtype_inuse, 0);
+ BUG_ON(ret < 0);
+
+ ret = ioq_iter_seek(&iter, ioq_seek_head, 0, 0);
+ BUG_ON(ret < 0);
+
+ /*
+ * The EOM is indicated by finding a packet that is still owned by
+ * the south side.
+ *
+ * FIXME: This in theory could run indefinitely if the host keeps
+ * feeding us events since there is nothing like a NAPI budget. We
+ * might need to address that
+ */
+ while (!iter.desc->sown) {
+ struct ioq_ring_desc *desc = iter.desc;
+ struct vbus_pci_event *event;
+
+ event = (struct vbus_pci_event *)(unsigned long)desc->cookie;
+
+ switch (event->eventid) {
+ case VBUS_PCI_EVENT_DEVADD:
+ event_devadd(&event->data.add);
+ break;
+ case VBUS_PCI_EVENT_DEVDROP:
+ event_devdrop(&event->data.handle);
+ break;
+ case VBUS_PCI_EVENT_SHMSIGNAL:
+ event_shmsignal(&event->data.handle);
+ break;
+ case VBUS_PCI_EVENT_SHMCLOSE:
+ event_shmclose(&event->data.handle);
+ break;
+ default:
+ printk(KERN_WARNING "VBUS_PCI: Unexpected event %d\n",
+ event->eventid);
+ break;
+ };
+
+ memset(event, 0, sizeof(*event));
+
+ /* Advance the in-use head */
+ ret = ioq_iter_pop(&iter, 0);
+ BUG_ON(ret < 0);
+
+ vbus_pci.stats.events++;
+ }
+
+ /* And let the south side know that we changed the queue */
+ ioq_signal(&vbus_pci.eventq, 0);
+}
+
+static struct ioq_notifier eventq_notifier = {
+ .signal = &eventq_wakeup,
+};
+
+/* Injected whenever the host issues an ioq_signal() on the eventq */
+static irqreturn_t
+eventq_intr(int irq, void *dev)
+{
+ vbus_pci.stats.qnotify++;
+ _shm_signal_wakeup(vbus_pci.eventq.signal);
+
+ return IRQ_HANDLED;
+}
+
+/*
+ * -------------------
+ */
+
+static int
+eventq_signal_inject(struct shm_signal *signal)
+{
+ vbus_pci.stats.qinject++;
+
+ /* The eventq uses the special-case handle=0 */
+ iowrite32(0, &vbus_pci.signals->eventq);
+
+ return 0;
+}
+
+static void
+eventq_signal_release(struct shm_signal *signal)
+{
+ kfree(signal);
+}
+
+static struct shm_signal_ops eventq_signal_ops = {
+ .inject = eventq_signal_inject,
+ .release = eventq_signal_release,
+};
+
+/*
+ * -------------------
+ */
+
+static void
+eventq_ioq_release(struct ioq *ioq)
+{
+ /* released as part of the vbus_pci object */
+}
+
+static struct ioq_ops eventq_ioq_ops = {
+ .release = eventq_ioq_release,
+};
+
+/*
+ * -------------------
+ */
+
+static void
+vbus_pci_release(void)
+{
+#ifdef CONFIG_DEBUG_FS
+ if (vbus_pci.stats.fs)
+ debugfs_remove(vbus_pci.stats.fs);
+#endif
+
+ if (vbus_pci.irq > 0)
+ free_irq(vbus_pci.irq, NULL);
+
+ if (vbus_pci.signals)
+ pci_iounmap(vbus_pci.dev, (void *)vbus_pci.signals);
+
+ if (vbus_pci.regs)
+ pci_iounmap(vbus_pci.dev, (void *)vbus_pci.regs);
+
+ pci_release_regions(vbus_pci.dev);
+ pci_disable_device(vbus_pci.dev);
+
+ kfree(vbus_pci.eventq.head_desc);
+ kfree(vbus_pci.ring);
+
+ vbus_pci.enabled = false;
+}
+
+static int __devinit
+vbus_pci_open(void)
+{
+ struct vbus_pci_bridge_negotiate params = {
+ .magic = VBUS_PCI_ABI_MAGIC,
+ .version = VBUS_PCI_HC_VERSION,
+ .capabilities = 0,
+ };
+
+ return vbus_pci_bridgecall(VBUS_PCI_BRIDGE_NEGOTIATE,
+ &params, sizeof(params));
+}
+
+#define QLEN 1024
+
+static int __devinit
+vbus_pci_eventq_register(void)
+{
+ struct vbus_pci_busreg params = {
+ .count = 1,
+ .eventq = {
+ {
+ .count = QLEN,
+ .ring = (u64)__pa(vbus_pci.eventq.head_desc),
+ .data = (u64)__pa(vbus_pci.ring),
+ },
+ },
+ };
+
+ return vbus_pci_bridgecall(VBUS_PCI_BRIDGE_QREG,
+ &params, sizeof(params));
+}
+
+static int __devinit
+_ioq_init(size_t ringsize, struct ioq *ioq, struct ioq_ops *ops)
+{
+ struct shm_signal *signal = NULL;
+ struct ioq_ring_head *head = NULL;
+ size_t len = IOQ_HEAD_DESC_SIZE(ringsize);
+
+ head = kzalloc(len, GFP_KERNEL | GFP_DMA);
+ if (!head)
+ return -ENOMEM;
+
+ signal = kzalloc(sizeof(*signal), GFP_KERNEL);
+ if (!signal) {
+ kfree(head);
+ return -ENOMEM;
+ }
+
+ head->magic = IOQ_RING_MAGIC;
+ head->ver = IOQ_RING_VER;
+ head->count = cpu_to_le32(ringsize);
+
+ _signal_init(signal, &head->signal, &eventq_signal_ops);
+
+ ioq_init(ioq, ops, ioq_locality_north, head, signal, ringsize);
+
+ return 0;
+}
+
+#ifdef CONFIG_DEBUG_FS
+static int _debugfs_seq_show(struct seq_file *m, void *p)
+{
+#define P(F) \
+ seq_printf(m, " .%-30s: %d\n", #F, (int)vbus_pci.stats.F)
+
+ P(events);
+ P(qnotify);
+ P(qinject);
+ P(notify);
+ P(inject);
+ P(bridgecalls);
+ P(buscalls);
+
+#undef P
+
+ return 0;
+}
+
+static int _debugfs_fops_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, _debugfs_seq_show, inode->i_private);
+}
+
+static const struct file_operations stat_fops = {
+ .open = _debugfs_fops_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+ .owner = THIS_MODULE,
+};
+#endif
+
+static int __devinit
+vbus_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+{
+ int ret;
+ int cpu;
+
+ if (vbus_pci.enabled)
+ return -EEXIST; /* we only support one bridge per kernel */
+
+ if (pdev->revision != VBUS_PCI_ABI_VERSION) {
+ printk(KERN_DEBUG "VBUS_PCI: expected ABI version %d, got %d\n",
+ VBUS_PCI_ABI_VERSION,
+ pdev->revision);
+ return -ENODEV;
+ }
+
+ vbus_pci.dev = pdev;
+
+ ret = pci_enable_device(pdev);
+ if (ret < 0)
+ return ret;
+
+ pci_set_master(pdev);
+
+ ret = pci_request_regions(pdev, VBUS_PCI_NAME);
+ if (ret < 0) {
+ printk(KERN_ERR "VBUS_PCI: Could not init BARs: %d\n", ret);
+ goto out_fail;
+ }
+
+ vbus_pci.regs = pci_iomap(pdev, 0, sizeof(struct vbus_pci_regs));
+ if (!vbus_pci.regs) {
+ printk(KERN_ERR "VBUS_PCI: Could not map BARs\n");
+ goto out_fail;
+ }
+
+ vbus_pci.signals = pci_iomap(pdev, 1, sizeof(struct vbus_pci_signals));
+ if (!vbus_pci.signals) {
+ printk(KERN_ERR "VBUS_PCI: Could not map BARs\n");
+ goto out_fail;
+ }
+
+ ret = vbus_pci_open();
+ if (ret < 0) {
+ printk(KERN_DEBUG "VBUS_PCI: Could not register with host: %d\n",
+ ret);
+ goto out_fail;
+ }
+
+ /*
+ * Allocate an IOQ to use for host-2-guest event notification
+ */
+ ret = _ioq_init(QLEN, &vbus_pci.eventq, &eventq_ioq_ops);
+ if (ret < 0) {
+ printk(KERN_ERR "VBUS_PCI: Cound not init eventq: %d\n", ret);
+ goto out_fail;
+ }
+
+ ret = eventq_init(QLEN);
+ if (ret < 0) {
+ printk(KERN_ERR "VBUS_PCI: Cound not setup ring: %d\n", ret);
+ goto out_fail;
+ }
+
+ ret = pci_enable_msi(pdev);
+ if (ret < 0) {
+ printk(KERN_ERR "VBUS_PCI: Cound not enable MSI: %d\n", ret);
+ goto out_fail;
+ }
+
+ vbus_pci.irq = pdev->irq;
+
+ ret = request_irq(pdev->irq, eventq_intr, 0, "vbus", NULL);
+ if (ret < 0) {
+ printk(KERN_ERR "VBUS_PCI: Failed to register IRQ %d\n: %d",
+ pdev->irq, ret);
+ goto out_fail;
+ }
+
+ /*
+ * Add one fastcall vector per cpu so that we can do lockless
+ * hypercalls
+ */
+ for_each_possible_cpu(cpu) {
+ struct vbus_pci_fastcall_desc *desc =
+ &per_cpu(vbus_pci_percpu_fastcall, cpu);
+ struct vbus_pci_call_desc params = {
+ .vector = cpu,
+ .len = sizeof(*desc),
+ .datap = __pa(desc),
+ };
+
+ ret = vbus_pci_bridgecall(VBUS_PCI_BRIDGE_FASTCALL_ADD,
+ &params, sizeof(params));
+ if (ret < 0) {
+ printk(KERN_ERR \
+ "VBUS_PCI: Failed to register cpu:%d\n: %d",
+ cpu, ret);
+ goto out_fail;
+ }
+ }
+
+ /*
+ * Finally register our queue on the host to start receiving events
+ */
+ ret = vbus_pci_eventq_register();
+ if (ret < 0) {
+ printk(KERN_ERR "VBUS_PCI: Could not register with host: %d\n",
+ ret);
+ goto out_fail;
+ }
+
+#ifdef CONFIG_DEBUG_FS
+ vbus_pci.stats.fs = debugfs_create_file(VBUS_PCI_NAME, S_IRUGO,
+ NULL, NULL, &stat_fops);
+ if (IS_ERR(vbus_pci.stats.fs)) {
+ ret = PTR_ERR(vbus_pci.stats.fs);
+ printk(KERN_ERR "VBUS_PCI: error creating stats-fs: %d\n", ret);
+ goto out_fail;
+ }
+#endif
+
+ vbus_pci.enabled = true;
+
+ printk(KERN_INFO "Virtual-Bus: Copyright (c) 2009, " \
+ "Gregory Haskins <ghaskins@novell.com>\n");
+
+ return 0;
+
+ out_fail:
+ vbus_pci_release();
+
+ return ret;
+}
+
+static void __devexit
+vbus_pci_remove(struct pci_dev *pdev)
+{
+ vbus_pci_release();
+}
+
+static DEFINE_PCI_DEVICE_TABLE(vbus_pci_tbl) = {
+ { PCI_DEVICE(0x11da, 0x2000) },
+ { 0 },
+};
+
+MODULE_DEVICE_TABLE(pci, vbus_pci_tbl);
+
+static struct pci_driver vbus_pci_driver = {
+ .name = VBUS_PCI_NAME,
+ .id_table = vbus_pci_tbl,
+ .probe = vbus_pci_probe,
+ .remove = vbus_pci_remove,
+};
+
+static int __init
+vbus_pci_init(void)
+{
+ memset(&vbus_pci, 0, sizeof(vbus_pci));
+ spin_lock_init(&vbus_pci.lock);
+
+ return pci_register_driver(&vbus_pci_driver);
+}
+
+static void __exit
+vbus_pci_exit(void)
+{
+ pci_unregister_driver(&vbus_pci_driver);
+}
+
+module_init(vbus_pci_init);
+module_exit(vbus_pci_exit);
+
diff --git a/drivers/video/amba-clcd.c b/drivers/video/amba-clcd.c
index afe21e6eb544..1c2c68356ea7 100644
--- a/drivers/video/amba-clcd.c
+++ b/drivers/video/amba-clcd.c
@@ -80,7 +80,10 @@ static void clcdfb_disable(struct clcd_fb *fb)
/*
* Disable CLCD clock source.
*/
- clk_disable(fb->clk);
+ if (fb->clk_enabled) {
+ fb->clk_enabled = false;
+ clk_disable(fb->clk);
+ }
}
static void clcdfb_enable(struct clcd_fb *fb, u32 cntl)
@@ -88,7 +91,10 @@ static void clcdfb_enable(struct clcd_fb *fb, u32 cntl)
/*
* Enable the CLCD clock source.
*/
- clk_enable(fb->clk);
+ if (!fb->clk_enabled) {
+ fb->clk_enabled = true;
+ clk_enable(fb->clk);
+ }
/*
* Bring up by first enabling..
diff --git a/drivers/video/bf54x-lq043fb.c b/drivers/video/bf54x-lq043fb.c
index b020ba7f1cf2..e7d0f525041e 100644
--- a/drivers/video/bf54x-lq043fb.c
+++ b/drivers/video/bf54x-lq043fb.c
@@ -241,12 +241,12 @@ static int request_ports(struct bfin_bf54xfb_info *fbi)
u16 disp = fbi->mach_info->disp;
if (gpio_request(disp, DRIVER_NAME)) {
- printk(KERN_ERR "Requesting GPIO %d faild\n", disp);
+ printk(KERN_ERR "Requesting GPIO %d failed\n", disp);
return -EFAULT;
}
if (peripheral_request_list(eppi_req_18, DRIVER_NAME)) {
- printk(KERN_ERR "Requesting Peripherals faild\n");
+ printk(KERN_ERR "Requesting Peripherals failed\n");
gpio_free(disp);
return -EFAULT;
}
@@ -256,7 +256,7 @@ static int request_ports(struct bfin_bf54xfb_info *fbi)
u16 eppi_req_24[] = EPPI0_24;
if (peripheral_request_list(eppi_req_24, DRIVER_NAME)) {
- printk(KERN_ERR "Requesting Peripherals faild\n");
+ printk(KERN_ERR "Requesting Peripherals failed\n");
peripheral_free_list(eppi_req_18);
gpio_free(disp);
return -EFAULT;
diff --git a/drivers/video/bfin-t350mcqb-fb.c b/drivers/video/bfin-t350mcqb-fb.c
index 7a50272eaab9..3cf77676947c 100644
--- a/drivers/video/bfin-t350mcqb-fb.c
+++ b/drivers/video/bfin-t350mcqb-fb.c
@@ -192,7 +192,7 @@ static int bfin_t350mcqb_request_ports(int action)
{
if (action) {
if (peripheral_request_list(ppi0_req_8, DRIVER_NAME)) {
- printk(KERN_ERR "Requesting Peripherals faild\n");
+ printk(KERN_ERR "Requesting Peripherals failed\n");
return -EFAULT;
}
} else
diff --git a/drivers/video/vesafb.c b/drivers/video/vesafb.c
index 090aa1a9be6e..6a069d047914 100644
--- a/drivers/video/vesafb.c
+++ b/drivers/video/vesafb.c
@@ -253,7 +253,7 @@ static int __init vesafb_probe(struct platform_device *dev)
size_vmode = vesafb_defined.yres * vesafb_fix.line_length;
/* size_total -- all video memory we have. Used for mtrr
- * entries, ressource allocation and bounds
+ * entries, resource allocation and bounds
* checking. */
size_total = screen_info.lfb_size * 65536;
if (vram_total)
diff --git a/drivers/video/via/dvi.c b/drivers/video/via/dvi.c
index 39b040bb3817..7c82f6fda918 100644
--- a/drivers/video/via/dvi.c
+++ b/drivers/video/via/dvi.c
@@ -25,10 +25,12 @@
static void tmds_register_write(int index, u8 data);
static int tmds_register_read(int index);
static int tmds_register_read_bytes(int index, u8 *buff, int buff_len);
-static void dvi_get_panel_size_from_DDCv1(struct tmds_chip_information
- *tmds_chip, struct tmds_setting_information *tmds_setting);
-static void dvi_get_panel_size_from_DDCv2(struct tmds_chip_information
- *tmds_chip, struct tmds_setting_information *tmds_setting);
+static void __devinit dvi_get_panel_size_from_DDCv1(
+ struct tmds_chip_information *tmds_chip,
+ struct tmds_setting_information *tmds_setting);
+static void __devinit dvi_get_panel_size_from_DDCv2(
+ struct tmds_chip_information *tmds_chip,
+ struct tmds_setting_information *tmds_setting);
static int viafb_dvi_query_EDID(void);
static int check_tmds_chip(int device_id_subaddr, int device_id)
@@ -39,7 +41,7 @@ static int check_tmds_chip(int device_id_subaddr, int device_id)
return FAIL;
}
-void viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
+void __devinit viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
struct tmds_setting_information *tmds_setting)
{
DEBUG_MSG(KERN_INFO "viafb_init_dvi_size()\n");
@@ -60,7 +62,7 @@ void viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
return;
}
-int viafb_tmds_trasmitter_identify(void)
+int __devinit viafb_tmds_trasmitter_identify(void)
{
unsigned char sr2a = 0, sr1e = 0, sr3e = 0;
@@ -208,8 +210,6 @@ void viafb_dvi_set_mode(struct VideoModeTable *mode, int mode_bpp,
}
}
viafb_fill_crtc_timing(pDviTiming, mode, mode_bpp / 8, set_iga);
- viafb_set_output_path(DEVICE_DVI, set_iga,
- viaparinfo->chip_info->tmds_chip_info.output_interface);
}
/* Sense DVI Connector */
@@ -313,8 +313,9 @@ static int viafb_dvi_query_EDID(void)
}
/* Get Panel Size Using EDID1 Table */
-static void dvi_get_panel_size_from_DDCv1(struct tmds_chip_information
- *tmds_chip, struct tmds_setting_information *tmds_setting)
+static void __devinit dvi_get_panel_size_from_DDCv1(
+ struct tmds_chip_information *tmds_chip,
+ struct tmds_setting_information *tmds_setting)
{
int i, max_h = 0, tmp, restore;
unsigned char rData;
@@ -418,8 +419,9 @@ static void dvi_get_panel_size_from_DDCv1(struct tmds_chip_information
}
/* Get Panel Size Using EDID2 Table */
-static void dvi_get_panel_size_from_DDCv2(struct tmds_chip_information
- *tmds_chip, struct tmds_setting_information *tmds_setting)
+static void __devinit dvi_get_panel_size_from_DDCv2(
+ struct tmds_chip_information *tmds_chip,
+ struct tmds_setting_information *tmds_setting)
{
int restore;
unsigned char R_Buffer[2];
@@ -494,38 +496,103 @@ void viafb_dvi_disable(void)
viafb_read_reg(VIACR, CRD2) | 0x08);
}
+static void dvi_patch_skew_dvp0(void)
+{
+ /* Reset data driving first: */
+ viafb_write_reg_mask(SR1B, VIASR, 0, BIT1);
+ viafb_write_reg_mask(SR2A, VIASR, 0, BIT4);
+
+ switch (viaparinfo->chip_info->gfx_chip_name) {
+ case UNICHROME_P4M890:
+ {
+ if ((viaparinfo->tmds_setting_info->h_active == 1600) &&
+ (viaparinfo->tmds_setting_info->v_active ==
+ 1200))
+ viafb_write_reg_mask(CR96, VIACR, 0x03,
+ BIT0 + BIT1 + BIT2);
+ else
+ viafb_write_reg_mask(CR96, VIACR, 0x07,
+ BIT0 + BIT1 + BIT2);
+ break;
+ }
+
+ case UNICHROME_P4M900:
+ {
+ viafb_write_reg_mask(CR96, VIACR, 0x07,
+ BIT0 + BIT1 + BIT2 + BIT3);
+ viafb_write_reg_mask(SR1B, VIASR, 0x02, BIT1);
+ viafb_write_reg_mask(SR2A, VIASR, 0x10, BIT4);
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+}
+
+static void dvi_patch_skew_dvp_low(void)
+{
+ switch (viaparinfo->chip_info->gfx_chip_name) {
+ case UNICHROME_K8M890:
+ {
+ viafb_write_reg_mask(CR99, VIACR, 0x03, BIT0 + BIT1);
+ break;
+ }
+
+ case UNICHROME_P4M900:
+ {
+ viafb_write_reg_mask(CR99, VIACR, 0x08,
+ BIT0 + BIT1 + BIT2 + BIT3);
+ break;
+ }
+
+ case UNICHROME_P4M890:
+ {
+ viafb_write_reg_mask(CR99, VIACR, 0x0F,
+ BIT0 + BIT1 + BIT2 + BIT3);
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+}
+
/* If Enable DVI, turn off pad */
void viafb_dvi_enable(void)
{
u8 data;
- if (viaparinfo->chip_info->
- tmds_chip_info.output_interface == INTERFACE_DVP0) {
- viafb_write_reg(SR1E, VIASR,
- viafb_read_reg(VIASR, SR1E) | 0xC0);
+ switch (viaparinfo->chip_info->tmds_chip_info.output_interface) {
+ case INTERFACE_DVP0:
+ viafb_write_reg_mask(CR6B, VIACR, 0x01, BIT0);
+ viafb_write_reg_mask(CR6C, VIACR, 0x21, BIT0 + BIT5);
+ viafb_write_reg_mask(SR1E, VIASR, 0xC0, BIT7 + BIT6);
+ dvi_patch_skew_dvp0();
if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
tmds_register_write(0x88, 0x3b);
else
/*clear CR91[5] to direct on display period
in the secondary diplay path */
- viafb_write_reg(CR91, VIACR,
- viafb_read_reg(VIACR, CR91) & 0xDF);
- }
+ via_write_reg_mask(VIACR, 0x91, 0x00, 0x20);
+ break;
- if (viaparinfo->chip_info->
- tmds_chip_info.output_interface == INTERFACE_DVP1) {
- viafb_write_reg(SR1E, VIASR,
- viafb_read_reg(VIASR, SR1E) | 0x30);
+ case INTERFACE_DVP1:
+ if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
+ viafb_write_reg_mask(CR93, VIACR, 0x21, BIT0 + BIT5);
+ viafb_write_reg_mask(SR1E, VIASR, 0x30, BIT4 + BIT5);
/*fix dvi cann't be enabled with MB VT5718C4 - Al Zhang */
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
+ if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
tmds_register_write(0x88, 0x3b);
- } else {
+ else
/*clear CR91[5] to direct on display period
in the secondary diplay path */
- viafb_write_reg(CR91, VIACR,
- viafb_read_reg(VIACR, CR91) & 0xDF);
- }
+ via_write_reg_mask(VIACR, 0x91, 0x00, 0x20);
/*fix DVI cannot enable on EPIA-M board */
if (viafb_platform_epia_dvi == 1) {
@@ -537,36 +604,41 @@ void viafb_dvi_enable(void)
else
data = 0x37;
viafb_i2c_writebyte(viaparinfo->chip_info->
- tmds_chip_info.i2c_port,
- viaparinfo->chip_info->
- tmds_chip_info.tmds_chip_slave_addr,
- 0x08, data);
+ tmds_chip_info.i2c_port,
+ viaparinfo->chip_info->
+ tmds_chip_info.tmds_chip_slave_addr,
+ 0x08, data);
}
}
- }
+ break;
- if (viaparinfo->chip_info->
- tmds_chip_info.output_interface == INTERFACE_DFP_HIGH) {
- viafb_write_reg(SR2A, VIASR,
- viafb_read_reg(VIASR, SR2A) | 0x0C);
- viafb_write_reg(CR91, VIACR,
- viafb_read_reg(VIACR, CR91) & 0xDF);
- }
+ case INTERFACE_DFP_HIGH:
+ if (viaparinfo->chip_info->gfx_chip_name != UNICHROME_CLE266)
+ via_write_reg_mask(VIACR, CR97, 0x03, 0x03);
- if (viaparinfo->chip_info->
- tmds_chip_info.output_interface == INTERFACE_DFP_LOW) {
- viafb_write_reg(SR2A, VIASR,
- viafb_read_reg(VIASR, SR2A) | 0x03);
- viafb_write_reg(CR91, VIACR,
- viafb_read_reg(VIACR, CR91) & 0xDF);
- }
- if (viaparinfo->chip_info->
- tmds_chip_info.output_interface == INTERFACE_TMDS) {
+ viafb_write_reg_mask(SR2A, VIASR, 0x0C, BIT2 + BIT3);
+ via_write_reg_mask(VIACR, 0x91, 0x00, 0x20);
+ break;
+
+ case INTERFACE_DFP_LOW:
+ if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
+ break;
+ viafb_write_reg_mask(SR2A, VIASR, 0x03, BIT0 + BIT1);
+ dvi_patch_skew_dvp_low();
+ via_write_reg_mask(VIACR, 0x91, 0x00, 0x20);
+ break;
+
+ case INTERFACE_TMDS:
/* Turn on Display period in the panel path. */
viafb_write_reg_mask(CR91, VIACR, 0, BIT7);
/* Turn on TMDS power. */
viafb_write_reg_mask(CRD2, VIACR, 0, BIT3);
+ break;
}
-}
+ if (viaparinfo->tmds_setting_info->iga_path == IGA2) {
+ /* Disable LCD Scaling */
+ viafb_write_reg_mask(CR79, VIACR, 0x00, BIT0);
+ }
+}
diff --git a/drivers/video/via/dvi.h b/drivers/video/via/dvi.h
index 0dffcfd395f3..2c525c0c1adb 100644
--- a/drivers/video/via/dvi.h
+++ b/drivers/video/via/dvi.h
@@ -56,8 +56,8 @@
int viafb_dvi_sense(void);
void viafb_dvi_disable(void);
void viafb_dvi_enable(void);
-int viafb_tmds_trasmitter_identify(void);
-void viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
+int __devinit viafb_tmds_trasmitter_identify(void);
+void __devinit viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
struct tmds_setting_information *tmds_setting);
void viafb_dvi_set_mode(struct VideoModeTable *videoMode, int mode_bpp,
int set_iga);
diff --git a/drivers/video/via/hw.c b/drivers/video/via/hw.c
index 7dcb4d5bb9c3..03303232e543 100644
--- a/drivers/video/via/hw.c
+++ b/drivers/video/via/hw.c
@@ -718,16 +718,10 @@ static struct rgbLUT palLUT_table[] = {
0x00}
};
-static void set_crt_output_path(int set_iga);
-static void dvi_patch_skew_dvp0(void);
-static void dvi_patch_skew_dvp1(void);
-static void dvi_patch_skew_dvp_low(void);
-static void set_dvi_output_path(int set_iga, int output_interface);
-static void set_lcd_output_path(int set_iga, int output_interface);
static void load_fix_bit_crtc_reg(void);
-static void init_gfx_chip_info(int chip_type);
-static void init_tmds_chip_info(void);
-static void init_lvds_chip_info(void);
+static void __devinit init_gfx_chip_info(int chip_type);
+static void __devinit init_tmds_chip_info(void);
+static void __devinit init_lvds_chip_info(void);
static void device_screen_off(void);
static void device_screen_on(void);
static void set_display_channel(void);
@@ -755,6 +749,66 @@ void write_dac_reg(u8 index, u8 r, u8 g, u8 b)
outb(b, LUT_DATA);
}
+static u32 get_dvi_devices(int output_interface)
+{
+ switch (output_interface) {
+ case INTERFACE_DVP0:
+ return VIA_96 | VIA_6C;
+
+ case INTERFACE_DVP1:
+ if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
+ return VIA_93;
+ else
+ return VIA_DVP1;
+
+ case INTERFACE_DFP_HIGH:
+ if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
+ return 0;
+ else
+ return VIA_LVDS2 | VIA_96;
+
+ case INTERFACE_DFP_LOW:
+ if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
+ return 0;
+ else
+ return VIA_DVP1 | VIA_LVDS1;
+
+ case INTERFACE_TMDS:
+ return VIA_LVDS1;
+ }
+
+ return 0;
+}
+
+static u32 get_lcd_devices(int output_interface)
+{
+ switch (output_interface) {
+ case INTERFACE_DVP0:
+ return VIA_96;
+
+ case INTERFACE_DVP1:
+ return VIA_DVP1;
+
+ case INTERFACE_DFP_HIGH:
+ return VIA_LVDS2 | VIA_96;
+
+ case INTERFACE_DFP_LOW:
+ return VIA_LVDS1 | VIA_DVP1;
+
+ case INTERFACE_DFP:
+ return VIA_LVDS1 | VIA_LVDS2;
+
+ case INTERFACE_LVDS0:
+ case INTERFACE_LVDS0LVDS1:
+ return VIA_LVDS1;
+
+ case INTERFACE_LVDS1:
+ return VIA_LVDS2;
+ }
+
+ return 0;
+}
+
/*Set IGA path for each device*/
void viafb_set_iga_path(void)
{
@@ -821,6 +875,48 @@ void viafb_set_iga_path(void)
viaparinfo->tmds_setting_info->iga_path = IGA1;
}
}
+
+ viaparinfo->shared->iga1_devices = 0;
+ viaparinfo->shared->iga2_devices = 0;
+ if (viafb_CRT_ON) {
+ if (viaparinfo->crt_setting_info->iga_path == IGA1)
+ viaparinfo->shared->iga1_devices |= VIA_CRT;
+ else
+ viaparinfo->shared->iga2_devices |= VIA_CRT;
+ }
+
+ if (viafb_DVI_ON) {
+ if (viaparinfo->tmds_setting_info->iga_path == IGA1)
+ viaparinfo->shared->iga1_devices |= get_dvi_devices(
+ viaparinfo->chip_info->
+ tmds_chip_info.output_interface);
+ else
+ viaparinfo->shared->iga2_devices |= get_dvi_devices(
+ viaparinfo->chip_info->
+ tmds_chip_info.output_interface);
+ }
+
+ if (viafb_LCD_ON) {
+ if (viaparinfo->lvds_setting_info->iga_path == IGA1)
+ viaparinfo->shared->iga1_devices |= get_lcd_devices(
+ viaparinfo->chip_info->
+ lvds_chip_info.output_interface);
+ else
+ viaparinfo->shared->iga2_devices |= get_lcd_devices(
+ viaparinfo->chip_info->
+ lvds_chip_info.output_interface);
+ }
+
+ if (viafb_LCD2_ON) {
+ if (viaparinfo->lvds_setting_info2->iga_path == IGA1)
+ viaparinfo->shared->iga1_devices |= get_lcd_devices(
+ viaparinfo->chip_info->
+ lvds_chip_info2.output_interface);
+ else
+ viaparinfo->shared->iga2_devices |= get_lcd_devices(
+ viaparinfo->chip_info->
+ lvds_chip_info2.output_interface);
+ }
}
static void set_color_register(u8 index, u8 red, u8 green, u8 blue)
@@ -844,295 +940,90 @@ void viafb_set_secondary_color_register(u8 index, u8 red, u8 green, u8 blue)
set_color_register(index, red, green, blue);
}
-void viafb_set_output_path(int device, int set_iga, int output_interface)
+static void set_source_common(u8 index, u8 offset, u8 iga)
{
- switch (device) {
- case DEVICE_CRT:
- set_crt_output_path(set_iga);
- break;
- case DEVICE_DVI:
- set_dvi_output_path(set_iga, output_interface);
+ u8 value, mask = 1 << offset;
+
+ switch (iga) {
+ case IGA1:
+ value = 0x00;
break;
- case DEVICE_LCD:
- set_lcd_output_path(set_iga, output_interface);
+ case IGA2:
+ value = mask;
break;
+ default:
+ printk(KERN_WARNING "viafb: Unsupported source: %d\n", iga);
+ return;
}
+
+ via_write_reg_mask(VIACR, index, value, mask);
}
-static void set_crt_output_path(int set_iga)
+static void set_crt_source(u8 iga)
{
- viafb_write_reg_mask(CR36, VIACR, 0x00, BIT4 + BIT5);
+ u8 value;
- switch (set_iga) {
+ switch (iga) {
case IGA1:
- viafb_write_reg_mask(SR16, VIASR, 0x00, BIT6);
+ value = 0x00;
break;
case IGA2:
- viafb_write_reg_mask(CR6A, VIACR, 0xC0, BIT6 + BIT7);
- viafb_write_reg_mask(SR16, VIASR, 0x40, BIT6);
+ value = 0x40;
break;
+ default:
+ printk(KERN_WARNING "viafb: Unsupported source: %d\n", iga);
+ return;
}
+
+ via_write_reg_mask(VIASR, 0x16, value, 0x40);
}
-static void dvi_patch_skew_dvp0(void)
+static inline void set_6C_source(u8 iga)
{
- /* Reset data driving first: */
- viafb_write_reg_mask(SR1B, VIASR, 0, BIT1);
- viafb_write_reg_mask(SR2A, VIASR, 0, BIT4);
-
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_P4M890:
- {
- if ((viaparinfo->tmds_setting_info->h_active == 1600) &&
- (viaparinfo->tmds_setting_info->v_active ==
- 1200))
- viafb_write_reg_mask(CR96, VIACR, 0x03,
- BIT0 + BIT1 + BIT2);
- else
- viafb_write_reg_mask(CR96, VIACR, 0x07,
- BIT0 + BIT1 + BIT2);
- break;
- }
-
- case UNICHROME_P4M900:
- {
- viafb_write_reg_mask(CR96, VIACR, 0x07,
- BIT0 + BIT1 + BIT2 + BIT3);
- viafb_write_reg_mask(SR1B, VIASR, 0x02, BIT1);
- viafb_write_reg_mask(SR2A, VIASR, 0x10, BIT4);
- break;
- }
-
- default:
- {
- break;
- }
- }
+ set_source_common(0x6C, 7, iga);
}
-static void dvi_patch_skew_dvp1(void)
+static inline void set_93_source(u8 iga)
{
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_CX700:
- {
- break;
- }
-
- default:
- {
- break;
- }
- }
+ set_source_common(0x93, 7, iga);
}
-static void dvi_patch_skew_dvp_low(void)
+static inline void set_96_source(u8 iga)
{
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_K8M890:
- {
- viafb_write_reg_mask(CR99, VIACR, 0x03, BIT0 + BIT1);
- break;
- }
-
- case UNICHROME_P4M900:
- {
- viafb_write_reg_mask(CR99, VIACR, 0x08,
- BIT0 + BIT1 + BIT2 + BIT3);
- break;
- }
-
- case UNICHROME_P4M890:
- {
- viafb_write_reg_mask(CR99, VIACR, 0x0F,
- BIT0 + BIT1 + BIT2 + BIT3);
- break;
- }
-
- default:
- {
- break;
- }
- }
+ set_source_common(0x96, 4, iga);
}
-static void set_dvi_output_path(int set_iga, int output_interface)
+static inline void set_dvp1_source(u8 iga)
{
- switch (output_interface) {
- case INTERFACE_DVP0:
- viafb_write_reg_mask(CR6B, VIACR, 0x01, BIT0);
-
- if (set_iga == IGA1) {
- viafb_write_reg_mask(CR96, VIACR, 0x00, BIT4);
- viafb_write_reg_mask(CR6C, VIACR, 0x21, BIT0 +
- BIT5 + BIT7);
- } else {
- viafb_write_reg_mask(CR96, VIACR, 0x10, BIT4);
- viafb_write_reg_mask(CR6C, VIACR, 0xA1, BIT0 +
- BIT5 + BIT7);
- }
-
- viafb_write_reg_mask(SR1E, VIASR, 0xC0, BIT7 + BIT6);
-
- dvi_patch_skew_dvp0();
- break;
-
- case INTERFACE_DVP1:
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
- if (set_iga == IGA1)
- viafb_write_reg_mask(CR93, VIACR, 0x21,
- BIT0 + BIT5 + BIT7);
- else
- viafb_write_reg_mask(CR93, VIACR, 0xA1,
- BIT0 + BIT5 + BIT7);
- } else {
- if (set_iga == IGA1)
- viafb_write_reg_mask(CR9B, VIACR, 0x00, BIT4);
- else
- viafb_write_reg_mask(CR9B, VIACR, 0x10, BIT4);
- }
-
- viafb_write_reg_mask(SR1E, VIASR, 0x30, BIT4 + BIT5);
- dvi_patch_skew_dvp1();
- break;
- case INTERFACE_DFP_HIGH:
- if (viaparinfo->chip_info->gfx_chip_name != UNICHROME_CLE266) {
- if (set_iga == IGA1) {
- viafb_write_reg_mask(CR96, VIACR, 0x00, BIT4);
- viafb_write_reg_mask(CR97, VIACR, 0x03,
- BIT0 + BIT1 + BIT4);
- } else {
- viafb_write_reg_mask(CR96, VIACR, 0x10, BIT4);
- viafb_write_reg_mask(CR97, VIACR, 0x13,
- BIT0 + BIT1 + BIT4);
- }
- }
- viafb_write_reg_mask(SR2A, VIASR, 0x0C, BIT2 + BIT3);
- break;
-
- case INTERFACE_DFP_LOW:
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
- break;
-
- if (set_iga == IGA1) {
- viafb_write_reg_mask(CR99, VIACR, 0x00, BIT4);
- viafb_write_reg_mask(CR9B, VIACR, 0x00, BIT4);
- } else {
- viafb_write_reg_mask(CR99, VIACR, 0x10, BIT4);
- viafb_write_reg_mask(CR9B, VIACR, 0x10, BIT4);
- }
-
- viafb_write_reg_mask(SR2A, VIASR, 0x03, BIT0 + BIT1);
- dvi_patch_skew_dvp_low();
- break;
-
- case INTERFACE_TMDS:
- if (set_iga == IGA1)
- viafb_write_reg_mask(CR99, VIACR, 0x00, BIT4);
- else
- viafb_write_reg_mask(CR99, VIACR, 0x10, BIT4);
- break;
- }
-
- if (set_iga == IGA2) {
- enable_second_display_channel();
- /* Disable LCD Scaling */
- viafb_write_reg_mask(CR79, VIACR, 0x00, BIT0);
- }
+ set_source_common(0x9B, 4, iga);
}
-static void set_lcd_output_path(int set_iga, int output_interface)
+static inline void set_lvds1_source(u8 iga)
{
- DEBUG_MSG(KERN_INFO
- "set_lcd_output_path, iga:%d,out_interface:%d\n",
- set_iga, output_interface);
- switch (set_iga) {
- case IGA1:
- viafb_write_reg_mask(CR6B, VIACR, 0x00, BIT3);
- viafb_write_reg_mask(CR6A, VIACR, 0x08, BIT3);
-
- disable_second_display_channel();
- break;
-
- case IGA2:
- viafb_write_reg_mask(CR6B, VIACR, 0x00, BIT3);
- viafb_write_reg_mask(CR6A, VIACR, 0x08, BIT3);
-
- enable_second_display_channel();
- break;
- }
-
- switch (output_interface) {
- case INTERFACE_DVP0:
- if (set_iga == IGA1) {
- viafb_write_reg_mask(CR96, VIACR, 0x00, BIT4);
- } else {
- viafb_write_reg(CR91, VIACR, 0x00);
- viafb_write_reg_mask(CR96, VIACR, 0x10, BIT4);
- }
- break;
-
- case INTERFACE_DVP1:
- if (set_iga == IGA1)
- viafb_write_reg_mask(CR9B, VIACR, 0x00, BIT4);
- else {
- viafb_write_reg(CR91, VIACR, 0x00);
- viafb_write_reg_mask(CR9B, VIACR, 0x10, BIT4);
- }
- break;
-
- case INTERFACE_DFP_HIGH:
- if (set_iga == IGA1)
- viafb_write_reg_mask(CR97, VIACR, 0x00, BIT4);
- else {
- viafb_write_reg(CR91, VIACR, 0x00);
- viafb_write_reg_mask(CR97, VIACR, 0x10, BIT4);
- viafb_write_reg_mask(CR96, VIACR, 0x10, BIT4);
- }
- break;
-
- case INTERFACE_DFP_LOW:
- if (set_iga == IGA1)
- viafb_write_reg_mask(CR99, VIACR, 0x00, BIT4);
- else {
- viafb_write_reg(CR91, VIACR, 0x00);
- viafb_write_reg_mask(CR99, VIACR, 0x10, BIT4);
- viafb_write_reg_mask(CR9B, VIACR, 0x10, BIT4);
- }
-
- break;
-
- case INTERFACE_DFP:
- if ((UNICHROME_K8M890 == viaparinfo->chip_info->gfx_chip_name)
- || (UNICHROME_P4M890 ==
- viaparinfo->chip_info->gfx_chip_name))
- viafb_write_reg_mask(CR97, VIACR, 0x84,
- BIT7 + BIT2 + BIT1 + BIT0);
- if (set_iga == IGA1) {
- viafb_write_reg_mask(CR97, VIACR, 0x00, BIT4);
- viafb_write_reg_mask(CR99, VIACR, 0x00, BIT4);
- } else {
- viafb_write_reg(CR91, VIACR, 0x00);
- viafb_write_reg_mask(CR97, VIACR, 0x10, BIT4);
- viafb_write_reg_mask(CR99, VIACR, 0x10, BIT4);
- }
- break;
-
- case INTERFACE_LVDS0:
- case INTERFACE_LVDS0LVDS1:
- if (set_iga == IGA1)
- viafb_write_reg_mask(CR99, VIACR, 0x00, BIT4);
- else
- viafb_write_reg_mask(CR99, VIACR, 0x10, BIT4);
+ set_source_common(0x99, 4, iga);
+}
- break;
+static inline void set_lvds2_source(u8 iga)
+{
+ set_source_common(0x97, 4, iga);
+}
- case INTERFACE_LVDS1:
- if (set_iga == IGA1)
- viafb_write_reg_mask(CR97, VIACR, 0x00, BIT4);
- else
- viafb_write_reg_mask(CR97, VIACR, 0x10, BIT4);
- break;
- }
+void via_set_source(u32 devices, u8 iga)
+{
+ if (devices & VIA_6C)
+ set_6C_source(iga);
+ if (devices & VIA_93)
+ set_93_source(iga);
+ if (devices & VIA_96)
+ set_96_source(iga);
+ if (devices & VIA_CRT)
+ set_crt_source(iga);
+ if (devices & VIA_DVP1)
+ set_dvp1_source(iga);
+ if (devices & VIA_LVDS1)
+ set_lvds1_source(iga);
+ if (devices & VIA_LVDS2)
+ set_lvds2_source(iga);
}
static void load_fix_bit_crtc_reg(void)
@@ -1688,8 +1579,8 @@ void viafb_set_vclock(u32 clk, int set_iga)
}
if (set_iga == IGA2) {
- viafb_write_reg_mask(SR40, VIASR, 0x01, BIT0);
- viafb_write_reg_mask(SR40, VIASR, 0x00, BIT0);
+ viafb_write_reg_mask(SR40, VIASR, 0x04, BIT2);
+ viafb_write_reg_mask(SR40, VIASR, 0x00, BIT2);
}
/* Fire! */
@@ -2004,7 +1895,7 @@ void viafb_fill_crtc_timing(struct crt_mode_table *crt_table,
}
-void viafb_init_chip_info(int chip_type)
+void __devinit viafb_init_chip_info(int chip_type)
{
init_gfx_chip_info(chip_type);
init_tmds_chip_info();
@@ -2071,7 +1962,7 @@ void viafb_update_device_setting(int hres, int vres,
}
}
-static void init_gfx_chip_info(int chip_type)
+static void __devinit init_gfx_chip_info(int chip_type)
{
u8 tmp;
@@ -2123,7 +2014,7 @@ static void init_gfx_chip_info(int chip_type)
}
}
-static void init_tmds_chip_info(void)
+static void __devinit init_tmds_chip_info(void)
{
viafb_tmds_trasmitter_identify();
@@ -2168,7 +2059,7 @@ static void init_tmds_chip_info(void)
&viaparinfo->shared->tmds_setting_info);
}
-static void init_lvds_chip_info(void)
+static void __devinit init_lvds_chip_info(void)
{
viafb_lvds_trasmitter_identify();
viafb_init_lcd_size();
@@ -2202,7 +2093,7 @@ static void init_lvds_chip_info(void)
viaparinfo->chip_info->lvds_chip_info.output_interface);
}
-void viafb_init_dac(int set_iga)
+void __devinit viafb_init_dac(int set_iga)
{
int i;
u8 tmp;
@@ -2337,7 +2228,6 @@ int viafb_setmode(struct VideoModeTable *vmode_tbl, int video_bpp,
via_write_reg(VIASR, i, VPIT.SR[i - 1]);
viafb_write_reg_mask(0x15, VIASR, 0xA2, 0xA2);
- viafb_set_iga_path();
/* Write CRTC */
viafb_fill_crtc_timing(crt_timing, vmode_tbl, video_bpp / 8, IGA1);
@@ -2377,6 +2267,13 @@ int viafb_setmode(struct VideoModeTable *vmode_tbl, int video_bpp,
via_set_primary_color_depth(viaparinfo->depth);
via_set_secondary_color_depth(viafb_dual_fb ? viaparinfo1->depth
: viaparinfo->depth);
+ via_set_source(viaparinfo->shared->iga1_devices, IGA1);
+ via_set_source(viaparinfo->shared->iga2_devices, IGA2);
+ if (viaparinfo->shared->iga2_devices)
+ enable_second_display_channel();
+ else
+ disable_second_display_channel();
+
/* Update Refresh Rate Setting */
/* Clear On Screen */
@@ -2394,8 +2291,6 @@ int viafb_setmode(struct VideoModeTable *vmode_tbl, int video_bpp,
viaparinfo->crt_setting_info->iga_path);
}
- set_crt_output_path(viaparinfo->crt_setting_info->iga_path);
-
/* Patch if set_hres is not 8 alignment (1366) to viafb_setmode
to 8 alignment (1368),there is several pixels (2 pixels)
on right side of screen. */
@@ -2482,10 +2377,6 @@ int viafb_setmode(struct VideoModeTable *vmode_tbl, int video_bpp,
viafb_DeviceStatus = CRT_Device;
}
device_on();
-
- if (viafb_SAMM_ON == 1)
- viafb_write_reg_mask(CR6A, VIACR, 0xC0, BIT6 + BIT7);
-
device_screen_on();
return 1;
}
@@ -2567,7 +2458,6 @@ static void disable_second_display_channel(void)
viafb_write_reg_mask(CR6A, VIACR, BIT6, BIT6);
}
-
void viafb_set_dpa_gfx(int output_interface, struct GFX_DPA_SETTING\
*p_gfx_dpa_setting)
{
diff --git a/drivers/video/via/hw.h b/drivers/video/via/hw.h
index c44399895294..45dee39a8b23 100644
--- a/drivers/video/via/hw.h
+++ b/drivers/video/via/hw.h
@@ -30,6 +30,15 @@
#define viafb_write_reg(i, p, d) via_write_reg(p, i, d)
#define viafb_write_reg_mask(i, p, d, m) via_write_reg_mask(p, i, d, m)
+/* VIA output devices */
+#define VIA_6C 0x00000001
+#define VIA_93 0x00000002
+#define VIA_96 0x00000004
+#define VIA_CRT 0x00000010
+#define VIA_DVP1 0x00000020
+#define VIA_LVDS1 0x00000040
+#define VIA_LVDS2 0x00000080
+
/***************************************************
* Definition IGA1 Design Method of CRTC Registers *
****************************************************/
@@ -881,9 +890,6 @@ extern int viafb_LCD_ON;
extern int viafb_DVI_ON;
extern int viafb_hotplug;
-void viafb_set_output_path(int device, int set_iga,
- int output_interface);
-
void viafb_fill_crtc_timing(struct crt_mode_table *crt_table,
struct VideoModeTable *video_mode, int bpp_byte, int set_iga);
@@ -908,8 +914,8 @@ int viafb_setmode(struct VideoModeTable *vmode_tbl, int video_bpp,
struct VideoModeTable *vmode_tbl1, int video_bpp1);
void viafb_fill_var_timing_info(struct fb_var_screeninfo *var, int refresh,
struct VideoModeTable *vmode_tbl);
-void viafb_init_chip_info(int chip_type);
-void viafb_init_dac(int set_iga);
+void __devinit viafb_init_chip_info(int chip_type);
+void __devinit viafb_init_dac(int set_iga);
int viafb_get_pixclock(int hres, int vres, int vmode_refresh);
int viafb_get_refresh(int hres, int vres, u32 float_refresh);
void viafb_update_device_setting(int hres, int vres, int bpp,
diff --git a/drivers/video/via/ioctl.c b/drivers/video/via/ioctl.c
index da03c074e32a..455b39f46e57 100644
--- a/drivers/video/via/ioctl.c
+++ b/drivers/video/via/ioctl.c
@@ -92,6 +92,7 @@ int viafb_ioctl_hotplug(int hres, int vres, int bpp)
viafb_CRT_ON = 0;
viafb_LCD_ON = 0;
viafb_DeviceStatus = DVI_Device;
+ viafb_set_iga_path();
return viafb_DeviceStatus;
}
status = 1;
@@ -105,6 +106,7 @@ int viafb_ioctl_hotplug(int hres, int vres, int bpp)
viafb_LCD_ON = 0;
viafb_DeviceStatus = CRT_Device;
+ viafb_set_iga_path();
return viafb_DeviceStatus;
}
diff --git a/drivers/video/via/lcd.c b/drivers/video/via/lcd.c
index fc25ae30c5f6..e99f933faf19 100644
--- a/drivers/video/via/lcd.c
+++ b/drivers/video/via/lcd.c
@@ -21,10 +21,16 @@
#include <linux/via-core.h>
#include <linux/via_i2c.h>
#include "global.h"
-#include "lcdtbl.h"
#define viafb_compact_res(x, y) (((x)<<16)|(y))
+/* CLE266 Software Power Sequence */
+/* {Mask}, {Data}, {Delay} */
+int PowerSequenceOn[3][3] = { {0x10, 0x08, 0x06}, {0x10, 0x08, 0x06},
+ {0x19, 0x1FE, 0x01} };
+int PowerSequenceOff[3][3] = { {0x06, 0x08, 0x10}, {0x00, 0x00, 0x00},
+ {0xD2, 0x19, 0x01} };
+
static struct _lcd_scaling_factor lcd_scaling_factor = {
/* LCD Horizontal Scaling Factor Register */
{LCD_HOR_SCALING_FACTOR_REG_NUM,
@@ -42,7 +48,7 @@ static struct _lcd_scaling_factor lcd_scaling_factor_CLE = {
static int check_lvds_chip(int device_id_subaddr, int device_id);
static bool lvds_identify_integratedlvds(void);
-static void fp_id_to_vindex(int panel_id);
+static void __devinit fp_id_to_vindex(int panel_id);
static int lvds_register_read(int index);
static void load_lcd_scaling(int set_hres, int set_vres, int panel_hres,
int panel_vres);
@@ -84,7 +90,7 @@ static int check_lvds_chip(int device_id_subaddr, int device_id)
return FAIL;
}
-void viafb_init_lcd_size(void)
+void __devinit viafb_init_lcd_size(void)
{
DEBUG_MSG(KERN_INFO "viafb_init_lcd_size()\n");
@@ -144,7 +150,7 @@ static bool lvds_identify_integratedlvds(void)
return true;
}
-int viafb_lvds_trasmitter_identify(void)
+int __devinit viafb_lvds_trasmitter_identify(void)
{
if (viafb_lvds_identify_vt1636(VIA_PORT_31)) {
viaparinfo->chip_info->lvds_chip_info.i2c_port = VIA_PORT_31;
@@ -185,7 +191,7 @@ int viafb_lvds_trasmitter_identify(void)
return FAIL;
}
-static void fp_id_to_vindex(int panel_id)
+static void __devinit fp_id_to_vindex(int panel_id)
{
DEBUG_MSG(KERN_INFO "fp_get_panel_id()\n");
@@ -655,9 +661,6 @@ void viafb_lcd_set_mode(struct crt_mode_table *mode_crt_table,
pll_D_N = viafb_get_clk_value(panel_crt_table[0].clk);
DEBUG_MSG(KERN_INFO "PLL=0x%x", pll_D_N);
viafb_set_vclock(pll_D_N, set_iga);
-
- viafb_set_output_path(DEVICE_LCD, set_iga,
- plvds_chip_info->output_interface);
lcd_patch_skew(plvds_setting_info, plvds_chip_info);
/* If K8M800, enable LCD Prefetch Mode. */
@@ -830,8 +833,36 @@ void viafb_lcd_disable(void)
}
+static void set_lcd_output_path(int set_iga, int output_interface)
+{
+ switch (output_interface) {
+ case INTERFACE_DFP:
+ if ((UNICHROME_K8M890 == viaparinfo->chip_info->gfx_chip_name)
+ || (UNICHROME_P4M890 ==
+ viaparinfo->chip_info->gfx_chip_name))
+ viafb_write_reg_mask(CR97, VIACR, 0x84,
+ BIT7 + BIT2 + BIT1 + BIT0);
+ case INTERFACE_DVP0:
+ case INTERFACE_DVP1:
+ case INTERFACE_DFP_HIGH:
+ case INTERFACE_DFP_LOW:
+ if (set_iga == IGA2)
+ viafb_write_reg(CR91, VIACR, 0x00);
+ break;
+ }
+}
+
void viafb_lcd_enable(void)
{
+ viafb_write_reg_mask(CR6B, VIACR, 0x00, BIT3);
+ viafb_write_reg_mask(CR6A, VIACR, 0x08, BIT3);
+ set_lcd_output_path(viaparinfo->lvds_setting_info->iga_path,
+ viaparinfo->chip_info->lvds_chip_info.output_interface);
+ if (viafb_LCD2_ON)
+ set_lcd_output_path(viaparinfo->lvds_setting_info2->iga_path,
+ viaparinfo->chip_info->
+ lvds_chip_info2.output_interface);
+
if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
/* DI1 pad on */
viafb_write_reg_mask(SR1E, VIASR, 0x30, 0x30);
@@ -993,7 +1024,7 @@ static void check_diport_of_integrated_lvds(
plvds_chip_info->output_interface);
}
-void viafb_init_lvds_output_interface(struct lvds_chip_information
+void __devinit viafb_init_lvds_output_interface(struct lvds_chip_information
*plvds_chip_info,
struct lvds_setting_information
*plvds_setting_info)
diff --git a/drivers/video/via/lcd.h b/drivers/video/via/lcd.h
index b348efc360b8..c7909fe29550 100644
--- a/drivers/video/via/lcd.h
+++ b/drivers/video/via/lcd.h
@@ -71,15 +71,15 @@ void viafb_enable_lvds_vt1636(struct lvds_setting_information
struct lvds_chip_information *plvds_chip_info);
void viafb_lcd_disable(void);
void viafb_lcd_enable(void);
-void viafb_init_lcd_size(void);
-void viafb_init_lvds_output_interface(struct lvds_chip_information
+void __devinit viafb_init_lcd_size(void);
+void __devinit viafb_init_lvds_output_interface(struct lvds_chip_information
*plvds_chip_info,
struct lvds_setting_information
*plvds_setting_info);
void viafb_lcd_set_mode(struct crt_mode_table *mode_crt_table,
struct lvds_setting_information *plvds_setting_info,
struct lvds_chip_information *plvds_chip_info);
-int viafb_lvds_trasmitter_identify(void);
+int __devinit viafb_lvds_trasmitter_identify(void);
void viafb_init_lvds_output_interface(struct lvds_chip_information
*plvds_chip_info,
struct lvds_setting_information
diff --git a/drivers/video/via/lcdtbl.h b/drivers/video/via/lcdtbl.h
deleted file mode 100644
index 6f3dd800be59..000000000000
--- a/drivers/video/via/lcdtbl.h
+++ /dev/null
@@ -1,591 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-#ifndef __LCDTBL_H__
-#define __LCDTBL_H__
-
-#include "share.h"
-
-/* CLE266 Software Power Sequence */
-/* {Mask}, {Data}, {Delay} */
-int PowerSequenceOn[3][3] =
- { {0x10, 0x08, 0x06}, {0x10, 0x08, 0x06}, {0x19, 0x1FE, 0x01} };
-int PowerSequenceOff[3][3] =
- { {0x06, 0x08, 0x10}, {0x00, 0x00, 0x00}, {0xD2, 0x19, 0x01} };
-
-/* ++++++ P880 ++++++ */
-/* Panel 1600x1200 */
-struct io_reg P880_LCD_RES_6X4_16X12[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x73}, {VIACR, CR55, 0x0F, 0x08},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x73}, {VIACR, CR54, 0x38, 0x00},
- {VIACR, CR5D, 0x40, 0x40},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x5A}, {VIACR, CR71, 0x08, 0x00},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x5E},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xD6}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR44, 0xFF, 0x7D}, {VIASR, SR45, 0xFF, 0x8C},
- {VIASR, SR46, 0xFF, 0x02}
-
-};
-
-#define NUM_TOTAL_P880_LCD_RES_6X4_16X12 ARRAY_SIZE(P880_LCD_RES_6X4_16X12)
-
-struct io_reg P880_LCD_RES_7X4_16X12[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x67}, {VIACR, CR55, 0x0F, 0x08},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x67}, {VIACR, CR54, 0x38, 0x00},
- {VIACR, CR5D, 0x40, 0x40},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x74}, {VIACR, CR71, 0x08, 0x00},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x78},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xF5}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR44, 0xFF, 0x78}, {VIASR, SR45, 0xFF, 0x8C},
- {VIASR, SR46, 0xFF, 0x01}
-
-};
-
-#define NUM_TOTAL_P880_LCD_RES_7X4_16X12 ARRAY_SIZE(P880_LCD_RES_7X4_16X12)
-
-struct io_reg P880_LCD_RES_8X6_16X12[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x65}, {VIACR, CR55, 0x0F, 0x08},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x65}, {VIACR, CR54, 0x38, 0x00},
- {VIACR, CR5D, 0x40, 0x40},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x7F}, {VIACR, CR71, 0x08, 0x00},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x83},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xE1}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR44, 0xFF, 0x6D}, {VIASR, SR45, 0xFF, 0x88},
- {VIASR, SR46, 0xFF, 0x03}
-
-};
-
-#define NUM_TOTAL_P880_LCD_RES_8X6_16X12 ARRAY_SIZE(P880_LCD_RES_8X6_16X12)
-
-struct io_reg P880_LCD_RES_10X7_16X12[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x65}, {VIACR, CR55, 0x0F, 0x08},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x65}, {VIACR, CR54, 0x38, 0x00},
- {VIACR, CR5D, 0x40, 0x40},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0xAB}, {VIACR, CR71, 0x08, 0x00},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0xAF},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xF0}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR44, 0xFF, 0x92}, {VIASR, SR45, 0xFF, 0x88},
- {VIASR, SR46, 0xFF, 0x03}
-
-};
-
-#define NUM_TOTAL_P880_LCD_RES_10X7_16X12 ARRAY_SIZE(P880_LCD_RES_10X7_16X12)
-
-struct io_reg P880_LCD_RES_12X10_16X12[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x7D}, {VIACR, CR55, 0x0F, 0x08},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x7D}, {VIACR, CR54, 0x38, 0x00},
- {VIACR, CR5D, 0x40, 0x40},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0xD0}, {VIACR, CR71, 0x08, 0x00},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0xD4},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xFA}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR44, 0xFF, 0xF6}, {VIASR, SR45, 0xFF, 0x88},
- {VIASR, SR46, 0xFF, 0x05}
-
-};
-
-#define NUM_TOTAL_P880_LCD_RES_12X10_16X12 ARRAY_SIZE(P880_LCD_RES_12X10_16X12)
-
-/* Panel 1400x1050 */
-struct io_reg P880_LCD_RES_6X4_14X10[] = {
- /* 640x480 */
- /* IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x9D}, {VIACR, CR55, 0x0F, 0x56},
- /* IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x9D}, {VIACR, CR54, 0x38, 0x75},
- {VIACR, CR5D, 0x40, 0x24},
- /* IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x5F}, {VIACR, CR71, 0x08, 0x44},
- /* IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x63},
- /* IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xB4}, {VIACR, CR67, 0x03, 0x00},
- /* VCLK */
- {VIASR, SR44, 0xFF, 0xC6}, {VIASR, SR45, 0xFF, 0x8C},
- {VIASR, SR46, 0xFF, 0x05}
-};
-
-#define NUM_TOTAL_P880_LCD_RES_6X4_14X10 ARRAY_SIZE(P880_LCD_RES_6X4_14X10)
-
-struct io_reg P880_LCD_RES_8X6_14X10[] = {
- /* 800x600 */
- /* IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x9D}, {VIACR, CR55, 0x0F, 0x56},
- /* IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x9D}, {VIACR, CR54, 0x38, 0x75},
- {VIACR, CR5D, 0x40, 0x24},
- /* IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x7F}, {VIACR, CR71, 0x08, 0x44},
- /* IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x83},
- /* IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xBE}, {VIACR, CR67, 0x03, 0x00},
- /* VCLK */
- {VIASR, SR44, 0xFF, 0x06}, {VIASR, SR45, 0xFF, 0x8D},
- {VIASR, SR46, 0xFF, 0x05}
-};
-
-#define NUM_TOTAL_P880_LCD_RES_8X6_14X10 ARRAY_SIZE(P880_LCD_RES_8X6_14X10)
-
-/* ++++++ K400 ++++++ */
-/* Panel 1600x1200 */
-struct io_reg K400_LCD_RES_6X4_16X12[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x73}, {VIACR, CR55, 0x0F, 0x08},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x73}, {VIACR, CR54, 0x38, 0x00},
- {VIACR, CR5D, 0x40, 0x40},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x5A}, {VIACR, CR71, 0x08, 0x00},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x5E},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xDA}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0xC4}, {VIASR, SR47, 0xFF, 0x7F}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_6X4_16X12 ARRAY_SIZE(K400_LCD_RES_6X4_16X12)
-
-struct io_reg K400_LCD_RES_7X4_16X12[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x67}, {VIACR, CR55, 0x0F, 0x08},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x67}, {VIACR, CR54, 0x38, 0x00},
- {VIACR, CR5D, 0x40, 0x40},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x74}, {VIACR, CR71, 0x08, 0x00},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x78},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xF5}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0x46}, {VIASR, SR47, 0xFF, 0x3D}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_7X4_16X12 ARRAY_SIZE(K400_LCD_RES_7X4_16X12)
-
-struct io_reg K400_LCD_RES_8X6_16X12[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x65}, {VIACR, CR55, 0x0F, 0x08},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x65}, {VIACR, CR54, 0x38, 0x00},
- {VIACR, CR5D, 0x40, 0x40},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x7F}, {VIACR, CR71, 0x08, 0x00},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x83},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xE1}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0x85}, {VIASR, SR47, 0xFF, 0x6F}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_8X6_16X12 ARRAY_SIZE(K400_LCD_RES_8X6_16X12)
-
-struct io_reg K400_LCD_RES_10X7_16X12[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x65}, {VIACR, CR55, 0x0F, 0x08},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x65}, {VIACR, CR54, 0x38, 0x00},
- {VIACR, CR5D, 0x40, 0x40},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0xAB}, {VIACR, CR71, 0x08, 0x00},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0xAF},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xF0}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0x45}, {VIASR, SR47, 0xFF, 0x4A}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_10X7_16X12 ARRAY_SIZE(K400_LCD_RES_10X7_16X12)
-
-struct io_reg K400_LCD_RES_12X10_16X12[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x7D}, {VIACR, CR55, 0x0F, 0x08},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x7D}, {VIACR, CR54, 0x38, 0x00},
- {VIACR, CR5D, 0x40, 0x40},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0xD0}, {VIACR, CR71, 0x08, 0x00},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0xD4},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xFA}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0x47}, {VIASR, SR47, 0xFF, 0x7C}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_12X10_16X12 ARRAY_SIZE(K400_LCD_RES_12X10_16X12)
-
-/* Panel 1400x1050 */
-struct io_reg K400_LCD_RES_6X4_14X10[] = {
- /* 640x400 */
- /* IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x9D}, {VIACR, CR55, 0x0F, 0x56},
- /* IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x9D}, {VIACR, CR54, 0x38, 0x75},
- {VIACR, CR5D, 0x40, 0x24},
- /* IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x5F}, {VIACR, CR71, 0x08, 0x44},
- /* IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x63},
- /* IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xB4}, {VIACR, CR67, 0x03, 0x00},
- /* VCLK */
- {VIASR, SR46, 0xFF, 0x07}, {VIASR, SR47, 0xFF, 0x19}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_6X4_14X10 ARRAY_SIZE(K400_LCD_RES_6X4_14X10)
-
-struct io_reg K400_LCD_RES_8X6_14X10[] = {
- /* 800x600 */
- /* IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x9D}, {VIACR, CR55, 0x0F, 0x56},
- /* IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x9D}, {VIACR, CR54, 0x38, 0x75},
- {VIACR, CR5D, 0x40, 0x24},
- /* IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x7F}, {VIACR, CR71, 0x08, 0x44},
- /* IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x83},
- /* IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xBE}, {VIACR, CR67, 0x03, 0x00},
- /* VCLK */
- {VIASR, SR46, 0xFF, 0x07}, {VIASR, SR47, 0xFF, 0x21}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_8X6_14X10 ARRAY_SIZE(K400_LCD_RES_8X6_14X10)
-
-struct io_reg K400_LCD_RES_10X7_14X10[] = {
- /* 1024x768 */
- /* IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x9D}, {VIACR, CR55, 0x0F, 0x56},
- /* IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x9D}, {VIACR, CR54, 0x38, 0x75},
- {VIACR, CR5D, 0x40, 0x24},
- /* IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0xA3}, {VIACR, CR71, 0x08, 0x44},
- /* IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0xA7},
- /* IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xC3}, {VIACR, CR67, 0x03, 0x04},
- /* VCLK */
- {VIASR, SR46, 0xFF, 0x05}, {VIASR, SR47, 0xFF, 0x1E}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_10X7_14X10 ARRAY_SIZE(K400_LCD_RES_10X7_14X10)
-
-struct io_reg K400_LCD_RES_12X10_14X10[] = {
- /* 1280x768, 1280x960, 1280x1024 */
- /* IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x97}, {VIACR, CR55, 0x0F, 0x56},
- /* IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x97}, {VIACR, CR54, 0x38, 0x75},
- {VIACR, CR5D, 0x40, 0x24},
- /* IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0xCE}, {VIACR, CR71, 0x08, 0x44},
- /* IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0xD2},
- /* IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xC9}, {VIACR, CR67, 0x03, 0x04},
- /* VCLK */
- {VIASR, SR46, 0xFF, 0x84}, {VIASR, SR47, 0xFF, 0x79}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_12X10_14X10 ARRAY_SIZE(K400_LCD_RES_12X10_14X10)
-
-/* ++++++ K400 ++++++ */
-/* Panel 1366x768 */
-struct io_reg K400_LCD_RES_6X4_1366X7[] = {
- /* 640x400 */
- /* IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x47}, {VIACR, CR55, 0x0F, 0x35},
- /* IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x47}, {VIACR, CR54, 0x38, 0x2B},
- {VIACR, CR5D, 0x40, 0x13},
- /* IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x60}, {VIACR, CR71, 0x08, 0x23},
- /* IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x64},
- /* IGA2 Offset */
- {VIACR, CR66, 0xFF, 0x8C}, {VIACR, CR67, 0x03, 0x00},
- /* VCLK */
- {VIASR, SR46, 0xFF, 0x87}, {VIASR, SR47, 0xFF, 0x4C}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_6X4_1366X7 ARRAY_SIZE(K400_LCD_RES_6X4_1366X7)
-
-struct io_reg K400_LCD_RES_7X4_1366X7[] = {
- /* IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x3B}, {VIACR, CR55, 0x0F, 0x35},
- /* IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x3B}, {VIACR, CR54, 0x38, 0x2B},
- {VIACR, CR5D, 0x40, 0x13},
- /* IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x71}, {VIACR, CR71, 0x08, 0x23},
- /* IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x75},
- /* IGA2 Offset */
- {VIACR, CR66, 0xFF, 0x96}, {VIACR, CR67, 0x03, 0x00},
- /* VCLK */
- {VIASR, SR46, 0xFF, 0x05}, {VIASR, SR47, 0xFF, 0x10}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_7X4_1366X7 ARRAY_SIZE(K400_LCD_RES_7X4_1366X7)
-
-struct io_reg K400_LCD_RES_8X6_1366X7[] = {
- /* 800x600 */
- /* IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x37}, {VIACR, CR55, 0x0F, 0x35},
- /* IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x37}, {VIACR, CR54, 0x38, 0x2B},
- {VIACR, CR5D, 0x40, 0x13},
- /* IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x7E}, {VIACR, CR71, 0x08, 0x23},
- /* IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x82},
- /* IGA2 Offset */
- {VIACR, CR66, 0xFF, 0x8C}, {VIACR, CR67, 0x03, 0x00},
- /* VCLK */
- {VIASR, SR46, 0xFF, 0x84}, {VIASR, SR47, 0xFF, 0xB9}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_8X6_1366X7 ARRAY_SIZE(K400_LCD_RES_8X6_1366X7)
-
-struct io_reg K400_LCD_RES_10X7_1366X7[] = {
- /* 1024x768 */
- /* IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x9D}, {VIACR, CR55, 0x0F, 0x56},
- /* IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x9D}, {VIACR, CR54, 0x38, 0x75},
- {VIACR, CR5D, 0x40, 0x24},
- /* IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0xA3}, {VIACR, CR71, 0x08, 0x44},
- /* IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0xA7},
- /* IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xC3}, {VIACR, CR67, 0x03, 0x04},
- /* VCLK */
- {VIASR, SR46, 0xFF, 0x05}, {VIASR, SR47, 0xFF, 0x1E}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_10X7_1366X7 ARRAY_SIZE(K400_LCD_RES_10X7_1366X7)
-
-struct io_reg K400_LCD_RES_12X10_1366X7[] = {
- /* 1280x768, 1280x960, 1280x1024 */
- /* IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x97}, {VIACR, CR55, 0x0F, 0x56},
- /* IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x97}, {VIACR, CR54, 0x38, 0x75},
- {VIACR, CR5D, 0x40, 0x24},
- /* IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0xCE}, {VIACR, CR71, 0x08, 0x44},
- /* IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0xD2},
- /* IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xC9}, {VIACR, CR67, 0x03, 0x04},
- /* VCLK */
- {VIASR, SR46, 0xFF, 0x84}, {VIASR, SR47, 0xFF, 0x79}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_12X10_1366X7\
- ARRAY_SIZE(K400_LCD_RES_12X10_1366X7)
-
-/* ++++++ K400 ++++++ */
-/* Panel 1280x1024 */
-struct io_reg K400_LCD_RES_6X4_12X10[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x9D}, {VIACR, CR55, 0x0F, 0x46},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x9D}, {VIACR, CR54, 0x38, 0x74},
- {VIACR, CR5D, 0x40, 0x1C},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x5F}, {VIACR, CR71, 0x08, 0x34},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x63},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xAA}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0x07}, {VIASR, SR47, 0xFF, 0x19}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_6X4_12X10 ARRAY_SIZE(K400_LCD_RES_6X4_12X10)
-
-struct io_reg K400_LCD_RES_7X4_12X10[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x9D}, {VIACR, CR55, 0x0F, 0x46},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x9D}, {VIACR, CR54, 0x38, 0x74},
- {VIACR, CR5D, 0x40, 0x1C},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x68}, {VIACR, CR71, 0x08, 0x34},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x6C},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xA8}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0x87}, {VIASR, SR47, 0xFF, 0xED}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_7X4_12X10 ARRAY_SIZE(K400_LCD_RES_7X4_12X10)
-
-struct io_reg K400_LCD_RES_8X6_12X10[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x9D}, {VIACR, CR55, 0x0F, 0x46},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x9D}, {VIACR, CR54, 0x38, 0x74},
- {VIACR, CR5D, 0x40, 0x1C},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x7F}, {VIACR, CR71, 0x08, 0x34},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x83},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xBE}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0x07}, {VIASR, SR47, 0xFF, 0x21}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_8X6_12X10 ARRAY_SIZE(K400_LCD_RES_8X6_12X10)
-
-struct io_reg K400_LCD_RES_10X7_12X10[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x9D}, {VIACR, CR55, 0x0F, 0x46},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x9D}, {VIACR, CR54, 0x38, 0x74},
- {VIACR, CR5D, 0x40, 0x1C},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0xA3}, {VIACR, CR71, 0x08, 0x34},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0xA7},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0xBE}, {VIACR, CR67, 0x03, 0x04},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0x05}, {VIASR, SR47, 0xFF, 0x1E}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_10X7_12X10 ARRAY_SIZE(K400_LCD_RES_10X7_12X10)
-
-/* ++++++ K400 ++++++ */
-/* Panel 1024x768 */
-struct io_reg K400_LCD_RES_6X4_10X7[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x47}, {VIACR, CR55, 0x0F, 0x35},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x47}, {VIACR, CR54, 0x38, 0x2B},
- {VIACR, CR5D, 0x40, 0x13},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x60}, {VIACR, CR71, 0x08, 0x23},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x64},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0x8C}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0x87}, {VIASR, SR47, 0xFF, 0x4C}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_6X4_10X7 ARRAY_SIZE(K400_LCD_RES_6X4_10X7)
-
-struct io_reg K400_LCD_RES_7X4_10X7[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x3B}, {VIACR, CR55, 0x0F, 0x35},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x3B}, {VIACR, CR54, 0x38, 0x2B},
- {VIACR, CR5D, 0x40, 0x13},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x71}, {VIACR, CR71, 0x08, 0x23},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x75},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0x96}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0x05}, {VIASR, SR47, 0xFF, 0x10}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_7X4_10X7 ARRAY_SIZE(K400_LCD_RES_7X4_10X7)
-
-struct io_reg K400_LCD_RES_8X6_10X7[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x37}, {VIACR, CR55, 0x0F, 0x35},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x37}, {VIACR, CR54, 0x38, 0x2B},
- {VIACR, CR5D, 0x40, 0x13},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x7E}, {VIACR, CR71, 0x08, 0x23},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x82},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0x8C}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0x84}, {VIASR, SR47, 0xFF, 0xB9}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_8X6_10X7 ARRAY_SIZE(K400_LCD_RES_8X6_10X7)
-
-/* ++++++ K400 ++++++ */
-/* Panel 800x600 */
-struct io_reg K400_LCD_RES_6X4_8X6[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x1A}, {VIACR, CR55, 0x0F, 0x34},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x1A}, {VIACR, CR54, 0x38, 0xE3},
- {VIACR, CR5D, 0x40, 0x12},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x5F}, {VIACR, CR71, 0x08, 0x22},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x63},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0x6E}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0x86}, {VIASR, SR47, 0xFF, 0xB3}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_6X4_8X6 ARRAY_SIZE(K400_LCD_RES_6X4_8X6)
-
-struct io_reg K400_LCD_RES_7X4_8X6[] = {
- /*IGA2 Horizontal Total */
- {VIACR, CR50, 0xFF, 0x1F}, {VIACR, CR55, 0x0F, 0x34},
- /*IGA2 Horizontal Blank End */
- {VIACR, CR53, 0xFF, 0x1F}, {VIACR, CR54, 0x38, 0xE3},
- {VIACR, CR5D, 0x40, 0x12},
- /*IGA2 Horizontal Total Shadow */
- {VIACR, CR6D, 0xFF, 0x7F}, {VIACR, CR71, 0x08, 0x22},
- /*IGA2 Horizontal Blank End Shadow */
- {VIACR, CR6E, 0xFF, 0x83},
- /*IGA2 Offset */
- {VIACR, CR66, 0xFF, 0x78}, {VIACR, CR67, 0x03, 0x00},
- /*VCLK*/ {VIASR, SR46, 0xFF, 0xC4}, {VIASR, SR47, 0xFF, 0x59}
-};
-
-#define NUM_TOTAL_K400_LCD_RES_7X4_8X6 ARRAY_SIZE(K400_LCD_RES_7X4_8X6)
-
-#endif /* __LCDTBL_H__ */
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c
index bdd0e4130f4e..5a947b096269 100644
--- a/drivers/video/via/viafbdev.c
+++ b/drivers/video/via/viafbdev.c
@@ -961,7 +961,7 @@ static void retrieve_device_setting(struct viafb_ioctl_setting
setting_info->lcd_attributes.lcd_mode = viafb_lcd_mode;
}
-static int parse_active_dev(void)
+static int __init parse_active_dev(void)
{
viafb_CRT_ON = STATE_OFF;
viafb_DVI_ON = STATE_OFF;
@@ -1031,7 +1031,7 @@ static int parse_active_dev(void)
return 0;
}
-static int parse_port(char *opt_str, int *output_interface)
+static int __devinit parse_port(char *opt_str, int *output_interface)
{
if (!strncmp(opt_str, "DVP0", 4))
*output_interface = INTERFACE_DVP0;
@@ -1048,7 +1048,7 @@ static int parse_port(char *opt_str, int *output_interface)
return 0;
}
-static void parse_lcd_port(void)
+static void __devinit parse_lcd_port(void)
{
parse_port(viafb_lcd_port, &viaparinfo->chip_info->lvds_chip_info.
output_interface);
@@ -1061,7 +1061,7 @@ static void parse_lcd_port(void)
output_interface);
}
-static void parse_dvi_port(void)
+static void __devinit parse_dvi_port(void)
{
parse_port(viafb_dvi_port, &viaparinfo->chip_info->tmds_chip_info.
output_interface);
diff --git a/drivers/video/via/viafbdev.h b/drivers/video/via/viafbdev.h
index 52a35fabba91..945a47a63c4d 100644
--- a/drivers/video/via/viafbdev.h
+++ b/drivers/video/via/viafbdev.h
@@ -40,6 +40,9 @@
#define VIAFB_NUM_I2C 5
struct viafb_shared {
+ u32 iga1_devices;
+ u32 iga2_devices;
+
struct proc_dir_entry *proc_entry; /*viafb proc entry */
struct viafb_dev *vdev; /* Global dev info */
diff --git a/firmware/Makefile b/firmware/Makefile
index b27f09f05d17..9c2d19452d0b 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -142,7 +142,7 @@ fw-shipped-$(CONFIG_YAM) += yam/1200.bin yam/9600.bin
fw-shipped-all := $(fw-shipped-y) $(fw-shipped-m) $(fw-shipped-)
# Directories which we _might_ need to create, so we have a rule for them.
-firmware-dirs := $(sort $(patsubst %,$(objtree)/$(obj)/%/,$(dir $(fw-external-y) $(fw-shipped-all))))
+firmware-dirs := $(sort $(addprefix $(objtree)/$(obj)/,$(dir $(fw-external-y) $(fw-shipped-all))))
quiet_cmd_mkdir = MKDIR $(patsubst $(objtree)/%,%,$@)
cmd_mkdir = mkdir -p $@
diff --git a/fs/ceph/Kconfig b/fs/ceph/Kconfig
index bc87b9c1d27e..73a7b31729a7 100644
--- a/fs/ceph/Kconfig
+++ b/fs/ceph/Kconfig
@@ -1,8 +1,10 @@
config CEPH_FS
tristate "Ceph distributed file system (EXPERIMENTAL)"
depends on INET && EXPERIMENTAL
+ select CEPH_LIB
select LIBCRC32C
select CRYPTO_AES
+ default n
help
Choose Y or M here to include support for mounting the
experimental Ceph distributed file system. Ceph is an extremely
@@ -13,15 +15,3 @@ config CEPH_FS
If unsure, say N.
-config CEPH_FS_PRETTYDEBUG
- bool "Include file:line in ceph debug output"
- depends on CEPH_FS
- default n
- help
- If you say Y here, debug output will include a filename and
- line to aid debugging. This icnreases kernel size and slows
- execution slightly when debug call sites are enabled (e.g.,
- via CONFIG_DYNAMIC_DEBUG).
-
- If unsure, say N.
-
diff --git a/fs/ceph/Makefile b/fs/ceph/Makefile
index 278e1172600d..9e6c4f2e8ff1 100644
--- a/fs/ceph/Makefile
+++ b/fs/ceph/Makefile
@@ -8,15 +8,8 @@ obj-$(CONFIG_CEPH_FS) += ceph.o
ceph-objs := super.o inode.o dir.o file.o locks.o addr.o ioctl.o \
export.o caps.o snap.o xattr.o \
- messenger.o msgpool.o buffer.o pagelist.o \
- mds_client.o mdsmap.o \
- mon_client.o \
- osd_client.o osdmap.o crush/crush.o crush/mapper.o crush/hash.o \
- debugfs.o \
- auth.o auth_none.o \
- crypto.o armor.o \
- auth_x.o \
- ceph_fs.o ceph_strings.o ceph_hash.o ceph_frag.o
+ mds_client.o mdsmap.o strings.o ceph_frag.o \
+ debugfs.o
else
#Otherwise we were called directly from the command
diff --git a/fs/ceph/README b/fs/ceph/README
deleted file mode 100644
index 18352fab37c0..000000000000
--- a/fs/ceph/README
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# The following files are shared by (and manually synchronized
-# between) the Ceph userland and kernel client.
-#
-# userland kernel
-src/include/ceph_fs.h fs/ceph/ceph_fs.h
-src/include/ceph_fs.cc fs/ceph/ceph_fs.c
-src/include/msgr.h fs/ceph/msgr.h
-src/include/rados.h fs/ceph/rados.h
-src/include/ceph_strings.cc fs/ceph/ceph_strings.c
-src/include/ceph_frag.h fs/ceph/ceph_frag.h
-src/include/ceph_frag.cc fs/ceph/ceph_frag.c
-src/include/ceph_hash.h fs/ceph/ceph_hash.h
-src/include/ceph_hash.cc fs/ceph/ceph_hash.c
-src/crush/crush.c fs/ceph/crush/crush.c
-src/crush/crush.h fs/ceph/crush/crush.h
-src/crush/mapper.c fs/ceph/crush/mapper.c
-src/crush/mapper.h fs/ceph/crush/mapper.h
-src/crush/hash.h fs/ceph/crush/hash.h
-src/crush/hash.c fs/ceph/crush/hash.c
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 5598a0d02295..61a51c2b71b6 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -1,4 +1,4 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/backing-dev.h>
#include <linux/fs.h>
@@ -10,7 +10,8 @@
#include <linux/task_io_accounting_ops.h>
#include "super.h"
-#include "osd_client.h"
+#include "mds_client.h"
+#include <linux/ceph/osd_client.h>
/*
* Ceph address space ops.
@@ -199,7 +200,8 @@ static int readpage_nounlock(struct file *filp, struct page *page)
{
struct inode *inode = filp->f_dentry->d_inode;
struct ceph_inode_info *ci = ceph_inode(inode);
- struct ceph_osd_client *osdc = &ceph_inode_to_client(inode)->osdc;
+ struct ceph_osd_client *osdc =
+ &ceph_inode_to_client(inode)->client->osdc;
int err = 0;
u64 len = PAGE_CACHE_SIZE;
@@ -271,7 +273,8 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
{
struct inode *inode = file->f_dentry->d_inode;
struct ceph_inode_info *ci = ceph_inode(inode);
- struct ceph_osd_client *osdc = &ceph_inode_to_client(inode)->osdc;
+ struct ceph_osd_client *osdc =
+ &ceph_inode_to_client(inode)->client->osdc;
int rc = 0;
struct page **pages;
loff_t offset;
@@ -371,7 +374,7 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
{
struct inode *inode;
struct ceph_inode_info *ci;
- struct ceph_client *client;
+ struct ceph_fs_client *fsc;
struct ceph_osd_client *osdc;
loff_t page_off = page->index << PAGE_CACHE_SHIFT;
int len = PAGE_CACHE_SIZE;
@@ -389,8 +392,8 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
}
inode = page->mapping->host;
ci = ceph_inode(inode);
- client = ceph_inode_to_client(inode);
- osdc = &client->osdc;
+ fsc = ceph_inode_to_client(inode);
+ osdc = &fsc->client->osdc;
/* verify this is a writeable snap context */
snapc = (void *)page->private;
@@ -420,10 +423,10 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
dout("writepage %p page %p index %lu on %llu~%u\n",
inode, page, page->index, page_off, len);
- writeback_stat = atomic_long_inc_return(&client->writeback_count);
+ writeback_stat = atomic_long_inc_return(&fsc->writeback_count);
if (writeback_stat >
- CONGESTION_ON_THRESH(client->mount_args->congestion_kb))
- set_bdi_congested(&client->backing_dev_info, BLK_RW_ASYNC);
+ CONGESTION_ON_THRESH(fsc->mount_options->congestion_kb))
+ set_bdi_congested(&fsc->backing_dev_info, BLK_RW_ASYNC);
set_page_writeback(page);
err = ceph_osdc_writepages(osdc, ceph_vino(inode),
@@ -502,7 +505,7 @@ static void writepages_finish(struct ceph_osd_request *req,
struct address_space *mapping = inode->i_mapping;
__s32 rc = -EIO;
u64 bytes = 0;
- struct ceph_client *client = ceph_inode_to_client(inode);
+ struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
long writeback_stat;
unsigned issued = ceph_caps_issued(ci);
@@ -535,10 +538,10 @@ static void writepages_finish(struct ceph_osd_request *req,
WARN_ON(!PageUptodate(page));
writeback_stat =
- atomic_long_dec_return(&client->writeback_count);
+ atomic_long_dec_return(&fsc->writeback_count);
if (writeback_stat <
- CONGESTION_OFF_THRESH(client->mount_args->congestion_kb))
- clear_bdi_congested(&client->backing_dev_info,
+ CONGESTION_OFF_THRESH(fsc->mount_options->congestion_kb))
+ clear_bdi_congested(&fsc->backing_dev_info,
BLK_RW_ASYNC);
ceph_put_snap_context((void *)page->private);
@@ -575,13 +578,13 @@ static void writepages_finish(struct ceph_osd_request *req,
* mempool. we avoid the mempool if we can because req->r_num_pages
* may be less than the maximum write size.
*/
-static void alloc_page_vec(struct ceph_client *client,
+static void alloc_page_vec(struct ceph_fs_client *fsc,
struct ceph_osd_request *req)
{
req->r_pages = kmalloc(sizeof(struct page *) * req->r_num_pages,
GFP_NOFS);
if (!req->r_pages) {
- req->r_pages = mempool_alloc(client->wb_pagevec_pool, GFP_NOFS);
+ req->r_pages = mempool_alloc(fsc->wb_pagevec_pool, GFP_NOFS);
req->r_pages_from_pool = 1;
WARN_ON(!req->r_pages);
}
@@ -596,7 +599,7 @@ static int ceph_writepages_start(struct address_space *mapping,
struct inode *inode = mapping->host;
struct backing_dev_info *bdi = mapping->backing_dev_info;
struct ceph_inode_info *ci = ceph_inode(inode);
- struct ceph_client *client;
+ struct ceph_fs_client *fsc;
pgoff_t index, start, end;
int range_whole = 0;
int should_loop = 1;
@@ -623,13 +626,13 @@ static int ceph_writepages_start(struct address_space *mapping,
wbc->sync_mode == WB_SYNC_NONE ? "NONE" :
(wbc->sync_mode == WB_SYNC_ALL ? "ALL" : "HOLD"));
- client = ceph_inode_to_client(inode);
- if (client->mount_state == CEPH_MOUNT_SHUTDOWN) {
+ fsc = ceph_inode_to_client(inode);
+ if (fsc->mount_state == CEPH_MOUNT_SHUTDOWN) {
pr_warning("writepage_start %p on forced umount\n", inode);
return -EIO; /* we're in a forced umount, don't write! */
}
- if (client->mount_args->wsize && client->mount_args->wsize < wsize)
- wsize = client->mount_args->wsize;
+ if (fsc->mount_options->wsize && fsc->mount_options->wsize < wsize)
+ wsize = fsc->mount_options->wsize;
if (wsize < PAGE_CACHE_SIZE)
wsize = PAGE_CACHE_SIZE;
max_pages_ever = wsize >> PAGE_CACHE_SHIFT;
@@ -774,7 +777,7 @@ get_more_pages:
/* prepare async write request */
offset = page->index << PAGE_CACHE_SHIFT;
len = wsize;
- req = ceph_osdc_new_request(&client->osdc,
+ req = ceph_osdc_new_request(&fsc->client->osdc,
&ci->i_layout,
ceph_vino(inode),
offset, &len,
@@ -787,7 +790,7 @@ get_more_pages:
&inode->i_mtime, true, 1);
max_pages = req->r_num_pages;
- alloc_page_vec(client, req);
+ alloc_page_vec(fsc, req);
req->r_callback = writepages_finish;
req->r_inode = inode;
}
@@ -799,10 +802,10 @@ get_more_pages:
inode, page, page->index);
writeback_stat =
- atomic_long_inc_return(&client->writeback_count);
+ atomic_long_inc_return(&fsc->writeback_count);
if (writeback_stat > CONGESTION_ON_THRESH(
- client->mount_args->congestion_kb)) {
- set_bdi_congested(&client->backing_dev_info,
+ fsc->mount_options->congestion_kb)) {
+ set_bdi_congested(&fsc->backing_dev_info,
BLK_RW_ASYNC);
}
@@ -851,7 +854,7 @@ get_more_pages:
op->payload_len = cpu_to_le32(len);
req->r_request->hdr.data_len = cpu_to_le32(len);
- ceph_osdc_start_request(&client->osdc, req, true);
+ ceph_osdc_start_request(&fsc->client->osdc, req, true);
req = NULL;
/* continue? */
@@ -920,7 +923,7 @@ static int ceph_update_writeable_page(struct file *file,
{
struct inode *inode = file->f_dentry->d_inode;
struct ceph_inode_info *ci = ceph_inode(inode);
- struct ceph_mds_client *mdsc = &ceph_inode_to_client(inode)->mdsc;
+ struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;
loff_t page_off = pos & PAGE_CACHE_MASK;
int pos_in_page = pos & ~PAGE_CACHE_MASK;
int end_in_page = pos_in_page + len;
@@ -1058,8 +1061,8 @@ static int ceph_write_end(struct file *file, struct address_space *mapping,
struct page *page, void *fsdata)
{
struct inode *inode = file->f_dentry->d_inode;
- struct ceph_client *client = ceph_inode_to_client(inode);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
unsigned from = pos & (PAGE_CACHE_SIZE - 1);
int check_cap = 0;
@@ -1128,7 +1131,7 @@ static int ceph_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
{
struct inode *inode = vma->vm_file->f_dentry->d_inode;
struct page *page = vmf->page;
- struct ceph_mds_client *mdsc = &ceph_inode_to_client(inode)->mdsc;
+ struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;
loff_t off = page->index << PAGE_CACHE_SHIFT;
loff_t size, len;
int ret;
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 7bf182b03973..ddc80b0e8893 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -1,4 +1,4 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/fs.h>
#include <linux/kernel.h>
@@ -9,8 +9,9 @@
#include <linux/writeback.h>
#include "super.h"
-#include "decode.h"
-#include "messenger.h"
+#include "mds_client.h"
+#include <linux/ceph/decode.h>
+#include <linux/ceph/messenger.h>
/*
* Capability management
@@ -287,11 +288,11 @@ void ceph_put_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap)
spin_unlock(&mdsc->caps_list_lock);
}
-void ceph_reservation_status(struct ceph_client *client,
+void ceph_reservation_status(struct ceph_fs_client *fsc,
int *total, int *avail, int *used, int *reserved,
int *min)
{
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_mds_client *mdsc = fsc->mdsc;
if (total)
*total = mdsc->caps_total_count;
@@ -399,7 +400,7 @@ static void __insert_cap_node(struct ceph_inode_info *ci,
static void __cap_set_timeouts(struct ceph_mds_client *mdsc,
struct ceph_inode_info *ci)
{
- struct ceph_mount_args *ma = mdsc->client->mount_args;
+ struct ceph_mount_options *ma = mdsc->fsc->mount_options;
ci->i_hold_caps_min = round_jiffies(jiffies +
ma->caps_wanted_delay_min * HZ);
@@ -515,7 +516,7 @@ int ceph_add_cap(struct inode *inode,
unsigned seq, unsigned mseq, u64 realmino, int flags,
struct ceph_cap_reservation *caps_reservation)
{
- struct ceph_mds_client *mdsc = &ceph_inode_to_client(inode)->mdsc;
+ struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;
struct ceph_inode_info *ci = ceph_inode(inode);
struct ceph_cap *new_cap = NULL;
struct ceph_cap *cap;
@@ -873,7 +874,7 @@ void __ceph_remove_cap(struct ceph_cap *cap)
struct ceph_mds_session *session = cap->session;
struct ceph_inode_info *ci = cap->ci;
struct ceph_mds_client *mdsc =
- &ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc;
+ ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc;
int removed = 0;
dout("__ceph_remove_cap %p from %p\n", cap, &ci->vfs_inode);
@@ -1203,7 +1204,7 @@ void __ceph_flush_snaps(struct ceph_inode_info *ci,
int mds;
struct ceph_cap_snap *capsnap;
u32 mseq;
- struct ceph_mds_client *mdsc = &ceph_inode_to_client(inode)->mdsc;
+ struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;
struct ceph_mds_session *session = NULL; /* if session != NULL, we hold
session->s_mutex */
u64 next_follows = 0; /* keep track of how far we've gotten through the
@@ -1322,7 +1323,7 @@ static void ceph_flush_snaps(struct ceph_inode_info *ci)
void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask)
{
struct ceph_mds_client *mdsc =
- &ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc;
+ ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc;
struct inode *inode = &ci->vfs_inode;
int was = ci->i_dirty_caps;
int dirty = 0;
@@ -1360,7 +1361,7 @@ void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask)
static int __mark_caps_flushing(struct inode *inode,
struct ceph_mds_session *session)
{
- struct ceph_mds_client *mdsc = &ceph_sb_to_client(inode->i_sb)->mdsc;
+ struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
struct ceph_inode_info *ci = ceph_inode(inode);
int flushing;
@@ -1444,8 +1445,8 @@ static int try_nonblocking_invalidate(struct inode *inode)
void ceph_check_caps(struct ceph_inode_info *ci, int flags,
struct ceph_mds_session *session)
{
- struct ceph_client *client = ceph_inode_to_client(&ci->vfs_inode);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_inode_to_client(&ci->vfs_inode);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct inode *inode = &ci->vfs_inode;
struct ceph_cap *cap;
int file_wanted, used;
@@ -1688,7 +1689,7 @@ ack:
static int try_flush_caps(struct inode *inode, struct ceph_mds_session *session,
unsigned *flush_tid)
{
- struct ceph_mds_client *mdsc = &ceph_sb_to_client(inode->i_sb)->mdsc;
+ struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
struct ceph_inode_info *ci = ceph_inode(inode);
int unlock_session = session ? 0 : 1;
int flushing = 0;
@@ -1854,7 +1855,7 @@ int ceph_write_inode(struct inode *inode, struct writeback_control *wbc)
caps_are_flushed(inode, flush_tid));
} else {
struct ceph_mds_client *mdsc =
- &ceph_sb_to_client(inode->i_sb)->mdsc;
+ ceph_sb_to_client(inode->i_sb)->mdsc;
spin_lock(&inode->i_lock);
if (__ceph_caps_dirty(ci))
@@ -2443,7 +2444,7 @@ static void handle_cap_flush_ack(struct inode *inode, u64 flush_tid,
__releases(inode->i_lock)
{
struct ceph_inode_info *ci = ceph_inode(inode);
- struct ceph_mds_client *mdsc = &ceph_sb_to_client(inode->i_sb)->mdsc;
+ struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
unsigned seq = le32_to_cpu(m->seq);
int dirty = le32_to_cpu(m->dirty);
int cleaned = 0;
@@ -2686,7 +2687,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
struct ceph_msg *msg)
{
struct ceph_mds_client *mdsc = session->s_mdsc;
- struct super_block *sb = mdsc->client->sb;
+ struct super_block *sb = mdsc->fsc->sb;
struct inode *inode;
struct ceph_cap *cap;
struct ceph_mds_caps *h;
diff --git a/fs/ceph/ceph_frag.c b/fs/ceph/ceph_frag.c
index ab6cf35c4091..bdce8b1fbd06 100644
--- a/fs/ceph/ceph_frag.c
+++ b/fs/ceph/ceph_frag.c
@@ -1,7 +1,8 @@
/*
* Ceph 'frag' type
*/
-#include "types.h"
+#include <linux/module.h>
+#include <linux/ceph/types.h>
int ceph_frag_compare(__u32 a, __u32 b)
{
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c
index 360c4f22718d..a07e3dbdc491 100644
--- a/fs/ceph/debugfs.c
+++ b/fs/ceph/debugfs.c
@@ -1,4 +1,4 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/device.h>
#include <linux/slab.h>
@@ -7,143 +7,48 @@
#include <linux/debugfs.h>
#include <linux/seq_file.h>
-#include "super.h"
-#include "mds_client.h"
-#include "mon_client.h"
-#include "auth.h"
+#include <linux/ceph/libceph.h>
+#include <linux/ceph/mon_client.h>
+#include <linux/ceph/auth.h>
+#include <linux/ceph/debugfs.h>
#ifdef CONFIG_DEBUG_FS
-/*
- * Implement /sys/kernel/debug/ceph fun
- *
- * /sys/kernel/debug/ceph/client* - an instance of the ceph client
- * .../osdmap - current osdmap
- * .../mdsmap - current mdsmap
- * .../monmap - current monmap
- * .../osdc - active osd requests
- * .../mdsc - active mds requests
- * .../monc - mon client state
- * .../dentry_lru - dump contents of dentry lru
- * .../caps - expose cap (reservation) stats
- * .../bdi - symlink to ../../bdi/something
- */
-
-static struct dentry *ceph_debugfs_dir;
-
-static int monmap_show(struct seq_file *s, void *p)
-{
- int i;
- struct ceph_client *client = s->private;
-
- if (client->monc.monmap == NULL)
- return 0;
-
- seq_printf(s, "epoch %d\n", client->monc.monmap->epoch);
- for (i = 0; i < client->monc.monmap->num_mon; i++) {
- struct ceph_entity_inst *inst =
- &client->monc.monmap->mon_inst[i];
-
- seq_printf(s, "\t%s%lld\t%s\n",
- ENTITY_NAME(inst->name),
- pr_addr(&inst->addr.in_addr));
- }
- return 0;
-}
+#include "super.h"
+#include "mds_client.h"
static int mdsmap_show(struct seq_file *s, void *p)
{
int i;
- struct ceph_client *client = s->private;
+ struct ceph_fs_client *fsc = s->private;
- if (client->mdsc.mdsmap == NULL)
+ if (fsc->mdsc == NULL || fsc->mdsc->mdsmap == NULL)
return 0;
- seq_printf(s, "epoch %d\n", client->mdsc.mdsmap->m_epoch);
- seq_printf(s, "root %d\n", client->mdsc.mdsmap->m_root);
+ seq_printf(s, "epoch %d\n", fsc->mdsc->mdsmap->m_epoch);
+ seq_printf(s, "root %d\n", fsc->mdsc->mdsmap->m_root);
seq_printf(s, "session_timeout %d\n",
- client->mdsc.mdsmap->m_session_timeout);
+ fsc->mdsc->mdsmap->m_session_timeout);
seq_printf(s, "session_autoclose %d\n",
- client->mdsc.mdsmap->m_session_autoclose);
- for (i = 0; i < client->mdsc.mdsmap->m_max_mds; i++) {
+ fsc->mdsc->mdsmap->m_session_autoclose);
+ for (i = 0; i < fsc->mdsc->mdsmap->m_max_mds; i++) {
struct ceph_entity_addr *addr =
- &client->mdsc.mdsmap->m_info[i].addr;
- int state = client->mdsc.mdsmap->m_info[i].state;
+ &fsc->mdsc->mdsmap->m_info[i].addr;
+ int state = fsc->mdsc->mdsmap->m_info[i].state;
- seq_printf(s, "\tmds%d\t%s\t(%s)\n", i, pr_addr(&addr->in_addr),
+ seq_printf(s, "\tmds%d\t%s\t(%s)\n", i,
+ ceph_pr_addr(&addr->in_addr),
ceph_mds_state_name(state));
}
return 0;
}
-static int osdmap_show(struct seq_file *s, void *p)
-{
- int i;
- struct ceph_client *client = s->private;
- struct rb_node *n;
-
- if (client->osdc.osdmap == NULL)
- return 0;
- seq_printf(s, "epoch %d\n", client->osdc.osdmap->epoch);
- seq_printf(s, "flags%s%s\n",
- (client->osdc.osdmap->flags & CEPH_OSDMAP_NEARFULL) ?
- " NEARFULL" : "",
- (client->osdc.osdmap->flags & CEPH_OSDMAP_FULL) ?
- " FULL" : "");
- for (n = rb_first(&client->osdc.osdmap->pg_pools); n; n = rb_next(n)) {
- struct ceph_pg_pool_info *pool =
- rb_entry(n, struct ceph_pg_pool_info, node);
- seq_printf(s, "pg_pool %d pg_num %d / %d, lpg_num %d / %d\n",
- pool->id, pool->v.pg_num, pool->pg_num_mask,
- pool->v.lpg_num, pool->lpg_num_mask);
- }
- for (i = 0; i < client->osdc.osdmap->max_osd; i++) {
- struct ceph_entity_addr *addr =
- &client->osdc.osdmap->osd_addr[i];
- int state = client->osdc.osdmap->osd_state[i];
- char sb[64];
-
- seq_printf(s, "\tosd%d\t%s\t%3d%%\t(%s)\n",
- i, pr_addr(&addr->in_addr),
- ((client->osdc.osdmap->osd_weight[i]*100) >> 16),
- ceph_osdmap_state_str(sb, sizeof(sb), state));
- }
- return 0;
-}
-
-static int monc_show(struct seq_file *s, void *p)
-{
- struct ceph_client *client = s->private;
- struct ceph_mon_generic_request *req;
- struct ceph_mon_client *monc = &client->monc;
- struct rb_node *rp;
-
- mutex_lock(&monc->mutex);
-
- if (monc->have_mdsmap)
- seq_printf(s, "have mdsmap %u\n", (unsigned)monc->have_mdsmap);
- if (monc->have_osdmap)
- seq_printf(s, "have osdmap %u\n", (unsigned)monc->have_osdmap);
- if (monc->want_next_osdmap)
- seq_printf(s, "want next osdmap\n");
-
- for (rp = rb_first(&monc->generic_request_tree); rp; rp = rb_next(rp)) {
- __u16 op;
- req = rb_entry(rp, struct ceph_mon_generic_request, node);
- op = le16_to_cpu(req->request->hdr.type);
- if (op == CEPH_MSG_STATFS)
- seq_printf(s, "%lld statfs\n", req->tid);
- else
- seq_printf(s, "%lld unknown\n", req->tid);
- }
-
- mutex_unlock(&monc->mutex);
- return 0;
-}
-
+/*
+ * mdsc debugfs
+ */
static int mdsc_show(struct seq_file *s, void *p)
{
- struct ceph_client *client = s->private;
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = s->private;
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct ceph_mds_request *req;
struct rb_node *rp;
int pathlen;
@@ -210,61 +115,12 @@ static int mdsc_show(struct seq_file *s, void *p)
return 0;
}
-static int osdc_show(struct seq_file *s, void *pp)
-{
- struct ceph_client *client = s->private;
- struct ceph_osd_client *osdc = &client->osdc;
- struct rb_node *p;
-
- mutex_lock(&osdc->request_mutex);
- for (p = rb_first(&osdc->requests); p; p = rb_next(p)) {
- struct ceph_osd_request *req;
- struct ceph_osd_request_head *head;
- struct ceph_osd_op *op;
- int num_ops;
- int opcode, olen;
- int i;
-
- req = rb_entry(p, struct ceph_osd_request, r_node);
-
- seq_printf(s, "%lld\tosd%d\t%d.%x\t", req->r_tid,
- req->r_osd ? req->r_osd->o_osd : -1,
- le32_to_cpu(req->r_pgid.pool),
- le16_to_cpu(req->r_pgid.ps));
-
- head = req->r_request->front.iov_base;
- op = (void *)(head + 1);
-
- num_ops = le16_to_cpu(head->num_ops);
- olen = le32_to_cpu(head->object_len);
- seq_printf(s, "%.*s", olen,
- (const char *)(head->ops + num_ops));
-
- if (req->r_reassert_version.epoch)
- seq_printf(s, "\t%u'%llu",
- (unsigned)le32_to_cpu(req->r_reassert_version.epoch),
- le64_to_cpu(req->r_reassert_version.version));
- else
- seq_printf(s, "\t");
-
- for (i = 0; i < num_ops; i++) {
- opcode = le16_to_cpu(op->op);
- seq_printf(s, "\t%s", ceph_osd_op_name(opcode));
- op++;
- }
-
- seq_printf(s, "\n");
- }
- mutex_unlock(&osdc->request_mutex);
- return 0;
-}
-
static int caps_show(struct seq_file *s, void *p)
{
- struct ceph_client *client = s->private;
+ struct ceph_fs_client *fsc = s->private;
int total, avail, used, reserved, min;
- ceph_reservation_status(client, &total, &avail, &used, &reserved, &min);
+ ceph_reservation_status(fsc, &total, &avail, &used, &reserved, &min);
seq_printf(s, "total\t\t%d\n"
"avail\t\t%d\n"
"used\t\t%d\n"
@@ -276,8 +132,8 @@ static int caps_show(struct seq_file *s, void *p)
static int dentry_lru_show(struct seq_file *s, void *ptr)
{
- struct ceph_client *client = s->private;
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = s->private;
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct ceph_dentry_info *di;
spin_lock(&mdsc->dentry_lru_lock);
@@ -291,199 +147,124 @@ static int dentry_lru_show(struct seq_file *s, void *ptr)
return 0;
}
-#define DEFINE_SHOW_FUNC(name) \
-static int name##_open(struct inode *inode, struct file *file) \
-{ \
- struct seq_file *sf; \
- int ret; \
- \
- ret = single_open(file, name, NULL); \
- sf = file->private_data; \
- sf->private = inode->i_private; \
- return ret; \
-} \
- \
-static const struct file_operations name##_fops = { \
- .open = name##_open, \
- .read = seq_read, \
- .llseek = seq_lseek, \
- .release = single_release, \
-};
-
-DEFINE_SHOW_FUNC(monmap_show)
-DEFINE_SHOW_FUNC(mdsmap_show)
-DEFINE_SHOW_FUNC(osdmap_show)
-DEFINE_SHOW_FUNC(monc_show)
-DEFINE_SHOW_FUNC(mdsc_show)
-DEFINE_SHOW_FUNC(osdc_show)
-DEFINE_SHOW_FUNC(dentry_lru_show)
-DEFINE_SHOW_FUNC(caps_show)
+CEPH_DEFINE_SHOW_FUNC(mdsmap_show)
+CEPH_DEFINE_SHOW_FUNC(mdsc_show)
+CEPH_DEFINE_SHOW_FUNC(caps_show)
+CEPH_DEFINE_SHOW_FUNC(dentry_lru_show)
+
+/*
+ * debugfs
+ */
static int congestion_kb_set(void *data, u64 val)
{
- struct ceph_client *client = (struct ceph_client *)data;
-
- if (client)
- client->mount_args->congestion_kb = (int)val;
+ struct ceph_fs_client *fsc = (struct ceph_fs_client *)data;
+ fsc->mount_options->congestion_kb = (int)val;
return 0;
}
static int congestion_kb_get(void *data, u64 *val)
{
- struct ceph_client *client = (struct ceph_client *)data;
-
- if (client)
- *val = (u64)client->mount_args->congestion_kb;
+ struct ceph_fs_client *fsc = (struct ceph_fs_client *)data;
+ *val = (u64)fsc->mount_options->congestion_kb;
return 0;
}
-
DEFINE_SIMPLE_ATTRIBUTE(congestion_kb_fops, congestion_kb_get,
congestion_kb_set, "%llu\n");
-int __init ceph_debugfs_init(void)
-{
- ceph_debugfs_dir = debugfs_create_dir("ceph", NULL);
- if (!ceph_debugfs_dir)
- return -ENOMEM;
- return 0;
-}
-void ceph_debugfs_cleanup(void)
+void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc)
{
- debugfs_remove(ceph_debugfs_dir);
+ dout("ceph_fs_debugfs_cleanup\n");
+ debugfs_remove(fsc->debugfs_bdi);
+ debugfs_remove(fsc->debugfs_congestion_kb);
+ debugfs_remove(fsc->debugfs_mdsmap);
+ debugfs_remove(fsc->debugfs_caps);
+ debugfs_remove(fsc->debugfs_mdsc);
+ debugfs_remove(fsc->debugfs_dentry_lru);
}
-int ceph_debugfs_client_init(struct ceph_client *client)
+int ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
{
- int ret = 0;
- char name[80];
-
- snprintf(name, sizeof(name), "%pU.client%lld", &client->fsid,
- client->monc.auth->global_id);
-
- client->debugfs_dir = debugfs_create_dir(name, ceph_debugfs_dir);
- if (!client->debugfs_dir)
- goto out;
+ char name[100];
+ int err = -ENOMEM;
- client->monc.debugfs_file = debugfs_create_file("monc",
- 0600,
- client->debugfs_dir,
- client,
- &monc_show_fops);
- if (!client->monc.debugfs_file)
- goto out;
-
- client->mdsc.debugfs_file = debugfs_create_file("mdsc",
- 0600,
- client->debugfs_dir,
- client,
- &mdsc_show_fops);
- if (!client->mdsc.debugfs_file)
+ dout("ceph_fs_debugfs_init\n");
+ fsc->debugfs_congestion_kb =
+ debugfs_create_file("writeback_congestion_kb",
+ 0600,
+ fsc->client->debugfs_dir,
+ fsc,
+ &congestion_kb_fops);
+ if (!fsc->debugfs_congestion_kb)
goto out;
- client->osdc.debugfs_file = debugfs_create_file("osdc",
- 0600,
- client->debugfs_dir,
- client,
- &osdc_show_fops);
- if (!client->osdc.debugfs_file)
- goto out;
+ dout("a\n");
- client->debugfs_monmap = debugfs_create_file("monmap",
- 0600,
- client->debugfs_dir,
- client,
- &monmap_show_fops);
- if (!client->debugfs_monmap)
+ snprintf(name, sizeof(name), "../../bdi/%s",
+ dev_name(fsc->backing_dev_info.dev));
+ fsc->debugfs_bdi =
+ debugfs_create_symlink("bdi",
+ fsc->client->debugfs_dir,
+ name);
+ if (!fsc->debugfs_bdi)
goto out;
- client->debugfs_mdsmap = debugfs_create_file("mdsmap",
+ dout("b\n");
+ fsc->debugfs_mdsmap = debugfs_create_file("mdsmap",
0600,
- client->debugfs_dir,
- client,
+ fsc->client->debugfs_dir,
+ fsc,
&mdsmap_show_fops);
- if (!client->debugfs_mdsmap)
+ if (!fsc->debugfs_mdsmap)
goto out;
- client->debugfs_osdmap = debugfs_create_file("osdmap",
- 0600,
- client->debugfs_dir,
- client,
- &osdmap_show_fops);
- if (!client->debugfs_osdmap)
+ dout("ca\n");
+ fsc->debugfs_mdsc = debugfs_create_file("mdsc",
+ 0600,
+ fsc->client->debugfs_dir,
+ fsc,
+ &mdsc_show_fops);
+ if (!fsc->debugfs_mdsc)
goto out;
- client->debugfs_dentry_lru = debugfs_create_file("dentry_lru",
- 0600,
- client->debugfs_dir,
- client,
- &dentry_lru_show_fops);
- if (!client->debugfs_dentry_lru)
- goto out;
-
- client->debugfs_caps = debugfs_create_file("caps",
+ dout("da\n");
+ fsc->debugfs_caps = debugfs_create_file("caps",
0400,
- client->debugfs_dir,
- client,
+ fsc->client->debugfs_dir,
+ fsc,
&caps_show_fops);
- if (!client->debugfs_caps)
+ if (!fsc->debugfs_caps)
goto out;
- client->debugfs_congestion_kb =
- debugfs_create_file("writeback_congestion_kb",
- 0600,
- client->debugfs_dir,
- client,
- &congestion_kb_fops);
- if (!client->debugfs_congestion_kb)
+ dout("ea\n");
+ fsc->debugfs_dentry_lru = debugfs_create_file("dentry_lru",
+ 0600,
+ fsc->client->debugfs_dir,
+ fsc,
+ &dentry_lru_show_fops);
+ if (!fsc->debugfs_dentry_lru)
goto out;
- sprintf(name, "../../bdi/%s", dev_name(client->sb->s_bdi->dev));
- client->debugfs_bdi = debugfs_create_symlink("bdi", client->debugfs_dir,
- name);
-
return 0;
out:
- ceph_debugfs_client_cleanup(client);
- return ret;
+ ceph_fs_debugfs_cleanup(fsc);
+ return err;
}
-void ceph_debugfs_client_cleanup(struct ceph_client *client)
-{
- debugfs_remove(client->debugfs_bdi);
- debugfs_remove(client->debugfs_caps);
- debugfs_remove(client->debugfs_dentry_lru);
- debugfs_remove(client->debugfs_osdmap);
- debugfs_remove(client->debugfs_mdsmap);
- debugfs_remove(client->debugfs_monmap);
- debugfs_remove(client->osdc.debugfs_file);
- debugfs_remove(client->mdsc.debugfs_file);
- debugfs_remove(client->monc.debugfs_file);
- debugfs_remove(client->debugfs_congestion_kb);
- debugfs_remove(client->debugfs_dir);
-}
#else /* CONFIG_DEBUG_FS */
-int __init ceph_debugfs_init(void)
-{
- return 0;
-}
-
-void ceph_debugfs_cleanup(void)
-{
-}
-
-int ceph_debugfs_client_init(struct ceph_client *client)
+int ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
{
return 0;
}
-void ceph_debugfs_client_cleanup(struct ceph_client *client)
+void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc)
{
}
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index 67bbb41d5526..561d9f34310d 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -1,4 +1,4 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/spinlock.h>
#include <linux/fs_struct.h>
@@ -7,6 +7,7 @@
#include <linux/sched.h>
#include "super.h"
+#include "mds_client.h"
/*
* Directory operations: readdir, lookup, create, link, unlink,
@@ -227,15 +228,15 @@ static int ceph_readdir(struct file *filp, void *dirent, filldir_t filldir)
struct ceph_file_info *fi = filp->private_data;
struct inode *inode = filp->f_dentry->d_inode;
struct ceph_inode_info *ci = ceph_inode(inode);
- struct ceph_client *client = ceph_inode_to_client(inode);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
unsigned frag = fpos_frag(filp->f_pos);
int off = fpos_off(filp->f_pos);
int err;
u32 ftype;
struct ceph_mds_reply_info_parsed *rinfo;
- const int max_entries = client->mount_args->max_readdir;
- const int max_bytes = client->mount_args->max_readdir_bytes;
+ const int max_entries = fsc->mount_options->max_readdir;
+ const int max_bytes = fsc->mount_options->max_readdir_bytes;
dout("readdir %p filp %p frag %u off %u\n", inode, filp, frag, off);
if (fi->at_end)
@@ -267,7 +268,7 @@ static int ceph_readdir(struct file *filp, void *dirent, filldir_t filldir)
/* can we use the dcache? */
spin_lock(&inode->i_lock);
if ((filp->f_pos == 2 || fi->dentry) &&
- !ceph_test_opt(client, NOASYNCREADDIR) &&
+ !ceph_test_mount_opt(fsc, NOASYNCREADDIR) &&
ceph_snap(inode) != CEPH_SNAPDIR &&
(ci->i_ceph_flags & CEPH_I_COMPLETE) &&
__ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1)) {
@@ -487,14 +488,14 @@ static loff_t ceph_dir_llseek(struct file *file, loff_t offset, int origin)
struct dentry *ceph_finish_lookup(struct ceph_mds_request *req,
struct dentry *dentry, int err)
{
- struct ceph_client *client = ceph_sb_to_client(dentry->d_sb);
+ struct ceph_fs_client *fsc = ceph_sb_to_client(dentry->d_sb);
struct inode *parent = dentry->d_parent->d_inode;
/* .snap dir? */
if (err == -ENOENT &&
ceph_vino(parent).ino != CEPH_INO_ROOT && /* no .snap in root dir */
strcmp(dentry->d_name.name,
- client->mount_args->snapdir_name) == 0) {
+ fsc->mount_options->snapdir_name) == 0) {
struct inode *inode = ceph_get_snapdir(parent);
dout("ENOENT on snapdir %p '%.*s', linking to snapdir %p\n",
dentry, dentry->d_name.len, dentry->d_name.name, inode);
@@ -539,8 +540,8 @@ static int is_root_ceph_dentry(struct inode *inode, struct dentry *dentry)
static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry,
struct nameidata *nd)
{
- struct ceph_client *client = ceph_sb_to_client(dir->i_sb);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(dir->i_sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct ceph_mds_request *req;
int op;
int err;
@@ -572,7 +573,7 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry,
spin_lock(&dir->i_lock);
dout(" dir %p flags are %d\n", dir, ci->i_ceph_flags);
if (strncmp(dentry->d_name.name,
- client->mount_args->snapdir_name,
+ fsc->mount_options->snapdir_name,
dentry->d_name.len) &&
!is_root_ceph_dentry(dir, dentry) &&
(ci->i_ceph_flags & CEPH_I_COMPLETE) &&
@@ -629,8 +630,8 @@ int ceph_handle_notrace_create(struct inode *dir, struct dentry *dentry)
static int ceph_mknod(struct inode *dir, struct dentry *dentry,
int mode, dev_t rdev)
{
- struct ceph_client *client = ceph_sb_to_client(dir->i_sb);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(dir->i_sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct ceph_mds_request *req;
int err;
@@ -685,8 +686,8 @@ static int ceph_create(struct inode *dir, struct dentry *dentry, int mode,
static int ceph_symlink(struct inode *dir, struct dentry *dentry,
const char *dest)
{
- struct ceph_client *client = ceph_sb_to_client(dir->i_sb);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(dir->i_sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct ceph_mds_request *req;
int err;
@@ -716,8 +717,8 @@ static int ceph_symlink(struct inode *dir, struct dentry *dentry,
static int ceph_mkdir(struct inode *dir, struct dentry *dentry, int mode)
{
- struct ceph_client *client = ceph_sb_to_client(dir->i_sb);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(dir->i_sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct ceph_mds_request *req;
int err = -EROFS;
int op;
@@ -758,8 +759,8 @@ out:
static int ceph_link(struct dentry *old_dentry, struct inode *dir,
struct dentry *dentry)
{
- struct ceph_client *client = ceph_sb_to_client(dir->i_sb);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(dir->i_sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct ceph_mds_request *req;
int err;
@@ -813,8 +814,8 @@ static int drop_caps_for_unlink(struct inode *inode)
*/
static int ceph_unlink(struct inode *dir, struct dentry *dentry)
{
- struct ceph_client *client = ceph_sb_to_client(dir->i_sb);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(dir->i_sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct inode *inode = dentry->d_inode;
struct ceph_mds_request *req;
int err = -EROFS;
@@ -854,8 +855,8 @@ out:
static int ceph_rename(struct inode *old_dir, struct dentry *old_dentry,
struct inode *new_dir, struct dentry *new_dentry)
{
- struct ceph_client *client = ceph_sb_to_client(old_dir->i_sb);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(old_dir->i_sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct ceph_mds_request *req;
int err;
@@ -1072,7 +1073,7 @@ static ssize_t ceph_read_dir(struct file *file, char __user *buf, size_t size,
struct ceph_inode_info *ci = ceph_inode(inode);
int left;
- if (!ceph_test_opt(ceph_sb_to_client(inode->i_sb), DIRSTAT))
+ if (!ceph_test_mount_opt(ceph_sb_to_client(inode->i_sb), DIRSTAT))
return -EISDIR;
if (!cf->dir_info) {
@@ -1173,7 +1174,7 @@ void ceph_dentry_lru_add(struct dentry *dn)
dout("dentry_lru_add %p %p '%.*s'\n", di, dn,
dn->d_name.len, dn->d_name.name);
if (di) {
- mdsc = &ceph_sb_to_client(dn->d_sb)->mdsc;
+ mdsc = ceph_sb_to_client(dn->d_sb)->mdsc;
spin_lock(&mdsc->dentry_lru_lock);
list_add_tail(&di->lru, &mdsc->dentry_lru);
mdsc->num_dentry++;
@@ -1189,7 +1190,7 @@ void ceph_dentry_lru_touch(struct dentry *dn)
dout("dentry_lru_touch %p %p '%.*s' (offset %lld)\n", di, dn,
dn->d_name.len, dn->d_name.name, di->offset);
if (di) {
- mdsc = &ceph_sb_to_client(dn->d_sb)->mdsc;
+ mdsc = ceph_sb_to_client(dn->d_sb)->mdsc;
spin_lock(&mdsc->dentry_lru_lock);
list_move_tail(&di->lru, &mdsc->dentry_lru);
spin_unlock(&mdsc->dentry_lru_lock);
@@ -1204,7 +1205,7 @@ void ceph_dentry_lru_del(struct dentry *dn)
dout("dentry_lru_del %p %p '%.*s'\n", di, dn,
dn->d_name.len, dn->d_name.name);
if (di) {
- mdsc = &ceph_sb_to_client(dn->d_sb)->mdsc;
+ mdsc = ceph_sb_to_client(dn->d_sb)->mdsc;
spin_lock(&mdsc->dentry_lru_lock);
list_del_init(&di->lru);
mdsc->num_dentry--;
diff --git a/fs/ceph/export.c b/fs/ceph/export.c
index 4480cb1c63e7..8a2bb9663456 100644
--- a/fs/ceph/export.c
+++ b/fs/ceph/export.c
@@ -1,10 +1,11 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/exportfs.h>
#include <linux/slab.h>
#include <asm/unaligned.h>
#include "super.h"
+#include "mds_client.h"
/*
* NFS export support
@@ -115,7 +116,7 @@ static struct dentry *__fh_to_dentry(struct super_block *sb,
static struct dentry *__cfh_to_dentry(struct super_block *sb,
struct ceph_nfs_confh *cfh)
{
- struct ceph_mds_client *mdsc = &ceph_sb_to_client(sb)->mdsc;
+ struct ceph_mds_client *mdsc = ceph_sb_to_client(sb)->mdsc;
struct inode *inode;
struct dentry *dentry;
struct ceph_vino vino;
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 8c044a4f0457..9b24ad62618f 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -1,5 +1,6 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
+#include <linux/module.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/file.h>
@@ -38,8 +39,8 @@
static struct ceph_mds_request *
prepare_open_request(struct super_block *sb, int flags, int create_mode)
{
- struct ceph_client *client = ceph_sb_to_client(sb);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct ceph_mds_request *req;
int want_auth = USE_ANY_MDS;
int op = (flags & O_CREAT) ? CEPH_MDS_OP_CREATE : CEPH_MDS_OP_OPEN;
@@ -117,8 +118,8 @@ static int ceph_init_file(struct inode *inode, struct file *file, int fmode)
int ceph_open(struct inode *inode, struct file *file)
{
struct ceph_inode_info *ci = ceph_inode(inode);
- struct ceph_client *client = ceph_sb_to_client(inode->i_sb);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(inode->i_sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct ceph_mds_request *req;
struct ceph_file_info *cf = file->private_data;
struct inode *parent_inode = file->f_dentry->d_parent->d_inode;
@@ -216,8 +217,8 @@ struct dentry *ceph_lookup_open(struct inode *dir, struct dentry *dentry,
struct nameidata *nd, int mode,
int locked_dir)
{
- struct ceph_client *client = ceph_sb_to_client(dir->i_sb);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(dir->i_sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct file *file = nd->intent.open.file;
struct inode *parent_inode = get_dentry_parent_inode(file->f_dentry);
struct ceph_mds_request *req;
@@ -270,163 +271,6 @@ int ceph_release(struct inode *inode, struct file *file)
}
/*
- * build a vector of user pages
- */
-static struct page **get_direct_page_vector(const char __user *data,
- int num_pages,
- loff_t off, size_t len)
-{
- struct page **pages;
- int rc;
-
- pages = kmalloc(sizeof(*pages) * num_pages, GFP_NOFS);
- if (!pages)
- return ERR_PTR(-ENOMEM);
-
- down_read(&current->mm->mmap_sem);
- rc = get_user_pages(current, current->mm, (unsigned long)data,
- num_pages, 0, 0, pages, NULL);
- up_read(&current->mm->mmap_sem);
- if (rc < 0)
- goto fail;
- return pages;
-
-fail:
- kfree(pages);
- return ERR_PTR(rc);
-}
-
-static void put_page_vector(struct page **pages, int num_pages)
-{
- int i;
-
- for (i = 0; i < num_pages; i++)
- put_page(pages[i]);
- kfree(pages);
-}
-
-void ceph_release_page_vector(struct page **pages, int num_pages)
-{
- int i;
-
- for (i = 0; i < num_pages; i++)
- __free_pages(pages[i], 0);
- kfree(pages);
-}
-
-/*
- * allocate a vector new pages
- */
-static struct page **ceph_alloc_page_vector(int num_pages, gfp_t flags)
-{
- struct page **pages;
- int i;
-
- pages = kmalloc(sizeof(*pages) * num_pages, flags);
- if (!pages)
- return ERR_PTR(-ENOMEM);
- for (i = 0; i < num_pages; i++) {
- pages[i] = __page_cache_alloc(flags);
- if (pages[i] == NULL) {
- ceph_release_page_vector(pages, i);
- return ERR_PTR(-ENOMEM);
- }
- }
- return pages;
-}
-
-/*
- * copy user data into a page vector
- */
-static int copy_user_to_page_vector(struct page **pages,
- const char __user *data,
- loff_t off, size_t len)
-{
- int i = 0;
- int po = off & ~PAGE_CACHE_MASK;
- int left = len;
- int l, bad;
-
- while (left > 0) {
- l = min_t(int, PAGE_CACHE_SIZE-po, left);
- bad = copy_from_user(page_address(pages[i]) + po, data, l);
- if (bad == l)
- return -EFAULT;
- data += l - bad;
- left -= l - bad;
- po += l - bad;
- if (po == PAGE_CACHE_SIZE) {
- po = 0;
- i++;
- }
- }
- return len;
-}
-
-/*
- * copy user data from a page vector into a user pointer
- */
-static int copy_page_vector_to_user(struct page **pages, char __user *data,
- loff_t off, size_t len)
-{
- int i = 0;
- int po = off & ~PAGE_CACHE_MASK;
- int left = len;
- int l, bad;
-
- while (left > 0) {
- l = min_t(int, left, PAGE_CACHE_SIZE-po);
- bad = copy_to_user(data, page_address(pages[i]) + po, l);
- if (bad == l)
- return -EFAULT;
- data += l - bad;
- left -= l - bad;
- if (po) {
- po += l - bad;
- if (po == PAGE_CACHE_SIZE)
- po = 0;
- }
- i++;
- }
- return len;
-}
-
-/*
- * Zero an extent within a page vector. Offset is relative to the
- * start of the first page.
- */
-static void zero_page_vector_range(int off, int len, struct page **pages)
-{
- int i = off >> PAGE_CACHE_SHIFT;
-
- off &= ~PAGE_CACHE_MASK;
-
- dout("zero_page_vector_page %u~%u\n", off, len);
-
- /* leading partial page? */
- if (off) {
- int end = min((int)PAGE_CACHE_SIZE, off + len);
- dout("zeroing %d %p head from %d\n", i, pages[i],
- (int)off);
- zero_user_segment(pages[i], off, end);
- len -= (end - off);
- i++;
- }
- while (len >= PAGE_CACHE_SIZE) {
- dout("zeroing %d %p len=%d\n", i, pages[i], len);
- zero_user_segment(pages[i], 0, PAGE_CACHE_SIZE);
- len -= PAGE_CACHE_SIZE;
- i++;
- }
- /* trailing partial page? */
- if (len) {
- dout("zeroing %d %p tail to %d\n", i, pages[i], (int)len);
- zero_user_segment(pages[i], 0, len);
- }
-}
-
-
-/*
* Read a range of bytes striped over one or more objects. Iterate over
* objects we stripe over. (That's not atomic, but good enough for now.)
*
@@ -438,7 +282,7 @@ static int striped_read(struct inode *inode,
struct page **pages, int num_pages,
int *checkeof)
{
- struct ceph_client *client = ceph_inode_to_client(inode);
+ struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
struct ceph_inode_info *ci = ceph_inode(inode);
u64 pos, this_len;
int page_off = off & ~PAGE_CACHE_MASK; /* first byte's offset in page */
@@ -459,7 +303,7 @@ static int striped_read(struct inode *inode,
more:
this_len = left;
- ret = ceph_osdc_readpages(&client->osdc, ceph_vino(inode),
+ ret = ceph_osdc_readpages(&fsc->client->osdc, ceph_vino(inode),
&ci->i_layout, pos, &this_len,
ci->i_truncate_seq,
ci->i_truncate_size,
@@ -477,8 +321,8 @@ more:
if (read < pos - off) {
dout(" zero gap %llu to %llu\n", off + read, pos);
- zero_page_vector_range(page_off + read,
- pos - off - read, pages);
+ ceph_zero_page_vector_range(page_off + read,
+ pos - off - read, pages);
}
pos += ret;
read = pos - off;
@@ -495,8 +339,8 @@ more:
/* was original extent fully inside i_size? */
if (pos + left <= inode->i_size) {
dout("zero tail\n");
- zero_page_vector_range(page_off + read, len - read,
- pages);
+ ceph_zero_page_vector_range(page_off + read, len - read,
+ pages);
read = len;
goto out;
}
@@ -531,7 +375,7 @@ static ssize_t ceph_sync_read(struct file *file, char __user *data,
(file->f_flags & O_DIRECT) ? "O_DIRECT" : "");
if (file->f_flags & O_DIRECT) {
- pages = get_direct_page_vector(data, num_pages, off, len);
+ pages = ceph_get_direct_page_vector(data, num_pages, off, len);
/*
* flush any page cache pages in this range. this
@@ -552,13 +396,13 @@ static ssize_t ceph_sync_read(struct file *file, char __user *data,
ret = striped_read(inode, off, len, pages, num_pages, checkeof);
if (ret >= 0 && (file->f_flags & O_DIRECT) == 0)
- ret = copy_page_vector_to_user(pages, data, off, ret);
+ ret = ceph_copy_page_vector_to_user(pages, data, off, ret);
if (ret >= 0)
*poff = off + ret;
done:
if (file->f_flags & O_DIRECT)
- put_page_vector(pages, num_pages);
+ ceph_put_page_vector(pages, num_pages);
else
ceph_release_page_vector(pages, num_pages);
dout("sync_read result %d\n", ret);
@@ -594,7 +438,7 @@ static ssize_t ceph_sync_write(struct file *file, const char __user *data,
{
struct inode *inode = file->f_dentry->d_inode;
struct ceph_inode_info *ci = ceph_inode(inode);
- struct ceph_client *client = ceph_inode_to_client(inode);
+ struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
struct ceph_osd_request *req;
struct page **pages;
int num_pages;
@@ -642,7 +486,7 @@ static ssize_t ceph_sync_write(struct file *file, const char __user *data,
*/
more:
len = left;
- req = ceph_osdc_new_request(&client->osdc, &ci->i_layout,
+ req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
ceph_vino(inode), pos, &len,
CEPH_OSD_OP_WRITE, flags,
ci->i_snap_realm->cached_context,
@@ -655,7 +499,7 @@ more:
num_pages = calc_pages_for(pos, len);
if (file->f_flags & O_DIRECT) {
- pages = get_direct_page_vector(data, num_pages, pos, len);
+ pages = ceph_get_direct_page_vector(data, num_pages, pos, len);
if (IS_ERR(pages)) {
ret = PTR_ERR(pages);
goto out;
@@ -673,7 +517,7 @@ more:
ret = PTR_ERR(pages);
goto out;
}
- ret = copy_user_to_page_vector(pages, data, pos, len);
+ ret = ceph_copy_user_to_page_vector(pages, data, pos, len);
if (ret < 0) {
ceph_release_page_vector(pages, num_pages);
goto out;
@@ -689,7 +533,7 @@ more:
req->r_num_pages = num_pages;
req->r_inode = inode;
- ret = ceph_osdc_start_request(&client->osdc, req, false);
+ ret = ceph_osdc_start_request(&fsc->client->osdc, req, false);
if (!ret) {
if (req->r_safe_callback) {
/*
@@ -701,11 +545,11 @@ more:
spin_unlock(&ci->i_unsafe_lock);
ceph_get_cap_refs(ci, CEPH_CAP_FILE_WR);
}
- ret = ceph_osdc_wait_request(&client->osdc, req);
+ ret = ceph_osdc_wait_request(&fsc->client->osdc, req);
}
if (file->f_flags & O_DIRECT)
- put_page_vector(pages, num_pages);
+ ceph_put_page_vector(pages, num_pages);
else if (file->f_flags & O_SYNC)
ceph_release_page_vector(pages, num_pages);
@@ -814,7 +658,8 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const struct iovec *iov,
struct ceph_file_info *fi = file->private_data;
struct inode *inode = file->f_dentry->d_inode;
struct ceph_inode_info *ci = ceph_inode(inode);
- struct ceph_osd_client *osdc = &ceph_sb_to_client(inode->i_sb)->osdc;
+ struct ceph_osd_client *osdc =
+ &ceph_sb_to_client(inode->i_sb)->client->osdc;
loff_t endoff = pos + iov->iov_len;
int want, got = 0;
int ret, err;
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 5d893d31e399..1d5428d6ee2e 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -1,4 +1,4 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/module.h>
#include <linux/fs.h>
@@ -13,7 +13,8 @@
#include <linux/pagevec.h>
#include "super.h"
-#include "decode.h"
+#include "mds_client.h"
+#include <linux/ceph/decode.h>
/*
* Ceph inode operations
@@ -384,7 +385,7 @@ void ceph_destroy_inode(struct inode *inode)
*/
if (ci->i_snap_realm) {
struct ceph_mds_client *mdsc =
- &ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc;
+ ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc;
struct ceph_snap_realm *realm = ci->i_snap_realm;
dout(" dropping residual ref to snap realm %p\n", realm);
@@ -684,7 +685,7 @@ static int fill_inode(struct inode *inode,
}
/* it may be better to set st_size in getattr instead? */
- if (ceph_test_opt(ceph_sb_to_client(inode->i_sb), RBYTES))
+ if (ceph_test_mount_opt(ceph_sb_to_client(inode->i_sb), RBYTES))
inode->i_size = ci->i_rbytes;
break;
default:
@@ -899,7 +900,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
struct inode *in = NULL;
struct ceph_mds_reply_inode *ininfo;
struct ceph_vino vino;
- struct ceph_client *client = ceph_sb_to_client(sb);
+ struct ceph_fs_client *fsc = ceph_sb_to_client(sb);
int i = 0;
int err = 0;
@@ -963,7 +964,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
*/
if (rinfo->head->is_dentry && !req->r_aborted &&
(rinfo->head->is_target || strncmp(req->r_dentry->d_name.name,
- client->mount_args->snapdir_name,
+ fsc->mount_options->snapdir_name,
req->r_dentry->d_name.len))) {
/*
* lookup link rename : null -> possibly existing inode
@@ -1531,7 +1532,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr)
struct inode *parent_inode = dentry->d_parent->d_inode;
const unsigned int ia_valid = attr->ia_valid;
struct ceph_mds_request *req;
- struct ceph_mds_client *mdsc = &ceph_sb_to_client(dentry->d_sb)->mdsc;
+ struct ceph_mds_client *mdsc = ceph_sb_to_client(dentry->d_sb)->mdsc;
int issued;
int release = 0, dirtied = 0;
int mask = 0;
@@ -1726,8 +1727,8 @@ out:
*/
int ceph_do_getattr(struct inode *inode, int mask)
{
- struct ceph_client *client = ceph_sb_to_client(inode->i_sb);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(inode->i_sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct ceph_mds_request *req;
int err;
diff --git a/fs/ceph/ioctl.c b/fs/ceph/ioctl.c
index 76e307d2aba1..899578b0c46b 100644
--- a/fs/ceph/ioctl.c
+++ b/fs/ceph/ioctl.c
@@ -1,8 +1,10 @@
#include <linux/in.h>
-#include "ioctl.h"
#include "super.h"
-#include "ceph_debug.h"
+#include "mds_client.h"
+#include <linux/ceph/ceph_debug.h>
+
+#include "ioctl.h"
/*
@@ -37,7 +39,7 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg)
{
struct inode *inode = file->f_dentry->d_inode;
struct inode *parent_inode = file->f_dentry->d_parent->d_inode;
- struct ceph_mds_client *mdsc = &ceph_sb_to_client(inode->i_sb)->mdsc;
+ struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
struct ceph_mds_request *req;
struct ceph_ioctl_layout l;
int err, i;
@@ -98,7 +100,8 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg)
struct ceph_ioctl_dataloc dl;
struct inode *inode = file->f_dentry->d_inode;
struct ceph_inode_info *ci = ceph_inode(inode);
- struct ceph_osd_client *osdc = &ceph_sb_to_client(inode->i_sb)->osdc;
+ struct ceph_osd_client *osdc =
+ &ceph_sb_to_client(inode->i_sb)->client->osdc;
u64 len = 1, olen;
u64 tmp;
struct ceph_object_layout ol;
diff --git a/fs/ceph/locks.c b/fs/ceph/locks.c
index ae85af06454f..c021a79ef1ef 100644
--- a/fs/ceph/locks.c
+++ b/fs/ceph/locks.c
@@ -1,11 +1,11 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/file.h>
#include <linux/namei.h>
#include "super.h"
#include "mds_client.h"
-#include "pagelist.h"
+#include <linux/ceph/pagelist.h>
/**
* Implement fcntl and flock locking functions.
@@ -16,7 +16,7 @@ static int ceph_lock_message(u8 lock_type, u16 operation, struct file *file,
{
struct inode *inode = file->f_dentry->d_inode;
struct ceph_mds_client *mdsc =
- &ceph_sb_to_client(inode->i_sb)->mdsc;
+ ceph_sb_to_client(inode->i_sb)->mdsc;
struct ceph_mds_request *req;
int err;
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index a75ddbf9fe37..61e87df440b0 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -1,17 +1,20 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/wait.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/smp_lock.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
-#include "mds_client.h"
-#include "mon_client.h"
#include "super.h"
-#include "messenger.h"
-#include "decode.h"
-#include "auth.h"
-#include "pagelist.h"
+#include "mds_client.h"
+
+#include <linux/ceph/messenger.h>
+#include <linux/ceph/decode.h>
+#include <linux/ceph/pagelist.h>
+#include <linux/ceph/auth.h>
+#include <linux/ceph/debugfs.h>
/*
* A cluster of MDS (metadata server) daemons is responsible for
@@ -286,8 +289,9 @@ void ceph_put_mds_session(struct ceph_mds_session *s)
atomic_read(&s->s_ref), atomic_read(&s->s_ref)-1);
if (atomic_dec_and_test(&s->s_ref)) {
if (s->s_authorizer)
- s->s_mdsc->client->monc.auth->ops->destroy_authorizer(
- s->s_mdsc->client->monc.auth, s->s_authorizer);
+ s->s_mdsc->fsc->client->monc.auth->ops->destroy_authorizer(
+ s->s_mdsc->fsc->client->monc.auth,
+ s->s_authorizer);
kfree(s);
}
}
@@ -344,7 +348,7 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc,
s->s_seq = 0;
mutex_init(&s->s_mutex);
- ceph_con_init(mdsc->client->msgr, &s->s_con);
+ ceph_con_init(mdsc->fsc->client->msgr, &s->s_con);
s->s_con.private = s;
s->s_con.ops = &mds_con_ops;
s->s_con.peer_name.type = CEPH_ENTITY_TYPE_MDS;
@@ -862,7 +866,7 @@ static int remove_session_caps_cb(struct inode *inode, struct ceph_cap *cap,
__ceph_remove_cap(cap);
if (!__ceph_is_any_real_caps(ci)) {
struct ceph_mds_client *mdsc =
- &ceph_sb_to_client(inode->i_sb)->mdsc;
+ ceph_sb_to_client(inode->i_sb)->mdsc;
spin_lock(&mdsc->cap_dirty_lock);
if (!list_empty(&ci->i_dirty_item)) {
@@ -1124,7 +1128,7 @@ int ceph_add_cap_releases(struct ceph_mds_client *mdsc,
struct ceph_msg *msg, *partial = NULL;
struct ceph_mds_cap_release *head;
int err = -ENOMEM;
- int extra = mdsc->client->mount_args->cap_release_safety;
+ int extra = mdsc->fsc->mount_options->cap_release_safety;
int num;
dout("add_cap_releases %p mds%d extra %d\n", session, session->s_mds,
@@ -2063,7 +2067,7 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)
/* insert trace into our cache */
mutex_lock(&req->r_fill_mutex);
- err = ceph_fill_trace(mdsc->client->sb, req, req->r_session);
+ err = ceph_fill_trace(mdsc->fsc->sb, req, req->r_session);
if (err == 0) {
if (result == 0 && rinfo->dir_nr)
ceph_readdir_prepopulate(req, req->r_session);
@@ -2588,7 +2592,7 @@ static void handle_lease(struct ceph_mds_client *mdsc,
struct ceph_mds_session *session,
struct ceph_msg *msg)
{
- struct super_block *sb = mdsc->client->sb;
+ struct super_block *sb = mdsc->fsc->sb;
struct inode *inode;
struct ceph_inode_info *ci;
struct dentry *parent, *dentry;
@@ -2866,10 +2870,16 @@ static void delayed_work(struct work_struct *work)
schedule_delayed(mdsc);
}
+int ceph_mdsc_init(struct ceph_fs_client *fsc)
-int ceph_mdsc_init(struct ceph_mds_client *mdsc, struct ceph_client *client)
{
- mdsc->client = client;
+ struct ceph_mds_client *mdsc;
+
+ mdsc = kzalloc(sizeof(struct ceph_mds_client), GFP_NOFS);
+ if (!mdsc)
+ return -ENOMEM;
+ mdsc->fsc = fsc;
+ fsc->mdsc = mdsc;
mutex_init(&mdsc->mutex);
mdsc->mdsmap = kzalloc(sizeof(*mdsc->mdsmap), GFP_NOFS);
if (mdsc->mdsmap == NULL)
@@ -2902,7 +2912,7 @@ int ceph_mdsc_init(struct ceph_mds_client *mdsc, struct ceph_client *client)
INIT_LIST_HEAD(&mdsc->dentry_lru);
ceph_caps_init(mdsc);
- ceph_adjust_min_caps(mdsc, client->min_caps);
+ ceph_adjust_min_caps(mdsc, fsc->min_caps);
return 0;
}
@@ -2914,7 +2924,7 @@ int ceph_mdsc_init(struct ceph_mds_client *mdsc, struct ceph_client *client)
static void wait_requests(struct ceph_mds_client *mdsc)
{
struct ceph_mds_request *req;
- struct ceph_client *client = mdsc->client;
+ struct ceph_fs_client *fsc = mdsc->fsc;
mutex_lock(&mdsc->mutex);
if (__get_oldest_req(mdsc)) {
@@ -2922,7 +2932,7 @@ static void wait_requests(struct ceph_mds_client *mdsc)
dout("wait_requests waiting for requests\n");
wait_for_completion_timeout(&mdsc->safe_umount_waiters,
- client->mount_args->mount_timeout * HZ);
+ fsc->client->options->mount_timeout * HZ);
/* tear down remaining requests */
mutex_lock(&mdsc->mutex);
@@ -3005,7 +3015,7 @@ void ceph_mdsc_sync(struct ceph_mds_client *mdsc)
{
u64 want_tid, want_flush;
- if (mdsc->client->mount_state == CEPH_MOUNT_SHUTDOWN)
+ if (mdsc->fsc->mount_state == CEPH_MOUNT_SHUTDOWN)
return;
dout("sync\n");
@@ -3030,8 +3040,9 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc)
struct ceph_mds_session *session;
int i;
int n;
- struct ceph_client *client = mdsc->client;
- unsigned long started, timeout = client->mount_args->mount_timeout * HZ;
+ struct ceph_fs_client *fsc = mdsc->fsc;
+ unsigned long started, timeout =
+ fsc->client->options->mount_timeout * HZ;
dout("close_sessions\n");
@@ -3057,7 +3068,7 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc)
if (n == 0)
break;
- if (client->mount_state == CEPH_MOUNT_SHUTDOWN)
+ if (fsc->mount_state == CEPH_MOUNT_SHUTDOWN)
break;
dout("waiting for sessions to close\n");
@@ -3092,7 +3103,7 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc)
dout("stopped\n");
}
-void ceph_mdsc_stop(struct ceph_mds_client *mdsc)
+static void ceph_mdsc_stop(struct ceph_mds_client *mdsc)
{
dout("stop\n");
cancel_delayed_work_sync(&mdsc->delayed_work); /* cancel timer */
@@ -3102,6 +3113,15 @@ void ceph_mdsc_stop(struct ceph_mds_client *mdsc)
ceph_caps_finalize(mdsc);
}
+void ceph_mdsc_destroy(struct ceph_fs_client *fsc)
+{
+ struct ceph_mds_client *mdsc = fsc->mdsc;
+
+ ceph_mdsc_stop(mdsc);
+ fsc->mdsc = NULL;
+ kfree(mdsc);
+}
+
/*
* handle mds map update.
@@ -3118,14 +3138,14 @@ void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc, struct ceph_msg *msg)
ceph_decode_need(&p, end, sizeof(fsid)+2*sizeof(u32), bad);
ceph_decode_copy(&p, &fsid, sizeof(fsid));
- if (ceph_check_fsid(mdsc->client, &fsid) < 0)
+ if (ceph_check_fsid(mdsc->fsc->client, &fsid) < 0)
return;
epoch = ceph_decode_32(&p);
maplen = ceph_decode_32(&p);
dout("handle_map epoch %u len %d\n", epoch, (int)maplen);
/* do we need it? */
- ceph_monc_got_mdsmap(&mdsc->client->monc, epoch);
+ ceph_monc_got_mdsmap(&mdsc->fsc->client->monc, epoch);
mutex_lock(&mdsc->mutex);
if (mdsc->mdsmap && epoch <= mdsc->mdsmap->m_epoch) {
dout("handle_map epoch %u <= our %u\n",
@@ -3149,7 +3169,7 @@ void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc, struct ceph_msg *msg)
} else {
mdsc->mdsmap = newmap; /* first mds map */
}
- mdsc->client->sb->s_maxbytes = mdsc->mdsmap->m_max_file_size;
+ mdsc->fsc->sb->s_maxbytes = mdsc->mdsmap->m_max_file_size;
__wake_requests(mdsc, &mdsc->waiting_for_map);
@@ -3250,7 +3270,7 @@ static int get_authorizer(struct ceph_connection *con,
{
struct ceph_mds_session *s = con->private;
struct ceph_mds_client *mdsc = s->s_mdsc;
- struct ceph_auth_client *ac = mdsc->client->monc.auth;
+ struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth;
int ret = 0;
if (force_new && s->s_authorizer) {
@@ -3284,7 +3304,7 @@ static int verify_authorizer_reply(struct ceph_connection *con, int len)
{
struct ceph_mds_session *s = con->private;
struct ceph_mds_client *mdsc = s->s_mdsc;
- struct ceph_auth_client *ac = mdsc->client->monc.auth;
+ struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth;
return ac->ops->verify_authorizer_reply(ac, s->s_authorizer, len);
}
@@ -3293,12 +3313,12 @@ static int invalidate_authorizer(struct ceph_connection *con)
{
struct ceph_mds_session *s = con->private;
struct ceph_mds_client *mdsc = s->s_mdsc;
- struct ceph_auth_client *ac = mdsc->client->monc.auth;
+ struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth;
if (ac->ops->invalidate_authorizer)
ac->ops->invalidate_authorizer(ac, CEPH_ENTITY_TYPE_MDS);
- return ceph_monc_validate_auth(&mdsc->client->monc);
+ return ceph_monc_validate_auth(&mdsc->fsc->client->monc);
}
static const struct ceph_connection_operations mds_con_ops = {
@@ -3311,7 +3331,4 @@ static const struct ceph_connection_operations mds_con_ops = {
.peer_reset = peer_reset,
};
-
-
-
/* eof */
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
index ab7e89f5e344..b8983396ccd0 100644
--- a/fs/ceph/mds_client.h
+++ b/fs/ceph/mds_client.h
@@ -8,9 +8,9 @@
#include <linux/rbtree.h>
#include <linux/spinlock.h>
-#include "types.h"
-#include "messenger.h"
-#include "mdsmap.h"
+#include <linux/ceph/types.h>
+#include <linux/ceph/messenger.h>
+#include <linux/ceph/mdsmap.h>
/*
* Some lock dependencies:
@@ -26,7 +26,7 @@
*
*/
-struct ceph_client;
+struct ceph_fs_client;
struct ceph_cap;
/*
@@ -230,7 +230,7 @@ struct ceph_mds_request {
* mds client state
*/
struct ceph_mds_client {
- struct ceph_client *client;
+ struct ceph_fs_client *fsc;
struct mutex mutex; /* all nested structures */
struct ceph_mdsmap *mdsmap;
@@ -288,11 +288,6 @@ struct ceph_mds_client {
int caps_avail_count; /* unused, unreserved */
int caps_min_count; /* keep at least this many
(unreserved) */
-
-#ifdef CONFIG_DEBUG_FS
- struct dentry *debugfs_file;
-#endif
-
spinlock_t dentry_lru_lock;
struct list_head dentry_lru;
int num_dentry;
@@ -315,10 +310,9 @@ extern void ceph_put_mds_session(struct ceph_mds_session *s);
extern int ceph_send_msg_mds(struct ceph_mds_client *mdsc,
struct ceph_msg *msg, int mds);
-extern int ceph_mdsc_init(struct ceph_mds_client *mdsc,
- struct ceph_client *client);
+extern int ceph_mdsc_init(struct ceph_fs_client *fsc);
extern void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc);
-extern void ceph_mdsc_stop(struct ceph_mds_client *mdsc);
+extern void ceph_mdsc_destroy(struct ceph_fs_client *fsc);
extern void ceph_mdsc_sync(struct ceph_mds_client *mdsc);
diff --git a/fs/ceph/mdsmap.c b/fs/ceph/mdsmap.c
index 040be6d1150b..73b7d44e8a35 100644
--- a/fs/ceph/mdsmap.c
+++ b/fs/ceph/mdsmap.c
@@ -1,4 +1,4 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/bug.h>
#include <linux/err.h>
@@ -6,9 +6,9 @@
#include <linux/slab.h>
#include <linux/types.h>
-#include "mdsmap.h"
-#include "messenger.h"
-#include "decode.h"
+#include <linux/ceph/mdsmap.h>
+#include <linux/ceph/messenger.h>
+#include <linux/ceph/decode.h>
#include "super.h"
@@ -117,7 +117,8 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
}
dout("mdsmap_decode %d/%d %lld mds%d.%d %s %s\n",
- i+1, n, global_id, mds, inc, pr_addr(&addr.in_addr),
+ i+1, n, global_id, mds, inc,
+ ceph_pr_addr(&addr.in_addr),
ceph_mds_state_name(state));
if (mds >= 0 && mds < m->m_max_mds && state > 0) {
m->m_info[mds].global_id = global_id;
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
index c0b26b6badba..ed8c7de3a895 100644
--- a/fs/ceph/snap.c
+++ b/fs/ceph/snap.c
@@ -1,10 +1,12 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/sort.h>
#include <linux/slab.h>
#include "super.h"
-#include "decode.h"
+#include "mds_client.h"
+
+#include <linux/ceph/decode.h>
/*
* Snapshots in ceph are driven in large part by cooperation from the
@@ -512,7 +514,7 @@ int __ceph_finish_cap_snap(struct ceph_inode_info *ci,
struct ceph_cap_snap *capsnap)
{
struct inode *inode = &ci->vfs_inode;
- struct ceph_mds_client *mdsc = &ceph_sb_to_client(inode->i_sb)->mdsc;
+ struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
BUG_ON(capsnap->writing);
capsnap->size = inode->i_size;
@@ -718,7 +720,7 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc,
struct ceph_mds_session *session,
struct ceph_msg *msg)
{
- struct super_block *sb = mdsc->client->sb;
+ struct super_block *sb = mdsc->fsc->sb;
int mds = session->s_mds;
u64 split;
int op;
diff --git a/fs/ceph/ceph_strings.c b/fs/ceph/strings.c
index c6179d3a26a2..cd5097d7c804 100644
--- a/fs/ceph/ceph_strings.c
+++ b/fs/ceph/strings.c
@@ -1,71 +1,9 @@
/*
- * Ceph string constants
+ * Ceph fs string constants
*/
-#include "types.h"
+#include <linux/module.h>
+#include <linux/ceph/types.h>
-const char *ceph_entity_type_name(int type)
-{
- switch (type) {
- case CEPH_ENTITY_TYPE_MDS: return "mds";
- case CEPH_ENTITY_TYPE_OSD: return "osd";
- case CEPH_ENTITY_TYPE_MON: return "mon";
- case CEPH_ENTITY_TYPE_CLIENT: return "client";
- case CEPH_ENTITY_TYPE_AUTH: return "auth";
- default: return "unknown";
- }
-}
-
-const char *ceph_osd_op_name(int op)
-{
- switch (op) {
- case CEPH_OSD_OP_READ: return "read";
- case CEPH_OSD_OP_STAT: return "stat";
-
- case CEPH_OSD_OP_MASKTRUNC: return "masktrunc";
-
- case CEPH_OSD_OP_WRITE: return "write";
- case CEPH_OSD_OP_DELETE: return "delete";
- case CEPH_OSD_OP_TRUNCATE: return "truncate";
- case CEPH_OSD_OP_ZERO: return "zero";
- case CEPH_OSD_OP_WRITEFULL: return "writefull";
- case CEPH_OSD_OP_ROLLBACK: return "rollback";
-
- case CEPH_OSD_OP_APPEND: return "append";
- case CEPH_OSD_OP_STARTSYNC: return "startsync";
- case CEPH_OSD_OP_SETTRUNC: return "settrunc";
- case CEPH_OSD_OP_TRIMTRUNC: return "trimtrunc";
-
- case CEPH_OSD_OP_TMAPUP: return "tmapup";
- case CEPH_OSD_OP_TMAPGET: return "tmapget";
- case CEPH_OSD_OP_TMAPPUT: return "tmapput";
-
- case CEPH_OSD_OP_GETXATTR: return "getxattr";
- case CEPH_OSD_OP_GETXATTRS: return "getxattrs";
- case CEPH_OSD_OP_SETXATTR: return "setxattr";
- case CEPH_OSD_OP_SETXATTRS: return "setxattrs";
- case CEPH_OSD_OP_RESETXATTRS: return "resetxattrs";
- case CEPH_OSD_OP_RMXATTR: return "rmxattr";
- case CEPH_OSD_OP_CMPXATTR: return "cmpxattr";
-
- case CEPH_OSD_OP_PULL: return "pull";
- case CEPH_OSD_OP_PUSH: return "push";
- case CEPH_OSD_OP_BALANCEREADS: return "balance-reads";
- case CEPH_OSD_OP_UNBALANCEREADS: return "unbalance-reads";
- case CEPH_OSD_OP_SCRUB: return "scrub";
-
- case CEPH_OSD_OP_WRLOCK: return "wrlock";
- case CEPH_OSD_OP_WRUNLOCK: return "wrunlock";
- case CEPH_OSD_OP_RDLOCK: return "rdlock";
- case CEPH_OSD_OP_RDUNLOCK: return "rdunlock";
- case CEPH_OSD_OP_UPLOCK: return "uplock";
- case CEPH_OSD_OP_DNLOCK: return "dnlock";
-
- case CEPH_OSD_OP_CALL: return "call";
-
- case CEPH_OSD_OP_PGLS: return "pgls";
- }
- return "???";
-}
const char *ceph_mds_state_name(int s)
{
@@ -177,17 +115,3 @@ const char *ceph_snap_op_name(int o)
}
return "???";
}
-
-const char *ceph_pool_op_name(int op)
-{
- switch (op) {
- case POOL_OP_CREATE: return "create";
- case POOL_OP_DELETE: return "delete";
- case POOL_OP_AUID_CHANGE: return "auid change";
- case POOL_OP_CREATE_SNAP: return "create snap";
- case POOL_OP_DELETE_SNAP: return "delete snap";
- case POOL_OP_CREATE_UNMANAGED_SNAP: return "create unmanaged snap";
- case POOL_OP_DELETE_UNMANAGED_SNAP: return "delete unmanaged snap";
- }
- return "???";
-}
diff --git a/fs/ceph/super.c b/fs/ceph/super.c
index 9922628532b2..d6e0e0421891 100644
--- a/fs/ceph/super.c
+++ b/fs/ceph/super.c
@@ -1,5 +1,5 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/backing-dev.h>
#include <linux/ctype.h>
@@ -15,10 +15,13 @@
#include <linux/statfs.h>
#include <linux/string.h>
-#include "decode.h"
#include "super.h"
-#include "mon_client.h"
-#include "auth.h"
+#include "mds_client.h"
+
+#include <linux/ceph/decode.h>
+#include <linux/ceph/mon_client.h>
+#include <linux/ceph/auth.h>
+#include <linux/ceph/debugfs.h>
/*
* Ceph superblock operations
@@ -26,36 +29,22 @@
* Handle the basics of mounting, unmounting.
*/
-
-/*
- * find filename portion of a path (/foo/bar/baz -> baz)
- */
-const char *ceph_file_part(const char *s, int len)
-{
- const char *e = s + len;
-
- while (e != s && *(e-1) != '/')
- e--;
- return e;
-}
-
-
/*
* super ops
*/
static void ceph_put_super(struct super_block *s)
{
- struct ceph_client *client = ceph_sb_to_client(s);
+ struct ceph_fs_client *fsc = ceph_sb_to_client(s);
dout("put_super\n");
- ceph_mdsc_close_sessions(&client->mdsc);
+ ceph_mdsc_close_sessions(fsc->mdsc);
/*
* ensure we release the bdi before put_anon_super releases
* the device name.
*/
- if (s->s_bdi == &client->backing_dev_info) {
- bdi_unregister(&client->backing_dev_info);
+ if (s->s_bdi == &fsc->backing_dev_info) {
+ bdi_unregister(&fsc->backing_dev_info);
s->s_bdi = NULL;
}
@@ -64,14 +53,14 @@ static void ceph_put_super(struct super_block *s)
static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf)
{
- struct ceph_client *client = ceph_inode_to_client(dentry->d_inode);
- struct ceph_monmap *monmap = client->monc.monmap;
+ struct ceph_fs_client *fsc = ceph_inode_to_client(dentry->d_inode);
+ struct ceph_monmap *monmap = fsc->client->monc.monmap;
struct ceph_statfs st;
u64 fsid;
int err;
dout("statfs\n");
- err = ceph_monc_do_statfs(&client->monc, &st);
+ err = ceph_monc_do_statfs(&fsc->client->monc, &st);
if (err < 0)
return err;
@@ -104,238 +93,28 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf)
static int ceph_sync_fs(struct super_block *sb, int wait)
{
- struct ceph_client *client = ceph_sb_to_client(sb);
+ struct ceph_fs_client *fsc = ceph_sb_to_client(sb);
if (!wait) {
dout("sync_fs (non-blocking)\n");
- ceph_flush_dirty_caps(&client->mdsc);
+ ceph_flush_dirty_caps(fsc->mdsc);
dout("sync_fs (non-blocking) done\n");
return 0;
}
dout("sync_fs (blocking)\n");
- ceph_osdc_sync(&ceph_sb_to_client(sb)->osdc);
- ceph_mdsc_sync(&ceph_sb_to_client(sb)->mdsc);
+ ceph_osdc_sync(&fsc->client->osdc);
+ ceph_mdsc_sync(fsc->mdsc);
dout("sync_fs (blocking) done\n");
return 0;
}
-static int default_congestion_kb(void)
-{
- int congestion_kb;
-
- /*
- * Copied from NFS
- *
- * congestion size, scale with available memory.
- *
- * 64MB: 8192k
- * 128MB: 11585k
- * 256MB: 16384k
- * 512MB: 23170k
- * 1GB: 32768k
- * 2GB: 46340k
- * 4GB: 65536k
- * 8GB: 92681k
- * 16GB: 131072k
- *
- * This allows larger machines to have larger/more transfers.
- * Limit the default to 256M
- */
- congestion_kb = (16*int_sqrt(totalram_pages)) << (PAGE_SHIFT-10);
- if (congestion_kb > 256*1024)
- congestion_kb = 256*1024;
-
- return congestion_kb;
-}
-
-/**
- * ceph_show_options - Show mount options in /proc/mounts
- * @m: seq_file to write to
- * @mnt: mount descriptor
- */
-static int ceph_show_options(struct seq_file *m, struct vfsmount *mnt)
-{
- struct ceph_client *client = ceph_sb_to_client(mnt->mnt_sb);
- struct ceph_mount_args *args = client->mount_args;
-
- if (args->flags & CEPH_OPT_FSID)
- seq_printf(m, ",fsid=%pU", &args->fsid);
- if (args->flags & CEPH_OPT_NOSHARE)
- seq_puts(m, ",noshare");
- if (args->flags & CEPH_OPT_DIRSTAT)
- seq_puts(m, ",dirstat");
- if ((args->flags & CEPH_OPT_RBYTES) == 0)
- seq_puts(m, ",norbytes");
- if (args->flags & CEPH_OPT_NOCRC)
- seq_puts(m, ",nocrc");
- if (args->flags & CEPH_OPT_NOASYNCREADDIR)
- seq_puts(m, ",noasyncreaddir");
-
- if (args->mount_timeout != CEPH_MOUNT_TIMEOUT_DEFAULT)
- seq_printf(m, ",mount_timeout=%d", args->mount_timeout);
- if (args->osd_idle_ttl != CEPH_OSD_IDLE_TTL_DEFAULT)
- seq_printf(m, ",osd_idle_ttl=%d", args->osd_idle_ttl);
- if (args->osd_timeout != CEPH_OSD_TIMEOUT_DEFAULT)
- seq_printf(m, ",osdtimeout=%d", args->osd_timeout);
- if (args->osd_keepalive_timeout != CEPH_OSD_KEEPALIVE_DEFAULT)
- seq_printf(m, ",osdkeepalivetimeout=%d",
- args->osd_keepalive_timeout);
- if (args->wsize)
- seq_printf(m, ",wsize=%d", args->wsize);
- if (args->rsize != CEPH_MOUNT_RSIZE_DEFAULT)
- seq_printf(m, ",rsize=%d", args->rsize);
- if (args->congestion_kb != default_congestion_kb())
- seq_printf(m, ",write_congestion_kb=%d", args->congestion_kb);
- if (args->caps_wanted_delay_min != CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT)
- seq_printf(m, ",caps_wanted_delay_min=%d",
- args->caps_wanted_delay_min);
- if (args->caps_wanted_delay_max != CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT)
- seq_printf(m, ",caps_wanted_delay_max=%d",
- args->caps_wanted_delay_max);
- if (args->cap_release_safety != CEPH_CAP_RELEASE_SAFETY_DEFAULT)
- seq_printf(m, ",cap_release_safety=%d",
- args->cap_release_safety);
- if (args->max_readdir != CEPH_MAX_READDIR_DEFAULT)
- seq_printf(m, ",readdir_max_entries=%d", args->max_readdir);
- if (args->max_readdir_bytes != CEPH_MAX_READDIR_BYTES_DEFAULT)
- seq_printf(m, ",readdir_max_bytes=%d", args->max_readdir_bytes);
- if (strcmp(args->snapdir_name, CEPH_SNAPDIRNAME_DEFAULT))
- seq_printf(m, ",snapdirname=%s", args->snapdir_name);
- if (args->name)
- seq_printf(m, ",name=%s", args->name);
- if (args->secret)
- seq_puts(m, ",secret=<hidden>");
- return 0;
-}
-
-/*
- * caches
- */
-struct kmem_cache *ceph_inode_cachep;
-struct kmem_cache *ceph_cap_cachep;
-struct kmem_cache *ceph_dentry_cachep;
-struct kmem_cache *ceph_file_cachep;
-
-static void ceph_inode_init_once(void *foo)
-{
- struct ceph_inode_info *ci = foo;
- inode_init_once(&ci->vfs_inode);
-}
-
-static int __init init_caches(void)
-{
- ceph_inode_cachep = kmem_cache_create("ceph_inode_info",
- sizeof(struct ceph_inode_info),
- __alignof__(struct ceph_inode_info),
- (SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD),
- ceph_inode_init_once);
- if (ceph_inode_cachep == NULL)
- return -ENOMEM;
-
- ceph_cap_cachep = KMEM_CACHE(ceph_cap,
- SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD);
- if (ceph_cap_cachep == NULL)
- goto bad_cap;
-
- ceph_dentry_cachep = KMEM_CACHE(ceph_dentry_info,
- SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD);
- if (ceph_dentry_cachep == NULL)
- goto bad_dentry;
-
- ceph_file_cachep = KMEM_CACHE(ceph_file_info,
- SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD);
- if (ceph_file_cachep == NULL)
- goto bad_file;
-
- return 0;
-
-bad_file:
- kmem_cache_destroy(ceph_dentry_cachep);
-bad_dentry:
- kmem_cache_destroy(ceph_cap_cachep);
-bad_cap:
- kmem_cache_destroy(ceph_inode_cachep);
- return -ENOMEM;
-}
-
-static void destroy_caches(void)
-{
- kmem_cache_destroy(ceph_inode_cachep);
- kmem_cache_destroy(ceph_cap_cachep);
- kmem_cache_destroy(ceph_dentry_cachep);
- kmem_cache_destroy(ceph_file_cachep);
-}
-
-
-/*
- * ceph_umount_begin - initiate forced umount. Tear down down the
- * mount, skipping steps that may hang while waiting for server(s).
- */
-static void ceph_umount_begin(struct super_block *sb)
-{
- struct ceph_client *client = ceph_sb_to_client(sb);
-
- dout("ceph_umount_begin - starting forced umount\n");
- if (!client)
- return;
- client->mount_state = CEPH_MOUNT_SHUTDOWN;
- return;
-}
-
-static const struct super_operations ceph_super_ops = {
- .alloc_inode = ceph_alloc_inode,
- .destroy_inode = ceph_destroy_inode,
- .write_inode = ceph_write_inode,
- .sync_fs = ceph_sync_fs,
- .put_super = ceph_put_super,
- .show_options = ceph_show_options,
- .statfs = ceph_statfs,
- .umount_begin = ceph_umount_begin,
-};
-
-
-const char *ceph_msg_type_name(int type)
-{
- switch (type) {
- case CEPH_MSG_SHUTDOWN: return "shutdown";
- case CEPH_MSG_PING: return "ping";
- case CEPH_MSG_AUTH: return "auth";
- case CEPH_MSG_AUTH_REPLY: return "auth_reply";
- case CEPH_MSG_MON_MAP: return "mon_map";
- case CEPH_MSG_MON_GET_MAP: return "mon_get_map";
- case CEPH_MSG_MON_SUBSCRIBE: return "mon_subscribe";
- case CEPH_MSG_MON_SUBSCRIBE_ACK: return "mon_subscribe_ack";
- case CEPH_MSG_STATFS: return "statfs";
- case CEPH_MSG_STATFS_REPLY: return "statfs_reply";
- case CEPH_MSG_MDS_MAP: return "mds_map";
- case CEPH_MSG_CLIENT_SESSION: return "client_session";
- case CEPH_MSG_CLIENT_RECONNECT: return "client_reconnect";
- case CEPH_MSG_CLIENT_REQUEST: return "client_request";
- case CEPH_MSG_CLIENT_REQUEST_FORWARD: return "client_request_forward";
- case CEPH_MSG_CLIENT_REPLY: return "client_reply";
- case CEPH_MSG_CLIENT_CAPS: return "client_caps";
- case CEPH_MSG_CLIENT_CAPRELEASE: return "client_cap_release";
- case CEPH_MSG_CLIENT_SNAP: return "client_snap";
- case CEPH_MSG_CLIENT_LEASE: return "client_lease";
- case CEPH_MSG_OSD_MAP: return "osd_map";
- case CEPH_MSG_OSD_OP: return "osd_op";
- case CEPH_MSG_OSD_OPREPLY: return "osd_opreply";
- default: return "unknown";
- }
-}
-
-
/*
* mount options
*/
enum {
Opt_wsize,
Opt_rsize,
- Opt_osdtimeout,
- Opt_osdkeepalivetimeout,
- Opt_mount_timeout,
- Opt_osd_idle_ttl,
Opt_caps_wanted_delay_min,
Opt_caps_wanted_delay_max,
Opt_cap_release_safety,
@@ -344,29 +123,19 @@ enum {
Opt_congestion_kb,
Opt_last_int,
/* int args above */
- Opt_fsid,
Opt_snapdirname,
- Opt_name,
- Opt_secret,
Opt_last_string,
/* string args above */
- Opt_ip,
- Opt_noshare,
Opt_dirstat,
Opt_nodirstat,
Opt_rbytes,
Opt_norbytes,
- Opt_nocrc,
Opt_noasyncreaddir,
};
-static match_table_t arg_tokens = {
+static match_table_t fsopt_tokens = {
{Opt_wsize, "wsize=%d"},
{Opt_rsize, "rsize=%d"},
- {Opt_osdtimeout, "osdtimeout=%d"},
- {Opt_osdkeepalivetimeout, "osdkeepalive=%d"},
- {Opt_mount_timeout, "mount_timeout=%d"},
- {Opt_osd_idle_ttl, "osd_idle_ttl=%d"},
{Opt_caps_wanted_delay_min, "caps_wanted_delay_min=%d"},
{Opt_caps_wanted_delay_max, "caps_wanted_delay_max=%d"},
{Opt_cap_release_safety, "cap_release_safety=%d"},
@@ -374,403 +143,459 @@ static match_table_t arg_tokens = {
{Opt_readdir_max_bytes, "readdir_max_bytes=%d"},
{Opt_congestion_kb, "write_congestion_kb=%d"},
/* int args above */
- {Opt_fsid, "fsid=%s"},
{Opt_snapdirname, "snapdirname=%s"},
- {Opt_name, "name=%s"},
- {Opt_secret, "secret=%s"},
/* string args above */
- {Opt_ip, "ip=%s"},
- {Opt_noshare, "noshare"},
{Opt_dirstat, "dirstat"},
{Opt_nodirstat, "nodirstat"},
{Opt_rbytes, "rbytes"},
{Opt_norbytes, "norbytes"},
- {Opt_nocrc, "nocrc"},
{Opt_noasyncreaddir, "noasyncreaddir"},
{-1, NULL}
};
-static int parse_fsid(const char *str, struct ceph_fsid *fsid)
+static int parse_fsopt_token(char *c, void *private)
{
- int i = 0;
- char tmp[3];
- int err = -EINVAL;
- int d;
-
- dout("parse_fsid '%s'\n", str);
- tmp[2] = 0;
- while (*str && i < 16) {
- if (ispunct(*str)) {
- str++;
- continue;
+ struct ceph_mount_options *fsopt = private;
+ substring_t argstr[MAX_OPT_ARGS];
+ int token, intval, ret;
+
+ token = match_token((char *)c, fsopt_tokens, argstr);
+ if (token < 0)
+ return -EINVAL;
+
+ if (token < Opt_last_int) {
+ ret = match_int(&argstr[0], &intval);
+ if (ret < 0) {
+ pr_err("bad mount option arg (not int) "
+ "at '%s'\n", c);
+ return ret;
}
- if (!isxdigit(str[0]) || !isxdigit(str[1]))
- break;
- tmp[0] = str[0];
- tmp[1] = str[1];
- if (sscanf(tmp, "%x", &d) < 1)
- break;
- fsid->fsid[i] = d & 0xff;
- i++;
- str += 2;
+ dout("got int token %d val %d\n", token, intval);
+ } else if (token > Opt_last_int && token < Opt_last_string) {
+ dout("got string token %d val %s\n", token,
+ argstr[0].from);
+ } else {
+ dout("got token %d\n", token);
}
- if (i == 16)
- err = 0;
- dout("parse_fsid ret %d got fsid %pU", err, fsid);
- return err;
+ switch (token) {
+ case Opt_snapdirname:
+ kfree(fsopt->snapdir_name);
+ fsopt->snapdir_name = kstrndup(argstr[0].from,
+ argstr[0].to-argstr[0].from,
+ GFP_KERNEL);
+ if (!fsopt->snapdir_name)
+ return -ENOMEM;
+ break;
+
+ /* misc */
+ case Opt_wsize:
+ fsopt->wsize = intval;
+ break;
+ case Opt_rsize:
+ fsopt->rsize = intval;
+ break;
+ case Opt_caps_wanted_delay_min:
+ fsopt->caps_wanted_delay_min = intval;
+ break;
+ case Opt_caps_wanted_delay_max:
+ fsopt->caps_wanted_delay_max = intval;
+ break;
+ case Opt_readdir_max_entries:
+ fsopt->max_readdir = intval;
+ break;
+ case Opt_readdir_max_bytes:
+ fsopt->max_readdir_bytes = intval;
+ break;
+ case Opt_congestion_kb:
+ fsopt->congestion_kb = intval;
+ break;
+ case Opt_dirstat:
+ fsopt->flags |= CEPH_MOUNT_OPT_DIRSTAT;
+ break;
+ case Opt_nodirstat:
+ fsopt->flags &= ~CEPH_MOUNT_OPT_DIRSTAT;
+ break;
+ case Opt_rbytes:
+ fsopt->flags |= CEPH_MOUNT_OPT_RBYTES;
+ break;
+ case Opt_norbytes:
+ fsopt->flags &= ~CEPH_MOUNT_OPT_RBYTES;
+ break;
+ case Opt_noasyncreaddir:
+ fsopt->flags |= CEPH_MOUNT_OPT_NOASYNCREADDIR;
+ break;
+ default:
+ BUG_ON(token);
+ }
+ return 0;
}
-static struct ceph_mount_args *parse_mount_args(int flags, char *options,
- const char *dev_name,
- const char **path)
+static void destroy_mount_options(struct ceph_mount_options *args)
{
- struct ceph_mount_args *args;
- const char *c;
- int err = -ENOMEM;
- substring_t argstr[MAX_OPT_ARGS];
+ dout("destroy_mount_options %p\n", args);
+ kfree(args->snapdir_name);
+ kfree(args);
+}
- args = kzalloc(sizeof(*args), GFP_KERNEL);
- if (!args)
- return ERR_PTR(-ENOMEM);
- args->mon_addr = kcalloc(CEPH_MAX_MON, sizeof(*args->mon_addr),
- GFP_KERNEL);
- if (!args->mon_addr)
- goto out;
+static int strcmp_null(const char *s1, const char *s2)
+{
+ if (!s1 && !s2)
+ return 0;
+ if (s1 && !s2)
+ return -1;
+ if (!s1 && s2)
+ return 1;
+ return strcmp(s1, s2);
+}
- dout("parse_mount_args %p, dev_name '%s'\n", args, dev_name);
-
- /* start with defaults */
- args->sb_flags = flags;
- args->flags = CEPH_OPT_DEFAULT;
- args->osd_timeout = CEPH_OSD_TIMEOUT_DEFAULT;
- args->osd_keepalive_timeout = CEPH_OSD_KEEPALIVE_DEFAULT;
- args->mount_timeout = CEPH_MOUNT_TIMEOUT_DEFAULT; /* seconds */
- args->osd_idle_ttl = CEPH_OSD_IDLE_TTL_DEFAULT; /* seconds */
- args->caps_wanted_delay_min = CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT;
- args->caps_wanted_delay_max = CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT;
- args->rsize = CEPH_MOUNT_RSIZE_DEFAULT;
- args->snapdir_name = kstrdup(CEPH_SNAPDIRNAME_DEFAULT, GFP_KERNEL);
- args->cap_release_safety = CEPH_CAP_RELEASE_SAFETY_DEFAULT;
- args->max_readdir = CEPH_MAX_READDIR_DEFAULT;
- args->max_readdir_bytes = CEPH_MAX_READDIR_BYTES_DEFAULT;
- args->congestion_kb = default_congestion_kb();
-
- /* ip1[:port1][,ip2[:port2]...]:/subdir/in/fs */
- err = -EINVAL;
- if (!dev_name)
- goto out;
- *path = strstr(dev_name, ":/");
- if (*path == NULL) {
- pr_err("device name is missing path (no :/ in %s)\n",
- dev_name);
- goto out;
- }
+static int compare_mount_options(struct ceph_mount_options *new_fsopt,
+ struct ceph_options *new_opt,
+ struct ceph_fs_client *fsc)
+{
+ struct ceph_mount_options *fsopt1 = new_fsopt;
+ struct ceph_mount_options *fsopt2 = fsc->mount_options;
+ int ofs = offsetof(struct ceph_mount_options, snapdir_name);
+ int ret;
- /* get mon ip(s) */
- err = ceph_parse_ips(dev_name, *path, args->mon_addr,
- CEPH_MAX_MON, &args->num_mon);
- if (err < 0)
- goto out;
+ ret = memcmp(fsopt1, fsopt2, ofs);
+ if (ret)
+ return ret;
+
+ ret = strcmp_null(fsopt1->snapdir_name, fsopt2->snapdir_name);
+ if (ret)
+ return ret;
+
+ return ceph_compare_options(new_opt, fsc->client);
+}
+
+static int parse_mount_options(struct ceph_mount_options **pfsopt,
+ struct ceph_options **popt,
+ int flags, char *options,
+ const char *dev_name,
+ const char **path)
+{
+ struct ceph_mount_options *fsopt;
+ const char *dev_name_end;
+ int err = -ENOMEM;
+
+ fsopt = kzalloc(sizeof(*fsopt), GFP_KERNEL);
+ if (!fsopt)
+ return -ENOMEM;
+
+ dout("parse_mount_options %p, dev_name '%s'\n", fsopt, dev_name);
+
+ fsopt->sb_flags = flags;
+ fsopt->flags = CEPH_MOUNT_OPT_DEFAULT;
+
+ fsopt->rsize = CEPH_MOUNT_RSIZE_DEFAULT;
+ fsopt->snapdir_name = kstrdup(CEPH_SNAPDIRNAME_DEFAULT, GFP_KERNEL);
+ fsopt->cap_release_safety = CEPH_CAP_RELEASE_SAFETY_DEFAULT;
+ fsopt->max_readdir = CEPH_MAX_READDIR_DEFAULT;
+ fsopt->max_readdir_bytes = CEPH_MAX_READDIR_BYTES_DEFAULT;
+ fsopt->congestion_kb = default_congestion_kb();
+
+ /* ip1[:port1][,ip2[:port2]...]:/subdir/in/fs */
+ err = -EINVAL;
+ if (!dev_name)
+ goto out;
+ *path = strstr(dev_name, ":/");
+ if (*path == NULL) {
+ pr_err("device name is missing path (no :/ in %s)\n",
+ dev_name);
+ goto out;
+ }
+ dev_name_end = *path;
+ dout("device name '%.*s'\n", (int)(dev_name_end - dev_name), dev_name);
/* path on server */
*path += 2;
dout("server path '%s'\n", *path);
- /* parse mount options */
- while ((c = strsep(&options, ",")) != NULL) {
- int token, intval, ret;
- if (!*c)
- continue;
- err = -EINVAL;
- token = match_token((char *)c, arg_tokens, argstr);
- if (token < 0) {
- pr_err("bad mount option at '%s'\n", c);
- goto out;
- }
- if (token < Opt_last_int) {
- ret = match_int(&argstr[0], &intval);
- if (ret < 0) {
- pr_err("bad mount option arg (not int) "
- "at '%s'\n", c);
- continue;
- }
- dout("got int token %d val %d\n", token, intval);
- } else if (token > Opt_last_int && token < Opt_last_string) {
- dout("got string token %d val %s\n", token,
- argstr[0].from);
- } else {
- dout("got token %d\n", token);
- }
- switch (token) {
- case Opt_ip:
- err = ceph_parse_ips(argstr[0].from,
- argstr[0].to,
- &args->my_addr,
- 1, NULL);
- if (err < 0)
- goto out;
- args->flags |= CEPH_OPT_MYIP;
- break;
-
- case Opt_fsid:
- err = parse_fsid(argstr[0].from, &args->fsid);
- if (err == 0)
- args->flags |= CEPH_OPT_FSID;
- break;
- case Opt_snapdirname:
- kfree(args->snapdir_name);
- args->snapdir_name = kstrndup(argstr[0].from,
- argstr[0].to-argstr[0].from,
- GFP_KERNEL);
- break;
- case Opt_name:
- args->name = kstrndup(argstr[0].from,
- argstr[0].to-argstr[0].from,
- GFP_KERNEL);
- break;
- case Opt_secret:
- args->secret = kstrndup(argstr[0].from,
- argstr[0].to-argstr[0].from,
- GFP_KERNEL);
- break;
-
- /* misc */
- case Opt_wsize:
- args->wsize = intval;
- break;
- case Opt_rsize:
- args->rsize = intval;
- break;
- case Opt_osdtimeout:
- args->osd_timeout = intval;
- break;
- case Opt_osdkeepalivetimeout:
- args->osd_keepalive_timeout = intval;
- break;
- case Opt_osd_idle_ttl:
- args->osd_idle_ttl = intval;
- break;
- case Opt_mount_timeout:
- args->mount_timeout = intval;
- break;
- case Opt_caps_wanted_delay_min:
- args->caps_wanted_delay_min = intval;
- break;
- case Opt_caps_wanted_delay_max:
- args->caps_wanted_delay_max = intval;
- break;
- case Opt_readdir_max_entries:
- args->max_readdir = intval;
- break;
- case Opt_readdir_max_bytes:
- args->max_readdir_bytes = intval;
- break;
- case Opt_congestion_kb:
- args->congestion_kb = intval;
- break;
-
- case Opt_noshare:
- args->flags |= CEPH_OPT_NOSHARE;
- break;
-
- case Opt_dirstat:
- args->flags |= CEPH_OPT_DIRSTAT;
- break;
- case Opt_nodirstat:
- args->flags &= ~CEPH_OPT_DIRSTAT;
- break;
- case Opt_rbytes:
- args->flags |= CEPH_OPT_RBYTES;
- break;
- case Opt_norbytes:
- args->flags &= ~CEPH_OPT_RBYTES;
- break;
- case Opt_nocrc:
- args->flags |= CEPH_OPT_NOCRC;
- break;
- case Opt_noasyncreaddir:
- args->flags |= CEPH_OPT_NOASYNCREADDIR;
- break;
-
- default:
- BUG_ON(token);
- }
- }
- return args;
+ err = ceph_parse_options(popt, options, dev_name, dev_name_end,
+ parse_fsopt_token, (void *)fsopt);
+ if (err)
+ goto out;
+
+ /* success */
+ *pfsopt = fsopt;
+ return 0;
out:
- kfree(args->mon_addr);
- kfree(args);
- return ERR_PTR(err);
+ destroy_mount_options(fsopt);
+ return err;
}
-static void destroy_mount_args(struct ceph_mount_args *args)
+/**
+ * ceph_show_options - Show mount options in /proc/mounts
+ * @m: seq_file to write to
+ * @mnt: mount descriptor
+ */
+static int ceph_show_options(struct seq_file *m, struct vfsmount *mnt)
{
- dout("destroy_mount_args %p\n", args);
- kfree(args->snapdir_name);
- args->snapdir_name = NULL;
- kfree(args->name);
- args->name = NULL;
- kfree(args->secret);
- args->secret = NULL;
- kfree(args);
+ struct ceph_fs_client *fsc = ceph_sb_to_client(mnt->mnt_sb);
+ struct ceph_mount_options *fsopt = fsc->mount_options;
+ struct ceph_options *opt = fsc->client->options;
+
+ if (opt->flags & CEPH_OPT_FSID)
+ seq_printf(m, ",fsid=%pU", &opt->fsid);
+ if (opt->flags & CEPH_OPT_NOSHARE)
+ seq_puts(m, ",noshare");
+ if (opt->flags & CEPH_OPT_NOCRC)
+ seq_puts(m, ",nocrc");
+
+ if (opt->name)
+ seq_printf(m, ",name=%s", opt->name);
+ if (opt->secret)
+ seq_puts(m, ",secret=<hidden>");
+
+ if (opt->mount_timeout != CEPH_MOUNT_TIMEOUT_DEFAULT)
+ seq_printf(m, ",mount_timeout=%d", opt->mount_timeout);
+ if (opt->osd_idle_ttl != CEPH_OSD_IDLE_TTL_DEFAULT)
+ seq_printf(m, ",osd_idle_ttl=%d", opt->osd_idle_ttl);
+ if (opt->osd_timeout != CEPH_OSD_TIMEOUT_DEFAULT)
+ seq_printf(m, ",osdtimeout=%d", opt->osd_timeout);
+ if (opt->osd_keepalive_timeout != CEPH_OSD_KEEPALIVE_DEFAULT)
+ seq_printf(m, ",osdkeepalivetimeout=%d",
+ opt->osd_keepalive_timeout);
+
+ if (fsopt->flags & CEPH_MOUNT_OPT_DIRSTAT)
+ seq_puts(m, ",dirstat");
+ if ((fsopt->flags & CEPH_MOUNT_OPT_RBYTES) == 0)
+ seq_puts(m, ",norbytes");
+ if (fsopt->flags & CEPH_MOUNT_OPT_NOASYNCREADDIR)
+ seq_puts(m, ",noasyncreaddir");
+
+ if (fsopt->wsize)
+ seq_printf(m, ",wsize=%d", fsopt->wsize);
+ if (fsopt->rsize != CEPH_MOUNT_RSIZE_DEFAULT)
+ seq_printf(m, ",rsize=%d", fsopt->rsize);
+ if (fsopt->congestion_kb != default_congestion_kb())
+ seq_printf(m, ",write_congestion_kb=%d", fsopt->congestion_kb);
+ if (fsopt->caps_wanted_delay_min != CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT)
+ seq_printf(m, ",caps_wanted_delay_min=%d",
+ fsopt->caps_wanted_delay_min);
+ if (fsopt->caps_wanted_delay_max != CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT)
+ seq_printf(m, ",caps_wanted_delay_max=%d",
+ fsopt->caps_wanted_delay_max);
+ if (fsopt->cap_release_safety != CEPH_CAP_RELEASE_SAFETY_DEFAULT)
+ seq_printf(m, ",cap_release_safety=%d",
+ fsopt->cap_release_safety);
+ if (fsopt->max_readdir != CEPH_MAX_READDIR_DEFAULT)
+ seq_printf(m, ",readdir_max_entries=%d", fsopt->max_readdir);
+ if (fsopt->max_readdir_bytes != CEPH_MAX_READDIR_BYTES_DEFAULT)
+ seq_printf(m, ",readdir_max_bytes=%d", fsopt->max_readdir_bytes);
+ if (strcmp(fsopt->snapdir_name, CEPH_SNAPDIRNAME_DEFAULT))
+ seq_printf(m, ",snapdirname=%s", fsopt->snapdir_name);
+ return 0;
}
/*
- * create a fresh client instance
+ * handle any mon messages the standard library doesn't understand.
+ * return error if we don't either.
*/
-static struct ceph_client *ceph_create_client(struct ceph_mount_args *args)
+static int extra_mon_dispatch(struct ceph_client *client, struct ceph_msg *msg)
{
- struct ceph_client *client;
+ struct ceph_fs_client *fsc = client->private;
+ int type = le16_to_cpu(msg->hdr.type);
+
+ switch (type) {
+ case CEPH_MSG_MDS_MAP:
+ ceph_mdsc_handle_map(fsc->mdsc, msg);
+ return 0;
+
+ default:
+ return -1;
+ }
+}
+
+/*
+ * create a new fs client
+ */
+struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
+ struct ceph_options *opt)
+{
+ struct ceph_fs_client *fsc;
int err = -ENOMEM;
- client = kzalloc(sizeof(*client), GFP_KERNEL);
- if (client == NULL)
+ fsc = kzalloc(sizeof(*fsc), GFP_KERNEL);
+ if (!fsc)
return ERR_PTR(-ENOMEM);
- mutex_init(&client->mount_mutex);
-
- init_waitqueue_head(&client->auth_wq);
+ fsc->client = ceph_create_client(opt, fsc);
+ if (IS_ERR(fsc->client)) {
+ err = PTR_ERR(fsc->client);
+ goto fail;
+ }
+ fsc->client->extra_mon_dispatch = extra_mon_dispatch;
+ fsc->client->supported_features |= CEPH_FEATURE_FLOCK;
+ fsc->client->monc.want_mdsmap = 1;
- client->sb = NULL;
- client->mount_state = CEPH_MOUNT_MOUNTING;
- client->mount_args = args;
+ fsc->mount_options = fsopt;
- client->msgr = NULL;
+ fsc->sb = NULL;
+ fsc->mount_state = CEPH_MOUNT_MOUNTING;
- client->auth_err = 0;
- atomic_long_set(&client->writeback_count, 0);
+ atomic_long_set(&fsc->writeback_count, 0);
- err = bdi_init(&client->backing_dev_info);
+ err = bdi_init(&fsc->backing_dev_info);
if (err < 0)
- goto fail;
+ goto fail_client;
err = -ENOMEM;
- client->wb_wq = create_workqueue("ceph-writeback");
- if (client->wb_wq == NULL)
+ fsc->wb_wq = create_workqueue("ceph-writeback");
+ if (fsc->wb_wq == NULL)
goto fail_bdi;
- client->pg_inv_wq = create_singlethread_workqueue("ceph-pg-invalid");
- if (client->pg_inv_wq == NULL)
+ fsc->pg_inv_wq = create_singlethread_workqueue("ceph-pg-invalid");
+ if (fsc->pg_inv_wq == NULL)
goto fail_wb_wq;
- client->trunc_wq = create_singlethread_workqueue("ceph-trunc");
- if (client->trunc_wq == NULL)
+ fsc->trunc_wq = create_singlethread_workqueue("ceph-trunc");
+ if (fsc->trunc_wq == NULL)
goto fail_pg_inv_wq;
/* set up mempools */
err = -ENOMEM;
- client->wb_pagevec_pool = mempool_create_kmalloc_pool(10,
- client->mount_args->wsize >> PAGE_CACHE_SHIFT);
- if (!client->wb_pagevec_pool)
+ fsc->wb_pagevec_pool = mempool_create_kmalloc_pool(10,
+ fsc->mount_options->wsize >> PAGE_CACHE_SHIFT);
+ if (!fsc->wb_pagevec_pool)
goto fail_trunc_wq;
/* caps */
- client->min_caps = args->max_readdir;
+ fsc->min_caps = fsopt->max_readdir;
+
+ return fsc;
- /* subsystems */
- err = ceph_monc_init(&client->monc, client);
- if (err < 0)
- goto fail_mempool;
- err = ceph_osdc_init(&client->osdc, client);
- if (err < 0)
- goto fail_monc;
- err = ceph_mdsc_init(&client->mdsc, client);
- if (err < 0)
- goto fail_osdc;
- return client;
-
-fail_osdc:
- ceph_osdc_stop(&client->osdc);
-fail_monc:
- ceph_monc_stop(&client->monc);
-fail_mempool:
- mempool_destroy(client->wb_pagevec_pool);
fail_trunc_wq:
- destroy_workqueue(client->trunc_wq);
+ destroy_workqueue(fsc->trunc_wq);
fail_pg_inv_wq:
- destroy_workqueue(client->pg_inv_wq);
+ destroy_workqueue(fsc->pg_inv_wq);
fail_wb_wq:
- destroy_workqueue(client->wb_wq);
+ destroy_workqueue(fsc->wb_wq);
fail_bdi:
- bdi_destroy(&client->backing_dev_info);
+ bdi_destroy(&fsc->backing_dev_info);
+fail_client:
+ ceph_destroy_client(fsc->client);
fail:
- kfree(client);
+ kfree(fsc);
return ERR_PTR(err);
}
-static void ceph_destroy_client(struct ceph_client *client)
+void destroy_fs_client(struct ceph_fs_client *fsc)
{
- dout("destroy_client %p\n", client);
+ dout("destroy_fs_client %p\n", fsc);
- /* unmount */
- ceph_mdsc_stop(&client->mdsc);
- ceph_osdc_stop(&client->osdc);
+ destroy_workqueue(fsc->wb_wq);
+ destroy_workqueue(fsc->pg_inv_wq);
+ destroy_workqueue(fsc->trunc_wq);
- /*
- * make sure mds and osd connections close out before destroying
- * the auth module, which is needed to free those connections'
- * ceph_authorizers.
- */
- ceph_msgr_flush();
-
- ceph_monc_stop(&client->monc);
+ bdi_destroy(&fsc->backing_dev_info);
- ceph_debugfs_client_cleanup(client);
- destroy_workqueue(client->wb_wq);
- destroy_workqueue(client->pg_inv_wq);
- destroy_workqueue(client->trunc_wq);
+ mempool_destroy(fsc->wb_pagevec_pool);
- bdi_destroy(&client->backing_dev_info);
+ destroy_mount_options(fsc->mount_options);
- if (client->msgr)
- ceph_messenger_destroy(client->msgr);
- mempool_destroy(client->wb_pagevec_pool);
+ ceph_fs_debugfs_cleanup(fsc);
- destroy_mount_args(client->mount_args);
+ ceph_destroy_client(fsc->client);
- kfree(client);
- dout("destroy_client %p done\n", client);
+ kfree(fsc);
+ dout("destroy_fs_client %p done\n", fsc);
}
/*
- * Initially learn our fsid, or verify an fsid matches.
+ * caches
*/
-int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid)
+struct kmem_cache *ceph_inode_cachep;
+struct kmem_cache *ceph_cap_cachep;
+struct kmem_cache *ceph_dentry_cachep;
+struct kmem_cache *ceph_file_cachep;
+
+static void ceph_inode_init_once(void *foo)
{
- if (client->have_fsid) {
- if (ceph_fsid_compare(&client->fsid, fsid)) {
- pr_err("bad fsid, had %pU got %pU",
- &client->fsid, fsid);
- return -1;
- }
- } else {
- pr_info("client%lld fsid %pU\n", client->monc.auth->global_id,
- fsid);
- memcpy(&client->fsid, fsid, sizeof(*fsid));
- ceph_debugfs_client_init(client);
- client->have_fsid = true;
- }
+ struct ceph_inode_info *ci = foo;
+ inode_init_once(&ci->vfs_inode);
+}
+
+static int __init init_caches(void)
+{
+ ceph_inode_cachep = kmem_cache_create("ceph_inode_info",
+ sizeof(struct ceph_inode_info),
+ __alignof__(struct ceph_inode_info),
+ (SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD),
+ ceph_inode_init_once);
+ if (ceph_inode_cachep == NULL)
+ return -ENOMEM;
+
+ ceph_cap_cachep = KMEM_CACHE(ceph_cap,
+ SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD);
+ if (ceph_cap_cachep == NULL)
+ goto bad_cap;
+
+ ceph_dentry_cachep = KMEM_CACHE(ceph_dentry_info,
+ SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD);
+ if (ceph_dentry_cachep == NULL)
+ goto bad_dentry;
+
+ ceph_file_cachep = KMEM_CACHE(ceph_file_info,
+ SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD);
+ if (ceph_file_cachep == NULL)
+ goto bad_file;
+
return 0;
+
+bad_file:
+ kmem_cache_destroy(ceph_dentry_cachep);
+bad_dentry:
+ kmem_cache_destroy(ceph_cap_cachep);
+bad_cap:
+ kmem_cache_destroy(ceph_inode_cachep);
+ return -ENOMEM;
}
+static void destroy_caches(void)
+{
+ kmem_cache_destroy(ceph_inode_cachep);
+ kmem_cache_destroy(ceph_cap_cachep);
+ kmem_cache_destroy(ceph_dentry_cachep);
+ kmem_cache_destroy(ceph_file_cachep);
+}
+
+
/*
- * true if we have the mon map (and have thus joined the cluster)
+ * ceph_umount_begin - initiate forced umount. Tear down down the
+ * mount, skipping steps that may hang while waiting for server(s).
*/
-static int have_mon_and_osd_map(struct ceph_client *client)
+static void ceph_umount_begin(struct super_block *sb)
{
- return client->monc.monmap && client->monc.monmap->epoch &&
- client->osdc.osdmap && client->osdc.osdmap->epoch;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(sb);
+
+ dout("ceph_umount_begin - starting forced umount\n");
+ if (!fsc)
+ return;
+ fsc->mount_state = CEPH_MOUNT_SHUTDOWN;
+ return;
}
+static const struct super_operations ceph_super_ops = {
+ .alloc_inode = ceph_alloc_inode,
+ .destroy_inode = ceph_destroy_inode,
+ .write_inode = ceph_write_inode,
+ .sync_fs = ceph_sync_fs,
+ .put_super = ceph_put_super,
+ .show_options = ceph_show_options,
+ .statfs = ceph_statfs,
+ .umount_begin = ceph_umount_begin,
+};
+
/*
* Bootstrap mount by opening the root directory. Note the mount
* @started time from caller, and time out if this takes too long.
*/
-static struct dentry *open_root_dentry(struct ceph_client *client,
+static struct dentry *open_root_dentry(struct ceph_fs_client *fsc,
const char *path,
unsigned long started)
{
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct ceph_mds_request *req = NULL;
int err;
struct dentry *root;
@@ -784,14 +609,14 @@ static struct dentry *open_root_dentry(struct ceph_client *client,
req->r_ino1.ino = CEPH_INO_ROOT;
req->r_ino1.snap = CEPH_NOSNAP;
req->r_started = started;
- req->r_timeout = client->mount_args->mount_timeout * HZ;
+ req->r_timeout = fsc->client->options->mount_timeout * HZ;
req->r_args.getattr.mask = cpu_to_le32(CEPH_STAT_CAP_INODE);
req->r_num_caps = 2;
err = ceph_mdsc_do_request(mdsc, NULL, req);
if (err == 0) {
dout("open_root_inode success\n");
if (ceph_ino(req->r_target_inode) == CEPH_INO_ROOT &&
- client->sb->s_root == NULL)
+ fsc->sb->s_root == NULL)
root = d_alloc_root(req->r_target_inode);
else
root = d_obtain_alias(req->r_target_inode);
@@ -804,105 +629,86 @@ static struct dentry *open_root_dentry(struct ceph_client *client,
return root;
}
+
+
+
/*
* mount: join the ceph cluster, and open root directory.
*/
-static int ceph_mount(struct ceph_client *client, struct vfsmount *mnt,
+static int ceph_mount(struct ceph_fs_client *fsc, struct vfsmount *mnt,
const char *path)
{
- struct ceph_entity_addr *myaddr = NULL;
int err;
- unsigned long timeout = client->mount_args->mount_timeout * HZ;
unsigned long started = jiffies; /* note the start time */
struct dentry *root;
+ int first = 0; /* first vfsmount for this super_block */
dout("mount start\n");
- mutex_lock(&client->mount_mutex);
-
- /* initialize the messenger */
- if (client->msgr == NULL) {
- if (ceph_test_opt(client, MYIP))
- myaddr = &client->mount_args->my_addr;
- client->msgr = ceph_messenger_create(myaddr);
- if (IS_ERR(client->msgr)) {
- err = PTR_ERR(client->msgr);
- client->msgr = NULL;
- goto out;
- }
- client->msgr->nocrc = ceph_test_opt(client, NOCRC);
- }
+ mutex_lock(&fsc->client->mount_mutex);
- /* open session, and wait for mon, mds, and osd maps */
- err = ceph_monc_open_session(&client->monc);
+ err = __ceph_open_session(fsc->client, started);
if (err < 0)
goto out;
- while (!have_mon_and_osd_map(client)) {
- err = -EIO;
- if (timeout && time_after_eq(jiffies, started + timeout))
- goto out;
-
- /* wait */
- dout("mount waiting for mon_map\n");
- err = wait_event_interruptible_timeout(client->auth_wq,
- have_mon_and_osd_map(client) || (client->auth_err < 0),
- timeout);
- if (err == -EINTR || err == -ERESTARTSYS)
- goto out;
- if (client->auth_err < 0) {
- err = client->auth_err;
- goto out;
- }
- }
-
dout("mount opening root\n");
- root = open_root_dentry(client, "", started);
+ root = open_root_dentry(fsc, "", started);
if (IS_ERR(root)) {
err = PTR_ERR(root);
goto out;
}
- if (client->sb->s_root)
+ if (fsc->sb->s_root) {
dput(root);
- else
- client->sb->s_root = root;
+ } else {
+ fsc->sb->s_root = root;
+ first = 1;
+
+ err = ceph_fs_debugfs_init(fsc);
+ if (err < 0)
+ goto fail;
+ }
if (path[0] == 0) {
dget(root);
} else {
dout("mount opening base mountpoint\n");
- root = open_root_dentry(client, path, started);
+ root = open_root_dentry(fsc, path, started);
if (IS_ERR(root)) {
err = PTR_ERR(root);
- dput(client->sb->s_root);
- client->sb->s_root = NULL;
- goto out;
+ goto fail;
}
}
mnt->mnt_root = root;
- mnt->mnt_sb = client->sb;
+ mnt->mnt_sb = fsc->sb;
- client->mount_state = CEPH_MOUNT_MOUNTED;
+ fsc->mount_state = CEPH_MOUNT_MOUNTED;
dout("mount success\n");
err = 0;
out:
- mutex_unlock(&client->mount_mutex);
+ mutex_unlock(&fsc->client->mount_mutex);
return err;
+
+fail:
+ if (first) {
+ dput(fsc->sb->s_root);
+ fsc->sb->s_root = NULL;
+ }
+ goto out;
}
static int ceph_set_super(struct super_block *s, void *data)
{
- struct ceph_client *client = data;
+ struct ceph_fs_client *fsc = data;
int ret;
dout("set_super %p data %p\n", s, data);
- s->s_flags = client->mount_args->sb_flags;
+ s->s_flags = fsc->mount_options->sb_flags;
s->s_maxbytes = 1ULL << 40; /* temp value until we get mdsmap */
- s->s_fs_info = client;
- client->sb = s;
+ s->s_fs_info = fsc;
+ fsc->sb = s;
s->s_op = &ceph_super_ops;
s->s_export_op = &ceph_export_ops;
@@ -917,7 +723,7 @@ static int ceph_set_super(struct super_block *s, void *data)
fail:
s->s_fs_info = NULL;
- client->sb = NULL;
+ fsc->sb = NULL;
return ret;
}
@@ -926,30 +732,23 @@ fail:
*/
static int ceph_compare_super(struct super_block *sb, void *data)
{
- struct ceph_client *new = data;
- struct ceph_mount_args *args = new->mount_args;
- struct ceph_client *other = ceph_sb_to_client(sb);
- int i;
+ struct ceph_fs_client *new = data;
+ struct ceph_mount_options *fsopt = new->mount_options;
+ struct ceph_options *opt = new->client->options;
+ struct ceph_fs_client *other = ceph_sb_to_client(sb);
dout("ceph_compare_super %p\n", sb);
- if (args->flags & CEPH_OPT_FSID) {
- if (ceph_fsid_compare(&args->fsid, &other->fsid)) {
- dout("fsid doesn't match\n");
- return 0;
- }
- } else {
- /* do we share (a) monitor? */
- for (i = 0; i < new->monc.monmap->num_mon; i++)
- if (ceph_monmap_contains(other->monc.monmap,
- &new->monc.monmap->mon_inst[i].addr))
- break;
- if (i == new->monc.monmap->num_mon) {
- dout("mon ip not part of monmap\n");
- return 0;
- }
- dout("mon ip matches existing sb %p\n", sb);
+
+ if (compare_mount_options(fsopt, opt, other)) {
+ dout("monitor(s)/mount options don't match\n");
+ return 0;
}
- if (args->sb_flags != other->mount_args->sb_flags) {
+ if ((opt->flags & CEPH_OPT_FSID) &&
+ ceph_fsid_compare(&opt->fsid, &other->client->fsid)) {
+ dout("fsid doesn't match\n");
+ return 0;
+ }
+ if (fsopt->sb_flags != other->mount_options->sb_flags) {
dout("flags differ\n");
return 0;
}
@@ -961,19 +760,20 @@ static int ceph_compare_super(struct super_block *sb, void *data)
*/
static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0);
-static int ceph_register_bdi(struct super_block *sb, struct ceph_client *client)
+static int ceph_register_bdi(struct super_block *sb,
+ struct ceph_fs_client *fsc)
{
int err;
/* set ra_pages based on rsize mount option? */
- if (client->mount_args->rsize >= PAGE_CACHE_SIZE)
- client->backing_dev_info.ra_pages =
- (client->mount_args->rsize + PAGE_CACHE_SIZE - 1)
+ if (fsc->mount_options->rsize >= PAGE_CACHE_SIZE)
+ fsc->backing_dev_info.ra_pages =
+ (fsc->mount_options->rsize + PAGE_CACHE_SIZE - 1)
>> PAGE_SHIFT;
- err = bdi_register(&client->backing_dev_info, NULL, "ceph-%d",
+ err = bdi_register(&fsc->backing_dev_info, NULL, "ceph-%d",
atomic_long_inc_return(&bdi_seq));
if (!err)
- sb->s_bdi = &client->backing_dev_info;
+ sb->s_bdi = &fsc->backing_dev_info;
return err;
}
@@ -982,46 +782,52 @@ static int ceph_get_sb(struct file_system_type *fs_type,
struct vfsmount *mnt)
{
struct super_block *sb;
- struct ceph_client *client;
+ struct ceph_fs_client *fsc;
int err;
int (*compare_super)(struct super_block *, void *) = ceph_compare_super;
const char *path = NULL;
- struct ceph_mount_args *args;
+ struct ceph_mount_options *fsopt = NULL;
+ struct ceph_options *opt = NULL;
dout("ceph_get_sb\n");
- args = parse_mount_args(flags, data, dev_name, &path);
- if (IS_ERR(args)) {
- err = PTR_ERR(args);
+ err = parse_mount_options(&fsopt, &opt, flags, data, dev_name, &path);
+ if (err < 0)
goto out_final;
- }
/* create client (which we may/may not use) */
- client = ceph_create_client(args);
- if (IS_ERR(client)) {
- err = PTR_ERR(client);
+ fsc = create_fs_client(fsopt, opt);
+ if (IS_ERR(fsc)) {
+ err = PTR_ERR(fsc);
+ kfree(fsopt);
+ kfree(opt);
goto out_final;
}
- if (client->mount_args->flags & CEPH_OPT_NOSHARE)
+ err = ceph_mdsc_init(fsc);
+ if (err < 0)
+ goto out;
+
+ if (ceph_test_opt(fsc->client, NOSHARE))
compare_super = NULL;
- sb = sget(fs_type, compare_super, ceph_set_super, client);
+ sb = sget(fs_type, compare_super, ceph_set_super, fsc);
if (IS_ERR(sb)) {
err = PTR_ERR(sb);
goto out;
}
- if (ceph_sb_to_client(sb) != client) {
- ceph_destroy_client(client);
- client = ceph_sb_to_client(sb);
- dout("get_sb got existing client %p\n", client);
+ if (ceph_sb_to_client(sb) != fsc) {
+ ceph_mdsc_destroy(fsc);
+ destroy_fs_client(fsc);
+ fsc = ceph_sb_to_client(sb);
+ dout("get_sb got existing client %p\n", fsc);
} else {
- dout("get_sb using new client %p\n", client);
- err = ceph_register_bdi(sb, client);
+ dout("get_sb using new client %p\n", fsc);
+ err = ceph_register_bdi(sb, fsc);
if (err < 0)
goto out_splat;
}
- err = ceph_mount(client, mnt, path);
+ err = ceph_mount(fsc, mnt, path);
if (err < 0)
goto out_splat;
dout("root %p inode %p ino %llx.%llx\n", mnt->mnt_root,
@@ -1029,12 +835,13 @@ static int ceph_get_sb(struct file_system_type *fs_type,
return 0;
out_splat:
- ceph_mdsc_close_sessions(&client->mdsc);
+ ceph_mdsc_close_sessions(fsc->mdsc);
deactivate_locked_super(sb);
goto out_final;
out:
- ceph_destroy_client(client);
+ ceph_mdsc_destroy(fsc);
+ destroy_fs_client(fsc);
out_final:
dout("ceph_get_sb fail %d\n", err);
return err;
@@ -1042,11 +849,12 @@ out_final:
static void ceph_kill_sb(struct super_block *s)
{
- struct ceph_client *client = ceph_sb_to_client(s);
+ struct ceph_fs_client *fsc = ceph_sb_to_client(s);
dout("kill_sb %p\n", s);
- ceph_mdsc_pre_umount(&client->mdsc);
+ ceph_mdsc_pre_umount(fsc->mdsc);
kill_anon_super(s); /* will call put_super after sb is r/o */
- ceph_destroy_client(client);
+ ceph_mdsc_destroy(fsc);
+ destroy_fs_client(fsc);
}
static struct file_system_type ceph_fs_type = {
@@ -1062,36 +870,20 @@ static struct file_system_type ceph_fs_type = {
static int __init init_ceph(void)
{
- int ret = 0;
-
- ret = ceph_debugfs_init();
- if (ret < 0)
- goto out;
-
- ret = ceph_msgr_init();
- if (ret < 0)
- goto out_debugfs;
-
- ret = init_caches();
+ int ret = init_caches();
if (ret)
- goto out_msgr;
+ goto out;
ret = register_filesystem(&ceph_fs_type);
if (ret)
goto out_icache;
- pr_info("loaded (mon/mds/osd proto %d/%d/%d, osdmap %d/%d %d/%d)\n",
- CEPH_MONC_PROTOCOL, CEPH_MDSC_PROTOCOL, CEPH_OSDC_PROTOCOL,
- CEPH_OSDMAP_VERSION, CEPH_OSDMAP_VERSION_EXT,
- CEPH_OSDMAP_INC_VERSION, CEPH_OSDMAP_INC_VERSION_EXT);
+ pr_info("loaded (mds proto %d)\n", CEPH_MDSC_PROTOCOL);
+
return 0;
out_icache:
destroy_caches();
-out_msgr:
- ceph_msgr_exit();
-out_debugfs:
- ceph_debugfs_cleanup();
out:
return ret;
}
@@ -1101,8 +893,6 @@ static void __exit exit_ceph(void)
dout("exit_ceph\n");
unregister_filesystem(&ceph_fs_type);
destroy_caches();
- ceph_msgr_exit();
- ceph_debugfs_cleanup();
}
module_init(init_ceph);
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index 2482d696f0de..92abe1bef8ec 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -1,7 +1,7 @@
#ifndef _FS_CEPH_SUPER_H
#define _FS_CEPH_SUPER_H
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <asm/unaligned.h>
#include <linux/backing-dev.h>
@@ -14,13 +14,7 @@
#include <linux/writeback.h>
#include <linux/slab.h>
-#include "types.h"
-#include "messenger.h"
-#include "msgpool.h"
-#include "mon_client.h"
-#include "mds_client.h"
-#include "osd_client.h"
-#include "ceph_fs.h"
+#include <linux/ceph/libceph.h>
/* f_type in struct statfs */
#define CEPH_SUPER_MAGIC 0x00c36400
@@ -30,42 +24,25 @@
#define CEPH_BLOCK_SHIFT 20 /* 1 MB */
#define CEPH_BLOCK (1 << CEPH_BLOCK_SHIFT)
-/*
- * Supported features
- */
-#define CEPH_FEATURE_SUPPORTED CEPH_FEATURE_NOSRCADDR | CEPH_FEATURE_FLOCK
-#define CEPH_FEATURE_REQUIRED CEPH_FEATURE_NOSRCADDR
+#define CEPH_MOUNT_OPT_DIRSTAT (1<<4) /* `cat dirname` for stats */
+#define CEPH_MOUNT_OPT_RBYTES (1<<5) /* dir st_bytes = rbytes */
+#define CEPH_MOUNT_OPT_NOASYNCREADDIR (1<<7) /* no dcache readdir */
-/*
- * mount options
- */
-#define CEPH_OPT_FSID (1<<0)
-#define CEPH_OPT_NOSHARE (1<<1) /* don't share client with other sbs */
-#define CEPH_OPT_MYIP (1<<2) /* specified my ip */
-#define CEPH_OPT_DIRSTAT (1<<4) /* funky `cat dirname` for stats */
-#define CEPH_OPT_RBYTES (1<<5) /* dir st_bytes = rbytes */
-#define CEPH_OPT_NOCRC (1<<6) /* no data crc on writes */
-#define CEPH_OPT_NOASYNCREADDIR (1<<7) /* no dcache readdir */
+#define CEPH_MOUNT_OPT_DEFAULT (CEPH_MOUNT_OPT_RBYTES)
-#define CEPH_OPT_DEFAULT (CEPH_OPT_RBYTES)
+#define ceph_set_mount_opt(fsc, opt) \
+ (fsc)->mount_options->flags |= CEPH_MOUNT_OPT_##opt;
+#define ceph_test_mount_opt(fsc, opt) \
+ (!!((fsc)->mount_options->flags & CEPH_MOUNT_OPT_##opt))
-#define ceph_set_opt(client, opt) \
- (client)->mount_args->flags |= CEPH_OPT_##opt;
-#define ceph_test_opt(client, opt) \
- (!!((client)->mount_args->flags & CEPH_OPT_##opt))
+#define CEPH_MAX_READDIR_DEFAULT 1024
+#define CEPH_MAX_READDIR_BYTES_DEFAULT (512*1024)
+#define CEPH_SNAPDIRNAME_DEFAULT ".snap"
-
-struct ceph_mount_args {
- int sb_flags;
+struct ceph_mount_options {
int flags;
- struct ceph_fsid fsid;
- struct ceph_entity_addr my_addr;
- int num_mon;
- struct ceph_entity_addr *mon_addr;
- int mount_timeout;
- int osd_idle_ttl;
- int osd_timeout;
- int osd_keepalive_timeout;
+ int sb_flags;
+
int wsize;
int rsize; /* max readahead */
int congestion_kb; /* max writeback in flight */
@@ -73,82 +50,25 @@ struct ceph_mount_args {
int cap_release_safety;
int max_readdir; /* max readdir result (entires) */
int max_readdir_bytes; /* max readdir result (bytes) */
- char *snapdir_name; /* default ".snap" */
- char *name;
- char *secret;
-};
-
-/*
- * defaults
- */
-#define CEPH_MOUNT_TIMEOUT_DEFAULT 60
-#define CEPH_OSD_TIMEOUT_DEFAULT 60 /* seconds */
-#define CEPH_OSD_KEEPALIVE_DEFAULT 5
-#define CEPH_OSD_IDLE_TTL_DEFAULT 60
-#define CEPH_MOUNT_RSIZE_DEFAULT (512*1024) /* readahead */
-#define CEPH_MAX_READDIR_DEFAULT 1024
-#define CEPH_MAX_READDIR_BYTES_DEFAULT (512*1024)
-
-#define CEPH_MSG_MAX_FRONT_LEN (16*1024*1024)
-#define CEPH_MSG_MAX_DATA_LEN (16*1024*1024)
-
-#define CEPH_SNAPDIRNAME_DEFAULT ".snap"
-#define CEPH_AUTH_NAME_DEFAULT "guest"
-/*
- * Delay telling the MDS we no longer want caps, in case we reopen
- * the file. Delay a minimum amount of time, even if we send a cap
- * message for some other reason. Otherwise, take the oppotunity to
- * update the mds to avoid sending another message later.
- */
-#define CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT 5 /* cap release delay */
-#define CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT 60 /* cap release delay */
-
-#define CEPH_CAP_RELEASE_SAFETY_DEFAULT (CEPH_CAPS_PER_RELEASE * 4)
-
-/* mount state */
-enum {
- CEPH_MOUNT_MOUNTING,
- CEPH_MOUNT_MOUNTED,
- CEPH_MOUNT_UNMOUNTING,
- CEPH_MOUNT_UNMOUNTED,
- CEPH_MOUNT_SHUTDOWN,
-};
-/*
- * subtract jiffies
- */
-static inline unsigned long time_sub(unsigned long a, unsigned long b)
-{
- BUG_ON(time_after(b, a));
- return (long)a - (long)b;
-}
-
-/*
- * per-filesystem client state
- *
- * possibly shared by multiple mount points, if they are
- * mounting the same ceph filesystem/cluster.
- */
-struct ceph_client {
- struct ceph_fsid fsid;
- bool have_fsid;
+ /*
+ * everything above this point can be memcmp'd; everything below
+ * is handled in compare_mount_options()
+ */
- struct mutex mount_mutex; /* serialize mount attempts */
- struct ceph_mount_args *mount_args;
+ char *snapdir_name; /* default ".snap" */
+};
+struct ceph_fs_client {
struct super_block *sb;
- unsigned long mount_state;
- wait_queue_head_t auth_wq;
-
- int auth_err;
+ struct ceph_mount_options *mount_options;
+ struct ceph_client *client;
+ unsigned long mount_state;
int min_caps; /* min caps i added */
- struct ceph_messenger *msgr; /* messenger instance */
- struct ceph_mon_client monc;
- struct ceph_mds_client mdsc;
- struct ceph_osd_client osdc;
+ struct ceph_mds_client *mdsc;
/* writeback */
mempool_t *wb_pagevec_pool;
@@ -160,14 +80,14 @@ struct ceph_client {
struct backing_dev_info backing_dev_info;
#ifdef CONFIG_DEBUG_FS
- struct dentry *debugfs_monmap;
- struct dentry *debugfs_mdsmap, *debugfs_osdmap;
- struct dentry *debugfs_dir, *debugfs_dentry_lru, *debugfs_caps;
+ struct dentry *debugfs_dentry_lru, *debugfs_caps;
struct dentry *debugfs_congestion_kb;
struct dentry *debugfs_bdi;
+ struct dentry *debugfs_mdsc, *debugfs_mdsmap;
#endif
};
+
/*
* File i/o capability. This tracks shared state with the metadata
* server that allows us to cache or writeback attributes or to read
@@ -273,6 +193,20 @@ struct ceph_inode_xattr {
int should_free_val;
};
+/*
+ * Ceph dentry state
+ */
+struct ceph_dentry_info {
+ struct ceph_mds_session *lease_session;
+ u32 lease_gen, lease_shared_gen;
+ u32 lease_seq;
+ unsigned long lease_renew_after, lease_renew_from;
+ struct list_head lru;
+ struct dentry *dentry;
+ u64 time;
+ u64 offset;
+};
+
struct ceph_inode_xattrs_info {
/*
* (still encoded) xattr blob. we avoid the overhead of parsing
@@ -294,11 +228,6 @@ struct ceph_inode_xattrs_info {
/*
* Ceph inode.
*/
-#define CEPH_I_COMPLETE 1 /* we have complete directory cached */
-#define CEPH_I_NODELAY 4 /* do not delay cap release */
-#define CEPH_I_FLUSH 8 /* do not delay flush of dirty metadata */
-#define CEPH_I_NOFLUSH 16 /* do not flush dirty caps */
-
struct ceph_inode_info {
struct ceph_vino i_vino; /* ceph ino + snap */
@@ -388,6 +317,63 @@ static inline struct ceph_inode_info *ceph_inode(struct inode *inode)
return container_of(inode, struct ceph_inode_info, vfs_inode);
}
+static inline struct ceph_vino ceph_vino(struct inode *inode)
+{
+ return ceph_inode(inode)->i_vino;
+}
+
+/*
+ * ino_t is <64 bits on many architectures, blech.
+ *
+ * don't include snap in ino hash, at least for now.
+ */
+static inline ino_t ceph_vino_to_ino(struct ceph_vino vino)
+{
+ ino_t ino = (ino_t)vino.ino; /* ^ (vino.snap << 20); */
+#if BITS_PER_LONG == 32
+ ino ^= vino.ino >> (sizeof(u64)-sizeof(ino_t)) * 8;
+ if (!ino)
+ ino = 1;
+#endif
+ return ino;
+}
+
+/* for printf-style formatting */
+#define ceph_vinop(i) ceph_inode(i)->i_vino.ino, ceph_inode(i)->i_vino.snap
+
+static inline u64 ceph_ino(struct inode *inode)
+{
+ return ceph_inode(inode)->i_vino.ino;
+}
+static inline u64 ceph_snap(struct inode *inode)
+{
+ return ceph_inode(inode)->i_vino.snap;
+}
+
+static inline int ceph_ino_compare(struct inode *inode, void *data)
+{
+ struct ceph_vino *pvino = (struct ceph_vino *)data;
+ struct ceph_inode_info *ci = ceph_inode(inode);
+ return ci->i_vino.ino == pvino->ino &&
+ ci->i_vino.snap == pvino->snap;
+}
+
+static inline struct inode *ceph_find_inode(struct super_block *sb,
+ struct ceph_vino vino)
+{
+ ino_t t = ceph_vino_to_ino(vino);
+ return ilookup5(sb, t, ceph_ino_compare, &vino);
+}
+
+
+/*
+ * Ceph inode.
+ */
+#define CEPH_I_COMPLETE 1 /* we have complete directory cached */
+#define CEPH_I_NODELAY 4 /* do not delay cap release */
+#define CEPH_I_FLUSH 8 /* do not delay flush of dirty metadata */
+#define CEPH_I_NOFLUSH 16 /* do not flush dirty caps */
+
static inline void ceph_i_clear(struct inode *inode, unsigned mask)
{
struct ceph_inode_info *ci = ceph_inode(inode);
@@ -429,20 +415,6 @@ extern u32 ceph_choose_frag(struct ceph_inode_info *ci, u32 v,
struct ceph_inode_frag *pfrag,
int *found);
-/*
- * Ceph dentry state
- */
-struct ceph_dentry_info {
- struct ceph_mds_session *lease_session;
- u32 lease_gen, lease_shared_gen;
- u32 lease_seq;
- unsigned long lease_renew_after, lease_renew_from;
- struct list_head lru;
- struct dentry *dentry;
- u64 time;
- u64 offset;
-};
-
static inline struct ceph_dentry_info *ceph_dentry(struct dentry *dentry)
{
return (struct ceph_dentry_info *)dentry->d_fsdata;
@@ -453,22 +425,6 @@ static inline loff_t ceph_make_fpos(unsigned frag, unsigned off)
return ((loff_t)frag << 32) | (loff_t)off;
}
-/*
- * ino_t is <64 bits on many architectures, blech.
- *
- * don't include snap in ino hash, at least for now.
- */
-static inline ino_t ceph_vino_to_ino(struct ceph_vino vino)
-{
- ino_t ino = (ino_t)vino.ino; /* ^ (vino.snap << 20); */
-#if BITS_PER_LONG == 32
- ino ^= vino.ino >> (sizeof(u64)-sizeof(ino_t)) * 8;
- if (!ino)
- ino = 1;
-#endif
- return ino;
-}
-
static inline int ceph_set_ino_cb(struct inode *inode, void *data)
{
ceph_inode(inode)->i_vino = *(struct ceph_vino *)data;
@@ -476,39 +432,6 @@ static inline int ceph_set_ino_cb(struct inode *inode, void *data)
return 0;
}
-static inline struct ceph_vino ceph_vino(struct inode *inode)
-{
- return ceph_inode(inode)->i_vino;
-}
-
-/* for printf-style formatting */
-#define ceph_vinop(i) ceph_inode(i)->i_vino.ino, ceph_inode(i)->i_vino.snap
-
-static inline u64 ceph_ino(struct inode *inode)
-{
- return ceph_inode(inode)->i_vino.ino;
-}
-static inline u64 ceph_snap(struct inode *inode)
-{
- return ceph_inode(inode)->i_vino.snap;
-}
-
-static inline int ceph_ino_compare(struct inode *inode, void *data)
-{
- struct ceph_vino *pvino = (struct ceph_vino *)data;
- struct ceph_inode_info *ci = ceph_inode(inode);
- return ci->i_vino.ino == pvino->ino &&
- ci->i_vino.snap == pvino->snap;
-}
-
-static inline struct inode *ceph_find_inode(struct super_block *sb,
- struct ceph_vino vino)
-{
- ino_t t = ceph_vino_to_ino(vino);
- return ilookup5(sb, t, ceph_ino_compare, &vino);
-}
-
-
/*
* caps helpers
*/
@@ -573,18 +496,18 @@ extern int ceph_reserve_caps(struct ceph_mds_client *mdsc,
struct ceph_cap_reservation *ctx, int need);
extern int ceph_unreserve_caps(struct ceph_mds_client *mdsc,
struct ceph_cap_reservation *ctx);
-extern void ceph_reservation_status(struct ceph_client *client,
+extern void ceph_reservation_status(struct ceph_fs_client *client,
int *total, int *avail, int *used,
int *reserved, int *min);
-static inline struct ceph_client *ceph_inode_to_client(struct inode *inode)
+static inline struct ceph_fs_client *ceph_inode_to_client(struct inode *inode)
{
- return (struct ceph_client *)inode->i_sb->s_fs_info;
+ return (struct ceph_fs_client *)inode->i_sb->s_fs_info;
}
-static inline struct ceph_client *ceph_sb_to_client(struct super_block *sb)
+static inline struct ceph_fs_client *ceph_sb_to_client(struct super_block *sb)
{
- return (struct ceph_client *)sb->s_fs_info;
+ return (struct ceph_fs_client *)sb->s_fs_info;
}
@@ -614,51 +537,6 @@ struct ceph_file_info {
/*
- * snapshots
- */
-
-/*
- * A "snap context" is the set of existing snapshots when we
- * write data. It is used by the OSD to guide its COW behavior.
- *
- * The ceph_snap_context is refcounted, and attached to each dirty
- * page, indicating which context the dirty data belonged when it was
- * dirtied.
- */
-struct ceph_snap_context {
- atomic_t nref;
- u64 seq;
- int num_snaps;
- u64 snaps[];
-};
-
-static inline struct ceph_snap_context *
-ceph_get_snap_context(struct ceph_snap_context *sc)
-{
- /*
- printk("get_snap_context %p %d -> %d\n", sc, atomic_read(&sc->nref),
- atomic_read(&sc->nref)+1);
- */
- if (sc)
- atomic_inc(&sc->nref);
- return sc;
-}
-
-static inline void ceph_put_snap_context(struct ceph_snap_context *sc)
-{
- if (!sc)
- return;
- /*
- printk("put_snap_context %p %d -> %d\n", sc, atomic_read(&sc->nref),
- atomic_read(&sc->nref)-1);
- */
- if (atomic_dec_and_test(&sc->nref)) {
- /*printk(" deleting snap_context %p\n", sc);*/
- kfree(sc);
- }
-}
-
-/*
* A "snap realm" describes a subset of the file hierarchy sharing
* the same set of snapshots that apply to it. The realms themselves
* are organized into a hierarchy, such that children inherit (some of)
@@ -694,16 +572,33 @@ struct ceph_snap_realm {
spinlock_t inodes_with_caps_lock;
};
-
-
-/*
- * calculate the number of pages a given length and offset map onto,
- * if we align the data.
- */
-static inline int calc_pages_for(u64 off, u64 len)
+static inline int default_congestion_kb(void)
{
- return ((off+len+PAGE_CACHE_SIZE-1) >> PAGE_CACHE_SHIFT) -
- (off >> PAGE_CACHE_SHIFT);
+ int congestion_kb;
+
+ /*
+ * Copied from NFS
+ *
+ * congestion size, scale with available memory.
+ *
+ * 64MB: 8192k
+ * 128MB: 11585k
+ * 256MB: 16384k
+ * 512MB: 23170k
+ * 1GB: 32768k
+ * 2GB: 46340k
+ * 4GB: 65536k
+ * 8GB: 92681k
+ * 16GB: 131072k
+ *
+ * This allows larger machines to have larger/more transfers.
+ * Limit the default to 256M
+ */
+ congestion_kb = (16*int_sqrt(totalram_pages)) << (PAGE_SHIFT-10);
+ if (congestion_kb > 256*1024)
+ congestion_kb = 256*1024;
+
+ return congestion_kb;
}
@@ -736,16 +631,6 @@ static inline bool __ceph_have_pending_cap_snap(struct ceph_inode_info *ci)
ci_item)->writing;
}
-
-/* super.c */
-extern struct kmem_cache *ceph_inode_cachep;
-extern struct kmem_cache *ceph_cap_cachep;
-extern struct kmem_cache *ceph_dentry_cachep;
-extern struct kmem_cache *ceph_file_cachep;
-
-extern const char *ceph_msg_type_name(int type);
-extern int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid);
-
/* inode.c */
extern const struct inode_operations ceph_file_iops;
@@ -851,12 +736,18 @@ extern int ceph_mmap(struct file *file, struct vm_area_struct *vma);
/* file.c */
extern const struct file_operations ceph_file_fops;
extern const struct address_space_operations ceph_aops;
+extern int ceph_copy_to_page_vector(struct page **pages,
+ const char *data,
+ loff_t off, size_t len);
+extern int ceph_copy_from_page_vector(struct page **pages,
+ char *data,
+ loff_t off, size_t len);
+extern struct page **ceph_alloc_page_vector(int num_pages, gfp_t flags);
extern int ceph_open(struct inode *inode, struct file *file);
extern struct dentry *ceph_lookup_open(struct inode *dir, struct dentry *dentry,
struct nameidata *nd, int mode,
int locked_dir);
extern int ceph_release(struct inode *inode, struct file *filp);
-extern void ceph_release_page_vector(struct page **pages, int num_pages);
/* dir.c */
extern const struct file_operations ceph_dir_fops;
@@ -886,12 +777,6 @@ extern long ceph_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
/* export.c */
extern const struct export_operations ceph_export_ops;
-/* debugfs.c */
-extern int ceph_debugfs_init(void);
-extern void ceph_debugfs_cleanup(void);
-extern int ceph_debugfs_client_init(struct ceph_client *client);
-extern void ceph_debugfs_client_cleanup(struct ceph_client *client);
-
/* locks.c */
extern int ceph_lock(struct file *file, int cmd, struct file_lock *fl);
extern int ceph_flock(struct file *file, int cmd, struct file_lock *fl);
@@ -908,4 +793,8 @@ static inline struct inode *get_dentry_parent_inode(struct dentry *dentry)
return NULL;
}
+/* debugfs.c */
+extern int ceph_fs_debugfs_init(struct ceph_fs_client *client);
+extern void ceph_fs_debugfs_cleanup(struct ceph_fs_client *client);
+
#endif /* _FS_CEPH_SUPER_H */
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c
index 097a2654c00f..15c4890e7517 100644
--- a/fs/ceph/xattr.c
+++ b/fs/ceph/xattr.c
@@ -1,6 +1,9 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
+
#include "super.h"
-#include "decode.h"
+#include "mds_client.h"
+
+#include <linux/ceph/decode.h>
#include <linux/xattr.h>
#include <linux/slab.h>
@@ -619,12 +622,12 @@ out:
static int ceph_sync_setxattr(struct dentry *dentry, const char *name,
const char *value, size_t size, int flags)
{
- struct ceph_client *client = ceph_sb_to_client(dentry->d_sb);
+ struct ceph_fs_client *fsc = ceph_sb_to_client(dentry->d_sb);
struct inode *inode = dentry->d_inode;
struct ceph_inode_info *ci = ceph_inode(inode);
struct inode *parent_inode = dentry->d_parent->d_inode;
struct ceph_mds_request *req;
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_mds_client *mdsc = fsc->mdsc;
int err;
int i, nr_pages;
struct page **pages = NULL;
@@ -776,8 +779,8 @@ out:
static int ceph_send_removexattr(struct dentry *dentry, const char *name)
{
- struct ceph_client *client = ceph_sb_to_client(dentry->d_sb);
- struct ceph_mds_client *mdsc = &client->mdsc;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(dentry->d_sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
struct inode *inode = dentry->d_inode;
struct inode *parent_inode = dentry->d_parent->d_inode;
struct ceph_mds_request *req;
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index 578d88c5b46e..f9ed0751cc12 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c
@@ -305,8 +305,7 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
full_path = build_path_from_dentry(direntry);
if (full_path == NULL) {
rc = -ENOMEM;
- FreeXid(xid);
- return rc;
+ goto cifs_create_out;
}
if (oplockEnabled)
@@ -365,9 +364,8 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
if (buf == NULL) {
- kfree(full_path);
- FreeXid(xid);
- return -ENOMEM;
+ rc = -ENOMEM;
+ goto cifs_create_out;
}
/*
@@ -496,6 +494,11 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,
struct cifsTconInfo *pTcon;
char *full_path = NULL;
struct inode *newinode = NULL;
+ int oplock = 0;
+ u16 fileHandle;
+ FILE_ALL_INFO *buf = NULL;
+ unsigned int bytes_written;
+ struct win_dev *pdev;
if (!old_valid_dev(device_number))
return -EINVAL;
@@ -506,9 +509,12 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,
pTcon = cifs_sb->tcon;
full_path = build_path_from_dentry(direntry);
- if (full_path == NULL)
+ if (full_path == NULL) {
rc = -ENOMEM;
- else if (pTcon->unix_ext) {
+ goto mknod_out;
+ }
+
+ if (pTcon->unix_ext) {
struct cifs_unix_set_info_args args = {
.mode = mode & ~current_umask(),
.ctime = NO_CHANGE_64,
@@ -527,87 +533,78 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,
cifs_sb->local_nls,
cifs_sb->mnt_cifs_flags &
CIFS_MOUNT_MAP_SPECIAL_CHR);
+ if (rc)
+ goto mknod_out;
- if (!rc) {
- rc = cifs_get_inode_info_unix(&newinode, full_path,
+ rc = cifs_get_inode_info_unix(&newinode, full_path,
inode->i_sb, xid);
- if (pTcon->nocase)
- direntry->d_op = &cifs_ci_dentry_ops;
- else
- direntry->d_op = &cifs_dentry_ops;
- if (rc == 0)
- d_instantiate(direntry, newinode);
- }
- } else {
- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
- int oplock = 0;
- u16 fileHandle;
- FILE_ALL_INFO *buf;
+ if (pTcon->nocase)
+ direntry->d_op = &cifs_ci_dentry_ops;
+ else
+ direntry->d_op = &cifs_dentry_ops;
- cFYI(1, "sfu compat create special file");
+ if (rc == 0)
+ d_instantiate(direntry, newinode);
+ goto mknod_out;
+ }
- buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
- if (buf == NULL) {
- kfree(full_path);
- rc = -ENOMEM;
- FreeXid(xid);
- return rc;
- }
+ if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL))
+ goto mknod_out;
- rc = CIFSSMBOpen(xid, pTcon, full_path,
- FILE_CREATE, /* fail if exists */
- GENERIC_WRITE /* BB would
- WRITE_OWNER | WRITE_DAC be better? */,
- /* Create a file and set the
- file attribute to SYSTEM */
- CREATE_NOT_DIR | CREATE_OPTION_SPECIAL,
- &fileHandle, &oplock, buf,
- cifs_sb->local_nls,
- cifs_sb->mnt_cifs_flags &
- CIFS_MOUNT_MAP_SPECIAL_CHR);
-
- /* BB FIXME - add handling for backlevel servers
- which need legacy open and check for all
- calls to SMBOpen for fallback to SMBLeagcyOpen */
- if (!rc) {
- /* BB Do not bother to decode buf since no
- local inode yet to put timestamps in,
- but we can reuse it safely */
- unsigned int bytes_written;
- struct win_dev *pdev;
- pdev = (struct win_dev *)buf;
- if (S_ISCHR(mode)) {
- memcpy(pdev->type, "IntxCHR", 8);
- pdev->major =
- cpu_to_le64(MAJOR(device_number));
- pdev->minor =
- cpu_to_le64(MINOR(device_number));
- rc = CIFSSMBWrite(xid, pTcon,
- fileHandle,
- sizeof(struct win_dev),
- 0, &bytes_written, (char *)pdev,
- NULL, 0);
- } else if (S_ISBLK(mode)) {
- memcpy(pdev->type, "IntxBLK", 8);
- pdev->major =
- cpu_to_le64(MAJOR(device_number));
- pdev->minor =
- cpu_to_le64(MINOR(device_number));
- rc = CIFSSMBWrite(xid, pTcon,
- fileHandle,
- sizeof(struct win_dev),
- 0, &bytes_written, (char *)pdev,
- NULL, 0);
- } /* else if(S_ISFIFO */
- CIFSSMBClose(xid, pTcon, fileHandle);
- d_drop(direntry);
- }
- kfree(buf);
- /* add code here to set EAs */
- }
+
+ cFYI(1, "sfu compat create special file");
+
+ buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
+ if (buf == NULL) {
+ kfree(full_path);
+ rc = -ENOMEM;
+ FreeXid(xid);
+ return rc;
}
+ /* FIXME: would WRITE_OWNER | WRITE_DAC be better? */
+ rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_CREATE,
+ GENERIC_WRITE, CREATE_NOT_DIR | CREATE_OPTION_SPECIAL,
+ &fileHandle, &oplock, buf, cifs_sb->local_nls,
+ cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
+ if (rc)
+ goto mknod_out;
+
+ /* BB Do not bother to decode buf since no local inode yet to put
+ * timestamps in, but we can reuse it safely */
+
+ pdev = (struct win_dev *)buf;
+ if (S_ISCHR(mode)) {
+ memcpy(pdev->type, "IntxCHR", 8);
+ pdev->major =
+ cpu_to_le64(MAJOR(device_number));
+ pdev->minor =
+ cpu_to_le64(MINOR(device_number));
+ rc = CIFSSMBWrite(xid, pTcon,
+ fileHandle,
+ sizeof(struct win_dev),
+ 0, &bytes_written, (char *)pdev,
+ NULL, 0);
+ } else if (S_ISBLK(mode)) {
+ memcpy(pdev->type, "IntxBLK", 8);
+ pdev->major =
+ cpu_to_le64(MAJOR(device_number));
+ pdev->minor =
+ cpu_to_le64(MINOR(device_number));
+ rc = CIFSSMBWrite(xid, pTcon,
+ fileHandle,
+ sizeof(struct win_dev),
+ 0, &bytes_written, (char *)pdev,
+ NULL, 0);
+ } /* else if (S_ISFIFO) */
+ CIFSSMBClose(xid, pTcon, fileHandle);
+ d_drop(direntry);
+
+ /* FIXME: add code here to set EAs */
+
+mknod_out:
kfree(full_path);
+ kfree(buf);
FreeXid(xid);
return rc;
}
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index db11fdef0e92..de748c652d11 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -242,8 +242,7 @@ int cifs_open(struct inode *inode, struct file *file)
full_path = build_path_from_dentry(file->f_path.dentry);
if (full_path == NULL) {
rc = -ENOMEM;
- FreeXid(xid);
- return rc;
+ goto out;
}
cFYI(1, "inode = 0x%p file flags are 0x%x for %s",
diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c
index 89c5476506ef..73811cfa2ea4 100644
--- a/fs/ecryptfs/keystore.c
+++ b/fs/ecryptfs/keystore.c
@@ -515,6 +515,7 @@ ecryptfs_write_tag_70_packet(char *dest, size_t *remaining_bytes,
if (!s) {
printk(KERN_ERR "%s: Out of memory whilst trying to kmalloc "
"[%zd] bytes of kernel memory\n", __func__, sizeof(*s));
+ rc = -ENOMEM;
goto out;
}
s->desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;
@@ -806,6 +807,7 @@ ecryptfs_parse_tag_70_packet(char **filename, size_t *filename_size,
if (!s) {
printk(KERN_ERR "%s: Out of memory whilst trying to kmalloc "
"[%zd] bytes of kernel memory\n", __func__, sizeof(*s));
+ rc = -ENOMEM;
goto out;
}
s->desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;
diff --git a/fs/exofs/inode.c b/fs/exofs/inode.c
index eb7368ebd8cd..a6bbbe222474 100644
--- a/fs/exofs/inode.c
+++ b/fs/exofs/inode.c
@@ -505,7 +505,7 @@ static int write_exec(struct page_collect *pcol)
pcol_copy = kmalloc(sizeof(*pcol_copy), GFP_KERNEL);
if (!pcol_copy) {
- EXOFS_ERR("write_exec: Faild to kmalloc(pcol)\n");
+ EXOFS_ERR("write_exec: Failed to kmalloc(pcol)\n");
ret = -ENOMEM;
goto err;
}
@@ -521,7 +521,7 @@ static int write_exec(struct page_collect *pcol)
ret = exofs_oi_write(oi, ios);
if (unlikely(ret)) {
- EXOFS_ERR("write_exec: exofs_oi_write() Faild\n");
+ EXOFS_ERR("write_exec: exofs_oi_write() Failed\n");
goto err;
}
@@ -622,7 +622,7 @@ try_again:
/* split the request, next loop will start again */
ret = write_exec(pcol);
if (unlikely(ret)) {
- EXOFS_DBGMSG("write_exec faild => %d", ret);
+ EXOFS_DBGMSG("write_exec failed => %d", ret);
goto fail;
}
@@ -713,7 +713,7 @@ int exofs_write_begin(struct file *file, struct address_space *mapping,
ret = simple_write_begin(file, mapping, pos, len, flags, pagep,
fsdata);
if (ret) {
- EXOFS_DBGMSG("simple_write_begin faild\n");
+ EXOFS_DBGMSG("simple_write_begin failed\n");
goto out;
}
@@ -726,7 +726,7 @@ int exofs_write_begin(struct file *file, struct address_space *mapping,
if (ret) {
/*SetPageError was done by _readpage. Is it ok?*/
unlock_page(page);
- EXOFS_DBGMSG("__readpage_filler faild\n");
+ EXOFS_DBGMSG("__readpage_filler failed\n");
}
}
out:
@@ -1089,7 +1089,7 @@ static void create_done(struct exofs_io_state *ios, void *p)
atomic_dec(&sbi->s_curr_pending);
if (unlikely(ret)) {
- EXOFS_ERR("object=0x%llx creation faild in pid=0x%llx",
+ EXOFS_ERR("object=0x%llx creation failed in pid=0x%llx",
_LLU(exofs_oi_objno(oi)), _LLU(sbi->layout.s_pid));
/*TODO: When FS is corrupted creation can fail, object already
* exist. Get rid of this asynchronous creation, if exist
@@ -1209,7 +1209,7 @@ static int exofs_update_inode(struct inode *inode, int do_sync)
args = kzalloc(sizeof(*args), GFP_KERNEL);
if (!args) {
- EXOFS_DBGMSG("Faild kzalloc of args\n");
+ EXOFS_DBGMSG("Failed kzalloc of args\n");
return -ENOMEM;
}
diff --git a/fs/exofs/ios.c b/fs/exofs/ios.c
index 6550bf70e41d..f74a2ec027a6 100644
--- a/fs/exofs/ios.c
+++ b/fs/exofs/ios.c
@@ -55,7 +55,7 @@ int exofs_read_kern(struct osd_dev *od, u8 *cred, struct osd_obj_id *obj,
ret = osd_finalize_request(or, 0, cred, NULL);
if (unlikely(ret)) {
- EXOFS_DBGMSG("Faild to osd_finalize_request() => %d\n", ret);
+ EXOFS_DBGMSG("Failed to osd_finalize_request() => %d\n", ret);
goto out;
}
@@ -79,7 +79,7 @@ int exofs_get_io_state(struct exofs_layout *layout,
*/
ios = kzalloc(exofs_io_state_size(layout->s_numdevs), GFP_KERNEL);
if (unlikely(!ios)) {
- EXOFS_DBGMSG("Faild kzalloc bytes=%d\n",
+ EXOFS_DBGMSG("Failed kzalloc bytes=%d\n",
exofs_io_state_size(layout->s_numdevs));
*pios = NULL;
return -ENOMEM;
@@ -172,7 +172,7 @@ static int exofs_io_execute(struct exofs_io_state *ios)
ret = osd_finalize_request(or, 0, ios->cred, NULL);
if (unlikely(ret)) {
- EXOFS_DBGMSG("Faild to osd_finalize_request() => %d\n",
+ EXOFS_DBGMSG("Failed to osd_finalize_request() => %d\n",
ret);
return ret;
}
@@ -361,7 +361,7 @@ static int _add_stripe_unit(struct exofs_io_state *ios, unsigned *cur_pg,
per_dev->bio = bio_kmalloc(GFP_KERNEL, bio_size);
if (unlikely(!per_dev->bio)) {
- EXOFS_DBGMSG("Faild to allocate BIO size=%u\n",
+ EXOFS_DBGMSG("Failed to allocate BIO size=%u\n",
bio_size);
return -ENOMEM;
}
@@ -564,7 +564,7 @@ static int _sbi_write_mirror(struct exofs_io_state *ios, int cur_comp)
master_dev->bio->bi_max_vecs);
if (unlikely(!bio)) {
EXOFS_DBGMSG(
- "Faild to allocate BIO size=%u\n",
+ "Failed to allocate BIO size=%u\n",
master_dev->bio->bi_max_vecs);
ret = -ENOMEM;
goto out;
diff --git a/fs/ext3/super.c b/fs/ext3/super.c
index 5dbf4dba03c4..a367dd044280 100644
--- a/fs/ext3/super.c
+++ b/fs/ext3/super.c
@@ -1849,8 +1849,8 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
goto failed_mount;
}
- if (le32_to_cpu(es->s_blocks_count) >
- (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) {
+ if (generic_check_addressable(sb->s_blocksize_bits,
+ le32_to_cpu(es->s_blocks_count))) {
ext3_msg(sb, KERN_ERR,
"error: filesystem is too large to mount safely");
if (sizeof(sector_t) < 8)
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 26147746c272..7f47c366bf15 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -2831,15 +2831,13 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
* Test whether we have more sectors than will fit in sector_t,
* and whether the max offset is addressable by the page cache.
*/
- if ((ext4_blocks_count(es) >
- (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) ||
- (ext4_blocks_count(es) >
- (pgoff_t)(~0ULL) >> (PAGE_CACHE_SHIFT - sb->s_blocksize_bits))) {
+ ret = generic_check_addressable(sb->s_blocksize_bits,
+ ext4_blocks_count(es));
+ if (ret) {
ext4_msg(sb, KERN_ERR, "filesystem"
" too large to mount safely on this system");
if (sizeof(sector_t) < 8)
ext4_msg(sb, KERN_WARNING, "CONFIG_LBDAF not enabled");
- ret = -EFBIG;
goto failed_mount;
}
diff --git a/fs/gfs2/Kconfig b/fs/gfs2/Kconfig
index cc9665522148..c465ae066c62 100644
--- a/fs/gfs2/Kconfig
+++ b/fs/gfs2/Kconfig
@@ -1,6 +1,6 @@
config GFS2_FS
tristate "GFS2 file system support"
- depends on EXPERIMENTAL && (64BIT || LBDAF)
+ depends on (64BIT || LBDAF)
select DLM if GFS2_FS_LOCKING_DLM
select CONFIGFS_FS if GFS2_FS_LOCKING_DLM
select SYSFS if GFS2_FS_LOCKING_DLM
diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c
index 194fe16d8418..c92f36ba3fc9 100644
--- a/fs/gfs2/aops.c
+++ b/fs/gfs2/aops.c
@@ -696,13 +696,11 @@ out:
page_cache_release(page);
- /*
- * XXX(truncate): the call below should probably be replaced with
- * a call to the gfs2-specific truncate blocks helper to actually
- * release disk blocks..
- */
+ gfs2_trans_end(sdp);
if (pos + len > ip->i_inode.i_size)
- truncate_setsize(&ip->i_inode, ip->i_inode.i_size);
+ gfs2_trim_blocks(&ip->i_inode);
+ goto out_trans_fail;
+
out_endtrans:
gfs2_trans_end(sdp);
out_trans_fail:
@@ -802,10 +800,8 @@ static int gfs2_stuffed_write_end(struct inode *inode, struct buffer_head *dibh,
page_cache_release(page);
if (copied) {
- if (inode->i_size < to) {
+ if (inode->i_size < to)
i_size_write(inode, to);
- ip->i_disksize = inode->i_size;
- }
gfs2_dinode_out(ip, di);
mark_inode_dirty(inode);
}
@@ -876,8 +872,6 @@ static int gfs2_write_end(struct file *file, struct address_space *mapping,
ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata);
if (ret > 0) {
- if (inode->i_size > ip->i_disksize)
- ip->i_disksize = inode->i_size;
gfs2_dinode_out(ip, dibh->b_data);
mark_inode_dirty(inode);
}
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
index 6f482809d1a3..04513e997df6 100644
--- a/fs/gfs2/bmap.c
+++ b/fs/gfs2/bmap.c
@@ -50,7 +50,7 @@ struct strip_mine {
* @ip: the inode
* @dibh: the dinode buffer
* @block: the block number that was allocated
- * @private: any locked page held by the caller process
+ * @page: The (optional) page. This is looked up if @page is NULL
*
* Returns: errno
*/
@@ -109,8 +109,7 @@ static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh,
/**
* gfs2_unstuff_dinode - Unstuff a dinode when the data has grown too big
* @ip: The GFS2 inode to unstuff
- * @unstuffer: the routine that handles unstuffing a non-zero length file
- * @private: private data for the unstuffer
+ * @page: The (optional) page. This is looked up if the @page is NULL
*
* This routine unstuffs a dinode and returns it to a "normal" state such
* that the height can be grown in the traditional way.
@@ -132,7 +131,7 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
if (error)
goto out;
- if (ip->i_disksize) {
+ if (i_size_read(&ip->i_inode)) {
/* Get a free block, fill it with the stuffed data,
and write it out to disk */
@@ -161,7 +160,7 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
di = (struct gfs2_dinode *)dibh->b_data;
gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
- if (ip->i_disksize) {
+ if (i_size_read(&ip->i_inode)) {
*(__be64 *)(di + 1) = cpu_to_be64(block);
gfs2_add_inode_blocks(&ip->i_inode, 1);
di->di_blocks = cpu_to_be64(gfs2_get_inode_blocks(&ip->i_inode));
@@ -885,83 +884,14 @@ out:
}
/**
- * do_grow - Make a file look bigger than it is
- * @ip: the inode
- * @size: the size to set the file to
- *
- * Called with an exclusive lock on @ip.
- *
- * Returns: errno
- */
-
-static int do_grow(struct gfs2_inode *ip, u64 size)
-{
- struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
- struct gfs2_alloc *al;
- struct buffer_head *dibh;
- int error;
-
- al = gfs2_alloc_get(ip);
- if (!al)
- return -ENOMEM;
-
- error = gfs2_quota_lock_check(ip);
- if (error)
- goto out;
-
- al->al_requested = sdp->sd_max_height + RES_DATA;
-
- error = gfs2_inplace_reserve(ip);
- if (error)
- goto out_gunlock_q;
-
- error = gfs2_trans_begin(sdp,
- sdp->sd_max_height + al->al_rgd->rd_length +
- RES_JDATA + RES_DINODE + RES_STATFS + RES_QUOTA, 0);
- if (error)
- goto out_ipres;
-
- error = gfs2_meta_inode_buffer(ip, &dibh);
- if (error)
- goto out_end_trans;
-
- if (size > sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode)) {
- if (gfs2_is_stuffed(ip)) {
- error = gfs2_unstuff_dinode(ip, NULL);
- if (error)
- goto out_brelse;
- }
- }
-
- ip->i_disksize = size;
- ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
- gfs2_trans_add_bh(ip->i_gl, dibh, 1);
- gfs2_dinode_out(ip, dibh->b_data);
-
-out_brelse:
- brelse(dibh);
-out_end_trans:
- gfs2_trans_end(sdp);
-out_ipres:
- gfs2_inplace_release(ip);
-out_gunlock_q:
- gfs2_quota_unlock(ip);
-out:
- gfs2_alloc_put(ip);
- return error;
-}
-
-
-/**
* gfs2_block_truncate_page - Deal with zeroing out data for truncate
*
* This is partly borrowed from ext3.
*/
-static int gfs2_block_truncate_page(struct address_space *mapping)
+static int gfs2_block_truncate_page(struct address_space *mapping, loff_t from)
{
struct inode *inode = mapping->host;
struct gfs2_inode *ip = GFS2_I(inode);
- loff_t from = inode->i_size;
unsigned long index = from >> PAGE_CACHE_SHIFT;
unsigned offset = from & (PAGE_CACHE_SIZE-1);
unsigned blocksize, iblock, length, pos;
@@ -1023,9 +953,11 @@ unlock:
return err;
}
-static int trunc_start(struct gfs2_inode *ip, u64 size)
+static int trunc_start(struct inode *inode, u64 oldsize, u64 newsize)
{
- struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
+ struct gfs2_inode *ip = GFS2_I(inode);
+ struct gfs2_sbd *sdp = GFS2_SB(inode);
+ struct address_space *mapping = inode->i_mapping;
struct buffer_head *dibh;
int journaled = gfs2_is_jdata(ip);
int error;
@@ -1039,31 +971,26 @@ static int trunc_start(struct gfs2_inode *ip, u64 size)
if (error)
goto out;
+ gfs2_trans_add_bh(ip->i_gl, dibh, 1);
+
if (gfs2_is_stuffed(ip)) {
- u64 dsize = size + sizeof(struct gfs2_dinode);
- ip->i_disksize = size;
- ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
- gfs2_trans_add_bh(ip->i_gl, dibh, 1);
- gfs2_dinode_out(ip, dibh->b_data);
- if (dsize > dibh->b_size)
- dsize = dibh->b_size;
- gfs2_buffer_clear_tail(dibh, dsize);
- error = 1;
+ gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode) + newsize);
} else {
- if (size & (u64)(sdp->sd_sb.sb_bsize - 1))
- error = gfs2_block_truncate_page(ip->i_inode.i_mapping);
-
- if (!error) {
- ip->i_disksize = size;
- ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
- ip->i_diskflags |= GFS2_DIF_TRUNC_IN_PROG;
- gfs2_trans_add_bh(ip->i_gl, dibh, 1);
- gfs2_dinode_out(ip, dibh->b_data);
+ if (newsize & (u64)(sdp->sd_sb.sb_bsize - 1)) {
+ error = gfs2_block_truncate_page(mapping, newsize);
+ if (error)
+ goto out_brelse;
}
+ ip->i_diskflags |= GFS2_DIF_TRUNC_IN_PROG;
}
- brelse(dibh);
+ i_size_write(inode, newsize);
+ ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
+ gfs2_dinode_out(ip, dibh->b_data);
+ truncate_pagecache(inode, oldsize, newsize);
+out_brelse:
+ brelse(dibh);
out:
gfs2_trans_end(sdp);
return error;
@@ -1123,7 +1050,7 @@ static int trunc_end(struct gfs2_inode *ip)
if (error)
goto out;
- if (!ip->i_disksize) {
+ if (!i_size_read(&ip->i_inode)) {
ip->i_height = 0;
ip->i_goal = ip->i_no_addr;
gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
@@ -1143,92 +1070,154 @@ out:
/**
* do_shrink - make a file smaller
- * @ip: the inode
- * @size: the size to make the file
- * @truncator: function to truncate the last partial block
+ * @inode: the inode
+ * @oldsize: the current inode size
+ * @newsize: the size to make the file
*
- * Called with an exclusive lock on @ip.
+ * Called with an exclusive lock on @inode. The @size must
+ * be equal to or smaller than the current inode size.
*
* Returns: errno
*/
-static int do_shrink(struct gfs2_inode *ip, u64 size)
+static int do_shrink(struct inode *inode, u64 oldsize, u64 newsize)
{
+ struct gfs2_inode *ip = GFS2_I(inode);
int error;
- error = trunc_start(ip, size);
+ error = trunc_start(inode, oldsize, newsize);
if (error < 0)
return error;
- if (error > 0)
+ if (gfs2_is_stuffed(ip))
return 0;
- error = trunc_dealloc(ip, size);
- if (!error)
+ error = trunc_dealloc(ip, newsize);
+ if (error == 0)
error = trunc_end(ip);
return error;
}
-static int do_touch(struct gfs2_inode *ip, u64 size)
+void gfs2_trim_blocks(struct inode *inode)
{
- struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
+ u64 size = inode->i_size;
+ int ret;
+
+ ret = do_shrink(inode, size, size);
+ WARN_ON(ret != 0);
+}
+
+/**
+ * do_grow - Touch and update inode size
+ * @inode: The inode
+ * @size: The new size
+ *
+ * This function updates the timestamps on the inode and
+ * may also increase the size of the inode. This function
+ * must not be called with @size any smaller than the current
+ * inode size.
+ *
+ * Although it is not strictly required to unstuff files here,
+ * earlier versions of GFS2 have a bug in the stuffed file reading
+ * code which will result in a buffer overrun if the size is larger
+ * than the max stuffed file size. In order to prevent this from
+ * occuring, such files are unstuffed, but in other cases we can
+ * just update the inode size directly.
+ *
+ * Returns: 0 on success, or -ve on error
+ */
+
+static int do_grow(struct inode *inode, u64 size)
+{
+ struct gfs2_inode *ip = GFS2_I(inode);
+ struct gfs2_sbd *sdp = GFS2_SB(inode);
struct buffer_head *dibh;
+ struct gfs2_alloc *al = NULL;
int error;
- error = gfs2_trans_begin(sdp, RES_DINODE, 0);
+ if (gfs2_is_stuffed(ip) &&
+ (size > (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode)))) {
+ al = gfs2_alloc_get(ip);
+ if (al == NULL)
+ return -ENOMEM;
+
+ error = gfs2_quota_lock_check(ip);
+ if (error)
+ goto do_grow_alloc_put;
+
+ al->al_requested = 1;
+ error = gfs2_inplace_reserve(ip);
+ if (error)
+ goto do_grow_qunlock;
+ }
+
+ error = gfs2_trans_begin(sdp, RES_DINODE + 1, 0);
if (error)
- return error;
+ goto do_grow_release;
- down_write(&ip->i_rw_mutex);
+ if (al) {
+ error = gfs2_unstuff_dinode(ip, NULL);
+ if (error)
+ goto do_end_trans;
+ }
error = gfs2_meta_inode_buffer(ip, &dibh);
if (error)
- goto do_touch_out;
+ goto do_end_trans;
+ i_size_write(inode, size);
ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
gfs2_trans_add_bh(ip->i_gl, dibh, 1);
gfs2_dinode_out(ip, dibh->b_data);
brelse(dibh);
-do_touch_out:
- up_write(&ip->i_rw_mutex);
+do_end_trans:
gfs2_trans_end(sdp);
+do_grow_release:
+ if (al) {
+ gfs2_inplace_release(ip);
+do_grow_qunlock:
+ gfs2_quota_unlock(ip);
+do_grow_alloc_put:
+ gfs2_alloc_put(ip);
+ }
return error;
}
/**
- * gfs2_truncatei - make a file a given size
- * @ip: the inode
- * @size: the size to make the file
- * @truncator: function to truncate the last partial block
+ * gfs2_setattr_size - make a file a given size
+ * @inode: the inode
+ * @newsize: the size to make the file
*
- * The file size can grow, shrink, or stay the same size.
+ * The file size can grow, shrink, or stay the same size. This
+ * is called holding i_mutex and an exclusive glock on the inode
+ * in question.
*
* Returns: errno
*/
-int gfs2_truncatei(struct gfs2_inode *ip, u64 size)
+int gfs2_setattr_size(struct inode *inode, u64 newsize)
{
- int error;
+ int ret;
+ u64 oldsize;
- if (gfs2_assert_warn(GFS2_SB(&ip->i_inode), S_ISREG(ip->i_inode.i_mode)))
- return -EINVAL;
+ BUG_ON(!S_ISREG(inode->i_mode));
- if (size > ip->i_disksize)
- error = do_grow(ip, size);
- else if (size < ip->i_disksize)
- error = do_shrink(ip, size);
- else
- /* update time stamps */
- error = do_touch(ip, size);
+ ret = inode_newsize_ok(inode, newsize);
+ if (ret)
+ return ret;
- return error;
+ oldsize = inode->i_size;
+ if (newsize >= oldsize)
+ return do_grow(inode, newsize);
+
+ return do_shrink(inode, oldsize, newsize);
}
int gfs2_truncatei_resume(struct gfs2_inode *ip)
{
int error;
- error = trunc_dealloc(ip, ip->i_disksize);
+ error = trunc_dealloc(ip, i_size_read(&ip->i_inode));
if (!error)
error = trunc_end(ip);
return error;
@@ -1269,7 +1258,7 @@ int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset,
shift = sdp->sd_sb.sb_bsize_shift;
BUG_ON(gfs2_is_dir(ip));
- end_of_file = (ip->i_disksize + sdp->sd_sb.sb_bsize - 1) >> shift;
+ end_of_file = (i_size_read(&ip->i_inode) + sdp->sd_sb.sb_bsize - 1) >> shift;
lblock = offset >> shift;
lblock_stop = (offset + len + sdp->sd_sb.sb_bsize - 1) >> shift;
if (lblock_stop > end_of_file)
diff --git a/fs/gfs2/bmap.h b/fs/gfs2/bmap.h
index a20a5213135a..42fea03e2bd9 100644
--- a/fs/gfs2/bmap.h
+++ b/fs/gfs2/bmap.h
@@ -44,14 +44,16 @@ static inline void gfs2_write_calc_reserv(const struct gfs2_inode *ip,
}
}
-int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page);
-int gfs2_block_map(struct inode *inode, sector_t lblock, struct buffer_head *bh, int create);
-int gfs2_extent_map(struct inode *inode, u64 lblock, int *new, u64 *dblock, unsigned *extlen);
-
-int gfs2_truncatei(struct gfs2_inode *ip, u64 size);
-int gfs2_truncatei_resume(struct gfs2_inode *ip);
-int gfs2_file_dealloc(struct gfs2_inode *ip);
-int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset,
- unsigned int len);
+extern int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page);
+extern int gfs2_block_map(struct inode *inode, sector_t lblock,
+ struct buffer_head *bh, int create);
+extern int gfs2_extent_map(struct inode *inode, u64 lblock, int *new,
+ u64 *dblock, unsigned *extlen);
+extern int gfs2_setattr_size(struct inode *inode, u64 size);
+extern void gfs2_trim_blocks(struct inode *inode);
+extern int gfs2_truncatei_resume(struct gfs2_inode *ip);
+extern int gfs2_file_dealloc(struct gfs2_inode *ip);
+extern int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset,
+ unsigned int len);
#endif /* __BMAP_DOT_H__ */
diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c
index b9dd88a78dd4..c1042ae438cc 100644
--- a/fs/gfs2/dir.c
+++ b/fs/gfs2/dir.c
@@ -127,8 +127,8 @@ static int gfs2_dir_write_stuffed(struct gfs2_inode *ip, const char *buf,
gfs2_trans_add_bh(ip->i_gl, dibh, 1);
memcpy(dibh->b_data + offset + sizeof(struct gfs2_dinode), buf, size);
- if (ip->i_disksize < offset + size)
- ip->i_disksize = offset + size;
+ if (ip->i_inode.i_size < offset + size)
+ i_size_write(&ip->i_inode, offset + size);
ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
gfs2_dinode_out(ip, dibh->b_data);
@@ -225,8 +225,8 @@ out:
if (error)
return error;
- if (ip->i_disksize < offset + copied)
- ip->i_disksize = offset + copied;
+ if (ip->i_inode.i_size < offset + copied)
+ i_size_write(&ip->i_inode, offset + copied);
ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
gfs2_trans_add_bh(ip->i_gl, dibh, 1);
@@ -275,12 +275,13 @@ static int gfs2_dir_read_data(struct gfs2_inode *ip, char *buf, u64 offset,
unsigned int o;
int copied = 0;
int error = 0;
+ u64 disksize = i_size_read(&ip->i_inode);
- if (offset >= ip->i_disksize)
+ if (offset >= disksize)
return 0;
- if (offset + size > ip->i_disksize)
- size = ip->i_disksize - offset;
+ if (offset + size > disksize)
+ size = disksize - offset;
if (!size)
return 0;
@@ -727,7 +728,7 @@ static struct gfs2_dirent *gfs2_dirent_search(struct inode *inode,
unsigned hsize = 1 << ip->i_depth;
unsigned index;
u64 ln;
- if (hsize * sizeof(u64) != ip->i_disksize) {
+ if (hsize * sizeof(u64) != i_size_read(inode)) {
gfs2_consist_inode(ip);
return ERR_PTR(-EIO);
}
@@ -879,7 +880,7 @@ static int dir_make_exhash(struct inode *inode)
for (x = sdp->sd_hash_ptrs; x--; lp++)
*lp = cpu_to_be64(bn);
- dip->i_disksize = sdp->sd_sb.sb_bsize / 2;
+ i_size_write(inode, sdp->sd_sb.sb_bsize / 2);
gfs2_add_inode_blocks(&dip->i_inode, 1);
dip->i_diskflags |= GFS2_DIF_EXHASH;
@@ -1057,11 +1058,12 @@ static int dir_double_exhash(struct gfs2_inode *dip)
u64 *buf;
u64 *from, *to;
u64 block;
+ u64 disksize = i_size_read(&dip->i_inode);
int x;
int error = 0;
hsize = 1 << dip->i_depth;
- if (hsize * sizeof(u64) != dip->i_disksize) {
+ if (hsize * sizeof(u64) != disksize) {
gfs2_consist_inode(dip);
return -EIO;
}
@@ -1072,7 +1074,7 @@ static int dir_double_exhash(struct gfs2_inode *dip)
if (!buf)
return -ENOMEM;
- for (block = dip->i_disksize >> sdp->sd_hash_bsize_shift; block--;) {
+ for (block = disksize >> sdp->sd_hash_bsize_shift; block--;) {
error = gfs2_dir_read_data(dip, (char *)buf,
block * sdp->sd_hash_bsize,
sdp->sd_hash_bsize, 1);
@@ -1370,7 +1372,7 @@ static int dir_e_read(struct inode *inode, u64 *offset, void *opaque,
unsigned depth = 0;
hsize = 1 << dip->i_depth;
- if (hsize * sizeof(u64) != dip->i_disksize) {
+ if (hsize * sizeof(u64) != i_size_read(inode)) {
gfs2_consist_inode(dip);
return -EIO;
}
@@ -1784,7 +1786,7 @@ static int foreach_leaf(struct gfs2_inode *dip, leaf_call_t lc, void *data)
int error = 0;
hsize = 1 << dip->i_depth;
- if (hsize * sizeof(u64) != dip->i_disksize) {
+ if (hsize * sizeof(u64) != i_size_read(&dip->i_inode)) {
gfs2_consist_inode(dip);
return -EIO;
}
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
index 4edd662c8232..daadcd2e755f 100644
--- a/fs/gfs2/file.c
+++ b/fs/gfs2/file.c
@@ -491,7 +491,7 @@ static int gfs2_open(struct inode *inode, struct file *file)
goto fail;
if (!(file->f_flags & O_LARGEFILE) &&
- ip->i_disksize > MAX_NON_LFS) {
+ i_size_read(inode) > MAX_NON_LFS) {
error = -EOVERFLOW;
goto fail_gunlock;
}
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
index 49f97d3bb690..621d80e8fb2a 100644
--- a/fs/gfs2/glops.c
+++ b/fs/gfs2/glops.c
@@ -262,13 +262,12 @@ static int inode_go_dump(struct seq_file *seq, const struct gfs2_glock *gl)
const struct gfs2_inode *ip = gl->gl_object;
if (ip == NULL)
return 0;
- gfs2_print_dbg(seq, " I: n:%llu/%llu t:%u f:0x%02lx d:0x%08x s:%llu/%llu\n",
+ gfs2_print_dbg(seq, " I: n:%llu/%llu t:%u f:0x%02lx d:0x%08x s:%llu\n",
(unsigned long long)ip->i_no_formal_ino,
(unsigned long long)ip->i_no_addr,
IF2DT(ip->i_inode.i_mode), ip->i_flags,
(unsigned int)ip->i_diskflags,
- (unsigned long long)ip->i_inode.i_size,
- (unsigned long long)ip->i_disksize);
+ (unsigned long long)i_size_read(&ip->i_inode));
return 0;
}
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index fdbf4b366fa5..c11971775275 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -267,7 +267,6 @@ struct gfs2_inode {
u64 i_no_formal_ino;
u64 i_generation;
u64 i_eattr;
- loff_t i_disksize;
unsigned long i_flags; /* GIF_... */
struct gfs2_glock *i_gl; /* Move into i_gh? */
struct gfs2_holder i_iopen_gh;
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 08140f185a37..06370f8bd8cf 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -359,8 +359,7 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
* to do that.
*/
ip->i_inode.i_nlink = be32_to_cpu(str->di_nlink);
- ip->i_disksize = be64_to_cpu(str->di_size);
- i_size_write(&ip->i_inode, ip->i_disksize);
+ i_size_write(&ip->i_inode, be64_to_cpu(str->di_size));
gfs2_set_inode_blocks(&ip->i_inode, be64_to_cpu(str->di_blocks));
atime.tv_sec = be64_to_cpu(str->di_atime);
atime.tv_nsec = be32_to_cpu(str->di_atime_nsec);
@@ -1055,7 +1054,7 @@ void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf)
str->di_uid = cpu_to_be32(ip->i_inode.i_uid);
str->di_gid = cpu_to_be32(ip->i_inode.i_gid);
str->di_nlink = cpu_to_be32(ip->i_inode.i_nlink);
- str->di_size = cpu_to_be64(ip->i_disksize);
+ str->di_size = cpu_to_be64(i_size_read(&ip->i_inode));
str->di_blocks = cpu_to_be64(gfs2_get_inode_blocks(&ip->i_inode));
str->di_atime = cpu_to_be64(ip->i_inode.i_atime.tv_sec);
str->di_mtime = cpu_to_be64(ip->i_inode.i_mtime.tv_sec);
@@ -1085,8 +1084,8 @@ void gfs2_dinode_print(const struct gfs2_inode *ip)
(unsigned long long)ip->i_no_formal_ino);
printk(KERN_INFO " no_addr = %llu\n",
(unsigned long long)ip->i_no_addr);
- printk(KERN_INFO " i_disksize = %llu\n",
- (unsigned long long)ip->i_disksize);
+ printk(KERN_INFO " i_size = %llu\n",
+ (unsigned long long)i_size_read(&ip->i_inode));
printk(KERN_INFO " blocks = %llu\n",
(unsigned long long)gfs2_get_inode_blocks(&ip->i_inode));
printk(KERN_INFO " i_goal = %llu\n",
diff --git a/fs/gfs2/inode.h b/fs/gfs2/inode.h
index 300ada3f21de..15ff4df20aab 100644
--- a/fs/gfs2/inode.h
+++ b/fs/gfs2/inode.h
@@ -80,6 +80,19 @@ static inline void gfs2_inum_out(const struct gfs2_inode *ip,
dent->de_inum.no_addr = cpu_to_be64(ip->i_no_addr);
}
+static inline int gfs2_check_internal_file_size(struct inode *inode,
+ u64 minsize, u64 maxsize)
+{
+ u64 size = i_size_read(inode);
+ if (size < minsize || size > maxsize)
+ goto err;
+ if (size & ((1 << inode->i_blkbits) - 1))
+ goto err;
+ return 0;
+err:
+ gfs2_consist_inode(GFS2_I(inode));
+ return -EIO;
+}
extern void gfs2_set_iop(struct inode *inode);
extern struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type,
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
index 4d4b1e8ac64c..5b5c87dfbfee 100644
--- a/fs/gfs2/ops_fstype.c
+++ b/fs/gfs2/ops_fstype.c
@@ -586,7 +586,7 @@ static int map_journal_extents(struct gfs2_sbd *sdp)
prev_db = 0;
- for (lb = 0; lb < ip->i_disksize >> sdp->sd_sb.sb_bsize_shift; lb++) {
+ for (lb = 0; lb < i_size_read(jd->jd_inode) >> sdp->sd_sb.sb_bsize_shift; lb++) {
bh.b_state = 0;
bh.b_blocknr = 0;
bh.b_size = 1 << ip->i_inode.i_blkbits;
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c
index 1009be2c9737..ee6ffd590418 100644
--- a/fs/gfs2/ops_inode.c
+++ b/fs/gfs2/ops_inode.c
@@ -406,7 +406,6 @@ static int gfs2_symlink(struct inode *dir, struct dentry *dentry,
ip = ghs[1].gh_gl->gl_object;
- ip->i_disksize = size;
i_size_write(inode, size);
error = gfs2_meta_inode_buffer(ip, &dibh);
@@ -461,7 +460,7 @@ static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, int mode)
ip = ghs[1].gh_gl->gl_object;
ip->i_inode.i_nlink = 2;
- ip->i_disksize = sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode);
+ i_size_write(inode, sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode));
ip->i_diskflags |= GFS2_DIF_JDATA;
ip->i_entries = 2;
@@ -990,7 +989,7 @@ static void *gfs2_follow_link(struct dentry *dentry, struct nameidata *nd)
struct gfs2_inode *ip = GFS2_I(dentry->d_inode);
struct gfs2_holder i_gh;
struct buffer_head *dibh;
- unsigned int x;
+ unsigned int x, size;
char *buf;
int error;
@@ -1002,7 +1001,8 @@ static void *gfs2_follow_link(struct dentry *dentry, struct nameidata *nd)
return NULL;
}
- if (!ip->i_disksize) {
+ size = (unsigned int)i_size_read(&ip->i_inode);
+ if (size == 0) {
gfs2_consist_inode(ip);
buf = ERR_PTR(-EIO);
goto out;
@@ -1014,7 +1014,7 @@ static void *gfs2_follow_link(struct dentry *dentry, struct nameidata *nd)
goto out;
}
- x = ip->i_disksize + 1;
+ x = size + 1;
buf = kmalloc(x, GFP_NOFS);
if (!buf)
buf = ERR_PTR(-ENOMEM);
@@ -1071,30 +1071,6 @@ int gfs2_permission(struct inode *inode, int mask)
return error;
}
-/*
- * XXX(truncate): the truncate_setsize calls should be moved to the end.
- */
-static int setattr_size(struct inode *inode, struct iattr *attr)
-{
- struct gfs2_inode *ip = GFS2_I(inode);
- struct gfs2_sbd *sdp = GFS2_SB(inode);
- int error;
-
- if (attr->ia_size != ip->i_disksize) {
- error = gfs2_trans_begin(sdp, 0, sdp->sd_jdesc->jd_blocks);
- if (error)
- return error;
- truncate_setsize(inode, attr->ia_size);
- gfs2_trans_end(sdp);
- }
-
- error = gfs2_truncatei(ip, attr->ia_size);
- if (error && (inode->i_size != ip->i_disksize))
- i_size_write(inode, ip->i_disksize);
-
- return error;
-}
-
static int setattr_chown(struct inode *inode, struct iattr *attr)
{
struct gfs2_inode *ip = GFS2_I(inode);
@@ -1195,7 +1171,7 @@ static int gfs2_setattr(struct dentry *dentry, struct iattr *attr)
goto out;
if (attr->ia_valid & ATTR_SIZE)
- error = setattr_size(inode, attr);
+ error = gfs2_setattr_size(inode, attr->ia_size);
else if (attr->ia_valid & (ATTR_UID | ATTR_GID))
error = setattr_chown(inode, attr);
else if ((attr->ia_valid & ATTR_MODE) && IS_POSIXACL(inode))
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
index 1bc6b5695e6d..9bc6dd9a5443 100644
--- a/fs/gfs2/quota.c
+++ b/fs/gfs2/quota.c
@@ -735,10 +735,8 @@ get_a_page:
goto out;
size = loc + sizeof(struct gfs2_quota);
- if (size > inode->i_size) {
- ip->i_disksize = size;
+ if (size > inode->i_size)
i_size_write(inode, size);
- }
inode->i_mtime = inode->i_atime = CURRENT_TIME;
gfs2_trans_add_bh(ip->i_gl, dibh, 1);
gfs2_dinode_out(ip, dibh->b_data);
@@ -1190,18 +1188,17 @@ static void gfs2_quota_change_in(struct gfs2_quota_change_host *qc, const void *
int gfs2_quota_init(struct gfs2_sbd *sdp)
{
struct gfs2_inode *ip = GFS2_I(sdp->sd_qc_inode);
- unsigned int blocks = ip->i_disksize >> sdp->sd_sb.sb_bsize_shift;
+ u64 size = i_size_read(sdp->sd_qc_inode);
+ unsigned int blocks = size >> sdp->sd_sb.sb_bsize_shift;
unsigned int x, slot = 0;
unsigned int found = 0;
u64 dblock;
u32 extlen = 0;
int error;
- if (!ip->i_disksize || ip->i_disksize > (64 << 20) ||
- ip->i_disksize & (sdp->sd_sb.sb_bsize - 1)) {
- gfs2_consist_inode(ip);
+ if (gfs2_check_internal_file_size(sdp->sd_qc_inode, 1, 64 << 20))
return -EIO;
- }
+
sdp->sd_quota_slots = blocks * sdp->sd_qc_per_block;
sdp->sd_quota_chunks = DIV_ROUND_UP(sdp->sd_quota_slots, 8 * PAGE_SIZE);
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index 171a744f8e45..370c29b536ea 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -500,7 +500,7 @@ u64 gfs2_ri_total(struct gfs2_sbd *sdp)
for (rgrps = 0;; rgrps++) {
loff_t pos = rgrps * sizeof(struct gfs2_rindex);
- if (pos + sizeof(struct gfs2_rindex) >= ip->i_disksize)
+ if (pos + sizeof(struct gfs2_rindex) >= i_size_read(inode))
break;
error = gfs2_internal_read(ip, &ra_state, buf, &pos,
sizeof(struct gfs2_rindex));
@@ -588,7 +588,7 @@ static int gfs2_ri_update(struct gfs2_inode *ip)
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
struct inode *inode = &ip->i_inode;
struct file_ra_state ra_state;
- u64 rgrp_count = ip->i_disksize;
+ u64 rgrp_count = i_size_read(inode);
int error;
do_div(rgrp_count, sizeof(struct gfs2_rindex));
@@ -628,7 +628,7 @@ static int gfs2_ri_update_special(struct gfs2_inode *ip)
for (sdp->sd_rgrps = 0;; sdp->sd_rgrps++) {
/* Ignore partials */
if ((sdp->sd_rgrps + 1) * sizeof(struct gfs2_rindex) >
- ip->i_disksize)
+ i_size_read(inode))
break;
error = read_rindex_entry(ip, &ra_state);
if (error) {
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index 77cb9f830ee4..e031fa4965a3 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -342,15 +342,14 @@ int gfs2_jdesc_check(struct gfs2_jdesc *jd)
{
struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
+ u64 size = i_size_read(jd->jd_inode);
- if (ip->i_disksize < (8 << 20) || ip->i_disksize > (1 << 30) ||
- (ip->i_disksize & (sdp->sd_sb.sb_bsize - 1))) {
- gfs2_consist_inode(ip);
+ if (gfs2_check_internal_file_size(jd->jd_inode, 8 << 20, 1 << 30))
return -EIO;
- }
- jd->jd_blocks = ip->i_disksize >> sdp->sd_sb.sb_bsize_shift;
- if (gfs2_write_alloc_required(ip, 0, ip->i_disksize)) {
+ jd->jd_blocks = size >> sdp->sd_sb.sb_bsize_shift;
+
+ if (gfs2_write_alloc_required(ip, 0, size)) {
gfs2_consist_inode(ip);
return -EIO;
}
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index ad5866aaf0f9..a1e3ab87ef8e 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -1371,6 +1371,10 @@ int jbd2_journal_check_used_features (journal_t *journal, unsigned long compat,
if (!compat && !ro && !incompat)
return 1;
+ /* Load journal superblock if it is not loaded yet. */
+ if (journal->j_format_version == 0 &&
+ journal_get_superblock(journal) != 0)
+ return 0;
if (journal->j_format_version == 1)
return 0;
diff --git a/fs/jfs/jfs_mount.c b/fs/jfs/jfs_mount.c
index 7b698f2ec45a..9895595fd2f2 100644
--- a/fs/jfs/jfs_mount.c
+++ b/fs/jfs/jfs_mount.c
@@ -97,7 +97,7 @@ int jfs_mount(struct super_block *sb)
ipaimap = diReadSpecial(sb, AGGREGATE_I, 0);
if (ipaimap == NULL) {
- jfs_err("jfs_mount: Faild to read AGGREGATE_I");
+ jfs_err("jfs_mount: Failed to read AGGREGATE_I");
rc = -EIO;
goto errout20;
}
@@ -148,7 +148,7 @@ int jfs_mount(struct super_block *sb)
if ((sbi->mntflag & JFS_BAD_SAIT) == 0) {
ipaimap2 = diReadSpecial(sb, AGGREGATE_I, 1);
if (!ipaimap2) {
- jfs_err("jfs_mount: Faild to read AGGREGATE_I");
+ jfs_err("jfs_mount: Failed to read AGGREGATE_I");
rc = -EIO;
goto errout35;
}
diff --git a/fs/libfs.c b/fs/libfs.c
index 0a9da95317f7..62baa0387d6e 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -913,6 +913,35 @@ int generic_file_fsync(struct file *file, int datasync)
}
EXPORT_SYMBOL(generic_file_fsync);
+/**
+ * generic_check_addressable - Check addressability of file system
+ * @blocksize_bits: log of file system block size
+ * @num_blocks: number of blocks in file system
+ *
+ * Determine whether a file system with @num_blocks blocks (and a
+ * block size of 2**@blocksize_bits) is addressable by the sector_t
+ * and page cache of the system. Return 0 if so and -EFBIG otherwise.
+ */
+int generic_check_addressable(unsigned blocksize_bits, u64 num_blocks)
+{
+ u64 last_fs_block = num_blocks - 1;
+ u64 last_fs_page =
+ last_fs_block >> (PAGE_CACHE_SHIFT - blocksize_bits);
+
+ if (unlikely(num_blocks == 0))
+ return 0;
+
+ if ((blocksize_bits < 9) || (blocksize_bits > PAGE_CACHE_SHIFT))
+ return -EINVAL;
+
+ if ((last_fs_block > (sector_t)(~0ULL) >> (blocksize_bits - 9)) ||
+ (last_fs_page > (pgoff_t)(~0ULL))) {
+ return -EFBIG;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(generic_check_addressable);
+
/*
* No-op implementation of ->fsync for in-memory filesystems.
*/
diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig
index 26a510a7be09..6c2aad49d731 100644
--- a/fs/nfs/Kconfig
+++ b/fs/nfs/Kconfig
@@ -63,7 +63,6 @@ config NFS_V3_ACL
config NFS_V4
bool "NFS client support for NFS version 4"
depends on NFS_FS
- select RPCSEC_GSS_KRB5
help
This option enables support for version 4 of the NFS protocol
(RFC 3530) in the kernel's NFS client.
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 29539ceeb745..275efac611e0 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -140,6 +140,13 @@ nfs_opendir(struct inode *inode, struct file *filp)
/* Call generic open code in order to cache credentials */
res = nfs_open(inode, filp);
+ if (filp->f_path.dentry == filp->f_path.mnt->mnt_root) {
+ /* This is a mountpoint, so d_revalidate will never
+ * have been called, so we need to refresh the
+ * inode (for close-open consistency) ourselves.
+ */
+ __nfs_revalidate_inode(NFS_SERVER(inode), inode);
+ }
return res;
}
@@ -1100,7 +1107,7 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
goto no_open_dput;
openflags = nd->intent.open.flags;
/* We cannot do exclusive creation on a positive dentry */
- if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL))
+ if (nd->flags & LOOKUP_EXCL)
goto no_open_dput;
/* We can't create new files, or truncate existing ones here */
openflags &= ~(O_CREAT|O_TRUNC);
diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index 2d141a74ae82..eb51bd6201da 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -323,7 +323,7 @@ nfs_file_fsync(struct file *file, int datasync)
have_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
if (have_error)
ret = xchg(&ctx->error, 0);
- if (!ret)
+ if (!ret && status < 0)
ret = status;
return ret;
}
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 7ffbb98ddec3..6b44bbfb7d8a 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -2273,8 +2273,7 @@ static int nfs4_get_referral(struct inode *dir, const struct qstr *name, struct
out:
if (page)
__free_page(page);
- if (locations)
- kfree(locations);
+ kfree(locations);
return status;
}
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index ee26316ad1f4..ec3966e4706b 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -655,6 +655,13 @@ static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss,
if (nfss->options & NFS_OPTION_FSCACHE)
seq_printf(m, ",fsc");
+
+ if (nfss->flags & NFS_MOUNT_LOOKUP_CACHE_NONEG) {
+ if (nfss->flags & NFS_MOUNT_LOOKUP_CACHE_NONE)
+ seq_printf(m, ",lookupcache=none");
+ else
+ seq_printf(m, ",lookupcache=pos");
+ }
}
/*
diff --git a/fs/nfsd/Kconfig b/fs/nfsd/Kconfig
index 503b9da159a3..95932f523aef 100644
--- a/fs/nfsd/Kconfig
+++ b/fs/nfsd/Kconfig
@@ -69,7 +69,6 @@ config NFSD_V4
depends on NFSD && PROC_FS && EXPERIMENTAL
select NFSD_V3
select FS_POSIX_ACL
- select RPCSEC_GSS_KRB5
help
This option enables support in your system's NFS server for
version 4 of the NFS protocol (RFC 3530).
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
index 1fa86b9df73b..bee60c04109a 100644
--- a/fs/nilfs2/super.c
+++ b/fs/nilfs2/super.c
@@ -400,9 +400,10 @@ int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno)
list_add(&sbi->s_list, &nilfs->ns_supers);
up_write(&nilfs->ns_super_sem);
+ err = -ENOMEM;
sbi->s_ifile = nilfs_ifile_new(sbi, nilfs->ns_inode_size);
if (!sbi->s_ifile)
- return -ENOMEM;
+ goto delist;
down_read(&nilfs->ns_segctor_sem);
err = nilfs_cpfile_get_checkpoint(nilfs->ns_cpfile, cno, 0, &raw_cp,
@@ -433,6 +434,7 @@ int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno)
nilfs_mdt_destroy(sbi->s_ifile);
sbi->s_ifile = NULL;
+ delist:
down_write(&nilfs->ns_super_sem);
list_del_init(&sbi->s_list);
up_write(&nilfs->ns_super_sem);
diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c
index 37de1f062d81..2ae0be76e502 100644
--- a/fs/nilfs2/the_nilfs.c
+++ b/fs/nilfs2/the_nilfs.c
@@ -467,8 +467,8 @@ static unsigned long long nilfs_max_size(unsigned int blkbits)
static int nilfs_store_disk_layout(struct the_nilfs *nilfs,
struct nilfs_super_block *sbp)
{
- if (le32_to_cpu(sbp->s_rev_level) != NILFS_CURRENT_REV) {
- printk(KERN_ERR "NILFS: revision mismatch "
+ if (le32_to_cpu(sbp->s_rev_level) < NILFS_MIN_SUPP_REV) {
+ printk(KERN_ERR "NILFS: unsupported revision "
"(superblock rev.=%d.%d, current rev.=%d.%d). "
"Please check the version of mkfs.nilfs.\n",
le32_to_cpu(sbp->s_rev_level),
@@ -608,11 +608,11 @@ static int nilfs_load_super_block(struct the_nilfs *nilfs,
return -EINVAL;
}
- if (swp) {
+ if (!valid[!swp])
printk(KERN_WARNING "NILFS warning: broken superblock. "
"using spare superblock.\n");
+ if (swp)
nilfs_swap_super_block(nilfs);
- }
nilfs->ns_sbwcount = 0;
nilfs->ns_sbwtime = le64_to_cpu(sbp[0]->s_wtime);
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c
index 0de69c9a08be..5cfeee118158 100644
--- a/fs/ocfs2/aops.c
+++ b/fs/ocfs2/aops.c
@@ -883,8 +883,8 @@ struct ocfs2_write_ctxt {
* out in so that future reads from that region will get
* zero's.
*/
- struct page *w_pages[OCFS2_MAX_CTXT_PAGES];
unsigned int w_num_pages;
+ struct page *w_pages[OCFS2_MAX_CTXT_PAGES];
struct page *w_target_page;
/*
@@ -1642,7 +1642,8 @@ static int ocfs2_zero_tail(struct inode *inode, struct buffer_head *di_bh,
return ret;
}
-int ocfs2_write_begin_nolock(struct address_space *mapping,
+int ocfs2_write_begin_nolock(struct file *filp,
+ struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
struct page **pagep, void **fsdata,
struct buffer_head *di_bh, struct page *mmap_page)
@@ -1692,7 +1693,7 @@ int ocfs2_write_begin_nolock(struct address_space *mapping,
mlog_errno(ret);
goto out;
} else if (ret == 1) {
- ret = ocfs2_refcount_cow(inode, di_bh,
+ ret = ocfs2_refcount_cow(inode, filp, di_bh,
wc->w_cpos, wc->w_clen, UINT_MAX);
if (ret) {
mlog_errno(ret);
@@ -1854,7 +1855,7 @@ static int ocfs2_write_begin(struct file *file, struct address_space *mapping,
*/
down_write(&OCFS2_I(inode)->ip_alloc_sem);
- ret = ocfs2_write_begin_nolock(mapping, pos, len, flags, pagep,
+ ret = ocfs2_write_begin_nolock(file, mapping, pos, len, flags, pagep,
fsdata, di_bh, NULL);
if (ret) {
mlog_errno(ret);
diff --git a/fs/ocfs2/aops.h b/fs/ocfs2/aops.h
index c48e93ffc513..7606f663da6d 100644
--- a/fs/ocfs2/aops.h
+++ b/fs/ocfs2/aops.h
@@ -48,7 +48,8 @@ int ocfs2_write_end_nolock(struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata);
-int ocfs2_write_begin_nolock(struct address_space *mapping,
+int ocfs2_write_begin_nolock(struct file *filp,
+ struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
struct page **pagep, void **fsdata,
struct buffer_head *di_bh, struct page *mmap_page);
diff --git a/fs/ocfs2/blockcheck.c b/fs/ocfs2/blockcheck.c
index ec6d12339593..c7ee03c22226 100644
--- a/fs/ocfs2/blockcheck.c
+++ b/fs/ocfs2/blockcheck.c
@@ -439,7 +439,7 @@ int ocfs2_block_check_validate(void *data, size_t blocksize,
ocfs2_blockcheck_inc_failure(stats);
mlog(ML_ERROR,
- "CRC32 failed: stored: %u, computed %u. Applying ECC.\n",
+ "CRC32 failed: stored: 0x%x, computed 0x%x. Applying ECC.\n",
(unsigned int)check.bc_crc32e, (unsigned int)crc);
/* Ok, try ECC fixups */
@@ -453,7 +453,7 @@ int ocfs2_block_check_validate(void *data, size_t blocksize,
goto out;
}
- mlog(ML_ERROR, "Fixed CRC32 failed: stored: %u, computed %u\n",
+ mlog(ML_ERROR, "Fixed CRC32 failed: stored: 0x%x, computed 0x%x\n",
(unsigned int)check.bc_crc32e, (unsigned int)crc);
rc = -EIO;
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 81296b4e3646..b714f76b82db 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -36,6 +36,7 @@
#include <linux/writeback.h>
#include <linux/falloc.h>
#include <linux/quotaops.h>
+#include <linux/blkdev.h>
#define MLOG_MASK_PREFIX ML_INODE
#include <cluster/masklog.h>
@@ -63,12 +64,6 @@
#include "buffer_head_io.h"
-static int ocfs2_sync_inode(struct inode *inode)
-{
- filemap_fdatawrite(inode->i_mapping);
- return sync_mapping_buffers(inode->i_mapping);
-}
-
static int ocfs2_init_file_private(struct inode *inode, struct file *file)
{
struct ocfs2_file_private *fp;
@@ -186,12 +181,16 @@ static int ocfs2_sync_file(struct file *file, int datasync)
mlog_entry("(0x%p, 0x%p, %d, '%.*s')\n", file, dentry, datasync,
dentry->d_name.len, dentry->d_name.name);
- err = ocfs2_sync_inode(dentry->d_inode);
- if (err)
- goto bail;
-
- if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
+ if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) {
+ /*
+ * We still have to flush drive's caches to get data to the
+ * platter
+ */
+ if (osb->s_mount_opt & OCFS2_MOUNT_BARRIER)
+ blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL,
+ NULL, BLKDEV_IFL_WAIT);
goto bail;
+ }
journal = osb->journal->j_journal;
err = jbd2_journal_force_commit(journal);
@@ -361,7 +360,7 @@ static int ocfs2_cow_file_pos(struct inode *inode,
if (!(ext_flags & OCFS2_EXT_REFCOUNTED))
goto out;
- return ocfs2_refcount_cow(inode, fe_bh, cpos, 1, cpos+1);
+ return ocfs2_refcount_cow(inode, NULL, fe_bh, cpos, 1, cpos+1);
out:
return status;
@@ -904,8 +903,8 @@ static int ocfs2_zero_extend_get_range(struct inode *inode,
zero_clusters = last_cpos - zero_cpos;
if (needs_cow) {
- rc = ocfs2_refcount_cow(inode, di_bh, zero_cpos, zero_clusters,
- UINT_MAX);
+ rc = ocfs2_refcount_cow(inode, NULL, di_bh, zero_cpos,
+ zero_clusters, UINT_MAX);
if (rc) {
mlog_errno(rc);
goto out;
@@ -2053,6 +2052,7 @@ out:
}
static int ocfs2_prepare_inode_for_refcount(struct inode *inode,
+ struct file *file,
loff_t pos, size_t count,
int *meta_level)
{
@@ -2070,7 +2070,7 @@ static int ocfs2_prepare_inode_for_refcount(struct inode *inode,
*meta_level = 1;
- ret = ocfs2_refcount_cow(inode, di_bh, cpos, clusters, UINT_MAX);
+ ret = ocfs2_refcount_cow(inode, file, di_bh, cpos, clusters, UINT_MAX);
if (ret)
mlog_errno(ret);
out:
@@ -2078,7 +2078,7 @@ out:
return ret;
}
-static int ocfs2_prepare_inode_for_write(struct dentry *dentry,
+static int ocfs2_prepare_inode_for_write(struct file *file,
loff_t *ppos,
size_t count,
int appending,
@@ -2086,6 +2086,7 @@ static int ocfs2_prepare_inode_for_write(struct dentry *dentry,
int *has_refcount)
{
int ret = 0, meta_level = 0;
+ struct dentry *dentry = file->f_path.dentry;
struct inode *inode = dentry->d_inode;
loff_t saved_pos, end;
@@ -2141,6 +2142,7 @@ static int ocfs2_prepare_inode_for_write(struct dentry *dentry,
meta_level = -1;
ret = ocfs2_prepare_inode_for_refcount(inode,
+ file,
saved_pos,
count,
&meta_level);
@@ -2255,7 +2257,7 @@ relock:
}
can_do_direct = direct_io;
- ret = ocfs2_prepare_inode_for_write(file->f_path.dentry, ppos,
+ ret = ocfs2_prepare_inode_for_write(file, ppos,
iocb->ki_left, appending,
&can_do_direct, &has_refcount);
if (ret < 0) {
@@ -2303,17 +2305,6 @@ relock:
written = generic_file_direct_write(iocb, iov, &nr_segs, *ppos,
ppos, count, ocount);
if (written < 0) {
- /*
- * direct write may have instantiated a few
- * blocks outside i_size. Trim these off again.
- * Don't need i_size_read because we hold i_mutex.
- *
- * XXX(truncate): this looks buggy because ocfs2 did not
- * actually implement ->truncate. Take a look at
- * the new truncate sequence and update this accordingly
- */
- if (*ppos + count > inode->i_size)
- truncate_setsize(inode, inode->i_size);
ret = written;
goto out_dio;
}
@@ -2385,7 +2376,7 @@ static int ocfs2_splice_to_file(struct pipe_inode_info *pipe,
{
int ret;
- ret = ocfs2_prepare_inode_for_write(out->f_path.dentry, &sd->pos,
+ ret = ocfs2_prepare_inode_for_write(out, &sd->pos,
sd->total_len, 0, NULL, NULL);
if (ret < 0) {
mlog_errno(ret);
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c
index 0492464916b1..eece3e05d9d0 100644
--- a/fs/ocfs2/inode.c
+++ b/fs/ocfs2/inode.c
@@ -488,7 +488,11 @@ static int ocfs2_read_locked_inode(struct inode *inode,
OCFS2_BH_IGNORE_CACHE);
} else {
status = ocfs2_read_blocks_sync(osb, args->fi_blkno, 1, &bh);
- if (!status)
+ /*
+ * If buffer is in jbd, then its checksum may not have been
+ * computed as yet.
+ */
+ if (!status && !buffer_jbd(bh))
status = ocfs2_validate_inode_block(osb->sb, bh);
}
if (status < 0) {
diff --git a/fs/ocfs2/inode.h b/fs/ocfs2/inode.h
index 6de5a869db30..0bc477a3aeb8 100644
--- a/fs/ocfs2/inode.h
+++ b/fs/ocfs2/inode.h
@@ -46,27 +46,24 @@ struct ocfs2_inode_info
/* These fields are protected by ip_lock */
spinlock_t ip_lock;
u32 ip_open_count;
- u32 ip_clusters;
struct list_head ip_io_markers;
+ u32 ip_clusters;
+ u16 ip_dyn_features;
struct mutex ip_io_mutex;
-
u32 ip_flags; /* see below */
u32 ip_attr; /* inode attributes */
- u16 ip_dyn_features;
/* protected by recovery_lock. */
struct inode *ip_next_orphan;
- u32 ip_dir_start_lookup;
-
struct ocfs2_caching_info ip_metadata_cache;
-
struct ocfs2_extent_map ip_extent_map;
-
struct inode vfs_inode;
struct jbd2_inode ip_jinode;
+ u32 ip_dir_start_lookup;
+
/* Only valid if the inode is the dir. */
u32 ip_last_used_slot;
u64 ip_last_used_group;
diff --git a/fs/ocfs2/ioctl.c b/fs/ocfs2/ioctl.c
index 7d9d9c132cef..7a4868196152 100644
--- a/fs/ocfs2/ioctl.c
+++ b/fs/ocfs2/ioctl.c
@@ -26,6 +26,26 @@
#include <linux/ext2_fs.h>
+#define o2info_from_user(a, b) \
+ copy_from_user(&(a), (b), sizeof(a))
+#define o2info_to_user(a, b) \
+ copy_to_user((typeof(a) __user *)b, &(a), sizeof(a))
+
+/*
+ * This call is void because we are already reporting an error that may
+ * be -EFAULT. The error will be returned from the ioctl(2) call. It's
+ * just a best-effort to tell userspace that this request caused the error.
+ */
+static inline void __o2info_set_request_error(struct ocfs2_info_request *kreq,
+ struct ocfs2_info_request __user *req)
+{
+ kreq->ir_flags |= OCFS2_INFO_FL_ERROR;
+ (void)put_user(kreq->ir_flags, (__u32 __user *)&(req->ir_flags));
+}
+
+#define o2info_set_request_error(a, b) \
+ __o2info_set_request_error((struct ocfs2_info_request *)&(a), b)
+
static int ocfs2_get_inode_attr(struct inode *inode, unsigned *flags)
{
int status;
@@ -109,6 +129,328 @@ bail:
return status;
}
+int ocfs2_info_handle_blocksize(struct inode *inode,
+ struct ocfs2_info_request __user *req)
+{
+ int status = -EFAULT;
+ struct ocfs2_info_blocksize oib;
+
+ if (o2info_from_user(oib, req))
+ goto bail;
+
+ oib.ib_blocksize = inode->i_sb->s_blocksize;
+ oib.ib_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+ if (o2info_to_user(oib, req))
+ goto bail;
+
+ status = 0;
+bail:
+ if (status)
+ o2info_set_request_error(oib, req);
+
+ return status;
+}
+
+int ocfs2_info_handle_clustersize(struct inode *inode,
+ struct ocfs2_info_request __user *req)
+{
+ int status = -EFAULT;
+ struct ocfs2_info_clustersize oic;
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+
+ if (o2info_from_user(oic, req))
+ goto bail;
+
+ oic.ic_clustersize = osb->s_clustersize;
+ oic.ic_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+ if (o2info_to_user(oic, req))
+ goto bail;
+
+ status = 0;
+bail:
+ if (status)
+ o2info_set_request_error(oic, req);
+
+ return status;
+}
+
+int ocfs2_info_handle_maxslots(struct inode *inode,
+ struct ocfs2_info_request __user *req)
+{
+ int status = -EFAULT;
+ struct ocfs2_info_maxslots oim;
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+
+ if (o2info_from_user(oim, req))
+ goto bail;
+
+ oim.im_max_slots = osb->max_slots;
+ oim.im_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+ if (o2info_to_user(oim, req))
+ goto bail;
+
+ status = 0;
+bail:
+ if (status)
+ o2info_set_request_error(oim, req);
+
+ return status;
+}
+
+int ocfs2_info_handle_label(struct inode *inode,
+ struct ocfs2_info_request __user *req)
+{
+ int status = -EFAULT;
+ struct ocfs2_info_label oil;
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+
+ if (o2info_from_user(oil, req))
+ goto bail;
+
+ memcpy(oil.il_label, osb->vol_label, OCFS2_MAX_VOL_LABEL_LEN);
+ oil.il_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+ if (o2info_to_user(oil, req))
+ goto bail;
+
+ status = 0;
+bail:
+ if (status)
+ o2info_set_request_error(oil, req);
+
+ return status;
+}
+
+int ocfs2_info_handle_uuid(struct inode *inode,
+ struct ocfs2_info_request __user *req)
+{
+ int status = -EFAULT;
+ struct ocfs2_info_uuid oiu;
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+
+ if (o2info_from_user(oiu, req))
+ goto bail;
+
+ memcpy(oiu.iu_uuid_str, osb->uuid_str, OCFS2_TEXT_UUID_LEN + 1);
+ oiu.iu_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+ if (o2info_to_user(oiu, req))
+ goto bail;
+
+ status = 0;
+bail:
+ if (status)
+ o2info_set_request_error(oiu, req);
+
+ return status;
+}
+
+int ocfs2_info_handle_fs_features(struct inode *inode,
+ struct ocfs2_info_request __user *req)
+{
+ int status = -EFAULT;
+ struct ocfs2_info_fs_features oif;
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+
+ if (o2info_from_user(oif, req))
+ goto bail;
+
+ oif.if_compat_features = osb->s_feature_compat;
+ oif.if_incompat_features = osb->s_feature_incompat;
+ oif.if_ro_compat_features = osb->s_feature_ro_compat;
+ oif.if_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+ if (o2info_to_user(oif, req))
+ goto bail;
+
+ status = 0;
+bail:
+ if (status)
+ o2info_set_request_error(oif, req);
+
+ return status;
+}
+
+int ocfs2_info_handle_journal_size(struct inode *inode,
+ struct ocfs2_info_request __user *req)
+{
+ int status = -EFAULT;
+ struct ocfs2_info_journal_size oij;
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+
+ if (o2info_from_user(oij, req))
+ goto bail;
+
+ oij.ij_journal_size = osb->journal->j_inode->i_size;
+
+ oij.ij_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+ if (o2info_to_user(oij, req))
+ goto bail;
+
+ status = 0;
+bail:
+ if (status)
+ o2info_set_request_error(oij, req);
+
+ return status;
+}
+
+int ocfs2_info_handle_unknown(struct inode *inode,
+ struct ocfs2_info_request __user *req)
+{
+ int status = -EFAULT;
+ struct ocfs2_info_request oir;
+
+ if (o2info_from_user(oir, req))
+ goto bail;
+
+ oir.ir_flags &= ~OCFS2_INFO_FL_FILLED;
+
+ if (o2info_to_user(oir, req))
+ goto bail;
+
+ status = 0;
+bail:
+ if (status)
+ o2info_set_request_error(oir, req);
+
+ return status;
+}
+
+/*
+ * Validate and distinguish OCFS2_IOC_INFO requests.
+ *
+ * - validate the magic number.
+ * - distinguish different requests.
+ * - validate size of different requests.
+ */
+int ocfs2_info_handle_request(struct inode *inode,
+ struct ocfs2_info_request __user *req)
+{
+ int status = -EFAULT;
+ struct ocfs2_info_request oir;
+
+ if (o2info_from_user(oir, req))
+ goto bail;
+
+ status = -EINVAL;
+ if (oir.ir_magic != OCFS2_INFO_MAGIC)
+ goto bail;
+
+ switch (oir.ir_code) {
+ case OCFS2_INFO_BLOCKSIZE:
+ if (oir.ir_size == sizeof(struct ocfs2_info_blocksize))
+ status = ocfs2_info_handle_blocksize(inode, req);
+ break;
+ case OCFS2_INFO_CLUSTERSIZE:
+ if (oir.ir_size == sizeof(struct ocfs2_info_clustersize))
+ status = ocfs2_info_handle_clustersize(inode, req);
+ break;
+ case OCFS2_INFO_MAXSLOTS:
+ if (oir.ir_size == sizeof(struct ocfs2_info_maxslots))
+ status = ocfs2_info_handle_maxslots(inode, req);
+ break;
+ case OCFS2_INFO_LABEL:
+ if (oir.ir_size == sizeof(struct ocfs2_info_label))
+ status = ocfs2_info_handle_label(inode, req);
+ break;
+ case OCFS2_INFO_UUID:
+ if (oir.ir_size == sizeof(struct ocfs2_info_uuid))
+ status = ocfs2_info_handle_uuid(inode, req);
+ break;
+ case OCFS2_INFO_FS_FEATURES:
+ if (oir.ir_size == sizeof(struct ocfs2_info_fs_features))
+ status = ocfs2_info_handle_fs_features(inode, req);
+ break;
+ case OCFS2_INFO_JOURNAL_SIZE:
+ if (oir.ir_size == sizeof(struct ocfs2_info_journal_size))
+ status = ocfs2_info_handle_journal_size(inode, req);
+ break;
+ default:
+ status = ocfs2_info_handle_unknown(inode, req);
+ break;
+ }
+
+bail:
+ return status;
+}
+
+int ocfs2_get_request_ptr(struct ocfs2_info *info, int idx,
+ u64 *req_addr, int compat_flag)
+{
+ int status = -EFAULT;
+ u64 __user *bp = NULL;
+
+ if (compat_flag) {
+#ifdef CONFIG_COMPAT
+ /*
+ * pointer bp stores the base address of a pointers array,
+ * which collects all addresses of separate request.
+ */
+ bp = (u64 __user *)(unsigned long)compat_ptr(info->oi_requests);
+#else
+ BUG();
+#endif
+ } else
+ bp = (u64 __user *)(unsigned long)(info->oi_requests);
+
+ if (o2info_from_user(*req_addr, bp + idx))
+ goto bail;
+
+ status = 0;
+bail:
+ return status;
+}
+
+/*
+ * OCFS2_IOC_INFO handles an array of requests passed from userspace.
+ *
+ * ocfs2_info_handle() recevies a large info aggregation, grab and
+ * validate the request count from header, then break it into small
+ * pieces, later specific handlers can handle them one by one.
+ *
+ * Idea here is to make each separate request small enough to ensure
+ * a better backward&forward compatibility, since a small piece of
+ * request will be less likely to be broken if disk layout get changed.
+ */
+int ocfs2_info_handle(struct inode *inode, struct ocfs2_info *info,
+ int compat_flag)
+{
+ int i, status = 0;
+ u64 req_addr;
+ struct ocfs2_info_request __user *reqp;
+
+ if ((info->oi_count > OCFS2_INFO_MAX_REQUEST) ||
+ (!info->oi_requests)) {
+ status = -EINVAL;
+ goto bail;
+ }
+
+ for (i = 0; i < info->oi_count; i++) {
+
+ status = ocfs2_get_request_ptr(info, i, &req_addr, compat_flag);
+ if (status)
+ break;
+
+ reqp = (struct ocfs2_info_request *)(unsigned long)req_addr;
+ if (!reqp) {
+ status = -EINVAL;
+ goto bail;
+ }
+
+ status = ocfs2_info_handle_request(inode, reqp);
+ if (status)
+ break;
+ }
+
+bail:
+ return status;
+}
+
long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
struct inode *inode = filp->f_path.dentry->d_inode;
@@ -120,6 +462,7 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
struct reflink_arguments args;
const char *old_path, *new_path;
bool preserve;
+ struct ocfs2_info info;
switch (cmd) {
case OCFS2_IOC_GETFLAGS:
@@ -174,6 +517,12 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
preserve = (args.preserve != 0);
return ocfs2_reflink_ioctl(inode, old_path, new_path, preserve);
+ case OCFS2_IOC_INFO:
+ if (copy_from_user(&info, (struct ocfs2_info __user *)arg,
+ sizeof(struct ocfs2_info)))
+ return -EFAULT;
+
+ return ocfs2_info_handle(inode, &info, 0);
default:
return -ENOTTY;
}
@@ -185,6 +534,7 @@ long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
bool preserve;
struct reflink_arguments args;
struct inode *inode = file->f_path.dentry->d_inode;
+ struct ocfs2_info info;
switch (cmd) {
case OCFS2_IOC32_GETFLAGS:
@@ -209,6 +559,12 @@ long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
return ocfs2_reflink_ioctl(inode, compat_ptr(args.old_path),
compat_ptr(args.new_path), preserve);
+ case OCFS2_IOC_INFO:
+ if (copy_from_user(&info, (struct ocfs2_info __user *)arg,
+ sizeof(struct ocfs2_info)))
+ return -EFAULT;
+
+ return ocfs2_info_handle(inode, &info, 1);
default:
return -ENOIOCTLCMD;
}
diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c
index 9b57c0350ff9..faa2303dbf0a 100644
--- a/fs/ocfs2/journal.c
+++ b/fs/ocfs2/journal.c
@@ -301,7 +301,6 @@ static int ocfs2_commit_cache(struct ocfs2_super *osb)
{
int status = 0;
unsigned int flushed;
- unsigned long old_id;
struct ocfs2_journal *journal = NULL;
mlog_entry_void();
@@ -326,7 +325,7 @@ static int ocfs2_commit_cache(struct ocfs2_super *osb)
goto finally;
}
- old_id = ocfs2_inc_trans_id(journal);
+ ocfs2_inc_trans_id(journal);
flushed = atomic_read(&journal->j_num_trans);
atomic_set(&journal->j_num_trans, 0);
@@ -342,9 +341,6 @@ finally:
return status;
}
-/* pass it NULL and it will allocate a new handle object for you. If
- * you pass it a handle however, it may still return error, in which
- * case it has free'd the passed handle for you. */
handle_t *ocfs2_start_trans(struct ocfs2_super *osb, int max_buffs)
{
journal_t *journal = osb->journal->j_journal;
@@ -1888,6 +1884,8 @@ void ocfs2_queue_orphan_scan(struct ocfs2_super *osb)
os = &osb->osb_orphan_scan;
+ mlog(0, "Begin orphan scan\n");
+
if (atomic_read(&os->os_state) == ORPHAN_SCAN_INACTIVE)
goto out;
@@ -1920,6 +1918,7 @@ void ocfs2_queue_orphan_scan(struct ocfs2_super *osb)
unlock:
ocfs2_orphan_scan_unlock(osb, seqno);
out:
+ mlog(0, "Orphan scan completed\n");
return;
}
diff --git a/fs/ocfs2/journal.h b/fs/ocfs2/journal.h
index b5baaa8e710f..43e56b97f9c0 100644
--- a/fs/ocfs2/journal.h
+++ b/fs/ocfs2/journal.h
@@ -67,11 +67,12 @@ struct ocfs2_journal {
struct buffer_head *j_bh; /* Journal disk inode block */
atomic_t j_num_trans; /* Number of transactions
* currently in the system. */
+ spinlock_t j_lock;
unsigned long j_trans_id;
struct rw_semaphore j_trans_barrier;
wait_queue_head_t j_checkpointed;
- spinlock_t j_lock;
+ /* both fields protected by j_lock*/
struct list_head j_la_cleanups;
struct work_struct j_recovery_work;
};
diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c
index af2b8fe1f139..b04d6961c0d4 100644
--- a/fs/ocfs2/mmap.c
+++ b/fs/ocfs2/mmap.c
@@ -59,10 +59,11 @@ static int ocfs2_fault(struct vm_area_struct *area, struct vm_fault *vmf)
return ret;
}
-static int __ocfs2_page_mkwrite(struct inode *inode, struct buffer_head *di_bh,
+static int __ocfs2_page_mkwrite(struct file *file, struct buffer_head *di_bh,
struct page *page)
{
int ret;
+ struct inode *inode = file->f_path.dentry->d_inode;
struct address_space *mapping = inode->i_mapping;
loff_t pos = page_offset(page);
unsigned int len = PAGE_CACHE_SIZE;
@@ -109,7 +110,7 @@ static int __ocfs2_page_mkwrite(struct inode *inode, struct buffer_head *di_bh,
if (page->index == last_index)
len = size & ~PAGE_CACHE_MASK;
- ret = ocfs2_write_begin_nolock(mapping, pos, len, 0, &locked_page,
+ ret = ocfs2_write_begin_nolock(file, mapping, pos, len, 0, &locked_page,
&fsdata, di_bh, page);
if (ret) {
if (ret != -ENOSPC)
@@ -157,7 +158,7 @@ static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
*/
down_write(&OCFS2_I(inode)->ip_alloc_sem);
- ret = __ocfs2_page_mkwrite(inode, di_bh, page);
+ ret = __ocfs2_page_mkwrite(vma->vm_file, di_bh, page);
up_write(&OCFS2_I(inode)->ip_alloc_sem);
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h
index c67003b6b5a2..65739b3b3276 100644
--- a/fs/ocfs2/ocfs2.h
+++ b/fs/ocfs2/ocfs2.h
@@ -150,26 +150,33 @@ typedef void (*ocfs2_lock_callback)(int status, unsigned long data);
struct ocfs2_lock_res {
void *l_priv;
struct ocfs2_lock_res_ops *l_ops;
- spinlock_t l_lock;
+
struct list_head l_blocked_list;
struct list_head l_mask_waiters;
- enum ocfs2_lock_type l_type;
unsigned long l_flags;
char l_name[OCFS2_LOCK_ID_MAX_LEN];
- int l_level;
unsigned int l_ro_holders;
unsigned int l_ex_holders;
- struct ocfs2_dlm_lksb l_lksb;
+ unsigned char l_level;
+
+ /* Data packed - type enum ocfs2_lock_type */
+ unsigned char l_type;
/* used from AST/BAST funcs. */
- enum ocfs2_ast_action l_action;
- enum ocfs2_unlock_action l_unlock_action;
- int l_requested;
- int l_blocking;
+ /* Data packed - enum type ocfs2_ast_action */
+ unsigned char l_action;
+ /* Data packed - enum type ocfs2_unlock_action */
+ unsigned char l_unlock_action;
+ unsigned char l_requested;
+ unsigned char l_blocking;
unsigned int l_pending_gen;
+ spinlock_t l_lock;
+
+ struct ocfs2_dlm_lksb l_lksb;
+
wait_queue_head_t l_event;
struct list_head l_debug_list;
diff --git a/fs/ocfs2/ocfs2_ioctl.h b/fs/ocfs2/ocfs2_ioctl.h
index 2d3420af1a83..9bc535499868 100644
--- a/fs/ocfs2/ocfs2_ioctl.h
+++ b/fs/ocfs2/ocfs2_ioctl.h
@@ -76,4 +76,99 @@ struct reflink_arguments {
};
#define OCFS2_IOC_REFLINK _IOW('o', 4, struct reflink_arguments)
+/* Following definitions dedicated for ocfs2_info_request ioctls. */
+#define OCFS2_INFO_MAX_REQUEST (50)
+#define OCFS2_TEXT_UUID_LEN (OCFS2_VOL_UUID_LEN * 2)
+
+/* Magic number of all requests */
+#define OCFS2_INFO_MAGIC (0x4F32494E)
+
+/*
+ * Always try to separate info request into small pieces to
+ * guarantee the backward&forward compatibility.
+ */
+struct ocfs2_info {
+ __u64 oi_requests; /* Array of __u64 pointers to requests */
+ __u32 oi_count; /* Number of requests in info_requests */
+ __u32 oi_pad;
+};
+
+struct ocfs2_info_request {
+/*00*/ __u32 ir_magic; /* Magic number */
+ __u32 ir_code; /* Info request code */
+ __u32 ir_size; /* Size of request */
+ __u32 ir_flags; /* Request flags */
+/*10*/ /* Request specific fields */
+};
+
+struct ocfs2_info_clustersize {
+ struct ocfs2_info_request ic_req;
+ __u32 ic_clustersize;
+ __u32 ic_pad;
+};
+
+struct ocfs2_info_blocksize {
+ struct ocfs2_info_request ib_req;
+ __u32 ib_blocksize;
+ __u32 ib_pad;
+};
+
+struct ocfs2_info_maxslots {
+ struct ocfs2_info_request im_req;
+ __u32 im_max_slots;
+ __u32 im_pad;
+};
+
+struct ocfs2_info_label {
+ struct ocfs2_info_request il_req;
+ __u8 il_label[OCFS2_MAX_VOL_LABEL_LEN];
+} __attribute__ ((packed));
+
+struct ocfs2_info_uuid {
+ struct ocfs2_info_request iu_req;
+ __u8 iu_uuid_str[OCFS2_TEXT_UUID_LEN + 1];
+} __attribute__ ((packed));
+
+struct ocfs2_info_fs_features {
+ struct ocfs2_info_request if_req;
+ __u32 if_compat_features;
+ __u32 if_incompat_features;
+ __u32 if_ro_compat_features;
+ __u32 if_pad;
+};
+
+struct ocfs2_info_journal_size {
+ struct ocfs2_info_request ij_req;
+ __u64 ij_journal_size;
+};
+
+/* Codes for ocfs2_info_request */
+enum ocfs2_info_type {
+ OCFS2_INFO_CLUSTERSIZE = 1,
+ OCFS2_INFO_BLOCKSIZE,
+ OCFS2_INFO_MAXSLOTS,
+ OCFS2_INFO_LABEL,
+ OCFS2_INFO_UUID,
+ OCFS2_INFO_FS_FEATURES,
+ OCFS2_INFO_JOURNAL_SIZE,
+ OCFS2_INFO_NUM_TYPES
+};
+
+/* Flags for struct ocfs2_info_request */
+/* Filled by the caller */
+#define OCFS2_INFO_FL_NON_COHERENT (0x00000001) /* Cluster coherency not
+ required. This is a hint.
+ It is up to ocfs2 whether
+ the request can be fulfilled
+ without locking. */
+/* Filled by ocfs2 */
+#define OCFS2_INFO_FL_FILLED (0x40000000) /* Filesystem understood
+ this request and
+ filled in the answer */
+
+#define OCFS2_INFO_FL_ERROR (0x80000000) /* Error happened during
+ request handling. */
+
+#define OCFS2_IOC_INFO _IOR('o', 5, struct ocfs2_info)
+
#endif /* OCFS2_IOCTL_H */
diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c
index 73a11ccfd4c2..7f13d2059b44 100644
--- a/fs/ocfs2/refcounttree.c
+++ b/fs/ocfs2/refcounttree.c
@@ -49,6 +49,7 @@
struct ocfs2_cow_context {
struct inode *inode;
+ struct file *file;
u32 cow_start;
u32 cow_len;
struct ocfs2_extent_tree data_et;
@@ -2932,13 +2933,16 @@ static int ocfs2_duplicate_clusters_by_page(handle_t *handle,
u64 new_block = ocfs2_clusters_to_blocks(sb, new_cluster);
struct page *page;
pgoff_t page_index;
- unsigned int from, to;
+ unsigned int from, to, readahead_pages;
loff_t offset, end, map_end;
struct address_space *mapping = context->inode->i_mapping;
mlog(0, "old_cluster %u, new %u, len %u at offset %u\n", old_cluster,
new_cluster, new_len, cpos);
+ readahead_pages =
+ (ocfs2_cow_contig_clusters(sb) <<
+ OCFS2_SB(sb)->s_clustersize_bits) >> PAGE_CACHE_SHIFT;
offset = ((loff_t)cpos) << OCFS2_SB(sb)->s_clustersize_bits;
end = offset + (new_len << OCFS2_SB(sb)->s_clustersize_bits);
/*
@@ -2969,6 +2973,14 @@ static int ocfs2_duplicate_clusters_by_page(handle_t *handle,
if (PAGE_CACHE_SIZE <= OCFS2_SB(sb)->s_clustersize)
BUG_ON(PageDirty(page));
+ if (PageReadahead(page) && context->file) {
+ page_cache_async_readahead(mapping,
+ &context->file->f_ra,
+ context->file,
+ page, page_index,
+ readahead_pages);
+ }
+
if (!PageUptodate(page)) {
ret = block_read_full_page(page, ocfs2_get_block);
if (ret) {
@@ -3408,12 +3420,35 @@ static int ocfs2_replace_cow(struct ocfs2_cow_context *context)
return ret;
}
+static void ocfs2_readahead_for_cow(struct inode *inode,
+ struct file *file,
+ u32 start, u32 len)
+{
+ struct address_space *mapping;
+ pgoff_t index;
+ unsigned long num_pages;
+ int cs_bits = OCFS2_SB(inode->i_sb)->s_clustersize_bits;
+
+ if (!file)
+ return;
+
+ mapping = file->f_mapping;
+ num_pages = (len << cs_bits) >> PAGE_CACHE_SHIFT;
+ if (!num_pages)
+ num_pages = 1;
+
+ index = ((loff_t)start << cs_bits) >> PAGE_CACHE_SHIFT;
+ page_cache_sync_readahead(mapping, &file->f_ra, file,
+ index, num_pages);
+}
+
/*
* Starting at cpos, try to CoW write_len clusters. Don't CoW
* past max_cpos. This will stop when it runs into a hole or an
* unrefcounted extent.
*/
static int ocfs2_refcount_cow_hunk(struct inode *inode,
+ struct file *file,
struct buffer_head *di_bh,
u32 cpos, u32 write_len, u32 max_cpos)
{
@@ -3442,6 +3477,8 @@ static int ocfs2_refcount_cow_hunk(struct inode *inode,
BUG_ON(cow_len == 0);
+ ocfs2_readahead_for_cow(inode, file, cow_start, cow_len);
+
context = kzalloc(sizeof(struct ocfs2_cow_context), GFP_NOFS);
if (!context) {
ret = -ENOMEM;
@@ -3463,6 +3500,7 @@ static int ocfs2_refcount_cow_hunk(struct inode *inode,
context->ref_root_bh = ref_root_bh;
context->cow_duplicate_clusters = ocfs2_duplicate_clusters_by_page;
context->get_clusters = ocfs2_di_get_clusters;
+ context->file = file;
ocfs2_init_dinode_extent_tree(&context->data_et,
INODE_CACHE(inode), di_bh);
@@ -3491,6 +3529,7 @@ out:
* clusters between cpos and cpos+write_len are safe to modify.
*/
int ocfs2_refcount_cow(struct inode *inode,
+ struct file *file,
struct buffer_head *di_bh,
u32 cpos, u32 write_len, u32 max_cpos)
{
@@ -3510,7 +3549,7 @@ int ocfs2_refcount_cow(struct inode *inode,
num_clusters = write_len;
if (ext_flags & OCFS2_EXT_REFCOUNTED) {
- ret = ocfs2_refcount_cow_hunk(inode, di_bh, cpos,
+ ret = ocfs2_refcount_cow_hunk(inode, file, di_bh, cpos,
num_clusters, max_cpos);
if (ret) {
mlog_errno(ret);
diff --git a/fs/ocfs2/refcounttree.h b/fs/ocfs2/refcounttree.h
index 9983ba1570e2..c8ce46f7d8e3 100644
--- a/fs/ocfs2/refcounttree.h
+++ b/fs/ocfs2/refcounttree.h
@@ -21,14 +21,14 @@ struct ocfs2_refcount_tree {
struct rb_node rf_node;
u64 rf_blkno;
u32 rf_generation;
+ struct kref rf_getcnt;
struct rw_semaphore rf_sem;
struct ocfs2_lock_res rf_lockres;
- struct kref rf_getcnt;
int rf_removed;
/* the following 4 fields are used by caching_info. */
- struct ocfs2_caching_info rf_ci;
spinlock_t rf_lock;
+ struct ocfs2_caching_info rf_ci;
struct mutex rf_io_mutex;
struct super_block *rf_sb;
};
@@ -52,7 +52,8 @@ int ocfs2_prepare_refcount_change_for_del(struct inode *inode,
u32 clusters,
int *credits,
int *ref_blocks);
-int ocfs2_refcount_cow(struct inode *inode, struct buffer_head *di_bh,
+int ocfs2_refcount_cow(struct inode *inode,
+ struct file *filep, struct buffer_head *di_bh,
u32 cpos, u32 write_len, u32 max_cpos);
typedef int (ocfs2_post_refcount_func)(struct inode *inode,
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
index fa1be1b304d1..47415398d56a 100644
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -1990,6 +1990,36 @@ static int ocfs2_setup_osb_uuid(struct ocfs2_super *osb, const unsigned char *uu
return 0;
}
+/* Make sure entire volume is addressable by our journal. Requires
+ osb_clusters_at_boot to be valid and for the journal to have been
+ initialized by ocfs2_journal_init(). */
+static int ocfs2_journal_addressable(struct ocfs2_super *osb)
+{
+ int status = 0;
+ u64 max_block =
+ ocfs2_clusters_to_blocks(osb->sb,
+ osb->osb_clusters_at_boot) - 1;
+
+ /* 32-bit block number is always OK. */
+ if (max_block <= (u32)~0ULL)
+ goto out;
+
+ /* Volume is "huge", so see if our journal is new enough to
+ support it. */
+ if (!(OCFS2_HAS_COMPAT_FEATURE(osb->sb,
+ OCFS2_FEATURE_COMPAT_JBD2_SB) &&
+ jbd2_journal_check_used_features(osb->journal->j_journal, 0, 0,
+ JBD2_FEATURE_INCOMPAT_64BIT))) {
+ mlog(ML_ERROR, "The journal cannot address the entire volume. "
+ "Enable the 'block64' journal option with tunefs.ocfs2");
+ status = -EFBIG;
+ goto out;
+ }
+
+ out:
+ return status;
+}
+
static int ocfs2_initialize_super(struct super_block *sb,
struct buffer_head *bh,
int sector_size,
@@ -2002,6 +2032,7 @@ static int ocfs2_initialize_super(struct super_block *sb,
struct ocfs2_journal *journal;
__le32 uuid_net_key;
struct ocfs2_super *osb;
+ u64 total_blocks;
mlog_entry_void();
@@ -2214,11 +2245,15 @@ static int ocfs2_initialize_super(struct super_block *sb,
goto bail;
}
- if (ocfs2_clusters_to_blocks(osb->sb, le32_to_cpu(di->i_clusters) - 1)
- > (u32)~0UL) {
- mlog(ML_ERROR, "Volume might try to write to blocks beyond "
- "what jbd can address in 32 bits.\n");
- status = -EINVAL;
+ total_blocks = ocfs2_clusters_to_blocks(osb->sb,
+ le32_to_cpu(di->i_clusters));
+
+ status = generic_check_addressable(osb->sb->s_blocksize_bits,
+ total_blocks);
+ if (status) {
+ mlog(ML_ERROR, "Volume too large "
+ "to mount safely on this system");
+ status = -EFBIG;
goto bail;
}
@@ -2380,6 +2415,12 @@ static int ocfs2_check_volume(struct ocfs2_super *osb)
goto finally;
}
+ /* Now that journal has been initialized, check to make sure
+ entire volume is addressable. */
+ status = ocfs2_journal_addressable(osb);
+ if (status)
+ goto finally;
+
/* If the journal was unmounted cleanly then we don't want to
* recover anything. Otherwise, journal_load will do that
* dirty work for us :) */
diff --git a/fs/quota/Kconfig b/fs/quota/Kconfig
index 3e21b1e2ad3a..880fd9884366 100644
--- a/fs/quota/Kconfig
+++ b/fs/quota/Kconfig
@@ -4,6 +4,7 @@
config QUOTA
bool "Quota support"
+ select QUOTACTL
help
If you say Y here, you will be able to set per user limits for disk
usage (also called disk quotas). Currently, it works for the
@@ -65,8 +66,7 @@ config QFMT_V2
config QUOTACTL
bool
- depends on XFS_QUOTA || QUOTA
- default y
+ default n
config QUOTACTL_COMPAT
bool
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c
index ae35413dcbe1..caa758377d66 100644
--- a/fs/reiserfs/inode.c
+++ b/fs/reiserfs/inode.c
@@ -83,6 +83,7 @@ void reiserfs_evict_inode(struct inode *inode)
dquot_drop(inode);
inode->i_blocks = 0;
reiserfs_write_unlock_once(inode->i_sb, depth);
+ return;
no_delete:
end_writeback(inode);
diff --git a/fs/xfs/Kconfig b/fs/xfs/Kconfig
index 480f28127f09..6100ec0fa1d4 100644
--- a/fs/xfs/Kconfig
+++ b/fs/xfs/Kconfig
@@ -22,6 +22,7 @@ config XFS_FS
config XFS_QUOTA
bool "XFS Quota support"
depends on XFS_FS
+ select QUOTACTL
help
If you say Y here, you will be able to set limits for disk usage on
a per user and/or a per group basis under XFS. XFS considers quota
diff --git a/include/linux/Kbuild b/include/linux/Kbuild
index 626b629429ff..e83d3c571e3a 100644
--- a/include/linux/Kbuild
+++ b/include/linux/Kbuild
@@ -190,6 +190,7 @@ header-y += in_route.h
header-y += inet_diag.h
header-y += inotify.h
header-y += input.h
+header-y += ioq.h
header-y += ioctl.h
header-y += ip.h
header-y += ip6_tunnel.h
@@ -324,6 +325,7 @@ header-y += serial_core.h
header-y += serial_reg.h
header-y += serio.h
header-y += shm.h
+header-y += shm_signal.h
header-y += signal.h
header-y += signalfd.h
header-y += smb.h
@@ -370,6 +372,8 @@ header-y += utime.h
header-y += utsname.h
header-y += veth.h
header-y += vhost.h
+header-y += vbus_pci.h
+header-y += venet.h
header-y += videodev.h
header-y += videodev2.h
header-y += videotext.h
diff --git a/include/linux/amba/clcd.h b/include/linux/amba/clcd.h
index ca16c3801a1e..be33b3affc8a 100644
--- a/include/linux/amba/clcd.h
+++ b/include/linux/amba/clcd.h
@@ -150,6 +150,7 @@ struct clcd_fb {
u16 off_cntl;
u32 clcd_cntl;
u32 cmap[16];
+ bool clk_enabled;
};
static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs)
diff --git a/include/linux/amba/pl08x.h b/include/linux/amba/pl08x.h
new file mode 100644
index 000000000000..8435f4a1a709
--- /dev/null
+++ b/include/linux/amba/pl08x.h
@@ -0,0 +1,184 @@
+/*
+ * linux/amba/pl08x.h - ARM PrimeCell DMA Controller driver
+ *
+ * Copyright (C) 2005 ARM Ltd
+ * Copyright (C) 2010 ST-Ericsson SA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * pl08x information required by platform code
+ *
+ * Please credit ARM.com
+ * Documentation: ARM DDI 0196D
+ *
+ */
+
+#ifndef AMBA_PL08X_H
+#define AMBA_PL08X_H
+
+/* We need sizes of structs from this header */
+#include <linux/dmaengine.h>
+
+/**
+ * struct pl08x_channel_data - data structure to pass info between
+ * platform and PL08x driver regarding channel configuration
+ * @bus_id: name of this device channel, not just a device name since
+ * devices may have more than one channel e.g. "foo_tx"
+ * @min_signal: the minimum DMA signal number to be muxed in for this
+ * channel (for platforms supporting muxed signals). If you have
+ * static assignments, make sure this is set to the assigned signal
+ * number, PL08x have 16 possible signals in number 0 thru 15 so
+ * when these are not enough they often get muxed (in hardware)
+ * disabling simultaneous use of the same channel for two devices.
+ * @max_signal: the maximum DMA signal number to be muxed in for
+ * the channel. Set to the same as min_signal for
+ * devices with static assignments
+ * @muxval: a number usually used to poke into some mux regiser to
+ * mux in the signal to this channel
+ * @cctl_opt: default options for the channel control register
+ * @addr: source/target address in physical memory for this DMA channel,
+ * can be the address of a FIFO register for burst requests for example.
+ * This can be left undefined if the PrimeCell API is used for configuring
+ * this.
+ * @circular_buffer: whether the buffer passed in is circular and
+ * shall simply be looped round round (like a record baby round
+ * round round round)
+ * @single: the device connected to this channel will request single
+ * DMA transfers, not bursts. (Bursts are default.)
+ */
+struct pl08x_channel_data {
+ char *bus_id;
+ int min_signal;
+ int max_signal;
+ u32 muxval;
+ u32 cctl;
+ u32 ccfg;
+ dma_addr_t addr;
+ bool circular_buffer;
+ bool single;
+};
+
+/**
+ * Struct pl08x_bus_data - information of source or destination
+ * busses for a transfer
+ * @addr: current address
+ * @maxwidth: the maximum width of a transfer on this bus
+ * @buswidth: the width of this bus in bytes: 1, 2 or 4
+ * @fill_bytes: bytes required to fill to the next bus memory
+ * boundary
+ */
+struct pl08x_bus_data {
+ dma_addr_t addr;
+ u8 maxwidth;
+ u8 buswidth;
+ u32 fill_bytes;
+};
+
+/**
+ * struct pl08x_phy_chan - holder for the physical channels
+ * @id: physical index to this channel
+ * @lock: a lock to use when altering an instance of this struct
+ * @signal: the physical signal (aka channel) serving this
+ * physical channel right now
+ * @serving: the virtual channel currently being served by this
+ * physical channel
+ */
+struct pl08x_phy_chan {
+ unsigned int id;
+ void __iomem *base;
+ spinlock_t lock;
+ int signal;
+ struct pl08x_dma_chan *serving;
+ u32 csrc;
+ u32 cdst;
+ u32 clli;
+ u32 cctl;
+ u32 ccfg;
+};
+
+/**
+ * struct pl08x_txd - wrapper for struct dma_async_tx_descriptor
+ * @llis_bus: DMA memory address (physical) start for the LLIs
+ * @llis_va: virtual memory address start for the LLIs
+ */
+struct pl08x_txd {
+ struct dma_async_tx_descriptor tx;
+ struct list_head node;
+ enum dma_data_direction direction;
+ struct pl08x_bus_data srcbus;
+ struct pl08x_bus_data dstbus;
+ int len;
+ dma_addr_t llis_bus;
+ void *llis_va;
+ struct pl08x_channel_data *cd;
+ bool active;
+ /* Settings to be put into the physical channel when we submit this txd */
+ u32 csrc;
+ u32 cdst;
+ u32 clli;
+ u32 cctl;
+};
+
+/**
+ * struct pl08x_dma_chan - this structure wraps a DMA ENGINE channel
+ * @chan: wrappped abstract channel
+ * @phychan: the physical channel utilized by this channel, if there is one
+ * @tasklet: tasklet scheduled by the IRQ to handle actual work etc
+ * @name: name of channel
+ * @cd: channel platform data
+ * @runtime_addr: address for RX/TX according to the runtime config
+ * @runtime_direction: current direction of this channel according to
+ * runtime config
+ * @lc: last completed transaction on this channel
+ * @desc_list: queued transactions pending on this channel
+ * @at: active transaction on this channel
+ * @lock: a lock for this channel data
+ * @host: a pointer to the host (internal use)
+ * @paused: whether the channel is paused
+ */
+struct pl08x_dma_chan {
+ struct dma_chan chan;
+ struct pl08x_phy_chan *phychan;
+ struct tasklet_struct tasklet;
+ char *name;
+ struct pl08x_channel_data *cd;
+ dma_addr_t runtime_addr;
+ enum dma_data_direction runtime_direction;
+ atomic_t last_issued;
+ dma_cookie_t lc;
+ struct list_head desc_list;
+ struct pl08x_txd *at;
+ spinlock_t lock;
+ void *host;
+ bool paused;
+};
+
+/**
+ * struct pl08x_platform_data - the platform configuration for the
+ * PL08x PrimeCells.
+ * @slave_channels: the channels defined for the different devices on the
+ * platform, all inclusive, including multiplexed channels. The available
+ * physical channels will be multiplexed around these signals as they
+ * are requested, just enumerate all possible channels.
+ * @get_signal: request a physical signal to be used for a DMA
+ * transfer immediately: if there is some multiplexing or similar blocking
+ * the use of the channel the transfer can be denied by returning
+ * less than zero, else it returns the allocated signal number
+ * @put_signal: indicate to the platform that this physical signal is not
+ * running any DMA transfer and multiplexing can be recycled
+ * @bus_bit_lli: Bit[0] of the address indicated which AHB bus master the
+ * LLI addresses are on 0/1 Master 1/2.
+ */
+struct pl08x_platform_data {
+ struct pl08x_channel_data *slave_channels;
+ unsigned int num_slave_channels;
+ struct pl08x_channel_data memcpy_channel;
+ int (*get_signal)(struct pl08x_dma_chan *);
+ void (*put_signal)(struct pl08x_dma_chan *);
+};
+
+bool pl08x_filter_id(struct dma_chan *chan, void *chan_id);
+
+#endif /* AMBA_PL08X_H */
diff --git a/fs/ceph/auth.h b/include/linux/ceph/auth.h
index d38a2fb4a137..7fff521d7eb5 100644
--- a/fs/ceph/auth.h
+++ b/include/linux/ceph/auth.h
@@ -1,8 +1,8 @@
#ifndef _FS_CEPH_AUTH_H
#define _FS_CEPH_AUTH_H
-#include "types.h"
-#include "buffer.h"
+#include <linux/ceph/types.h>
+#include <linux/ceph/buffer.h>
/*
* Abstract interface for communicating with the authenticate module.
diff --git a/fs/ceph/buffer.h b/include/linux/ceph/buffer.h
index 58d19014068f..58d19014068f 100644
--- a/fs/ceph/buffer.h
+++ b/include/linux/ceph/buffer.h
diff --git a/fs/ceph/ceph_debug.h b/include/linux/ceph/ceph_debug.h
index 1818c2305610..547c815a0ddc 100644
--- a/fs/ceph/ceph_debug.h
+++ b/include/linux/ceph/ceph_debug.h
@@ -3,7 +3,7 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-#ifdef CONFIG_CEPH_FS_PRETTYDEBUG
+#ifdef CONFIG_CEPH_LIB_PRETTYDEBUG
/*
* wrap pr_debug to include a filename:lineno prefix on each line.
diff --git a/fs/ceph/ceph_frag.h b/include/linux/ceph/ceph_frag.h
index 5babb8e95352..5babb8e95352 100644
--- a/fs/ceph/ceph_frag.h
+++ b/include/linux/ceph/ceph_frag.h
diff --git a/fs/ceph/ceph_fs.h b/include/linux/ceph/ceph_fs.h
index d5619ac86711..d5619ac86711 100644
--- a/fs/ceph/ceph_fs.h
+++ b/include/linux/ceph/ceph_fs.h
diff --git a/fs/ceph/ceph_hash.h b/include/linux/ceph/ceph_hash.h
index d099c3f90236..d099c3f90236 100644
--- a/fs/ceph/ceph_hash.h
+++ b/include/linux/ceph/ceph_hash.h
diff --git a/fs/ceph/crush/crush.h b/include/linux/ceph/crush/crush.h
index 97e435b191f4..97e435b191f4 100644
--- a/fs/ceph/crush/crush.h
+++ b/include/linux/ceph/crush/crush.h
diff --git a/fs/ceph/crush/hash.h b/include/linux/ceph/crush/hash.h
index 91e884230d5d..91e884230d5d 100644
--- a/fs/ceph/crush/hash.h
+++ b/include/linux/ceph/crush/hash.h
diff --git a/fs/ceph/crush/mapper.h b/include/linux/ceph/crush/mapper.h
index c46b99c18bb0..c46b99c18bb0 100644
--- a/fs/ceph/crush/mapper.h
+++ b/include/linux/ceph/crush/mapper.h
diff --git a/include/linux/ceph/debugfs.h b/include/linux/ceph/debugfs.h
new file mode 100644
index 000000000000..2a79702e092b
--- /dev/null
+++ b/include/linux/ceph/debugfs.h
@@ -0,0 +1,33 @@
+#ifndef _FS_CEPH_DEBUGFS_H
+#define _FS_CEPH_DEBUGFS_H
+
+#include "ceph_debug.h"
+#include "types.h"
+
+#define CEPH_DEFINE_SHOW_FUNC(name) \
+static int name##_open(struct inode *inode, struct file *file) \
+{ \
+ struct seq_file *sf; \
+ int ret; \
+ \
+ ret = single_open(file, name, NULL); \
+ sf = file->private_data; \
+ sf->private = inode->i_private; \
+ return ret; \
+} \
+ \
+static const struct file_operations name##_fops = { \
+ .open = name##_open, \
+ .read = seq_read, \
+ .llseek = seq_lseek, \
+ .release = single_release, \
+};
+
+/* debugfs.c */
+extern int ceph_debugfs_init(void);
+extern void ceph_debugfs_cleanup(void);
+extern int ceph_debugfs_client_init(struct ceph_client *client);
+extern void ceph_debugfs_client_cleanup(struct ceph_client *client);
+
+#endif
+
diff --git a/fs/ceph/decode.h b/include/linux/ceph/decode.h
index 3d25415afe63..c5b6939fb32a 100644
--- a/fs/ceph/decode.h
+++ b/include/linux/ceph/decode.h
@@ -191,6 +191,11 @@ static inline void ceph_encode_string(void **p, void *end,
ceph_encode_need(p, end, n, bad); \
ceph_encode_copy(p, pv, n); \
} while (0)
+#define ceph_encode_string_safe(p, end, s, n, bad) \
+ do { \
+ ceph_encode_need(p, end, n, bad); \
+ ceph_encode_string(p, end, s, n); \
+ } while (0)
#endif
diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h
new file mode 100644
index 000000000000..f22b2e941686
--- /dev/null
+++ b/include/linux/ceph/libceph.h
@@ -0,0 +1,249 @@
+#ifndef _FS_CEPH_LIBCEPH_H
+#define _FS_CEPH_LIBCEPH_H
+
+#include "ceph_debug.h"
+
+#include <asm/unaligned.h>
+#include <linux/backing-dev.h>
+#include <linux/completion.h>
+#include <linux/exportfs.h>
+#include <linux/fs.h>
+#include <linux/mempool.h>
+#include <linux/pagemap.h>
+#include <linux/wait.h>
+#include <linux/writeback.h>
+#include <linux/slab.h>
+
+#include "types.h"
+#include "messenger.h"
+#include "msgpool.h"
+#include "mon_client.h"
+#include "osd_client.h"
+#include "ceph_fs.h"
+
+/*
+ * Supported features
+ */
+#define CEPH_FEATURE_SUPPORTED_DEFAULT CEPH_FEATURE_NOSRCADDR
+#define CEPH_FEATURE_REQUIRED_DEFAULT CEPH_FEATURE_NOSRCADDR
+
+/*
+ * mount options
+ */
+#define CEPH_OPT_FSID (1<<0)
+#define CEPH_OPT_NOSHARE (1<<1) /* don't share client with other sbs */
+#define CEPH_OPT_MYIP (1<<2) /* specified my ip */
+#define CEPH_OPT_NOCRC (1<<3) /* no data crc on writes */
+
+#define CEPH_OPT_DEFAULT (0);
+
+#define ceph_set_opt(client, opt) \
+ (client)->options->flags |= CEPH_OPT_##opt;
+#define ceph_test_opt(client, opt) \
+ (!!((client)->options->flags & CEPH_OPT_##opt))
+
+struct ceph_options {
+ int flags;
+ struct ceph_fsid fsid;
+ struct ceph_entity_addr my_addr;
+ int mount_timeout;
+ int osd_idle_ttl;
+ int osd_timeout;
+ int osd_keepalive_timeout;
+
+ /*
+ * any type that can't be simply compared or doesn't need need
+ * to be compared should go beyond this point,
+ * ceph_compare_options() should be updated accordingly
+ */
+
+ struct ceph_entity_addr *mon_addr; /* should be the first
+ pointer type of args */
+ int num_mon;
+ char *name;
+ char *secret;
+};
+
+/*
+ * defaults
+ */
+#define CEPH_MOUNT_TIMEOUT_DEFAULT 60
+#define CEPH_OSD_TIMEOUT_DEFAULT 60 /* seconds */
+#define CEPH_OSD_KEEPALIVE_DEFAULT 5
+#define CEPH_OSD_IDLE_TTL_DEFAULT 60
+#define CEPH_MOUNT_RSIZE_DEFAULT (512*1024) /* readahead */
+
+#define CEPH_MSG_MAX_FRONT_LEN (16*1024*1024)
+#define CEPH_MSG_MAX_DATA_LEN (16*1024*1024)
+
+#define CEPH_AUTH_NAME_DEFAULT "guest"
+
+/*
+ * Delay telling the MDS we no longer want caps, in case we reopen
+ * the file. Delay a minimum amount of time, even if we send a cap
+ * message for some other reason. Otherwise, take the oppotunity to
+ * update the mds to avoid sending another message later.
+ */
+#define CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT 5 /* cap release delay */
+#define CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT 60 /* cap release delay */
+
+#define CEPH_CAP_RELEASE_SAFETY_DEFAULT (CEPH_CAPS_PER_RELEASE * 4)
+
+/* mount state */
+enum {
+ CEPH_MOUNT_MOUNTING,
+ CEPH_MOUNT_MOUNTED,
+ CEPH_MOUNT_UNMOUNTING,
+ CEPH_MOUNT_UNMOUNTED,
+ CEPH_MOUNT_SHUTDOWN,
+};
+
+/*
+ * subtract jiffies
+ */
+static inline unsigned long time_sub(unsigned long a, unsigned long b)
+{
+ BUG_ON(time_after(b, a));
+ return (long)a - (long)b;
+}
+
+struct ceph_mds_client;
+
+/*
+ * per client state
+ *
+ * possibly shared by multiple mount points, if they are
+ * mounting the same ceph filesystem/cluster.
+ */
+struct ceph_client {
+ struct ceph_fsid fsid;
+ bool have_fsid;
+
+ void *private;
+
+ struct ceph_options *options;
+
+ struct mutex mount_mutex; /* serialize mount attempts */
+ wait_queue_head_t auth_wq;
+ int auth_err;
+
+ int (*extra_mon_dispatch)(struct ceph_client *, struct ceph_msg *);
+
+ u32 supported_features;
+ u32 required_features;
+
+ struct ceph_messenger *msgr; /* messenger instance */
+ struct ceph_mon_client monc;
+ struct ceph_osd_client osdc;
+
+#ifdef CONFIG_DEBUG_FS
+ struct dentry *debugfs_dir;
+ struct dentry *debugfs_monmap;
+ struct dentry *debugfs_osdmap;
+#endif
+};
+
+
+
+/*
+ * snapshots
+ */
+
+/*
+ * A "snap context" is the set of existing snapshots when we
+ * write data. It is used by the OSD to guide its COW behavior.
+ *
+ * The ceph_snap_context is refcounted, and attached to each dirty
+ * page, indicating which context the dirty data belonged when it was
+ * dirtied.
+ */
+struct ceph_snap_context {
+ atomic_t nref;
+ u64 seq;
+ int num_snaps;
+ u64 snaps[];
+};
+
+static inline struct ceph_snap_context *
+ceph_get_snap_context(struct ceph_snap_context *sc)
+{
+ /*
+ printk("get_snap_context %p %d -> %d\n", sc, atomic_read(&sc->nref),
+ atomic_read(&sc->nref)+1);
+ */
+ if (sc)
+ atomic_inc(&sc->nref);
+ return sc;
+}
+
+static inline void ceph_put_snap_context(struct ceph_snap_context *sc)
+{
+ if (!sc)
+ return;
+ /*
+ printk("put_snap_context %p %d -> %d\n", sc, atomic_read(&sc->nref),
+ atomic_read(&sc->nref)-1);
+ */
+ if (atomic_dec_and_test(&sc->nref)) {
+ /*printk(" deleting snap_context %p\n", sc);*/
+ kfree(sc);
+ }
+}
+
+/*
+ * calculate the number of pages a given length and offset map onto,
+ * if we align the data.
+ */
+static inline int calc_pages_for(u64 off, u64 len)
+{
+ return ((off+len+PAGE_CACHE_SIZE-1) >> PAGE_CACHE_SHIFT) -
+ (off >> PAGE_CACHE_SHIFT);
+}
+
+/* ceph_common.c */
+extern const char *ceph_msg_type_name(int type);
+extern int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid);
+extern struct kmem_cache *ceph_inode_cachep;
+extern struct kmem_cache *ceph_cap_cachep;
+extern struct kmem_cache *ceph_dentry_cachep;
+extern struct kmem_cache *ceph_file_cachep;
+
+extern int ceph_parse_options(struct ceph_options **popt, char *options,
+ const char *dev_name, const char *dev_name_end,
+ int (*parse_extra_token)(char *c, void *private),
+ void *private);
+extern void ceph_destroy_options(struct ceph_options *opt);
+extern int ceph_compare_options(struct ceph_options *new_opt,
+ struct ceph_client *client);
+extern struct ceph_client *ceph_create_client(struct ceph_options *opt,
+ void *private);
+extern u64 ceph_client_id(struct ceph_client *client);
+extern void ceph_destroy_client(struct ceph_client *client);
+extern int __ceph_open_session(struct ceph_client *client,
+ unsigned long started);
+extern int ceph_open_session(struct ceph_client *client);
+
+/* pagevec.c */
+extern void ceph_release_page_vector(struct page **pages, int num_pages);
+
+extern struct page **ceph_get_direct_page_vector(const char __user *data,
+ int num_pages,
+ loff_t off, size_t len);
+extern void ceph_put_page_vector(struct page **pages, int num_pages);
+extern void ceph_release_page_vector(struct page **pages, int num_pages);
+extern struct page **ceph_alloc_page_vector(int num_pages, gfp_t flags);
+extern int ceph_copy_user_to_page_vector(struct page **pages,
+ const char __user *data,
+ loff_t off, size_t len);
+extern int ceph_copy_to_page_vector(struct page **pages,
+ const char *data,
+ loff_t off, size_t len);
+extern int ceph_copy_from_page_vector(struct page **pages,
+ char *data,
+ loff_t off, size_t len);
+extern int ceph_copy_page_vector_to_user(struct page **pages, char __user *data,
+ loff_t off, size_t len);
+extern void ceph_zero_page_vector_range(int off, int len, struct page **pages);
+
+
+#endif /* _FS_CEPH_SUPER_H */
diff --git a/fs/ceph/mdsmap.h b/include/linux/ceph/mdsmap.h
index 4c5cb0880bba..4c5cb0880bba 100644
--- a/fs/ceph/mdsmap.h
+++ b/include/linux/ceph/mdsmap.h
diff --git a/fs/ceph/messenger.h b/include/linux/ceph/messenger.h
index 76fbc957bc13..5956d62c3057 100644
--- a/fs/ceph/messenger.h
+++ b/include/linux/ceph/messenger.h
@@ -65,6 +65,9 @@ struct ceph_messenger {
*/
u32 global_seq;
spinlock_t global_seq_lock;
+
+ u32 supported_features;
+ u32 required_features;
};
/*
@@ -82,6 +85,10 @@ struct ceph_msg {
struct ceph_pagelist *pagelist; /* instead of pages */
struct list_head list_head;
struct kref kref;
+ struct bio *bio; /* instead of pages/pagelist */
+ struct bio *bio_iter; /* bio iterator */
+ int bio_seg; /* current bio segment */
+ struct ceph_pagelist *trail; /* the trailing part of the data */
bool front_is_vmalloc;
bool more_to_follow;
bool needs_out_seq;
@@ -205,7 +212,7 @@ struct ceph_connection {
};
-extern const char *pr_addr(const struct sockaddr_storage *ss);
+extern const char *ceph_pr_addr(const struct sockaddr_storage *ss);
extern int ceph_parse_ips(const char *c, const char *end,
struct ceph_entity_addr *addr,
int max_count, int *count);
@@ -216,7 +223,8 @@ extern void ceph_msgr_exit(void);
extern void ceph_msgr_flush(void);
extern struct ceph_messenger *ceph_messenger_create(
- struct ceph_entity_addr *myaddr);
+ struct ceph_entity_addr *myaddr,
+ u32 features, u32 required);
extern void ceph_messenger_destroy(struct ceph_messenger *);
extern void ceph_con_init(struct ceph_messenger *msgr,
diff --git a/fs/ceph/mon_client.h b/include/linux/ceph/mon_client.h
index 8e396f2c0963..545f85917780 100644
--- a/fs/ceph/mon_client.h
+++ b/include/linux/ceph/mon_client.h
@@ -79,6 +79,7 @@ struct ceph_mon_client {
u64 last_tid;
/* mds/osd map */
+ int want_mdsmap;
int want_next_osdmap; /* 1 = want, 2 = want+asked */
u32 have_osdmap, have_mdsmap;
diff --git a/fs/ceph/msgpool.h b/include/linux/ceph/msgpool.h
index a362605f9368..a362605f9368 100644
--- a/fs/ceph/msgpool.h
+++ b/include/linux/ceph/msgpool.h
diff --git a/fs/ceph/msgr.h b/include/linux/ceph/msgr.h
index 680d3d648cac..680d3d648cac 100644
--- a/fs/ceph/msgr.h
+++ b/include/linux/ceph/msgr.h
diff --git a/fs/ceph/osd_client.h b/include/linux/ceph/osd_client.h
index ce776989ef6a..6c91fb032c39 100644
--- a/fs/ceph/osd_client.h
+++ b/include/linux/ceph/osd_client.h
@@ -15,6 +15,7 @@ struct ceph_snap_context;
struct ceph_osd_request;
struct ceph_osd_client;
struct ceph_authorizer;
+struct ceph_pagelist;
/*
* completion callback for async writepages
@@ -68,6 +69,7 @@ struct ceph_osd_request {
struct list_head r_unsafe_item;
struct inode *r_inode; /* for use by callbacks */
+ void *r_priv; /* ditto */
char r_oid[40]; /* object name */
int r_oid_len;
@@ -80,6 +82,11 @@ struct ceph_osd_request {
struct page **r_pages; /* pages for data payload */
int r_pages_from_pool;
int r_own_pages; /* if true, i own page list */
+#ifdef CONFIG_BLOCK
+ struct bio *r_bio; /* instead of pages */
+#endif
+
+ struct ceph_pagelist *r_trail; /* trailing part of the data */
};
struct ceph_osd_client {
@@ -110,6 +117,42 @@ struct ceph_osd_client {
struct ceph_msgpool msgpool_op_reply;
};
+struct ceph_osd_req_op {
+ u16 op; /* CEPH_OSD_OP_* */
+ u32 flags; /* CEPH_OSD_FLAG_* */
+ union {
+ struct {
+ u64 offset, length;
+ u64 truncate_size;
+ u32 truncate_seq;
+ } extent;
+ struct {
+ const char *name;
+ u32 name_len;
+ const char *val;
+ u32 value_len;
+ __u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */
+ __u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */
+ } xattr;
+ struct {
+ const char *class_name;
+ __u8 class_len;
+ const char *method_name;
+ __u8 method_len;
+ __u8 argc;
+ const char *indata;
+ u32 indata_len;
+ } cls;
+ struct {
+ u64 cookie, count;
+ } pgls;
+ struct {
+ u64 snapid;
+ } snap;
+ };
+ u32 payload_len;
+};
+
extern int ceph_osdc_init(struct ceph_osd_client *osdc,
struct ceph_client *client);
extern void ceph_osdc_stop(struct ceph_osd_client *osdc);
@@ -119,6 +162,30 @@ extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc,
extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc,
struct ceph_msg *msg);
+extern void ceph_calc_raw_layout(struct ceph_osd_client *osdc,
+ struct ceph_file_layout *layout,
+ u64 snapid,
+ u64 off, u64 *plen, u64 *bno,
+ struct ceph_osd_request *req,
+ struct ceph_osd_req_op *op);
+
+extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
+ int flags,
+ struct ceph_snap_context *snapc,
+ struct ceph_osd_req_op *ops,
+ bool use_mempool,
+ gfp_t gfp_flags,
+ struct page **pages,
+ struct bio *bio);
+
+extern void ceph_osdc_build_request(struct ceph_osd_request *req,
+ u64 off, u64 *plen,
+ struct ceph_osd_req_op *src_ops,
+ struct ceph_snap_context *snapc,
+ struct timespec *mtime,
+ const char *oid,
+ int oid_len);
+
extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *,
struct ceph_file_layout *layout,
struct ceph_vino vino,
diff --git a/fs/ceph/osdmap.h b/include/linux/ceph/osdmap.h
index 970b547e510d..a592b211be39 100644
--- a/fs/ceph/osdmap.h
+++ b/include/linux/ceph/osdmap.h
@@ -125,4 +125,6 @@ extern int ceph_calc_pg_acting(struct ceph_osdmap *osdmap, struct ceph_pg pgid,
extern int ceph_calc_pg_primary(struct ceph_osdmap *osdmap,
struct ceph_pg pgid);
+extern int ceph_pg_poolid_by_name(struct ceph_osdmap *map, const char *name);
+
#endif
diff --git a/fs/ceph/pagelist.h b/include/linux/ceph/pagelist.h
index e8a4187e1087..cc9327aa1c98 100644
--- a/fs/ceph/pagelist.h
+++ b/include/linux/ceph/pagelist.h
@@ -19,7 +19,7 @@ static inline void ceph_pagelist_init(struct ceph_pagelist *pl)
}
extern int ceph_pagelist_release(struct ceph_pagelist *pl);
-extern int ceph_pagelist_append(struct ceph_pagelist *pl, void *d, size_t l);
+extern int ceph_pagelist_append(struct ceph_pagelist *pl, const void *d, size_t l);
static inline int ceph_pagelist_encode_64(struct ceph_pagelist *pl, u64 v)
{
diff --git a/fs/ceph/rados.h b/include/linux/ceph/rados.h
index 6d5247f2e81b..6d5247f2e81b 100644
--- a/fs/ceph/rados.h
+++ b/include/linux/ceph/rados.h
diff --git a/fs/ceph/types.h b/include/linux/ceph/types.h
index 28b35a005ec2..28b35a005ec2 100644
--- a/fs/ceph/types.h
+++ b/include/linux/ceph/types.h
diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
index c61d4ca27bcc..e2106495cc11 100644
--- a/include/linux/dmaengine.h
+++ b/include/linux/dmaengine.h
@@ -548,7 +548,7 @@ static inline bool dma_dev_has_pq_continue(struct dma_device *dma)
return (dma->max_pq & DMA_HAS_PQ_CONTINUE) == DMA_HAS_PQ_CONTINUE;
}
-static unsigned short dma_dev_to_maxpq(struct dma_device *dma)
+static inline unsigned short dma_dev_to_maxpq(struct dma_device *dma)
{
return dma->max_pq & ~DMA_HAS_PQ_CONTINUE;
}
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 9a96b4d83fc1..9a8b4e9aeba8 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2381,6 +2381,8 @@ extern ssize_t simple_write_to_buffer(void *to, size_t available, loff_t *ppos,
extern int generic_file_fsync(struct file *, int);
+extern int generic_check_addressable(unsigned, u64);
+
#ifdef CONFIG_MIGRATION
extern int buffer_migrate_page(struct address_space *,
struct page *, struct page *);
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 42a0f1d11365..0a34fb071379 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -626,8 +626,8 @@ struct hid_driver {
int (*event)(struct hid_device *hdev, struct hid_field *field,
struct hid_usage *usage, __s32 value);
- void (*report_fixup)(struct hid_device *hdev, __u8 *buf,
- unsigned int size);
+ __u8 *(*report_fixup)(struct hid_device *hdev, __u8 *buf,
+ unsigned int *size);
int (*input_mapping)(struct hid_device *hdev,
struct hid_input *hidinput, struct hid_field *field,
diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h
index 6de90bfc6acd..4793d8a7f480 100644
--- a/include/linux/i2c/twl.h
+++ b/include/linux/i2c/twl.h
@@ -553,8 +553,12 @@ extern void twl4030_power_init(struct twl4030_power_data *triton2_scripts);
extern int twl4030_remove_script(u8 flags);
struct twl4030_codec_audio_data {
- unsigned int audio_mclk;
+ unsigned int audio_mclk; /* not used, will be removed */
+ unsigned int digimic_delay; /* in ms */
unsigned int ramp_delay_value;
+ unsigned int offset_cncl_path;
+ unsigned int check_defaults:1;
+ unsigned int reset_registers:1;
unsigned int hs_extmute:1;
void (*set_hs_extmute)(int mute);
};
diff --git a/include/linux/if_macvlan.h b/include/linux/if_macvlan.h
index 35280b302290..8a2fd66a8b5f 100644
--- a/include/linux/if_macvlan.h
+++ b/include/linux/if_macvlan.h
@@ -40,6 +40,12 @@ struct macvlan_rx_stats {
unsigned long rx_errors;
};
+/*
+ * Maximum times a macvtap device can be opened. This can be used to
+ * configure the number of receive queue, e.g. for multiqueue virtio.
+ */
+#define MAX_MACVTAP_QUEUES (NR_CPUS < 16 ? NR_CPUS : 16)
+
struct macvlan_dev {
struct net_device *dev;
struct list_head list;
@@ -50,7 +56,8 @@ struct macvlan_dev {
enum macvlan_mode mode;
int (*receive)(struct sk_buff *skb);
int (*forward)(struct net_device *dev, struct sk_buff *skb);
- struct macvtap_queue *tap;
+ struct macvtap_queue *taps[MAX_MACVTAP_QUEUES];
+ int numvtaps;
};
static inline void macvlan_count_rx(const struct macvlan_dev *vlan,
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
index a0384a4d1e6f..76a1192c14be 100644
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -47,9 +47,6 @@
* IRQF_TIMER - Flag to mark this interrupt as timer interrupt
* IRQF_PERCPU - Interrupt is per cpu
* IRQF_NOBALANCING - Flag to exclude this interrupt from irq balancing
- * IRQF_IRQPOLL - Interrupt is used for polling (only the interrupt that is
- * registered first in an shared interrupt is considered for
- * performance reasons)
* IRQF_ONESHOT - Interrupt is not reenabled after the hardirq handler finished.
* Used by threaded interrupts which need to keep the
* irq line disabled until the threaded handler has been run.
@@ -63,7 +60,6 @@
#define __IRQF_TIMER 0x00000200
#define IRQF_PERCPU 0x00000400
#define IRQF_NOBALANCING 0x00000800
-#define IRQF_IRQPOLL 0x00001000
#define IRQF_ONESHOT 0x00002000
#define IRQF_NO_SUSPEND 0x00004000
@@ -97,6 +93,16 @@ enum {
typedef irqreturn_t (*irq_handler_t)(int, void *);
+struct irq_expect;
+
+struct irq_watch {
+ irqreturn_t last_ret;
+ unsigned int flags;
+ unsigned long started;
+ unsigned int nr_samples;
+ unsigned int nr_polled;
+};
+
/**
* struct irqaction - per interrupt action descriptor
* @handler: interrupt handler function
@@ -109,18 +115,22 @@ typedef irqreturn_t (*irq_handler_t)(int, void *);
* @thread_fn: interupt handler function for threaded interrupts
* @thread: thread pointer for threaded interrupts
* @thread_flags: flags related to @thread
+ * @watch: data for irq watching
+ * @expects: data for irq expecting
*/
struct irqaction {
- irq_handler_t handler;
- unsigned long flags;
- const char *name;
- void *dev_id;
- struct irqaction *next;
- int irq;
- struct proc_dir_entry *dir;
- irq_handler_t thread_fn;
- struct task_struct *thread;
- unsigned long thread_flags;
+ irq_handler_t handler;
+ unsigned long flags;
+ const char *name;
+ void *dev_id;
+ struct irqaction *next;
+ int irq;
+ struct proc_dir_entry *dir;
+ irq_handler_t thread_fn;
+ struct task_struct *thread;
+ unsigned long thread_flags;
+ struct irq_watch watch;
+ struct irq_expect *expects;
};
extern irqreturn_t no_action(int cpl, void *dev_id);
@@ -193,6 +203,11 @@ devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler,
extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id);
+extern struct irq_expect *init_irq_expect(unsigned int irq, void *dev_id);
+extern void expect_irq(struct irq_expect *exp);
+extern void unexpect_irq(struct irq_expect *exp, bool timedout);
+extern void watch_irq(unsigned int irq, void *dev_id);
+
/*
* On lockdep we dont want to enable hardirqs in hardirq
* context. Use local_irq_enable_in_hardirq() to annotate
diff --git a/include/linux/ioq.h b/include/linux/ioq.h
new file mode 100644
index 000000000000..7c6d6cad83c7
--- /dev/null
+++ b/include/linux/ioq.h
@@ -0,0 +1,414 @@
+/*
+ * Copyright 2009 Novell. All Rights Reserved.
+ *
+ * IOQ is a generic shared-memory, lockless queue mechanism. It can be used
+ * in a variety of ways, though its intended purpose is to become the
+ * asynchronous communication path for virtual-bus drivers.
+ *
+ * The following are a list of key design points:
+ *
+ * #) All shared-memory is always allocated on explicitly one side of the
+ * link. This typically would be the guest side in a VM/VMM scenario.
+ * #) Each IOQ has the concept of "north" and "south" locales, where
+ * north denotes the memory-owner side (e.g. guest).
+ * #) An IOQ is manipulated using an iterator idiom.
+ * #) Provides a bi-directional signaling/notification infrastructure on
+ * a per-queue basis, which includes an event mitigation strategy
+ * to reduce boundary switching.
+ * #) The signaling path is abstracted so that various technologies and
+ * topologies can define their own specific implementation while sharing
+ * the basic structures and code.
+ *
+ * Author:
+ * Gregory Haskins <ghaskins@novell.com>
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _LINUX_IOQ_H
+#define _LINUX_IOQ_H
+
+#include <linux/types.h>
+#include <linux/shm_signal.h>
+
+/*
+ *---------
+ * The following structures represent data that is shared across boundaries
+ * which may be quite disparate from one another (e.g. Windows vs Linux,
+ * 32 vs 64 bit, etc). Therefore, care has been taken to make sure they
+ * present data in a manner that is independent of the environment.
+ *-----------
+ */
+struct ioq_ring_desc {
+ __u64 cookie; /* for arbitrary use by north-side */
+ __le64 ptr;
+ __le64 len;
+ __u8 valid;
+ __u8 sown; /* South owned = 1, North owned = 0 */
+};
+
+#define IOQ_RING_MAGIC cpu_to_le32(0x47fa2fe4)
+#define IOQ_RING_VER cpu_to_le32(4)
+
+struct ioq_ring_idx {
+ __le32 head; /* 0 based index to head of ptr array */
+ __le32 tail; /* 0 based index to tail of ptr array */
+ __u8 full;
+};
+
+enum ioq_locality {
+ ioq_locality_north,
+ ioq_locality_south,
+};
+
+struct ioq_ring_head {
+ __le32 magic;
+ __le32 ver;
+ struct shm_signal_desc signal;
+ struct ioq_ring_idx idx[2];
+ __le32 count;
+ struct ioq_ring_desc ring[1]; /* "count" elements will be allocated */
+};
+
+#define IOQ_HEAD_DESC_SIZE(count) \
+ (sizeof(struct ioq_ring_head) + sizeof(struct ioq_ring_desc) * (count - 1))
+
+/* --- END SHARED STRUCTURES --- */
+
+#ifdef __KERNEL__
+
+#include <linux/sched.h>
+#include <linux/wait.h>
+#include <linux/interrupt.h>
+#include <linux/kref.h>
+
+enum ioq_idx_type {
+ ioq_idxtype_valid,
+ ioq_idxtype_inuse,
+ ioq_idxtype_both,
+ ioq_idxtype_invalid,
+};
+
+enum ioq_seek_type {
+ ioq_seek_tail,
+ ioq_seek_next,
+ ioq_seek_head,
+ ioq_seek_set
+};
+
+struct ioq_iterator {
+ struct ioq *ioq;
+ struct ioq_ring_idx *idx;
+ u32 pos;
+ struct ioq_ring_desc *desc;
+ bool update;
+ bool dualidx;
+ bool flipowner;
+};
+
+struct ioq_notifier {
+ void (*signal)(struct ioq_notifier *);
+};
+
+struct ioq_ops {
+ void (*release)(struct ioq *ioq);
+};
+
+struct ioq {
+ struct ioq_ops *ops;
+
+ struct kref kref;
+ enum ioq_locality locale;
+ struct ioq_ring_head *head_desc;
+ struct ioq_ring_desc *ring;
+ struct shm_signal *signal;
+ wait_queue_head_t wq;
+ struct ioq_notifier *notifier;
+ size_t count;
+ struct shm_signal_notifier shm_notifier;
+};
+
+#define IOQ_ITER_AUTOUPDATE (1 << 0)
+#define IOQ_ITER_NOFLIPOWNER (1 << 1)
+
+/**
+ * ioq_init() - initialize an IOQ
+ * @ioq: IOQ context
+ *
+ * Initializes IOQ context before first use
+ *
+ **/
+void ioq_init(struct ioq *ioq,
+ struct ioq_ops *ops,
+ enum ioq_locality locale,
+ struct ioq_ring_head *head,
+ struct shm_signal *signal,
+ size_t count);
+
+/**
+ * ioq_get() - acquire an IOQ context reference
+ * @ioq: IOQ context
+ *
+ **/
+static inline struct ioq *ioq_get(struct ioq *ioq)
+{
+ kref_get(&ioq->kref);
+
+ return ioq;
+}
+
+static inline void _ioq_kref_release(struct kref *kref)
+{
+ struct ioq *ioq = container_of(kref, struct ioq, kref);
+
+ shm_signal_put(ioq->signal);
+ ioq->ops->release(ioq);
+}
+
+/**
+ * ioq_put() - release an IOQ context reference
+ * @ioq: IOQ context
+ *
+ **/
+static inline void ioq_put(struct ioq *ioq)
+{
+ kref_put(&ioq->kref, _ioq_kref_release);
+}
+
+/**
+ * ioq_notify_enable() - enables local notifications on an IOQ
+ * @ioq: IOQ context
+ * @flags: Reserved for future use, must be 0
+ *
+ * Enables/unmasks the registered ioq_notifier (if applicable) and waitq to
+ * receive wakeups whenever the remote side performs an ioq_signal() operation.
+ * A notification will be dispatched immediately if any pending signals have
+ * already been issued prior to invoking this call.
+ *
+ * This is synonymous with unmasking an interrupt.
+ *
+ * Returns: success = 0, <0 = ERRNO
+ *
+ **/
+static inline int ioq_notify_enable(struct ioq *ioq, int flags)
+{
+ return shm_signal_enable(ioq->signal, 0);
+}
+
+/**
+ * ioq_notify_disable() - disable local notifications on an IOQ
+ * @ioq: IOQ context
+ * @flags: Reserved for future use, must be 0
+ *
+ * Disables/masks the registered ioq_notifier (if applicable) and waitq
+ * from receiving any further notifications. Any subsequent calls to
+ * ioq_signal() by the remote side will update the ring as dirty, but
+ * will not traverse the locale boundary and will not invoke the notifier
+ * callback or wakeup the waitq. Signals delivered while masked will
+ * be deferred until ioq_notify_enable() is invoked
+ *
+ * This is synonymous with masking an interrupt
+ *
+ * Returns: success = 0, <0 = ERRNO
+ *
+ **/
+static inline int ioq_notify_disable(struct ioq *ioq, int flags)
+{
+ return shm_signal_disable(ioq->signal, 0);
+}
+
+/**
+ * ioq_signal() - notify the remote side about ring changes
+ * @ioq: IOQ context
+ * @flags: Reserved for future use, must be 0
+ *
+ * Marks the ring state as "dirty" and, if enabled, will traverse
+ * a locale boundary to invoke a remote notification. The remote
+ * side controls whether the notification should be delivered via
+ * the ioq_notify_enable/disable() interface.
+ *
+ * The specifics of how to traverse a locale boundary are abstracted
+ * by the ioq_ops->signal() interface and provided by a particular
+ * implementation. However, typically going north to south would be
+ * something like a syscall/hypercall, and going south to north would be
+ * something like a posix-signal/guest-interrupt.
+ *
+ * Returns: success = 0, <0 = ERRNO
+ *
+ **/
+static inline int ioq_signal(struct ioq *ioq, int flags)
+{
+ return shm_signal_inject(ioq->signal, 0);
+}
+
+/**
+ * ioq_count() - counts the number of outstanding descriptors in an index
+ * @ioq: IOQ context
+ * @type: Specifies the index type
+ * (*) valid: the descriptor is valid. This is usually
+ * used to keep track of descriptors that may not
+ * be carrying a useful payload, but still need to
+ * be tracked carefully.
+ * (*) inuse: Descriptors that carry useful payload
+ *
+ * Returns:
+ * (*) >=0: # of descriptors outstanding in the index
+ * (*) <0 = ERRNO
+ *
+ **/
+int ioq_count(struct ioq *ioq, enum ioq_idx_type type);
+
+/**
+ * ioq_remain() - counts the number of remaining descriptors in an index
+ * @ioq: IOQ context
+ * @type: Specifies the index type
+ * (*) valid: the descriptor is valid. This is usually
+ * used to keep track of descriptors that may not
+ * be carrying a useful payload, but still need to
+ * be tracked carefully.
+ * (*) inuse: Descriptors that carry useful payload
+ *
+ * This is the converse of ioq_count(). This function returns the number
+ * of "free" descriptors left in a particular index
+ *
+ * Returns:
+ * (*) >=0: # of descriptors remaining in the index
+ * (*) <0 = ERRNO
+ *
+ **/
+int ioq_remain(struct ioq *ioq, enum ioq_idx_type type);
+
+/**
+ * ioq_size() - counts the maximum number of descriptors in an ring
+ * @ioq: IOQ context
+ *
+ * This function returns the maximum number of descriptors supported in
+ * a ring, regardless of their current state (free or inuse).
+ *
+ * Returns:
+ * (*) >=0: total # of descriptors in the ring
+ * (*) <0 = ERRNO
+ *
+ **/
+int ioq_size(struct ioq *ioq);
+
+/**
+ * ioq_full() - determines if a specific index is "full"
+ * @ioq: IOQ context
+ * @type: Specifies the index type
+ * (*) valid: the descriptor is valid. This is usually
+ * used to keep track of descriptors that may not
+ * be carrying a useful payload, but still need to
+ * be tracked carefully.
+ * (*) inuse: Descriptors that carry useful payload
+ *
+ * Returns:
+ * (*) 0: index is not full
+ * (*) 1: index is full
+ * (*) <0 = ERRNO
+ *
+ **/
+int ioq_full(struct ioq *ioq, enum ioq_idx_type type);
+
+/**
+ * ioq_empty() - determines if a specific index is "empty"
+ * @ioq: IOQ context
+ * @type: Specifies the index type
+ * (*) valid: the descriptor is valid. This is usually
+ * used to keep track of descriptors that may not
+ * be carrying a useful payload, but still need to
+ * be tracked carefully.
+ * (*) inuse: Descriptors that carry useful payload
+ *
+ * Returns:
+ * (*) 0: index is not empty
+ * (*) 1: index is empty
+ * (*) <0 = ERRNO
+ *
+ **/
+static inline int ioq_empty(struct ioq *ioq, enum ioq_idx_type type)
+{
+ return !ioq_count(ioq, type);
+}
+
+/**
+ * ioq_iter_init() - initialize an iterator for IOQ descriptor traversal
+ * @ioq: IOQ context to iterate on
+ * @iter: Iterator context to init (usually from stack)
+ * @type: Specifies the index type to iterate against
+ * (*) valid: iterate against the "valid" index
+ * (*) inuse: iterate against the "inuse" index
+ * (*) both: iterate against both indexes simultaneously
+ * @flags: Bitfield with 0 or more bits set to alter behavior
+ * (*) autoupdate: automatically signal the remote side
+ * whenever the iterator pushes/pops to a new desc
+ * (*) noflipowner: do not flip the ownership bit during
+ * a push/pop operation
+ *
+ * Returns: success = 0, <0 = ERRNO
+ *
+ **/
+int ioq_iter_init(struct ioq *ioq, struct ioq_iterator *iter,
+ enum ioq_idx_type type, int flags);
+
+/**
+ * ioq_iter_seek() - seek to a specific location in the IOQ ring
+ * @iter: Iterator context (must be initialized with ioq_iter_init)
+ * @type: Specifies the type of seek operation
+ * (*) tail: seek to the absolute tail, offset is ignored
+ * (*) next: seek to the relative next, offset is ignored
+ * (*) head: seek to the absolute head, offset is ignored
+ * (*) set: seek to the absolute offset
+ * @offset: Offset for ioq_seek_set operations
+ * @flags: Reserved for future use, must be 0
+ *
+ * Returns: success = 0, <0 = ERRNO
+ *
+ **/
+int ioq_iter_seek(struct ioq_iterator *iter, enum ioq_seek_type type,
+ long offset, int flags);
+
+/**
+ * ioq_iter_push() - push the tail pointer forward
+ * @iter: Iterator context (must be initialized with ioq_iter_init)
+ * @flags: Reserved for future use, must be 0
+ *
+ * This function will simultaneously advance the tail ptr in the current
+ * index (valid/inuse, as specified in the ioq_iter_init) as well as
+ * perform a seek(next) operation. This effectively "pushes" a new pointer
+ * onto the tail of the index.
+ *
+ * Returns: success = 0, <0 = ERRNO
+ *
+ **/
+int ioq_iter_push(struct ioq_iterator *iter, int flags);
+
+/**
+ * ioq_iter_pop() - pop the head pointer from the ring
+ * @iter: Iterator context (must be initialized with ioq_iter_init)
+ * @flags: Reserved for future use, must be 0
+ *
+ * This function will simultaneously advance the head ptr in the current
+ * index (valid/inuse, as specified in the ioq_iter_init) as well as
+ * perform a seek(next) operation. This effectively "pops" a pointer
+ * from the head of the index.
+ *
+ * Returns: success = 0, <0 = ERRNO
+ *
+ **/
+int ioq_iter_pop(struct ioq_iterator *iter, int flags);
+
+#endif /* __KERNEL__ */
+
+#endif /* _LINUX_IOQ_H */
diff --git a/include/linux/irq.h b/include/linux/irq.h
index c03243ad84b4..4cb22259edd9 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -21,6 +21,7 @@
#include <linux/irqreturn.h>
#include <linux/irqnr.h>
#include <linux/errno.h>
+#include <linux/timer.h>
#include <linux/topology.h>
#include <linux/wait.h>
@@ -71,6 +72,8 @@ typedef void (*irq_flow_handler_t)(unsigned int irq,
#define IRQ_SUSPENDED 0x04000000 /* IRQ has gone through suspend sequence */
#define IRQ_ONESHOT 0x08000000 /* IRQ is not unmasked after hardirq */
#define IRQ_NESTED_THREAD 0x10000000 /* IRQ is nested into another, no own handler thread */
+#define IRQ_IN_POLLING 0x20000000 /* IRQ polling in progress */
+#define IRQ_CHECK_WATCHES 0x40000000 /* IRQ watch enabled */
#ifdef CONFIG_IRQ_PER_CPU
# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
@@ -144,6 +147,17 @@ struct irq_chip {
struct timer_rand_state;
struct irq_2_iommu;
+
+/* spurious IRQ tracking and handling */
+struct irq_spr {
+ unsigned long last_bad; /* when was the last bad? */
+ unsigned long period_start; /* period start jiffies */
+ unsigned int nr_samples; /* nr of irqs in this period */
+ unsigned int nr_bad; /* nr of bad deliveries */
+ unsigned int poll_cnt; /* nr to poll once activated */
+ unsigned int poll_rem; /* how many polls are left? */
+};
+
/**
* struct irq_desc - interrupt descriptor
* @irq: interrupt number for this descriptor
@@ -160,15 +174,14 @@ struct irq_2_iommu;
* @status: status information
* @depth: disable-depth, for nested irq_disable() calls
* @wake_depth: enable depth, for multiple set_irq_wake() callers
- * @irq_count: stats field to detect stalled irqs
- * @last_unhandled: aging timer for unhandled count
- * @irqs_unhandled: stats field for spurious unhandled interrupts
* @lock: locking for SMP
* @affinity: IRQ affinity on SMP
* @node: node index useful for balancing
* @pending_mask: pending rebalanced interrupts
* @threads_active: number of irqaction threads currently running
* @wait_for_threads: wait queue for sync_irq to wait for threaded handlers
+ * @spr: data for spurious IRQ handling
+ * @poll_timer: timer for IRQ polling
* @dir: /proc/irq/ procfs entry
* @name: flow handler name for /proc/interrupts output
*/
@@ -189,9 +202,6 @@ struct irq_desc {
unsigned int depth; /* nested irq disables */
unsigned int wake_depth; /* nested wake enables */
- unsigned int irq_count; /* For detecting broken IRQs */
- unsigned long last_unhandled; /* Aging timer for unhandled count */
- unsigned int irqs_unhandled;
raw_spinlock_t lock;
#ifdef CONFIG_SMP
cpumask_var_t affinity;
@@ -203,6 +213,11 @@ struct irq_desc {
#endif
atomic_t threads_active;
wait_queue_head_t wait_for_threads;
+
+ struct irq_spr spr;
+ struct timer_list poll_timer;
+ bool poll_warned;
+
#ifdef CONFIG_PROC_FS
struct proc_dir_entry *dir;
#endif
@@ -324,8 +339,17 @@ static inline void generic_handle_irq(unsigned int irq)
}
/* Handling of unhandled and spurious interrupts: */
-extern void note_interrupt(unsigned int irq, struct irq_desc *desc,
- irqreturn_t action_ret);
+extern void __note_interrupt(unsigned int irq, struct irq_desc *desc,
+ irqreturn_t action_ret);
+
+static inline void note_interrupt(unsigned int irq, struct irq_desc *desc,
+ irqreturn_t action_ret)
+{
+ extern int noirqdebug;
+
+ if (!noirqdebug)
+ __note_interrupt(irq, desc, action_ret);
+}
/* Resending of interrupts :*/
void check_irq_resend(struct irq_desc *desc, unsigned int irq);
@@ -439,12 +463,12 @@ extern int set_irq_msi(unsigned int irq, struct msi_desc *entry);
static inline bool alloc_desc_masks(struct irq_desc *desc, int node,
bool boot)
{
+#ifdef CONFIG_CPUMASK_OFFSTACK
gfp_t gfp = GFP_ATOMIC;
if (boot)
gfp = GFP_NOWAIT;
-#ifdef CONFIG_CPUMASK_OFFSTACK
if (!alloc_cpumask_var_node(&desc->affinity, gfp, node))
return false;
diff --git a/include/linux/kbd_kern.h b/include/linux/kbd_kern.h
index 506ad20c18f8..ae87c0ad4ce9 100644
--- a/include/linux/kbd_kern.h
+++ b/include/linux/kbd_kern.h
@@ -144,6 +144,7 @@ struct console;
int getkeycode(unsigned int scancode);
int setkeycode(unsigned int scancode, unsigned int keycode);
void compute_shiftstate(void);
+void kbd_dbg_clear_keys(void);
/* defkeymap.c */
diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index cf343a852534..7950a37a7146 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -22,6 +22,7 @@
#include <linux/compiler.h>
#include <linux/spinlock.h>
#include <linux/kref.h>
+#include <linux/kobject_ns.h>
#include <linux/kernel.h>
#include <linux/wait.h>
#include <asm/atomic.h>
@@ -136,42 +137,8 @@ struct kobj_attribute {
extern const struct sysfs_ops kobj_sysfs_ops;
-/*
- * Namespace types which are used to tag kobjects and sysfs entries.
- * Network namespace will likely be the first.
- */
-enum kobj_ns_type {
- KOBJ_NS_TYPE_NONE = 0,
- KOBJ_NS_TYPE_NET,
- KOBJ_NS_TYPES
-};
-
struct sock;
-/*
- * Callbacks so sysfs can determine namespaces
- * @current_ns: return calling task's namespace
- * @netlink_ns: return namespace to which a sock belongs (right?)
- * @initial_ns: return the initial namespace (i.e. init_net_ns)
- */
-struct kobj_ns_type_operations {
- enum kobj_ns_type type;
- const void *(*current_ns)(void);
- const void *(*netlink_ns)(struct sock *sk);
- const void *(*initial_ns)(void);
-};
-
-int kobj_ns_type_register(const struct kobj_ns_type_operations *ops);
-int kobj_ns_type_registered(enum kobj_ns_type type);
-const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent);
-const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj);
-
-const void *kobj_ns_current(enum kobj_ns_type type);
-const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk);
-const void *kobj_ns_initial(enum kobj_ns_type type);
-void kobj_ns_exit(enum kobj_ns_type type, const void *ns);
-
-
/**
* struct kset - a set of kobjects of a specific type, belonging to a specific subsystem.
*
diff --git a/include/linux/kobject_ns.h b/include/linux/kobject_ns.h
new file mode 100644
index 000000000000..82cb5bf461fb
--- /dev/null
+++ b/include/linux/kobject_ns.h
@@ -0,0 +1,56 @@
+/* Kernel object name space definitions
+ *
+ * Copyright (c) 2002-2003 Patrick Mochel
+ * Copyright (c) 2002-2003 Open Source Development Labs
+ * Copyright (c) 2006-2008 Greg Kroah-Hartman <greg@kroah.com>
+ * Copyright (c) 2006-2008 Novell Inc.
+ *
+ * Split from kobject.h by David Howells (dhowells@redhat.com)
+ *
+ * This file is released under the GPLv2.
+ *
+ * Please read Documentation/kobject.txt before using the kobject
+ * interface, ESPECIALLY the parts about reference counts and object
+ * destructors.
+ */
+
+#ifndef _LINUX_KOBJECT_NS_H
+#define _LINUX_KOBJECT_NS_H
+
+struct sock;
+struct kobject;
+
+/*
+ * Namespace types which are used to tag kobjects and sysfs entries.
+ * Network namespace will likely be the first.
+ */
+enum kobj_ns_type {
+ KOBJ_NS_TYPE_NONE = 0,
+ KOBJ_NS_TYPE_NET,
+ KOBJ_NS_TYPES
+};
+
+/*
+ * Callbacks so sysfs can determine namespaces
+ * @current_ns: return calling task's namespace
+ * @netlink_ns: return namespace to which a sock belongs (right?)
+ * @initial_ns: return the initial namespace (i.e. init_net_ns)
+ */
+struct kobj_ns_type_operations {
+ enum kobj_ns_type type;
+ const void *(*current_ns)(void);
+ const void *(*netlink_ns)(struct sock *sk);
+ const void *(*initial_ns)(void);
+};
+
+int kobj_ns_type_register(const struct kobj_ns_type_operations *ops);
+int kobj_ns_type_registered(enum kobj_ns_type type);
+const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent);
+const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj);
+
+const void *kobj_ns_current(enum kobj_ns_type type);
+const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk);
+const void *kobj_ns_initial(enum kobj_ns_type type);
+void kobj_ns_exit(enum kobj_ns_type type, const void *ns);
+
+#endif /* _LINUX_KOBJECT_NS_H */
diff --git a/include/linux/libata.h b/include/linux/libata.h
index f010f18a0f86..dcdd1373807a 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -751,6 +751,8 @@ struct ata_port {
struct ata_host *host;
struct device *dev;
+ struct irq_expect *irq_expect; /* for irq expecting */
+
struct mutex scsi_scan_mutex;
struct delayed_work hotplug_task;
struct work_struct scsi_rescan_task;
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 46c36ffe20ee..a4b14fd81c6a 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2171,6 +2171,8 @@ extern void dev_seq_stop(struct seq_file *seq, void *v);
extern int netdev_class_create_file(struct class_attribute *class_attr);
extern void netdev_class_remove_file(struct class_attribute *class_attr);
+extern struct kobj_ns_type_operations net_ns_type_operations;
+
extern char *netdev_drivername(const struct net_device *dev, char *buffer, int len);
extern void linkwatch_run_queue(void);
diff --git a/include/linux/nilfs2_fs.h b/include/linux/nilfs2_fs.h
index f5487b6f91ed..b07f5cdff5e2 100644
--- a/include/linux/nilfs2_fs.h
+++ b/include/linux/nilfs2_fs.h
@@ -229,6 +229,7 @@ struct nilfs_super_block {
*/
#define NILFS_CURRENT_REV 2 /* current major revision */
#define NILFS_MINOR_REV 0 /* minor revision */
+#define NILFS_MIN_SUPP_REV 2 /* minimum supported revision */
/*
* Feature set definitions
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h
index 2c8701687336..8af1e66c3cf9 100644
--- a/include/linux/nl80211.h
+++ b/include/linux/nl80211.h
@@ -40,6 +40,43 @@
*/
/**
+ * DOC: Frame transmission/registration support
+ *
+ * Frame transmission and registration support exists to allow userspace
+ * management entities such as wpa_supplicant react to management frames
+ * that are not being handled by the kernel. This includes, for example,
+ * certain classes of action frames that cannot be handled in the kernel
+ * for various reasons.
+ *
+ * Frame registration is done on a per-interface basis and registrations
+ * cannot be removed other than by closing the socket. It is possible to
+ * specify a registration filter to register, for example, only for a
+ * certain type of action frame. In particular with action frames, those
+ * that userspace registers for will not be returned as unhandled by the
+ * driver, so that the registered application has to take responsibility
+ * for doing that.
+ *
+ * The type of frame that can be registered for is also dependent on the
+ * driver and interface type. The frame types are advertised in wiphy
+ * attributes so applications know what to expect.
+ *
+ * NOTE: When an interface changes type while registrations are active,
+ * these registrations are ignored until the interface type is
+ * changed again. This means that changing the interface type can
+ * lead to a situation that couldn't otherwise be produced, but
+ * any such registrations will be dormant in the sense that they
+ * will not be serviced, i.e. they will not receive any frames.
+ *
+ * Frame transmission allows userspace to send for example the required
+ * responses to action frames. It is subject to some sanity checking,
+ * but many frames can be transmitted. When a frame was transmitted, its
+ * status is indicated to the sending socket.
+ *
+ * For more technical details, see the corresponding command descriptions
+ * below.
+ */
+
+/**
* enum nl80211_commands - supported nl80211 commands
*
* @NL80211_CMD_UNSPEC: unspecified command to catch errors
@@ -301,16 +338,18 @@
* rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface
* and @NL80211_ATTR_TX_RATES the set of allowed rates.
*
- * @NL80211_CMD_REGISTER_ACTION: Register for receiving certain action frames
- * (via @NL80211_CMD_ACTION) for processing in userspace. This command
- * requires an interface index and a match attribute containing the first
- * few bytes of the frame that should match, e.g. a single byte for only
- * a category match or four bytes for vendor frames including the OUI.
- * The registration cannot be dropped, but is removed automatically
- * when the netlink socket is closed. Multiple registrations can be made.
- * @NL80211_CMD_ACTION: Action frame TX request and RX notification. This
- * command is used both as a request to transmit an Action frame and as an
- * event indicating reception of an Action frame that was not processed in
+ * @NL80211_CMD_REGISTER_FRAME: Register for receiving certain mgmt frames
+ * (via @NL80211_CMD_FRAME) for processing in userspace. This command
+ * requires an interface index, a frame type attribute (optional for
+ * backward compatibility reasons, if not given assumes action frames)
+ * and a match attribute containing the first few bytes of the frame
+ * that should match, e.g. a single byte for only a category match or
+ * four bytes for vendor frames including the OUI. The registration
+ * cannot be dropped, but is removed automatically when the netlink
+ * socket is closed. Multiple registrations can be made.
+ * @NL80211_CMD_FRAME: Management frame TX request and RX notification. This
+ * command is used both as a request to transmit a management frame and
+ * as an event indicating reception of a frame that was not processed in
* kernel code, but is for us (i.e., which may need to be processed in a
* user space application). %NL80211_ATTR_FRAME is used to specify the
* frame contents (including header). %NL80211_ATTR_WIPHY_FREQ (and
@@ -320,8 +359,8 @@
* operational channel). When called, this operation returns a cookie
* (%NL80211_ATTR_COOKIE) that will be included with the TX status event
* pertaining to the TX request.
- * @NL80211_CMD_ACTION_TX_STATUS: Report TX status of an Action frame
- * transmitted with %NL80211_CMD_ACTION. %NL80211_ATTR_COOKIE identifies
+ * @NL80211_CMD_FRAME_TX_STATUS: Report TX status of a management frame
+ * transmitted with %NL80211_CMD_FRAME. %NL80211_ATTR_COOKIE identifies
* the TX command and %NL80211_ATTR_FRAME includes the contents of the
* frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged
* the frame.
@@ -429,9 +468,12 @@ enum nl80211_commands {
NL80211_CMD_SET_TX_BITRATE_MASK,
- NL80211_CMD_REGISTER_ACTION,
- NL80211_CMD_ACTION,
- NL80211_CMD_ACTION_TX_STATUS,
+ NL80211_CMD_REGISTER_FRAME,
+ NL80211_CMD_REGISTER_ACTION = NL80211_CMD_REGISTER_FRAME,
+ NL80211_CMD_FRAME,
+ NL80211_CMD_ACTION = NL80211_CMD_FRAME,
+ NL80211_CMD_FRAME_TX_STATUS,
+ NL80211_CMD_ACTION_TX_STATUS = NL80211_CMD_FRAME_TX_STATUS,
NL80211_CMD_SET_POWER_SAVE,
NL80211_CMD_GET_POWER_SAVE,
@@ -708,7 +750,16 @@ enum nl80211_commands {
* is used with %NL80211_CMD_SET_TX_BITRATE_MASK.
*
* @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain
- * at least one byte, currently used with @NL80211_CMD_REGISTER_ACTION.
+ * at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME.
+ * @NL80211_ATTR_FRAME_TYPE: A u16 indicating the frame type/subtype for the
+ * @NL80211_CMD_REGISTER_FRAME command.
+ * @NL80211_ATTR_TX_FRAME_TYPES: wiphy capability attribute, which is a
+ * nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing
+ * information about which frame types can be transmitted with
+ * %NL80211_CMD_FRAME.
+ * @NL80211_ATTR_RX_FRAME_TYPES: wiphy capability attribute, which is a
+ * nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing
+ * information about which frame types can be registered for RX.
*
* @NL80211_ATTR_ACK: Flag attribute indicating that the frame was
* acknowledged by the recipient.
@@ -891,6 +942,10 @@ enum nl80211_attrs {
NL80211_ATTR_WIPHY_TX_POWER_SETTING,
NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
+ NL80211_ATTR_TX_FRAME_TYPES,
+ NL80211_ATTR_RX_FRAME_TYPES,
+ NL80211_ATTR_FRAME_TYPE,
+
/* add attributes here, update the policy in nl80211.c */
__NL80211_ATTR_AFTER_LAST,
@@ -947,7 +1002,7 @@ enum nl80211_attrs {
* @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames
* @NL80211_IFTYPE_MESH_POINT: mesh point
* @NL80211_IFTYPE_MAX: highest interface type number currently defined
- * @__NL80211_IFTYPE_AFTER_LAST: internal use
+ * @NUM_NL80211_IFTYPES: number of defined interface types
*
* These values are used with the %NL80211_ATTR_IFTYPE
* to set the type of an interface.
@@ -964,8 +1019,8 @@ enum nl80211_iftype {
NL80211_IFTYPE_MESH_POINT,
/* keep last */
- __NL80211_IFTYPE_AFTER_LAST,
- NL80211_IFTYPE_MAX = __NL80211_IFTYPE_AFTER_LAST - 1
+ NUM_NL80211_IFTYPES,
+ NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1
};
/**
diff --git a/include/linux/pci.h b/include/linux/pci.h
index b1d17956a153..c8d95e369ff4 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1214,6 +1214,9 @@ static inline struct pci_dev *pci_get_bus_and_slot(unsigned int bus,
unsigned int devfn)
{ return NULL; }
+static inline int pci_domain_nr(struct pci_bus *bus)
+{ return 0; }
+
#define dev_is_pci(d) (false)
#define dev_is_pf(d) (false)
#define dev_num_vf(d) (0)
diff --git a/include/linux/shm_signal.h b/include/linux/shm_signal.h
new file mode 100644
index 000000000000..b2efd72669fb
--- /dev/null
+++ b/include/linux/shm_signal.h
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2009 Novell. All Rights Reserved.
+ *
+ * Author:
+ * Gregory Haskins <ghaskins@novell.com>
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _LINUX_SHM_SIGNAL_H
+#define _LINUX_SHM_SIGNAL_H
+
+#include <linux/types.h>
+
+/*
+ *---------
+ * The following structures represent data that is shared across boundaries
+ * which may be quite disparate from one another (e.g. Windows vs Linux,
+ * 32 vs 64 bit, etc). Therefore, care has been taken to make sure they
+ * present data in a manner that is independent of the environment.
+ *-----------
+ */
+
+#define SHM_SIGNAL_MAGIC cpu_to_le32(0x58fa39df)
+#define SHM_SIGNAL_VER cpu_to_le32(1)
+
+struct shm_signal_irq {
+ __u8 enabled;
+ __u8 pending;
+ __u8 dirty;
+};
+
+enum shm_signal_locality {
+ shm_locality_north,
+ shm_locality_south,
+};
+
+struct shm_signal_desc {
+ __le32 magic;
+ __le32 ver;
+ struct shm_signal_irq irq[2];
+};
+
+/* --- END SHARED STRUCTURES --- */
+
+#ifdef __KERNEL__
+
+#include <linux/kref.h>
+#include <linux/interrupt.h>
+
+struct shm_signal_notifier {
+ void (*signal)(struct shm_signal_notifier *);
+};
+
+struct shm_signal;
+
+struct shm_signal_ops {
+ int (*inject)(struct shm_signal *s);
+ void (*fault)(struct shm_signal *s, const char *fmt, ...);
+ void (*release)(struct shm_signal *s);
+};
+
+enum {
+ shm_signal_in_wakeup,
+};
+
+struct shm_signal {
+ struct kref kref;
+ spinlock_t lock;
+ enum shm_signal_locality locale;
+ unsigned long flags;
+ struct shm_signal_ops *ops;
+ struct shm_signal_desc *desc;
+ struct shm_signal_notifier *notifier;
+ struct tasklet_struct deferred_notify;
+};
+
+#define SHM_SIGNAL_FAULT(s, fmt, args...) \
+ ((s)->ops->fault ? (s)->ops->fault((s), fmt, ## args) : panic(fmt, ## args))
+
+ /*
+ * These functions should only be used internally
+ */
+void _shm_signal_release(struct kref *kref);
+void _shm_signal_wakeup(struct shm_signal *s);
+
+/**
+ * shm_signal_init() - initialize an SHM_SIGNAL
+ * @s: SHM_SIGNAL context
+ *
+ * Initializes SHM_SIGNAL context before first use
+ *
+ **/
+void shm_signal_init(struct shm_signal *s, enum shm_signal_locality locale,
+ struct shm_signal_ops *ops, struct shm_signal_desc *desc);
+
+/**
+ * shm_signal_get() - acquire an SHM_SIGNAL context reference
+ * @s: SHM_SIGNAL context
+ *
+ **/
+static inline struct shm_signal *shm_signal_get(struct shm_signal *s)
+{
+ kref_get(&s->kref);
+
+ return s;
+}
+
+/**
+ * shm_signal_put() - release an SHM_SIGNAL context reference
+ * @s: SHM_SIGNAL context
+ *
+ **/
+static inline void shm_signal_put(struct shm_signal *s)
+{
+ kref_put(&s->kref, _shm_signal_release);
+}
+
+/**
+ * shm_signal_enable() - enables local notifications on an SHM_SIGNAL
+ * @s: SHM_SIGNAL context
+ * @flags: Reserved for future use, must be 0
+ *
+ * Enables/unmasks the registered notifier (if applicable) to receive wakeups
+ * whenever the remote side performs an shm_signal() operation. A notification
+ * will be dispatched immediately if any pending signals have already been
+ * issued prior to invoking this call.
+ *
+ * This is synonymous with unmasking an interrupt.
+ *
+ * Returns: success = 0, <0 = ERRNO
+ *
+ **/
+int shm_signal_enable(struct shm_signal *s, int flags);
+
+/**
+ * shm_signal_disable() - disable local notifications on an SHM_SIGNAL
+ * @s: SHM_SIGNAL context
+ * @flags: Reserved for future use, must be 0
+ *
+ * Disables/masks the registered shm_signal_notifier (if applicable) from
+ * receiving any further notifications. Any subsequent calls to shm_signal()
+ * by the remote side will update the shm as dirty, but will not traverse the
+ * locale boundary and will not invoke the notifier callback. Signals
+ * delivered while masked will be deferred until shm_signal_enable() is
+ * invoked.
+ *
+ * This is synonymous with masking an interrupt
+ *
+ * Returns: success = 0, <0 = ERRNO
+ *
+ **/
+int shm_signal_disable(struct shm_signal *s, int flags);
+
+/**
+ * shm_signal_inject() - notify the remote side about shm changes
+ * @s: SHM_SIGNAL context
+ * @flags: Reserved for future use, must be 0
+ *
+ * Marks the shm state as "dirty" and, if enabled, will traverse
+ * a locale boundary to inject a remote notification. The remote
+ * side controls whether the notification should be delivered via
+ * the shm_signal_enable/disable() interface.
+ *
+ * The specifics of how to traverse a locale boundary are abstracted
+ * by the shm_signal_ops->signal() interface and provided by a particular
+ * implementation. However, typically going north to south would be
+ * something like a syscall/hypercall, and going south to north would be
+ * something like a posix-signal/guest-interrupt.
+ *
+ * Returns: success = 0, <0 = ERRNO
+ *
+ **/
+int shm_signal_inject(struct shm_signal *s, int flags);
+
+#endif /* __KERNEL__ */
+
+#endif /* _LINUX_SHM_SIGNAL_H */
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 77eb60d2b496..d8050382b189 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -558,6 +558,15 @@ extern unsigned int skb_find_text(struct sk_buff *skb, unsigned int from,
unsigned int to, struct ts_config *config,
struct ts_state *state);
+extern __u32 __skb_get_rxhash(struct sk_buff *skb);
+static inline __u32 skb_get_rxhash(struct sk_buff *skb)
+{
+ if (!skb->rxhash)
+ skb->rxhash = __skb_get_rxhash(skb);
+
+ return skb->rxhash;
+}
+
#ifdef NET_SKBUFF_DATA_USES_OFFSET
static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
{
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h
index 6d14409c4d9a..9f63538928c0 100644
--- a/include/linux/slub_def.h
+++ b/include/linux/slub_def.h
@@ -68,7 +68,7 @@ struct kmem_cache_order_objects {
* Slab cache management.
*/
struct kmem_cache {
- struct kmem_cache_cpu *cpu_slab;
+ struct kmem_cache_cpu __percpu *cpu_slab;
/* Used for retriving partial slabs etc */
unsigned long flags;
int size; /* The size of an object including meta data */
diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h
index a6d5225b9275..11daf9c140e7 100644
--- a/include/linux/ssb/ssb_regs.h
+++ b/include/linux/ssb/ssb_regs.h
@@ -97,6 +97,7 @@
#define SSB_TMSLOW_RESET 0x00000001 /* Reset */
#define SSB_TMSLOW_REJECT_22 0x00000002 /* Reject (Backplane rev 2.2) */
#define SSB_TMSLOW_REJECT_23 0x00000004 /* Reject (Backplane rev 2.3) */
+#define SSB_TMSLOW_PHYCLK 0x00000010 /* MAC PHY Clock Control Enable */
#define SSB_TMSLOW_CLOCK 0x00010000 /* Clock Enable */
#define SSB_TMSLOW_FGC 0x00020000 /* Force Gated Clocks On */
#define SSB_TMSLOW_PE 0x40000000 /* Power Management Enable */
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h
index 3c92121ba9af..96eb576d82fd 100644
--- a/include/linux/sysfs.h
+++ b/include/linux/sysfs.h
@@ -16,6 +16,7 @@
#include <linux/errno.h>
#include <linux/list.h>
#include <linux/lockdep.h>
+#include <linux/kobject_ns.h>
#include <asm/atomic.h>
struct kobject;
diff --git a/include/linux/vbus_driver.h b/include/linux/vbus_driver.h
new file mode 100644
index 000000000000..8a7acb1a7a05
--- /dev/null
+++ b/include/linux/vbus_driver.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2009 Novell. All Rights Reserved.
+ *
+ * Mediates access to a host VBUS from a guest kernel by providing a
+ * global view of all VBUS devices
+ *
+ * Author:
+ * Gregory Haskins <ghaskins@novell.com>
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _LINUX_VBUS_DRIVER_H
+#define _LINUX_VBUS_DRIVER_H
+
+#include <linux/device.h>
+#include <linux/shm_signal.h>
+#include <linux/ioq.h>
+
+struct vbus_device_proxy;
+struct vbus_driver;
+
+struct vbus_device_proxy_ops {
+ int (*open)(struct vbus_device_proxy *dev, int version, int flags);
+ int (*close)(struct vbus_device_proxy *dev, int flags);
+ int (*shm)(struct vbus_device_proxy *dev, const char *name,
+ int id, int prio,
+ void *ptr, size_t len,
+ struct shm_signal_desc *sigdesc, struct shm_signal **signal,
+ int flags);
+ int (*call)(struct vbus_device_proxy *dev, u32 func,
+ void *data, size_t len, int flags);
+ void (*release)(struct vbus_device_proxy *dev);
+};
+
+struct vbus_device_proxy {
+ char *type;
+ u64 id;
+ void *priv; /* Used by drivers */
+ struct vbus_device_proxy_ops *ops;
+ struct device dev;
+};
+
+int vbus_device_proxy_register(struct vbus_device_proxy *dev);
+void vbus_device_proxy_unregister(struct vbus_device_proxy *dev);
+
+struct vbus_device_proxy *vbus_device_proxy_find(u64 id);
+
+struct vbus_driver_ops {
+ int (*probe)(struct vbus_device_proxy *dev);
+ int (*remove)(struct vbus_device_proxy *dev);
+};
+
+struct vbus_driver {
+ char *type;
+ struct module *owner;
+ struct vbus_driver_ops *ops;
+ struct device_driver drv;
+};
+
+int vbus_driver_register(struct vbus_driver *drv);
+void vbus_driver_unregister(struct vbus_driver *drv);
+
+/*
+ * driver-side IOQ helper - allocates device-shm and maps an IOQ on it
+ */
+int vbus_driver_ioq_alloc(struct vbus_device_proxy *dev, const char *name,
+ int id, int prio, size_t ringsize, struct ioq **ioq);
+
+#define VBUS_DRIVER_AUTOPROBE(name) MODULE_ALIAS("vbus-proxy:" name)
+
+#endif /* _LINUX_VBUS_DRIVER_H */
diff --git a/include/linux/vbus_pci.h b/include/linux/vbus_pci.h
new file mode 100644
index 000000000000..fe337590e644
--- /dev/null
+++ b/include/linux/vbus_pci.h
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2009 Novell. All Rights Reserved.
+ *
+ * PCI to Virtual-Bus Bridge
+ *
+ * Author:
+ * Gregory Haskins <ghaskins@novell.com>
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _LINUX_VBUS_PCI_H
+#define _LINUX_VBUS_PCI_H
+
+#include <linux/ioctl.h>
+#include <linux/types.h>
+
+#define VBUS_PCI_ABI_MAGIC 0xbf53eef5
+#define VBUS_PCI_ABI_VERSION 2
+#define VBUS_PCI_HC_VERSION 1
+
+enum {
+ VBUS_PCI_BRIDGE_NEGOTIATE,
+ VBUS_PCI_BRIDGE_QREG,
+ VBUS_PCI_BRIDGE_SLOWCALL,
+ VBUS_PCI_BRIDGE_FASTCALL_ADD,
+ VBUS_PCI_BRIDGE_FASTCALL_DROP,
+
+ VBUS_PCI_BRIDGE_MAX, /* must be last */
+};
+
+enum {
+ VBUS_PCI_HC_DEVOPEN,
+ VBUS_PCI_HC_DEVCLOSE,
+ VBUS_PCI_HC_DEVCALL,
+ VBUS_PCI_HC_DEVSHM,
+
+ VBUS_PCI_HC_MAX, /* must be last */
+};
+
+struct vbus_pci_bridge_negotiate {
+ __u32 magic;
+ __u32 version;
+ __u64 capabilities;
+};
+
+struct vbus_pci_deviceopen {
+ __u32 devid;
+ __u32 version; /* device ABI version */
+ __u64 handle; /* return value for devh */
+};
+
+struct vbus_pci_devicecall {
+ __u64 devh; /* device-handle (returned from DEVICEOPEN */
+ __u32 func;
+ __u32 len;
+ __u32 flags;
+ __u64 datap;
+};
+
+struct vbus_pci_deviceshm {
+ __u64 devh; /* device-handle (returned from DEVICEOPEN */
+ __u32 id;
+ __u32 len;
+ __u32 flags;
+ struct {
+ __u32 offset;
+ __u32 prio;
+ __u64 cookie; /* token to pass back when signaling client */
+ } signal;
+ __u64 datap;
+};
+
+struct vbus_pci_call_desc {
+ __u32 vector;
+ __u32 len;
+ __u64 datap;
+};
+
+struct vbus_pci_fastcall_desc {
+ struct vbus_pci_call_desc call;
+ __u32 result;
+};
+
+struct vbus_pci_regs {
+ struct vbus_pci_call_desc bridgecall;
+ __u8 pad[48];
+};
+
+struct vbus_pci_signals {
+ __u32 eventq;
+ __u32 fastcall;
+ __u32 shmsignal;
+ __u8 pad[20];
+};
+
+struct vbus_pci_eventqreg {
+ __u32 count;
+ __u64 ring;
+ __u64 data;
+};
+
+struct vbus_pci_busreg {
+ __u32 count; /* supporting multiple queues allows for prio, etc */
+ struct vbus_pci_eventqreg eventq[1];
+};
+
+enum vbus_pci_eventid {
+ VBUS_PCI_EVENT_DEVADD,
+ VBUS_PCI_EVENT_DEVDROP,
+ VBUS_PCI_EVENT_SHMSIGNAL,
+ VBUS_PCI_EVENT_SHMCLOSE,
+};
+
+#define VBUS_MAX_DEVTYPE_LEN 128
+
+struct vbus_pci_add_event {
+ __u64 id;
+ char type[VBUS_MAX_DEVTYPE_LEN];
+};
+
+struct vbus_pci_handle_event {
+ __u64 handle;
+};
+
+struct vbus_pci_event {
+ __u32 eventid;
+ union {
+ struct vbus_pci_add_event add;
+ struct vbus_pci_handle_event handle;
+ } data;
+};
+
+#endif /* _LINUX_VBUS_PCI_H */
diff --git a/include/linux/venet.h b/include/linux/venet.h
new file mode 100644
index 000000000000..0578d797c973
--- /dev/null
+++ b/include/linux/venet.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2009 Novell. All Rights Reserved.
+ *
+ * Virtual-Ethernet adapter
+ *
+ * Author:
+ * Gregory Haskins <ghaskins@novell.com>
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _LINUX_VENET_H
+#define _LINUX_VENET_H
+
+#include <linux/types.h>
+
+#define VENET_VERSION 1
+
+#define VENET_TYPE "virtual-ethernet"
+
+#define VENET_QUEUE_RX 0
+#define VENET_QUEUE_TX 1
+
+struct venet_capabilities {
+ __u32 gid;
+ __u32 bits;
+};
+
+#define VENET_CAP_GROUP_SG 0
+#define VENET_CAP_GROUP_EVENTQ 1
+#define VENET_CAP_GROUP_L4RO 2 /* layer-4 reassem offloading */
+
+/* CAPABILITIES-GROUP SG */
+#define VENET_CAP_SG (1 << 0)
+#define VENET_CAP_TSO4 (1 << 1)
+#define VENET_CAP_TSO6 (1 << 2)
+#define VENET_CAP_ECN (1 << 3)
+#define VENET_CAP_UFO (1 << 4)
+#define VENET_CAP_PMTD (1 << 5) /* pre-mapped tx desc */
+
+/* CAPABILITIES-GROUP EVENTQ */
+#define VENET_CAP_EVQ_LINKSTATE (1 << 0)
+#define VENET_CAP_EVQ_TXC (1 << 1) /* tx-complete */
+
+struct venet_iov {
+ __u32 len;
+ __u64 ptr;
+};
+
+#define VENET_SG_FLAG_NEEDS_CSUM (1 << 0)
+#define VENET_SG_FLAG_GSO (1 << 1)
+#define VENET_SG_FLAG_ECN (1 << 2)
+
+struct venet_sg {
+ __u64 cookie;
+ __u32 flags;
+ __u32 len; /* total length of all iovs */
+ struct {
+ __u16 start; /* csum starting position */
+ __u16 offset; /* offset to place csum */
+ } csum;
+ struct {
+#define VENET_GSO_TYPE_TCPV4 0 /* IPv4 TCP (TSO) */
+#define VENET_GSO_TYPE_UDP 1 /* IPv4 UDP (UFO) */
+#define VENET_GSO_TYPE_TCPV6 2 /* IPv6 TCP */
+ __u8 type;
+ __u16 hdrlen;
+ __u16 size;
+ } gso;
+ __u32 count; /* nr of iovs */
+ struct venet_iov iov[1];
+};
+
+struct venet_eventq_query {
+ __u32 flags;
+ __u32 evsize; /* size of each event */
+ __u32 dpid; /* descriptor pool-id */
+ __u32 qid;
+ __u8 pad[16];
+};
+
+#define VENET_EVENT_LINKSTATE 0
+#define VENET_EVENT_TXC 1
+
+struct venet_event_header {
+ __u32 flags;
+ __u32 size;
+ __u32 id;
+};
+
+struct venet_event_linkstate {
+ struct venet_event_header header;
+ __u8 state; /* 0 = down, 1 = up */
+};
+
+struct venet_event_txc {
+ struct venet_event_header header;
+ __u32 txqid;
+ __u64 cookie;
+};
+
+struct venet_l4ro_query {
+ __u32 flags;
+ __u32 dpid; /* descriptor pool-id */
+ __u32 pqid; /* page queue-id */
+ __u8 pad[20];
+};
+
+
+#define VSG_DESC_SIZE(count) (sizeof(struct venet_sg) + \
+ sizeof(struct venet_iov) * ((count) - 1))
+
+#define VENET_FUNC_LINKUP 0
+#define VENET_FUNC_LINKDOWN 1
+#define VENET_FUNC_MACQUERY 2
+#define VENET_FUNC_NEGCAP 3 /* negotiate capabilities */
+#define VENET_FUNC_FLUSHRX 4
+#define VENET_FUNC_PMTDQUERY 5
+#define VENET_FUNC_EVQQUERY 6
+#define VENET_FUNC_L4ROQUERY 7
+
+#endif /* _LINUX_VENET_H */
diff --git a/include/linux/wlp.h b/include/linux/wlp.h
index c76fe2392506..b709ceff53f2 100644
--- a/include/linux/wlp.h
+++ b/include/linux/wlp.h
@@ -655,7 +655,7 @@ struct wlp {
struct mutex nbmutex; /* Neighbor mutex protects neighbors list */
struct list_head neighbors; /* Elements are wlp_neighbor_e */
struct uwb_notifs_handler uwb_notifs_handler;
- struct wlp_device_info *dev_info;
+ struct wlp_device_info *wdi;
void (*fill_device_info)(struct wlp *wlp, struct wlp_device_info *info);
int (*xmit_frame)(struct wlp *, struct sk_buff *,
struct uwb_dev_addr *);
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 2fd06c60ffbb..6a98b1b3bfde 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -1020,7 +1020,7 @@ struct cfg80211_pmksa {
* @cancel_remain_on_channel: Cancel an on-going remain-on-channel operation.
* This allows the operation to be terminated prior to timeout based on
* the duration value.
- * @action: Transmit an action frame
+ * @mgmt_tx: Transmit a management frame
*
* @testmode_cmd: run a test mode command
*
@@ -1172,7 +1172,7 @@ struct cfg80211_ops {
struct net_device *dev,
u64 cookie);
- int (*action)(struct wiphy *wiphy, struct net_device *dev,
+ int (*mgmt_tx)(struct wiphy *wiphy, struct net_device *dev,
struct ieee80211_channel *chan,
enum nl80211_channel_type channel_type,
bool channel_type_valid,
@@ -1236,6 +1236,10 @@ struct mac_address {
u8 addr[ETH_ALEN];
};
+struct ieee80211_txrx_stypes {
+ u16 tx, rx;
+};
+
/**
* struct wiphy - wireless hardware description
* @reg_notifier: the driver's regulatory notification callback
@@ -1286,6 +1290,10 @@ struct mac_address {
* @privid: a pointer that drivers can use to identify if an arbitrary
* wiphy is theirs, e.g. in global notifiers
* @bands: information about bands/channels supported by this device
+ *
+ * @mgmt_stypes: bitmasks of frame subtypes that can be subscribed to or
+ * transmitted through nl80211, points to an array indexed by interface
+ * type
*/
struct wiphy {
/* assign these fields before you register the wiphy */
@@ -1294,9 +1302,12 @@ struct wiphy {
u8 perm_addr[ETH_ALEN];
u8 addr_mask[ETH_ALEN];
- u16 n_addresses;
struct mac_address *addresses;
+ const struct ieee80211_txrx_stypes *mgmt_stypes;
+
+ u16 n_addresses;
+
/* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */
u16 interface_modes;
@@ -1492,8 +1503,8 @@ struct cfg80211_cached_keys;
* set by driver (if supported) on add_interface BEFORE registering the
* netdev and may otherwise be used by driver read-only, will be update
* by cfg80211 on change_interface
- * @action_registrations: list of registrations for action frames
- * @action_registrations_lock: lock for the list
+ * @mgmt_registrations: list of registrations for management frames
+ * @mgmt_registrations_lock: lock for the list
* @mtx: mutex used to lock data in this struct
* @cleanup_work: work struct used for cleanup that can't be done directly
*/
@@ -1505,8 +1516,8 @@ struct wireless_dev {
struct list_head list;
struct net_device *netdev;
- struct list_head action_registrations;
- spinlock_t action_registrations_lock;
+ struct list_head mgmt_registrations;
+ spinlock_t mgmt_registrations_lock;
struct mutex mtx;
@@ -1715,7 +1726,7 @@ unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb);
* ieee80211_hdrlen - get header length in bytes from frame control
* @fc: frame control field in little-endian format
*/
-unsigned int ieee80211_hdrlen(__le16 fc);
+unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc);
/**
* ieee80211_data_to_8023 - convert an 802.11 data frame to 802.3
@@ -2373,38 +2384,39 @@ void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
struct station_info *sinfo, gfp_t gfp);
/**
- * cfg80211_rx_action - notification of received, unprocessed Action frame
+ * cfg80211_rx_mgmt - notification of received, unprocessed management frame
* @dev: network device
* @freq: Frequency on which the frame was received in MHz
- * @buf: Action frame (header + body)
+ * @buf: Management frame (header + body)
* @len: length of the frame data
* @gfp: context flags
- * Returns %true if a user space application is responsible for rejecting the
- * unrecognized Action frame; %false if no such application is registered
- * (i.e., the driver is responsible for rejecting the unrecognized Action
- * frame)
+ *
+ * Returns %true if a user space application has registered for this frame.
+ * For action frames, that makes it responsible for rejecting unrecognized
+ * action frames; %false otherwise, in which case for action frames the
+ * driver is responsible for rejecting the frame.
*
* This function is called whenever an Action frame is received for a station
* mode interface, but is not processed in kernel.
*/
-bool cfg80211_rx_action(struct net_device *dev, int freq, const u8 *buf,
- size_t len, gfp_t gfp);
+bool cfg80211_rx_mgmt(struct net_device *dev, int freq, const u8 *buf,
+ size_t len, gfp_t gfp);
/**
- * cfg80211_action_tx_status - notification of TX status for Action frame
+ * cfg80211_mgmt_tx_status - notification of TX status for management frame
* @dev: network device
- * @cookie: Cookie returned by cfg80211_ops::action()
- * @buf: Action frame (header + body)
+ * @cookie: Cookie returned by cfg80211_ops::mgmt_tx()
+ * @buf: Management frame (header + body)
* @len: length of the frame data
* @ack: Whether frame was acknowledged
* @gfp: context flags
*
- * This function is called whenever an Action frame was requested to be
- * transmitted with cfg80211_ops::action() to report the TX status of the
+ * This function is called whenever a management frame was requested to be
+ * transmitted with cfg80211_ops::mgmt_tx() to report the TX status of the
* transmission attempt.
*/
-void cfg80211_action_tx_status(struct net_device *dev, u64 cookie,
- const u8 *buf, size_t len, bool ack, gfp_t gfp);
+void cfg80211_mgmt_tx_status(struct net_device *dev, u64 cookie,
+ const u8 *buf, size_t len, bool ack, gfp_t gfp);
/**
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index b0787a1dea90..914c747ac3a0 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -149,6 +149,7 @@ struct ieee80211_low_level_stats {
* @BSS_CHANGED_ARP_FILTER: Hardware ARP filter address list or state changed.
* @BSS_CHANGED_QOS: QoS for this association was enabled/disabled. Note
* that it is only ever disabled for station mode.
+ * @BSS_CHANGED_IDLE: Idle changed for this BSS/interface.
*/
enum ieee80211_bss_change {
BSS_CHANGED_ASSOC = 1<<0,
@@ -165,6 +166,7 @@ enum ieee80211_bss_change {
BSS_CHANGED_IBSS = 1<<11,
BSS_CHANGED_ARP_FILTER = 1<<12,
BSS_CHANGED_QOS = 1<<13,
+ BSS_CHANGED_IDLE = 1<<14,
/* when adding here, make sure to change ieee80211_reconfig */
};
@@ -223,6 +225,9 @@ enum ieee80211_bss_change {
* hardware must not perform any ARP filtering. Note, that the filter will
* be enabled also in promiscuous mode.
* @qos: This is a QoS-enabled BSS.
+ * @idle: This interface is idle. There's also a global idle flag in the
+ * hardware config which may be more appropriate depending on what
+ * your driver/device needs to do.
*/
struct ieee80211_bss_conf {
const u8 *bssid;
@@ -247,6 +252,7 @@ struct ieee80211_bss_conf {
u8 arp_addr_cnt;
bool arp_filter_enabled;
bool qos;
+ bool idle;
};
/**
@@ -783,20 +789,6 @@ static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif)
}
/**
- * enum ieee80211_key_alg - key algorithm
- * @ALG_WEP: WEP40 or WEP104
- * @ALG_TKIP: TKIP
- * @ALG_CCMP: CCMP (AES)
- * @ALG_AES_CMAC: AES-128-CMAC
- */
-enum ieee80211_key_alg {
- ALG_WEP,
- ALG_TKIP,
- ALG_CCMP,
- ALG_AES_CMAC,
-};
-
-/**
* enum ieee80211_key_flags - key flags
*
* These flags are used for communication about keys between the driver
@@ -833,7 +825,7 @@ enum ieee80211_key_flags {
* @hw_key_idx: To be set by the driver, this is the key index the driver
* wants to be given when a frame is transmitted and needs to be
* encrypted in hardware.
- * @alg: The key algorithm.
+ * @cipher: The key's cipher suite selector.
* @flags: key flags, see &enum ieee80211_key_flags.
* @keyidx: the key index (0-3)
* @keylen: key material length
@@ -846,7 +838,7 @@ enum ieee80211_key_flags {
* @iv_len: The IV length for this key type
*/
struct ieee80211_key_conf {
- enum ieee80211_key_alg alg;
+ u32 cipher;
u8 icv_len;
u8 iv_len;
u8 hw_key_idx;
@@ -1102,6 +1094,10 @@ enum ieee80211_hw_flags {
*
* @max_rates: maximum number of alternate rate retry stages
* @max_rate_tries: maximum number of tries for each stage
+ *
+ * @napi_weight: weight used for NAPI polling. You must specify an
+ * appropriate value here if a napi_poll operation is provided
+ * by your driver.
*/
struct ieee80211_hw {
struct ieee80211_conf conf;
@@ -1113,6 +1109,7 @@ struct ieee80211_hw {
int channel_change_time;
int vif_data_size;
int sta_data_size;
+ int napi_weight;
u16 queues;
u16 max_listen_interval;
s8 max_signal;
@@ -1687,6 +1684,8 @@ enum ieee80211_ampdu_mlme_action {
* switch operation for CSAs received from the AP may implement this
* callback. They must then call ieee80211_chswitch_done() to indicate
* completion of the channel switch.
+ *
+ * @napi_poll: Poll Rx queue for incoming data frames.
*/
struct ieee80211_ops {
int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb);
@@ -1752,6 +1751,7 @@ struct ieee80211_ops {
void (*flush)(struct ieee80211_hw *hw, bool drop);
void (*channel_switch)(struct ieee80211_hw *hw,
struct ieee80211_channel_switch *ch_switch);
+ int (*napi_poll)(struct ieee80211_hw *hw, int budget);
};
/**
@@ -1897,6 +1897,22 @@ void ieee80211_free_hw(struct ieee80211_hw *hw);
*/
void ieee80211_restart_hw(struct ieee80211_hw *hw);
+/** ieee80211_napi_schedule - schedule NAPI poll
+ *
+ * Use this function to schedule NAPI polling on a device.
+ *
+ * @hw: the hardware to start polling
+ */
+void ieee80211_napi_schedule(struct ieee80211_hw *hw);
+
+/** ieee80211_napi_complete - complete NAPI polling
+ *
+ * Use this function to finish NAPI polling on a device.
+ *
+ * @hw: the hardware to stop polling
+ */
+void ieee80211_napi_complete(struct ieee80211_hw *hw);
+
/**
* ieee80211_rx - receive frame
*
@@ -2518,6 +2534,18 @@ void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
*/
void ieee80211_chswitch_done(struct ieee80211_vif *vif, bool success);
+/**
+ * ieee80211_request_smps - request SM PS transition
+ * @vif: &struct ieee80211_vif pointer from the add_interface callback.
+ * @mode: new SM PS mode
+ *
+ * This allows the driver to request an SM PS transition in managed
+ * mode. This is useful when the driver has more information than
+ * the stack about possible interference, for example by bluetooth.
+ */
+void ieee80211_request_smps(struct ieee80211_vif *vif,
+ enum ieee80211_smps_mode smps_mode);
+
/* Rate control API */
/**
diff --git a/include/sound/sh_fsi.h b/include/sound/sh_fsi.h
index 9d51d6f35893..3fd6456d07d7 100644
--- a/include/sound/sh_fsi.h
+++ b/include/sound/sh_fsi.h
@@ -114,7 +114,7 @@ struct sh_fsi_platform_info {
int (*set_rate)(int is_porta, int rate); /* for master mode */
};
-extern struct snd_soc_dai fsi_soc_dai[2];
-extern struct snd_soc_platform fsi_soc_platform;
+extern struct snd_soc_dai_driver fsi_soc_dai[2];
+extern struct snd_soc_platform_driver fsi_soc_platform;
#endif /* __SOUND_FSI_H */
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
index 377693a14385..e7b680248006 100644
--- a/include/sound/soc-dai.h
+++ b/include/sound/soc-dai.h
@@ -91,15 +91,17 @@ struct snd_pcm_substream;
SNDRV_PCM_FMTBIT_S32_LE |\
SNDRV_PCM_FMTBIT_S32_BE)
-struct snd_soc_dai_ops;
+struct snd_soc_dai_driver;
struct snd_soc_dai;
struct snd_ac97_bus_ops;
/* Digital Audio Interface registration */
-int snd_soc_register_dai(struct snd_soc_dai *dai);
-void snd_soc_unregister_dai(struct snd_soc_dai *dai);
-int snd_soc_register_dais(struct snd_soc_dai *dai, size_t count);
-void snd_soc_unregister_dais(struct snd_soc_dai *dai, size_t count);
+int snd_soc_register_dai(struct device *dev,
+ struct snd_soc_dai_driver *dai_drv);
+void snd_soc_unregister_dai(struct device *dev);
+int snd_soc_register_dais(struct device *dev,
+ struct snd_soc_dai_driver *dai_drv, size_t count);
+void snd_soc_unregister_dais(struct device *dev, size_t count);
/* Digital Audio Interface clocking API.*/
int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
@@ -126,16 +128,6 @@ int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);
/* Digital Audio Interface mute */
int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute);
-/*
- * Digital Audio Interface.
- *
- * Describes the Digital Audio Interface in terms of its ALSA, DAI and AC97
- * operations and capabilities. Codec and platform drivers will register this
- * structure for every DAI they have.
- *
- * This structure covers the clocking, formating and ALSA operations for each
- * interface.
- */
struct snd_soc_dai_ops {
/*
* DAI clocking configuration, all optional.
@@ -191,24 +183,24 @@ struct snd_soc_dai_ops {
};
/*
- * Digital Audio Interface runtime data.
+ * Digital Audio Interface Driver.
*
- * Holds runtime data for a DAI.
+ * Describes the Digital Audio Interface in terms of its ALSA, DAI and AC97
+ * operations and capabilities. Codec and platform drivers will register this
+ * structure for every DAI they have.
+ *
+ * This structure covers the clocking, formating and ALSA operations for each
+ * interface.
*/
-struct snd_soc_dai {
+struct snd_soc_dai_driver {
/* DAI description */
- char *name;
+ const char *name;
unsigned int id;
int ac97_control;
- struct device *dev;
- void *ac97_pdata; /* platform_data for the ac97 codec */
-
- /* DAI callbacks */
- int (*probe)(struct platform_device *pdev,
- struct snd_soc_dai *dai);
- void (*remove)(struct platform_device *pdev,
- struct snd_soc_dai *dai);
+ /* DAI driver callbacks */
+ int (*probe)(struct snd_soc_dai *dai);
+ int (*remove)(struct snd_soc_dai *dai);
int (*suspend)(struct snd_soc_dai *dai);
int (*resume)(struct snd_soc_dai *dai);
@@ -219,26 +211,51 @@ struct snd_soc_dai {
struct snd_soc_pcm_stream capture;
struct snd_soc_pcm_stream playback;
unsigned int symmetric_rates:1;
+};
+
+/*
+ * Digital Audio Interface runtime data.
+ *
+ * Holds runtime data for a DAI.
+ */
+struct snd_soc_dai {
+ const char *name;
+ int id;
+ struct device *dev;
+ void *ac97_pdata; /* platform_data for the ac97 codec */
+
+ /* driver ops */
+ struct snd_soc_dai_driver *driver;
/* DAI runtime info */
- struct snd_soc_codec *codec;
+ unsigned int capture_active:1; /* stream is in use */
+ unsigned int playback_active:1; /* stream is in use */
+ unsigned int symmetric_rates:1;
+ struct snd_pcm_runtime *runtime;
unsigned int active;
unsigned char pop_wait:1;
+ unsigned char probed:1;
- /* DAI private data */
- void *private_data;
+ /* DAI DMA data */
+ void *playback_dma_data;
+ void *capture_dma_data;
- /* parent platform */
- struct snd_soc_platform *platform;
+ /* parent platform/codec */
+ union {
+ struct snd_soc_platform *platform;
+ struct snd_soc_codec *codec;
+ };
+ struct snd_soc_card *card;
struct list_head list;
+ struct list_head card_list;
};
static inline void *snd_soc_dai_get_dma_data(const struct snd_soc_dai *dai,
const struct snd_pcm_substream *ss)
{
return (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
- dai->playback.dma_data : dai->capture.dma_data;
+ dai->playback_dma_data : dai->capture_dma_data;
}
static inline void snd_soc_dai_set_dma_data(struct snd_soc_dai *dai,
@@ -246,9 +263,20 @@ static inline void snd_soc_dai_set_dma_data(struct snd_soc_dai *dai,
void *data)
{
if (ss->stream == SNDRV_PCM_STREAM_PLAYBACK)
- dai->playback.dma_data = data;
+ dai->playback_dma_data = data;
else
- dai->capture.dma_data = data;
+ dai->capture_dma_data = data;
+}
+
+static inline void snd_soc_dai_set_drvdata(struct snd_soc_dai *dai,
+ void *data)
+{
+ dev_set_drvdata(dai->dev, data);
+}
+
+static inline void *snd_soc_dai_get_drvdata(struct snd_soc_dai *dai)
+{
+ return dev_get_drvdata(dai->dev);
}
#endif
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h
index c5d9987bc897..c4a445651ca0 100644
--- a/include/sound/soc-dapm.h
+++ b/include/sound/soc-dapm.h
@@ -322,14 +322,14 @@ int snd_soc_dapm_new_controls(struct snd_soc_codec *codec,
/* dapm path setup */
int snd_soc_dapm_new_widgets(struct snd_soc_codec *codec);
-void snd_soc_dapm_free(struct snd_soc_device *socdev);
+void snd_soc_dapm_free(struct snd_soc_codec *codec);
int snd_soc_dapm_add_routes(struct snd_soc_codec *codec,
const struct snd_soc_dapm_route *route, int num);
/* dapm events */
-int snd_soc_dapm_stream_event(struct snd_soc_codec *codec, char *stream,
- int event);
-void snd_soc_dapm_shutdown(struct snd_soc_device *socdev);
+int snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd,
+ const char *stream, int event);
+void snd_soc_dapm_shutdown(struct snd_soc_card *card);
/* dapm sys fs - used by the core */
int snd_soc_dapm_sys_add(struct device *dev);
diff --git a/include/sound/soc-of-simple.h b/include/sound/soc-of-simple.h
deleted file mode 100644
index a064e1934a56..000000000000
--- a/include/sound/soc-of-simple.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * OF helpers for ALSA SoC
- *
- * Copyright (C) 2008, Secret Lab Technologies Ltd.
- */
-
-#ifndef _INCLUDE_SOC_OF_H_
-#define _INCLUDE_SOC_OF_H_
-
-#if defined(CONFIG_SND_SOC_OF_SIMPLE) || defined(CONFIG_SND_SOC_OF_SIMPLE_MODULE)
-
-#include <linux/of.h>
-#include <sound/soc.h>
-
-int of_snd_soc_register_codec(struct snd_soc_codec_device *codec_dev,
- void *codec_data, struct snd_soc_dai *dai,
- struct device_node *node);
-
-int of_snd_soc_register_platform(struct snd_soc_platform *platform,
- struct device_node *node,
- struct snd_soc_dai *cpu_dai);
-
-#endif
-
-#endif /* _INCLUDE_SOC_OF_H_ */
diff --git a/include/sound/soc.h b/include/sound/soc.h
index 65e9d03ed4f5..d31e8b7b2d5e 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -228,13 +228,17 @@ struct snd_soc_ops;
struct snd_soc_dai_mode;
struct snd_soc_pcm_runtime;
struct snd_soc_dai;
+struct snd_soc_dai_driver;
struct snd_soc_platform;
struct snd_soc_dai_link;
+struct snd_soc_platform_driver;
struct snd_soc_codec;
+struct snd_soc_codec_driver;
struct soc_enum;
struct snd_soc_ac97_ops;
struct snd_soc_jack;
struct snd_soc_jack_pin;
+
#ifdef CONFIG_GPIOLIB
struct snd_soc_jack_gpio;
#endif
@@ -249,19 +253,18 @@ enum snd_soc_control_type {
SND_SOC_SPI,
};
-int snd_soc_register_platform(struct snd_soc_platform *platform);
-void snd_soc_unregister_platform(struct snd_soc_platform *platform);
-int snd_soc_register_codec(struct snd_soc_codec *codec);
-void snd_soc_unregister_codec(struct snd_soc_codec *codec);
+int snd_soc_register_platform(struct device *dev,
+ struct snd_soc_platform_driver *platform_drv);
+void snd_soc_unregister_platform(struct device *dev);
+int snd_soc_register_codec(struct device *dev,
+ struct snd_soc_codec_driver *codec_drv,
+ struct snd_soc_dai_driver *dai_drv, int num_dai);
+void snd_soc_unregister_codec(struct device *dev);
int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg);
int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
int addr_bits, int data_bits,
enum snd_soc_control_type control);
-/* pcm <-> DAI connect */
-void snd_soc_free_pcms(struct snd_soc_device *socdev);
-int snd_soc_new_pcms(struct snd_soc_device *socdev, int idx, const char *xid);
-
/* Utility functions to get clock rates from various things */
int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots);
int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params);
@@ -273,7 +276,7 @@ int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
const struct snd_pcm_hardware *hw);
/* Jack reporting */
-int snd_soc_jack_new(struct snd_soc_card *card, const char *id, int type,
+int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type,
struct snd_soc_jack *jack);
void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask);
int snd_soc_jack_add_pins(struct snd_soc_jack *jack, int count,
@@ -390,7 +393,7 @@ struct snd_soc_jack_gpio {
struct snd_soc_jack {
struct snd_jack *jack;
- struct snd_soc_card *card;
+ struct snd_soc_codec *codec;
struct list_head pins;
int status;
struct blocking_notifier_head notifier;
@@ -398,15 +401,13 @@ struct snd_soc_jack {
/* SoC PCM stream information */
struct snd_soc_pcm_stream {
- char *stream_name;
+ const char *stream_name;
u64 formats; /* SNDRV_PCM_FMTBIT_* */
unsigned int rates; /* SNDRV_PCM_RATE_* */
unsigned int rate_min; /* min rate */
unsigned int rate_max; /* max rate */
unsigned int channels_min; /* min channels */
unsigned int channels_max; /* max channels */
- unsigned int active; /* stream is in use */
- void *dma_data; /* used by platform code */
};
/* SoC audio ops */
@@ -419,44 +420,35 @@ struct snd_soc_ops {
int (*trigger)(struct snd_pcm_substream *, int);
};
-/* SoC Audio Codec */
+/* SoC Audio Codec device */
struct snd_soc_codec {
- char *name;
- struct module *owner;
- struct mutex mutex;
+ const char *name;
+ int id;
struct device *dev;
- struct snd_soc_device *socdev;
+ struct snd_soc_codec_driver *driver;
+ struct mutex mutex;
+ struct snd_soc_card *card;
struct list_head list;
-
- /* callbacks */
- int (*set_bias_level)(struct snd_soc_codec *,
- enum snd_soc_bias_level level);
+ struct list_head card_list;
+ int num_dai;
/* runtime */
- struct snd_card *card;
struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */
unsigned int active;
- unsigned int pcm_devs;
- void *drvdata;
+ unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */
+ unsigned int cache_only:1; /* Suppress writes to hardware */
+ unsigned int cache_sync:1; /* Cache needs to be synced to hardware */
+ unsigned int suspended:1; /* Codec is in suspend PM state */
+ unsigned int probed:1; /* Codec has been probed */
+ unsigned int ac97_registered:1; /* Codec has been AC97 registered */
+ unsigned int sysfs_registered:1; /* codec has been sysfs registered */
/* codec IO */
void *control_data; /* codec control (i2c/3wire) data */
- unsigned int (*read)(struct snd_soc_codec *, unsigned int);
- int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
- int (*display_register)(struct snd_soc_codec *, char *,
- size_t, unsigned int);
- int (*volatile_register)(unsigned int);
- int (*readable_register)(unsigned int);
hw_write_t hw_write;
unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int);
void *reg_cache;
- short reg_cache_size;
- short reg_cache_step;
-
- unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */
- unsigned int cache_only:1; /* Suppress writes to hardware */
- unsigned int cache_sync:1; /* Cache needs to be synced to hardware */
/* dapm */
u32 pop_time;
@@ -466,10 +458,6 @@ struct snd_soc_codec {
enum snd_soc_bias_level suspend_bias_level;
struct delayed_work delayed_work;
- /* codec DAI's */
- struct snd_soc_dai *dai;
- unsigned int num_dai;
-
#ifdef CONFIG_DEBUG_FS
struct dentry *debugfs_codec_root;
struct dentry *debugfs_reg;
@@ -478,23 +466,40 @@ struct snd_soc_codec {
#endif
};
-/* codec device */
-struct snd_soc_codec_device {
- int (*probe)(struct platform_device *pdev);
- int (*remove)(struct platform_device *pdev);
- int (*suspend)(struct platform_device *pdev, pm_message_t state);
- int (*resume)(struct platform_device *pdev);
+/* codec driver */
+struct snd_soc_codec_driver {
+
+ /* driver ops */
+ int (*probe)(struct snd_soc_codec *);
+ int (*remove)(struct snd_soc_codec *);
+ int (*suspend)(struct snd_soc_codec *,
+ pm_message_t state);
+ int (*resume)(struct snd_soc_codec *);
+
+ /* codec IO */
+ unsigned int (*read)(struct snd_soc_codec *, unsigned int);
+ int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
+ int (*display_register)(struct snd_soc_codec *, char *,
+ size_t, unsigned int);
+ int (*volatile_register)(unsigned int);
+ int (*readable_register)(unsigned int);
+ short reg_cache_size;
+ short reg_cache_step;
+ short reg_word_size;
+ const void *reg_cache_default;
+
+ /* codec bias level */
+ int (*set_bias_level)(struct snd_soc_codec *,
+ enum snd_soc_bias_level level);
};
/* SoC platform interface */
-struct snd_soc_platform {
- char *name;
- struct list_head list;
+struct snd_soc_platform_driver {
- int (*probe)(struct platform_device *pdev);
- int (*remove)(struct platform_device *pdev);
- int (*suspend)(struct snd_soc_dai_link *dai_link);
- int (*resume)(struct snd_soc_dai_link *dai_link);
+ int (*probe)(struct snd_soc_platform *);
+ int (*remove)(struct snd_soc_platform *);
+ int (*suspend)(struct snd_soc_dai *dai);
+ int (*resume)(struct snd_soc_dai *dai);
/* pcm creation and destruction */
int (*pcm_new)(struct snd_card *, struct snd_soc_dai *,
@@ -509,23 +514,31 @@ struct snd_soc_platform {
struct snd_soc_dai *);
/* platform stream ops */
- struct snd_pcm_ops *pcm_ops;
+ struct snd_pcm_ops *ops;
};
-/* SoC machine DAI configuration, glues a codec and cpu DAI together */
-struct snd_soc_dai_link {
- char *name; /* Codec name */
- char *stream_name; /* Stream name */
+struct snd_soc_platform {
+ const char *name;
+ int id;
+ struct device *dev;
+ struct snd_soc_platform_driver *driver;
- /* DAI */
- struct snd_soc_dai *codec_dai;
- struct snd_soc_dai *cpu_dai;
+ unsigned int suspended:1; /* platform is suspended */
+ unsigned int probed:1;
- /* machine stream operations */
- struct snd_soc_ops *ops;
+ struct snd_soc_card *card;
+ struct list_head list;
+ struct list_head card_list;
+};
- /* codec/machine specific init - e.g. add machine controls */
- int (*init)(struct snd_soc_codec *codec);
+struct snd_soc_dai_link {
+ /* config - must be set by machine driver */
+ const char *name; /* Codec name */
+ const char *stream_name; /* Stream name */
+ const char *codec_name; /* for multi-codec */
+ const char *platform_name; /* for multi-platform */
+ const char *cpu_dai_name;
+ const char *codec_dai_name;
/* Keep DAI active over suspend */
unsigned int ignore_suspend:1;
@@ -533,21 +546,24 @@ struct snd_soc_dai_link {
/* Symmetry requirements */
unsigned int symmetric_rates:1;
- /* Symmetry data - only valid if symmetry is being enforced */
- unsigned int rate;
+ /* codec/machine specific init - e.g. add machine controls */
+ int (*init)(struct snd_soc_pcm_runtime *rtd);
- /* DAI pcm */
- struct snd_pcm *pcm;
+ /* machine stream operations */
+ struct snd_soc_ops *ops;
};
/* SoC card */
struct snd_soc_card {
- char *name;
+ const char *name;
struct device *dev;
+ struct snd_card *snd_card;
+ struct module *owner;
struct list_head list;
+ struct mutex mutex;
- int instantiated;
+ bool instantiated;
int (*probe)(struct platform_device *pdev);
int (*remove)(struct platform_device *pdev);
@@ -568,28 +584,38 @@ struct snd_soc_card {
/* CPU <--> Codec DAI links */
struct snd_soc_dai_link *dai_link;
int num_links;
+ struct snd_soc_pcm_runtime *rtd;
+ int num_rtd;
- struct snd_soc_device *socdev;
-
- struct snd_soc_codec *codec;
-
- struct snd_soc_platform *platform;
- struct delayed_work delayed_work;
struct work_struct deferred_resume_work;
+
+ /* lists of probed devices belonging to this card */
+ struct list_head codec_dev_list;
+ struct list_head platform_dev_list;
+ struct list_head dai_dev_list;
};
-/* SoC Device - the audio subsystem */
-struct snd_soc_device {
- struct device *dev;
+/* SoC machine DAI configuration, glues a codec and cpu DAI together */
+struct snd_soc_pcm_runtime {
+ struct device dev;
struct snd_soc_card *card;
- struct snd_soc_codec_device *codec_dev;
- void *codec_data;
-};
+ struct snd_soc_dai_link *dai_link;
+
+ unsigned int complete:1;
+ unsigned int dev_registered:1;
-/* runtime channel data */
-struct snd_soc_pcm_runtime {
- struct snd_soc_dai_link *dai;
- struct snd_soc_device *socdev;
+ /* Symmetry data - only valid if symmetry is being enforced */
+ unsigned int rate;
+ long pmdown_time;
+
+ /* runtime devices */
+ struct snd_pcm *pcm;
+ struct snd_soc_codec *codec;
+ struct snd_soc_platform *platform;
+ struct snd_soc_dai *codec_dai;
+ struct snd_soc_dai *cpu_dai;
+
+ struct delayed_work delayed_work;
};
/* mixer control */
@@ -615,24 +641,48 @@ struct soc_enum {
static inline unsigned int snd_soc_read(struct snd_soc_codec *codec,
unsigned int reg)
{
- return codec->read(codec, reg);
+ return codec->driver->read(codec, reg);
}
static inline unsigned int snd_soc_write(struct snd_soc_codec *codec,
unsigned int reg, unsigned int val)
{
- return codec->write(codec, reg, val);
+ return codec->driver->write(codec, reg, val);
}
+/* device driver data */
+
static inline void snd_soc_codec_set_drvdata(struct snd_soc_codec *codec,
- void *data)
+ void *data)
{
- codec->drvdata = data;
+ dev_set_drvdata(codec->dev, data);
}
static inline void *snd_soc_codec_get_drvdata(struct snd_soc_codec *codec)
{
- return codec->drvdata;
+ return dev_get_drvdata(codec->dev);
+}
+
+static inline void snd_soc_platform_set_drvdata(struct snd_soc_platform *platform,
+ void *data)
+{
+ dev_set_drvdata(platform->dev, data);
+}
+
+static inline void *snd_soc_platform_get_drvdata(struct snd_soc_platform *platform)
+{
+ return dev_get_drvdata(platform->dev);
+}
+
+static inline void snd_soc_pcm_set_drvdata(struct snd_soc_pcm_runtime *rtd,
+ void *data)
+{
+ dev_set_drvdata(&rtd->dev, data);
+}
+
+static inline void *snd_soc_pcm_get_drvdata(struct snd_soc_pcm_runtime *rtd)
+{
+ return dev_get_drvdata(&rtd->dev);
}
#include <sound/soc-dai.h>
diff --git a/include/sound/tlv320aic3x.h b/include/sound/tlv320aic3x.h
index b1a5f34e5cfa..99e0308bf2c2 100644
--- a/include/sound/tlv320aic3x.h
+++ b/include/sound/tlv320aic3x.h
@@ -10,8 +10,49 @@
#ifndef __TLV320AIC3x_H__
#define __TLV320AIC3x_H__
+/* GPIO API */
+enum {
+ AIC3X_GPIO1_FUNC_DISABLED = 0,
+ AIC3X_GPIO1_FUNC_AUDIO_WORDCLK_ADC = 1,
+ AIC3X_GPIO1_FUNC_CLOCK_MUX = 2,
+ AIC3X_GPIO1_FUNC_CLOCK_MUX_DIV2 = 3,
+ AIC3X_GPIO1_FUNC_CLOCK_MUX_DIV4 = 4,
+ AIC3X_GPIO1_FUNC_CLOCK_MUX_DIV8 = 5,
+ AIC3X_GPIO1_FUNC_SHORT_CIRCUIT_IRQ = 6,
+ AIC3X_GPIO1_FUNC_AGC_NOISE_IRQ = 7,
+ AIC3X_GPIO1_FUNC_INPUT = 8,
+ AIC3X_GPIO1_FUNC_OUTPUT = 9,
+ AIC3X_GPIO1_FUNC_DIGITAL_MIC_MODCLK = 10,
+ AIC3X_GPIO1_FUNC_AUDIO_WORDCLK = 11,
+ AIC3X_GPIO1_FUNC_BUTTON_IRQ = 12,
+ AIC3X_GPIO1_FUNC_HEADSET_DETECT_IRQ = 13,
+ AIC3X_GPIO1_FUNC_HEADSET_DETECT_OR_BUTTON_IRQ = 14,
+ AIC3X_GPIO1_FUNC_ALL_IRQ = 16
+};
+
+enum {
+ AIC3X_GPIO2_FUNC_DISABLED = 0,
+ AIC3X_GPIO2_FUNC_HEADSET_DETECT_IRQ = 2,
+ AIC3X_GPIO2_FUNC_INPUT = 3,
+ AIC3X_GPIO2_FUNC_OUTPUT = 4,
+ AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT = 5,
+ AIC3X_GPIO2_FUNC_AUDIO_BITCLK = 8,
+ AIC3X_GPIO2_FUNC_HEADSET_DETECT_OR_BUTTON_IRQ = 9,
+ AIC3X_GPIO2_FUNC_ALL_IRQ = 10,
+ AIC3X_GPIO2_FUNC_SHORT_CIRCUIT_OR_AGC_IRQ = 11,
+ AIC3X_GPIO2_FUNC_HEADSET_OR_BUTTON_PRESS_OR_SHORT_CIRCUIT_IRQ = 12,
+ AIC3X_GPIO2_FUNC_SHORT_CIRCUIT_IRQ = 13,
+ AIC3X_GPIO2_FUNC_AGC_NOISE_IRQ = 14,
+ AIC3X_GPIO2_FUNC_BUTTON_PRESS_IRQ = 15
+};
+
+struct aic3x_setup_data {
+ unsigned int gpio_func[2];
+};
+
struct aic3x_pdata {
int gpio_reset; /* < 0 if not used */
+ struct aic3x_setup_data *setup;
};
-#endif \ No newline at end of file
+#endif
diff --git a/include/sound/wm8962.h b/include/sound/wm8962.h
new file mode 100644
index 000000000000..f70258e3471c
--- /dev/null
+++ b/include/sound/wm8962.h
@@ -0,0 +1,23 @@
+/*
+ * wm8962.h -- WM8962 Soc Audio driver platform data
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef _WM8962_PDATA_H
+#define _WM8962_PDATA_H
+
+#define WM8962_MAX_GPIO 6
+
+/* Use to set GPIO default values to zero */
+#define WM8962_GPIO_SET 0x10000
+
+struct wm8962_pdata {
+ u32 gpio_init[WM8962_MAX_GPIO];
+
+ bool spk_mono; /* Speaker outputs tied together as mono */
+};
+
+#endif
diff --git a/include/video/vga.h b/include/video/vga.h
index b49a5120ca2d..2b8691f7d256 100644
--- a/include/video/vga.h
+++ b/include/video/vga.h
@@ -5,7 +5,7 @@
*
* Copyright history from vga16fb.c:
* Copyright 1999 Ben Pfaff and Petr Vandrovec
- * Based on VGA info at http://www.goodnet.com/~tinara/FreeVGA/home.htm
+ * Based on VGA info at http://www.osdever.net/FreeVGA/home.htm
* Based on VESA framebuffer (c) 1998 Gerd Knorr
*
* This file is subject to the terms and conditions of the GNU General
diff --git a/kernel/debug/kdb/kdb_private.h b/kernel/debug/kdb/kdb_private.h
index c438f545a321..be775f7e81e0 100644
--- a/kernel/debug/kdb/kdb_private.h
+++ b/kernel/debug/kdb/kdb_private.h
@@ -255,7 +255,14 @@ extern void kdb_ps1(const struct task_struct *p);
extern void kdb_print_nameval(const char *name, unsigned long val);
extern void kdb_send_sig_info(struct task_struct *p, struct siginfo *info);
extern void kdb_meminfo_proc_show(void);
+#ifdef CONFIG_KALLSYMS
extern const char *kdb_walk_kallsyms(loff_t *pos);
+#else /* ! CONFIG_KALLSYMS */
+static inline const char *kdb_walk_kallsyms(loff_t *pos)
+{
+ return NULL;
+}
+#endif /* ! CONFIG_KALLSYMS */
extern char *kdb_getstr(char *, size_t, char *);
/* Defines for kdb_symbol_print */
diff --git a/kernel/debug/kdb/kdb_support.c b/kernel/debug/kdb/kdb_support.c
index 45344d5c53dd..6b2485dcb050 100644
--- a/kernel/debug/kdb/kdb_support.c
+++ b/kernel/debug/kdb/kdb_support.c
@@ -82,8 +82,8 @@ static char *kdb_name_table[100]; /* arbitrary size */
int kdbnearsym(unsigned long addr, kdb_symtab_t *symtab)
{
int ret = 0;
- unsigned long symbolsize;
- unsigned long offset;
+ unsigned long symbolsize = 0;
+ unsigned long offset = 0;
#define knt1_size 128 /* must be >= kallsyms table size */
char *knt1 = NULL;
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index b7091d5ca2f8..45a87f57ade7 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -40,8 +40,6 @@ static void dynamic_irq_init_x(unsigned int irq, bool keep_chip_data)
if (!keep_chip_data)
desc->chip_data = NULL;
desc->action = NULL;
- desc->irq_count = 0;
- desc->irqs_unhandled = 0;
#ifdef CONFIG_SMP
cpumask_setall(desc->affinity);
#ifdef CONFIG_GENERIC_PENDING_IRQ
@@ -406,8 +404,7 @@ void handle_nested_irq(unsigned int irq)
raw_spin_unlock_irq(&desc->lock);
action_ret = action->thread_fn(action->irq, action->dev_id);
- if (!noirqdebug)
- note_interrupt(irq, desc, action_ret);
+ note_interrupt(irq, desc, action_ret);
raw_spin_lock_irq(&desc->lock);
desc->status &= ~IRQ_INPROGRESS;
@@ -450,8 +447,7 @@ handle_simple_irq(unsigned int irq, struct irq_desc *desc)
raw_spin_unlock(&desc->lock);
action_ret = handle_IRQ_event(irq, action);
- if (!noirqdebug)
- note_interrupt(irq, desc, action_ret);
+ note_interrupt(irq, desc, action_ret);
raw_spin_lock(&desc->lock);
desc->status &= ~IRQ_INPROGRESS;
@@ -495,8 +491,7 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc)
raw_spin_unlock(&desc->lock);
action_ret = handle_IRQ_event(irq, action);
- if (!noirqdebug)
- note_interrupt(irq, desc, action_ret);
+ note_interrupt(irq, desc, action_ret);
raw_spin_lock(&desc->lock);
desc->status &= ~IRQ_INPROGRESS;
@@ -548,8 +543,7 @@ handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc)
raw_spin_unlock(&desc->lock);
action_ret = handle_IRQ_event(irq, action);
- if (!noirqdebug)
- note_interrupt(irq, desc, action_ret);
+ note_interrupt(irq, desc, action_ret);
raw_spin_lock(&desc->lock);
desc->status &= ~IRQ_INPROGRESS;
@@ -625,8 +619,7 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc)
desc->status &= ~IRQ_PENDING;
raw_spin_unlock(&desc->lock);
action_ret = handle_IRQ_event(irq, action);
- if (!noirqdebug)
- note_interrupt(irq, desc, action_ret);
+ note_interrupt(irq, desc, action_ret);
raw_spin_lock(&desc->lock);
} while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING);
@@ -654,8 +647,7 @@ handle_percpu_irq(unsigned int irq, struct irq_desc *desc)
desc->chip->ack(irq);
action_ret = handle_IRQ_event(irq, desc->action);
- if (!noirqdebug)
- note_interrupt(irq, desc, action_ret);
+ note_interrupt(irq, desc, action_ret);
if (desc->chip->eoi)
desc->chip->eoi(irq);
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
index 27e5c6911223..685c3b3cf465 100644
--- a/kernel/irq/handle.c
+++ b/kernel/irq/handle.c
@@ -416,6 +416,7 @@ irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action)
}
retval |= ret;
+ action->watch.last_ret = ret;
action = action->next;
} while (action);
@@ -461,8 +462,7 @@ unsigned int __do_IRQ(unsigned int irq)
desc->chip->ack(irq);
if (likely(!(desc->status & IRQ_DISABLED))) {
action_ret = handle_IRQ_event(irq, desc->action);
- if (!noirqdebug)
- note_interrupt(irq, desc, action_ret);
+ note_interrupt(irq, desc, action_ret);
}
desc->chip->end(irq);
return 1;
@@ -515,8 +515,7 @@ unsigned int __do_IRQ(unsigned int irq)
raw_spin_unlock(&desc->lock);
action_ret = handle_IRQ_event(irq, action);
- if (!noirqdebug)
- note_interrupt(irq, desc, action_ret);
+ note_interrupt(irq, desc, action_ret);
raw_spin_lock(&desc->lock);
if (likely(!(desc->status & IRQ_PENDING)))
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h
index c63f3bc88f0b..1b24309a0404 100644
--- a/kernel/irq/internals.h
+++ b/kernel/irq/internals.h
@@ -2,8 +2,6 @@
* IRQ subsystem internal functions and variables:
*/
-extern int noirqdebug;
-
/* Set default functions for irq_chip structures: */
extern void irq_chip_set_defaults(struct irq_chip *chip);
@@ -40,6 +38,12 @@ extern int irq_select_affinity_usr(unsigned int irq);
extern void irq_set_thread_affinity(struct irq_desc *desc);
+extern void poll_irq(unsigned long arg);
+extern void irq_poll_action_added(struct irq_desc *desc,
+ struct irqaction *action);
+extern void irq_poll_action_removed(struct irq_desc *desc,
+ struct irqaction *action);
+
/* Inline functions for support of irq chips on slow busses */
static inline void chip_bus_lock(unsigned int irq, struct irq_desc *desc)
{
@@ -64,7 +68,7 @@ static inline void chip_bus_sync_unlock(unsigned int irq, struct irq_desc *desc)
static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
{
printk("irq %d, desc: %p, depth: %d, count: %d, unhandled: %d\n",
- irq, desc, desc->depth, desc->irq_count, desc->irqs_unhandled);
+ irq, desc, desc->depth, desc->spr.nr_samples, desc->spr.nr_bad);
printk("->handle_irq(): %p, ", desc->handle_irq);
print_symbol("%s\n", (unsigned long)desc->handle_irq);
printk("->chip(): %p, ", desc->chip);
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index c3003e9d91a3..8533e32d91d2 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -755,6 +755,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
irq_chip_set_defaults(desc->chip);
init_waitqueue_head(&desc->wait_for_threads);
+ setup_timer(&desc->poll_timer, poll_irq, (unsigned long)desc);
/* Setup the type (level, edge polarity) if configured: */
if (new->flags & IRQF_TRIGGER_MASK) {
@@ -803,21 +804,10 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
new->irq = irq;
*old_ptr = new;
- /* Reset broken irq detection when installing new handler */
- desc->irq_count = 0;
- desc->irqs_unhandled = 0;
-
- /*
- * Check whether we disabled the irq via the spurious handler
- * before. Reenable it and give it another chance.
- */
- if (shared && (desc->status & IRQ_SPURIOUS_DISABLED)) {
- desc->status &= ~IRQ_SPURIOUS_DISABLED;
- __enable_irq(desc, irq, false);
- }
-
raw_spin_unlock_irqrestore(&desc->lock, flags);
+ irq_poll_action_added(desc, new);
+
/*
* Strictly no need to wake it up, but hung_task complains
* when no hard interrupt wakes the thread up.
@@ -933,6 +923,8 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id)
raw_spin_unlock_irqrestore(&desc->lock, flags);
+ irq_poll_action_removed(desc, action);
+
unregister_handler_proc(irq, action);
/* Make sure it's not being used on another CPU: */
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c
index 09a2ee540bd2..b072460a602f 100644
--- a/kernel/irq/proc.c
+++ b/kernel/irq/proc.c
@@ -205,10 +205,11 @@ static const struct file_operations irq_node_proc_fops = {
static int irq_spurious_proc_show(struct seq_file *m, void *v)
{
struct irq_desc *desc = irq_to_desc((long) m->private);
+ struct irq_spr *spr = &desc->spr;
seq_printf(m, "count %u\n" "unhandled %u\n" "last_unhandled %u ms\n",
- desc->irq_count, desc->irqs_unhandled,
- jiffies_to_msecs(desc->last_unhandled));
+ spr->nr_samples, spr->nr_bad,
+ jiffies_to_msecs(spr->last_bad));
return 0;
}
diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c
index 89fb90ae534f..b34b023dab5b 100644
--- a/kernel/irq/spurious.c
+++ b/kernel/irq/spurious.c
@@ -2,33 +2,637 @@
* linux/kernel/irq/spurious.c
*
* Copyright (C) 1992, 1998-2004 Linus Torvalds, Ingo Molnar
+ * Copyright (C) 2010 SUSE Linux Products GmbH
+ * Copyright (C) 2010 Tejun Heo <tj@kernel.org>
*
- * This file contains spurious interrupt handling.
+ * There are two ways interrupt handling can go wrong - too few or too
+ * many. Due to misrouting or other issues, sometimes IRQs don't
+ * reach the driver while at other times an interrupt line gets stuck
+ * and a continuous spurious interrupts are generated.
+ *
+ * This file implements workaround for both cases. Lost interrupts
+ * are handled by IRQ expecting and watching, and spurious interrupts
+ * by spurious polling. All mechanisms need IRQF_SHARED to be set on
+ * the irqaction in question.
+ *
+ * Both lost interrupt workarounds require cooperation from drivers
+ * and can be chosen depending on how much information the driver can
+ * provide.
+ *
+ * - IRQ expecting
+ *
+ * IRQ expecting is useful when the driver can tell when IRQs can be
+ * expected; in other words, when IRQs are used to signal completion
+ * of host initiated operations. This is the surest way to work
+ * around lost interrupts.
+ *
+ * When the controller is expected to raise an IRQ, the driver
+ * should call expect_irq() and, when the expected event happens or
+ * times out, unexpect_irq(). IRQ subsystem polls the interrupt
+ * inbetween.
+ *
+ * As interrupts tend to keep working if it works at the beginning,
+ * IRQ expecting implements "verified state". After certain number
+ * of successful IRQ deliveries, the irqaction becomes verified and
+ * much longer polling interval is used.
+ *
+ * - IRQ watching
+ *
+ * This can be used when the driver doesn't know when to exactly
+ * expect and unexpect IRQs. Once watch_irq() is called, the
+ * irqaction is slowly polled for certain amount of time (1min). If
+ * IRQs are missed during that time, the irqaction is marked and
+ * actively polled; otherwise, the watching is stopped.
+ *
+ * In the most basic case, drivers can call this right after
+ * registering an irqaction to verify IRQ delivery. In many cases,
+ * if IRQ works at the beginning, it keeps working, so just calling
+ * watch_irq() once can provide decent protection against misrouted
+ * IRQs. It would also be a good idea to call watch_irq() when
+ * timeouts are detected.
+ *
+ * - Spurious IRQ handling
+ *
+ * All IRQs are continuously monitored and spurious IRQ handling
+ * kicks in if there are too many spurious IRQs. The IRQ is
+ * disabled and the registered irqactions are polled. The IRQ is
+ * given another shot after certain number IRQs are handled or an
+ * irqaction is added or removed.
+ *
+ * All of the above three mechanisms can be used together. Spurious
+ * IRQ handling is enabled by default and drivers are free to expect
+ * and watch IRQs as they see fit.
*/
#include <linux/jiffies.h>
#include <linux/irq.h>
+#include <linux/log2.h>
#include <linux/module.h>
#include <linux/kallsyms.h>
#include <linux/interrupt.h>
#include <linux/moduleparam.h>
-#include <linux/timer.h>
+#include <linux/slab.h>
+
+#include "internals.h"
+
+/*
+ * I spent quite some time thinking about each parameter but they
+ * still are just numbers pulled out of my ass. If you think your ass
+ * is prettier than mine, please go ahead and suggest better ones.
+ *
+ * Most parameters are intentionally fixed constants and not
+ * adjustable through API. The nature of IRQ delivery failures isn't
+ * usually dependent on specific drivers and the timing parameters are
+ * more about human perceivable latencies rather than any specific
+ * controller timing details, so figuring out constant values which
+ * can work for most cases shouldn't be too hard. This allows tighter
+ * control over polling behaviors, eases future changes and makes the
+ * interface easy for drivers.
+ */
+enum {
+ /* irqfixup levels */
+ IRQFIXUP_SPURIOUS = 0, /* spurious storm detection */
+ IRQFIXUP_MISROUTED = 1, /* misrouted IRQ fixup */
+ IRQFIXUP_POLL = 2, /* enable polling by default */
+
+ /* IRQ polling common parameters */
+ IRQ_POLL_SLOW_INTV = 3 * HZ, /* not too slow for ppl, slow enough for machine */
+ IRQ_POLL_INTV = HZ / 100, /* from the good ol' 100HZ tick */
+ IRQ_POLL_QUICK_INTV = HZ / 1000, /* on every tick, basically */
+
+ IRQ_POLL_SLOW_SLACK = HZ,
+ IRQ_POLL_SLACK = HZ / 250, /* 1 tick slack w/ the popular 250HZ config */
+ IRQ_POLL_QUICK_SLACK = HZ / 10000, /* no slack, basically */
+
+ /*
+ * IRQ expect parameters.
+ *
+ * Because IRQ expecting is tightly coupled with the actual
+ * activity of the controller, we can be slightly aggressive
+ * and try to minimize the effect of lost interrupts.
+ *
+ * An irqaction must accumulate VERIFY_GOAL good deliveries,
+ * where one bad delivery (delivered by polling) costs
+ * BAD_FACTOR good ones, before reaching the verified state.
+ *
+ * QUICK_SAMPLES IRQ deliveries are examined and if
+ * >=QUICK_THRESHOLD of them are polled on the first poll, the
+ * IRQ is considered to be quick and QUICK_INTV is used
+ * instead.
+ *
+ * Keep QUICK_SAMPLES much higher than VERIFY_GOAL so that
+ * quick polling doesn't interfact with the initial
+ * verification attempt (quicker polling increases the chance
+ * of polled deliveries).
+ */
+ IRQ_EXP_BAD_FACTOR = 10,
+ IRQ_EXP_VERIFY_GOAL = 256,
+ IRQ_EXP_QUICK_SAMPLES = IRQ_EXP_VERIFY_GOAL * 4,
+ IRQ_EXP_QUICK_THRESHOLD = IRQ_EXP_QUICK_SAMPLES * 8 / 10,
+
+ /* IRQ expect flags */
+ IRQ_EXPECTING = (1 << 0), /* expecting in progress */
+ IRQ_EXP_VERIFIED = (1 << 1), /* delivery verified, use slow interval */
+ IRQ_EXP_QUICK = (1 << 2), /* quick polling enabled */
+ IRQ_EXP_WARNED = (1 << 3), /* already whined */
+
+ /*
+ * IRQ watch parameters.
+ *
+ * As IRQ watching has much less information about what's
+ * going on, the parameters are more conservative. It will
+ * terminate unless it can reliably determine that IRQ
+ * delivery isn't working.
+ *
+ * IRQs are watched in timed intervals which is BASE_PERIOD
+ * long by default. Polling interval starts at BASE_INTV and
+ * grows upto SLOW_INTV if no bad delivery is detected.
+ *
+ * If a period contains zero sample and no bad delivery was
+ * seen since watch started, watch terminates.
+ *
+ * If a period contains >=1 but <MIN_SAMPLES deliveries,
+ * collected samples are inherited to the next period.
+ *
+ * If it contains enough samples, the ratio between good and
+ * bad deliveries are examined, if >=BAD_PCT% are bad, the
+ * irqaction is tagged bad and watched indefinitely. if
+ * BAD_PCT% > nr_bad >= WARY_PCT%, WARY_PERIOD is used instead
+ * of BASE_PERIOD and the whole process is restarted. If
+ * <WARY_PCT% are bad, watch terminates.
+ */
+ IRQ_WAT_MIN_SAMPLES = 10,
+ IRQ_WAT_BASE_INTV = HZ / 2,
+ IRQ_WAT_BASE_PERIOD = 60 * HZ,
+ IRQ_WAT_WARY_PERIOD = 600 * HZ,
+ IRQ_WAT_WARY_PCT = 1,
+ IRQ_WAT_BAD_PCT = 10,
+
+ /* IRQ watch flags */
+ IRQ_WATCHING = (1 << 0),
+ IRQ_WAT_POLLED = (1 << 1),
+ IRQ_WAT_WARY = (1 << 2),
+ IRQ_WAT_BAD = (1 << 3),
+
+ /*
+ * Spurious IRQ handling parameters.
+ *
+ * As this per-IRQ spurious handling is cheaper than the
+ * previous system wide spurious handling, it can afford to
+ * use more responsive settings but these parameters are still
+ * pretty conservative. If ever necessary, making it more
+ * responsive shouldn't cause any problem.
+ *
+ * Spurious IRQs are monitored in segments of PERIOD_SAMPLES
+ * IRQs which can stretch PERIOD_DURATION at maximum. If
+ * there are less than PERIOD_SAMPLES IRQs per
+ * PERIOD_DURATION, the period is considered good.
+ *
+ * If >=BAD_THRESHOLD IRQs are bad ones, the period is
+ * considered bad and spurious IRQ handling kicks in - the IRQ
+ * is disabled and polled. The IRQ is given another shot
+ * after certain number IRQs are handled, which is at minimum
+ * POLL_CNT_MIN, increased by 1 << POLL_CNT_INC_SHIFT times
+ * after each bad period and decreased by factor of
+ * POLL_CNT_INC_DEC_SHIFT after each good one.
+ */
+ IRQ_SPR_PERIOD_DURATION = 10 * HZ,
+ IRQ_SPR_PERIOD_SAMPLES = 10000,
+ IRQ_SPR_BAD_THRESHOLD = 9900,
+ IRQ_SPR_POLL_CNT_MIN = 10000,
+ IRQ_SPR_POLL_CNT_INF = UINT_MAX,
+ IRQ_SPR_POLL_CNT_INC_SHIFT = 3,
+ IRQ_SPR_POLL_CNT_DEC_SHIFT = 1,
+ IRQ_SPR_POLL_CNT_MAX_DEC_SHIFT = BITS_PER_BYTE * sizeof(int) / 4,
+};
+
+struct irq_expect {
+ struct irq_expect *next;
+ struct irq_desc *desc; /* the associated IRQ desc */
+ struct irqaction *act; /* the associated IRQ action */
+
+ unsigned int flags; /* IRQ_EXP_* flags */
+ unsigned int nr_samples; /* nr of collected samples in this period */
+ unsigned int nr_quick; /* nr of polls completed after single attempt */
+ unsigned int nr_good; /* nr of good IRQ deliveries */
+ unsigned long started; /* when this period started */
+};
+
+int noirqdebug __read_mostly;
+static int irqfixup __read_mostly = IRQFIXUP_SPURIOUS;
+
+static struct irqaction *find_irq_action(struct irq_desc *desc, void *dev_id)
+{
+ struct irqaction *act;
+
+ for (act = desc->action; act; act = act->next)
+ if (act->dev_id == dev_id)
+ return act;
+ return NULL;
+}
+
+static void print_irq_handlers(struct irq_desc *desc)
+{
+ struct irqaction *action;
+
+ printk(KERN_ERR "handlers:\n");
+
+ action = desc->action;
+ while (action) {
+ printk(KERN_ERR "[<%p>]", action->handler);
+ print_symbol(" (%s)", (unsigned long)action->handler);
+ printk("\n");
+ action = action->next;
+ }
+}
+
+static void warn_irq_poll(struct irq_desc *desc, struct irqaction *act)
+{
+ if (desc->poll_warned)
+ return;
+
+ desc->poll_warned = true;
+
+ printk(KERN_WARNING "IRQ %u: %s: can't verify IRQ, will keep polling\n",
+ desc->irq, act->name);
+ printk(KERN_WARNING "IRQ %u: %s: system performance may be affected\n",
+ desc->irq, act->name);
+}
+
+static unsigned long irq_poll_slack(unsigned long intv)
+{
+ if (intv >= IRQ_POLL_SLOW_INTV)
+ return IRQ_POLL_SLOW_SLACK;
+ else if (intv >= IRQ_POLL_INTV)
+ return IRQ_POLL_SLACK;
+ else
+ return IRQ_POLL_QUICK_SLACK;
+}
+
+/**
+ * irq_schedule_poll - schedule IRQ poll
+ * @desc: IRQ desc to schedule poll for
+ * @intv: poll interval
+ *
+ * Schedules @desc->poll_timer. If the timer is already scheduled,
+ * it's modified iff jiffies + @intv + slack is before the timer's
+ * expires. poll_timers aren't taken offline behind this function's
+ * back and the users of this function are guaranteed that poll_irq()
+ * will be called at or before jiffies + @intv + slack.
+ *
+ * CONTEXT:
+ * desc->lock
+ */
+static void irq_schedule_poll(struct irq_desc *desc, unsigned long intv)
+{
+ unsigned long expires = jiffies + intv;
+ int slack = irq_poll_slack(intv);
-static int irqfixup __read_mostly;
+ if (timer_pending(&desc->poll_timer) &&
+ time_before_eq(desc->poll_timer.expires, expires + slack))
+ return;
+
+ set_timer_slack(&desc->poll_timer, slack);
+ mod_timer(&desc->poll_timer, expires);
+}
+
+static unsigned long irq_exp_intv(struct irq_expect *exp)
+{
+ if (!(exp->flags & IRQ_EXPECTING))
+ return MAX_JIFFY_OFFSET;
+ if (exp->flags & IRQ_EXP_VERIFIED)
+ return IRQ_POLL_SLOW_INTV;
+ if (exp->flags & IRQ_EXP_QUICK)
+ return IRQ_POLL_QUICK_INTV;
+ return IRQ_POLL_INTV;
+}
+
+/**
+ * init_irq_expect - initialize IRQ expecting
+ * @irq: IRQ to expect
+ * @dev_id: dev_id of the irqaction to expect
+ *
+ * Initializes IRQ expecting and returns expect token to use. This
+ * function can be called multiple times for the same irqaction and
+ * each token can be used independently.
+ *
+ * CONTEXT:
+ * Does GFP_KERNEL allocation.
+ *
+ * RETURNS:
+ * irq_expect token to use on success, %NULL on failure.
+ */
+struct irq_expect *init_irq_expect(unsigned int irq, void *dev_id)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+ struct irqaction *act;
+ struct irq_expect *exp;
+ unsigned long flags;
+
+ if (noirqdebug || WARN_ON_ONCE(!desc))
+ return NULL;
+
+ exp = kzalloc(sizeof(*exp), GFP_KERNEL);
+ if (!exp) {
+ printk(KERN_WARNING "IRQ %u: failed to initialize IRQ expect, "
+ "allocation failed\n", irq);
+ return NULL;
+ }
+
+ exp->desc = desc;
+
+ raw_spin_lock_irqsave(&desc->lock, flags);
+
+ act = find_irq_action(desc, dev_id);
+ if (!WARN_ON_ONCE(!act)) {
+ exp->act = act;
+ exp->next = act->expects;
+ act->expects = exp;
+ } else {
+ kfree(exp);
+ exp = NULL;
+ }
+
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
+
+ return exp;
+}
+EXPORT_SYMBOL_GPL(init_irq_expect);
+
+/**
+ * expect_irq - expect IRQ
+ * @exp: expect token acquired from init_irq_expect(), %NULL is allowed
+ *
+ * Tell IRQ subsystem to expect an IRQ. The IRQ might be polled until
+ * unexpect_irq() is called on @exp. If @exp is %NULL, this function
+ * becomes noop.
+ *
+ * This function is fairly cheap and drivers can call it for each
+ * interrupt driven operation without adding noticeable overhead in
+ * most cases.
+ *
+ * CONTEXT:
+ * Don't care. The caller is responsible for ensuring
+ * [un]expect_irq() calls don't overlap. Overlapping may lead to
+ * unexpected polling behaviors but won't directly cause a failure.
+ */
+void expect_irq(struct irq_expect *exp)
+{
+ struct irq_desc *desc;
+ unsigned long intv, deadline;
+ unsigned long flags;
+
+ /* @exp is NULL if noirqdebug */
+ if (unlikely(!exp))
+ return;
+
+ desc = exp->desc;
+ exp->flags |= IRQ_EXPECTING;
-#define POLL_SPURIOUS_IRQ_INTERVAL (HZ/10)
-static void poll_spurious_irqs(unsigned long dummy);
-static DEFINE_TIMER(poll_spurious_irq_timer, poll_spurious_irqs, 0, 0);
+ /*
+ * Paired with mb in poll_irq(). Either we see timer pending
+ * cleared or poll_irq() sees IRQ_EXPECTING.
+ */
+ smp_mb();
+
+ exp->started = jiffies;
+ intv = irq_exp_intv(exp);
+ deadline = exp->started + intv + irq_poll_slack(intv);
+
+ /*
+ * poll_timer is never explicitly killed unless there's no
+ * action left on the irq; also, while it's online, timer
+ * duration is only shortened, which means that if we see
+ * ->expires in the future and not later than our deadline,
+ * the timer is guaranteed to fire before it.
+ */
+ if (!timer_pending(&desc->poll_timer) ||
+ time_after_eq(jiffies, desc->poll_timer.expires) ||
+ time_before(deadline, desc->poll_timer.expires)) {
+ raw_spin_lock_irqsave(&desc->lock, flags);
+ irq_schedule_poll(desc, intv);
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
+ }
+}
+EXPORT_SYMBOL_GPL(expect_irq);
+
+/**
+ * unexpect_irq - unexpect IRQ
+ * @exp: expect token acquired from init_irq_expect(), %NULL is allowed
+ * @timedout: did the IRQ timeout?
+ *
+ * Tell IRQ subsystem to stop expecting an IRQ. Set @timedout to
+ * %true if the expected IRQ never arrived. If @exp is %NULL, this
+ * function becomes noop.
+ *
+ * This function is fairly cheap and drivers can call it for each
+ * interrupt driven operation without adding noticeable overhead in
+ * most cases.
+ *
+ * CONTEXT:
+ * Don't care. The caller is responsible for ensuring
+ * [un]expect_irq() calls don't overlap. Overlapping may lead to
+ * unexpected polling behaviors but won't directly cause a failure.
+ */
+void unexpect_irq(struct irq_expect *exp, bool timedout)
+{
+ struct irq_desc *desc;
+
+ /* @exp is NULL if noirqdebug */
+ if (unlikely(!exp) || (!(exp->flags & IRQ_EXPECTING) && !timedout))
+ return;
+
+ desc = exp->desc;
+ exp->flags &= ~IRQ_EXPECTING;
+
+ /* succesful completion from IRQ? */
+ if (likely(!(desc->status & IRQ_IN_POLLING) && !timedout)) {
+ /*
+ * IRQ seems a bit more trustworthy. Allow nr_good to
+ * increase till VERIFY_GOAL + BAD_FACTOR - 1 so that
+ * single succesful delivery can recover verified
+ * state after an accidental polling hit.
+ */
+ if (unlikely(exp->nr_good <
+ IRQ_EXP_VERIFY_GOAL + IRQ_EXP_BAD_FACTOR - 1) &&
+ ++exp->nr_good >= IRQ_EXP_VERIFY_GOAL) {
+ exp->flags |= IRQ_EXP_VERIFIED;
+ exp->nr_samples = 0;
+ exp->nr_quick = 0;
+ }
+ return;
+ }
+
+ /* timedout or polled */
+ if (timedout) {
+ exp->nr_good = 0;
+ } else {
+ exp->nr_good -= min_t(unsigned int,
+ exp->nr_good, IRQ_EXP_BAD_FACTOR);
+
+ if (time_before_eq(jiffies, exp->started + IRQ_POLL_INTV))
+ exp->nr_quick++;
+
+ if (++exp->nr_samples >= IRQ_EXP_QUICK_SAMPLES) {
+ /*
+ * Use quick sampling checkpoints as warning
+ * checkpoints too.
+ */
+ if (!(exp->flags & IRQ_EXP_WARNED) &&
+ !desc->spr.poll_rem) {
+ warn_irq_poll(desc, exp->act);
+ exp->flags |= IRQ_EXP_WARNED;
+ }
+
+ exp->flags &= ~IRQ_EXP_QUICK;
+ if (exp->nr_quick >= IRQ_EXP_QUICK_THRESHOLD)
+ exp->flags |= IRQ_EXP_QUICK;
+ exp->nr_samples = 0;
+ exp->nr_quick = 0;
+ }
+ }
+
+ exp->flags &= ~IRQ_EXP_VERIFIED;
+}
+EXPORT_SYMBOL_GPL(unexpect_irq);
+
+/**
+ * irq_update_watch - IRQ handled, update watch state
+ * @desc: IRQ desc of interest
+ * @act: IRQ action of interest
+ * @via_poll: IRQ was handled via poll
+ *
+ * Called after IRQ is successfully delievered or polled. Updates
+ * watch state accordingly and determines which watch interval to use.
+ *
+ * CONTEXT:
+ * desc->lock
+ *
+ * RETURNS:
+ * Watch poll interval to use, MAX_JIFFY_OFFSET if watch polling isn't
+ * necessary.
+ */
+static unsigned long irq_update_watch(struct irq_desc *desc,
+ struct irqaction *act, bool via_poll)
+{
+ struct irq_watch *wat = &act->watch;
+ unsigned long period = wat->flags & IRQ_WAT_WARY ?
+ IRQ_WAT_WARY_PERIOD : IRQ_WAT_BASE_PERIOD;
+
+ /* if not watching or already determined to be bad, it's easy */
+ if (!(wat->flags & IRQ_WATCHING))
+ return MAX_JIFFY_OFFSET;
+ if (wat->flags & IRQ_WAT_BAD)
+ return IRQ_POLL_INTV;
+
+ /* don't expire watch period while spurious polling is in effect */
+ if (desc->spr.poll_rem) {
+ wat->started = jiffies;
+ return IRQ_POLL_INTV;
+ }
+
+ /* IRQ was handled, record whether it was a good or bad delivery */
+ if (wat->last_ret == IRQ_HANDLED) {
+ wat->nr_samples++;
+ if (via_poll) {
+ wat->nr_polled++;
+ wat->flags |= IRQ_WAT_POLLED;
+ }
+ }
+
+ /* is this watch period over? */
+ if (time_after(jiffies, wat->started + period)) {
+ unsigned int wry_thr = wat->nr_samples * IRQ_WAT_WARY_PCT / 100;
+ unsigned int bad_thr = wat->nr_samples * IRQ_WAT_BAD_PCT / 100;
+
+ if (wat->nr_samples >= IRQ_WAT_MIN_SAMPLES) {
+ /* have enough samples, determine what to do */
+ if (wat->nr_polled <= wry_thr)
+ wat->flags &= ~IRQ_WATCHING;
+ else if (wat->nr_polled <= bad_thr)
+ wat->flags |= IRQ_WAT_WARY;
+ else {
+ warn_irq_poll(desc, act);
+ wat->flags |= IRQ_WAT_BAD;
+ }
+ wat->nr_samples = 0;
+ wat->nr_polled = 0;
+ } else if (!wat->nr_samples || !(wat->flags & IRQ_WAT_POLLED)) {
+ /* not sure but let's not hold onto it */
+ wat->flags &= ~IRQ_WATCHING;
+ }
+
+ wat->started = jiffies;
+ }
+
+ if (!(wat->flags & IRQ_WATCHING))
+ return MAX_JIFFY_OFFSET;
+ if (wat->flags & IRQ_WAT_POLLED)
+ return IRQ_POLL_INTV;
+ /* every delivery upto this point has been successful, grow interval */
+ return clamp_t(unsigned long, jiffies - wat->started,
+ IRQ_WAT_BASE_INTV, IRQ_POLL_SLOW_INTV);
+}
+
+/**
+ * watch_irq - watch an irqaction
+ * @irq: IRQ the irqaction to watch belongs to
+ * @dev_id: dev_id for the irqaction to watch
+ *
+ * LOCKING:
+ * Grabs and releases desc->lock.
+ */
+void watch_irq(unsigned int irq, void *dev_id)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+ struct irqaction *act;
+ unsigned long flags;
+
+ if (WARN_ON_ONCE(!desc))
+ return;
+
+ raw_spin_lock_irqsave(&desc->lock, flags);
+
+ act = find_irq_action(desc, dev_id);
+ if (!WARN_ON_ONCE(!act)) {
+ struct irq_watch *wat = &act->watch;
+
+ wat->flags |= IRQ_WATCHING;
+ wat->started = jiffies;
+ wat->nr_samples = 0;
+ wat->nr_polled = 0;
+ desc->status |= IRQ_CHECK_WATCHES;
+ irq_schedule_poll(desc, IRQ_WAT_BASE_INTV);
+ }
+
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
+}
+EXPORT_SYMBOL_GPL(watch_irq);
+
+/* start a new spurious handling period */
+static void irq_spr_new_period(struct irq_spr *spr)
+{
+ spr->period_start = jiffies;
+ spr->nr_samples = 0;
+ spr->nr_bad = 0;
+}
+
+/* Reset spurious handling. After this, poll_timer will offline itself soon. */
+static void irq_spr_reset(struct irq_spr *spr)
+{
+ irq_spr_new_period(spr);
+ spr->poll_cnt = IRQ_SPR_POLL_CNT_MIN;
+ spr->poll_rem = 0;
+}
/*
- * Recovery handler for misrouted interrupts.
+ * Perform an actual poll.
*/
static int try_one_irq(int irq, struct irq_desc *desc)
{
struct irqaction *action;
int ok = 0, work = 0;
- raw_spin_lock(&desc->lock);
/* Already running on another processor */
if (desc->status & IRQ_INPROGRESS) {
/*
@@ -37,7 +641,6 @@ static int try_one_irq(int irq, struct irq_desc *desc)
*/
if (desc->action && (desc->action->flags & IRQF_SHARED))
desc->status |= IRQ_PENDING;
- raw_spin_unlock(&desc->lock);
return ok;
}
/* Honour the normal IRQ locking */
@@ -48,8 +651,9 @@ static int try_one_irq(int irq, struct irq_desc *desc)
while (action) {
/* Only shared IRQ handlers are safe to call */
if (action->flags & IRQF_SHARED) {
- if (action->handler(irq, action->dev_id) ==
- IRQ_HANDLED)
+ action->watch.last_ret =
+ action->handler(irq, action->dev_id);
+ if (action->watch.last_ret == IRQ_HANDLED)
ok = 1;
}
action = action->next;
@@ -80,7 +684,6 @@ static int try_one_irq(int irq, struct irq_desc *desc)
*/
if (work && desc->chip && desc->chip->end)
desc->chip->end(irq);
- raw_spin_unlock(&desc->lock);
return ok;
}
@@ -97,172 +700,275 @@ static int misrouted_irq(int irq)
if (i == irq) /* Already tried */
continue;
+ raw_spin_lock(&desc->lock);
if (try_one_irq(i, desc))
ok = 1;
+ raw_spin_unlock(&desc->lock);
}
/* So the caller can adjust the irq error counts */
return ok;
}
-static void poll_spurious_irqs(unsigned long dummy)
+/*
+ * IRQ delivery notification function. Called after each IRQ delivery.
+ */
+void __note_interrupt(unsigned int irq, struct irq_desc *desc,
+ irqreturn_t action_ret)
{
- struct irq_desc *desc;
- int i;
+ struct irq_spr *spr = &desc->spr;
+ unsigned long dur;
+ unsigned int cnt, abbr;
+ char unit = 'k';
- for_each_irq_desc(i, desc) {
- unsigned int status;
+ /* first, take care of IRQ watches */
+ if (unlikely(desc->status & IRQ_CHECK_WATCHES)) {
+ unsigned long intv = MAX_JIFFY_OFFSET;
+ struct irqaction *act;
- if (!i)
- continue;
+ raw_spin_lock(&desc->lock);
- /* Racy but it doesn't matter */
- status = desc->status;
- barrier();
- if (!(status & IRQ_SPURIOUS_DISABLED))
- continue;
+ for (act = desc->action; act; act = act->next)
+ intv = min(intv, irq_update_watch(desc, act, false));
- local_irq_disable();
- try_one_irq(i, desc);
- local_irq_enable();
+ if (intv < MAX_JIFFY_OFFSET)
+ irq_schedule_poll(desc, intv);
+ else
+ desc->status &= ~IRQ_CHECK_WATCHES;
+
+ raw_spin_unlock(&desc->lock);
+ }
+
+ /*
+ * Account for unhandled interrupt. We don't care whether
+ * spurious accounting update races with irq open/close and
+ * gets some values wrong. Do it w/o locking.
+ */
+ if (unlikely(action_ret != IRQ_HANDLED)) {
+ static int bogus_count = 100;
+
+ spr->last_bad = jiffies - INITIAL_JIFFIES;
+ spr->nr_bad++;
+ if (likely(action_ret == IRQ_NONE)) {
+ if (unlikely(irqfixup >= IRQFIXUP_MISROUTED &&
+ misrouted_irq(irq)))
+ spr->nr_bad--;
+ } else if (bogus_count > 0) {
+ bogus_count--;
+ printk(KERN_ERR "IRQ %u: bogus return value %x\n",
+ irq, action_ret);
+ dump_stack();
+ print_irq_handlers(desc);
+ }
}
- mod_timer(&poll_spurious_irq_timer,
- jiffies + POLL_SPURIOUS_IRQ_INTERVAL);
+ /* did we finish this spurious period? */
+ spr->nr_samples++;
+ if (likely(spr->nr_samples < IRQ_SPR_PERIOD_SAMPLES))
+ return;
+
+ /* if so, was it a good one? */
+ dur = jiffies - spr->period_start;
+ if (likely(spr->nr_bad < IRQ_SPR_BAD_THRESHOLD ||
+ dur > IRQ_SPR_PERIOD_DURATION)) {
+ /*
+ * If longer than PERIOD_DURATION has passed, consider
+ * multiple good periods have happened.
+ */
+ int sft = IRQ_SPR_POLL_CNT_DEC_SHIFT *
+ (dur >> order_base_2(IRQ_SPR_PERIOD_DURATION));
+
+ /* but don't kill poll_cnt at once */
+ sft = clamp(sft, 1, IRQ_SPR_POLL_CNT_MAX_DEC_SHIFT);
+
+ spr->poll_cnt >>= sft;
+ irq_spr_new_period(spr);
+ return;
+ }
+
+ /*
+ * It was a bad one, start polling. This is a slow path and
+ * we're gonna be changing states which require proper
+ * synchronization, grab desc->lock.
+ */
+ raw_spin_lock(&desc->lock);
+
+ irq_spr_new_period(spr);
+
+ /* update spr_poll_cnt considering the lower and upper bounds */
+ cnt = max_t(unsigned int, spr->poll_cnt, IRQ_SPR_POLL_CNT_MIN);
+ spr->poll_cnt = cnt << IRQ_SPR_POLL_CNT_INC_SHIFT;
+ if (spr->poll_cnt < cnt) /* did it overflow? */
+ spr->poll_cnt = IRQ_SPR_POLL_CNT_INF;
+
+ /* whine, plug IRQ and kick poll timer */
+ abbr = cnt / 1000;
+ if (abbr > 1000) {
+ abbr /= 1000;
+ unit = 'm';
+ }
+ printk(KERN_ERR "IRQ %u: too many spurious IRQs, disabling and "
+ "polling for %u%c %umsec intervals.\n",
+ desc->irq, abbr, unit, jiffies_to_msecs(IRQ_POLL_INTV));
+ printk(KERN_ERR "IRQ %u: system performance may be affected\n",
+ desc->irq);
+ print_irq_handlers(desc);
+
+ desc->status |= IRQ_DISABLED | IRQ_SPURIOUS_DISABLED;
+ desc->depth++;
+ desc->chip->disable(desc->irq);
+
+ spr->poll_rem = cnt;
+ irq_schedule_poll(desc, IRQ_POLL_INTV);
+
+ raw_spin_unlock(&desc->lock);
}
/*
- * If 99,900 of the previous 100,000 interrupts have not been handled
- * then assume that the IRQ is stuck in some manner. Drop a diagnostic
- * and try to turn the IRQ off.
- *
- * (The other 100-of-100,000 interrupts may have been a correctly
- * functioning device sharing an IRQ with the failing one)
- *
- * Called under desc->lock
+ * IRQ poller. Called from desc->poll_timer.
*/
-
-static void
-__report_bad_irq(unsigned int irq, struct irq_desc *desc,
- irqreturn_t action_ret)
+void poll_irq(unsigned long arg)
{
- struct irqaction *action;
+ struct irq_desc *desc = (void *)arg;
+ struct irq_spr *spr = &desc->spr;
+ unsigned long intv = MAX_JIFFY_OFFSET;
+ bool reenable_irq = false;
+ struct irqaction *act;
+ struct irq_expect *exp;
+
+ raw_spin_lock_irq(&desc->lock);
+
+ /* poll the IRQ */
+ desc->status |= IRQ_IN_POLLING;
+ try_one_irq(desc->irq, desc);
+ desc->status &= ~IRQ_IN_POLLING;
+
+ /* take care of spurious handling */
+ if (spr->poll_rem) {
+ if (spr->poll_rem != IRQ_SPR_POLL_CNT_INF)
+ spr->poll_rem--;
+ if (spr->poll_rem)
+ intv = IRQ_POLL_INTV;
+ else
+ irq_spr_new_period(spr);
+ }
+ if (!spr->poll_rem)
+ reenable_irq = desc->status & IRQ_SPURIOUS_DISABLED;
- if (action_ret != IRQ_HANDLED && action_ret != IRQ_NONE) {
- printk(KERN_ERR "irq event %d: bogus return value %x\n",
- irq, action_ret);
- } else {
- printk(KERN_ERR "irq %d: nobody cared (try booting with "
- "the \"irqpoll\" option)\n", irq);
+ /*
+ * Paired with mb in expect_irq() so that either they see
+ * timer pending cleared or irq_exp_intv() below sees
+ * IRQ_EXPECTING.
+ */
+ smp_mb();
+
+ /* take care of expects and watches */
+ for (act = desc->action; act; act = act->next) {
+ intv = min(irq_update_watch(desc, act, true), intv);
+ for (exp = act->expects; exp; exp = exp->next)
+ intv = min(irq_exp_intv(exp), intv);
}
- dump_stack();
- printk(KERN_ERR "handlers:\n");
- action = desc->action;
- while (action) {
- printk(KERN_ERR "[<%p>]", action->handler);
- print_symbol(" (%s)",
- (unsigned long)action->handler);
- printk("\n");
- action = action->next;
+ /* need to poll again? */
+ if (intv < MAX_JIFFY_OFFSET)
+ irq_schedule_poll(desc, intv);
+
+ raw_spin_unlock_irq(&desc->lock);
+
+ if (!reenable_irq)
+ return;
+
+ /* need to do locking dance for chip_bus_lock() to reenable IRQ */
+ chip_bus_lock(desc->irq, desc);
+ raw_spin_lock_irq(&desc->lock);
+
+ /* make sure we haven't raced with anyone inbetween */
+ if (!spr->poll_rem && (desc->status & IRQ_SPURIOUS_DISABLED)) {
+ printk(KERN_INFO "IRQ %u: spurious polling finished, "
+ "reenabling IRQ\n", desc->irq);
+ __enable_irq(desc, desc->irq, false);
+ desc->status &= ~IRQ_SPURIOUS_DISABLED;
}
+
+ raw_spin_unlock_irq(&desc->lock);
+ chip_bus_sync_unlock(desc->irq, desc);
}
-static void
-report_bad_irq(unsigned int irq, struct irq_desc *desc, irqreturn_t action_ret)
+void irq_poll_action_added(struct irq_desc *desc, struct irqaction *action)
{
- static int count = 100;
+ struct irq_spr *spr = &desc->spr;
+ unsigned long flags;
- if (count > 0) {
- count--;
- __report_bad_irq(irq, desc, action_ret);
+ raw_spin_lock_irqsave(&desc->lock, flags);
+
+ if ((action->flags & IRQF_SHARED) && irqfixup >= IRQFIXUP_POLL) {
+ if (!spr->poll_rem)
+ printk(KERN_INFO "IRQ %u: starting IRQFIXUP_POLL\n",
+ desc->irq);
+ spr->poll_rem = IRQ_SPR_POLL_CNT_INF;
+ irq_schedule_poll(desc, IRQ_POLL_INTV);
+ } else {
+ /* new irqaction registered, give the IRQ another chance */
+ irq_spr_reset(spr);
}
+
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
}
-static inline int
-try_misrouted_irq(unsigned int irq, struct irq_desc *desc,
- irqreturn_t action_ret)
+void irq_poll_action_removed(struct irq_desc *desc, struct irqaction *action)
{
- struct irqaction *action;
+ bool irq_enabled = false, timer_killed = false;
+ struct irq_expect *exp, *next;
+ unsigned long flags;
+ int rc;
- if (!irqfixup)
- return 0;
+ raw_spin_lock_irqsave(&desc->lock, flags);
- /* We didn't actually handle the IRQ - see if it was misrouted? */
- if (action_ret == IRQ_NONE)
- return 1;
+ /* give the IRQ another chance */
+ if (irqfixup < IRQFIXUP_POLL)
+ irq_spr_reset(&desc->spr);
/*
- * But for 'irqfixup == 2' we also do it for handled interrupts if
- * they are marked as IRQF_IRQPOLL (or for irq zero, which is the
- * traditional PC timer interrupt.. Legacy)
+ * Make sure the timer is offline if no irqaction is left as
+ * the irq_desc will be reinitialized when the next irqaction
+ * is added; otherwise, the timer can be left alone. It will
+ * offline itself if no longer necessary.
*/
- if (irqfixup < 2)
- return 0;
-
- if (!irq)
- return 1;
+ while (!desc->action) {
+ rc = try_to_del_timer_sync(&desc->poll_timer);
+ if (rc >= 0) {
+ timer_killed = rc > 0;
+ break;
+ }
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
+ cpu_relax();
+ raw_spin_lock_irqsave(&desc->lock, flags);
+ }
/*
- * Since we don't get the descriptor lock, "action" can
- * change under us. We don't really care, but we don't
- * want to follow a NULL pointer. So tell the compiler to
- * just load it once by using a barrier.
+ * If the timer was forcefully shut down, it might not have
+ * had the chance to reenable IRQ. Make sure it's enabled.
*/
- action = desc->action;
- barrier();
- return action && (action->flags & IRQF_IRQPOLL);
-}
-
-void note_interrupt(unsigned int irq, struct irq_desc *desc,
- irqreturn_t action_ret)
-{
- if (unlikely(action_ret != IRQ_HANDLED)) {
- /*
- * If we are seeing only the odd spurious IRQ caused by
- * bus asynchronicity then don't eventually trigger an error,
- * otherwise the counter becomes a doomsday timer for otherwise
- * working systems
- */
- if (time_after(jiffies, desc->last_unhandled + HZ/10))
- desc->irqs_unhandled = 1;
- else
- desc->irqs_unhandled++;
- desc->last_unhandled = jiffies;
- if (unlikely(action_ret != IRQ_NONE))
- report_bad_irq(irq, desc, action_ret);
+ if (timer_killed && (desc->status & IRQ_SPURIOUS_DISABLED)) {
+ __enable_irq(desc, desc->irq, false);
+ desc->status &= ~IRQ_SPURIOUS_DISABLED;
+ irq_enabled = true;
}
- if (unlikely(try_misrouted_irq(irq, desc, action_ret))) {
- int ok = misrouted_irq(irq);
- if (action_ret == IRQ_NONE)
- desc->irqs_unhandled -= ok;
- }
-
- desc->irq_count++;
- if (likely(desc->irq_count < 100000))
- return;
+ if (timer_killed || irq_enabled)
+ printk(KERN_INFO "IRQ %u:%s%s%s\n", desc->irq,
+ timer_killed ? " polling stopped" : "",
+ timer_killed && irq_enabled ? " and" : "",
+ irq_enabled ? " IRQ reenabled" : "");
- desc->irq_count = 0;
- if (unlikely(desc->irqs_unhandled > 99900)) {
- /*
- * The interrupt is stuck
- */
- __report_bad_irq(irq, desc, action_ret);
- /*
- * Now kill the IRQ
- */
- printk(KERN_EMERG "Disabling IRQ #%d\n", irq);
- desc->status |= IRQ_DISABLED | IRQ_SPURIOUS_DISABLED;
- desc->depth++;
- desc->chip->disable(irq);
-
- mod_timer(&poll_spurious_irq_timer,
- jiffies + POLL_SPURIOUS_IRQ_INTERVAL);
+ /* free expect tokens */
+ for (exp = action->expects; exp; exp = next) {
+ next = exp->next;
+ kfree(exp);
}
- desc->irqs_unhandled = 0;
-}
+ action->expects = NULL;
-int noirqdebug __read_mostly;
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
+}
int noirqdebug_setup(char *str)
{
@@ -278,7 +984,7 @@ MODULE_PARM_DESC(noirqdebug, "Disable irq lockup detection when true");
static int __init irqfixup_setup(char *str)
{
- irqfixup = 1;
+ irqfixup = max(irqfixup, IRQFIXUP_MISROUTED);
printk(KERN_WARNING "Misrouted IRQ fixup support enabled.\n");
printk(KERN_WARNING "This may impact system performance.\n");
@@ -290,7 +996,7 @@ module_param(irqfixup, int, 0644);
static int __init irqpoll_setup(char *str)
{
- irqfixup = 2;
+ irqfixup = IRQFIXUP_POLL;
printk(KERN_WARNING "Misrouted IRQ fixup and polling support "
"enabled\n");
printk(KERN_WARNING "This may significantly impact system "
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 3632ce87674f..19cccc3c3028 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -3846,6 +3846,9 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
rpos = reader->read;
pos += size;
+ if (rpos >= commit)
+ break;
+
event = rb_reader_event(cpu_buffer);
size = rb_event_length(event);
} while (len > size);
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index ba14a22be4cc..9ec59f541156 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -3463,6 +3463,7 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,
size_t cnt, loff_t *fpos)
{
char *buf;
+ size_t written;
if (tracing_disabled)
return -EINVAL;
@@ -3484,11 +3485,15 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,
} else
buf[cnt] = '\0';
- cnt = mark_printk("%s", buf);
+ written = mark_printk("%s", buf);
kfree(buf);
- *fpos += cnt;
+ *fpos += written;
- return cnt;
+ /* don't tell userspace we wrote more - it might confuse them */
+ if (written > cnt)
+ written = cnt;
+
+ return written;
}
static int tracing_clock_show(struct seq_file *m, void *v)
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index 09b4fa6e4d3b..4c758f146328 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -598,88 +598,165 @@ out:
return ret;
}
-static void print_event_fields(struct trace_seq *s, struct list_head *head)
+enum {
+ FORMAT_HEADER = 1,
+ FORMAT_PRINTFMT = 2,
+};
+
+static void *f_next(struct seq_file *m, void *v, loff_t *pos)
{
+ struct ftrace_event_call *call = m->private;
struct ftrace_event_field *field;
+ struct list_head *head;
- list_for_each_entry_reverse(field, head, link) {
- /*
- * Smartly shows the array type(except dynamic array).
- * Normal:
- * field:TYPE VAR
- * If TYPE := TYPE[LEN], it is shown:
- * field:TYPE VAR[LEN]
- */
- const char *array_descriptor = strchr(field->type, '[');
+ (*pos)++;
- if (!strncmp(field->type, "__data_loc", 10))
- array_descriptor = NULL;
+ switch ((unsigned long)v) {
+ case FORMAT_HEADER:
+ head = &ftrace_common_fields;
- if (!array_descriptor) {
- trace_seq_printf(s, "\tfield:%s %s;\toffset:%u;"
- "\tsize:%u;\tsigned:%d;\n",
- field->type, field->name, field->offset,
- field->size, !!field->is_signed);
- } else {
- trace_seq_printf(s, "\tfield:%.*s %s%s;\toffset:%u;"
- "\tsize:%u;\tsigned:%d;\n",
- (int)(array_descriptor - field->type),
- field->type, field->name,
- array_descriptor, field->offset,
- field->size, !!field->is_signed);
- }
+ if (unlikely(list_empty(head)))
+ return NULL;
+
+ field = list_entry(head->prev, struct ftrace_event_field, link);
+ return field;
+
+ case FORMAT_PRINTFMT:
+ /* all done */
+ return NULL;
+ }
+
+ head = trace_get_fields(call);
+
+ /*
+ * To separate common fields from event fields, the
+ * LSB is set on the first event field. Clear it in case.
+ */
+ v = (void *)((unsigned long)v & ~1L);
+
+ field = v;
+ /*
+ * If this is a common field, and at the end of the list, then
+ * continue with main list.
+ */
+ if (field->link.prev == &ftrace_common_fields) {
+ if (unlikely(list_empty(head)))
+ return NULL;
+ field = list_entry(head->prev, struct ftrace_event_field, link);
+ /* Set the LSB to notify f_show to print an extra newline */
+ field = (struct ftrace_event_field *)
+ ((unsigned long)field | 1);
+ return field;
}
+
+ /* If we are done tell f_show to print the format */
+ if (field->link.prev == head)
+ return (void *)FORMAT_PRINTFMT;
+
+ field = list_entry(field->link.prev, struct ftrace_event_field, link);
+
+ return field;
}
-static ssize_t
-event_format_read(struct file *filp, char __user *ubuf, size_t cnt,
- loff_t *ppos)
+static void *f_start(struct seq_file *m, loff_t *pos)
{
- struct ftrace_event_call *call = filp->private_data;
- struct list_head *head;
- struct trace_seq *s;
- char *buf;
- int r;
+ loff_t l = 0;
+ void *p;
- if (*ppos)
+ /* Start by showing the header */
+ if (!*pos)
+ return (void *)FORMAT_HEADER;
+
+ p = (void *)FORMAT_HEADER;
+ do {
+ p = f_next(m, p, &l);
+ } while (p && l < *pos);
+
+ return p;
+}
+
+static int f_show(struct seq_file *m, void *v)
+{
+ struct ftrace_event_call *call = m->private;
+ struct ftrace_event_field *field;
+ const char *array_descriptor;
+
+ switch ((unsigned long)v) {
+ case FORMAT_HEADER:
+ seq_printf(m, "name: %s\n", call->name);
+ seq_printf(m, "ID: %d\n", call->event.type);
+ seq_printf(m, "format:\n");
return 0;
- s = kmalloc(sizeof(*s), GFP_KERNEL);
- if (!s)
- return -ENOMEM;
+ case FORMAT_PRINTFMT:
+ seq_printf(m, "\nprint fmt: %s\n",
+ call->print_fmt);
+ return 0;
+ }
- trace_seq_init(s);
+ /*
+ * To separate common fields from event fields, the
+ * LSB is set on the first event field. Clear it and
+ * print a newline if it is set.
+ */
+ if ((unsigned long)v & 1) {
+ seq_putc(m, '\n');
+ v = (void *)((unsigned long)v & ~1L);
+ }
- trace_seq_printf(s, "name: %s\n", call->name);
- trace_seq_printf(s, "ID: %d\n", call->event.type);
- trace_seq_printf(s, "format:\n");
+ field = v;
- /* print common fields */
- print_event_fields(s, &ftrace_common_fields);
+ /*
+ * Smartly shows the array type(except dynamic array).
+ * Normal:
+ * field:TYPE VAR
+ * If TYPE := TYPE[LEN], it is shown:
+ * field:TYPE VAR[LEN]
+ */
+ array_descriptor = strchr(field->type, '[');
- trace_seq_putc(s, '\n');
+ if (!strncmp(field->type, "__data_loc", 10))
+ array_descriptor = NULL;
- /* print event specific fields */
- head = trace_get_fields(call);
- print_event_fields(s, head);
+ if (!array_descriptor)
+ seq_printf(m, "\tfield:%s %s;\toffset:%u;\tsize:%u;\tsigned:%d;\n",
+ field->type, field->name, field->offset,
+ field->size, !!field->is_signed);
+ else
+ seq_printf(m, "\tfield:%.*s %s%s;\toffset:%u;\tsize:%u;\tsigned:%d;\n",
+ (int)(array_descriptor - field->type),
+ field->type, field->name,
+ array_descriptor, field->offset,
+ field->size, !!field->is_signed);
- r = trace_seq_printf(s, "\nprint fmt: %s\n", call->print_fmt);
+ return 0;
+}
- if (!r) {
- /*
- * ug! The format output is bigger than a PAGE!!
- */
- buf = "FORMAT TOO BIG\n";
- r = simple_read_from_buffer(ubuf, cnt, ppos,
- buf, strlen(buf));
- goto out;
- }
+static void f_stop(struct seq_file *m, void *p)
+{
+}
- r = simple_read_from_buffer(ubuf, cnt, ppos,
- s->buffer, s->len);
- out:
- kfree(s);
- return r;
+static const struct seq_operations trace_format_seq_ops = {
+ .start = f_start,
+ .next = f_next,
+ .stop = f_stop,
+ .show = f_show,
+};
+
+static int trace_format_open(struct inode *inode, struct file *file)
+{
+ struct ftrace_event_call *call = inode->i_private;
+ struct seq_file *m;
+ int ret;
+
+ ret = seq_open(file, &trace_format_seq_ops);
+ if (ret < 0)
+ return ret;
+
+ m = file->private_data;
+ m->private = call;
+
+ return 0;
}
static ssize_t
@@ -877,8 +954,10 @@ static const struct file_operations ftrace_enable_fops = {
};
static const struct file_operations ftrace_event_format_fops = {
- .open = tracing_open_generic,
- .read = event_format_read,
+ .open = trace_format_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
};
static const struct file_operations ftrace_event_id_fops = {
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
index 6bff23625781..6f233698518e 100644
--- a/kernel/trace/trace_functions_graph.c
+++ b/kernel/trace/trace_functions_graph.c
@@ -507,7 +507,15 @@ get_return_for_leaf(struct trace_iterator *iter,
* if the output fails.
*/
data->ent = *curr;
- data->ret = *next;
+ /*
+ * If the next event is not a return type, then
+ * we only care about what type it is. Otherwise we can
+ * safely copy the entire event.
+ */
+ if (next->ent.type == TRACE_GRAPH_RET)
+ data->ret = *next;
+ else
+ data->ret.ent.type = next->ent.type;
}
}
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index 8b27c9849b42..52f032306c7c 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -648,7 +648,7 @@ static int register_trace_probe(struct trace_probe *tp)
}
ret = register_probe_event(tp);
if (ret) {
- pr_warning("Faild to register probe event(%d)\n", ret);
+ pr_warning("Failed to register probe event(%d)\n", ret);
goto end;
}
diff --git a/lib/Kconfig b/lib/Kconfig
index fa9bf2c06199..9a2c61644f31 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -210,4 +210,25 @@ config GENERIC_ATOMIC64
config LRU_CACHE
tristate
+config SHM_SIGNAL
+ tristate "SHM Signal - Generic shared-memory signaling mechanism"
+ default n
+ help
+ Provides a shared-memory based signaling mechanism to indicate
+ memory-dirty notifications between two end-points.
+
+ If unsure, say N
+
+config IOQ
+ tristate "IO-Queue library - Generic shared-memory queue"
+ select SHM_SIGNAL
+ default n
+ help
+ IOQ is a generic shared-memory-queue mechanism that happens to be
+ friendly to virtualization boundaries. It can be used in a variety
+ of ways, though its intended purpose is to become a low-level
+ communication path for paravirtualized drivers.
+
+ If unsure, say N
+
endmenu
diff --git a/lib/Makefile b/lib/Makefile
index e6a3763b8212..3098ce3bd17a 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -82,6 +82,8 @@ obj-$(CONFIG_TEXTSEARCH_BM) += ts_bm.o
obj-$(CONFIG_TEXTSEARCH_FSM) += ts_fsm.o
obj-$(CONFIG_SMP) += percpu_counter.o
obj-$(CONFIG_AUDIT_GENERIC) += audit.o
+obj-$(CONFIG_SHM_SIGNAL) += shm_signal.o
+obj-$(CONFIG_IOQ) += ioq.o
obj-$(CONFIG_SWIOTLB) += swiotlb.o
obj-$(CONFIG_IOMMU_HELPER) += iommu-helper.o
diff --git a/lib/ioq.c b/lib/ioq.c
new file mode 100644
index 000000000000..4027848d7436
--- /dev/null
+++ b/lib/ioq.c
@@ -0,0 +1,304 @@
+/*
+ * Copyright 2009 Novell. All Rights Reserved.
+ *
+ * See include/linux/ioq.h for documentation
+ *
+ * Author:
+ * Gregory Haskins <ghaskins@novell.com>
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <linux/sched.h>
+#include <linux/ioq.h>
+#include <linux/bitops.h>
+#include <linux/module.h>
+
+MODULE_AUTHOR("Gregory Haskins");
+MODULE_LICENSE("GPL");
+MODULE_VERSION("1");
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+static int ioq_iter_setpos(struct ioq_iterator *iter, u32 pos)
+{
+ struct ioq *ioq = iter->ioq;
+
+ BUG_ON(pos >= ioq->count);
+
+ iter->pos = pos;
+ iter->desc = &ioq->ring[pos];
+
+ return 0;
+}
+
+static inline u32 modulo_inc(u32 val, u32 mod)
+{
+ BUG_ON(val >= mod);
+
+ if (val == (mod - 1))
+ return 0;
+
+ return val + 1;
+}
+
+static inline int idx_full(struct ioq_ring_idx *idx)
+{
+ return idx->full && (idx->head == idx->tail);
+}
+
+int ioq_iter_seek(struct ioq_iterator *iter, enum ioq_seek_type type,
+ long offset, int flags)
+{
+ struct ioq_ring_idx *idx = iter->idx;
+ u32 pos;
+
+ switch (type) {
+ case ioq_seek_next:
+ pos = modulo_inc(iter->pos, iter->ioq->count);
+ break;
+ case ioq_seek_tail:
+ pos = le32_to_cpu(idx->tail);
+ break;
+ case ioq_seek_head:
+ pos = le32_to_cpu(idx->head);
+ break;
+ case ioq_seek_set:
+ if (offset >= iter->ioq->count)
+ return -1;
+ pos = offset;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return ioq_iter_setpos(iter, pos);
+}
+EXPORT_SYMBOL_GPL(ioq_iter_seek);
+
+static int ioq_ring_count(struct ioq_ring_idx *idx, int count)
+{
+ u32 head = le32_to_cpu(idx->head);
+ u32 tail = le32_to_cpu(idx->tail);
+
+ if (idx->full && (head == tail))
+ return count;
+ else if (tail >= head)
+ return tail - head;
+ else
+ return (tail + count) - head;
+}
+
+static void idx_tail_push(struct ioq_ring_idx *idx, int count)
+{
+ u32 tail = modulo_inc(le32_to_cpu(idx->tail), count);
+ u32 head = le32_to_cpu(idx->head);
+
+ if (head == tail) {
+ rmb();
+
+ /*
+ * Setting full here may look racy, but note that we havent
+ * flipped the owner bit yet. So it is impossible for the
+ * remote locale to move head in such a way that this operation
+ * becomes invalid
+ */
+ idx->full = 1;
+ wmb();
+ }
+
+ idx->tail = cpu_to_le32(tail);
+}
+
+int ioq_iter_push(struct ioq_iterator *iter, int flags)
+{
+ struct ioq_ring_head *head_desc = iter->ioq->head_desc;
+ struct ioq_ring_idx *idx = iter->idx;
+ int ret;
+
+ /*
+ * Its only valid to push if we are currently pointed at the tail
+ */
+ if (iter->pos != le32_to_cpu(idx->tail) || iter->desc->sown != iter->ioq->locale)
+ return -EINVAL;
+
+ idx_tail_push(idx, iter->ioq->count);
+ if (iter->dualidx) {
+ idx_tail_push(&head_desc->idx[ioq_idxtype_inuse],
+ iter->ioq->count);
+ if (head_desc->idx[ioq_idxtype_inuse].tail !=
+ head_desc->idx[ioq_idxtype_valid].tail) {
+ SHM_SIGNAL_FAULT(iter->ioq->signal,
+ "Tails not synchronized");
+ return -EINVAL;
+ }
+ }
+
+ wmb(); /* the index must be visible before the sown, or signal */
+
+ if (iter->flipowner) {
+ iter->desc->sown = !iter->ioq->locale;
+ wmb(); /* sown must be visible before we signal */
+ }
+
+ ret = ioq_iter_seek(iter, ioq_seek_next, 0, flags);
+
+ if (iter->update)
+ ioq_signal(iter->ioq, 0);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(ioq_iter_push);
+
+int ioq_iter_pop(struct ioq_iterator *iter, int flags)
+{
+ struct ioq_ring_idx *idx = iter->idx;
+ int ret;
+
+ /*
+ * Its only valid to pop if we are currently pointed at the head
+ */
+ if (iter->pos != le32_to_cpu(idx->head) || iter->desc->sown != iter->ioq->locale)
+ return -EINVAL;
+
+ idx->head = cpu_to_le32(modulo_inc(le32_to_cpu(idx->head), iter->ioq->count));
+ wmb(); /* head must be visible before full */
+
+ if (idx->full) {
+ idx->full = 0;
+ wmb(); /* full must be visible before sown */
+ }
+
+ if (iter->flipowner) {
+ iter->desc->sown = !iter->ioq->locale;
+ wmb(); /* sown must be visible before we signal */
+ }
+
+ ret = ioq_iter_seek(iter, ioq_seek_next, 0, flags);
+
+ if (iter->update)
+ ioq_signal(iter->ioq, 0);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(ioq_iter_pop);
+
+static struct ioq_ring_idx *idxtype_to_idx(struct ioq *ioq,
+ enum ioq_idx_type type)
+{
+ struct ioq_ring_idx *idx;
+
+ switch (type) {
+ case ioq_idxtype_valid:
+ case ioq_idxtype_inuse:
+ idx = &ioq->head_desc->idx[type];
+ break;
+ default:
+ panic("IOQ: illegal index type: %d", type);
+ break;
+ }
+
+ return idx;
+}
+
+int ioq_iter_init(struct ioq *ioq, struct ioq_iterator *iter,
+ enum ioq_idx_type type, int flags)
+{
+ iter->ioq = ioq;
+ iter->update = (flags & IOQ_ITER_AUTOUPDATE);
+ iter->flipowner = !(flags & IOQ_ITER_NOFLIPOWNER);
+ iter->pos = -1;
+ iter->desc = NULL;
+ iter->dualidx = 0;
+
+ if (type == ioq_idxtype_both) {
+ /*
+ * "both" is a special case, so we set the dualidx flag.
+ *
+ * However, we also just want to use the valid-index
+ * for normal processing, so override that here
+ */
+ type = ioq_idxtype_valid;
+ iter->dualidx = 1;
+ }
+
+ iter->idx = idxtype_to_idx(ioq, type);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(ioq_iter_init);
+
+int ioq_count(struct ioq *ioq, enum ioq_idx_type type)
+{
+ return ioq_ring_count(idxtype_to_idx(ioq, type), ioq->count);
+}
+EXPORT_SYMBOL_GPL(ioq_count);
+
+int ioq_remain(struct ioq *ioq, enum ioq_idx_type type)
+{
+ int count = ioq_ring_count(idxtype_to_idx(ioq, type), ioq->count);
+
+ return ioq->count - count;
+}
+EXPORT_SYMBOL_GPL(ioq_remain);
+
+int ioq_size(struct ioq *ioq)
+{
+ return ioq->count;
+}
+EXPORT_SYMBOL_GPL(ioq_size);
+
+int ioq_full(struct ioq *ioq, enum ioq_idx_type type)
+{
+ struct ioq_ring_idx *idx = idxtype_to_idx(ioq, type);
+
+ return idx_full(idx);
+}
+EXPORT_SYMBOL_GPL(ioq_full);
+
+static void ioq_shm_signal(struct shm_signal_notifier *notifier)
+{
+ struct ioq *ioq = container_of(notifier, struct ioq, shm_notifier);
+
+ if (waitqueue_active(&ioq->wq))
+ wake_up(&ioq->wq);
+
+ if (ioq->notifier)
+ ioq->notifier->signal(ioq->notifier);
+}
+
+void ioq_init(struct ioq *ioq,
+ struct ioq_ops *ops,
+ enum ioq_locality locale,
+ struct ioq_ring_head *head,
+ struct shm_signal *signal,
+ size_t count)
+{
+ memset(ioq, 0, sizeof(*ioq));
+ kref_init(&ioq->kref);
+ init_waitqueue_head(&ioq->wq);
+
+ ioq->ops = ops;
+ ioq->locale = locale;
+ ioq->head_desc = head;
+ ioq->ring = &head->ring[0];
+ ioq->count = count;
+ ioq->signal = signal;
+
+ ioq->shm_notifier.signal = &ioq_shm_signal;
+ signal->notifier = &ioq->shm_notifier;
+}
+EXPORT_SYMBOL_GPL(ioq_init);
diff --git a/lib/shm_signal.c b/lib/shm_signal.c
new file mode 100644
index 000000000000..8d3e9b418a27
--- /dev/null
+++ b/lib/shm_signal.c
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2009 Novell. All Rights Reserved.
+ *
+ * See include/linux/shm_signal.h for documentation
+ *
+ * Author:
+ * Gregory Haskins <ghaskins@novell.com>
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/shm_signal.h>
+
+MODULE_AUTHOR("Gregory Haskins");
+MODULE_LICENSE("GPL");
+MODULE_VERSION("1");
+
+int shm_signal_enable(struct shm_signal *s, int flags)
+{
+ struct shm_signal_irq *irq = &s->desc->irq[s->locale];
+ unsigned long iflags;
+
+ spin_lock_irqsave(&s->lock, iflags);
+
+ irq->enabled = 1;
+ wmb();
+
+ if ((irq->dirty || irq->pending)
+ && !test_bit(shm_signal_in_wakeup, &s->flags)) {
+ rmb();
+ tasklet_schedule(&s->deferred_notify);
+ }
+
+ spin_unlock_irqrestore(&s->lock, iflags);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(shm_signal_enable);
+
+int shm_signal_disable(struct shm_signal *s, int flags)
+{
+ struct shm_signal_irq *irq = &s->desc->irq[s->locale];
+
+ irq->enabled = 0;
+ wmb();
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(shm_signal_disable);
+
+/*
+ * signaling protocol:
+ *
+ * each side of the shm_signal has an "irq" structure with the following
+ * fields:
+ *
+ * - enabled: controlled by shm_signal_enable/disable() to mask/unmask
+ * the notification locally
+ * - dirty: indicates if the shared-memory is dirty or clean. This
+ * is updated regardless of the enabled/pending state so that
+ * the state is always accurately tracked.
+ * - pending: indicates if a signal is pending to the remote locale.
+ * This allows us to determine if a remote-notification is
+ * already in flight to optimize spurious notifications away.
+ */
+int shm_signal_inject(struct shm_signal *s, int flags)
+{
+ /* Load the irq structure from the other locale */
+ struct shm_signal_irq *irq = &s->desc->irq[!s->locale];
+
+ /*
+ * We always mark the remote side as dirty regardless of whether
+ * they need to be notified.
+ */
+ irq->dirty = 1;
+ wmb(); /* dirty must be visible before we test the pending state */
+
+ if (irq->enabled && !irq->pending) {
+ rmb();
+
+ /*
+ * If the remote side has enabled notifications, and we do
+ * not see a notification pending, we must inject a new one.
+ */
+ irq->pending = 1;
+ wmb(); /* make it visible before we do the injection */
+
+ s->ops->inject(s);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(shm_signal_inject);
+
+void _shm_signal_wakeup(struct shm_signal *s)
+{
+ struct shm_signal_irq *irq = &s->desc->irq[s->locale];
+ int dirty;
+ unsigned long flags;
+
+ spin_lock_irqsave(&s->lock, flags);
+
+ __set_bit(shm_signal_in_wakeup, &s->flags);
+
+ /*
+ * The outer loop protects against race conditions between
+ * irq->dirty and irq->pending updates
+ */
+ while (irq->enabled && (irq->dirty || irq->pending)) {
+
+ /*
+ * Run until we completely exhaust irq->dirty (it may
+ * be re-dirtied by the remote side while we are in the
+ * callback). We let "pending" remain untouched until we have
+ * processed them all so that the remote side knows we do not
+ * need a new notification (yet).
+ */
+ do {
+ irq->dirty = 0;
+ /* the unlock is an implicit wmb() for dirty = 0 */
+ spin_unlock_irqrestore(&s->lock, flags);
+
+ if (s->notifier)
+ s->notifier->signal(s->notifier);
+
+ spin_lock_irqsave(&s->lock, flags);
+ dirty = irq->dirty;
+ rmb();
+
+ } while (irq->enabled && dirty);
+
+ barrier();
+
+ /*
+ * We can finally acknowledge the notification by clearing
+ * "pending" after all of the dirty memory has been processed
+ * Races against this clearing are handled by the outer loop.
+ * Subsequent iterations of this loop will execute with
+ * pending=0 potentially leading to future spurious
+ * notifications, but this is an acceptable tradeoff as this
+ * will be rare and harmless.
+ */
+ irq->pending = 0;
+ wmb();
+
+ }
+
+ __clear_bit(shm_signal_in_wakeup, &s->flags);
+ spin_unlock_irqrestore(&s->lock, flags);
+
+}
+EXPORT_SYMBOL_GPL(_shm_signal_wakeup);
+
+void _shm_signal_release(struct kref *kref)
+{
+ struct shm_signal *s = container_of(kref, struct shm_signal, kref);
+
+ s->ops->release(s);
+}
+EXPORT_SYMBOL_GPL(_shm_signal_release);
+
+static void
+deferred_notify(unsigned long data)
+{
+ struct shm_signal *s = (struct shm_signal *)data;
+
+ _shm_signal_wakeup(s);
+}
+
+void shm_signal_init(struct shm_signal *s, enum shm_signal_locality locale,
+ struct shm_signal_ops *ops, struct shm_signal_desc *desc)
+{
+ memset(s, 0, sizeof(*s));
+ kref_init(&s->kref);
+ spin_lock_init(&s->lock);
+ tasklet_init(&s->deferred_notify,
+ deferred_notify,
+ (unsigned long)s);
+ s->locale = locale;
+ s->ops = ops;
+ s->desc = desc;
+}
+EXPORT_SYMBOL_GPL(shm_signal_init);
diff --git a/mm/percpu.c b/mm/percpu.c
index e61dc2cc5873..039f51a0dc3f 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -31,7 +31,7 @@
* as small as 4 bytes. The allocator organizes chunks into lists
* according to free size and tries to allocate from the fullest one.
* Each chunk keeps the maximum contiguous area size hint which is
- * guaranteed to be eqaul to or larger than the maximum contiguous
+ * guaranteed to be equal to or larger than the maximum contiguous
* area in the chunk. This helps the allocator not to iterate the
* chunk maps unnecessarily.
*
diff --git a/mm/slab.c b/mm/slab.c
index 88435fcc8387..fcae9815d3b3 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -2330,8 +2330,8 @@ kmem_cache_create (const char *name, size_t size, size_t align,
}
#if FORCED_DEBUG && defined(CONFIG_DEBUG_PAGEALLOC)
if (size >= malloc_sizes[INDEX_L3 + 1].cs_size
- && cachep->obj_size > cache_line_size() && size < PAGE_SIZE) {
- cachep->obj_offset += PAGE_SIZE - size;
+ && cachep->obj_size > cache_line_size() && ALIGN(size, align) < PAGE_SIZE) {
+ cachep->obj_offset += PAGE_SIZE - ALIGN(size, align);
size = PAGE_SIZE;
}
#endif
diff --git a/net/Kconfig b/net/Kconfig
index e330594d3709..c1cf34b6cfa0 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -293,6 +293,7 @@ source "net/wimax/Kconfig"
source "net/rfkill/Kconfig"
source "net/9p/Kconfig"
source "net/caif/Kconfig"
+source "net/ceph/Kconfig"
endif # if NET
diff --git a/net/Makefile b/net/Makefile
index ea60fbce9b1b..6b7bfd7f1416 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -68,3 +68,4 @@ obj-$(CONFIG_SYSCTL) += sysctl_net.o
endif
obj-$(CONFIG_WIMAX) += wimax/
obj-$(CONFIG_DNS_RESOLVER) += dns_resolver/
+obj-$(CONFIG_CEPH_LIB) += ceph/
diff --git a/net/atm/common.c b/net/atm/common.c
index 940404a73b3d..1b9c52a02cd3 100644
--- a/net/atm/common.c
+++ b/net/atm/common.c
@@ -792,7 +792,7 @@ int vcc_getsockopt(struct socket *sock, int level, int optname,
default:
if (level == SOL_SOCKET)
return -EINVAL;
- break;
+ break;
}
if (!vcc->dev || !vcc->dev->ops->getsockopt)
return -EINVAL;
diff --git a/net/ceph/Kconfig b/net/ceph/Kconfig
new file mode 100644
index 000000000000..fd2db4a40f2a
--- /dev/null
+++ b/net/ceph/Kconfig
@@ -0,0 +1,27 @@
+config CEPH_LIB
+ tristate "Ceph core library (EXPERIMENTAL)"
+ depends on INET && EXPERIMENTAL
+ select LIBCRC32C
+ select CRYPTO_AES
+ default n
+ help
+ Choose Y or M here to include cephlib, which provides the
+ common functionality to both the Ceph filesystem and
+ to the rados block device (rbd).
+
+ More information at http://ceph.newdream.net/.
+
+ If unsure, say N.
+
+config CEPH_LIB_PRETTYDEBUG
+ bool "Include file:line in ceph debug output"
+ depends on CEPH_LIB
+ default n
+ help
+ If you say Y here, debug output will include a filename and
+ line to aid debugging. This increases kernel size and slows
+ execution slightly when debug call sites are enabled (e.g.,
+ via CONFIG_DYNAMIC_DEBUG).
+
+ If unsure, say N.
+
diff --git a/net/ceph/Makefile b/net/ceph/Makefile
new file mode 100644
index 000000000000..aab1cabb8035
--- /dev/null
+++ b/net/ceph/Makefile
@@ -0,0 +1,37 @@
+#
+# Makefile for CEPH filesystem.
+#
+
+ifneq ($(KERNELRELEASE),)
+
+obj-$(CONFIG_CEPH_LIB) += libceph.o
+
+libceph-objs := ceph_common.o messenger.o msgpool.o buffer.o pagelist.o \
+ mon_client.o \
+ osd_client.o osdmap.o crush/crush.o crush/mapper.o crush/hash.o \
+ debugfs.o \
+ auth.o auth_none.o \
+ crypto.o armor.o \
+ auth_x.o \
+ ceph_fs.o ceph_strings.o ceph_hash.o \
+ pagevec.o
+
+else
+#Otherwise we were called directly from the command
+# line; invoke the kernel build system.
+
+KERNELDIR ?= /lib/modules/$(shell uname -r)/build
+PWD := $(shell pwd)
+
+default: all
+
+all:
+ $(MAKE) -C $(KERNELDIR) M=$(PWD) CONFIG_CEPH_LIB=m modules
+
+modules_install:
+ $(MAKE) -C $(KERNELDIR) M=$(PWD) CONFIG_CEPH_LIB=m modules_install
+
+clean:
+ $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
+
+endif
diff --git a/fs/ceph/armor.c b/net/ceph/armor.c
index eb2a666b0be7..eb2a666b0be7 100644
--- a/fs/ceph/armor.c
+++ b/net/ceph/armor.c
diff --git a/fs/ceph/auth.c b/net/ceph/auth.c
index 6d2e30600627..549c1f43e1d5 100644
--- a/fs/ceph/auth.c
+++ b/net/ceph/auth.c
@@ -1,16 +1,16 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/module.h>
#include <linux/err.h>
#include <linux/slab.h>
-#include "types.h"
+#include <linux/ceph/types.h>
+#include <linux/ceph/decode.h>
+#include <linux/ceph/libceph.h>
+#include <linux/ceph/messenger.h>
#include "auth_none.h"
#include "auth_x.h"
-#include "decode.h"
-#include "super.h"
-#include "messenger.h"
/*
* get protocol handler
diff --git a/fs/ceph/auth_none.c b/net/ceph/auth_none.c
index ad1dc21286c7..214c2bb43d62 100644
--- a/fs/ceph/auth_none.c
+++ b/net/ceph/auth_none.c
@@ -1,14 +1,15 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/err.h>
#include <linux/module.h>
#include <linux/random.h>
#include <linux/slab.h>
+#include <linux/ceph/decode.h>
+#include <linux/ceph/auth.h>
+
#include "auth_none.h"
-#include "auth.h"
-#include "decode.h"
static void reset(struct ceph_auth_client *ac)
{
diff --git a/fs/ceph/auth_none.h b/net/ceph/auth_none.h
index 8164df1a08be..ed7d088b1bc9 100644
--- a/fs/ceph/auth_none.h
+++ b/net/ceph/auth_none.h
@@ -2,8 +2,7 @@
#define _FS_CEPH_AUTH_NONE_H
#include <linux/slab.h>
-
-#include "auth.h"
+#include <linux/ceph/auth.h>
/*
* null security mode.
diff --git a/fs/ceph/auth_x.c b/net/ceph/auth_x.c
index 582e0b2caf8a..a9651cd27150 100644
--- a/fs/ceph/auth_x.c
+++ b/net/ceph/auth_x.c
@@ -1,16 +1,17 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/err.h>
#include <linux/module.h>
#include <linux/random.h>
#include <linux/slab.h>
+#include <linux/ceph/decode.h>
+#include <linux/ceph/auth.h>
+
+#include "crypto.h"
#include "auth_x.h"
#include "auth_x_protocol.h"
-#include "crypto.h"
-#include "auth.h"
-#include "decode.h"
#define TEMP_TICKET_BUF_LEN 256
diff --git a/fs/ceph/auth_x.h b/net/ceph/auth_x.h
index ff6f8180e681..e02da7a5c5a1 100644
--- a/fs/ceph/auth_x.h
+++ b/net/ceph/auth_x.h
@@ -3,8 +3,9 @@
#include <linux/rbtree.h>
+#include <linux/ceph/auth.h>
+
#include "crypto.h"
-#include "auth.h"
#include "auth_x_protocol.h"
/*
diff --git a/fs/ceph/auth_x_protocol.h b/net/ceph/auth_x_protocol.h
index 671d30576c4f..671d30576c4f 100644
--- a/fs/ceph/auth_x_protocol.h
+++ b/net/ceph/auth_x_protocol.h
diff --git a/fs/ceph/buffer.c b/net/ceph/buffer.c
index cd39f17021de..53d8abfa25d5 100644
--- a/fs/ceph/buffer.c
+++ b/net/ceph/buffer.c
@@ -1,10 +1,11 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
+#include <linux/module.h>
#include <linux/slab.h>
-#include "buffer.h"
-#include "decode.h"
+#include <linux/ceph/buffer.h>
+#include <linux/ceph/decode.h>
struct ceph_buffer *ceph_buffer_new(size_t len, gfp_t gfp)
{
@@ -32,6 +33,7 @@ struct ceph_buffer *ceph_buffer_new(size_t len, gfp_t gfp)
dout("buffer_new %p\n", b);
return b;
}
+EXPORT_SYMBOL(ceph_buffer_new);
void ceph_buffer_release(struct kref *kref)
{
@@ -46,6 +48,7 @@ void ceph_buffer_release(struct kref *kref)
}
kfree(b);
}
+EXPORT_SYMBOL(ceph_buffer_release);
int ceph_decode_buffer(struct ceph_buffer **b, void **p, void *end)
{
diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c
new file mode 100644
index 000000000000..f6f2eebc0767
--- /dev/null
+++ b/net/ceph/ceph_common.c
@@ -0,0 +1,529 @@
+
+#include <linux/ceph/ceph_debug.h>
+#include <linux/backing-dev.h>
+#include <linux/ctype.h>
+#include <linux/fs.h>
+#include <linux/inet.h>
+#include <linux/in6.h>
+#include <linux/module.h>
+#include <linux/mount.h>
+#include <linux/parser.h>
+#include <linux/sched.h>
+#include <linux/seq_file.h>
+#include <linux/slab.h>
+#include <linux/statfs.h>
+#include <linux/string.h>
+
+
+#include <linux/ceph/libceph.h>
+#include <linux/ceph/debugfs.h>
+#include <linux/ceph/decode.h>
+#include <linux/ceph/mon_client.h>
+#include <linux/ceph/auth.h>
+
+
+
+/*
+ * find filename portion of a path (/foo/bar/baz -> baz)
+ */
+const char *ceph_file_part(const char *s, int len)
+{
+ const char *e = s + len;
+
+ while (e != s && *(e-1) != '/')
+ e--;
+ return e;
+}
+EXPORT_SYMBOL(ceph_file_part);
+
+const char *ceph_msg_type_name(int type)
+{
+ switch (type) {
+ case CEPH_MSG_SHUTDOWN: return "shutdown";
+ case CEPH_MSG_PING: return "ping";
+ case CEPH_MSG_AUTH: return "auth";
+ case CEPH_MSG_AUTH_REPLY: return "auth_reply";
+ case CEPH_MSG_MON_MAP: return "mon_map";
+ case CEPH_MSG_MON_GET_MAP: return "mon_get_map";
+ case CEPH_MSG_MON_SUBSCRIBE: return "mon_subscribe";
+ case CEPH_MSG_MON_SUBSCRIBE_ACK: return "mon_subscribe_ack";
+ case CEPH_MSG_STATFS: return "statfs";
+ case CEPH_MSG_STATFS_REPLY: return "statfs_reply";
+ case CEPH_MSG_MDS_MAP: return "mds_map";
+ case CEPH_MSG_CLIENT_SESSION: return "client_session";
+ case CEPH_MSG_CLIENT_RECONNECT: return "client_reconnect";
+ case CEPH_MSG_CLIENT_REQUEST: return "client_request";
+ case CEPH_MSG_CLIENT_REQUEST_FORWARD: return "client_request_forward";
+ case CEPH_MSG_CLIENT_REPLY: return "client_reply";
+ case CEPH_MSG_CLIENT_CAPS: return "client_caps";
+ case CEPH_MSG_CLIENT_CAPRELEASE: return "client_cap_release";
+ case CEPH_MSG_CLIENT_SNAP: return "client_snap";
+ case CEPH_MSG_CLIENT_LEASE: return "client_lease";
+ case CEPH_MSG_OSD_MAP: return "osd_map";
+ case CEPH_MSG_OSD_OP: return "osd_op";
+ case CEPH_MSG_OSD_OPREPLY: return "osd_opreply";
+ default: return "unknown";
+ }
+}
+EXPORT_SYMBOL(ceph_msg_type_name);
+
+/*
+ * Initially learn our fsid, or verify an fsid matches.
+ */
+int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid)
+{
+ if (client->have_fsid) {
+ if (ceph_fsid_compare(&client->fsid, fsid)) {
+ pr_err("bad fsid, had %pU got %pU",
+ &client->fsid, fsid);
+ return -1;
+ }
+ } else {
+ pr_info("client%lld fsid %pU\n", ceph_client_id(client), fsid);
+ memcpy(&client->fsid, fsid, sizeof(*fsid));
+ ceph_debugfs_client_init(client);
+ client->have_fsid = true;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(ceph_check_fsid);
+
+static int strcmp_null(const char *s1, const char *s2)
+{
+ if (!s1 && !s2)
+ return 0;
+ if (s1 && !s2)
+ return -1;
+ if (!s1 && s2)
+ return 1;
+ return strcmp(s1, s2);
+}
+
+int ceph_compare_options(struct ceph_options *new_opt,
+ struct ceph_client *client)
+{
+ struct ceph_options *opt1 = new_opt;
+ struct ceph_options *opt2 = client->options;
+ int ofs = offsetof(struct ceph_options, mon_addr);
+ int i;
+ int ret;
+
+ ret = memcmp(opt1, opt2, ofs);
+ if (ret)
+ return ret;
+
+ ret = strcmp_null(opt1->name, opt2->name);
+ if (ret)
+ return ret;
+
+ ret = strcmp_null(opt1->secret, opt2->secret);
+ if (ret)
+ return ret;
+
+ /* any matching mon ip implies a match */
+ for (i = 0; i < opt1->num_mon; i++) {
+ if (ceph_monmap_contains(client->monc.monmap,
+ &opt1->mon_addr[i]))
+ return 0;
+ }
+ return -1;
+}
+EXPORT_SYMBOL(ceph_compare_options);
+
+
+static int parse_fsid(const char *str, struct ceph_fsid *fsid)
+{
+ int i = 0;
+ char tmp[3];
+ int err = -EINVAL;
+ int d;
+
+ dout("parse_fsid '%s'\n", str);
+ tmp[2] = 0;
+ while (*str && i < 16) {
+ if (ispunct(*str)) {
+ str++;
+ continue;
+ }
+ if (!isxdigit(str[0]) || !isxdigit(str[1]))
+ break;
+ tmp[0] = str[0];
+ tmp[1] = str[1];
+ if (sscanf(tmp, "%x", &d) < 1)
+ break;
+ fsid->fsid[i] = d & 0xff;
+ i++;
+ str += 2;
+ }
+
+ if (i == 16)
+ err = 0;
+ dout("parse_fsid ret %d got fsid %pU", err, fsid);
+ return err;
+}
+
+/*
+ * ceph options
+ */
+enum {
+ Opt_osdtimeout,
+ Opt_osdkeepalivetimeout,
+ Opt_mount_timeout,
+ Opt_osd_idle_ttl,
+ Opt_last_int,
+ /* int args above */
+ Opt_fsid,
+ Opt_name,
+ Opt_secret,
+ Opt_ip,
+ Opt_last_string,
+ /* string args above */
+ Opt_noshare,
+ Opt_nocrc,
+};
+
+static match_table_t opt_tokens = {
+ {Opt_osdtimeout, "osdtimeout=%d"},
+ {Opt_osdkeepalivetimeout, "osdkeepalive=%d"},
+ {Opt_mount_timeout, "mount_timeout=%d"},
+ {Opt_osd_idle_ttl, "osd_idle_ttl=%d"},
+ /* int args above */
+ {Opt_fsid, "fsid=%s"},
+ {Opt_name, "name=%s"},
+ {Opt_secret, "secret=%s"},
+ {Opt_ip, "ip=%s"},
+ /* string args above */
+ {Opt_noshare, "noshare"},
+ {Opt_nocrc, "nocrc"},
+ {-1, NULL}
+};
+
+void ceph_destroy_options(struct ceph_options *opt)
+{
+ dout("destroy_options %p\n", opt);
+ kfree(opt->name);
+ kfree(opt->secret);
+ kfree(opt);
+}
+EXPORT_SYMBOL(ceph_destroy_options);
+
+int ceph_parse_options(struct ceph_options **popt, char *options,
+ const char *dev_name, const char *dev_name_end,
+ int (*parse_extra_token)(char *c, void *private),
+ void *private)
+{
+ struct ceph_options *opt;
+ const char *c;
+ int err = -ENOMEM;
+ substring_t argstr[MAX_OPT_ARGS];
+
+ opt = kzalloc(sizeof(*opt), GFP_KERNEL);
+ if (!opt)
+ return err;
+ opt->mon_addr = kcalloc(CEPH_MAX_MON, sizeof(*opt->mon_addr),
+ GFP_KERNEL);
+ if (!opt->mon_addr)
+ goto out;
+
+ dout("parse_options %p options '%s' dev_name '%s'\n", opt, options,
+ dev_name);
+
+ /* start with defaults */
+ opt->flags = CEPH_OPT_DEFAULT;
+ opt->osd_timeout = CEPH_OSD_TIMEOUT_DEFAULT;
+ opt->osd_keepalive_timeout = CEPH_OSD_KEEPALIVE_DEFAULT;
+ opt->mount_timeout = CEPH_MOUNT_TIMEOUT_DEFAULT; /* seconds */
+ opt->osd_idle_ttl = CEPH_OSD_IDLE_TTL_DEFAULT; /* seconds */
+
+ /* get mon ip(s) */
+ /* ip1[:port1][,ip2[:port2]...] */
+ err = ceph_parse_ips(dev_name, dev_name_end, opt->mon_addr,
+ CEPH_MAX_MON, &opt->num_mon);
+ if (err < 0)
+ goto out;
+
+ /* parse mount options */
+ while ((c = strsep(&options, ",")) != NULL) {
+ int token, intval, ret;
+ if (!*c)
+ continue;
+ err = -EINVAL;
+ token = match_token((char *)c, opt_tokens, argstr);
+ if (token < 0) {
+ /* extra? */
+ err = parse_extra_token((char *)c, private);
+ if (err < 0) {
+ pr_err("bad option at '%s'\n", c);
+ goto out;
+ }
+ continue;
+ }
+ if (token < Opt_last_int) {
+ ret = match_int(&argstr[0], &intval);
+ if (ret < 0) {
+ pr_err("bad mount option arg (not int) "
+ "at '%s'\n", c);
+ continue;
+ }
+ dout("got int token %d val %d\n", token, intval);
+ } else if (token > Opt_last_int && token < Opt_last_string) {
+ dout("got string token %d val %s\n", token,
+ argstr[0].from);
+ } else {
+ dout("got token %d\n", token);
+ }
+ switch (token) {
+ case Opt_ip:
+ err = ceph_parse_ips(argstr[0].from,
+ argstr[0].to,
+ &opt->my_addr,
+ 1, NULL);
+ if (err < 0)
+ goto out;
+ opt->flags |= CEPH_OPT_MYIP;
+ break;
+
+ case Opt_fsid:
+ err = parse_fsid(argstr[0].from, &opt->fsid);
+ if (err == 0)
+ opt->flags |= CEPH_OPT_FSID;
+ break;
+ case Opt_name:
+ opt->name = kstrndup(argstr[0].from,
+ argstr[0].to-argstr[0].from,
+ GFP_KERNEL);
+ break;
+ case Opt_secret:
+ opt->secret = kstrndup(argstr[0].from,
+ argstr[0].to-argstr[0].from,
+ GFP_KERNEL);
+ break;
+
+ /* misc */
+ case Opt_osdtimeout:
+ opt->osd_timeout = intval;
+ break;
+ case Opt_osdkeepalivetimeout:
+ opt->osd_keepalive_timeout = intval;
+ break;
+ case Opt_osd_idle_ttl:
+ opt->osd_idle_ttl = intval;
+ break;
+ case Opt_mount_timeout:
+ opt->mount_timeout = intval;
+ break;
+
+ case Opt_noshare:
+ opt->flags |= CEPH_OPT_NOSHARE;
+ break;
+
+ case Opt_nocrc:
+ opt->flags |= CEPH_OPT_NOCRC;
+ break;
+
+ default:
+ BUG_ON(token);
+ }
+ }
+
+ /* success */
+ *popt = opt;
+ return 0;
+
+out:
+ ceph_destroy_options(opt);
+ return err;
+}
+EXPORT_SYMBOL(ceph_parse_options);
+
+u64 ceph_client_id(struct ceph_client *client)
+{
+ return client->monc.auth->global_id;
+}
+EXPORT_SYMBOL(ceph_client_id);
+
+/*
+ * create a fresh client instance
+ */
+struct ceph_client *ceph_create_client(struct ceph_options *opt, void *private)
+{
+ struct ceph_client *client;
+ int err = -ENOMEM;
+
+ client = kzalloc(sizeof(*client), GFP_KERNEL);
+ if (client == NULL)
+ return ERR_PTR(-ENOMEM);
+
+ client->private = private;
+ client->options = opt;
+
+ mutex_init(&client->mount_mutex);
+ init_waitqueue_head(&client->auth_wq);
+ client->auth_err = 0;
+
+ client->extra_mon_dispatch = NULL;
+ client->supported_features = CEPH_FEATURE_SUPPORTED_DEFAULT;
+ client->required_features = CEPH_FEATURE_REQUIRED_DEFAULT;
+
+ client->msgr = NULL;
+
+ /* subsystems */
+ err = ceph_monc_init(&client->monc, client);
+ if (err < 0)
+ goto fail;
+ err = ceph_osdc_init(&client->osdc, client);
+ if (err < 0)
+ goto fail_monc;
+
+ return client;
+
+fail_monc:
+ ceph_monc_stop(&client->monc);
+fail:
+ kfree(client);
+ return ERR_PTR(err);
+}
+EXPORT_SYMBOL(ceph_create_client);
+
+void ceph_destroy_client(struct ceph_client *client)
+{
+ dout("destroy_client %p\n", client);
+
+ /* unmount */
+ ceph_osdc_stop(&client->osdc);
+
+ /*
+ * make sure mds and osd connections close out before destroying
+ * the auth module, which is needed to free those connections'
+ * ceph_authorizers.
+ */
+ ceph_msgr_flush();
+
+ ceph_monc_stop(&client->monc);
+
+ ceph_debugfs_client_cleanup(client);
+
+ if (client->msgr)
+ ceph_messenger_destroy(client->msgr);
+
+ ceph_destroy_options(client->options);
+
+ kfree(client);
+ dout("destroy_client %p done\n", client);
+}
+EXPORT_SYMBOL(ceph_destroy_client);
+
+/*
+ * true if we have the mon map (and have thus joined the cluster)
+ */
+static int have_mon_and_osd_map(struct ceph_client *client)
+{
+ return client->monc.monmap && client->monc.monmap->epoch &&
+ client->osdc.osdmap && client->osdc.osdmap->epoch;
+}
+
+/*
+ * mount: join the ceph cluster, and open root directory.
+ */
+int __ceph_open_session(struct ceph_client *client, unsigned long started)
+{
+ struct ceph_entity_addr *myaddr = NULL;
+ int err;
+ unsigned long timeout = client->options->mount_timeout * HZ;
+
+ /* initialize the messenger */
+ if (client->msgr == NULL) {
+ if (ceph_test_opt(client, MYIP))
+ myaddr = &client->options->my_addr;
+ client->msgr = ceph_messenger_create(myaddr,
+ client->supported_features,
+ client->required_features);
+ if (IS_ERR(client->msgr)) {
+ client->msgr = NULL;
+ return PTR_ERR(client->msgr);
+ }
+ client->msgr->nocrc = ceph_test_opt(client, NOCRC);
+ }
+
+ /* open session, and wait for mon and osd maps */
+ err = ceph_monc_open_session(&client->monc);
+ if (err < 0)
+ return err;
+
+ while (!have_mon_and_osd_map(client)) {
+ err = -EIO;
+ if (timeout && time_after_eq(jiffies, started + timeout))
+ return err;
+
+ /* wait */
+ dout("mount waiting for mon_map\n");
+ err = wait_event_interruptible_timeout(client->auth_wq,
+ have_mon_and_osd_map(client) || (client->auth_err < 0),
+ timeout);
+ if (err == -EINTR || err == -ERESTARTSYS)
+ return err;
+ if (client->auth_err < 0)
+ return client->auth_err;
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(__ceph_open_session);
+
+
+int ceph_open_session(struct ceph_client *client)
+{
+ int ret;
+ unsigned long started = jiffies; /* note the start time */
+
+ dout("open_session start\n");
+ mutex_lock(&client->mount_mutex);
+
+ ret = __ceph_open_session(client, started);
+
+ mutex_unlock(&client->mount_mutex);
+ return ret;
+}
+EXPORT_SYMBOL(ceph_open_session);
+
+
+static int __init init_ceph_lib(void)
+{
+ int ret = 0;
+
+ ret = ceph_debugfs_init();
+ if (ret < 0)
+ goto out;
+
+ ret = ceph_msgr_init();
+ if (ret < 0)
+ goto out_debugfs;
+
+ pr_info("loaded (mon/osd proto %d/%d, osdmap %d/%d %d/%d)\n",
+ CEPH_MONC_PROTOCOL, CEPH_OSDC_PROTOCOL,
+ CEPH_OSDMAP_VERSION, CEPH_OSDMAP_VERSION_EXT,
+ CEPH_OSDMAP_INC_VERSION, CEPH_OSDMAP_INC_VERSION_EXT);
+
+ return 0;
+
+out_debugfs:
+ ceph_debugfs_cleanup();
+out:
+ return ret;
+}
+
+static void __exit exit_ceph_lib(void)
+{
+ dout("exit_ceph_lib\n");
+ ceph_msgr_exit();
+ ceph_debugfs_cleanup();
+}
+
+module_init(init_ceph_lib);
+module_exit(exit_ceph_lib);
+
+MODULE_AUTHOR("Sage Weil <sage@newdream.net>");
+MODULE_AUTHOR("Yehuda Sadeh <yehuda@hq.newdream.net>");
+MODULE_AUTHOR("Patience Warnick <patience@newdream.net>");
+MODULE_DESCRIPTION("Ceph filesystem for Linux");
+MODULE_LICENSE("GPL");
diff --git a/fs/ceph/ceph_fs.c b/net/ceph/ceph_fs.c
index 3ac6cc7c1156..a3a3a31d3c37 100644
--- a/fs/ceph/ceph_fs.c
+++ b/net/ceph/ceph_fs.c
@@ -1,7 +1,8 @@
/*
* Some non-inline ceph helpers
*/
-#include "types.h"
+#include <linux/module.h>
+#include <linux/ceph/types.h>
/*
* return true if @layout appears to be valid
@@ -52,6 +53,7 @@ int ceph_flags_to_mode(int flags)
return mode;
}
+EXPORT_SYMBOL(ceph_flags_to_mode);
int ceph_caps_for_mode(int mode)
{
@@ -70,3 +72,4 @@ int ceph_caps_for_mode(int mode)
return caps;
}
+EXPORT_SYMBOL(ceph_caps_for_mode);
diff --git a/fs/ceph/ceph_hash.c b/net/ceph/ceph_hash.c
index bd570015d147..815ef8826796 100644
--- a/fs/ceph/ceph_hash.c
+++ b/net/ceph/ceph_hash.c
@@ -1,5 +1,5 @@
-#include "types.h"
+#include <linux/ceph/types.h>
/*
* Robert Jenkin's hash function.
diff --git a/net/ceph/ceph_strings.c b/net/ceph/ceph_strings.c
new file mode 100644
index 000000000000..3fbda04de29c
--- /dev/null
+++ b/net/ceph/ceph_strings.c
@@ -0,0 +1,84 @@
+/*
+ * Ceph string constants
+ */
+#include <linux/module.h>
+#include <linux/ceph/types.h>
+
+const char *ceph_entity_type_name(int type)
+{
+ switch (type) {
+ case CEPH_ENTITY_TYPE_MDS: return "mds";
+ case CEPH_ENTITY_TYPE_OSD: return "osd";
+ case CEPH_ENTITY_TYPE_MON: return "mon";
+ case CEPH_ENTITY_TYPE_CLIENT: return "client";
+ case CEPH_ENTITY_TYPE_AUTH: return "auth";
+ default: return "unknown";
+ }
+}
+
+const char *ceph_osd_op_name(int op)
+{
+ switch (op) {
+ case CEPH_OSD_OP_READ: return "read";
+ case CEPH_OSD_OP_STAT: return "stat";
+
+ case CEPH_OSD_OP_MASKTRUNC: return "masktrunc";
+
+ case CEPH_OSD_OP_WRITE: return "write";
+ case CEPH_OSD_OP_DELETE: return "delete";
+ case CEPH_OSD_OP_TRUNCATE: return "truncate";
+ case CEPH_OSD_OP_ZERO: return "zero";
+ case CEPH_OSD_OP_WRITEFULL: return "writefull";
+ case CEPH_OSD_OP_ROLLBACK: return "rollback";
+
+ case CEPH_OSD_OP_APPEND: return "append";
+ case CEPH_OSD_OP_STARTSYNC: return "startsync";
+ case CEPH_OSD_OP_SETTRUNC: return "settrunc";
+ case CEPH_OSD_OP_TRIMTRUNC: return "trimtrunc";
+
+ case CEPH_OSD_OP_TMAPUP: return "tmapup";
+ case CEPH_OSD_OP_TMAPGET: return "tmapget";
+ case CEPH_OSD_OP_TMAPPUT: return "tmapput";
+
+ case CEPH_OSD_OP_GETXATTR: return "getxattr";
+ case CEPH_OSD_OP_GETXATTRS: return "getxattrs";
+ case CEPH_OSD_OP_SETXATTR: return "setxattr";
+ case CEPH_OSD_OP_SETXATTRS: return "setxattrs";
+ case CEPH_OSD_OP_RESETXATTRS: return "resetxattrs";
+ case CEPH_OSD_OP_RMXATTR: return "rmxattr";
+ case CEPH_OSD_OP_CMPXATTR: return "cmpxattr";
+
+ case CEPH_OSD_OP_PULL: return "pull";
+ case CEPH_OSD_OP_PUSH: return "push";
+ case CEPH_OSD_OP_BALANCEREADS: return "balance-reads";
+ case CEPH_OSD_OP_UNBALANCEREADS: return "unbalance-reads";
+ case CEPH_OSD_OP_SCRUB: return "scrub";
+
+ case CEPH_OSD_OP_WRLOCK: return "wrlock";
+ case CEPH_OSD_OP_WRUNLOCK: return "wrunlock";
+ case CEPH_OSD_OP_RDLOCK: return "rdlock";
+ case CEPH_OSD_OP_RDUNLOCK: return "rdunlock";
+ case CEPH_OSD_OP_UPLOCK: return "uplock";
+ case CEPH_OSD_OP_DNLOCK: return "dnlock";
+
+ case CEPH_OSD_OP_CALL: return "call";
+
+ case CEPH_OSD_OP_PGLS: return "pgls";
+ }
+ return "???";
+}
+
+
+const char *ceph_pool_op_name(int op)
+{
+ switch (op) {
+ case POOL_OP_CREATE: return "create";
+ case POOL_OP_DELETE: return "delete";
+ case POOL_OP_AUID_CHANGE: return "auid change";
+ case POOL_OP_CREATE_SNAP: return "create snap";
+ case POOL_OP_DELETE_SNAP: return "delete snap";
+ case POOL_OP_CREATE_UNMANAGED_SNAP: return "create unmanaged snap";
+ case POOL_OP_DELETE_UNMANAGED_SNAP: return "delete unmanaged snap";
+ }
+ return "???";
+}
diff --git a/fs/ceph/crush/crush.c b/net/ceph/crush/crush.c
index fabd302e5779..338c69667027 100644
--- a/fs/ceph/crush/crush.c
+++ b/net/ceph/crush/crush.c
@@ -8,7 +8,7 @@
# define BUG_ON(x) assert(!(x))
#endif
-#include "crush.h"
+#include <linux/ceph/crush/crush.h>
const char *crush_bucket_alg_name(int alg)
{
diff --git a/fs/ceph/crush/hash.c b/net/ceph/crush/hash.c
index 5873aed694bf..57d6790759e6 100644
--- a/fs/ceph/crush/hash.c
+++ b/net/ceph/crush/hash.c
@@ -1,6 +1,6 @@
#include <linux/types.h>
-#include "hash.h"
+#include <linux/ceph/crush/hash.h>
/*
* Robert Jenkins' function for mixing 32-bit values
diff --git a/fs/ceph/crush/mapper.c b/net/ceph/crush/mapper.c
index a4eec133258e..4e8c35f1a297 100644
--- a/fs/ceph/crush/mapper.c
+++ b/net/ceph/crush/mapper.c
@@ -18,8 +18,8 @@
# define kfree(x) free(x)
#endif
-#include "crush.h"
-#include "hash.h"
+#include <linux/ceph/crush/crush.h>
+#include <linux/ceph/crush/hash.h>
/*
* Implement the core CRUSH mapping algorithm.
diff --git a/fs/ceph/crypto.c b/net/ceph/crypto.c
index a3e627f63293..7b505b0c983f 100644
--- a/fs/ceph/crypto.c
+++ b/net/ceph/crypto.c
@@ -1,13 +1,13 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/err.h>
#include <linux/scatterlist.h>
#include <linux/slab.h>
#include <crypto/hash.h>
+#include <linux/ceph/decode.h>
#include "crypto.h"
-#include "decode.h"
int ceph_crypto_key_encode(struct ceph_crypto_key *key, void **p, void *end)
{
diff --git a/fs/ceph/crypto.h b/net/ceph/crypto.h
index bdf38607323c..f9eccace592b 100644
--- a/fs/ceph/crypto.h
+++ b/net/ceph/crypto.h
@@ -1,8 +1,8 @@
#ifndef _FS_CEPH_CRYPTO_H
#define _FS_CEPH_CRYPTO_H
-#include "types.h"
-#include "buffer.h"
+#include <linux/ceph/types.h>
+#include <linux/ceph/buffer.h>
/*
* cryptographic secret
diff --git a/net/ceph/debugfs.c b/net/ceph/debugfs.c
new file mode 100644
index 000000000000..33d04999f4f2
--- /dev/null
+++ b/net/ceph/debugfs.c
@@ -0,0 +1,268 @@
+#include <linux/ceph/ceph_debug.h>
+
+#include <linux/device.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/ctype.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
+
+#include <linux/ceph/libceph.h>
+#include <linux/ceph/mon_client.h>
+#include <linux/ceph/auth.h>
+#include <linux/ceph/debugfs.h>
+
+#ifdef CONFIG_DEBUG_FS
+
+/*
+ * Implement /sys/kernel/debug/ceph fun
+ *
+ * /sys/kernel/debug/ceph/client* - an instance of the ceph client
+ * .../osdmap - current osdmap
+ * .../monmap - current monmap
+ * .../osdc - active osd requests
+ * .../monc - mon client state
+ * .../dentry_lru - dump contents of dentry lru
+ * .../caps - expose cap (reservation) stats
+ * .../bdi - symlink to ../../bdi/something
+ */
+
+static struct dentry *ceph_debugfs_dir;
+
+static int monmap_show(struct seq_file *s, void *p)
+{
+ int i;
+ struct ceph_client *client = s->private;
+
+ if (client->monc.monmap == NULL)
+ return 0;
+
+ seq_printf(s, "epoch %d\n", client->monc.monmap->epoch);
+ for (i = 0; i < client->monc.monmap->num_mon; i++) {
+ struct ceph_entity_inst *inst =
+ &client->monc.monmap->mon_inst[i];
+
+ seq_printf(s, "\t%s%lld\t%s\n",
+ ENTITY_NAME(inst->name),
+ ceph_pr_addr(&inst->addr.in_addr));
+ }
+ return 0;
+}
+
+static int osdmap_show(struct seq_file *s, void *p)
+{
+ int i;
+ struct ceph_client *client = s->private;
+ struct rb_node *n;
+
+ if (client->osdc.osdmap == NULL)
+ return 0;
+ seq_printf(s, "epoch %d\n", client->osdc.osdmap->epoch);
+ seq_printf(s, "flags%s%s\n",
+ (client->osdc.osdmap->flags & CEPH_OSDMAP_NEARFULL) ?
+ " NEARFULL" : "",
+ (client->osdc.osdmap->flags & CEPH_OSDMAP_FULL) ?
+ " FULL" : "");
+ for (n = rb_first(&client->osdc.osdmap->pg_pools); n; n = rb_next(n)) {
+ struct ceph_pg_pool_info *pool =
+ rb_entry(n, struct ceph_pg_pool_info, node);
+ seq_printf(s, "pg_pool %d pg_num %d / %d, lpg_num %d / %d\n",
+ pool->id, pool->v.pg_num, pool->pg_num_mask,
+ pool->v.lpg_num, pool->lpg_num_mask);
+ }
+ for (i = 0; i < client->osdc.osdmap->max_osd; i++) {
+ struct ceph_entity_addr *addr =
+ &client->osdc.osdmap->osd_addr[i];
+ int state = client->osdc.osdmap->osd_state[i];
+ char sb[64];
+
+ seq_printf(s, "\tosd%d\t%s\t%3d%%\t(%s)\n",
+ i, ceph_pr_addr(&addr->in_addr),
+ ((client->osdc.osdmap->osd_weight[i]*100) >> 16),
+ ceph_osdmap_state_str(sb, sizeof(sb), state));
+ }
+ return 0;
+}
+
+static int monc_show(struct seq_file *s, void *p)
+{
+ struct ceph_client *client = s->private;
+ struct ceph_mon_generic_request *req;
+ struct ceph_mon_client *monc = &client->monc;
+ struct rb_node *rp;
+
+ mutex_lock(&monc->mutex);
+
+ if (monc->have_mdsmap)
+ seq_printf(s, "have mdsmap %u\n", (unsigned)monc->have_mdsmap);
+ if (monc->have_osdmap)
+ seq_printf(s, "have osdmap %u\n", (unsigned)monc->have_osdmap);
+ if (monc->want_next_osdmap)
+ seq_printf(s, "want next osdmap\n");
+
+ for (rp = rb_first(&monc->generic_request_tree); rp; rp = rb_next(rp)) {
+ __u16 op;
+ req = rb_entry(rp, struct ceph_mon_generic_request, node);
+ op = le16_to_cpu(req->request->hdr.type);
+ if (op == CEPH_MSG_STATFS)
+ seq_printf(s, "%lld statfs\n", req->tid);
+ else
+ seq_printf(s, "%lld unknown\n", req->tid);
+ }
+
+ mutex_unlock(&monc->mutex);
+ return 0;
+}
+
+static int osdc_show(struct seq_file *s, void *pp)
+{
+ struct ceph_client *client = s->private;
+ struct ceph_osd_client *osdc = &client->osdc;
+ struct rb_node *p;
+
+ mutex_lock(&osdc->request_mutex);
+ for (p = rb_first(&osdc->requests); p; p = rb_next(p)) {
+ struct ceph_osd_request *req;
+ struct ceph_osd_request_head *head;
+ struct ceph_osd_op *op;
+ int num_ops;
+ int opcode, olen;
+ int i;
+
+ req = rb_entry(p, struct ceph_osd_request, r_node);
+
+ seq_printf(s, "%lld\tosd%d\t%d.%x\t", req->r_tid,
+ req->r_osd ? req->r_osd->o_osd : -1,
+ le32_to_cpu(req->r_pgid.pool),
+ le16_to_cpu(req->r_pgid.ps));
+
+ head = req->r_request->front.iov_base;
+ op = (void *)(head + 1);
+
+ num_ops = le16_to_cpu(head->num_ops);
+ olen = le32_to_cpu(head->object_len);
+ seq_printf(s, "%.*s", olen,
+ (const char *)(head->ops + num_ops));
+
+ if (req->r_reassert_version.epoch)
+ seq_printf(s, "\t%u'%llu",
+ (unsigned)le32_to_cpu(req->r_reassert_version.epoch),
+ le64_to_cpu(req->r_reassert_version.version));
+ else
+ seq_printf(s, "\t");
+
+ for (i = 0; i < num_ops; i++) {
+ opcode = le16_to_cpu(op->op);
+ seq_printf(s, "\t%s", ceph_osd_op_name(opcode));
+ op++;
+ }
+
+ seq_printf(s, "\n");
+ }
+ mutex_unlock(&osdc->request_mutex);
+ return 0;
+}
+
+CEPH_DEFINE_SHOW_FUNC(monmap_show)
+CEPH_DEFINE_SHOW_FUNC(osdmap_show)
+CEPH_DEFINE_SHOW_FUNC(monc_show)
+CEPH_DEFINE_SHOW_FUNC(osdc_show)
+
+int ceph_debugfs_init(void)
+{
+ ceph_debugfs_dir = debugfs_create_dir("ceph", NULL);
+ if (!ceph_debugfs_dir)
+ return -ENOMEM;
+ return 0;
+}
+
+void ceph_debugfs_cleanup(void)
+{
+ debugfs_remove(ceph_debugfs_dir);
+}
+
+int ceph_debugfs_client_init(struct ceph_client *client)
+{
+ int ret = -ENOMEM;
+ char name[80];
+
+ snprintf(name, sizeof(name), "%pU.client%lld", &client->fsid,
+ client->monc.auth->global_id);
+
+ client->debugfs_dir = debugfs_create_dir(name, ceph_debugfs_dir);
+ if (!client->debugfs_dir)
+ goto out;
+
+ client->monc.debugfs_file = debugfs_create_file("monc",
+ 0600,
+ client->debugfs_dir,
+ client,
+ &monc_show_fops);
+ if (!client->monc.debugfs_file)
+ goto out;
+
+ client->osdc.debugfs_file = debugfs_create_file("osdc",
+ 0600,
+ client->debugfs_dir,
+ client,
+ &osdc_show_fops);
+ if (!client->osdc.debugfs_file)
+ goto out;
+
+ client->debugfs_monmap = debugfs_create_file("monmap",
+ 0600,
+ client->debugfs_dir,
+ client,
+ &monmap_show_fops);
+ if (!client->debugfs_monmap)
+ goto out;
+
+ client->debugfs_osdmap = debugfs_create_file("osdmap",
+ 0600,
+ client->debugfs_dir,
+ client,
+ &osdmap_show_fops);
+ if (!client->debugfs_osdmap)
+ goto out;
+
+ return 0;
+
+out:
+ ceph_debugfs_client_cleanup(client);
+ return ret;
+}
+
+void ceph_debugfs_client_cleanup(struct ceph_client *client)
+{
+ debugfs_remove(client->debugfs_osdmap);
+ debugfs_remove(client->debugfs_monmap);
+ debugfs_remove(client->osdc.debugfs_file);
+ debugfs_remove(client->monc.debugfs_file);
+ debugfs_remove(client->debugfs_dir);
+}
+
+#else /* CONFIG_DEBUG_FS */
+
+int ceph_debugfs_init(void)
+{
+ return 0;
+}
+
+void ceph_debugfs_cleanup(void)
+{
+}
+
+int ceph_debugfs_client_init(struct ceph_client *client,
+ int (*module_debugfs_init)(struct ceph_client *))
+{
+ return 0;
+}
+
+void ceph_debugfs_client_cleanup(struct ceph_client *client)
+{
+}
+
+#endif /* CONFIG_DEBUG_FS */
+
+EXPORT_SYMBOL(ceph_debugfs_init);
+EXPORT_SYMBOL(ceph_debugfs_cleanup);
diff --git a/fs/ceph/messenger.c b/net/ceph/messenger.c
index 2502d76fcec1..0e8157ee5d43 100644
--- a/fs/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -1,4 +1,4 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/crc32c.h>
#include <linux/ctype.h>
@@ -9,12 +9,14 @@
#include <linux/slab.h>
#include <linux/socket.h>
#include <linux/string.h>
+#include <linux/bio.h>
+#include <linux/blkdev.h>
#include <net/tcp.h>
-#include "super.h"
-#include "messenger.h"
-#include "decode.h"
-#include "pagelist.h"
+#include <linux/ceph/libceph.h>
+#include <linux/ceph/messenger.h>
+#include <linux/ceph/decode.h>
+#include <linux/ceph/pagelist.h>
/*
* Ceph uses the messenger to exchange ceph_msg messages with other
@@ -48,7 +50,7 @@ static char addr_str[MAX_ADDR_STR][MAX_ADDR_STR_LEN];
static DEFINE_SPINLOCK(addr_str_lock);
static int last_addr_str;
-const char *pr_addr(const struct sockaddr_storage *ss)
+const char *ceph_pr_addr(const struct sockaddr_storage *ss)
{
int i;
char *s;
@@ -79,6 +81,7 @@ const char *pr_addr(const struct sockaddr_storage *ss)
return s;
}
+EXPORT_SYMBOL(ceph_pr_addr);
static void encode_my_addr(struct ceph_messenger *msgr)
{
@@ -91,7 +94,7 @@ static void encode_my_addr(struct ceph_messenger *msgr)
*/
struct workqueue_struct *ceph_msgr_wq;
-int __init ceph_msgr_init(void)
+int ceph_msgr_init(void)
{
ceph_msgr_wq = create_workqueue("ceph-msgr");
if (IS_ERR(ceph_msgr_wq)) {
@@ -102,16 +105,19 @@ int __init ceph_msgr_init(void)
}
return 0;
}
+EXPORT_SYMBOL(ceph_msgr_init);
void ceph_msgr_exit(void)
{
destroy_workqueue(ceph_msgr_wq);
}
+EXPORT_SYMBOL(ceph_msgr_exit);
void ceph_msgr_flush(void)
{
flush_workqueue(ceph_msgr_wq);
}
+EXPORT_SYMBOL(ceph_msgr_flush);
/*
@@ -221,19 +227,19 @@ static struct socket *ceph_tcp_connect(struct ceph_connection *con)
set_sock_callbacks(sock, con);
- dout("connect %s\n", pr_addr(&con->peer_addr.in_addr));
+ dout("connect %s\n", ceph_pr_addr(&con->peer_addr.in_addr));
ret = sock->ops->connect(sock, (struct sockaddr *)paddr, sizeof(*paddr),
O_NONBLOCK);
if (ret == -EINPROGRESS) {
dout("connect %s EINPROGRESS sk_state = %u\n",
- pr_addr(&con->peer_addr.in_addr),
+ ceph_pr_addr(&con->peer_addr.in_addr),
sock->sk->sk_state);
ret = 0;
}
if (ret < 0) {
pr_err("connect %s error %d\n",
- pr_addr(&con->peer_addr.in_addr), ret);
+ ceph_pr_addr(&con->peer_addr.in_addr), ret);
sock_release(sock);
con->sock = NULL;
con->error_msg = "connect error";
@@ -334,7 +340,8 @@ static void reset_connection(struct ceph_connection *con)
*/
void ceph_con_close(struct ceph_connection *con)
{
- dout("con_close %p peer %s\n", con, pr_addr(&con->peer_addr.in_addr));
+ dout("con_close %p peer %s\n", con,
+ ceph_pr_addr(&con->peer_addr.in_addr));
set_bit(CLOSED, &con->state); /* in case there's queued work */
clear_bit(STANDBY, &con->state); /* avoid connect_seq bump */
clear_bit(LOSSYTX, &con->state); /* so we retry next connect */
@@ -347,19 +354,21 @@ void ceph_con_close(struct ceph_connection *con)
mutex_unlock(&con->mutex);
queue_con(con);
}
+EXPORT_SYMBOL(ceph_con_close);
/*
* Reopen a closed connection, with a new peer address.
*/
void ceph_con_open(struct ceph_connection *con, struct ceph_entity_addr *addr)
{
- dout("con_open %p %s\n", con, pr_addr(&addr->in_addr));
+ dout("con_open %p %s\n", con, ceph_pr_addr(&addr->in_addr));
set_bit(OPENING, &con->state);
clear_bit(CLOSED, &con->state);
memcpy(&con->peer_addr, addr, sizeof(*addr));
con->delay = 0; /* reset backoff memory */
queue_con(con);
}
+EXPORT_SYMBOL(ceph_con_open);
/*
* return true if this connection ever successfully opened
@@ -406,6 +415,7 @@ void ceph_con_init(struct ceph_messenger *msgr, struct ceph_connection *con)
INIT_LIST_HEAD(&con->out_sent);
INIT_DELAYED_WORK(&con->work, con_work);
}
+EXPORT_SYMBOL(ceph_con_init);
/*
@@ -529,8 +539,11 @@ static void prepare_write_message(struct ceph_connection *con)
if (le32_to_cpu(m->hdr.data_len) > 0) {
/* initialize page iterator */
con->out_msg_pos.page = 0;
- con->out_msg_pos.page_pos =
- le16_to_cpu(m->hdr.data_off) & ~PAGE_MASK;
+ if (m->pages)
+ con->out_msg_pos.page_pos =
+ le16_to_cpu(m->hdr.data_off) & ~PAGE_MASK;
+ else
+ con->out_msg_pos.page_pos = 0;
con->out_msg_pos.data_pos = 0;
con->out_msg_pos.did_page_crc = 0;
con->out_more = 1; /* data + footer will follow */
@@ -647,7 +660,7 @@ static void prepare_write_connect(struct ceph_messenger *msgr,
dout("prepare_write_connect %p cseq=%d gseq=%d proto=%d\n", con,
con->connect_seq, global_seq, proto);
- con->out_connect.features = cpu_to_le64(CEPH_FEATURE_SUPPORTED);
+ con->out_connect.features = cpu_to_le64(msgr->supported_features);
con->out_connect.host_type = cpu_to_le32(CEPH_ENTITY_TYPE_CLIENT);
con->out_connect.connect_seq = cpu_to_le32(con->connect_seq);
con->out_connect.global_seq = cpu_to_le32(global_seq);
@@ -712,6 +725,31 @@ out:
return ret; /* done! */
}
+#ifdef CONFIG_BLOCK
+static void init_bio_iter(struct bio *bio, struct bio **iter, int *seg)
+{
+ if (!bio) {
+ *iter = NULL;
+ *seg = 0;
+ return;
+ }
+ *iter = bio;
+ *seg = bio->bi_idx;
+}
+
+static void iter_bio_next(struct bio **bio_iter, int *seg)
+{
+ if (*bio_iter == NULL)
+ return;
+
+ BUG_ON(*seg >= (*bio_iter)->bi_vcnt);
+
+ (*seg)++;
+ if (*seg == (*bio_iter)->bi_vcnt)
+ init_bio_iter((*bio_iter)->bi_next, bio_iter, seg);
+}
+#endif
+
/*
* Write as much message data payload as we can. If we finish, queue
* up the footer.
@@ -726,21 +764,46 @@ static int write_partial_msg_pages(struct ceph_connection *con)
size_t len;
int crc = con->msgr->nocrc;
int ret;
+ int total_max_write;
+ int in_trail = 0;
+ size_t trail_len = (msg->trail ? msg->trail->length : 0);
dout("write_partial_msg_pages %p msg %p page %d/%d offset %d\n",
con, con->out_msg, con->out_msg_pos.page, con->out_msg->nr_pages,
con->out_msg_pos.page_pos);
- while (con->out_msg_pos.page < con->out_msg->nr_pages) {
+#ifdef CONFIG_BLOCK
+ if (msg->bio && !msg->bio_iter)
+ init_bio_iter(msg->bio, &msg->bio_iter, &msg->bio_seg);
+#endif
+
+ while (data_len > con->out_msg_pos.data_pos) {
struct page *page = NULL;
void *kaddr = NULL;
+ int max_write = PAGE_SIZE;
+ int page_shift = 0;
+
+ total_max_write = data_len - trail_len -
+ con->out_msg_pos.data_pos;
/*
* if we are calculating the data crc (the default), we need
* to map the page. if our pages[] has been revoked, use the
* zero page.
*/
- if (msg->pages) {
+
+ /* have we reached the trail part of the data? */
+ if (con->out_msg_pos.data_pos >= data_len - trail_len) {
+ in_trail = 1;
+
+ total_max_write = data_len - con->out_msg_pos.data_pos;
+
+ page = list_first_entry(&msg->trail->head,
+ struct page, lru);
+ if (crc)
+ kaddr = kmap(page);
+ max_write = PAGE_SIZE;
+ } else if (msg->pages) {
page = msg->pages[con->out_msg_pos.page];
if (crc)
kaddr = kmap(page);
@@ -749,13 +812,25 @@ static int write_partial_msg_pages(struct ceph_connection *con)
struct page, lru);
if (crc)
kaddr = kmap(page);
+#ifdef CONFIG_BLOCK
+ } else if (msg->bio) {
+ struct bio_vec *bv;
+
+ bv = bio_iovec_idx(msg->bio_iter, msg->bio_seg);
+ page = bv->bv_page;
+ page_shift = bv->bv_offset;
+ if (crc)
+ kaddr = kmap(page) + page_shift;
+ max_write = bv->bv_len;
+#endif
} else {
page = con->msgr->zero_page;
if (crc)
kaddr = page_address(con->msgr->zero_page);
}
- len = min((int)(PAGE_SIZE - con->out_msg_pos.page_pos),
- (int)(data_len - con->out_msg_pos.data_pos));
+ len = min_t(int, max_write - con->out_msg_pos.page_pos,
+ total_max_write);
+
if (crc && !con->out_msg_pos.did_page_crc) {
void *base = kaddr + con->out_msg_pos.page_pos;
u32 tmpcrc = le32_to_cpu(con->out_msg->footer.data_crc);
@@ -765,13 +840,14 @@ static int write_partial_msg_pages(struct ceph_connection *con)
cpu_to_le32(crc32c(tmpcrc, base, len));
con->out_msg_pos.did_page_crc = 1;
}
-
ret = kernel_sendpage(con->sock, page,
- con->out_msg_pos.page_pos, len,
+ con->out_msg_pos.page_pos + page_shift,
+ len,
MSG_DONTWAIT | MSG_NOSIGNAL |
MSG_MORE);
- if (crc && (msg->pages || msg->pagelist))
+ if (crc &&
+ (msg->pages || msg->pagelist || msg->bio || in_trail))
kunmap(page);
if (ret <= 0)
@@ -783,9 +859,16 @@ static int write_partial_msg_pages(struct ceph_connection *con)
con->out_msg_pos.page_pos = 0;
con->out_msg_pos.page++;
con->out_msg_pos.did_page_crc = 0;
- if (msg->pagelist)
+ if (in_trail)
+ list_move_tail(&page->lru,
+ &msg->trail->head);
+ else if (msg->pagelist)
list_move_tail(&page->lru,
&msg->pagelist->head);
+#ifdef CONFIG_BLOCK
+ else if (msg->bio)
+ iter_bio_next(&msg->bio_iter, &msg->bio_seg);
+#endif
}
}
@@ -938,7 +1021,7 @@ static int verify_hello(struct ceph_connection *con)
{
if (memcmp(con->in_banner, CEPH_BANNER, strlen(CEPH_BANNER))) {
pr_err("connect to %s got bad banner\n",
- pr_addr(&con->peer_addr.in_addr));
+ ceph_pr_addr(&con->peer_addr.in_addr));
con->error_msg = "protocol error, bad banner";
return -1;
}
@@ -1041,7 +1124,7 @@ int ceph_parse_ips(const char *c, const char *end,
addr_set_port(ss, port);
- dout("parse_ips got %s\n", pr_addr(ss));
+ dout("parse_ips got %s\n", ceph_pr_addr(ss));
if (p == end)
break;
@@ -1061,6 +1144,7 @@ bad:
pr_err("parse_ips bad ip '%.*s'\n", (int)(end - c), c);
return -EINVAL;
}
+EXPORT_SYMBOL(ceph_parse_ips);
static int process_banner(struct ceph_connection *con)
{
@@ -1082,9 +1166,9 @@ static int process_banner(struct ceph_connection *con)
!(addr_is_blank(&con->actual_peer_addr.in_addr) &&
con->actual_peer_addr.nonce == con->peer_addr.nonce)) {
pr_warning("wrong peer, want %s/%d, got %s/%d\n",
- pr_addr(&con->peer_addr.in_addr),
+ ceph_pr_addr(&con->peer_addr.in_addr),
(int)le32_to_cpu(con->peer_addr.nonce),
- pr_addr(&con->actual_peer_addr.in_addr),
+ ceph_pr_addr(&con->actual_peer_addr.in_addr),
(int)le32_to_cpu(con->actual_peer_addr.nonce));
con->error_msg = "wrong peer at address";
return -1;
@@ -1102,7 +1186,7 @@ static int process_banner(struct ceph_connection *con)
addr_set_port(&con->msgr->inst.addr.in_addr, port);
encode_my_addr(con->msgr);
dout("process_banner learned my addr is %s\n",
- pr_addr(&con->msgr->inst.addr.in_addr));
+ ceph_pr_addr(&con->msgr->inst.addr.in_addr));
}
set_bit(NEGOTIATING, &con->state);
@@ -1123,8 +1207,8 @@ static void fail_protocol(struct ceph_connection *con)
static int process_connect(struct ceph_connection *con)
{
- u64 sup_feat = CEPH_FEATURE_SUPPORTED;
- u64 req_feat = CEPH_FEATURE_REQUIRED;
+ u64 sup_feat = con->msgr->supported_features;
+ u64 req_feat = con->msgr->required_features;
u64 server_feat = le64_to_cpu(con->in_reply.features);
dout("process_connect on %p tag %d\n", con, (int)con->in_tag);
@@ -1134,7 +1218,7 @@ static int process_connect(struct ceph_connection *con)
pr_err("%s%lld %s feature set mismatch,"
" my %llx < server's %llx, missing %llx\n",
ENTITY_NAME(con->peer_name),
- pr_addr(&con->peer_addr.in_addr),
+ ceph_pr_addr(&con->peer_addr.in_addr),
sup_feat, server_feat, server_feat & ~sup_feat);
con->error_msg = "missing required protocol features";
fail_protocol(con);
@@ -1144,7 +1228,7 @@ static int process_connect(struct ceph_connection *con)
pr_err("%s%lld %s protocol version mismatch,"
" my %d != server's %d\n",
ENTITY_NAME(con->peer_name),
- pr_addr(&con->peer_addr.in_addr),
+ ceph_pr_addr(&con->peer_addr.in_addr),
le32_to_cpu(con->out_connect.protocol_version),
le32_to_cpu(con->in_reply.protocol_version));
con->error_msg = "protocol version mismatch";
@@ -1178,7 +1262,7 @@ static int process_connect(struct ceph_connection *con)
le32_to_cpu(con->in_connect.connect_seq));
pr_err("%s%lld %s connection reset\n",
ENTITY_NAME(con->peer_name),
- pr_addr(&con->peer_addr.in_addr));
+ ceph_pr_addr(&con->peer_addr.in_addr));
reset_connection(con);
prepare_write_connect(con->msgr, con, 0);
prepare_read_connect(con);
@@ -1223,7 +1307,7 @@ static int process_connect(struct ceph_connection *con)
pr_err("%s%lld %s protocol feature mismatch,"
" my required %llx > server's %llx, need %llx\n",
ENTITY_NAME(con->peer_name),
- pr_addr(&con->peer_addr.in_addr),
+ ceph_pr_addr(&con->peer_addr.in_addr),
req_feat, server_feat, req_feat & ~server_feat);
con->error_msg = "missing required protocol features";
fail_protocol(con);
@@ -1305,8 +1389,7 @@ static int read_partial_message_section(struct ceph_connection *con,
struct kvec *section,
unsigned int sec_len, u32 *crc)
{
- int left;
- int ret;
+ int ret, left;
BUG_ON(!section);
@@ -1329,13 +1412,83 @@ static int read_partial_message_section(struct ceph_connection *con,
static struct ceph_msg *ceph_alloc_msg(struct ceph_connection *con,
struct ceph_msg_header *hdr,
int *skip);
+
+
+static int read_partial_message_pages(struct ceph_connection *con,
+ struct page **pages,
+ unsigned data_len, int datacrc)
+{
+ void *p;
+ int ret;
+ int left;
+
+ left = min((int)(data_len - con->in_msg_pos.data_pos),
+ (int)(PAGE_SIZE - con->in_msg_pos.page_pos));
+ /* (page) data */
+ BUG_ON(pages == NULL);
+ p = kmap(pages[con->in_msg_pos.page]);
+ ret = ceph_tcp_recvmsg(con->sock, p + con->in_msg_pos.page_pos,
+ left);
+ if (ret > 0 && datacrc)
+ con->in_data_crc =
+ crc32c(con->in_data_crc,
+ p + con->in_msg_pos.page_pos, ret);
+ kunmap(pages[con->in_msg_pos.page]);
+ if (ret <= 0)
+ return ret;
+ con->in_msg_pos.data_pos += ret;
+ con->in_msg_pos.page_pos += ret;
+ if (con->in_msg_pos.page_pos == PAGE_SIZE) {
+ con->in_msg_pos.page_pos = 0;
+ con->in_msg_pos.page++;
+ }
+
+ return ret;
+}
+
+#ifdef CONFIG_BLOCK
+static int read_partial_message_bio(struct ceph_connection *con,
+ struct bio **bio_iter, int *bio_seg,
+ unsigned data_len, int datacrc)
+{
+ struct bio_vec *bv = bio_iovec_idx(*bio_iter, *bio_seg);
+ void *p;
+ int ret, left;
+
+ if (IS_ERR(bv))
+ return PTR_ERR(bv);
+
+ left = min((int)(data_len - con->in_msg_pos.data_pos),
+ (int)(bv->bv_len - con->in_msg_pos.page_pos));
+
+ p = kmap(bv->bv_page) + bv->bv_offset;
+
+ ret = ceph_tcp_recvmsg(con->sock, p + con->in_msg_pos.page_pos,
+ left);
+ if (ret > 0 && datacrc)
+ con->in_data_crc =
+ crc32c(con->in_data_crc,
+ p + con->in_msg_pos.page_pos, ret);
+ kunmap(bv->bv_page);
+ if (ret <= 0)
+ return ret;
+ con->in_msg_pos.data_pos += ret;
+ con->in_msg_pos.page_pos += ret;
+ if (con->in_msg_pos.page_pos == bv->bv_len) {
+ con->in_msg_pos.page_pos = 0;
+ iter_bio_next(bio_iter, bio_seg);
+ }
+
+ return ret;
+}
+#endif
+
/*
* read (part of) a message.
*/
static int read_partial_message(struct ceph_connection *con)
{
struct ceph_msg *m = con->in_msg;
- void *p;
int ret;
int to, left;
unsigned front_len, middle_len, data_len, data_off;
@@ -1381,7 +1534,7 @@ static int read_partial_message(struct ceph_connection *con)
if ((s64)seq - (s64)con->in_seq < 1) {
pr_info("skipping %s%lld %s seq %lld, expected %lld\n",
ENTITY_NAME(con->peer_name),
- pr_addr(&con->peer_addr.in_addr),
+ ceph_pr_addr(&con->peer_addr.in_addr),
seq, con->in_seq + 1);
con->in_base_pos = -front_len - middle_len - data_len -
sizeof(m->footer);
@@ -1422,7 +1575,10 @@ static int read_partial_message(struct ceph_connection *con)
m->middle->vec.iov_len = 0;
con->in_msg_pos.page = 0;
- con->in_msg_pos.page_pos = data_off & ~PAGE_MASK;
+ if (m->pages)
+ con->in_msg_pos.page_pos = data_off & ~PAGE_MASK;
+ else
+ con->in_msg_pos.page_pos = 0;
con->in_msg_pos.data_pos = 0;
}
@@ -1440,27 +1596,29 @@ static int read_partial_message(struct ceph_connection *con)
if (ret <= 0)
return ret;
}
+#ifdef CONFIG_BLOCK
+ if (m->bio && !m->bio_iter)
+ init_bio_iter(m->bio, &m->bio_iter, &m->bio_seg);
+#endif
/* (page) data */
while (con->in_msg_pos.data_pos < data_len) {
- left = min((int)(data_len - con->in_msg_pos.data_pos),
- (int)(PAGE_SIZE - con->in_msg_pos.page_pos));
- BUG_ON(m->pages == NULL);
- p = kmap(m->pages[con->in_msg_pos.page]);
- ret = ceph_tcp_recvmsg(con->sock, p + con->in_msg_pos.page_pos,
- left);
- if (ret > 0 && datacrc)
- con->in_data_crc =
- crc32c(con->in_data_crc,
- p + con->in_msg_pos.page_pos, ret);
- kunmap(m->pages[con->in_msg_pos.page]);
- if (ret <= 0)
- return ret;
- con->in_msg_pos.data_pos += ret;
- con->in_msg_pos.page_pos += ret;
- if (con->in_msg_pos.page_pos == PAGE_SIZE) {
- con->in_msg_pos.page_pos = 0;
- con->in_msg_pos.page++;
+ if (m->pages) {
+ ret = read_partial_message_pages(con, m->pages,
+ data_len, datacrc);
+ if (ret <= 0)
+ return ret;
+#ifdef CONFIG_BLOCK
+ } else if (m->bio) {
+
+ ret = read_partial_message_bio(con,
+ &m->bio_iter, &m->bio_seg,
+ data_len, datacrc);
+ if (ret <= 0)
+ return ret;
+#endif
+ } else {
+ BUG_ON(1);
}
}
@@ -1874,9 +2032,9 @@ out:
static void ceph_fault(struct ceph_connection *con)
{
pr_err("%s%lld %s %s\n", ENTITY_NAME(con->peer_name),
- pr_addr(&con->peer_addr.in_addr), con->error_msg);
+ ceph_pr_addr(&con->peer_addr.in_addr), con->error_msg);
dout("fault %p state %lu to peer %s\n",
- con, con->state, pr_addr(&con->peer_addr.in_addr));
+ con, con->state, ceph_pr_addr(&con->peer_addr.in_addr));
if (test_bit(LOSSYTX, &con->state)) {
dout("fault on LOSSYTX channel\n");
@@ -1936,7 +2094,9 @@ out:
/*
* create a new messenger instance
*/
-struct ceph_messenger *ceph_messenger_create(struct ceph_entity_addr *myaddr)
+struct ceph_messenger *ceph_messenger_create(struct ceph_entity_addr *myaddr,
+ u32 supported_features,
+ u32 required_features)
{
struct ceph_messenger *msgr;
@@ -1944,6 +2104,9 @@ struct ceph_messenger *ceph_messenger_create(struct ceph_entity_addr *myaddr)
if (msgr == NULL)
return ERR_PTR(-ENOMEM);
+ msgr->supported_features = supported_features;
+ msgr->required_features = required_features;
+
spin_lock_init(&msgr->global_seq_lock);
/* the zero page is needed if a request is "canceled" while the message
@@ -1966,6 +2129,7 @@ struct ceph_messenger *ceph_messenger_create(struct ceph_entity_addr *myaddr)
dout("messenger_create %p\n", msgr);
return msgr;
}
+EXPORT_SYMBOL(ceph_messenger_create);
void ceph_messenger_destroy(struct ceph_messenger *msgr)
{
@@ -1975,6 +2139,7 @@ void ceph_messenger_destroy(struct ceph_messenger *msgr)
kfree(msgr);
dout("destroyed messenger %p\n", msgr);
}
+EXPORT_SYMBOL(ceph_messenger_destroy);
/*
* Queue up an outgoing message on the given connection.
@@ -2011,6 +2176,7 @@ void ceph_con_send(struct ceph_connection *con, struct ceph_msg *msg)
if (test_and_set_bit(WRITE_PENDING, &con->state) == 0)
queue_con(con);
}
+EXPORT_SYMBOL(ceph_con_send);
/*
* Revoke a message that was previously queued for send
@@ -2076,6 +2242,7 @@ void ceph_con_keepalive(struct ceph_connection *con)
test_and_set_bit(WRITE_PENDING, &con->state) == 0)
queue_con(con);
}
+EXPORT_SYMBOL(ceph_con_keepalive);
/*
@@ -2136,6 +2303,10 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags)
m->nr_pages = 0;
m->pages = NULL;
m->pagelist = NULL;
+ m->bio = NULL;
+ m->bio_iter = NULL;
+ m->bio_seg = 0;
+ m->trail = NULL;
dout("ceph_msg_new %p front %d\n", m, front_len);
return m;
@@ -2146,6 +2317,7 @@ out:
pr_err("msg_new can't create type %d front %d\n", type, front_len);
return NULL;
}
+EXPORT_SYMBOL(ceph_msg_new);
/*
* Allocate "middle" portion of a message, if it is needed and wasn't
@@ -2250,11 +2422,14 @@ void ceph_msg_last_put(struct kref *kref)
m->pagelist = NULL;
}
+ m->trail = NULL;
+
if (m->pool)
ceph_msgpool_put(m->pool, m);
else
ceph_msg_kfree(m);
}
+EXPORT_SYMBOL(ceph_msg_last_put);
void ceph_msg_dump(struct ceph_msg *msg)
{
@@ -2275,3 +2450,4 @@ void ceph_msg_dump(struct ceph_msg *msg)
DUMP_PREFIX_OFFSET, 16, 1,
&msg->footer, sizeof(msg->footer), true);
}
+EXPORT_SYMBOL(ceph_msg_dump);
diff --git a/fs/ceph/mon_client.c b/net/ceph/mon_client.c
index b2a5a3e4a671..8a079399174a 100644
--- a/fs/ceph/mon_client.c
+++ b/net/ceph/mon_client.c
@@ -1,14 +1,16 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
+#include <linux/module.h>
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/random.h>
#include <linux/sched.h>
-#include "mon_client.h"
-#include "super.h"
-#include "auth.h"
-#include "decode.h"
+#include <linux/ceph/mon_client.h>
+#include <linux/ceph/libceph.h>
+#include <linux/ceph/decode.h>
+
+#include <linux/ceph/auth.h>
/*
* Interact with Ceph monitor cluster. Handle requests for new map
@@ -74,7 +76,7 @@ struct ceph_monmap *ceph_monmap_decode(void *p, void *end)
m->num_mon);
for (i = 0; i < m->num_mon; i++)
dout("monmap_decode mon%d is %s\n", i,
- pr_addr(&m->mon_inst[i].addr.in_addr));
+ ceph_pr_addr(&m->mon_inst[i].addr.in_addr));
return m;
bad:
@@ -191,30 +193,33 @@ static void __send_subscribe(struct ceph_mon_client *monc)
struct ceph_msg *msg = monc->m_subscribe;
struct ceph_mon_subscribe_item *i;
void *p, *end;
+ int num;
p = msg->front.iov_base;
end = p + msg->front_max;
- dout("__send_subscribe to 'mdsmap' %u+\n",
- (unsigned)monc->have_mdsmap);
+ num = 1 + !!monc->want_next_osdmap + !!monc->want_mdsmap;
+ ceph_encode_32(&p, num);
+
if (monc->want_next_osdmap) {
dout("__send_subscribe to 'osdmap' %u\n",
(unsigned)monc->have_osdmap);
- ceph_encode_32(&p, 3);
ceph_encode_string(&p, end, "osdmap", 6);
i = p;
i->have = cpu_to_le64(monc->have_osdmap);
i->onetime = 1;
p += sizeof(*i);
monc->want_next_osdmap = 2; /* requested */
- } else {
- ceph_encode_32(&p, 2);
}
- ceph_encode_string(&p, end, "mdsmap", 6);
- i = p;
- i->have = cpu_to_le64(monc->have_mdsmap);
- i->onetime = 0;
- p += sizeof(*i);
+ if (monc->want_mdsmap) {
+ dout("__send_subscribe to 'mdsmap' %u+\n",
+ (unsigned)monc->have_mdsmap);
+ ceph_encode_string(&p, end, "mdsmap", 6);
+ i = p;
+ i->have = cpu_to_le64(monc->have_mdsmap);
+ i->onetime = 0;
+ p += sizeof(*i);
+ }
ceph_encode_string(&p, end, "monmap", 6);
i = p;
i->have = 0;
@@ -243,7 +248,8 @@ static void handle_subscribe_ack(struct ceph_mon_client *monc,
mutex_lock(&monc->mutex);
if (monc->hunting) {
pr_info("mon%d %s session established\n",
- monc->cur_mon, pr_addr(&monc->con->peer_addr.in_addr));
+ monc->cur_mon,
+ ceph_pr_addr(&monc->con->peer_addr.in_addr));
monc->hunting = false;
}
dout("handle_subscribe_ack after %d seconds\n", seconds);
@@ -266,6 +272,7 @@ int ceph_monc_got_mdsmap(struct ceph_mon_client *monc, u32 got)
mutex_unlock(&monc->mutex);
return 0;
}
+EXPORT_SYMBOL(ceph_monc_got_mdsmap);
int ceph_monc_got_osdmap(struct ceph_mon_client *monc, u32 got)
{
@@ -310,6 +317,7 @@ int ceph_monc_open_session(struct ceph_mon_client *monc)
mutex_unlock(&monc->mutex);
return 0;
}
+EXPORT_SYMBOL(ceph_monc_open_session);
/*
* The monitor responds with mount ack indicate mount success. The
@@ -540,6 +548,7 @@ out:
kref_put(&req->kref, release_generic_request);
return err;
}
+EXPORT_SYMBOL(ceph_monc_do_statfs);
/*
* pool ops
@@ -651,6 +660,7 @@ int ceph_monc_create_snapid(struct ceph_mon_client *monc,
pool, 0, (char *)snapid, sizeof(*snapid));
}
+EXPORT_SYMBOL(ceph_monc_create_snapid);
int ceph_monc_delete_snapid(struct ceph_mon_client *monc,
u32 pool, u64 snapid)
@@ -708,9 +718,9 @@ static void delayed_work(struct work_struct *work)
*/
static int build_initial_monmap(struct ceph_mon_client *monc)
{
- struct ceph_mount_args *args = monc->client->mount_args;
- struct ceph_entity_addr *mon_addr = args->mon_addr;
- int num_mon = args->num_mon;
+ struct ceph_options *opt = monc->client->options;
+ struct ceph_entity_addr *mon_addr = opt->mon_addr;
+ int num_mon = opt->num_mon;
int i;
/* build initial monmap */
@@ -728,11 +738,6 @@ static int build_initial_monmap(struct ceph_mon_client *monc)
}
monc->monmap->num_mon = num_mon;
monc->have_fsid = false;
-
- /* release addr memory */
- kfree(args->mon_addr);
- args->mon_addr = NULL;
- args->num_mon = 0;
return 0;
}
@@ -753,8 +758,8 @@ int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl)
monc->con = NULL;
/* authentication */
- monc->auth = ceph_auth_init(cl->mount_args->name,
- cl->mount_args->secret);
+ monc->auth = ceph_auth_init(cl->options->name,
+ cl->options->secret);
if (IS_ERR(monc->auth))
return PTR_ERR(monc->auth);
monc->auth->want_keys =
@@ -808,6 +813,7 @@ out_monmap:
out:
return err;
}
+EXPORT_SYMBOL(ceph_monc_init);
void ceph_monc_stop(struct ceph_mon_client *monc)
{
@@ -832,6 +838,7 @@ void ceph_monc_stop(struct ceph_mon_client *monc)
kfree(monc->monmap);
}
+EXPORT_SYMBOL(ceph_monc_stop);
static void handle_auth_reply(struct ceph_mon_client *monc,
struct ceph_msg *msg)
@@ -889,6 +896,7 @@ int ceph_monc_validate_auth(struct ceph_mon_client *monc)
mutex_unlock(&monc->mutex);
return ret;
}
+EXPORT_SYMBOL(ceph_monc_validate_auth);
/*
* handle incoming message
@@ -922,15 +930,16 @@ static void dispatch(struct ceph_connection *con, struct ceph_msg *msg)
ceph_monc_handle_map(monc, msg);
break;
- case CEPH_MSG_MDS_MAP:
- ceph_mdsc_handle_map(&monc->client->mdsc, msg);
- break;
-
case CEPH_MSG_OSD_MAP:
ceph_osdc_handle_map(&monc->client->osdc, msg);
break;
default:
+ /* can the chained handler handle it? */
+ if (monc->client->extra_mon_dispatch &&
+ monc->client->extra_mon_dispatch(monc->client, msg) == 0)
+ break;
+
pr_err("received unknown message type %d %s\n", type,
ceph_msg_type_name(type));
}
@@ -994,7 +1003,7 @@ static void mon_fault(struct ceph_connection *con)
if (monc->con && !monc->hunting)
pr_info("mon%d %s session lost, "
"hunting for new mon\n", monc->cur_mon,
- pr_addr(&monc->con->peer_addr.in_addr));
+ ceph_pr_addr(&monc->con->peer_addr.in_addr));
__close_session(monc);
if (!monc->hunting) {
diff --git a/fs/ceph/msgpool.c b/net/ceph/msgpool.c
index dd65a6438131..d5f2d97ac05c 100644
--- a/fs/ceph/msgpool.c
+++ b/net/ceph/msgpool.c
@@ -1,11 +1,11 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
#include <linux/err.h>
#include <linux/sched.h>
#include <linux/types.h>
#include <linux/vmalloc.h>
-#include "msgpool.h"
+#include <linux/ceph/msgpool.h>
static void *alloc_fn(gfp_t gfp_mask, void *arg)
{
diff --git a/fs/ceph/osd_client.c b/net/ceph/osd_client.c
index bed6391e52c7..d4da293aed84 100644
--- a/fs/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -1,17 +1,22 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
+#include <linux/module.h>
#include <linux/err.h>
#include <linux/highmem.h>
#include <linux/mm.h>
#include <linux/pagemap.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
+#ifdef CONFIG_BLOCK
+#include <linux/bio.h>
+#endif
-#include "super.h"
-#include "osd_client.h"
-#include "messenger.h"
-#include "decode.h"
-#include "auth.h"
+#include <linux/ceph/libceph.h>
+#include <linux/ceph/osd_client.h>
+#include <linux/ceph/messenger.h>
+#include <linux/ceph/decode.h>
+#include <linux/ceph/auth.h>
+#include <linux/ceph/pagelist.h>
#define OSD_OP_FRONT_LEN 4096
#define OSD_OPREPLY_FRONT_LEN 512
@@ -22,6 +27,59 @@ static int __kick_requests(struct ceph_osd_client *osdc,
static void kick_requests(struct ceph_osd_client *osdc, struct ceph_osd *osd);
+static int op_needs_trail(int op)
+{
+ switch (op) {
+ case CEPH_OSD_OP_GETXATTR:
+ case CEPH_OSD_OP_SETXATTR:
+ case CEPH_OSD_OP_CMPXATTR:
+ case CEPH_OSD_OP_CALL:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+static int op_has_extent(int op)
+{
+ return (op == CEPH_OSD_OP_READ ||
+ op == CEPH_OSD_OP_WRITE);
+}
+
+void ceph_calc_raw_layout(struct ceph_osd_client *osdc,
+ struct ceph_file_layout *layout,
+ u64 snapid,
+ u64 off, u64 *plen, u64 *bno,
+ struct ceph_osd_request *req,
+ struct ceph_osd_req_op *op)
+{
+ struct ceph_osd_request_head *reqhead = req->r_request->front.iov_base;
+ u64 orig_len = *plen;
+ u64 objoff, objlen; /* extent in object */
+
+ reqhead->snapid = cpu_to_le64(snapid);
+
+ /* object extent? */
+ ceph_calc_file_object_mapping(layout, off, plen, bno,
+ &objoff, &objlen);
+ if (*plen < orig_len)
+ dout(" skipping last %llu, final file extent %llu~%llu\n",
+ orig_len - *plen, off, *plen);
+
+ if (op_has_extent(op->op)) {
+ op->extent.offset = objoff;
+ op->extent.length = objlen;
+ }
+ req->r_num_pages = calc_pages_for(off, *plen);
+ if (op->op == CEPH_OSD_OP_WRITE)
+ op->payload_len = *plen;
+
+ dout("calc_layout bno=%llx %llu~%llu (%d pages)\n",
+ *bno, objoff, objlen, req->r_num_pages);
+
+}
+EXPORT_SYMBOL(ceph_calc_raw_layout);
+
/*
* Implement client access to distributed object storage cluster.
*
@@ -48,34 +106,19 @@ static void kick_requests(struct ceph_osd_client *osdc, struct ceph_osd *osd);
* fill osd op in request message.
*/
static void calc_layout(struct ceph_osd_client *osdc,
- struct ceph_vino vino, struct ceph_file_layout *layout,
+ struct ceph_vino vino,
+ struct ceph_file_layout *layout,
u64 off, u64 *plen,
- struct ceph_osd_request *req)
+ struct ceph_osd_request *req,
+ struct ceph_osd_req_op *op)
{
- struct ceph_osd_request_head *reqhead = req->r_request->front.iov_base;
- struct ceph_osd_op *op = (void *)(reqhead + 1);
- u64 orig_len = *plen;
- u64 objoff, objlen; /* extent in object */
u64 bno;
- reqhead->snapid = cpu_to_le64(vino.snap);
-
- /* object extent? */
- ceph_calc_file_object_mapping(layout, off, plen, &bno,
- &objoff, &objlen);
- if (*plen < orig_len)
- dout(" skipping last %llu, final file extent %llu~%llu\n",
- orig_len - *plen, off, *plen);
+ ceph_calc_raw_layout(osdc, layout, vino.snap, off,
+ plen, &bno, req, op);
sprintf(req->r_oid, "%llx.%08llx", vino.ino, bno);
req->r_oid_len = strlen(req->r_oid);
-
- op->extent.offset = cpu_to_le64(objoff);
- op->extent.length = cpu_to_le64(objlen);
- req->r_num_pages = calc_pages_for(off, *plen);
-
- dout("calc_layout %s (%d) %llu~%llu (%d pages)\n",
- req->r_oid, req->r_oid_len, objoff, objlen, req->r_num_pages);
}
/*
@@ -101,56 +144,66 @@ void ceph_osdc_release_request(struct kref *kref)
if (req->r_own_pages)
ceph_release_page_vector(req->r_pages,
req->r_num_pages);
+#ifdef CONFIG_BLOCK
+ if (req->r_bio)
+ bio_put(req->r_bio);
+#endif
ceph_put_snap_context(req->r_snapc);
+ if (req->r_trail) {
+ ceph_pagelist_release(req->r_trail);
+ kfree(req->r_trail);
+ }
if (req->r_mempool)
mempool_free(req, req->r_osdc->req_mempool);
else
kfree(req);
}
+EXPORT_SYMBOL(ceph_osdc_release_request);
-/*
- * build new request AND message, calculate layout, and adjust file
- * extent as needed.
- *
- * if the file was recently truncated, we include information about its
- * old and new size so that the object can be updated appropriately. (we
- * avoid synchronously deleting truncated objects because it's slow.)
- *
- * if @do_sync, include a 'startsync' command so that the osd will flush
- * data quickly.
- */
-struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
- struct ceph_file_layout *layout,
- struct ceph_vino vino,
- u64 off, u64 *plen,
- int opcode, int flags,
+static int get_num_ops(struct ceph_osd_req_op *ops, int *needs_trail)
+{
+ int i = 0;
+
+ if (needs_trail)
+ *needs_trail = 0;
+ while (ops[i].op) {
+ if (needs_trail && op_needs_trail(ops[i].op))
+ *needs_trail = 1;
+ i++;
+ }
+
+ return i;
+}
+
+struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
+ int flags,
struct ceph_snap_context *snapc,
- int do_sync,
- u32 truncate_seq,
- u64 truncate_size,
- struct timespec *mtime,
- bool use_mempool, int num_reply)
+ struct ceph_osd_req_op *ops,
+ bool use_mempool,
+ gfp_t gfp_flags,
+ struct page **pages,
+ struct bio *bio)
{
struct ceph_osd_request *req;
struct ceph_msg *msg;
- struct ceph_osd_request_head *head;
- struct ceph_osd_op *op;
- void *p;
- int num_op = 1 + do_sync;
- size_t msg_size = sizeof(*head) + num_op*sizeof(*op);
- int i;
+ int needs_trail;
+ int num_op = get_num_ops(ops, &needs_trail);
+ size_t msg_size = sizeof(struct ceph_osd_request_head);
+
+ msg_size += num_op*sizeof(struct ceph_osd_op);
if (use_mempool) {
- req = mempool_alloc(osdc->req_mempool, GFP_NOFS);
+ req = mempool_alloc(osdc->req_mempool, gfp_flags);
memset(req, 0, sizeof(*req));
} else {
- req = kzalloc(sizeof(*req), GFP_NOFS);
+ req = kzalloc(sizeof(*req), gfp_flags);
}
if (req == NULL)
return NULL;
req->r_osdc = osdc;
req->r_mempool = use_mempool;
+
kref_init(&req->r_kref);
init_completion(&req->r_completion);
init_completion(&req->r_safe_completion);
@@ -164,13 +217,22 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
msg = ceph_msgpool_get(&osdc->msgpool_op_reply, 0);
else
msg = ceph_msg_new(CEPH_MSG_OSD_OPREPLY,
- OSD_OPREPLY_FRONT_LEN, GFP_NOFS);
+ OSD_OPREPLY_FRONT_LEN, gfp_flags);
if (!msg) {
ceph_osdc_put_request(req);
return NULL;
}
req->r_reply = msg;
+ /* allocate space for the trailing data */
+ if (needs_trail) {
+ req->r_trail = kmalloc(sizeof(struct ceph_pagelist), gfp_flags);
+ if (!req->r_trail) {
+ ceph_osdc_put_request(req);
+ return NULL;
+ }
+ ceph_pagelist_init(req->r_trail);
+ }
/* create request message; allow space for oid */
msg_size += 40;
if (snapc)
@@ -178,18 +240,115 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
if (use_mempool)
msg = ceph_msgpool_get(&osdc->msgpool_op, 0);
else
- msg = ceph_msg_new(CEPH_MSG_OSD_OP, msg_size, GFP_NOFS);
+ msg = ceph_msg_new(CEPH_MSG_OSD_OP, msg_size, gfp_flags);
if (!msg) {
ceph_osdc_put_request(req);
return NULL;
}
+
msg->hdr.type = cpu_to_le16(CEPH_MSG_OSD_OP);
memset(msg->front.iov_base, 0, msg->front.iov_len);
+
+ req->r_request = msg;
+ req->r_pages = pages;
+#ifdef CONFIG_BLOCK
+ if (bio) {
+ req->r_bio = bio;
+ bio_get(req->r_bio);
+ }
+#endif
+
+ return req;
+}
+EXPORT_SYMBOL(ceph_osdc_alloc_request);
+
+static void osd_req_encode_op(struct ceph_osd_request *req,
+ struct ceph_osd_op *dst,
+ struct ceph_osd_req_op *src)
+{
+ dst->op = cpu_to_le16(src->op);
+
+ switch (dst->op) {
+ case CEPH_OSD_OP_READ:
+ case CEPH_OSD_OP_WRITE:
+ dst->extent.offset =
+ cpu_to_le64(src->extent.offset);
+ dst->extent.length =
+ cpu_to_le64(src->extent.length);
+ dst->extent.truncate_size =
+ cpu_to_le64(src->extent.truncate_size);
+ dst->extent.truncate_seq =
+ cpu_to_le32(src->extent.truncate_seq);
+ break;
+
+ case CEPH_OSD_OP_GETXATTR:
+ case CEPH_OSD_OP_SETXATTR:
+ case CEPH_OSD_OP_CMPXATTR:
+ BUG_ON(!req->r_trail);
+
+ dst->xattr.name_len = cpu_to_le32(src->xattr.name_len);
+ dst->xattr.value_len = cpu_to_le32(src->xattr.value_len);
+ dst->xattr.cmp_op = src->xattr.cmp_op;
+ dst->xattr.cmp_mode = src->xattr.cmp_mode;
+ ceph_pagelist_append(req->r_trail, src->xattr.name,
+ src->xattr.name_len);
+ ceph_pagelist_append(req->r_trail, src->xattr.val,
+ src->xattr.value_len);
+ break;
+ case CEPH_OSD_OP_CALL:
+ BUG_ON(!req->r_trail);
+
+ dst->cls.class_len = src->cls.class_len;
+ dst->cls.method_len = src->cls.method_len;
+ dst->cls.indata_len = cpu_to_le32(src->cls.indata_len);
+
+ ceph_pagelist_append(req->r_trail, src->cls.class_name,
+ src->cls.class_len);
+ ceph_pagelist_append(req->r_trail, src->cls.method_name,
+ src->cls.method_len);
+ ceph_pagelist_append(req->r_trail, src->cls.indata,
+ src->cls.indata_len);
+ break;
+ case CEPH_OSD_OP_ROLLBACK:
+ dst->snap.snapid = cpu_to_le64(src->snap.snapid);
+ break;
+ case CEPH_OSD_OP_STARTSYNC:
+ break;
+ default:
+ pr_err("unrecognized osd opcode %d\n", dst->op);
+ WARN_ON(1);
+ break;
+ }
+ dst->payload_len = cpu_to_le32(src->payload_len);
+}
+
+/*
+ * build new request AND message
+ *
+ */
+void ceph_osdc_build_request(struct ceph_osd_request *req,
+ u64 off, u64 *plen,
+ struct ceph_osd_req_op *src_ops,
+ struct ceph_snap_context *snapc,
+ struct timespec *mtime,
+ const char *oid,
+ int oid_len)
+{
+ struct ceph_msg *msg = req->r_request;
+ struct ceph_osd_request_head *head;
+ struct ceph_osd_req_op *src_op;
+ struct ceph_osd_op *op;
+ void *p;
+ int num_op = get_num_ops(src_ops, NULL);
+ size_t msg_size = sizeof(*head) + num_op*sizeof(*op);
+ int flags = req->r_flags;
+ u64 data_len = 0;
+ int i;
+
head = msg->front.iov_base;
op = (void *)(head + 1);
p = (void *)(op + num_op);
- req->r_request = msg;
req->r_snapc = ceph_get_snap_context(snapc);
head->client_inc = cpu_to_le32(1); /* always, for now. */
@@ -197,29 +356,23 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
if (flags & CEPH_OSD_FLAG_WRITE)
ceph_encode_timespec(&head->mtime, mtime);
head->num_ops = cpu_to_le16(num_op);
- op->op = cpu_to_le16(opcode);
- /* calculate max write size */
- calc_layout(osdc, vino, layout, off, plen, req);
- req->r_file_layout = *layout; /* keep a copy */
-
- if (flags & CEPH_OSD_FLAG_WRITE) {
- req->r_request->hdr.data_off = cpu_to_le16(off);
- req->r_request->hdr.data_len = cpu_to_le32(*plen);
- op->payload_len = cpu_to_le32(*plen);
- }
- op->extent.truncate_size = cpu_to_le64(truncate_size);
- op->extent.truncate_seq = cpu_to_le32(truncate_seq);
/* fill in oid */
- head->object_len = cpu_to_le32(req->r_oid_len);
- memcpy(p, req->r_oid, req->r_oid_len);
- p += req->r_oid_len;
-
- if (do_sync) {
+ head->object_len = cpu_to_le32(oid_len);
+ memcpy(p, oid, oid_len);
+ p += oid_len;
+
+ src_op = src_ops;
+ while (src_op->op) {
+ osd_req_encode_op(req, op, src_op);
+ src_op++;
op++;
- op->op = cpu_to_le16(CEPH_OSD_OP_STARTSYNC);
}
+
+ if (req->r_trail)
+ data_len += req->r_trail->length;
+
if (snapc) {
head->snap_seq = cpu_to_le64(snapc->seq);
head->num_snaps = cpu_to_le32(snapc->num_snaps);
@@ -229,12 +382,79 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
}
}
+ if (flags & CEPH_OSD_FLAG_WRITE) {
+ req->r_request->hdr.data_off = cpu_to_le16(off);
+ req->r_request->hdr.data_len = cpu_to_le32(*plen + data_len);
+ } else if (data_len) {
+ req->r_request->hdr.data_off = 0;
+ req->r_request->hdr.data_len = cpu_to_le32(data_len);
+ }
+
BUG_ON(p > msg->front.iov_base + msg->front.iov_len);
msg_size = p - msg->front.iov_base;
msg->front.iov_len = msg_size;
msg->hdr.front_len = cpu_to_le32(msg_size);
+ return;
+}
+EXPORT_SYMBOL(ceph_osdc_build_request);
+
+/*
+ * build new request AND message, calculate layout, and adjust file
+ * extent as needed.
+ *
+ * if the file was recently truncated, we include information about its
+ * old and new size so that the object can be updated appropriately. (we
+ * avoid synchronously deleting truncated objects because it's slow.)
+ *
+ * if @do_sync, include a 'startsync' command so that the osd will flush
+ * data quickly.
+ */
+struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
+ struct ceph_file_layout *layout,
+ struct ceph_vino vino,
+ u64 off, u64 *plen,
+ int opcode, int flags,
+ struct ceph_snap_context *snapc,
+ int do_sync,
+ u32 truncate_seq,
+ u64 truncate_size,
+ struct timespec *mtime,
+ bool use_mempool, int num_reply)
+{
+ struct ceph_osd_req_op ops[3];
+ struct ceph_osd_request *req;
+
+ ops[0].op = opcode;
+ ops[0].extent.truncate_seq = truncate_seq;
+ ops[0].extent.truncate_size = truncate_size;
+ ops[0].payload_len = 0;
+
+ if (do_sync) {
+ ops[1].op = CEPH_OSD_OP_STARTSYNC;
+ ops[1].payload_len = 0;
+ ops[2].op = 0;
+ } else
+ ops[1].op = 0;
+
+ req = ceph_osdc_alloc_request(osdc, flags,
+ snapc, ops,
+ use_mempool,
+ GFP_NOFS, NULL, NULL);
+ if (IS_ERR(req))
+ return req;
+
+ /* calculate max write size */
+ calc_layout(osdc, vino, layout, off, plen, req, ops);
+ req->r_file_layout = *layout; /* keep a copy */
+
+ ceph_osdc_build_request(req, off, plen, ops,
+ snapc,
+ mtime,
+ req->r_oid, req->r_oid_len);
+
return req;
}
+EXPORT_SYMBOL(ceph_osdc_new_request);
/*
* We keep osd requests in an rbtree, sorted by ->r_tid.
@@ -389,7 +609,7 @@ static void __move_osd_to_lru(struct ceph_osd_client *osdc,
dout("__move_osd_to_lru %p\n", osd);
BUG_ON(!list_empty(&osd->o_osd_lru));
list_add_tail(&osd->o_osd_lru, &osdc->osd_lru);
- osd->lru_ttl = jiffies + osdc->client->mount_args->osd_idle_ttl * HZ;
+ osd->lru_ttl = jiffies + osdc->client->options->osd_idle_ttl * HZ;
}
static void __remove_osd_from_lru(struct ceph_osd *osd)
@@ -483,7 +703,7 @@ static struct ceph_osd *__lookup_osd(struct ceph_osd_client *osdc, int o)
static void __schedule_osd_timeout(struct ceph_osd_client *osdc)
{
schedule_delayed_work(&osdc->timeout_work,
- osdc->client->mount_args->osd_keepalive_timeout * HZ);
+ osdc->client->options->osd_keepalive_timeout * HZ);
}
static void __cancel_osd_timeout(struct ceph_osd_client *osdc)
@@ -684,9 +904,9 @@ static void handle_timeout(struct work_struct *work)
container_of(work, struct ceph_osd_client, timeout_work.work);
struct ceph_osd_request *req, *last_req = NULL;
struct ceph_osd *osd;
- unsigned long timeout = osdc->client->mount_args->osd_timeout * HZ;
+ unsigned long timeout = osdc->client->options->osd_timeout * HZ;
unsigned long keepalive =
- osdc->client->mount_args->osd_keepalive_timeout * HZ;
+ osdc->client->options->osd_keepalive_timeout * HZ;
unsigned long last_stamp = 0;
struct rb_node *p;
struct list_head slow_osds;
@@ -773,7 +993,7 @@ static void handle_osds_timeout(struct work_struct *work)
container_of(work, struct ceph_osd_client,
osds_timeout_work.work);
unsigned long delay =
- osdc->client->mount_args->osd_idle_ttl * HZ >> 2;
+ osdc->client->options->osd_idle_ttl * HZ >> 2;
dout("osds timeout\n");
down_read(&osdc->map_sem);
@@ -1104,6 +1324,10 @@ int ceph_osdc_start_request(struct ceph_osd_client *osdc,
req->r_request->pages = req->r_pages;
req->r_request->nr_pages = req->r_num_pages;
+#ifdef CONFIG_BLOCK
+ req->r_request->bio = req->r_bio;
+#endif
+ req->r_request->trail = req->r_trail;
register_request(osdc, req);
@@ -1131,6 +1355,7 @@ int ceph_osdc_start_request(struct ceph_osd_client *osdc,
up_read(&osdc->map_sem);
return rc;
}
+EXPORT_SYMBOL(ceph_osdc_start_request);
/*
* wait for a request to complete
@@ -1153,6 +1378,7 @@ int ceph_osdc_wait_request(struct ceph_osd_client *osdc,
dout("wait_request tid %llu result %d\n", req->r_tid, req->r_result);
return req->r_result;
}
+EXPORT_SYMBOL(ceph_osdc_wait_request);
/*
* sync - wait for all in-flight requests to flush. avoid starvation.
@@ -1186,6 +1412,7 @@ void ceph_osdc_sync(struct ceph_osd_client *osdc)
mutex_unlock(&osdc->request_mutex);
dout("sync done (thru tid %llu)\n", last_tid);
}
+EXPORT_SYMBOL(ceph_osdc_sync);
/*
* init, shutdown
@@ -1211,7 +1438,7 @@ int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client)
INIT_DELAYED_WORK(&osdc->osds_timeout_work, handle_osds_timeout);
schedule_delayed_work(&osdc->osds_timeout_work,
- round_jiffies_relative(osdc->client->mount_args->osd_idle_ttl * HZ));
+ round_jiffies_relative(osdc->client->options->osd_idle_ttl * HZ));
err = -ENOMEM;
osdc->req_mempool = mempool_create_kmalloc_pool(10,
@@ -1237,6 +1464,7 @@ out_mempool:
out:
return err;
}
+EXPORT_SYMBOL(ceph_osdc_init);
void ceph_osdc_stop(struct ceph_osd_client *osdc)
{
@@ -1251,6 +1479,7 @@ void ceph_osdc_stop(struct ceph_osd_client *osdc)
ceph_msgpool_destroy(&osdc->msgpool_op);
ceph_msgpool_destroy(&osdc->msgpool_op_reply);
}
+EXPORT_SYMBOL(ceph_osdc_stop);
/*
* Read some contiguous pages. If we cross a stripe boundary, shorten
@@ -1288,6 +1517,7 @@ int ceph_osdc_readpages(struct ceph_osd_client *osdc,
dout("readpages result %d\n", rc);
return rc;
}
+EXPORT_SYMBOL(ceph_osdc_readpages);
/*
* do a synchronous write on N pages
@@ -1330,6 +1560,7 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino,
dout("writepages result %d\n", rc);
return rc;
}
+EXPORT_SYMBOL(ceph_osdc_writepages);
/*
* handle incoming message
@@ -1420,6 +1651,9 @@ static struct ceph_msg *get_reply(struct ceph_connection *con,
}
m->pages = req->r_pages;
m->nr_pages = req->r_num_pages;
+#ifdef CONFIG_BLOCK
+ m->bio = req->r_bio;
+#endif
}
*skip = 0;
req->r_con_filling_msg = ceph_con_get(con);
diff --git a/fs/ceph/osdmap.c b/net/ceph/osdmap.c
index e31f118f1392..b551d9b1d4c0 100644
--- a/fs/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -1,14 +1,15 @@
-#include "ceph_debug.h"
+#include <linux/ceph/ceph_debug.h>
+#include <linux/module.h>
#include <linux/slab.h>
#include <asm/div64.h>
-#include "super.h"
-#include "osdmap.h"
-#include "crush/hash.h"
-#include "crush/mapper.h"
-#include "decode.h"
+#include <linux/ceph/libceph.h>
+#include <linux/ceph/osdmap.h>
+#include <linux/ceph/decode.h>
+#include <linux/ceph/crush/hash.h>
+#include <linux/ceph/crush/mapper.h>
char *ceph_osdmap_state_str(char *str, int len, int state)
{
@@ -417,6 +418,20 @@ static struct ceph_pg_pool_info *__lookup_pg_pool(struct rb_root *root, int id)
return NULL;
}
+int ceph_pg_poolid_by_name(struct ceph_osdmap *map, const char *name)
+{
+ struct rb_node *rbp;
+
+ for (rbp = rb_first(&map->pg_pools); rbp; rbp = rb_next(rbp)) {
+ struct ceph_pg_pool_info *pi =
+ rb_entry(rbp, struct ceph_pg_pool_info, node);
+ if (pi->name && strcmp(pi->name, name) == 0)
+ return pi->id;
+ }
+ return -ENOENT;
+}
+EXPORT_SYMBOL(ceph_pg_poolid_by_name);
+
static void __remove_pg_pool(struct rb_root *root, struct ceph_pg_pool_info *pi)
{
rb_erase(&pi->node, root);
@@ -966,6 +981,7 @@ void ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
dout(" obj extent %llu~%llu\n", *oxoff, *oxlen);
}
+EXPORT_SYMBOL(ceph_calc_file_object_mapping);
/*
* calculate an object layout (i.e. pgid) from an oid,
@@ -1011,6 +1027,7 @@ int ceph_calc_object_layout(struct ceph_object_layout *ol,
ol->ol_stripe_unit = fl->fl_object_stripe_unit;
return 0;
}
+EXPORT_SYMBOL(ceph_calc_object_layout);
/*
* Calculate raw osd vector for the given pgid. Return pointer to osd
@@ -1108,3 +1125,4 @@ int ceph_calc_pg_primary(struct ceph_osdmap *osdmap, struct ceph_pg pgid)
return osds[i];
return -1;
}
+EXPORT_SYMBOL(ceph_calc_pg_primary);
diff --git a/fs/ceph/pagelist.c b/net/ceph/pagelist.c
index b6859f47d364..0fb90bd19432 100644
--- a/fs/ceph/pagelist.c
+++ b/net/ceph/pagelist.c
@@ -1,9 +1,9 @@
+#include <linux/module.h>
#include <linux/gfp.h>
#include <linux/pagemap.h>
#include <linux/highmem.h>
-
-#include "pagelist.h"
+#include <linux/ceph/pagelist.h>
int ceph_pagelist_release(struct ceph_pagelist *pl)
{
@@ -17,6 +17,7 @@ int ceph_pagelist_release(struct ceph_pagelist *pl)
}
return 0;
}
+EXPORT_SYMBOL(ceph_pagelist_release);
static int ceph_pagelist_addpage(struct ceph_pagelist *pl)
{
@@ -31,7 +32,7 @@ static int ceph_pagelist_addpage(struct ceph_pagelist *pl)
return 0;
}
-int ceph_pagelist_append(struct ceph_pagelist *pl, void *buf, size_t len)
+int ceph_pagelist_append(struct ceph_pagelist *pl, const void *buf, size_t len)
{
while (pl->room < len) {
size_t bit = pl->room;
@@ -53,3 +54,4 @@ int ceph_pagelist_append(struct ceph_pagelist *pl, void *buf, size_t len)
pl->room -= len;
return 0;
}
+EXPORT_SYMBOL(ceph_pagelist_append);
diff --git a/net/ceph/pagevec.c b/net/ceph/pagevec.c
new file mode 100644
index 000000000000..54caf0687155
--- /dev/null
+++ b/net/ceph/pagevec.c
@@ -0,0 +1,223 @@
+#include <linux/ceph/ceph_debug.h>
+
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/file.h>
+#include <linux/namei.h>
+#include <linux/writeback.h>
+
+#include <linux/ceph/libceph.h>
+
+/*
+ * build a vector of user pages
+ */
+struct page **ceph_get_direct_page_vector(const char __user *data,
+ int num_pages,
+ loff_t off, size_t len)
+{
+ struct page **pages;
+ int rc;
+
+ pages = kmalloc(sizeof(*pages) * num_pages, GFP_NOFS);
+ if (!pages)
+ return ERR_PTR(-ENOMEM);
+
+ down_read(&current->mm->mmap_sem);
+ rc = get_user_pages(current, current->mm, (unsigned long)data,
+ num_pages, 0, 0, pages, NULL);
+ up_read(&current->mm->mmap_sem);
+ if (rc < 0)
+ goto fail;
+ return pages;
+
+fail:
+ kfree(pages);
+ return ERR_PTR(rc);
+}
+EXPORT_SYMBOL(ceph_get_direct_page_vector);
+
+void ceph_put_page_vector(struct page **pages, int num_pages)
+{
+ int i;
+
+ for (i = 0; i < num_pages; i++)
+ put_page(pages[i]);
+ kfree(pages);
+}
+EXPORT_SYMBOL(ceph_put_page_vector);
+
+void ceph_release_page_vector(struct page **pages, int num_pages)
+{
+ int i;
+
+ for (i = 0; i < num_pages; i++)
+ __free_pages(pages[i], 0);
+ kfree(pages);
+}
+EXPORT_SYMBOL(ceph_release_page_vector);
+
+/*
+ * allocate a vector new pages
+ */
+struct page **ceph_alloc_page_vector(int num_pages, gfp_t flags)
+{
+ struct page **pages;
+ int i;
+
+ pages = kmalloc(sizeof(*pages) * num_pages, flags);
+ if (!pages)
+ return ERR_PTR(-ENOMEM);
+ for (i = 0; i < num_pages; i++) {
+ pages[i] = __page_cache_alloc(flags);
+ if (pages[i] == NULL) {
+ ceph_release_page_vector(pages, i);
+ return ERR_PTR(-ENOMEM);
+ }
+ }
+ return pages;
+}
+EXPORT_SYMBOL(ceph_alloc_page_vector);
+
+/*
+ * copy user data into a page vector
+ */
+int ceph_copy_user_to_page_vector(struct page **pages,
+ const char __user *data,
+ loff_t off, size_t len)
+{
+ int i = 0;
+ int po = off & ~PAGE_CACHE_MASK;
+ int left = len;
+ int l, bad;
+
+ while (left > 0) {
+ l = min_t(int, PAGE_CACHE_SIZE-po, left);
+ bad = copy_from_user(page_address(pages[i]) + po, data, l);
+ if (bad == l)
+ return -EFAULT;
+ data += l - bad;
+ left -= l - bad;
+ po += l - bad;
+ if (po == PAGE_CACHE_SIZE) {
+ po = 0;
+ i++;
+ }
+ }
+ return len;
+}
+EXPORT_SYMBOL(ceph_copy_user_to_page_vector);
+
+int ceph_copy_to_page_vector(struct page **pages,
+ const char *data,
+ loff_t off, size_t len)
+{
+ int i = 0;
+ size_t po = off & ~PAGE_CACHE_MASK;
+ size_t left = len;
+ size_t l;
+
+ while (left > 0) {
+ l = min_t(size_t, PAGE_CACHE_SIZE-po, left);
+ memcpy(page_address(pages[i]) + po, data, l);
+ data += l;
+ left -= l;
+ po += l;
+ if (po == PAGE_CACHE_SIZE) {
+ po = 0;
+ i++;
+ }
+ }
+ return len;
+}
+EXPORT_SYMBOL(ceph_copy_to_page_vector);
+
+int ceph_copy_from_page_vector(struct page **pages,
+ char *data,
+ loff_t off, size_t len)
+{
+ int i = 0;
+ size_t po = off & ~PAGE_CACHE_MASK;
+ size_t left = len;
+ size_t l;
+
+ while (left > 0) {
+ l = min_t(size_t, PAGE_CACHE_SIZE-po, left);
+ memcpy(data, page_address(pages[i]) + po, l);
+ data += l;
+ left -= l;
+ po += l;
+ if (po == PAGE_CACHE_SIZE) {
+ po = 0;
+ i++;
+ }
+ }
+ return len;
+}
+EXPORT_SYMBOL(ceph_copy_from_page_vector);
+
+/*
+ * copy user data from a page vector into a user pointer
+ */
+int ceph_copy_page_vector_to_user(struct page **pages,
+ char __user *data,
+ loff_t off, size_t len)
+{
+ int i = 0;
+ int po = off & ~PAGE_CACHE_MASK;
+ int left = len;
+ int l, bad;
+
+ while (left > 0) {
+ l = min_t(int, left, PAGE_CACHE_SIZE-po);
+ bad = copy_to_user(data, page_address(pages[i]) + po, l);
+ if (bad == l)
+ return -EFAULT;
+ data += l - bad;
+ left -= l - bad;
+ if (po) {
+ po += l - bad;
+ if (po == PAGE_CACHE_SIZE)
+ po = 0;
+ }
+ i++;
+ }
+ return len;
+}
+EXPORT_SYMBOL(ceph_copy_page_vector_to_user);
+
+/*
+ * Zero an extent within a page vector. Offset is relative to the
+ * start of the first page.
+ */
+void ceph_zero_page_vector_range(int off, int len, struct page **pages)
+{
+ int i = off >> PAGE_CACHE_SHIFT;
+
+ off &= ~PAGE_CACHE_MASK;
+
+ dout("zero_page_vector_page %u~%u\n", off, len);
+
+ /* leading partial page? */
+ if (off) {
+ int end = min((int)PAGE_CACHE_SIZE, off + len);
+ dout("zeroing %d %p head from %d\n", i, pages[i],
+ (int)off);
+ zero_user_segment(pages[i], off, end);
+ len -= (end - off);
+ i++;
+ }
+ while (len >= PAGE_CACHE_SIZE) {
+ dout("zeroing %d %p len=%d\n", i, pages[i], len);
+ zero_user_segment(pages[i], 0, PAGE_CACHE_SIZE);
+ len -= PAGE_CACHE_SIZE;
+ i++;
+ }
+ /* trailing partial page? */
+ if (len) {
+ dout("zeroing %d %p tail to %d\n", i, pages[i], (int)len);
+ zero_user_segment(pages[i], 0, len);
+ }
+}
+EXPORT_SYMBOL(ceph_zero_page_vector_range);
+
diff --git a/net/core/dev.c b/net/core/dev.c
index 1ae654391442..586a11cb4398 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2259,69 +2259,41 @@ static inline void ____napi_schedule(struct softnet_data *sd,
__raise_softirq_irqoff(NET_RX_SOFTIRQ);
}
-#ifdef CONFIG_RPS
-
-/* One global table that all flow-based protocols share. */
-struct rps_sock_flow_table *rps_sock_flow_table __read_mostly;
-EXPORT_SYMBOL(rps_sock_flow_table);
-
/*
- * get_rps_cpu is called from netif_receive_skb and returns the target
- * CPU from the RPS map of the receiving queue for a given skb.
- * rcu_read_lock must be held on entry.
+ * __skb_get_rxhash: calculate a flow hash based on src/dst addresses
+ * and src/dst port numbers. Returns a non-zero hash number on success
+ * and 0 on failure.
*/
-static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
- struct rps_dev_flow **rflowp)
+__u32 __skb_get_rxhash(struct sk_buff *skb)
{
+ int nhoff, hash = 0;
struct ipv6hdr *ip6;
struct iphdr *ip;
- struct netdev_rx_queue *rxqueue;
- struct rps_map *map;
- struct rps_dev_flow_table *flow_table;
- struct rps_sock_flow_table *sock_flow_table;
- int cpu = -1;
u8 ip_proto;
- u16 tcpu;
u32 addr1, addr2, ihl;
union {
u32 v32;
u16 v16[2];
} ports;
- if (skb_rx_queue_recorded(skb)) {
- u16 index = skb_get_rx_queue(skb);
- if (unlikely(index >= dev->num_rx_queues)) {
- WARN_ONCE(dev->num_rx_queues > 1, "%s received packet "
- "on queue %u, but number of RX queues is %u\n",
- dev->name, index, dev->num_rx_queues);
- goto done;
- }
- rxqueue = dev->_rx + index;
- } else
- rxqueue = dev->_rx;
-
- if (!rxqueue->rps_map && !rxqueue->rps_flow_table)
- goto done;
-
- if (skb->rxhash)
- goto got_hash; /* Skip hash computation on packet header */
+ nhoff = skb_network_offset(skb);
switch (skb->protocol) {
case __constant_htons(ETH_P_IP):
- if (!pskb_may_pull(skb, sizeof(*ip)))
+ if (!pskb_may_pull(skb, sizeof(*ip) + nhoff))
goto done;
- ip = (struct iphdr *) skb->data;
+ ip = (struct iphdr *) skb->data + nhoff;
ip_proto = ip->protocol;
addr1 = (__force u32) ip->saddr;
addr2 = (__force u32) ip->daddr;
ihl = ip->ihl;
break;
case __constant_htons(ETH_P_IPV6):
- if (!pskb_may_pull(skb, sizeof(*ip6)))
+ if (!pskb_may_pull(skb, sizeof(*ip6) + nhoff))
goto done;
- ip6 = (struct ipv6hdr *) skb->data;
+ ip6 = (struct ipv6hdr *) skb->data + nhoff;
ip_proto = ip6->nexthdr;
addr1 = (__force u32) ip6->saddr.s6_addr32[3];
addr2 = (__force u32) ip6->daddr.s6_addr32[3];
@@ -2330,6 +2302,7 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
default:
goto done;
}
+
switch (ip_proto) {
case IPPROTO_TCP:
case IPPROTO_UDP:
@@ -2338,8 +2311,9 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
case IPPROTO_AH:
case IPPROTO_SCTP:
case IPPROTO_UDPLITE:
- if (pskb_may_pull(skb, (ihl * 4) + 4)) {
- ports.v32 = * (__force u32 *) (skb->data + (ihl * 4));
+ if (pskb_may_pull(skb, (ihl * 4) + 4 + nhoff)) {
+ ports.v32 = * (__force u32 *) (skb->data + nhoff +
+ (ihl * 4));
if (ports.v16[1] < ports.v16[0])
swap(ports.v16[0], ports.v16[1]);
break;
@@ -2352,11 +2326,55 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
/* get a consistent hash (same value on both flow directions) */
if (addr2 < addr1)
swap(addr1, addr2);
- skb->rxhash = jhash_3words(addr1, addr2, ports.v32, hashrnd);
- if (!skb->rxhash)
- skb->rxhash = 1;
-got_hash:
+ hash = jhash_3words(addr1, addr2, ports.v32, hashrnd);
+ if (!hash)
+ hash = 1;
+
+done:
+ return hash;
+}
+EXPORT_SYMBOL(__skb_get_rxhash);
+
+#ifdef CONFIG_RPS
+
+/* One global table that all flow-based protocols share. */
+struct rps_sock_flow_table *rps_sock_flow_table __read_mostly;
+EXPORT_SYMBOL(rps_sock_flow_table);
+
+/*
+ * get_rps_cpu is called from netif_receive_skb and returns the target
+ * CPU from the RPS map of the receiving queue for a given skb.
+ * rcu_read_lock must be held on entry.
+ */
+static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
+ struct rps_dev_flow **rflowp)
+{
+ struct netdev_rx_queue *rxqueue;
+ struct rps_map *map;
+ struct rps_dev_flow_table *flow_table;
+ struct rps_sock_flow_table *sock_flow_table;
+ int cpu = -1;
+ u16 tcpu;
+
+ if (skb_rx_queue_recorded(skb)) {
+ u16 index = skb_get_rx_queue(skb);
+ if (unlikely(index >= dev->num_rx_queues)) {
+ WARN_ONCE(dev->num_rx_queues > 1, "%s received packet "
+ "on queue %u, but number of RX queues is %u\n",
+ dev->name, index, dev->num_rx_queues);
+ goto done;
+ }
+ rxqueue = dev->_rx + index;
+ } else
+ rxqueue = dev->_rx;
+
+ if (!rxqueue->rps_map && !rxqueue->rps_flow_table)
+ goto done;
+
+ if (!skb_get_rxhash(skb))
+ goto done;
+
flow_table = rcu_dereference(rxqueue->rps_flow_table);
sock_flow_table = rcu_dereference(rps_sock_flow_table);
if (flow_table && sock_flow_table) {
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 7a85367b3c2f..d2c4da5a6a4f 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -205,18 +205,24 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev,
struct ethtool_drvinfo info;
const struct ethtool_ops *ops = dev->ethtool_ops;
- if (!ops->get_drvinfo)
- return -EOPNOTSUPP;
-
memset(&info, 0, sizeof(info));
info.cmd = ETHTOOL_GDRVINFO;
- ops->get_drvinfo(dev, &info);
+ if (ops && ops->get_drvinfo) {
+ ops->get_drvinfo(dev, &info);
+ } else if (dev->dev.parent && dev->dev.parent->driver) {
+ strlcpy(info.bus_info, dev_name(dev->dev.parent),
+ sizeof(info.bus_info));
+ strlcpy(info.driver, dev->dev.parent->driver->name,
+ sizeof(info.driver));
+ } else {
+ return -EOPNOTSUPP;
+ }
/*
* this method of obtaining string set info is deprecated;
* Use ETHTOOL_GSSET_INFO instead.
*/
- if (ops->get_sset_count) {
+ if (ops && ops->get_sset_count) {
int rc;
rc = ops->get_sset_count(dev, ETH_SS_TEST);
@@ -229,9 +235,9 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev,
if (rc >= 0)
info.n_priv_flags = rc;
}
- if (ops->get_regs_len)
+ if (ops && ops->get_regs_len)
info.regdump_len = ops->get_regs_len(dev);
- if (ops->get_eeprom_len)
+ if (ops && ops->get_eeprom_len)
info.eedump_len = ops->get_eeprom_len(dev);
if (copy_to_user(useraddr, &info, sizeof(info)))
@@ -1402,12 +1408,19 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
if (!dev || !netif_device_present(dev))
return -ENODEV;
- if (!dev->ethtool_ops)
- return -EOPNOTSUPP;
-
if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
return -EFAULT;
+ if (!dev->ethtool_ops) {
+ /* ETHTOOL_GDRVINFO does not require any driver support.
+ * It is also unprivileged and does not change anything,
+ * so we can take a shortcut to it. */
+ if (ethcmd == ETHTOOL_GDRVINFO)
+ return ethtool_get_drvinfo(dev, useraddr);
+ else
+ return -EOPNOTSUPP;
+ }
+
/* Allow some commands to be done by anyone */
switch (ethcmd) {
case ETHTOOL_GDRVINFO:
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index af4dfbadf2a0..7d748542d97e 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -789,12 +789,13 @@ static const void *net_netlink_ns(struct sock *sk)
return sock_net(sk);
}
-static struct kobj_ns_type_operations net_ns_type_operations = {
+struct kobj_ns_type_operations net_ns_type_operations = {
.type = KOBJ_NS_TYPE_NET,
.current_ns = net_current_ns,
.netlink_ns = net_netlink_ns,
.initial_ns = net_initial_ns,
};
+EXPORT_SYMBOL_GPL(net_ns_type_operations);
static void net_kobj_ns_exit(struct net *net)
{
diff --git a/net/decnet/dn_nsp_out.c b/net/decnet/dn_nsp_out.c
index baeb1eaf011b..2ef115277bea 100644
--- a/net/decnet/dn_nsp_out.c
+++ b/net/decnet/dn_nsp_out.c
@@ -693,22 +693,22 @@ void dn_nsp_send_conninit(struct sock *sk, unsigned char msgflg)
aux = scp->accessdata.acc_userl;
*skb_put(skb, 1) = aux;
if (aux > 0)
- memcpy(skb_put(skb, aux), scp->accessdata.acc_user, aux);
+ memcpy(skb_put(skb, aux), scp->accessdata.acc_user, aux);
aux = scp->accessdata.acc_passl;
*skb_put(skb, 1) = aux;
if (aux > 0)
- memcpy(skb_put(skb, aux), scp->accessdata.acc_pass, aux);
+ memcpy(skb_put(skb, aux), scp->accessdata.acc_pass, aux);
aux = scp->accessdata.acc_accl;
*skb_put(skb, 1) = aux;
if (aux > 0)
- memcpy(skb_put(skb, aux), scp->accessdata.acc_acc, aux);
+ memcpy(skb_put(skb, aux), scp->accessdata.acc_acc, aux);
aux = (__u8)le16_to_cpu(scp->conndata_out.opt_optl);
*skb_put(skb, 1) = aux;
if (aux > 0)
- memcpy(skb_put(skb,aux), scp->conndata_out.opt_data, aux);
+ memcpy(skb_put(skb, aux), scp->conndata_out.opt_data, aux);
scp->persist = dn_nsp_persist(sk);
scp->persist_fxn = dn_nsp_retrans_conninit;
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c
index 6bccba31d132..51d6c3167975 100644
--- a/net/ipv4/netfilter/arp_tables.c
+++ b/net/ipv4/netfilter/arp_tables.c
@@ -735,6 +735,7 @@ static void get_counters(const struct xt_table_info *t,
if (cpu == curcpu)
continue;
i = 0;
+ local_bh_disable();
xt_info_wrlock(cpu);
xt_entry_foreach(iter, t->entries[cpu], t->size) {
ADD_COUNTER(counters[i], iter->counters.bcnt,
@@ -742,6 +743,7 @@ static void get_counters(const struct xt_table_info *t,
++i;
}
xt_info_wrunlock(cpu);
+ local_bh_enable();
}
put_cpu();
}
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
index c439721b165a..97b64b22c412 100644
--- a/net/ipv4/netfilter/ip_tables.c
+++ b/net/ipv4/netfilter/ip_tables.c
@@ -909,6 +909,7 @@ get_counters(const struct xt_table_info *t,
if (cpu == curcpu)
continue;
i = 0;
+ local_bh_disable();
xt_info_wrlock(cpu);
xt_entry_foreach(iter, t->entries[cpu], t->size) {
ADD_COUNTER(counters[i], iter->counters.bcnt,
@@ -916,6 +917,7 @@ get_counters(const struct xt_table_info *t,
++i; /* macro does multi eval of i */
}
xt_info_wrunlock(cpu);
+ local_bh_enable();
}
put_cpu();
}
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c
index 5359ef4daac5..29a7bca29e3f 100644
--- a/net/ipv6/netfilter/ip6_tables.c
+++ b/net/ipv6/netfilter/ip6_tables.c
@@ -922,6 +922,7 @@ get_counters(const struct xt_table_info *t,
if (cpu == curcpu)
continue;
i = 0;
+ local_bh_disable();
xt_info_wrlock(cpu);
xt_entry_foreach(iter, t->entries[cpu], t->size) {
ADD_COUNTER(counters[i], iter->counters.bcnt,
@@ -929,6 +930,7 @@ get_counters(const struct xt_table_info *t,
++i;
}
xt_info_wrunlock(cpu);
+ local_bh_enable();
}
put_cpu();
}
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 8f2d0400cf8a..d126365ac046 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -2580,7 +2580,7 @@ ctl_table ipv6_route_table_template[] = {
.data = &init_net.ipv6.sysctl.ip6_rt_gc_elasticity,
.maxlen = sizeof(int),
.mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
+ .proc_handler = proc_dointvec,
},
{
.procname = "mtu_expires",
@@ -2594,7 +2594,7 @@ ctl_table ipv6_route_table_template[] = {
.data = &init_net.ipv6.sysctl.ip6_rt_min_advmss,
.maxlen = sizeof(int),
.mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
+ .proc_handler = proc_dointvec,
},
{
.procname = "gc_min_interval_ms",
diff --git a/net/mac80211/aes_ccm.c b/net/mac80211/aes_ccm.c
index a87cb3ba2df6..d2b03e0851ef 100644
--- a/net/mac80211/aes_ccm.c
+++ b/net/mac80211/aes_ccm.c
@@ -138,10 +138,8 @@ struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[])
struct crypto_cipher *tfm;
tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
- if (IS_ERR(tfm))
- return NULL;
-
- crypto_cipher_setkey(tfm, key, ALG_CCMP_KEY_LEN);
+ if (!IS_ERR(tfm))
+ crypto_cipher_setkey(tfm, key, ALG_CCMP_KEY_LEN);
return tfm;
}
diff --git a/net/mac80211/aes_cmac.c b/net/mac80211/aes_cmac.c
index 3d097b3d7b62..b4d66cca76d6 100644
--- a/net/mac80211/aes_cmac.c
+++ b/net/mac80211/aes_cmac.c
@@ -119,10 +119,8 @@ struct crypto_cipher * ieee80211_aes_cmac_key_setup(const u8 key[])
struct crypto_cipher *tfm;
tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
- if (IS_ERR(tfm))
- return NULL;
-
- crypto_cipher_setkey(tfm, key, AES_CMAC_KEY_LEN);
+ if (!IS_ERR(tfm))
+ crypto_cipher_setkey(tfm, key, AES_CMAC_KEY_LEN);
return tfm;
}
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
index 965b272499fd..58eab9e8e4ee 100644
--- a/net/mac80211/agg-rx.c
+++ b/net/mac80211/agg-rx.c
@@ -86,6 +86,7 @@ void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
tid, 0, reason);
del_timer_sync(&tid_rx->session_timer);
+ del_timer_sync(&tid_rx->reorder_timer);
call_rcu(&tid_rx->rcu_head, ieee80211_free_tid_rx);
}
@@ -120,6 +121,20 @@ static void sta_rx_agg_session_timer_expired(unsigned long data)
ieee80211_queue_work(&sta->local->hw, &sta->ampdu_mlme.work);
}
+static void sta_rx_agg_reorder_timer_expired(unsigned long data)
+{
+ u8 *ptid = (u8 *)data;
+ u8 *timer_to_id = ptid - *ptid;
+ struct sta_info *sta = container_of(timer_to_id, struct sta_info,
+ timer_to_tid[0]);
+
+ rcu_read_lock();
+ spin_lock(&sta->lock);
+ ieee80211_release_reorder_timeout(sta, *ptid);
+ spin_unlock(&sta->lock);
+ rcu_read_unlock();
+}
+
static void ieee80211_send_addba_resp(struct ieee80211_sub_if_data *sdata, u8 *da, u16 tid,
u8 dialog_token, u16 status, u16 policy,
u16 buf_size, u16 timeout)
@@ -251,11 +266,18 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,
goto end;
}
+ spin_lock_init(&tid_agg_rx->reorder_lock);
+
/* rx timer */
tid_agg_rx->session_timer.function = sta_rx_agg_session_timer_expired;
tid_agg_rx->session_timer.data = (unsigned long)&sta->timer_to_tid[tid];
init_timer(&tid_agg_rx->session_timer);
+ /* rx reorder timer */
+ tid_agg_rx->reorder_timer.function = sta_rx_agg_reorder_timer_expired;
+ tid_agg_rx->reorder_timer.data = (unsigned long)&sta->timer_to_tid[tid];
+ init_timer(&tid_agg_rx->reorder_timer);
+
/* prepare reordering buffer */
tid_agg_rx->reorder_buf =
kcalloc(buf_size, sizeof(struct sk_buff *), GFP_ATOMIC);
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 29ac8e1a509e..94787d21282c 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -116,7 +116,6 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
{
struct ieee80211_sub_if_data *sdata;
struct sta_info *sta = NULL;
- enum ieee80211_key_alg alg;
struct ieee80211_key *key;
int err;
@@ -125,33 +124,22 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+ /* reject WEP and TKIP keys if WEP failed to initialize */
switch (params->cipher) {
case WLAN_CIPHER_SUITE_WEP40:
- case WLAN_CIPHER_SUITE_WEP104:
- alg = ALG_WEP;
- break;
case WLAN_CIPHER_SUITE_TKIP:
- alg = ALG_TKIP;
- break;
- case WLAN_CIPHER_SUITE_CCMP:
- alg = ALG_CCMP;
- break;
- case WLAN_CIPHER_SUITE_AES_CMAC:
- alg = ALG_AES_CMAC;
+ case WLAN_CIPHER_SUITE_WEP104:
+ if (IS_ERR(sdata->local->wep_tx_tfm))
+ return -EINVAL;
break;
default:
- return -EINVAL;
+ break;
}
- /* reject WEP and TKIP keys if WEP failed to initialize */
- if ((alg == ALG_WEP || alg == ALG_TKIP) &&
- IS_ERR(sdata->local->wep_tx_tfm))
- return -EINVAL;
-
- key = ieee80211_key_alloc(alg, key_idx, params->key_len, params->key,
- params->seq_len, params->seq);
- if (!key)
- return -ENOMEM;
+ key = ieee80211_key_alloc(params->cipher, key_idx, params->key_len,
+ params->key, params->seq_len, params->seq);
+ if (IS_ERR(key))
+ return PTR_ERR(key);
mutex_lock(&sdata->local->sta_mtx);
@@ -247,10 +235,10 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
memset(&params, 0, sizeof(params));
- switch (key->conf.alg) {
- case ALG_TKIP:
- params.cipher = WLAN_CIPHER_SUITE_TKIP;
+ params.cipher = key->conf.cipher;
+ switch (key->conf.cipher) {
+ case WLAN_CIPHER_SUITE_TKIP:
iv32 = key->u.tkip.tx.iv32;
iv16 = key->u.tkip.tx.iv16;
@@ -268,8 +256,7 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
params.seq = seq;
params.seq_len = 6;
break;
- case ALG_CCMP:
- params.cipher = WLAN_CIPHER_SUITE_CCMP;
+ case WLAN_CIPHER_SUITE_CCMP:
seq[0] = key->u.ccmp.tx_pn[5];
seq[1] = key->u.ccmp.tx_pn[4];
seq[2] = key->u.ccmp.tx_pn[3];
@@ -279,14 +266,7 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
params.seq = seq;
params.seq_len = 6;
break;
- case ALG_WEP:
- if (key->conf.keylen == 5)
- params.cipher = WLAN_CIPHER_SUITE_WEP40;
- else
- params.cipher = WLAN_CIPHER_SUITE_WEP104;
- break;
- case ALG_AES_CMAC:
- params.cipher = WLAN_CIPHER_SUITE_AES_CMAC;
+ case WLAN_CIPHER_SUITE_AES_CMAC:
seq[0] = key->u.aes_cmac.tx_pn[5];
seq[1] = key->u.aes_cmac.tx_pn[4];
seq[2] = key->u.aes_cmac.tx_pn[3];
@@ -1541,11 +1521,11 @@ static int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy,
return ieee80211_wk_cancel_remain_on_channel(sdata, cookie);
}
-static int ieee80211_action(struct wiphy *wiphy, struct net_device *dev,
- struct ieee80211_channel *chan,
- enum nl80211_channel_type channel_type,
- bool channel_type_valid,
- const u8 *buf, size_t len, u64 *cookie)
+static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
+ struct ieee80211_channel *chan,
+ enum nl80211_channel_type channel_type,
+ bool channel_type_valid,
+ const u8 *buf, size_t len, u64 *cookie)
{
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
struct ieee80211_local *local = sdata->local;
@@ -1575,8 +1555,6 @@ static int ieee80211_action(struct wiphy *wiphy, struct net_device *dev,
return -ENOLINK;
break;
case NL80211_IFTYPE_STATION:
- if (!(sdata->u.mgd.flags & IEEE80211_STA_MFP_ENABLED))
- flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
break;
default:
return -EOPNOTSUPP;
@@ -1647,6 +1625,6 @@ struct cfg80211_ops mac80211_config_ops = {
.set_bitrate_mask = ieee80211_set_bitrate_mask,
.remain_on_channel = ieee80211_remain_on_channel,
.cancel_remain_on_channel = ieee80211_cancel_remain_on_channel,
- .action = ieee80211_action,
+ .mgmt_tx = ieee80211_mgmt_tx,
.set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
};
diff --git a/net/mac80211/debugfs_key.c b/net/mac80211/debugfs_key.c
index fa5e76e658ef..1647f8dc5cda 100644
--- a/net/mac80211/debugfs_key.c
+++ b/net/mac80211/debugfs_key.c
@@ -64,26 +64,13 @@ static ssize_t key_algorithm_read(struct file *file,
char __user *userbuf,
size_t count, loff_t *ppos)
{
- char *alg;
+ char buf[15];
struct ieee80211_key *key = file->private_data;
+ u32 c = key->conf.cipher;
- switch (key->conf.alg) {
- case ALG_WEP:
- alg = "WEP\n";
- break;
- case ALG_TKIP:
- alg = "TKIP\n";
- break;
- case ALG_CCMP:
- alg = "CCMP\n";
- break;
- case ALG_AES_CMAC:
- alg = "AES-128-CMAC\n";
- break;
- default:
- return 0;
- }
- return simple_read_from_buffer(userbuf, count, ppos, alg, strlen(alg));
+ sprintf(buf, "%.2x-%.2x-%.2x:%d\n",
+ c >> 24, (c >> 16) & 0xff, (c >> 8) & 0xff, c & 0xff);
+ return simple_read_from_buffer(userbuf, count, ppos, buf, strlen(buf));
}
KEY_OPS(algorithm);
@@ -95,21 +82,22 @@ static ssize_t key_tx_spec_read(struct file *file, char __user *userbuf,
int len;
struct ieee80211_key *key = file->private_data;
- switch (key->conf.alg) {
- case ALG_WEP:
+ switch (key->conf.cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
len = scnprintf(buf, sizeof(buf), "\n");
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
len = scnprintf(buf, sizeof(buf), "%08x %04x\n",
key->u.tkip.tx.iv32,
key->u.tkip.tx.iv16);
break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
tpn = key->u.ccmp.tx_pn;
len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
tpn[0], tpn[1], tpn[2], tpn[3], tpn[4], tpn[5]);
break;
- case ALG_AES_CMAC:
+ case WLAN_CIPHER_SUITE_AES_CMAC:
tpn = key->u.aes_cmac.tx_pn;
len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
tpn[0], tpn[1], tpn[2], tpn[3], tpn[4],
@@ -130,11 +118,12 @@ static ssize_t key_rx_spec_read(struct file *file, char __user *userbuf,
int i, len;
const u8 *rpn;
- switch (key->conf.alg) {
- case ALG_WEP:
+ switch (key->conf.cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
len = scnprintf(buf, sizeof(buf), "\n");
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
for (i = 0; i < NUM_RX_DATA_QUEUES; i++)
p += scnprintf(p, sizeof(buf)+buf-p,
"%08x %04x\n",
@@ -142,7 +131,7 @@ static ssize_t key_rx_spec_read(struct file *file, char __user *userbuf,
key->u.tkip.rx[i].iv16);
len = p - buf;
break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
for (i = 0; i < NUM_RX_DATA_QUEUES + 1; i++) {
rpn = key->u.ccmp.rx_pn[i];
p += scnprintf(p, sizeof(buf)+buf-p,
@@ -152,7 +141,7 @@ static ssize_t key_rx_spec_read(struct file *file, char __user *userbuf,
}
len = p - buf;
break;
- case ALG_AES_CMAC:
+ case WLAN_CIPHER_SUITE_AES_CMAC:
rpn = key->u.aes_cmac.rx_pn;
p += scnprintf(p, sizeof(buf)+buf-p,
"%02x%02x%02x%02x%02x%02x\n",
@@ -174,11 +163,11 @@ static ssize_t key_replays_read(struct file *file, char __user *userbuf,
char buf[20];
int len;
- switch (key->conf.alg) {
- case ALG_CCMP:
+ switch (key->conf.cipher) {
+ case WLAN_CIPHER_SUITE_CCMP:
len = scnprintf(buf, sizeof(buf), "%u\n", key->u.ccmp.replays);
break;
- case ALG_AES_CMAC:
+ case WLAN_CIPHER_SUITE_AES_CMAC:
len = scnprintf(buf, sizeof(buf), "%u\n",
key->u.aes_cmac.replays);
break;
@@ -196,8 +185,8 @@ static ssize_t key_icverrors_read(struct file *file, char __user *userbuf,
char buf[20];
int len;
- switch (key->conf.alg) {
- case ALG_AES_CMAC:
+ switch (key->conf.cipher) {
+ case WLAN_CIPHER_SUITE_AES_CMAC:
len = scnprintf(buf, sizeof(buf), "%u\n",
key->u.aes_cmac.icverrors);
break;
diff --git a/net/mac80211/driver-trace.h b/net/mac80211/driver-trace.h
index 5d5d2a974668..b5a95582d816 100644
--- a/net/mac80211/driver-trace.h
+++ b/net/mac80211/driver-trace.h
@@ -336,7 +336,7 @@ TRACE_EVENT(drv_set_key,
LOCAL_ENTRY
VIF_ENTRY
STA_ENTRY
- __field(enum ieee80211_key_alg, alg)
+ __field(u32, cipher)
__field(u8, hw_key_idx)
__field(u8, flags)
__field(s8, keyidx)
@@ -346,7 +346,7 @@ TRACE_EVENT(drv_set_key,
LOCAL_ASSIGN;
VIF_ASSIGN;
STA_ASSIGN;
- __entry->alg = key->alg;
+ __entry->cipher = key->cipher;
__entry->flags = key->flags;
__entry->keyidx = key->keyidx;
__entry->hw_key_idx = key->hw_key_idx;
diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c
index 9d101fb33861..11f74f5f7b2f 100644
--- a/net/mac80211/ht.c
+++ b/net/mac80211/ht.c
@@ -265,3 +265,31 @@ int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata,
return 0;
}
+
+void ieee80211_request_smps_work(struct work_struct *work)
+{
+ struct ieee80211_sub_if_data *sdata =
+ container_of(work, struct ieee80211_sub_if_data,
+ u.mgd.request_smps_work);
+
+ mutex_lock(&sdata->u.mgd.mtx);
+ __ieee80211_request_smps(sdata, sdata->u.mgd.driver_smps_mode);
+ mutex_unlock(&sdata->u.mgd.mtx);
+}
+
+void ieee80211_request_smps(struct ieee80211_vif *vif,
+ enum ieee80211_smps_mode smps_mode)
+{
+ struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
+
+ if (WARN_ON(vif->type != NL80211_IFTYPE_STATION))
+ return;
+
+ if (WARN_ON(smps_mode == IEEE80211_SMPS_OFF))
+ smps_mode = IEEE80211_SMPS_AUTOMATIC;
+
+ ieee80211_queue_work(&sdata->local->hw,
+ &sdata->u.mgd.request_smps_work);
+}
+/* this might change ... don't want non-open drivers using it */
+EXPORT_SYMBOL_GPL(ieee80211_request_smps);
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
index c691780725a7..32af97108425 100644
--- a/net/mac80211/ibss.c
+++ b/net/mac80211/ibss.c
@@ -920,12 +920,14 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
memcpy(sdata->u.ibss.ssid, params->ssid, IEEE80211_MAX_SSID_LEN);
sdata->u.ibss.ssid_len = params->ssid_len;
+ mutex_unlock(&sdata->u.ibss.mtx);
+
+ mutex_lock(&sdata->local->mtx);
ieee80211_recalc_idle(sdata->local);
+ mutex_unlock(&sdata->local->mtx);
ieee80211_queue_work(&sdata->local->hw, &sdata->work);
- mutex_unlock(&sdata->u.ibss.mtx);
-
return 0;
}
@@ -980,7 +982,9 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
mutex_unlock(&sdata->u.ibss.mtx);
+ mutex_lock(&local->mtx);
ieee80211_recalc_idle(sdata->local);
+ mutex_unlock(&local->mtx);
return 0;
}
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 65e0ed6c2975..e73ae51dc036 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -170,6 +170,7 @@ typedef unsigned __bitwise__ ieee80211_rx_result;
#define IEEE80211_RX_RA_MATCH BIT(1)
#define IEEE80211_RX_AMSDU BIT(2)
#define IEEE80211_RX_FRAGMENTED BIT(3)
+#define IEEE80211_MALFORMED_ACTION_FRM BIT(4)
/* only add flags here that do not change with subframes of an aMPDU */
struct ieee80211_rx_data {
@@ -343,7 +344,10 @@ struct ieee80211_if_managed {
unsigned long timers_running; /* used for quiesce/restart */
bool powersave; /* powersave requested for this iface */
enum ieee80211_smps_mode req_smps, /* requested smps mode */
- ap_smps; /* smps mode AP thinks we're in */
+ ap_smps, /* smps mode AP thinks we're in */
+ driver_smps_mode; /* smps mode request */
+
+ struct work_struct request_smps_work;
unsigned int flags;
@@ -497,6 +501,9 @@ struct ieee80211_sub_if_data {
*/
bool ht_opmode_valid;
+ /* to detect idle changes */
+ bool old_idle;
+
/* Fragment table for host-based reassembly */
struct ieee80211_fragment_entry fragments[IEEE80211_FRAGMENT_MAX];
unsigned int fragment_next;
@@ -634,7 +641,6 @@ struct ieee80211_local {
/*
* work stuff, potentially off-channel (in the future)
*/
- struct mutex work_mtx;
struct list_head work_list;
struct timer_list work_timer;
struct work_struct work_work;
@@ -746,9 +752,10 @@ struct ieee80211_local {
*/
struct mutex key_mtx;
+ /* mutex for scan and work locking */
+ struct mutex mtx;
/* Scanning and BSS list */
- struct mutex scan_mtx;
unsigned long scanning;
struct cfg80211_ssid scan_ssid;
struct cfg80211_scan_request *int_scan_req;
@@ -870,6 +877,11 @@ struct ieee80211_local {
struct dentry *keys;
} debugfs;
#endif
+
+ /* dummy netdev for use w/ NAPI */
+ struct net_device napi_dev;
+
+ struct napi_struct napi;
};
static inline struct ieee80211_sub_if_data *
@@ -1105,6 +1117,7 @@ void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata,
int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata,
enum ieee80211_smps_mode smps, const u8 *da,
const u8 *bssid);
+void ieee80211_request_smps_work(struct work_struct *work);
void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
u16 initiator, u16 reason);
@@ -1131,6 +1144,7 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid);
void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid);
void ieee80211_ba_session_work(struct work_struct *work);
void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid);
+void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid);
/* Spectrum management */
void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata,
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index ebbe264e2b0b..86f434f234ae 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -177,7 +177,7 @@ static int ieee80211_open(struct net_device *dev)
/* no special treatment */
break;
case NL80211_IFTYPE_UNSPECIFIED:
- case __NL80211_IFTYPE_AFTER_LAST:
+ case NUM_NL80211_IFTYPES:
/* cannot happen */
WARN_ON(1);
break;
@@ -187,6 +187,8 @@ static int ieee80211_open(struct net_device *dev)
res = drv_start(local);
if (res)
goto err_del_bss;
+ if (local->ops->napi_poll)
+ napi_enable(&local->napi);
/* we're brought up, everything changes */
hw_reconf_flags = ~0;
ieee80211_led_radio(local, true);
@@ -307,7 +309,9 @@ static int ieee80211_open(struct net_device *dev)
if (sdata->flags & IEEE80211_SDATA_PROMISC)
atomic_inc(&local->iff_promiscs);
+ mutex_lock(&local->mtx);
hw_reconf_flags |= __ieee80211_recalc_idle(local);
+ mutex_unlock(&local->mtx);
local->open_count++;
if (hw_reconf_flags) {
@@ -514,11 +518,15 @@ static int ieee80211_stop(struct net_device *dev)
sdata->bss = NULL;
+ mutex_lock(&local->mtx);
hw_reconf_flags |= __ieee80211_recalc_idle(local);
+ mutex_unlock(&local->mtx);
ieee80211_recalc_ps(local, -1);
if (local->open_count == 0) {
+ if (local->ops->napi_poll)
+ napi_disable(&local->napi);
ieee80211_clear_tx_pending(local);
ieee80211_stop_device(local);
@@ -626,7 +634,7 @@ static void ieee80211_teardown_sdata(struct net_device *dev)
case NL80211_IFTYPE_MONITOR:
break;
case NL80211_IFTYPE_UNSPECIFIED:
- case __NL80211_IFTYPE_AFTER_LAST:
+ case NUM_NL80211_IFTYPES:
BUG();
break;
}
@@ -878,7 +886,7 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
case NL80211_IFTYPE_AP_VLAN:
break;
case NL80211_IFTYPE_UNSPECIFIED:
- case __NL80211_IFTYPE_AFTER_LAST:
+ case NUM_NL80211_IFTYPES:
BUG();
break;
}
@@ -1195,28 +1203,61 @@ u32 __ieee80211_recalc_idle(struct ieee80211_local *local)
{
struct ieee80211_sub_if_data *sdata;
int count = 0;
+ bool working = false, scanning = false;
+ struct ieee80211_work *wk;
- if (!list_empty(&local->work_list))
- return ieee80211_idle_off(local, "working");
-
- if (local->scanning)
- return ieee80211_idle_off(local, "scanning");
+#ifdef CONFIG_PROVE_LOCKING
+ WARN_ON(debug_locks && !lockdep_rtnl_is_held() &&
+ !lockdep_is_held(&local->iflist_mtx));
+#endif
+ lockdep_assert_held(&local->mtx);
list_for_each_entry(sdata, &local->interfaces, list) {
- if (!ieee80211_sdata_running(sdata))
+ if (!ieee80211_sdata_running(sdata)) {
+ sdata->vif.bss_conf.idle = true;
continue;
+ }
+
+ sdata->old_idle = sdata->vif.bss_conf.idle;
+
/* do not count disabled managed interfaces */
if (sdata->vif.type == NL80211_IFTYPE_STATION &&
- !sdata->u.mgd.associated)
+ !sdata->u.mgd.associated) {
+ sdata->vif.bss_conf.idle = true;
continue;
+ }
/* do not count unused IBSS interfaces */
if (sdata->vif.type == NL80211_IFTYPE_ADHOC &&
- !sdata->u.ibss.ssid_len)
+ !sdata->u.ibss.ssid_len) {
+ sdata->vif.bss_conf.idle = true;
continue;
+ }
/* count everything else */
count++;
}
+ list_for_each_entry(wk, &local->work_list, list) {
+ working = true;
+ wk->sdata->vif.bss_conf.idle = false;
+ }
+
+ if (local->scan_sdata) {
+ scanning = true;
+ local->scan_sdata->vif.bss_conf.idle = false;
+ }
+
+ list_for_each_entry(sdata, &local->interfaces, list) {
+ if (sdata->old_idle == sdata->vif.bss_conf.idle)
+ continue;
+ if (!ieee80211_sdata_running(sdata))
+ continue;
+ ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IDLE);
+ }
+
+ if (working)
+ return ieee80211_idle_off(local, "working");
+ if (scanning)
+ return ieee80211_idle_off(local, "scanning");
if (!count)
return ieee80211_idle_on(local);
else
diff --git a/net/mac80211/key.c b/net/mac80211/key.c
index 1b9d87ed143a..9c27c53cfae5 100644
--- a/net/mac80211/key.c
+++ b/net/mac80211/key.c
@@ -227,20 +227,18 @@ static void __ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
}
}
-struct ieee80211_key *ieee80211_key_alloc(enum ieee80211_key_alg alg,
- int idx,
- size_t key_len,
+struct ieee80211_key *ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
const u8 *key_data,
size_t seq_len, const u8 *seq)
{
struct ieee80211_key *key;
- int i, j;
+ int i, j, err;
BUG_ON(idx < 0 || idx >= NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS);
key = kzalloc(sizeof(struct ieee80211_key) + key_len, GFP_KERNEL);
if (!key)
- return NULL;
+ return ERR_PTR(-ENOMEM);
/*
* Default to software encryption; we'll later upload the
@@ -249,15 +247,16 @@ struct ieee80211_key *ieee80211_key_alloc(enum ieee80211_key_alg alg,
key->conf.flags = 0;
key->flags = 0;
- key->conf.alg = alg;
+ key->conf.cipher = cipher;
key->conf.keyidx = idx;
key->conf.keylen = key_len;
- switch (alg) {
- case ALG_WEP:
+ switch (cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
key->conf.iv_len = WEP_IV_LEN;
key->conf.icv_len = WEP_ICV_LEN;
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
key->conf.iv_len = TKIP_IV_LEN;
key->conf.icv_len = TKIP_ICV_LEN;
if (seq) {
@@ -269,7 +268,7 @@ struct ieee80211_key *ieee80211_key_alloc(enum ieee80211_key_alg alg,
}
}
break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
key->conf.iv_len = CCMP_HDR_LEN;
key->conf.icv_len = CCMP_MIC_LEN;
if (seq) {
@@ -278,42 +277,38 @@ struct ieee80211_key *ieee80211_key_alloc(enum ieee80211_key_alg alg,
key->u.ccmp.rx_pn[i][j] =
seq[CCMP_PN_LEN - j - 1];
}
- break;
- case ALG_AES_CMAC:
- key->conf.iv_len = 0;
- key->conf.icv_len = sizeof(struct ieee80211_mmie);
- if (seq)
- for (j = 0; j < 6; j++)
- key->u.aes_cmac.rx_pn[j] = seq[6 - j - 1];
- break;
- }
- memcpy(key->conf.key, key_data, key_len);
- INIT_LIST_HEAD(&key->list);
-
- if (alg == ALG_CCMP) {
/*
* Initialize AES key state here as an optimization so that
* it does not need to be initialized for every packet.
*/
key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt(key_data);
- if (!key->u.ccmp.tfm) {
+ if (IS_ERR(key->u.ccmp.tfm)) {
+ err = PTR_ERR(key->u.ccmp.tfm);
kfree(key);
- return NULL;
+ key = ERR_PTR(err);
}
- }
-
- if (alg == ALG_AES_CMAC) {
+ break;
+ case WLAN_CIPHER_SUITE_AES_CMAC:
+ key->conf.iv_len = 0;
+ key->conf.icv_len = sizeof(struct ieee80211_mmie);
+ if (seq)
+ for (j = 0; j < 6; j++)
+ key->u.aes_cmac.rx_pn[j] = seq[6 - j - 1];
/*
* Initialize AES key state here as an optimization so that
* it does not need to be initialized for every packet.
*/
key->u.aes_cmac.tfm =
ieee80211_aes_cmac_key_setup(key_data);
- if (!key->u.aes_cmac.tfm) {
+ if (IS_ERR(key->u.aes_cmac.tfm)) {
+ err = PTR_ERR(key->u.aes_cmac.tfm);
kfree(key);
- return NULL;
+ key = ERR_PTR(err);
}
+ break;
}
+ memcpy(key->conf.key, key_data, key_len);
+ INIT_LIST_HEAD(&key->list);
return key;
}
@@ -326,9 +321,9 @@ static void __ieee80211_key_destroy(struct ieee80211_key *key)
if (key->local)
ieee80211_key_disable_hw_accel(key);
- if (key->conf.alg == ALG_CCMP)
+ if (key->conf.cipher == WLAN_CIPHER_SUITE_CCMP)
ieee80211_aes_key_free(key->u.ccmp.tfm);
- if (key->conf.alg == ALG_AES_CMAC)
+ if (key->conf.cipher == WLAN_CIPHER_SUITE_AES_CMAC)
ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm);
if (key->local)
ieee80211_debugfs_key_remove(key);
diff --git a/net/mac80211/key.h b/net/mac80211/key.h
index b665bbb7a471..53b5ce12536f 100644
--- a/net/mac80211/key.h
+++ b/net/mac80211/key.h
@@ -123,9 +123,7 @@ struct ieee80211_key {
struct ieee80211_key_conf conf;
};
-struct ieee80211_key *ieee80211_key_alloc(enum ieee80211_key_alg alg,
- int idx,
- size_t key_len,
+struct ieee80211_key *ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
const u8 *key_data,
size_t seq_len, const u8 *seq);
/*
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index 798a91b100cc..a53feac4618c 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -99,11 +99,13 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed)
int ret = 0;
int power;
enum nl80211_channel_type channel_type;
+ u32 offchannel_flag;
might_sleep();
scan_chan = local->scan_channel;
+ offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
if (scan_chan) {
chan = scan_chan;
channel_type = NL80211_CHAN_NO_HT;
@@ -117,8 +119,9 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed)
channel_type = local->_oper_channel_type;
local->hw.conf.flags &= ~IEEE80211_CONF_OFFCHANNEL;
}
+ offchannel_flag ^= local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
- if (chan != local->hw.conf.channel ||
+ if (offchannel_flag || chan != local->hw.conf.channel ||
channel_type != local->hw.conf.channel_type) {
local->hw.conf.channel = chan;
local->hw.conf.channel_type = channel_type;
@@ -390,6 +393,65 @@ static int ieee80211_ifa_changed(struct notifier_block *nb,
}
#endif
+static int ieee80211_napi_poll(struct napi_struct *napi, int budget)
+{
+ struct ieee80211_local *local =
+ container_of(napi, struct ieee80211_local, napi);
+
+ return local->ops->napi_poll(&local->hw, budget);
+}
+
+void ieee80211_napi_schedule(struct ieee80211_hw *hw)
+{
+ struct ieee80211_local *local = hw_to_local(hw);
+
+ napi_schedule(&local->napi);
+}
+EXPORT_SYMBOL(ieee80211_napi_schedule);
+
+void ieee80211_napi_complete(struct ieee80211_hw *hw)
+{
+ struct ieee80211_local *local = hw_to_local(hw);
+
+ napi_complete(&local->napi);
+}
+EXPORT_SYMBOL(ieee80211_napi_complete);
+
+/* There isn't a lot of sense in it, but you can transmit anything you like */
+static const struct ieee80211_txrx_stypes
+ieee80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = {
+ [NL80211_IFTYPE_ADHOC] = {
+ .tx = 0xffff,
+ .rx = BIT(IEEE80211_STYPE_ACTION >> 4),
+ },
+ [NL80211_IFTYPE_STATION] = {
+ .tx = 0xffff,
+ .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+ BIT(IEEE80211_STYPE_PROBE_REQ >> 4),
+ },
+ [NL80211_IFTYPE_AP] = {
+ .tx = 0xffff,
+ .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
+ BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
+ BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
+ BIT(IEEE80211_STYPE_DISASSOC >> 4) |
+ BIT(IEEE80211_STYPE_AUTH >> 4) |
+ BIT(IEEE80211_STYPE_DEAUTH >> 4) |
+ BIT(IEEE80211_STYPE_ACTION >> 4),
+ },
+ [NL80211_IFTYPE_AP_VLAN] = {
+ /* copy AP */
+ .tx = 0xffff,
+ .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
+ BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
+ BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
+ BIT(IEEE80211_STYPE_DISASSOC >> 4) |
+ BIT(IEEE80211_STYPE_AUTH >> 4) |
+ BIT(IEEE80211_STYPE_DEAUTH >> 4) |
+ BIT(IEEE80211_STYPE_ACTION >> 4),
+ },
+};
+
struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
const struct ieee80211_ops *ops)
{
@@ -419,6 +481,8 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
if (!wiphy)
return NULL;
+ wiphy->mgmt_stypes = ieee80211_default_mgmt_stypes;
+
wiphy->flags |= WIPHY_FLAG_NETNS_OK |
WIPHY_FLAG_4ADDR_AP |
WIPHY_FLAG_4ADDR_STATION;
@@ -455,7 +519,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
__hw_addr_init(&local->mc_list);
mutex_init(&local->iflist_mtx);
- mutex_init(&local->scan_mtx);
+ mutex_init(&local->mtx);
mutex_init(&local->key_mtx);
spin_lock_init(&local->filter_lock);
@@ -494,6 +558,9 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
skb_queue_head_init(&local->skb_queue);
skb_queue_head_init(&local->skb_queue_unreliable);
+ /* init dummy netdev for use w/ NAPI */
+ init_dummy_netdev(&local->napi_dev);
+
return local_to_hw(local);
}
EXPORT_SYMBOL(ieee80211_alloc_hw);
@@ -506,6 +573,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
int channels, max_bitrates;
bool supp_ht;
static const u32 cipher_suites[] = {
+ /* keep WEP first, it may be removed below */
WLAN_CIPHER_SUITE_WEP40,
WLAN_CIPHER_SUITE_WEP104,
WLAN_CIPHER_SUITE_TKIP,
@@ -593,6 +661,10 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
local->hw.wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
if (!(local->hw.flags & IEEE80211_HW_MFP_CAPABLE))
local->hw.wiphy->n_cipher_suites--;
+ if (IS_ERR(local->wep_tx_tfm) || IS_ERR(local->wep_rx_tfm)) {
+ local->hw.wiphy->cipher_suites += 2;
+ local->hw.wiphy->n_cipher_suites -= 2;
+ }
result = wiphy_register(local->hw.wiphy);
if (result < 0)
@@ -683,6 +755,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
goto fail_ifa;
#endif
+ netif_napi_add(&local->napi_dev, &local->napi, ieee80211_napi_poll,
+ local->hw.napi_weight);
+
return 0;
#ifdef CONFIG_INET
@@ -758,7 +833,7 @@ void ieee80211_free_hw(struct ieee80211_hw *hw)
struct ieee80211_local *local = hw_to_local(hw);
mutex_destroy(&local->iflist_mtx);
- mutex_destroy(&local->scan_mtx);
+ mutex_destroy(&local->mtx);
wiphy_free(local->hw.wiphy);
}
diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h
index ebd3f1d9d889..58e741128968 100644
--- a/net/mac80211/mesh.h
+++ b/net/mac80211/mesh.h
@@ -115,7 +115,7 @@ struct mesh_path {
* @hash_rnd: random value used for hash computations
* @entries: number of entries in the table
* @free_node: function to free nodes of the table
- * @copy_node: fuction to copy nodes of the table
+ * @copy_node: function to copy nodes of the table
* @size_order: determines size of the table, there will be 2^size_order hash
* buckets
* @mean_chain_len: maximum average length for the hash buckets' list, if it is
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index b6c163ac22da..38996a44aa8e 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1103,8 +1103,11 @@ static void __ieee80211_connection_loss(struct ieee80211_sub_if_data *sdata)
printk(KERN_DEBUG "Connection to AP %pM lost.\n", bssid);
ieee80211_set_disassoc(sdata, true);
- ieee80211_recalc_idle(local);
mutex_unlock(&ifmgd->mtx);
+
+ mutex_lock(&local->mtx);
+ ieee80211_recalc_idle(local);
+ mutex_unlock(&local->mtx);
/*
* must be outside lock due to cfg80211,
* but that's not a problem.
@@ -1173,7 +1176,9 @@ ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
sdata->name, bssid, reason_code);
ieee80211_set_disassoc(sdata, true);
+ mutex_lock(&sdata->local->mtx);
ieee80211_recalc_idle(sdata->local);
+ mutex_unlock(&sdata->local->mtx);
return RX_MGMT_CFG80211_DEAUTH;
}
@@ -1203,7 +1208,9 @@ ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata,
sdata->name, mgmt->sa, reason_code);
ieee80211_set_disassoc(sdata, true);
+ mutex_lock(&sdata->local->mtx);
ieee80211_recalc_idle(sdata->local);
+ mutex_unlock(&sdata->local->mtx);
return RX_MGMT_CFG80211_DISASSOC;
}
@@ -1751,7 +1758,7 @@ void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
struct ieee80211_local *local = sdata->local;
struct ieee80211_work *wk;
- mutex_lock(&local->work_mtx);
+ mutex_lock(&local->mtx);
list_for_each_entry(wk, &local->work_list, list) {
if (wk->sdata != sdata)
continue;
@@ -1783,7 +1790,7 @@ void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
free_work(wk);
break;
}
- mutex_unlock(&local->work_mtx);
+ mutex_unlock(&local->mtx);
cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len);
}
@@ -1840,8 +1847,10 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
" after %dms, disconnecting.\n",
bssid, (1000 * IEEE80211_PROBE_WAIT)/HZ);
ieee80211_set_disassoc(sdata, true);
- ieee80211_recalc_idle(local);
mutex_unlock(&ifmgd->mtx);
+ mutex_lock(&local->mtx);
+ ieee80211_recalc_idle(local);
+ mutex_unlock(&local->mtx);
/*
* must be outside lock due to cfg80211,
* but that's not a problem.
@@ -1917,6 +1926,8 @@ void ieee80211_sta_quiesce(struct ieee80211_sub_if_data *sdata)
* time -- the code here is properly synchronised.
*/
+ cancel_work_sync(&ifmgd->request_smps_work);
+
cancel_work_sync(&ifmgd->beacon_connection_loss_work);
if (del_timer_sync(&ifmgd->timer))
set_bit(TMR_RUNNING_TIMER, &ifmgd->timers_running);
@@ -1952,6 +1963,7 @@ void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata)
INIT_WORK(&ifmgd->chswitch_work, ieee80211_chswitch_work);
INIT_WORK(&ifmgd->beacon_connection_loss_work,
ieee80211_beacon_connection_loss_work);
+ INIT_WORK(&ifmgd->request_smps_work, ieee80211_request_smps_work);
setup_timer(&ifmgd->timer, ieee80211_sta_timer,
(unsigned long) sdata);
setup_timer(&ifmgd->bcn_mon_timer, ieee80211_sta_bcn_mon_timer,
@@ -2275,7 +2287,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
mutex_unlock(&ifmgd->mtx);
- mutex_lock(&local->work_mtx);
+ mutex_lock(&local->mtx);
list_for_each_entry(wk, &local->work_list, list) {
if (wk->sdata != sdata)
continue;
@@ -2294,7 +2306,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
free_work(wk);
break;
}
- mutex_unlock(&local->work_mtx);
+ mutex_unlock(&local->mtx);
/*
* If somebody requests authentication and we haven't
@@ -2319,7 +2331,9 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
if (assoc_bss)
sta_info_destroy_addr(sdata, bssid);
+ mutex_lock(&sdata->local->mtx);
ieee80211_recalc_idle(sdata->local);
+ mutex_unlock(&sdata->local->mtx);
return 0;
}
@@ -2357,7 +2371,9 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
cookie, !req->local_state_change);
sta_info_destroy_addr(sdata, bssid);
+ mutex_lock(&sdata->local->mtx);
ieee80211_recalc_idle(sdata->local);
+ mutex_unlock(&sdata->local->mtx);
return 0;
}
diff --git a/net/mac80211/rc80211_pid_debugfs.c b/net/mac80211/rc80211_pid_debugfs.c
index 47438b4a9af5..135f36fd4d5d 100644
--- a/net/mac80211/rc80211_pid_debugfs.c
+++ b/net/mac80211/rc80211_pid_debugfs.c
@@ -162,7 +162,7 @@ static ssize_t rate_control_pid_events_read(struct file *file, char __user *buf,
file_info->next_entry = (file_info->next_entry + 1) %
RC_PID_EVENT_RING_SIZE;
- /* Print information about the event. Note that userpace needs to
+ /* Print information about the event. Note that userspace needs to
* provide large enough buffers. */
length = length < RC_PID_PRINT_BUF_SIZE ?
length : RC_PID_PRINT_BUF_SIZE;
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index fa0f37e4afe4..aa41e382bbb3 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -538,20 +538,12 @@ static void ieee80211_release_reorder_frame(struct ieee80211_hw *hw,
int index,
struct sk_buff_head *frames)
{
- struct ieee80211_supported_band *sband;
- struct ieee80211_rate *rate = NULL;
struct sk_buff *skb = tid_agg_rx->reorder_buf[index];
- struct ieee80211_rx_status *status;
if (!skb)
goto no_frame;
- status = IEEE80211_SKB_RXCB(skb);
-
- /* release the reordered frames to stack */
- sband = hw->wiphy->bands[status->band];
- if (!(status->flag & RX_FLAG_HT))
- rate = &sband->bitrates[status->rate_idx];
+ /* release the frame from the reorder ring buffer */
tid_agg_rx->stored_mpdu_num--;
tid_agg_rx->reorder_buf[index] = NULL;
__skb_queue_tail(frames, skb);
@@ -580,9 +572,80 @@ static void ieee80211_release_reorder_frames(struct ieee80211_hw *hw,
* frames that have not yet been received are assumed to be lost and the skb
* can be released for processing. This may also release other skb's from the
* reorder buffer if there are no additional gaps between the frames.
+ *
+ * Callers must hold tid_agg_rx->reorder_lock.
*/
#define HT_RX_REORDER_BUF_TIMEOUT (HZ / 10)
+static void ieee80211_sta_reorder_release(struct ieee80211_hw *hw,
+ struct tid_ampdu_rx *tid_agg_rx,
+ struct sk_buff_head *frames)
+{
+ int index, j;
+
+ /* release the buffer until next missing frame */
+ index = seq_sub(tid_agg_rx->head_seq_num, tid_agg_rx->ssn) %
+ tid_agg_rx->buf_size;
+ if (!tid_agg_rx->reorder_buf[index] &&
+ tid_agg_rx->stored_mpdu_num > 1) {
+ /*
+ * No buffers ready to be released, but check whether any
+ * frames in the reorder buffer have timed out.
+ */
+ int skipped = 1;
+ for (j = (index + 1) % tid_agg_rx->buf_size; j != index;
+ j = (j + 1) % tid_agg_rx->buf_size) {
+ if (!tid_agg_rx->reorder_buf[j]) {
+ skipped++;
+ continue;
+ }
+ if (!time_after(jiffies, tid_agg_rx->reorder_time[j] +
+ HT_RX_REORDER_BUF_TIMEOUT))
+ goto set_release_timer;
+
+#ifdef CONFIG_MAC80211_HT_DEBUG
+ if (net_ratelimit())
+ printk(KERN_DEBUG "%s: release an RX reorder "
+ "frame due to timeout on earlier "
+ "frames\n",
+ wiphy_name(hw->wiphy));
+#endif
+ ieee80211_release_reorder_frame(hw, tid_agg_rx,
+ j, frames);
+
+ /*
+ * Increment the head seq# also for the skipped slots.
+ */
+ tid_agg_rx->head_seq_num =
+ (tid_agg_rx->head_seq_num + skipped) & SEQ_MASK;
+ skipped = 0;
+ }
+ } else while (tid_agg_rx->reorder_buf[index]) {
+ ieee80211_release_reorder_frame(hw, tid_agg_rx, index, frames);
+ index = seq_sub(tid_agg_rx->head_seq_num, tid_agg_rx->ssn) %
+ tid_agg_rx->buf_size;
+ }
+
+ if (tid_agg_rx->stored_mpdu_num) {
+ j = index = seq_sub(tid_agg_rx->head_seq_num,
+ tid_agg_rx->ssn) % tid_agg_rx->buf_size;
+
+ for (; j != (index - 1) % tid_agg_rx->buf_size;
+ j = (j + 1) % tid_agg_rx->buf_size) {
+ if (tid_agg_rx->reorder_buf[j])
+ break;
+ }
+
+ set_release_timer:
+
+ mod_timer(&tid_agg_rx->reorder_timer,
+ tid_agg_rx->reorder_time[j] +
+ HT_RX_REORDER_BUF_TIMEOUT);
+ } else {
+ del_timer(&tid_agg_rx->reorder_timer);
+ }
+}
+
/*
* As this function belongs to the RX path it must be under
* rcu_read_lock protection. It returns false if the frame
@@ -598,14 +661,16 @@ static bool ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw,
u16 mpdu_seq_num = (sc & IEEE80211_SCTL_SEQ) >> 4;
u16 head_seq_num, buf_size;
int index;
+ bool ret = true;
buf_size = tid_agg_rx->buf_size;
head_seq_num = tid_agg_rx->head_seq_num;
+ spin_lock(&tid_agg_rx->reorder_lock);
/* frame with out of date sequence number */
if (seq_less(mpdu_seq_num, head_seq_num)) {
dev_kfree_skb(skb);
- return true;
+ goto out;
}
/*
@@ -626,7 +691,7 @@ static bool ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw,
/* check if we already stored this frame */
if (tid_agg_rx->reorder_buf[index]) {
dev_kfree_skb(skb);
- return true;
+ goto out;
}
/*
@@ -636,58 +701,19 @@ static bool ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw,
if (mpdu_seq_num == tid_agg_rx->head_seq_num &&
tid_agg_rx->stored_mpdu_num == 0) {
tid_agg_rx->head_seq_num = seq_inc(tid_agg_rx->head_seq_num);
- return false;
+ ret = false;
+ goto out;
}
/* put the frame in the reordering buffer */
tid_agg_rx->reorder_buf[index] = skb;
tid_agg_rx->reorder_time[index] = jiffies;
tid_agg_rx->stored_mpdu_num++;
- /* release the buffer until next missing frame */
- index = seq_sub(tid_agg_rx->head_seq_num, tid_agg_rx->ssn) %
- tid_agg_rx->buf_size;
- if (!tid_agg_rx->reorder_buf[index] &&
- tid_agg_rx->stored_mpdu_num > 1) {
- /*
- * No buffers ready to be released, but check whether any
- * frames in the reorder buffer have timed out.
- */
- int j;
- int skipped = 1;
- for (j = (index + 1) % tid_agg_rx->buf_size; j != index;
- j = (j + 1) % tid_agg_rx->buf_size) {
- if (!tid_agg_rx->reorder_buf[j]) {
- skipped++;
- continue;
- }
- if (!time_after(jiffies, tid_agg_rx->reorder_time[j] +
- HT_RX_REORDER_BUF_TIMEOUT))
- break;
-
-#ifdef CONFIG_MAC80211_HT_DEBUG
- if (net_ratelimit())
- printk(KERN_DEBUG "%s: release an RX reorder "
- "frame due to timeout on earlier "
- "frames\n",
- wiphy_name(hw->wiphy));
-#endif
- ieee80211_release_reorder_frame(hw, tid_agg_rx,
- j, frames);
+ ieee80211_sta_reorder_release(hw, tid_agg_rx, frames);
- /*
- * Increment the head seq# also for the skipped slots.
- */
- tid_agg_rx->head_seq_num =
- (tid_agg_rx->head_seq_num + skipped) & SEQ_MASK;
- skipped = 0;
- }
- } else while (tid_agg_rx->reorder_buf[index]) {
- ieee80211_release_reorder_frame(hw, tid_agg_rx, index, frames);
- index = seq_sub(tid_agg_rx->head_seq_num, tid_agg_rx->ssn) %
- tid_agg_rx->buf_size;
- }
-
- return true;
+ out:
+ spin_unlock(&tid_agg_rx->reorder_lock);
+ return ret;
}
/*
@@ -873,6 +899,9 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
if (!is_multicast_ether_addr(hdr->addr1) && stakey) {
rx->key = stakey;
+ if ((status->flag & RX_FLAG_DECRYPTED) &&
+ (status->flag & RX_FLAG_IV_STRIPPED))
+ return RX_CONTINUE;
/* Skip decryption if the frame is not protected. */
if (!ieee80211_has_protected(fc))
return RX_CONTINUE;
@@ -935,7 +964,8 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
* pairwise or station-to-station keys, but for WEP we allow
* using a key index as well.
*/
- if (rx->key && rx->key->conf.alg != ALG_WEP &&
+ if (rx->key && rx->key->conf.cipher != WLAN_CIPHER_SUITE_WEP40 &&
+ rx->key->conf.cipher != WLAN_CIPHER_SUITE_WEP104 &&
!is_multicast_ether_addr(hdr->addr1))
rx->key = NULL;
}
@@ -951,8 +981,9 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
return RX_DROP_UNUSABLE;
/* the hdr variable is invalid now! */
- switch (rx->key->conf.alg) {
- case ALG_WEP:
+ switch (rx->key->conf.cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
/* Check for weak IVs if possible */
if (rx->sta && ieee80211_is_data(fc) &&
(!(status->flag & RX_FLAG_IV_STRIPPED) ||
@@ -962,13 +993,13 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
result = ieee80211_crypto_wep_decrypt(rx);
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
result = ieee80211_crypto_tkip_decrypt(rx);
break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
result = ieee80211_crypto_ccmp_decrypt(rx);
break;
- case ALG_AES_CMAC:
+ case WLAN_CIPHER_SUITE_AES_CMAC:
result = ieee80211_crypto_aes_cmac_decrypt(rx);
break;
}
@@ -1265,7 +1296,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
/* This is the first fragment of a new frame. */
entry = ieee80211_reassemble_add(rx->sdata, frag, seq,
rx->queue, &(rx->skb));
- if (rx->key && rx->key->conf.alg == ALG_CCMP &&
+ if (rx->key && rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP &&
ieee80211_has_protected(fc)) {
int queue = ieee80211_is_mgmt(fc) ?
NUM_RX_DATA_QUEUES : rx->queue;
@@ -1294,7 +1325,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
int i;
u8 pn[CCMP_PN_LEN], *rpn;
int queue;
- if (!rx->key || rx->key->conf.alg != ALG_CCMP)
+ if (!rx->key || rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP)
return RX_DROP_UNUSABLE;
memcpy(pn, entry->last_pn, CCMP_PN_LEN);
for (i = CCMP_PN_LEN - 1; i >= 0; i--) {
@@ -1909,13 +1940,36 @@ static void ieee80211_process_sa_query_req(struct ieee80211_sub_if_data *sdata,
}
static ieee80211_rx_result debug_noinline
+ieee80211_rx_h_mgmt_check(struct ieee80211_rx_data *rx)
+{
+ struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data;
+
+ /*
+ * From here on, look only at management frames.
+ * Data and control frames are already handled,
+ * and unknown (reserved) frames are useless.
+ */
+ if (rx->skb->len < 24)
+ return RX_DROP_MONITOR;
+
+ if (!ieee80211_is_mgmt(mgmt->frame_control))
+ return RX_DROP_MONITOR;
+
+ if (!(rx->flags & IEEE80211_RX_RA_MATCH))
+ return RX_DROP_MONITOR;
+
+ if (ieee80211_drop_unencrypted_mgmt(rx))
+ return RX_DROP_UNUSABLE;
+
+ return RX_CONTINUE;
+}
+
+static ieee80211_rx_result debug_noinline
ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
{
struct ieee80211_local *local = rx->local;
struct ieee80211_sub_if_data *sdata = rx->sdata;
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data;
- struct sk_buff *nskb;
- struct ieee80211_rx_status *status;
int len = rx->skb->len;
if (!ieee80211_is_action(mgmt->frame_control))
@@ -1931,9 +1985,6 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
if (!(rx->flags & IEEE80211_RX_RA_MATCH))
return RX_DROP_UNUSABLE;
- if (ieee80211_drop_unencrypted_mgmt(rx))
- return RX_DROP_UNUSABLE;
-
switch (mgmt->u.action.category) {
case WLAN_CATEGORY_BACK:
/*
@@ -2024,17 +2075,36 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
goto queue;
}
+ return RX_CONTINUE;
+
invalid:
- /*
- * For AP mode, hostapd is responsible for handling any action
- * frames that we didn't handle, including returning unknown
- * ones. For all other modes we will return them to the sender,
- * setting the 0x80 bit in the action category, as required by
- * 802.11-2007 7.3.1.11.
- */
- if (sdata->vif.type == NL80211_IFTYPE_AP ||
- sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
- return RX_DROP_MONITOR;
+ rx->flags |= IEEE80211_MALFORMED_ACTION_FRM;
+ /* will return in the next handlers */
+ return RX_CONTINUE;
+
+ handled:
+ if (rx->sta)
+ rx->sta->rx_packets++;
+ dev_kfree_skb(rx->skb);
+ return RX_QUEUED;
+
+ queue:
+ rx->skb->pkt_type = IEEE80211_SDATA_QUEUE_TYPE_FRAME;
+ skb_queue_tail(&sdata->skb_queue, rx->skb);
+ ieee80211_queue_work(&local->hw, &sdata->work);
+ if (rx->sta)
+ rx->sta->rx_packets++;
+ return RX_QUEUED;
+}
+
+static ieee80211_rx_result debug_noinline
+ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx)
+{
+ struct ieee80211_rx_status *status;
+
+ /* skip known-bad action frames and return them in the next handler */
+ if (rx->flags & IEEE80211_MALFORMED_ACTION_FRM)
+ return RX_CONTINUE;
/*
* Getting here means the kernel doesn't know how to handle
@@ -2044,10 +2114,44 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
*/
status = IEEE80211_SKB_RXCB(rx->skb);
- if (cfg80211_rx_action(rx->sdata->dev, status->freq,
- rx->skb->data, rx->skb->len,
- GFP_ATOMIC))
- goto handled;
+ if (cfg80211_rx_mgmt(rx->sdata->dev, status->freq,
+ rx->skb->data, rx->skb->len,
+ GFP_ATOMIC)) {
+ if (rx->sta)
+ rx->sta->rx_packets++;
+ dev_kfree_skb(rx->skb);
+ return RX_QUEUED;
+ }
+
+
+ return RX_CONTINUE;
+}
+
+static ieee80211_rx_result debug_noinline
+ieee80211_rx_h_action_return(struct ieee80211_rx_data *rx)
+{
+ struct ieee80211_local *local = rx->local;
+ struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data;
+ struct sk_buff *nskb;
+ struct ieee80211_sub_if_data *sdata = rx->sdata;
+
+ if (!ieee80211_is_action(mgmt->frame_control))
+ return RX_CONTINUE;
+
+ /*
+ * For AP mode, hostapd is responsible for handling any action
+ * frames that we didn't handle, including returning unknown
+ * ones. For all other modes we will return them to the sender,
+ * setting the 0x80 bit in the action category, as required by
+ * 802.11-2007 7.3.1.11.
+ * Newer versions of hostapd shall also use the management frame
+ * registration mechanisms, but older ones still use cooked
+ * monitor interfaces so push all frames there.
+ */
+ if (!(rx->flags & IEEE80211_MALFORMED_ACTION_FRM) &&
+ (sdata->vif.type == NL80211_IFTYPE_AP ||
+ sdata->vif.type == NL80211_IFTYPE_AP_VLAN))
+ return RX_DROP_MONITOR;
/* do not return rejected action frames */
if (mgmt->u.action.category & 0x80)
@@ -2066,20 +2170,8 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
ieee80211_tx_skb(rx->sdata, nskb);
}
-
- handled:
- if (rx->sta)
- rx->sta->rx_packets++;
dev_kfree_skb(rx->skb);
return RX_QUEUED;
-
- queue:
- rx->skb->pkt_type = IEEE80211_SDATA_QUEUE_TYPE_FRAME;
- skb_queue_tail(&sdata->skb_queue, rx->skb);
- ieee80211_queue_work(&local->hw, &sdata->work);
- if (rx->sta)
- rx->sta->rx_packets++;
- return RX_QUEUED;
}
static ieee80211_rx_result debug_noinline
@@ -2090,15 +2182,6 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
struct ieee80211_mgmt *mgmt = (void *)rx->skb->data;
__le16 stype;
- if (!(rx->flags & IEEE80211_RX_RA_MATCH))
- return RX_DROP_MONITOR;
-
- if (rx->skb->len < 24)
- return RX_DROP_MONITOR;
-
- if (ieee80211_drop_unencrypted_mgmt(rx))
- return RX_DROP_UNUSABLE;
-
rxs = ieee80211_work_rx_mgmt(rx->sdata, rx->skb);
if (rxs != RX_CONTINUE)
return rxs;
@@ -2267,19 +2350,46 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx,
dev_kfree_skb(skb);
}
+static void ieee80211_rx_handlers_result(struct ieee80211_rx_data *rx,
+ ieee80211_rx_result res)
+{
+ switch (res) {
+ case RX_DROP_MONITOR:
+ I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop);
+ if (rx->sta)
+ rx->sta->rx_dropped++;
+ /* fall through */
+ case RX_CONTINUE: {
+ struct ieee80211_rate *rate = NULL;
+ struct ieee80211_supported_band *sband;
+ struct ieee80211_rx_status *status;
+
+ status = IEEE80211_SKB_RXCB((rx->skb));
+
+ sband = rx->local->hw.wiphy->bands[status->band];
+ if (!(status->flag & RX_FLAG_HT))
+ rate = &sband->bitrates[status->rate_idx];
+
+ ieee80211_rx_cooked_monitor(rx, rate);
+ break;
+ }
+ case RX_DROP_UNUSABLE:
+ I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop);
+ if (rx->sta)
+ rx->sta->rx_dropped++;
+ dev_kfree_skb(rx->skb);
+ break;
+ case RX_QUEUED:
+ I802_DEBUG_INC(rx->sdata->local->rx_handlers_queued);
+ break;
+ }
+}
-static void ieee80211_invoke_rx_handlers(struct ieee80211_sub_if_data *sdata,
- struct ieee80211_rx_data *rx,
- struct sk_buff *skb,
- struct ieee80211_rate *rate)
+static void ieee80211_rx_handlers(struct ieee80211_rx_data *rx,
+ struct sk_buff_head *frames)
{
- struct sk_buff_head reorder_release;
ieee80211_rx_result res = RX_DROP_MONITOR;
-
- __skb_queue_head_init(&reorder_release);
-
- rx->skb = skb;
- rx->sdata = sdata;
+ struct sk_buff *skb;
#define CALL_RXH(rxh) \
do { \
@@ -2288,17 +2398,7 @@ static void ieee80211_invoke_rx_handlers(struct ieee80211_sub_if_data *sdata,
goto rxh_next; \
} while (0);
- /*
- * NB: the rxh_next label works even if we jump
- * to it from here because then the list will
- * be empty, which is a trivial check
- */
- CALL_RXH(ieee80211_rx_h_passive_scan)
- CALL_RXH(ieee80211_rx_h_check)
-
- ieee80211_rx_reorder_ampdu(rx, &reorder_release);
-
- while ((skb = __skb_dequeue(&reorder_release))) {
+ while ((skb = __skb_dequeue(frames))) {
/*
* all the other fields are valid across frames
* that belong to an aMPDU since they are on the
@@ -2316,42 +2416,91 @@ static void ieee80211_invoke_rx_handlers(struct ieee80211_sub_if_data *sdata,
CALL_RXH(ieee80211_rx_h_remove_qos_control)
CALL_RXH(ieee80211_rx_h_amsdu)
#ifdef CONFIG_MAC80211_MESH
- if (ieee80211_vif_is_mesh(&sdata->vif))
+ if (ieee80211_vif_is_mesh(&rx->sdata->vif))
CALL_RXH(ieee80211_rx_h_mesh_fwding);
#endif
CALL_RXH(ieee80211_rx_h_data)
/* special treatment -- needs the queue */
- res = ieee80211_rx_h_ctrl(rx, &reorder_release);
+ res = ieee80211_rx_h_ctrl(rx, frames);
if (res != RX_CONTINUE)
goto rxh_next;
+ CALL_RXH(ieee80211_rx_h_mgmt_check)
CALL_RXH(ieee80211_rx_h_action)
+ CALL_RXH(ieee80211_rx_h_userspace_mgmt)
+ CALL_RXH(ieee80211_rx_h_action_return)
CALL_RXH(ieee80211_rx_h_mgmt)
+ rxh_next:
+ ieee80211_rx_handlers_result(rx, res);
+
#undef CALL_RXH
+ }
+}
+
+static void ieee80211_invoke_rx_handlers(struct ieee80211_sub_if_data *sdata,
+ struct ieee80211_rx_data *rx,
+ struct sk_buff *skb)
+{
+ struct sk_buff_head reorder_release;
+ ieee80211_rx_result res = RX_DROP_MONITOR;
+
+ __skb_queue_head_init(&reorder_release);
+
+ rx->skb = skb;
+ rx->sdata = sdata;
+
+#define CALL_RXH(rxh) \
+ do { \
+ res = rxh(rx); \
+ if (res != RX_CONTINUE) \
+ goto rxh_next; \
+ } while (0);
+
+ CALL_RXH(ieee80211_rx_h_passive_scan)
+ CALL_RXH(ieee80211_rx_h_check)
+
+ ieee80211_rx_reorder_ampdu(rx, &reorder_release);
+
+ ieee80211_rx_handlers(rx, &reorder_release);
+ return;
rxh_next:
- switch (res) {
- case RX_DROP_MONITOR:
- I802_DEBUG_INC(sdata->local->rx_handlers_drop);
- if (rx->sta)
- rx->sta->rx_dropped++;
- /* fall through */
- case RX_CONTINUE:
- ieee80211_rx_cooked_monitor(rx, rate);
- break;
- case RX_DROP_UNUSABLE:
- I802_DEBUG_INC(sdata->local->rx_handlers_drop);
- if (rx->sta)
- rx->sta->rx_dropped++;
- dev_kfree_skb(rx->skb);
- break;
- case RX_QUEUED:
- I802_DEBUG_INC(sdata->local->rx_handlers_queued);
- break;
- }
- }
+ ieee80211_rx_handlers_result(rx, res);
+
+#undef CALL_RXH
+}
+
+/*
+ * This function makes calls into the RX path. Therefore the
+ * caller must hold the sta_info->lock and everything has to
+ * be under rcu_read_lock protection as well.
+ */
+void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid)
+{
+ struct sk_buff_head frames;
+ struct ieee80211_rx_data rx = { };
+
+ __skb_queue_head_init(&frames);
+
+ /* construct rx struct */
+ rx.sta = sta;
+ rx.sdata = sta->sdata;
+ rx.local = sta->local;
+ rx.queue = tid;
+ rx.flags |= IEEE80211_RX_RA_MATCH;
+
+ if (unlikely(test_bit(SCAN_HW_SCANNING, &sta->local->scanning) ||
+ test_bit(SCAN_OFF_CHANNEL, &sta->local->scanning)))
+ rx.flags |= IEEE80211_RX_IN_SCAN;
+
+ spin_lock(&sta->ampdu_mlme.tid_rx[tid]->reorder_lock);
+ ieee80211_sta_reorder_release(&sta->local->hw,
+ sta->ampdu_mlme.tid_rx[tid], &frames);
+ spin_unlock(&sta->ampdu_mlme.tid_rx[tid]->reorder_lock);
+
+ ieee80211_rx_handlers(&rx, &frames);
}
/* main receive path */
@@ -2433,7 +2582,7 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,
break;
case NL80211_IFTYPE_MONITOR:
case NL80211_IFTYPE_UNSPECIFIED:
- case __NL80211_IFTYPE_AFTER_LAST:
+ case NUM_NL80211_IFTYPES:
/* should never get here */
WARN_ON(1);
break;
@@ -2447,8 +2596,7 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,
* be called with rcu_read_lock protection.
*/
static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
- struct sk_buff *skb,
- struct ieee80211_rate *rate)
+ struct sk_buff *skb)
{
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
struct ieee80211_local *local = hw_to_local(hw);
@@ -2556,7 +2704,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
prev->name);
goto next;
}
- ieee80211_invoke_rx_handlers(prev, &rx, skb_new, rate);
+ ieee80211_invoke_rx_handlers(prev, &rx, skb_new);
next:
prev = sdata;
}
@@ -2572,7 +2720,7 @@ next:
}
}
if (prev)
- ieee80211_invoke_rx_handlers(prev, &rx, skb, rate);
+ ieee80211_invoke_rx_handlers(prev, &rx, skb);
else
dev_kfree_skb(skb);
}
@@ -2615,28 +2763,37 @@ void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb)
if (WARN_ON(!local->started))
goto drop;
- if (status->flag & RX_FLAG_HT) {
+ if (likely(!(status->flag & RX_FLAG_FAILED_PLCP_CRC))) {
/*
- * rate_idx is MCS index, which can be [0-76] as documented on:
- *
- * http://wireless.kernel.org/en/developers/Documentation/ieee80211/802.11n
- *
- * Anything else would be some sort of driver or hardware error.
- * The driver should catch hardware errors.
+ * Validate the rate, unless a PLCP error means that
+ * we probably can't have a valid rate here anyway.
*/
- if (WARN((status->rate_idx < 0 ||
- status->rate_idx > 76),
- "Rate marked as an HT rate but passed "
- "status->rate_idx is not "
- "an MCS index [0-76]: %d (0x%02x)\n",
- status->rate_idx,
- status->rate_idx))
- goto drop;
- } else {
- if (WARN_ON(status->rate_idx < 0 ||
- status->rate_idx >= sband->n_bitrates))
- goto drop;
- rate = &sband->bitrates[status->rate_idx];
+
+ if (status->flag & RX_FLAG_HT) {
+ /*
+ * rate_idx is MCS index, which can be [0-76]
+ * as documented on:
+ *
+ * http://wireless.kernel.org/en/developers/Documentation/ieee80211/802.11n
+ *
+ * Anything else would be some sort of driver or
+ * hardware error. The driver should catch hardware
+ * errors.
+ */
+ if (WARN((status->rate_idx < 0 ||
+ status->rate_idx > 76),
+ "Rate marked as an HT rate but passed "
+ "status->rate_idx is not "
+ "an MCS index [0-76]: %d (0x%02x)\n",
+ status->rate_idx,
+ status->rate_idx))
+ goto drop;
+ } else {
+ if (WARN_ON(status->rate_idx < 0 ||
+ status->rate_idx >= sband->n_bitrates))
+ goto drop;
+ rate = &sband->bitrates[status->rate_idx];
+ }
}
/*
@@ -2658,7 +2815,7 @@ void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb)
return;
}
- __ieee80211_rx_handle_packet(hw, skb, rate);
+ __ieee80211_rx_handle_packet(hw, skb);
rcu_read_unlock();
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index 872d7b6ef6b3..31f233f7f51a 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -255,7 +255,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
trace_api_scan_completed(local, aborted);
- mutex_lock(&local->scan_mtx);
+ mutex_lock(&local->mtx);
/*
* It's ok to abort a not-yet-running scan (that
@@ -267,7 +267,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
aborted = true;
if (WARN_ON(!local->scan_req)) {
- mutex_unlock(&local->scan_mtx);
+ mutex_unlock(&local->mtx);
return;
}
@@ -275,7 +275,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
if (was_hw_scan && !aborted && ieee80211_prep_hw_scan(local)) {
ieee80211_queue_delayed_work(&local->hw,
&local->scan_work, 0);
- mutex_unlock(&local->scan_mtx);
+ mutex_unlock(&local->mtx);
return;
}
@@ -291,7 +291,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
local->scan_channel = NULL;
/* we only have to protect scan_req and hw/sw scan */
- mutex_unlock(&local->scan_mtx);
+ mutex_unlock(&local->mtx);
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
if (was_hw_scan)
@@ -304,7 +304,9 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
ieee80211_offchannel_return(local, true);
done:
+ mutex_lock(&local->mtx);
ieee80211_recalc_idle(local);
+ mutex_unlock(&local->mtx);
ieee80211_mlme_notify_scan_completed(local);
ieee80211_ibss_notify_scan_completed(local);
ieee80211_mesh_notify_scan_completed(local);
@@ -639,15 +641,15 @@ void ieee80211_scan_work(struct work_struct *work)
struct ieee80211_sub_if_data *sdata = local->scan_sdata;
unsigned long next_delay = 0;
- mutex_lock(&local->scan_mtx);
+ mutex_lock(&local->mtx);
if (!sdata || !local->scan_req) {
- mutex_unlock(&local->scan_mtx);
+ mutex_unlock(&local->mtx);
return;
}
if (local->hw_scan_req) {
int rc = drv_hw_scan(local, sdata, local->hw_scan_req);
- mutex_unlock(&local->scan_mtx);
+ mutex_unlock(&local->mtx);
if (rc)
ieee80211_scan_completed(&local->hw, true);
return;
@@ -661,14 +663,14 @@ void ieee80211_scan_work(struct work_struct *work)
local->scan_sdata = NULL;
rc = __ieee80211_start_scan(sdata, req);
- mutex_unlock(&local->scan_mtx);
+ mutex_unlock(&local->mtx);
if (rc)
ieee80211_scan_completed(&local->hw, true);
return;
}
- mutex_unlock(&local->scan_mtx);
+ mutex_unlock(&local->mtx);
/*
* Avoid re-scheduling when the sdata is going away.
@@ -711,9 +713,9 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
{
int res;
- mutex_lock(&sdata->local->scan_mtx);
+ mutex_lock(&sdata->local->mtx);
res = __ieee80211_start_scan(sdata, req);
- mutex_unlock(&sdata->local->scan_mtx);
+ mutex_unlock(&sdata->local->mtx);
return res;
}
@@ -726,7 +728,7 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
int ret = -EBUSY;
enum ieee80211_band band;
- mutex_lock(&local->scan_mtx);
+ mutex_lock(&local->mtx);
/* busy scanning */
if (local->scan_req)
@@ -761,7 +763,7 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
ret = __ieee80211_start_scan(sdata, sdata->local->int_scan_req);
unlock:
- mutex_unlock(&local->scan_mtx);
+ mutex_unlock(&local->mtx);
return ret;
}
@@ -775,10 +777,10 @@ void ieee80211_scan_cancel(struct ieee80211_local *local)
* Only call this function when a scan can't be
* queued -- mostly at suspend under RTNL.
*/
- mutex_lock(&local->scan_mtx);
+ mutex_lock(&local->mtx);
abortscan = test_bit(SCAN_SW_SCANNING, &local->scanning) ||
(!local->scanning && local->scan_req);
- mutex_unlock(&local->scan_mtx);
+ mutex_unlock(&local->mtx);
if (abortscan)
ieee80211_scan_completed(&local->hw, true);
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index 54262e72376d..810c5ce98316 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -103,6 +103,7 @@ struct tid_ampdu_tx {
* @reorder_buf: buffer to reorder incoming aggregated MPDUs
* @reorder_time: jiffies when skb was added
* @session_timer: check if peer keeps Tx-ing on the TID (by timeout value)
+ * @reorder_timer: releases expired frames from the reorder buffer.
* @head_seq_num: head sequence number in reordering buffer.
* @stored_mpdu_num: number of MPDUs in reordering buffer
* @ssn: Starting Sequence Number expected to be aggregated.
@@ -110,20 +111,25 @@ struct tid_ampdu_tx {
* @timeout: reset timer value (in TUs).
* @dialog_token: dialog token for aggregation session
* @rcu_head: RCU head used for freeing this struct
+ * @reorder_lock: serializes access to reorder buffer, see below.
*
* This structure is protected by RCU and the per-station
* spinlock. Assignments to the array holding it must hold
- * the spinlock, only the RX path can access it under RCU
- * lock-free. The RX path, since it is single-threaded,
- * can even modify the structure without locking since the
- * only other modifications to it are done when the struct
- * can not yet or no longer be found by the RX path.
+ * the spinlock.
+ *
+ * The @reorder_lock is used to protect the variables and
+ * arrays such as @reorder_buf, @reorder_time, @head_seq_num,
+ * @stored_mpdu_num and @reorder_time from being corrupted by
+ * concurrent access of the RX path and the expired frame
+ * release timer.
*/
struct tid_ampdu_rx {
struct rcu_head rcu_head;
+ spinlock_t reorder_lock;
struct sk_buff **reorder_buf;
unsigned long *reorder_time;
struct timer_list session_timer;
+ struct timer_list reorder_timer;
u16 head_seq_num;
u16 stored_mpdu_num;
u16 ssn;
diff --git a/net/mac80211/status.c b/net/mac80211/status.c
index 10caec5ea8fa..67a35841bef0 100644
--- a/net/mac80211/status.c
+++ b/net/mac80211/status.c
@@ -296,7 +296,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
}
if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX)
- cfg80211_action_tx_status(
+ cfg80211_mgmt_tx_status(
skb->dev, (unsigned long) skb, skb->data, skb->len,
!!(info->flags & IEEE80211_TX_STAT_ACK), GFP_ATOMIC);
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index c54db966926b..bc4fefc91663 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -543,15 +543,16 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
tx->key->tx_rx_count++;
/* TODO: add threshold stuff again */
- switch (tx->key->conf.alg) {
- case ALG_WEP:
+ switch (tx->key->conf.cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
if (ieee80211_is_auth(hdr->frame_control))
break;
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
if (!ieee80211_is_data_present(hdr->frame_control))
tx->key = NULL;
break;
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
if (!ieee80211_is_data_present(hdr->frame_control) &&
!ieee80211_use_mfp(hdr->frame_control, tx->sta,
tx->skb))
@@ -561,7 +562,7 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
IEEE80211_KEY_FLAG_SW_MGMT) &&
ieee80211_is_mgmt(hdr->frame_control);
break;
- case ALG_AES_CMAC:
+ case WLAN_CIPHER_SUITE_AES_CMAC:
if (!ieee80211_is_mgmt(hdr->frame_control))
tx->key = NULL;
break;
@@ -949,14 +950,15 @@ ieee80211_tx_h_encrypt(struct ieee80211_tx_data *tx)
if (!tx->key)
return TX_CONTINUE;
- switch (tx->key->conf.alg) {
- case ALG_WEP:
+ switch (tx->key->conf.cipher) {
+ case WLAN_CIPHER_SUITE_WEP40:
+ case WLAN_CIPHER_SUITE_WEP104:
return ieee80211_crypto_wep_encrypt(tx);
- case ALG_TKIP:
+ case WLAN_CIPHER_SUITE_TKIP:
return ieee80211_crypto_tkip_encrypt(tx);
- case ALG_CCMP:
+ case WLAN_CIPHER_SUITE_CCMP:
return ieee80211_crypto_ccmp_encrypt(tx);
- case ALG_AES_CMAC:
+ case WLAN_CIPHER_SUITE_AES_CMAC:
return ieee80211_crypto_aes_cmac_encrypt(tx);
}
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 748387d45bc0..cd2b485fed4f 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -471,7 +471,7 @@ void ieee80211_iterate_active_interfaces(
list_for_each_entry(sdata, &local->interfaces, list) {
switch (sdata->vif.type) {
- case __NL80211_IFTYPE_AFTER_LAST:
+ case NUM_NL80211_IFTYPES:
case NL80211_IFTYPE_UNSPECIFIED:
case NL80211_IFTYPE_MONITOR:
case NL80211_IFTYPE_AP_VLAN:
@@ -505,7 +505,7 @@ void ieee80211_iterate_active_interfaces_atomic(
list_for_each_entry_rcu(sdata, &local->interfaces, list) {
switch (sdata->vif.type) {
- case __NL80211_IFTYPE_AFTER_LAST:
+ case NUM_NL80211_IFTYPES:
case NL80211_IFTYPE_UNSPECIFIED:
case NL80211_IFTYPE_MONITOR:
case NL80211_IFTYPE_AP_VLAN:
@@ -1189,7 +1189,7 @@ int ieee80211_reconfig(struct ieee80211_local *local)
/* ignore virtual */
break;
case NL80211_IFTYPE_UNSPECIFIED:
- case __NL80211_IFTYPE_AFTER_LAST:
+ case NUM_NL80211_IFTYPES:
WARN_ON(1);
break;
}
diff --git a/net/mac80211/wep.c b/net/mac80211/wep.c
index 9ebc8d8a1f5b..f27484c22b9f 100644
--- a/net/mac80211/wep.c
+++ b/net/mac80211/wep.c
@@ -240,7 +240,7 @@ static int ieee80211_wep_decrypt(struct ieee80211_local *local,
keyidx = skb->data[hdrlen + 3] >> 6;
- if (!key || keyidx != key->conf.keyidx || key->conf.alg != ALG_WEP)
+ if (!key || keyidx != key->conf.keyidx)
return -1;
klen = 3 + key->conf.keylen;
diff --git a/net/mac80211/work.c b/net/mac80211/work.c
index 81d4ad64184a..ae344d1ba056 100644
--- a/net/mac80211/work.c
+++ b/net/mac80211/work.c
@@ -43,7 +43,7 @@ enum work_action {
/* utils */
static inline void ASSERT_WORK_MTX(struct ieee80211_local *local)
{
- WARN_ON(!mutex_is_locked(&local->work_mtx));
+ lockdep_assert_held(&local->mtx);
}
/*
@@ -757,7 +757,7 @@ static void ieee80211_work_rx_queued_mgmt(struct ieee80211_local *local,
mgmt = (struct ieee80211_mgmt *) skb->data;
fc = le16_to_cpu(mgmt->frame_control);
- mutex_lock(&local->work_mtx);
+ mutex_lock(&local->mtx);
list_for_each_entry(wk, &local->work_list, list) {
const u8 *bssid = NULL;
@@ -833,7 +833,7 @@ static void ieee80211_work_rx_queued_mgmt(struct ieee80211_local *local,
WARN(1, "unexpected: %d", rma);
}
- mutex_unlock(&local->work_mtx);
+ mutex_unlock(&local->mtx);
if (rma != WORK_ACT_DONE)
goto out;
@@ -845,9 +845,9 @@ static void ieee80211_work_rx_queued_mgmt(struct ieee80211_local *local,
case WORK_DONE_REQUEUE:
synchronize_rcu();
wk->started = false; /* restart */
- mutex_lock(&local->work_mtx);
+ mutex_lock(&local->mtx);
list_add_tail(&wk->list, &local->work_list);
- mutex_unlock(&local->work_mtx);
+ mutex_unlock(&local->mtx);
}
out:
@@ -888,9 +888,9 @@ static void ieee80211_work_work(struct work_struct *work)
while ((skb = skb_dequeue(&local->work_skb_queue)))
ieee80211_work_rx_queued_mgmt(local, skb);
- ieee80211_recalc_idle(local);
+ mutex_lock(&local->mtx);
- mutex_lock(&local->work_mtx);
+ ieee80211_recalc_idle(local);
list_for_each_entry_safe(wk, tmp, &local->work_list, list) {
bool started = wk->started;
@@ -995,20 +995,16 @@ static void ieee80211_work_work(struct work_struct *work)
run_again(local, jiffies + HZ/2);
}
- mutex_lock(&local->scan_mtx);
-
if (list_empty(&local->work_list) && local->scan_req &&
!local->scanning)
ieee80211_queue_delayed_work(&local->hw,
&local->scan_work,
round_jiffies_relative(0));
- mutex_unlock(&local->scan_mtx);
-
- mutex_unlock(&local->work_mtx);
-
ieee80211_recalc_idle(local);
+ mutex_unlock(&local->mtx);
+
list_for_each_entry_safe(wk, tmp, &free_work, list) {
wk->done(wk, NULL);
list_del(&wk->list);
@@ -1035,16 +1031,15 @@ void ieee80211_add_work(struct ieee80211_work *wk)
wk->started = false;
local = wk->sdata->local;
- mutex_lock(&local->work_mtx);
+ mutex_lock(&local->mtx);
list_add_tail(&wk->list, &local->work_list);
- mutex_unlock(&local->work_mtx);
+ mutex_unlock(&local->mtx);
ieee80211_queue_work(&local->hw, &local->work_work);
}
void ieee80211_work_init(struct ieee80211_local *local)
{
- mutex_init(&local->work_mtx);
INIT_LIST_HEAD(&local->work_list);
setup_timer(&local->work_timer, ieee80211_work_timer,
(unsigned long)local);
@@ -1057,7 +1052,7 @@ void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
struct ieee80211_local *local = sdata->local;
struct ieee80211_work *wk;
- mutex_lock(&local->work_mtx);
+ mutex_lock(&local->mtx);
list_for_each_entry(wk, &local->work_list, list) {
if (wk->sdata != sdata)
continue;
@@ -1065,19 +1060,19 @@ void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
wk->started = true;
wk->timeout = jiffies;
}
- mutex_unlock(&local->work_mtx);
+ mutex_unlock(&local->mtx);
/* run cleanups etc. */
ieee80211_work_work(&local->work_work);
- mutex_lock(&local->work_mtx);
+ mutex_lock(&local->mtx);
list_for_each_entry(wk, &local->work_list, list) {
if (wk->sdata != sdata)
continue;
WARN_ON(1);
break;
}
- mutex_unlock(&local->work_mtx);
+ mutex_unlock(&local->mtx);
}
ieee80211_rx_result ieee80211_work_rx_mgmt(struct ieee80211_sub_if_data *sdata,
@@ -1163,7 +1158,7 @@ int ieee80211_wk_cancel_remain_on_channel(struct ieee80211_sub_if_data *sdata,
struct ieee80211_work *wk, *tmp;
bool found = false;
- mutex_lock(&local->work_mtx);
+ mutex_lock(&local->mtx);
list_for_each_entry_safe(wk, tmp, &local->work_list, list) {
if ((unsigned long) wk == cookie) {
wk->timeout = jiffies;
@@ -1171,7 +1166,7 @@ int ieee80211_wk_cancel_remain_on_channel(struct ieee80211_sub_if_data *sdata,
break;
}
}
- mutex_unlock(&local->work_mtx);
+ mutex_unlock(&local->mtx);
if (!found)
return -ENOENT;
diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c
index 8d59d27d887e..43882b36da55 100644
--- a/net/mac80211/wpa.c
+++ b/net/mac80211/wpa.c
@@ -36,8 +36,8 @@ ieee80211_tx_h_michael_mic_add(struct ieee80211_tx_data *tx)
int tail;
hdr = (struct ieee80211_hdr *)skb->data;
- if (!tx->key || tx->key->conf.alg != ALG_TKIP || skb->len < 24 ||
- !ieee80211_is_data_present(hdr->frame_control))
+ if (!tx->key || tx->key->conf.cipher != WLAN_CIPHER_SUITE_TKIP ||
+ skb->len < 24 || !ieee80211_is_data_present(hdr->frame_control))
return TX_CONTINUE;
hdrlen = ieee80211_hdrlen(hdr->frame_control);
@@ -94,7 +94,7 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
if (status->flag & RX_FLAG_MMIC_STRIPPED)
return RX_CONTINUE;
- if (!rx->key || rx->key->conf.alg != ALG_TKIP ||
+ if (!rx->key || rx->key->conf.cipher != WLAN_CIPHER_SUITE_TKIP ||
!ieee80211_has_protected(hdr->frame_control) ||
!ieee80211_is_data_present(hdr->frame_control))
return RX_CONTINUE;
@@ -221,19 +221,13 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
if (!rx->sta || skb->len - hdrlen < 12)
return RX_DROP_UNUSABLE;
- if (status->flag & RX_FLAG_DECRYPTED) {
- if (status->flag & RX_FLAG_IV_STRIPPED) {
- /*
- * Hardware took care of all processing, including
- * replay protection, and stripped the ICV/IV so
- * we cannot do any checks here.
- */
- return RX_CONTINUE;
- }
-
- /* let TKIP code verify IV, but skip decryption */
+ /*
+ * Let TKIP code verify IV, but skip decryption.
+ * In the case where hardware checks the IV as well,
+ * we don't even get here, see ieee80211_rx_h_decrypt()
+ */
+ if (status->flag & RX_FLAG_DECRYPTED)
hwaccel = 1;
- }
res = ieee80211_tkip_decrypt_data(rx->local->wep_rx_tfm,
key, skb->data + hdrlen,
@@ -447,10 +441,6 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx)
if (!rx->sta || data_len < 0)
return RX_DROP_UNUSABLE;
- if ((status->flag & RX_FLAG_DECRYPTED) &&
- (status->flag & RX_FLAG_IV_STRIPPED))
- return RX_CONTINUE;
-
ccmp_hdr2pn(pn, skb->data + hdrlen);
queue = ieee80211_is_mgmt(hdr->frame_control) ?
@@ -564,10 +554,6 @@ ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx)
if (!ieee80211_is_mgmt(hdr->frame_control))
return RX_CONTINUE;
- if ((status->flag & RX_FLAG_DECRYPTED) &&
- (status->flag & RX_FLAG_IV_STRIPPED))
- return RX_CONTINUE;
-
if (skb->len < 24 + sizeof(*mmie))
return RX_DROP_UNUSABLE;
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 2cbf380377d5..8648a9922aab 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -1406,7 +1406,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
struct netlink_sock *nlk = nlk_sk(sk);
int noblock = flags&MSG_DONTWAIT;
size_t copied;
- struct sk_buff *skb;
+ struct sk_buff *skb, *frag __maybe_unused = NULL;
int err;
if (flags&MSG_OOB)
@@ -1441,21 +1441,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
kfree_skb(skb);
skb = compskb;
} else {
- /*
- * Before setting frag_list to NULL, we must get a
- * private copy of skb if shared (because of MSG_PEEK)
- */
- if (skb_shared(skb)) {
- struct sk_buff *nskb;
-
- nskb = pskb_copy(skb, GFP_KERNEL);
- kfree_skb(skb);
- skb = nskb;
- err = -ENOMEM;
- if (!skb)
- goto out;
- }
- kfree_skb(skb_shinfo(skb)->frag_list);
+ frag = skb_shinfo(skb)->frag_list;
skb_shinfo(skb)->frag_list = NULL;
}
}
@@ -1492,6 +1478,10 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
if (flags & MSG_TRUNC)
copied = skb->len;
+#ifdef CONFIG_COMPAT_NETLINK_MESSAGES
+ skb_shinfo(skb)->frag_list = frag;
+#endif
+
skb_free_datagram(sk, skb);
if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2)
diff --git a/net/sched/act_gact.c b/net/sched/act_gact.c
index 8406c6654990..c2ed90a4c0b4 100644
--- a/net/sched/act_gact.c
+++ b/net/sched/act_gact.c
@@ -152,21 +152,24 @@ static int tcf_gact(struct sk_buff *skb, struct tc_action *a, struct tcf_result
static int tcf_gact_dump(struct sk_buff *skb, struct tc_action *a, int bind, int ref)
{
unsigned char *b = skb_tail_pointer(skb);
- struct tc_gact opt;
struct tcf_gact *gact = a->priv;
+ struct tc_gact opt = {
+ .index = gact->tcf_index,
+ .refcnt = gact->tcf_refcnt - ref,
+ .bindcnt = gact->tcf_bindcnt - bind,
+ .action = gact->tcf_action,
+ };
struct tcf_t t;
- opt.index = gact->tcf_index;
- opt.refcnt = gact->tcf_refcnt - ref;
- opt.bindcnt = gact->tcf_bindcnt - bind;
- opt.action = gact->tcf_action;
NLA_PUT(skb, TCA_GACT_PARMS, sizeof(opt), &opt);
#ifdef CONFIG_GACT_PROB
if (gact->tcfg_ptype) {
- struct tc_gact_p p_opt;
- p_opt.paction = gact->tcfg_paction;
- p_opt.pval = gact->tcfg_pval;
- p_opt.ptype = gact->tcfg_ptype;
+ struct tc_gact_p p_opt = {
+ .paction = gact->tcfg_paction,
+ .pval = gact->tcfg_pval,
+ .ptype = gact->tcfg_ptype,
+ };
+
NLA_PUT(skb, TCA_GACT_PROB, sizeof(p_opt), &p_opt);
}
#endif
diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c
index 11f195af2da0..0c311be92827 100644
--- a/net/sched/act_mirred.c
+++ b/net/sched/act_mirred.c
@@ -219,15 +219,16 @@ static int tcf_mirred_dump(struct sk_buff *skb, struct tc_action *a, int bind, i
{
unsigned char *b = skb_tail_pointer(skb);
struct tcf_mirred *m = a->priv;
- struct tc_mirred opt;
+ struct tc_mirred opt = {
+ .index = m->tcf_index,
+ .action = m->tcf_action,
+ .refcnt = m->tcf_refcnt - ref,
+ .bindcnt = m->tcf_bindcnt - bind,
+ .eaction = m->tcfm_eaction,
+ .ifindex = m->tcfm_ifindex,
+ };
struct tcf_t t;
- opt.index = m->tcf_index;
- opt.action = m->tcf_action;
- opt.refcnt = m->tcf_refcnt - ref;
- opt.bindcnt = m->tcf_bindcnt - bind;
- opt.eaction = m->tcfm_eaction;
- opt.ifindex = m->tcfm_ifindex;
NLA_PUT(skb, TCA_MIRRED_PARMS, sizeof(opt), &opt);
t.install = jiffies_to_clock_t(jiffies - m->tcf_tm.install);
t.lastuse = jiffies_to_clock_t(jiffies - m->tcf_tm.lastuse);
diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c
index 509a2d53a99d..186eb837e600 100644
--- a/net/sched/act_nat.c
+++ b/net/sched/act_nat.c
@@ -272,19 +272,19 @@ static int tcf_nat_dump(struct sk_buff *skb, struct tc_action *a,
{
unsigned char *b = skb_tail_pointer(skb);
struct tcf_nat *p = a->priv;
- struct tc_nat opt;
+ struct tc_nat opt = {
+ .old_addr = p->old_addr,
+ .new_addr = p->new_addr,
+ .mask = p->mask,
+ .flags = p->flags,
+
+ .index = p->tcf_index,
+ .action = p->tcf_action,
+ .refcnt = p->tcf_refcnt - ref,
+ .bindcnt = p->tcf_bindcnt - bind,
+ };
struct tcf_t t;
- opt.old_addr = p->old_addr;
- opt.new_addr = p->new_addr;
- opt.mask = p->mask;
- opt.flags = p->flags;
-
- opt.index = p->tcf_index;
- opt.action = p->tcf_action;
- opt.refcnt = p->tcf_refcnt - ref;
- opt.bindcnt = p->tcf_bindcnt - bind;
-
NLA_PUT(skb, TCA_NAT_PARMS, sizeof(opt), &opt);
t.install = jiffies_to_clock_t(jiffies - p->tcf_tm.install);
t.lastuse = jiffies_to_clock_t(jiffies - p->tcf_tm.lastuse);
diff --git a/net/sched/act_simple.c b/net/sched/act_simple.c
index 4a1d640b0cf1..97e84f3ee775 100644
--- a/net/sched/act_simple.c
+++ b/net/sched/act_simple.c
@@ -164,13 +164,14 @@ static inline int tcf_simp_dump(struct sk_buff *skb, struct tc_action *a,
{
unsigned char *b = skb_tail_pointer(skb);
struct tcf_defact *d = a->priv;
- struct tc_defact opt;
+ struct tc_defact opt = {
+ .index = d->tcf_index,
+ .refcnt = d->tcf_refcnt - ref,
+ .bindcnt = d->tcf_bindcnt - bind,
+ .action = d->tcf_action,
+ };
struct tcf_t t;
- opt.index = d->tcf_index;
- opt.refcnt = d->tcf_refcnt - ref;
- opt.bindcnt = d->tcf_bindcnt - bind;
- opt.action = d->tcf_action;
NLA_PUT(skb, TCA_DEF_PARMS, sizeof(opt), &opt);
NLA_PUT_STRING(skb, TCA_DEF_DATA, d->tcfd_defdata);
t.install = jiffies_to_clock_t(jiffies - d->tcf_tm.install);
diff --git a/net/sched/act_skbedit.c b/net/sched/act_skbedit.c
index e9607fe55b58..66cbf4eb8855 100644
--- a/net/sched/act_skbedit.c
+++ b/net/sched/act_skbedit.c
@@ -159,13 +159,14 @@ static inline int tcf_skbedit_dump(struct sk_buff *skb, struct tc_action *a,
{
unsigned char *b = skb_tail_pointer(skb);
struct tcf_skbedit *d = a->priv;
- struct tc_skbedit opt;
+ struct tc_skbedit opt = {
+ .index = d->tcf_index,
+ .refcnt = d->tcf_refcnt - ref,
+ .bindcnt = d->tcf_bindcnt - bind,
+ .action = d->tcf_action,
+ };
struct tcf_t t;
- opt.index = d->tcf_index;
- opt.refcnt = d->tcf_refcnt - ref;
- opt.bindcnt = d->tcf_bindcnt - bind;
- opt.action = d->tcf_action;
NLA_PUT(skb, TCA_SKBEDIT_PARMS, sizeof(opt), &opt);
if (d->flags & SKBEDIT_F_PRIORITY)
NLA_PUT(skb, TCA_SKBEDIT_PRIORITY, sizeof(d->priority),
diff --git a/net/sunrpc/Kconfig b/net/sunrpc/Kconfig
index 443c161eb8bd..3376d7657185 100644
--- a/net/sunrpc/Kconfig
+++ b/net/sunrpc/Kconfig
@@ -18,10 +18,11 @@ config SUNRPC_XPRT_RDMA
If unsure, say N.
config RPCSEC_GSS_KRB5
- tristate "Secure RPC: Kerberos V mechanism (EXPERIMENTAL)"
- depends on SUNRPC && EXPERIMENTAL
+ tristate
+ depends on SUNRPC && CRYPTO
+ prompt "Secure RPC: Kerberos V mechanism" if !(NFS_V4 || NFSD_V4)
+ default y
select SUNRPC_GSS
- select CRYPTO
select CRYPTO_MD5
select CRYPTO_DES
select CRYPTO_CBC
@@ -34,7 +35,7 @@ config RPCSEC_GSS_KRB5
available from http://linux-nfs.org/. In addition, user-space
Kerberos support should be installed.
- If unsure, say N.
+ If unsure, say Y.
config RPCSEC_GSS_SPKM3
tristate "Secure RPC: SPKM3 mechanism (EXPERIMENTAL)"
diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c
index e5e28d1946a4..2ac3f6e8adff 100644
--- a/net/sunrpc/xprtrdma/rpc_rdma.c
+++ b/net/sunrpc/xprtrdma/rpc_rdma.c
@@ -249,6 +249,8 @@ rpcrdma_create_chunks(struct rpc_rqst *rqst, struct xdr_buf *target,
req->rl_nchunks = nchunks;
BUG_ON(nchunks == 0);
+ BUG_ON((r_xprt->rx_ia.ri_memreg_strategy == RPCRDMA_FRMR)
+ && (nchunks > 3));
/*
* finish off header. If write, marshal discrim and nchunks.
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
index 27015c6d8eb5..5f4c7b3bc711 100644
--- a/net/sunrpc/xprtrdma/verbs.c
+++ b/net/sunrpc/xprtrdma/verbs.c
@@ -650,10 +650,22 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia,
ep->rep_attr.cap.max_send_wr = cdata->max_requests;
switch (ia->ri_memreg_strategy) {
case RPCRDMA_FRMR:
- /* Add room for frmr register and invalidate WRs */
- ep->rep_attr.cap.max_send_wr *= 3;
- if (ep->rep_attr.cap.max_send_wr > devattr.max_qp_wr)
- return -EINVAL;
+ /* Add room for frmr register and invalidate WRs.
+ * 1. FRMR reg WR for head
+ * 2. FRMR invalidate WR for head
+ * 3. FRMR reg WR for pagelist
+ * 4. FRMR invalidate WR for pagelist
+ * 5. FRMR reg WR for tail
+ * 6. FRMR invalidate WR for tail
+ * 7. The RDMA_SEND WR
+ */
+ ep->rep_attr.cap.max_send_wr *= 7;
+ if (ep->rep_attr.cap.max_send_wr > devattr.max_qp_wr) {
+ cdata->max_requests = devattr.max_qp_wr / 7;
+ if (!cdata->max_requests)
+ return -EINVAL;
+ ep->rep_attr.cap.max_send_wr = cdata->max_requests * 7;
+ }
break;
case RPCRDMA_MEMWINDOWS_ASYNC:
case RPCRDMA_MEMWINDOWS:
@@ -1490,7 +1502,7 @@ rpcrdma_register_frmr_external(struct rpcrdma_mr_seg *seg,
memset(&frmr_wr, 0, sizeof frmr_wr);
frmr_wr.opcode = IB_WR_FAST_REG_MR;
frmr_wr.send_flags = 0; /* unsignaled */
- frmr_wr.wr.fast_reg.iova_start = (unsigned long)seg1->mr_dma;
+ frmr_wr.wr.fast_reg.iova_start = seg1->mr_dma;
frmr_wr.wr.fast_reg.page_list = seg1->mr_chunk.rl_mw->r.frmr.fr_pgl;
frmr_wr.wr.fast_reg.page_list_len = i;
frmr_wr.wr.fast_reg.page_shift = PAGE_SHIFT;
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 49a62f0c4b87..b6309db56226 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -1305,10 +1305,11 @@ static void xs_tcp_state_change(struct sock *sk)
if (!(xprt = xprt_from_sock(sk)))
goto out;
dprintk("RPC: xs_tcp_state_change client %p...\n", xprt);
- dprintk("RPC: state %x conn %d dead %d zapped %d\n",
+ dprintk("RPC: state %x conn %d dead %d zapped %d sk_shutdown %d\n",
sk->sk_state, xprt_connected(xprt),
sock_flag(sk, SOCK_DEAD),
- sock_flag(sk, SOCK_ZAPPED));
+ sock_flag(sk, SOCK_ZAPPED),
+ sk->sk_shutdown);
switch (sk->sk_state) {
case TCP_ESTABLISHED:
@@ -1779,10 +1780,25 @@ static void xs_tcp_reuse_connection(struct rpc_xprt *xprt, struct sock_xprt *tra
{
unsigned int state = transport->inet->sk_state;
- if (state == TCP_CLOSE && transport->sock->state == SS_UNCONNECTED)
- return;
- if ((1 << state) & (TCPF_ESTABLISHED|TCPF_SYN_SENT))
- return;
+ if (state == TCP_CLOSE && transport->sock->state == SS_UNCONNECTED) {
+ /* we don't need to abort the connection if the socket
+ * hasn't undergone a shutdown
+ */
+ if (transport->inet->sk_shutdown == 0)
+ return;
+ dprintk("RPC: %s: TCP_CLOSEd and sk_shutdown set to %d\n",
+ __func__, transport->inet->sk_shutdown);
+ }
+ if ((1 << state) & (TCPF_ESTABLISHED|TCPF_SYN_SENT)) {
+ /* we don't need to abort the connection if the socket
+ * hasn't undergone a shutdown
+ */
+ if (transport->inet->sk_shutdown == 0)
+ return;
+ dprintk("RPC: %s: ESTABLISHED/SYN_SENT "
+ "sk_shutdown set to %d\n",
+ __func__, transport->inet->sk_shutdown);
+ }
xs_abort_connection(xprt, transport);
}
diff --git a/net/wanrouter/wanmain.c b/net/wanrouter/wanmain.c
index 2bf23406637a..74944a2dd436 100644
--- a/net/wanrouter/wanmain.c
+++ b/net/wanrouter/wanmain.c
@@ -471,7 +471,7 @@ static int wanrouter_device_setup(struct wan_device *wandev,
data = vmalloc(conf->data_size);
if (!data) {
printk(KERN_INFO
- "%s: ERROR, Faild allocate kernel memory !\n",
+ "%s: ERROR, Failed allocate kernel memory !\n",
wandev->name);
kfree(conf);
return -ENOBUFS;
@@ -481,7 +481,7 @@ static int wanrouter_device_setup(struct wan_device *wandev,
err = wandev->setup(wandev, conf);
} else {
printk(KERN_INFO
- "%s: ERROR, Faild to copy from user data !\n",
+ "%s: ERROR, Failed to copy from user data !\n",
wandev->name);
err = -EFAULT;
}
diff --git a/net/wireless/core.c b/net/wireless/core.c
index 541e2fff5e9c..d52630bbab04 100644
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -253,11 +253,16 @@ int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
WARN_ON(err);
wdev->netdev->features |= NETIF_F_NETNS_LOCAL;
}
+
+ return err;
}
wiphy_net_set(&rdev->wiphy, net);
- return err;
+ err = device_rename(&rdev->wiphy.dev, dev_name(&rdev->wiphy.dev));
+ WARN_ON(err);
+
+ return 0;
}
static void cfg80211_rfkill_poll(struct rfkill *rfkill, void *data)
@@ -428,7 +433,7 @@ int wiphy_register(struct wiphy *wiphy)
/* sanity check ifmodes */
WARN_ON(!ifmodes);
- ifmodes &= ((1 << __NL80211_IFTYPE_AFTER_LAST) - 1) & ~1;
+ ifmodes &= ((1 << NUM_NL80211_IFTYPES) - 1) & ~1;
if (WARN_ON(ifmodes != wiphy->interface_modes))
wiphy->interface_modes = ifmodes;
@@ -680,8 +685,8 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
INIT_WORK(&wdev->cleanup_work, wdev_cleanup_work);
INIT_LIST_HEAD(&wdev->event_list);
spin_lock_init(&wdev->event_lock);
- INIT_LIST_HEAD(&wdev->action_registrations);
- spin_lock_init(&wdev->action_registrations_lock);
+ INIT_LIST_HEAD(&wdev->mgmt_registrations);
+ spin_lock_init(&wdev->mgmt_registrations_lock);
mutex_lock(&rdev->devlist_mtx);
list_add_rcu(&wdev->list, &rdev->netdev_list);
@@ -801,7 +806,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
sysfs_remove_link(&dev->dev.kobj, "phy80211");
list_del_rcu(&wdev->list);
rdev->devlist_generation++;
- cfg80211_mlme_purge_actions(wdev);
+ cfg80211_mlme_purge_registrations(wdev);
#ifdef CONFIG_CFG80211_WEXT
kfree(wdev->wext.keys);
#endif
diff --git a/net/wireless/core.h b/net/wireless/core.h
index 63d57ae399c3..58ab2c791d28 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -331,16 +331,17 @@ void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
const u8 *resp_ie, size_t resp_ie_len,
u16 status, bool wextev,
struct cfg80211_bss *bss);
-int cfg80211_mlme_register_action(struct wireless_dev *wdev, u32 snd_pid,
- const u8 *match_data, int match_len);
-void cfg80211_mlme_unregister_actions(struct wireless_dev *wdev, u32 nlpid);
-void cfg80211_mlme_purge_actions(struct wireless_dev *wdev);
-int cfg80211_mlme_action(struct cfg80211_registered_device *rdev,
- struct net_device *dev,
- struct ieee80211_channel *chan,
- enum nl80211_channel_type channel_type,
- bool channel_type_valid,
- const u8 *buf, size_t len, u64 *cookie);
+int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_pid,
+ u16 frame_type, const u8 *match_data,
+ int match_len);
+void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlpid);
+void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev);
+int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
+ struct net_device *dev,
+ struct ieee80211_channel *chan,
+ enum nl80211_channel_type channel_type,
+ bool channel_type_valid,
+ const u8 *buf, size_t len, u64 *cookie);
/* SME */
int __cfg80211_connect(struct cfg80211_registered_device *rdev,
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index d1a3fb99fdf2..8515b1e5c578 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -149,7 +149,7 @@ void __cfg80211_send_deauth(struct net_device *dev,
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
const u8 *bssid = mgmt->bssid;
int i;
- bool found = false;
+ bool found = false, was_current = false;
ASSERT_WDEV_LOCK(wdev);
@@ -159,6 +159,7 @@ void __cfg80211_send_deauth(struct net_device *dev,
cfg80211_put_bss(&wdev->current_bss->pub);
wdev->current_bss = NULL;
found = true;
+ was_current = true;
} else for (i = 0; i < MAX_AUTH_BSSES; i++) {
if (wdev->auth_bsses[i] &&
memcmp(wdev->auth_bsses[i]->pub.bssid, bssid, ETH_ALEN) == 0) {
@@ -183,7 +184,7 @@ void __cfg80211_send_deauth(struct net_device *dev,
nl80211_send_deauth(rdev, dev, buf, len, GFP_KERNEL);
- if (wdev->sme_state == CFG80211_SME_CONNECTED) {
+ if (wdev->sme_state == CFG80211_SME_CONNECTED && was_current) {
u16 reason_code;
bool from_ap;
@@ -747,31 +748,51 @@ void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
}
EXPORT_SYMBOL(cfg80211_new_sta);
-struct cfg80211_action_registration {
+struct cfg80211_mgmt_registration {
struct list_head list;
u32 nlpid;
int match_len;
+ __le16 frame_type;
+
u8 match[];
};
-int cfg80211_mlme_register_action(struct wireless_dev *wdev, u32 snd_pid,
- const u8 *match_data, int match_len)
+int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_pid,
+ u16 frame_type, const u8 *match_data,
+ int match_len)
{
- struct cfg80211_action_registration *reg, *nreg;
+ struct cfg80211_mgmt_registration *reg, *nreg;
int err = 0;
+ u16 mgmt_type;
+
+ if (!wdev->wiphy->mgmt_stypes)
+ return -EOPNOTSUPP;
+
+ if ((frame_type & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT)
+ return -EINVAL;
+
+ if (frame_type & ~(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE))
+ return -EINVAL;
+
+ mgmt_type = (frame_type & IEEE80211_FCTL_STYPE) >> 4;
+ if (!(wdev->wiphy->mgmt_stypes[wdev->iftype].rx & BIT(mgmt_type)))
+ return -EINVAL;
nreg = kzalloc(sizeof(*reg) + match_len, GFP_KERNEL);
if (!nreg)
return -ENOMEM;
- spin_lock_bh(&wdev->action_registrations_lock);
+ spin_lock_bh(&wdev->mgmt_registrations_lock);
- list_for_each_entry(reg, &wdev->action_registrations, list) {
+ list_for_each_entry(reg, &wdev->mgmt_registrations, list) {
int mlen = min(match_len, reg->match_len);
+ if (frame_type != le16_to_cpu(reg->frame_type))
+ continue;
+
if (memcmp(reg->match, match_data, mlen) == 0) {
err = -EALREADY;
break;
@@ -786,62 +807,75 @@ int cfg80211_mlme_register_action(struct wireless_dev *wdev, u32 snd_pid,
memcpy(nreg->match, match_data, match_len);
nreg->match_len = match_len;
nreg->nlpid = snd_pid;
- list_add(&nreg->list, &wdev->action_registrations);
+ nreg->frame_type = cpu_to_le16(frame_type);
+ list_add(&nreg->list, &wdev->mgmt_registrations);
out:
- spin_unlock_bh(&wdev->action_registrations_lock);
+ spin_unlock_bh(&wdev->mgmt_registrations_lock);
return err;
}
-void cfg80211_mlme_unregister_actions(struct wireless_dev *wdev, u32 nlpid)
+void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlpid)
{
- struct cfg80211_action_registration *reg, *tmp;
+ struct cfg80211_mgmt_registration *reg, *tmp;
- spin_lock_bh(&wdev->action_registrations_lock);
+ spin_lock_bh(&wdev->mgmt_registrations_lock);
- list_for_each_entry_safe(reg, tmp, &wdev->action_registrations, list) {
+ list_for_each_entry_safe(reg, tmp, &wdev->mgmt_registrations, list) {
if (reg->nlpid == nlpid) {
list_del(&reg->list);
kfree(reg);
}
}
- spin_unlock_bh(&wdev->action_registrations_lock);
+ spin_unlock_bh(&wdev->mgmt_registrations_lock);
}
-void cfg80211_mlme_purge_actions(struct wireless_dev *wdev)
+void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev)
{
- struct cfg80211_action_registration *reg, *tmp;
+ struct cfg80211_mgmt_registration *reg, *tmp;
- spin_lock_bh(&wdev->action_registrations_lock);
+ spin_lock_bh(&wdev->mgmt_registrations_lock);
- list_for_each_entry_safe(reg, tmp, &wdev->action_registrations, list) {
+ list_for_each_entry_safe(reg, tmp, &wdev->mgmt_registrations, list) {
list_del(&reg->list);
kfree(reg);
}
- spin_unlock_bh(&wdev->action_registrations_lock);
+ spin_unlock_bh(&wdev->mgmt_registrations_lock);
}
-int cfg80211_mlme_action(struct cfg80211_registered_device *rdev,
- struct net_device *dev,
- struct ieee80211_channel *chan,
- enum nl80211_channel_type channel_type,
- bool channel_type_valid,
- const u8 *buf, size_t len, u64 *cookie)
+int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
+ struct net_device *dev,
+ struct ieee80211_channel *chan,
+ enum nl80211_channel_type channel_type,
+ bool channel_type_valid,
+ const u8 *buf, size_t len, u64 *cookie)
{
struct wireless_dev *wdev = dev->ieee80211_ptr;
const struct ieee80211_mgmt *mgmt;
+ u16 stype;
+
+ if (!wdev->wiphy->mgmt_stypes)
+ return -EOPNOTSUPP;
- if (rdev->ops->action == NULL)
+ if (!rdev->ops->mgmt_tx)
return -EOPNOTSUPP;
+
if (len < 24 + 1)
return -EINVAL;
mgmt = (const struct ieee80211_mgmt *) buf;
- if (!ieee80211_is_action(mgmt->frame_control))
+
+ if (!ieee80211_is_mgmt(mgmt->frame_control))
return -EINVAL;
- if (mgmt->u.action.category != WLAN_CATEGORY_PUBLIC) {
+
+ stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE;
+ if (!(wdev->wiphy->mgmt_stypes[wdev->iftype].tx & BIT(stype >> 4)))
+ return -EINVAL;
+
+ if (ieee80211_is_action(mgmt->frame_control) &&
+ mgmt->u.action.category != WLAN_CATEGORY_PUBLIC) {
/* Verify that we are associated with the destination AP */
wdev_lock(wdev);
@@ -862,64 +896,75 @@ int cfg80211_mlme_action(struct cfg80211_registered_device *rdev,
return -EINVAL;
/* Transmit the Action frame as requested by user space */
- return rdev->ops->action(&rdev->wiphy, dev, chan, channel_type,
- channel_type_valid, buf, len, cookie);
+ return rdev->ops->mgmt_tx(&rdev->wiphy, dev, chan, channel_type,
+ channel_type_valid, buf, len, cookie);
}
-bool cfg80211_rx_action(struct net_device *dev, int freq, const u8 *buf,
- size_t len, gfp_t gfp)
+bool cfg80211_rx_mgmt(struct net_device *dev, int freq, const u8 *buf,
+ size_t len, gfp_t gfp)
{
struct wireless_dev *wdev = dev->ieee80211_ptr;
struct wiphy *wiphy = wdev->wiphy;
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
- struct cfg80211_action_registration *reg;
- const u8 *action_data;
- int action_data_len;
+ struct cfg80211_mgmt_registration *reg;
+ const struct ieee80211_txrx_stypes *stypes =
+ &wiphy->mgmt_stypes[wdev->iftype];
+ struct ieee80211_mgmt *mgmt = (void *)buf;
+ const u8 *data;
+ int data_len;
bool result = false;
+ __le16 ftype = mgmt->frame_control &
+ cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE);
+ u16 stype;
- /* frame length - min size excluding category */
- action_data_len = len - (IEEE80211_MIN_ACTION_SIZE - 1);
+ stype = (le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE) >> 4;
- /* action data starts with category */
- action_data = buf + IEEE80211_MIN_ACTION_SIZE - 1;
+ if (!(stypes->rx & BIT(stype)))
+ return false;
- spin_lock_bh(&wdev->action_registrations_lock);
+ data = buf + ieee80211_hdrlen(mgmt->frame_control);
+ data_len = len - ieee80211_hdrlen(mgmt->frame_control);
+
+ spin_lock_bh(&wdev->mgmt_registrations_lock);
+
+ list_for_each_entry(reg, &wdev->mgmt_registrations, list) {
+ if (reg->frame_type != ftype)
+ continue;
- list_for_each_entry(reg, &wdev->action_registrations, list) {
- if (reg->match_len > action_data_len)
+ if (reg->match_len > data_len)
continue;
- if (memcmp(reg->match, action_data, reg->match_len))
+ if (memcmp(reg->match, data, reg->match_len))
continue;
/* found match! */
/* Indicate the received Action frame to user space */
- if (nl80211_send_action(rdev, dev, reg->nlpid, freq,
- buf, len, gfp))
+ if (nl80211_send_mgmt(rdev, dev, reg->nlpid, freq,
+ buf, len, gfp))
continue;
result = true;
break;
}
- spin_unlock_bh(&wdev->action_registrations_lock);
+ spin_unlock_bh(&wdev->mgmt_registrations_lock);
return result;
}
-EXPORT_SYMBOL(cfg80211_rx_action);
+EXPORT_SYMBOL(cfg80211_rx_mgmt);
-void cfg80211_action_tx_status(struct net_device *dev, u64 cookie,
- const u8 *buf, size_t len, bool ack, gfp_t gfp)
+void cfg80211_mgmt_tx_status(struct net_device *dev, u64 cookie,
+ const u8 *buf, size_t len, bool ack, gfp_t gfp)
{
struct wireless_dev *wdev = dev->ieee80211_ptr;
struct wiphy *wiphy = wdev->wiphy;
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
/* Indicate TX status of the Action frame to user space */
- nl80211_send_action_tx_status(rdev, dev, cookie, buf, len, ack, gfp);
+ nl80211_send_mgmt_tx_status(rdev, dev, cookie, buf, len, ack, gfp);
}
-EXPORT_SYMBOL(cfg80211_action_tx_status);
+EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
void cfg80211_cqm_rssi_notify(struct net_device *dev,
enum nl80211_cqm_rssi_threshold_event rssi_event,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 37902a54e9c1..927ffbd2aebc 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -156,6 +156,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
[NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
+ [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
};
/* policy for the attributes */
@@ -437,6 +438,8 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
struct ieee80211_rate *rate;
int i;
u16 ifmodes = dev->wiphy.interface_modes;
+ const struct ieee80211_txrx_stypes *mgmt_stypes =
+ dev->wiphy.mgmt_stypes;
hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_WIPHY);
if (!hdr)
@@ -587,7 +590,7 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
CMD(flush_pmksa, FLUSH_PMKSA);
CMD(remain_on_channel, REMAIN_ON_CHANNEL);
CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
- CMD(action, ACTION);
+ CMD(mgmt_tx, FRAME);
if (dev->wiphy.flags & WIPHY_FLAG_NETNS_OK) {
i++;
NLA_PUT_U32(msg, i, NL80211_CMD_SET_WIPHY_NETNS);
@@ -608,6 +611,53 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
nla_nest_end(msg, nl_cmds);
+ if (mgmt_stypes) {
+ u16 stypes;
+ struct nlattr *nl_ftypes, *nl_ifs;
+ enum nl80211_iftype ift;
+
+ nl_ifs = nla_nest_start(msg, NL80211_ATTR_TX_FRAME_TYPES);
+ if (!nl_ifs)
+ goto nla_put_failure;
+
+ for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
+ nl_ftypes = nla_nest_start(msg, ift);
+ if (!nl_ftypes)
+ goto nla_put_failure;
+ i = 0;
+ stypes = mgmt_stypes[ift].tx;
+ while (stypes) {
+ if (stypes & 1)
+ NLA_PUT_U16(msg, NL80211_ATTR_FRAME_TYPE,
+ (i << 4) | IEEE80211_FTYPE_MGMT);
+ stypes >>= 1;
+ i++;
+ }
+ nla_nest_end(msg, nl_ftypes);
+ }
+
+ nl_ifs = nla_nest_start(msg, NL80211_ATTR_RX_FRAME_TYPES);
+ if (!nl_ifs)
+ goto nla_put_failure;
+
+ for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
+ nl_ftypes = nla_nest_start(msg, ift);
+ if (!nl_ftypes)
+ goto nla_put_failure;
+ i = 0;
+ stypes = mgmt_stypes[ift].rx;
+ while (stypes) {
+ if (stypes & 1)
+ NLA_PUT_U16(msg, NL80211_ATTR_FRAME_TYPE,
+ (i << 4) | IEEE80211_FTYPE_MGMT);
+ stypes >>= 1;
+ i++;
+ }
+ nla_nest_end(msg, nl_ftypes);
+ }
+ nla_nest_end(msg, nl_ifs);
+ }
+
return genlmsg_end(msg, hdr);
nla_put_failure:
@@ -3572,6 +3622,21 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
if (err)
goto unlock_rtnl;
+ if (key.idx >= 0) {
+ int i;
+ bool ok = false;
+ for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) {
+ if (key.p.cipher == rdev->wiphy.cipher_suites[i]) {
+ ok = true;
+ break;
+ }
+ }
+ if (!ok) {
+ err = -EINVAL;
+ goto out;
+ }
+ }
+
if (!rdev->ops->auth) {
err = -EOPNOTSUPP;
goto out;
@@ -4717,17 +4782,18 @@ static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
return err;
}
-static int nl80211_register_action(struct sk_buff *skb, struct genl_info *info)
+static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
{
struct cfg80211_registered_device *rdev;
struct net_device *dev;
+ u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
int err;
if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
return -EINVAL;
- if (nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]) < 1)
- return -EINVAL;
+ if (info->attrs[NL80211_ATTR_FRAME_TYPE])
+ frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
rtnl_lock();
@@ -4742,12 +4808,13 @@ static int nl80211_register_action(struct sk_buff *skb, struct genl_info *info)
}
/* not much point in registering if we can't reply */
- if (!rdev->ops->action) {
+ if (!rdev->ops->mgmt_tx) {
err = -EOPNOTSUPP;
goto out;
}
- err = cfg80211_mlme_register_action(dev->ieee80211_ptr, info->snd_pid,
+ err = cfg80211_mlme_register_mgmt(dev->ieee80211_ptr, info->snd_pid,
+ frame_type,
nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]));
out:
@@ -4758,7 +4825,7 @@ static int nl80211_register_action(struct sk_buff *skb, struct genl_info *info)
return err;
}
-static int nl80211_action(struct sk_buff *skb, struct genl_info *info)
+static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
{
struct cfg80211_registered_device *rdev;
struct net_device *dev;
@@ -4781,7 +4848,7 @@ static int nl80211_action(struct sk_buff *skb, struct genl_info *info)
if (err)
goto unlock_rtnl;
- if (!rdev->ops->action) {
+ if (!rdev->ops->mgmt_tx) {
err = -EOPNOTSUPP;
goto out;
}
@@ -4824,17 +4891,17 @@ static int nl80211_action(struct sk_buff *skb, struct genl_info *info)
}
hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
- NL80211_CMD_ACTION);
+ NL80211_CMD_FRAME);
if (IS_ERR(hdr)) {
err = PTR_ERR(hdr);
goto free_msg;
}
- err = cfg80211_mlme_action(rdev, dev, chan, channel_type,
- channel_type_valid,
- nla_data(info->attrs[NL80211_ATTR_FRAME]),
- nla_len(info->attrs[NL80211_ATTR_FRAME]),
- &cookie);
+ err = cfg80211_mlme_mgmt_tx(rdev, dev, chan, channel_type,
+ channel_type_valid,
+ nla_data(info->attrs[NL80211_ATTR_FRAME]),
+ nla_len(info->attrs[NL80211_ATTR_FRAME]),
+ &cookie);
if (err)
goto free_msg;
@@ -5333,14 +5400,14 @@ static struct genl_ops nl80211_ops[] = {
.flags = GENL_ADMIN_PERM,
},
{
- .cmd = NL80211_CMD_REGISTER_ACTION,
- .doit = nl80211_register_action,
+ .cmd = NL80211_CMD_REGISTER_FRAME,
+ .doit = nl80211_register_mgmt,
.policy = nl80211_policy,
.flags = GENL_ADMIN_PERM,
},
{
- .cmd = NL80211_CMD_ACTION,
- .doit = nl80211_action,
+ .cmd = NL80211_CMD_FRAME,
+ .doit = nl80211_tx_mgmt,
.policy = nl80211_policy,
.flags = GENL_ADMIN_PERM,
},
@@ -6040,9 +6107,9 @@ void nl80211_send_sta_event(struct cfg80211_registered_device *rdev,
nl80211_mlme_mcgrp.id, gfp);
}
-int nl80211_send_action(struct cfg80211_registered_device *rdev,
- struct net_device *netdev, u32 nlpid,
- int freq, const u8 *buf, size_t len, gfp_t gfp)
+int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
+ struct net_device *netdev, u32 nlpid,
+ int freq, const u8 *buf, size_t len, gfp_t gfp)
{
struct sk_buff *msg;
void *hdr;
@@ -6052,7 +6119,7 @@ int nl80211_send_action(struct cfg80211_registered_device *rdev,
if (!msg)
return -ENOMEM;
- hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ACTION);
+ hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
if (!hdr) {
nlmsg_free(msg);
return -ENOMEM;
@@ -6080,10 +6147,10 @@ int nl80211_send_action(struct cfg80211_registered_device *rdev,
return -ENOBUFS;
}
-void nl80211_send_action_tx_status(struct cfg80211_registered_device *rdev,
- struct net_device *netdev, u64 cookie,
- const u8 *buf, size_t len, bool ack,
- gfp_t gfp)
+void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev,
+ struct net_device *netdev, u64 cookie,
+ const u8 *buf, size_t len, bool ack,
+ gfp_t gfp)
{
struct sk_buff *msg;
void *hdr;
@@ -6092,7 +6159,7 @@ void nl80211_send_action_tx_status(struct cfg80211_registered_device *rdev,
if (!msg)
return;
- hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ACTION_TX_STATUS);
+ hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS);
if (!hdr) {
nlmsg_free(msg);
return;
@@ -6179,7 +6246,7 @@ static int nl80211_netlink_notify(struct notifier_block * nb,
list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list)
list_for_each_entry_rcu(wdev, &rdev->netdev_list, list)
- cfg80211_mlme_unregister_actions(wdev, notify->pid);
+ cfg80211_mlme_unregister_socket(wdev, notify->pid);
rcu_read_unlock();
diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h
index 2ad7fbc7d9f1..30d2f939150d 100644
--- a/net/wireless/nl80211.h
+++ b/net/wireless/nl80211.h
@@ -74,13 +74,13 @@ void nl80211_send_sta_event(struct cfg80211_registered_device *rdev,
struct net_device *dev, const u8 *mac_addr,
struct station_info *sinfo, gfp_t gfp);
-int nl80211_send_action(struct cfg80211_registered_device *rdev,
- struct net_device *netdev, u32 nlpid, int freq,
- const u8 *buf, size_t len, gfp_t gfp);
-void nl80211_send_action_tx_status(struct cfg80211_registered_device *rdev,
- struct net_device *netdev, u64 cookie,
- const u8 *buf, size_t len, bool ack,
- gfp_t gfp);
+int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
+ struct net_device *netdev, u32 nlpid, int freq,
+ const u8 *buf, size_t len, gfp_t gfp);
+void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev,
+ struct net_device *netdev, u64 cookie,
+ const u8 *buf, size_t len, bool ack,
+ gfp_t gfp);
void
nl80211_send_cqm_rssi_notify(struct cfg80211_registered_device *rdev,
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index f180db0de66c..b0d9a08447c9 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -36,6 +36,7 @@
#include <linux/slab.h>
#include <linux/list.h>
#include <linux/random.h>
+#include <linux/ctype.h>
#include <linux/nl80211.h>
#include <linux/platform_device.h>
#include <net/cfg80211.h>
@@ -181,14 +182,6 @@ static bool is_alpha2_set(const char *alpha2)
return false;
}
-static bool is_alpha_upper(char letter)
-{
- /* ASCII A - Z */
- if (letter >= 65 && letter <= 90)
- return true;
- return false;
-}
-
static bool is_unknown_alpha2(const char *alpha2)
{
if (!alpha2)
@@ -220,7 +213,7 @@ static bool is_an_alpha2(const char *alpha2)
{
if (!alpha2)
return false;
- if (is_alpha_upper(alpha2[0]) && is_alpha_upper(alpha2[1]))
+ if (isalpha(alpha2[0]) && isalpha(alpha2[1]))
return true;
return false;
}
@@ -1399,6 +1392,11 @@ static DECLARE_WORK(reg_work, reg_todo);
static void queue_regulatory_request(struct regulatory_request *request)
{
+ if (isalpha(request->alpha2[0]))
+ request->alpha2[0] = toupper(request->alpha2[0]);
+ if (isalpha(request->alpha2[1]))
+ request->alpha2[1] = toupper(request->alpha2[1]);
+
spin_lock(&reg_requests_lock);
list_add_tail(&request->list, &reg_requests_list);
spin_unlock(&reg_requests_lock);
diff --git a/net/wireless/sysfs.c b/net/wireless/sysfs.c
index 9f2cef3e0ca0..74a9e3cce452 100644
--- a/net/wireless/sysfs.c
+++ b/net/wireless/sysfs.c
@@ -110,6 +110,13 @@ static int wiphy_resume(struct device *dev)
return ret;
}
+static const void *wiphy_namespace(struct device *d)
+{
+ struct wiphy *wiphy = container_of(d, struct wiphy, dev);
+
+ return wiphy_net(wiphy);
+}
+
struct class ieee80211_class = {
.name = "ieee80211",
.owner = THIS_MODULE,
@@ -120,6 +127,8 @@ struct class ieee80211_class = {
#endif
.suspend = wiphy_suspend,
.resume = wiphy_resume,
+ .ns_type = &net_ns_type_operations,
+ .namespace = wiphy_namespace,
};
int wiphy_sysfs_init(void)
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 0c8a1e8b7690..8d961cc4ae98 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -221,7 +221,7 @@ const unsigned char bridge_tunnel_header[] __aligned(2) =
{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
EXPORT_SYMBOL(bridge_tunnel_header);
-unsigned int ieee80211_hdrlen(__le16 fc)
+unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc)
{
unsigned int hdrlen = 24;
@@ -823,7 +823,7 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
/* monitor can't bridge anyway */
break;
case NL80211_IFTYPE_UNSPECIFIED:
- case __NL80211_IFTYPE_AFTER_LAST:
+ case NUM_NL80211_IFTYPES:
/* not happening */
break;
}
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
index ba59983aaffe..b14ed4b1f27c 100644
--- a/net/xfrm/xfrm_user.c
+++ b/net/xfrm/xfrm_user.c
@@ -2504,7 +2504,7 @@ static struct xfrm_policy *xfrm_compile_policy(struct sock *sk, int opt,
if (p->dir > XFRM_POLICY_OUT)
return NULL;
- xp = xfrm_policy_alloc(net, GFP_KERNEL);
+ xp = xfrm_policy_alloc(net, GFP_ATOMIC);
if (xp == NULL) {
*dir = -ENOBUFS;
return NULL;
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
index de934def410f..7522a8bc0553 100644
--- a/scripts/kconfig/Makefile
+++ b/scripts/kconfig/Makefile
@@ -146,7 +146,6 @@ check-lxdialog := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
# Use recursively expanded variables so we do not call gcc unless
# we really need to do so. (Do not call gcc as part of make mrproper)
HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
-HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
HOST_EXTRACFLAGS += -DLOCALE
@@ -208,7 +207,7 @@ clean-files += config.pot linux.pot
PHONY += $(obj)/dochecklxdialog
$(addprefix $(obj)/,$(lxdialog)): $(obj)/dochecklxdialog
$(obj)/dochecklxdialog:
- $(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOST_LOADLIBES)
+ $(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTLOADLIBES_mconf)
always := dochecklxdialog
@@ -226,6 +225,8 @@ HOSTLOADLIBES_gconf = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0` -ldl
HOSTCFLAGS_gconf.o = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
-D LKC_DIRECT_LINK
+HOSTLOADLIBES_mconf = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
+
HOSTLOADLIBES_nconf = -lmenu -lpanel -lncurses
$(obj)/qconf.o: $(obj)/.tmp_qtcheck
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index c39327e60ea4..dc11d51bd8b3 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -5,6 +5,7 @@
#include <sys/stat.h>
#include <ctype.h>
+#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
@@ -497,7 +498,9 @@ int conf_write_defconfig(const char *filename)
/*
* If symbol is a choice value and equals to the
* default for a choice - skip.
- * But only if value is bool and equal to "y" .
+ * But only if value is bool and equal to "y" and
+ * choice is not "optional".
+ * (If choice is "optional" then all values can be "n")
*/
if (sym_is_choice_value(sym)) {
struct symbol *cs;
@@ -505,7 +508,7 @@ int conf_write_defconfig(const char *filename)
cs = prop_get_symbol(sym_get_choice_prop(sym));
ds = sym_choice_default(cs);
- if (sym == ds) {
+ if (!sym_is_optional(cs) && sym == ds) {
if ((sym->type == S_BOOLEAN) &&
sym_get_tristate_value(sym) == yes)
goto next_menu;
diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c
index 2ba71bcd38e6..18a215de9f36 100644
--- a/scripts/kconfig/nconf.c
+++ b/scripts/kconfig/nconf.c
@@ -5,9 +5,12 @@
* Derived from menuconfig.
*
*/
+#define _GNU_SOURCE
+#include <string.h>
#define LKC_DIRECT_LINK
#include "lkc.h"
#include "nconf.h"
+#include <ctype.h>
static const char nconf_readme[] = N_(
"Overview\n"
@@ -23,7 +26,7 @@ static const char nconf_readme[] = N_(
" < > can be built in, modularized or removed\n"
" { } can be built in or modularized (selected by other feature)\n"
" - - are selected by other feature,\n"
-" XXX cannot be selected. use Symbol Info to find out why,\n"
+" XXX cannot be selected. Use Symbol Info to find out why,\n"
"while *, M or whitespace inside braces means to build in, build as\n"
"a module or to exclude the feature respectively.\n"
"\n"
@@ -41,9 +44,13 @@ static const char nconf_readme[] = N_(
" pressing <Enter> of <right-arrow>. Use <Esc> or <left-arrow> to go back.\n"
" Submenus are designated by \"--->\".\n"
"\n"
-" Shortcut: Press the option's highlighted letter (hotkey).\n"
-" Pressing a hotkey more than once will sequence\n"
-" through all visible items which use that hotkey.\n"
+" Searching: pressing '/' triggers interactive search mode.\n"
+" nconfig performs a case insensitive search for the string\n"
+" in the menu prompts (no regex support).\n"
+" Pressing the up/down keys highlights the previous/next\n"
+" matching item. Backspace removes one character from the\n"
+" match string. Pressing either '/' again or ESC exits\n"
+" search mode. All other keys behave normally.\n"
"\n"
" You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
" unseen options into view.\n"
@@ -141,21 +148,21 @@ menu_no_f_instructions[] = N_(
" <Enter> or <right-arrow> selects submenus --->.\n"
" Capital Letters are hotkeys.\n"
" Pressing <Y> includes, <N> excludes, <M> modularizes features.\n"
-" Pressing SpaceBar toggles between the above options\n"
-" Press <Esc> or <left-arrow> to go back one menu, \n"
+" Pressing SpaceBar toggles between the above options.\n"
+" Press <Esc> or <left-arrow> to go back one menu,\n"
" <?> or <h> for Help, </> for Search.\n"
-" <1> is interchangable with <F1>, <2> with <F2>, etc.\n"
+" <1> is interchangeable with <F1>, <2> with <F2>, etc.\n"
" Legend: [*] built-in [ ] excluded <M> module < > module capable.\n"
-" <Esc> always leaves the current window\n"),
+" <Esc> always leaves the current window.\n"),
menu_instructions[] = N_(
" Arrow keys navigate the menu.\n"
" <Enter> or <right-arrow> selects submenus --->.\n"
" Capital Letters are hotkeys.\n"
" Pressing <Y> includes, <N> excludes, <M> modularizes features.\n"
" Pressing SpaceBar toggles between the above options\n"
-" Press <Esc>, <F3> or <left-arrow> to go back one menu, \n"
+" Press <Esc>, <F5> or <left-arrow> to go back one menu,\n"
" <?>, <F1> or <h> for Help, </> for Search.\n"
-" <1> is interchangable with <F1>, <2> with <F2>, etc.\n"
+" <1> is interchangeable with <F1>, <2> with <F2>, etc.\n"
" Legend: [*] built-in [ ] excluded <M> module < > module capable.\n"
" <Esc> always leaves the current window\n"),
radiolist_instructions[] = N_(
@@ -252,7 +259,6 @@ struct mitem {
char str[256];
char tag;
void *usrptr;
- int is_hot;
int is_visible;
};
@@ -275,14 +281,6 @@ static int items_num;
static int global_exit;
/* the currently selected button */
const char *current_instructions = menu_instructions;
-/* this array is used to implement hot keys. it is updated in item_make and
- * resetted in clean_items. It would be better to use a hash, but lets keep it
- * simple... */
-#define MAX_SAME_KEY MAX_MENU_ITEMS
-struct {
- int count;
- int ptrs[MAX_MENU_ITEMS];
-} hotkeys[1<<(sizeof(char)*8)];
static void conf(struct menu *menu);
static void conf_choice(struct menu *menu);
@@ -292,6 +290,7 @@ static void conf_save(void);
static void show_help(struct menu *menu);
static int do_exit(void);
static void setup_windows(void);
+static void search_conf(void);
typedef void (*function_key_handler_t)(int *key, struct menu *menu);
static void handle_f1(int *key, struct menu *current_item);
@@ -302,6 +301,7 @@ static void handle_f5(int *key, struct menu *current_item);
static void handle_f6(int *key, struct menu *current_item);
static void handle_f7(int *key, struct menu *current_item);
static void handle_f8(int *key, struct menu *current_item);
+static void handle_f9(int *key, struct menu *current_item);
struct function_keys {
const char *key_str;
@@ -310,7 +310,7 @@ struct function_keys {
function_key_handler_t handler;
};
-static const int function_keys_num = 8;
+static const int function_keys_num = 9;
struct function_keys function_keys[] = {
{
.key_str = "F1",
@@ -320,13 +320,13 @@ struct function_keys function_keys[] = {
},
{
.key_str = "F2",
- .func = "Symbol Info",
+ .func = "Sym Info",
.key = F_SYMBOL,
.handler = handle_f2,
},
{
.key_str = "F3",
- .func = "Instructions",
+ .func = "Insts",
.key = F_INSTS,
.handler = handle_f3,
},
@@ -356,9 +356,15 @@ struct function_keys function_keys[] = {
},
{
.key_str = "F8",
+ .func = "Sym Search",
+ .key = F_SEARCH,
+ .handler = handle_f8,
+ },
+ {
+ .key_str = "F9",
.func = "Exit",
.key = F_EXIT,
- .handler = handle_f8,
+ .handler = handle_f9,
},
};
@@ -444,9 +450,16 @@ static void handle_f7(int *key, struct menu *current_item)
return;
}
-/* exit */
+/* search */
static void handle_f8(int *key, struct menu *current_item)
{
+ search_conf();
+ return;
+}
+
+/* exit */
+static void handle_f9(int *key, struct menu *current_item)
+{
do_exit();
return;
}
@@ -479,110 +492,44 @@ static void clean_items(void)
free_item(curses_menu_items[i]);
bzero(curses_menu_items, sizeof(curses_menu_items));
bzero(k_menu_items, sizeof(k_menu_items));
- bzero(hotkeys, sizeof(hotkeys));
items_num = 0;
}
-/* return the index of the next hot item, or -1 if no such item exists */
-static int get_next_hot(int c)
-{
- static int hot_index;
- static int hot_char;
-
- if (c < 0 || c > 255 || hotkeys[c].count <= 0)
- return -1;
-
- if (hot_char == c) {
- hot_index = (hot_index+1)%hotkeys[c].count;
- return hotkeys[c].ptrs[hot_index];
- } else {
- hot_char = c;
- hot_index = 0;
- return hotkeys[c].ptrs[0];
- }
-}
-
-/* can the char c be a hot key? no, if c is a common shortcut used elsewhere */
-static int canbhot(char c)
-{
- c = tolower(c);
- return isalnum(c) && c != 'y' && c != 'm' && c != 'h' &&
- c != 'n' && c != '?';
-}
-
-/* check if str already contains a hot key. */
-static int is_hot(int index)
-{
- return k_menu_items[index].is_hot;
-}
+typedef enum {MATCH_TINKER_PATTERN_UP, MATCH_TINKER_PATTERN_DOWN,
+ FIND_NEXT_MATCH_DOWN, FIND_NEXT_MATCH_UP} match_f;
-/* find the first possible hot key, and mark it.
- * index is the index of the item in the menu
- * return 0 on success*/
-static int make_hot(char *dest, int len, const char *org, int index)
+/* return the index of the matched item, or -1 if no such item exists */
+static int get_mext_match(const char *match_str, match_f flag)
{
- int position = -1;
- int i;
- int tmp;
- int c;
- int org_len = strlen(org);
-
- if (org == NULL || is_hot(index))
- return 1;
-
- /* make sure not to make hot keys out of markers.
- * find where to start looking for a hot key
- */
- i = 0;
- /* skip white space */
- while (i < org_len && org[i] == ' ')
- i++;
- if (i == org_len)
- return -1;
- /* if encountering '(' or '<' or '[', find the match and look from there
- **/
- if (org[i] == '[' || org[i] == '<' || org[i] == '(') {
- i++;
- for (; i < org_len; i++)
- if (org[i] == ']' || org[i] == '>' || org[i] == ')')
- break;
- }
- if (i == org_len)
- return -1;
- for (; i < org_len; i++) {
- if (canbhot(org[i]) && org[i-1] != '<' && org[i-1] != '(') {
- position = i;
- break;
- }
+ int match_start = item_index(current_item(curses_menu));
+ int index;
+
+ if (flag == FIND_NEXT_MATCH_DOWN)
+ ++match_start;
+ else if (flag == FIND_NEXT_MATCH_UP)
+ --match_start;
+
+ index = match_start;
+ index = (index + items_num) % items_num;
+ while (true) {
+ char *str = k_menu_items[index].str;
+ if (strcasestr(str, match_str) != 0)
+ return index;
+ if (flag == FIND_NEXT_MATCH_UP ||
+ flag == MATCH_TINKER_PATTERN_UP)
+ --index;
+ else
+ ++index;
+ index = (index + items_num) % items_num;
+ if (index == match_start)
+ return -1;
}
- if (position == -1)
- return 1;
-
- /* ok, char at org[position] should be a hot key to this item */
- c = tolower(org[position]);
- tmp = hotkeys[c].count;
- hotkeys[c].ptrs[tmp] = index;
- hotkeys[c].count++;
- /*
- snprintf(dest, len, "%.*s(%c)%s", position, org, org[position],
- &org[position+1]);
- */
- /* make org[position] uppercase, and all leading letter small case */
- strncpy(dest, org, len);
- for (i = 0; i < position; i++)
- dest[i] = tolower(dest[i]);
- dest[position] = toupper(dest[position]);
- k_menu_items[index].is_hot = 1;
- return 0;
}
-/* Make a new item. Add a hotkey mark in the first possible letter.
- * As ncurses does not allow any attributes inside menue item, we mark the
- * hot key as the first capitalized letter in the string */
+/* Make a new item. */
static void item_make(struct menu *menu, char tag, const char *fmt, ...)
{
va_list ap;
- char tmp_str[256];
if (items_num > MAX_MENU_ITEMS-1)
return;
@@ -597,16 +544,13 @@ static void item_make(struct menu *menu, char tag, const char *fmt, ...)
k_menu_items[items_num].is_visible = 1;
va_start(ap, fmt);
- vsnprintf(tmp_str, sizeof(tmp_str), fmt, ap);
- if (!k_menu_items[items_num].is_visible)
- memcpy(tmp_str, "XXX", 3);
+ vsnprintf(k_menu_items[items_num].str,
+ sizeof(k_menu_items[items_num].str),
+ fmt, ap);
va_end(ap);
- if (make_hot(
- k_menu_items[items_num].str,
- sizeof(k_menu_items[items_num].str), tmp_str, items_num) != 0)
- strncpy(k_menu_items[items_num].str,
- tmp_str,
- sizeof(k_menu_items[items_num].str));
+
+ if (!k_menu_items[items_num].is_visible)
+ memcpy(k_menu_items[items_num].str, "XXX", 3);
curses_menu_items[items_num] = new_item(
k_menu_items[items_num].str,
@@ -638,11 +582,9 @@ static void item_add_str(const char *fmt, ...)
va_end(ap);
snprintf(tmp_str, sizeof(tmp_str), "%s%s",
k_menu_items[index].str, new_str);
- if (make_hot(k_menu_items[index].str,
- sizeof(k_menu_items[index].str), tmp_str, index) != 0)
- strncpy(k_menu_items[index].str,
- tmp_str,
- sizeof(k_menu_items[index].str));
+ strncpy(k_menu_items[index].str,
+ tmp_str,
+ sizeof(k_menu_items[index].str));
free_item(curses_menu_items[index]);
curses_menu_items[index] = new_item(
@@ -1027,23 +969,18 @@ static void reset_menu(void)
static void center_item(int selected_index, int *last_top_row)
{
int toprow;
- int maxy, maxx;
- scale_menu(curses_menu, &maxy, &maxx);
set_top_row(curses_menu, *last_top_row);
toprow = top_row(curses_menu);
- if (selected_index >= toprow && selected_index < toprow+maxy) {
- /* we can only move the selected item. no need to scroll */
- set_current_item(curses_menu,
- curses_menu_items[selected_index]);
- } else {
- toprow = max(selected_index-maxy/2, 0);
- if (toprow >= item_count(curses_menu)-maxy)
+ if (selected_index < toprow ||
+ selected_index >= toprow+mwin_max_lines) {
+ toprow = max(selected_index-mwin_max_lines/2, 0);
+ if (toprow >= item_count(curses_menu)-mwin_max_lines)
toprow = item_count(curses_menu)-mwin_max_lines;
set_top_row(curses_menu, toprow);
- set_current_item(curses_menu,
- curses_menu_items[selected_index]);
}
+ set_current_item(curses_menu,
+ curses_menu_items[selected_index]);
*last_top_row = toprow;
post_menu(curses_menu);
refresh_all_windows(main_window);
@@ -1075,7 +1012,7 @@ static void show_menu(const char *prompt, const char *instructions,
/* position the menu at the middle of the screen */
scale_menu(curses_menu, &maxy, &maxx);
maxx = min(maxx, mwin_max_cols-2);
- maxy = mwin_max_lines-2;
+ maxy = mwin_max_lines;
menu_window = derwin(main_window,
maxy,
maxx,
@@ -1099,10 +1036,77 @@ static void show_menu(const char *prompt, const char *instructions,
refresh_all_windows(main_window);
}
+static void adj_match_dir(match_f *match_direction)
+{
+ if (*match_direction == FIND_NEXT_MATCH_DOWN)
+ *match_direction =
+ MATCH_TINKER_PATTERN_DOWN;
+ else if (*match_direction == FIND_NEXT_MATCH_UP)
+ *match_direction =
+ MATCH_TINKER_PATTERN_UP;
+ /* else, do no change.. */
+}
-static void conf(struct menu *menu)
+struct match_state
{
+ int in_search;
+ match_f match_direction;
char pattern[256];
+};
+
+/* Return 0 means I have handled the key. In such a case, ans should hold the
+ * item to center, or -1 otherwise.
+ * Else return -1 .
+ */
+static int do_match(int key, struct match_state *state, int *ans)
+{
+ char c = (char) key;
+ int terminate_search = 0;
+ *ans = -1;
+ if (key == '/' || (state->in_search && key == 27)) {
+ move(0, 0);
+ refresh();
+ clrtoeol();
+ state->in_search = 1-state->in_search;
+ bzero(state->pattern, sizeof(state->pattern));
+ state->match_direction = MATCH_TINKER_PATTERN_DOWN;
+ return 0;
+ } else if (!state->in_search)
+ return 1;
+
+ if (isalnum(c) || isgraph(c) || c == ' ') {
+ state->pattern[strlen(state->pattern)] = c;
+ state->pattern[strlen(state->pattern)] = '\0';
+ adj_match_dir(&state->match_direction);
+ *ans = get_mext_match(state->pattern,
+ state->match_direction);
+ } else if (key == KEY_DOWN) {
+ state->match_direction = FIND_NEXT_MATCH_DOWN;
+ *ans = get_mext_match(state->pattern,
+ state->match_direction);
+ } else if (key == KEY_UP) {
+ state->match_direction = FIND_NEXT_MATCH_UP;
+ *ans = get_mext_match(state->pattern,
+ state->match_direction);
+ } else if (key == KEY_BACKSPACE || key == 127) {
+ state->pattern[strlen(state->pattern)-1] = '\0';
+ adj_match_dir(&state->match_direction);
+ } else
+ terminate_search = 1;
+
+ if (terminate_search) {
+ state->in_search = 0;
+ bzero(state->pattern, sizeof(state->pattern));
+ move(0, 0);
+ refresh();
+ clrtoeol();
+ return -1;
+ }
+ return 0;
+}
+
+static void conf(struct menu *menu)
+{
struct menu *submenu = 0;
const char *prompt = menu_get_prompt(menu);
struct symbol *sym;
@@ -1110,8 +1114,11 @@ static void conf(struct menu *menu)
int res;
int current_index = 0;
int last_top_row = 0;
-
- bzero(pattern, sizeof(pattern));
+ struct match_state match_state = {
+ .in_search = 0,
+ .match_direction = MATCH_TINKER_PATTERN_DOWN,
+ .pattern = "",
+ };
while (!global_exit) {
reset_menu();
@@ -1124,7 +1131,22 @@ static void conf(struct menu *menu)
_(menu_instructions),
current_index, &last_top_row);
keypad((menu_win(curses_menu)), TRUE);
- while (!global_exit && (res = wgetch(menu_win(curses_menu)))) {
+ while (!global_exit) {
+ if (match_state.in_search) {
+ mvprintw(0, 0,
+ "searching: %s", match_state.pattern);
+ clrtoeol();
+ }
+ refresh_all_windows(main_window);
+ res = wgetch(menu_win(curses_menu));
+ if (!res)
+ break;
+ if (do_match(res, &match_state, &current_index) == 0) {
+ if (current_index != -1)
+ center_item(current_index,
+ &last_top_row);
+ continue;
+ }
if (process_special_keys(&res,
(struct menu *) item_data()))
break;
@@ -1155,19 +1177,13 @@ static void conf(struct menu *menu)
if (res == 10 || res == 27 ||
res == 32 || res == 'n' || res == 'y' ||
res == KEY_LEFT || res == KEY_RIGHT ||
- res == 'm' || res == '/')
+ res == 'm')
break;
- else if (canbhot(res)) {
- /* check for hot keys: */
- int tmp = get_next_hot(res);
- if (tmp != -1)
- center_item(tmp, &last_top_row);
- }
refresh_all_windows(main_window);
}
refresh_all_windows(main_window);
- /* if ESC or left*/
+ /* if ESC or left*/
if (res == 27 || (menu != &rootmenu && res == KEY_LEFT))
break;
@@ -1235,9 +1251,6 @@ static void conf(struct menu *menu)
if (item_is_tag('t'))
sym_set_tristate_value(sym, mod);
break;
- case '/':
- search_conf();
- break;
}
}
}
@@ -1268,6 +1281,11 @@ static void conf_choice(struct menu *menu)
int selected_index = 0;
int last_top_row = 0;
int res, i = 0;
+ struct match_state match_state = {
+ .in_search = 0,
+ .match_direction = MATCH_TINKER_PATTERN_DOWN,
+ .pattern = "",
+ };
active = sym_get_choice_value(menu->sym);
/* this is mostly duplicated from the conf() function. */
@@ -1294,7 +1312,22 @@ static void conf_choice(struct menu *menu)
_(radiolist_instructions),
selected_index,
&last_top_row);
- while (!global_exit && (res = wgetch(menu_win(curses_menu)))) {
+ while (!global_exit) {
+ if (match_state.in_search) {
+ mvprintw(0, 0, "searching: %s",
+ match_state.pattern);
+ clrtoeol();
+ }
+ refresh_all_windows(main_window);
+ res = wgetch(menu_win(curses_menu));
+ if (!res)
+ break;
+ if (do_match(res, &match_state, &selected_index) == 0) {
+ if (selected_index != -1)
+ center_item(selected_index,
+ &last_top_row);
+ continue;
+ }
if (process_special_keys(
&res,
(struct menu *) item_data()))
@@ -1324,13 +1357,8 @@ static void conf_choice(struct menu *menu)
break;
}
if (res == 10 || res == 27 || res == ' ' ||
- res == KEY_LEFT)
+ res == KEY_LEFT){
break;
- else if (canbhot(res)) {
- /* check for hot keys: */
- int tmp = get_next_hot(res);
- if (tmp != -1)
- center_item(tmp, &last_top_row);
}
refresh_all_windows(main_window);
}
@@ -1485,7 +1513,7 @@ void setup_windows(void)
/* set up the menu and menu window */
main_window = newwin(LINES-2, COLS-2, 2, 1);
keypad(main_window, TRUE);
- mwin_max_lines = LINES-6;
+ mwin_max_lines = LINES-7;
mwin_max_cols = COLS-6;
/* panels order is from bottom to top */
@@ -1532,9 +1560,10 @@ int main(int ac, char **av)
/* set btns menu */
curses_menu = new_menu(curses_menu_items);
menu_opts_off(curses_menu, O_SHOWDESC);
- menu_opts_off(curses_menu, O_SHOWMATCH);
+ menu_opts_on(curses_menu, O_SHOWMATCH);
menu_opts_on(curses_menu, O_ONEVALUE);
menu_opts_on(curses_menu, O_NONCYCLIC);
+ menu_opts_on(curses_menu, O_IGNORECASE);
set_menu_mark(curses_menu, " ");
set_menu_fore(curses_menu, attributes[MAIN_MENU_FORE]);
set_menu_back(curses_menu, attributes[MAIN_MENU_BACK]);
@@ -1550,8 +1579,6 @@ int main(int ac, char **av)
_(menu_no_f_instructions));
}
-
-
/* do the work */
while (!global_exit) {
conf(&rootmenu);
diff --git a/scripts/kconfig/nconf.gui.c b/scripts/kconfig/nconf.gui.c
index a9d9344e1365..f8137b3a5382 100644
--- a/scripts/kconfig/nconf.gui.c
+++ b/scripts/kconfig/nconf.gui.c
@@ -137,7 +137,7 @@ void set_colors()
if (has_colors()) {
normal_color_theme();
} else {
- /* give deafults */
+ /* give defaults */
no_colors_theme();
}
}
@@ -167,7 +167,7 @@ void print_in_middle(WINDOW *win,
length = strlen(string);
temp = (width - length) / 2;
x = startx + (int)temp;
- wattrset(win, color);
+ (void) wattrset(win, color);
mvwprintw(win, y, x, "%s", string);
refresh();
}
@@ -297,11 +297,11 @@ int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...)
set_menu_fore(menu, attributes[DIALOG_MENU_FORE]);
set_menu_back(menu, attributes[DIALOG_MENU_BACK]);
- wattrset(win, attributes[DIALOG_BOX]);
+ (void) wattrset(win, attributes[DIALOG_BOX]);
box(win, 0, 0);
/* print message */
- wattrset(msg_win, attributes[DIALOG_TEXT]);
+ (void) wattrset(msg_win, attributes[DIALOG_TEXT]);
fill_window(msg_win, msg);
set_menu_win(menu, win);
@@ -392,16 +392,16 @@ int dialog_inputbox(WINDOW *main_window,
form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2);
keypad(form_win, TRUE);
- wattrset(form_win, attributes[INPUT_FIELD]);
+ (void) wattrset(form_win, attributes[INPUT_FIELD]);
- wattrset(win, attributes[INPUT_BOX]);
+ (void) wattrset(win, attributes[INPUT_BOX]);
box(win, 0, 0);
- wattrset(win, attributes[INPUT_HEADING]);
+ (void) wattrset(win, attributes[INPUT_HEADING]);
if (title)
mvwprintw(win, 0, 3, "%s", title);
/* print message */
- wattrset(prompt_win, attributes[INPUT_TEXT]);
+ (void) wattrset(prompt_win, attributes[INPUT_TEXT]);
fill_window(prompt_win, prompt);
mvwprintw(form_win, 0, 0, "%*s", prompt_width, " ");
@@ -531,7 +531,7 @@ void show_scroll_win(WINDOW *main_window,
/* create the pad */
pad = newpad(total_lines+10, total_cols+10);
- wattrset(pad, attributes[SCROLLWIN_TEXT]);
+ (void) wattrset(pad, attributes[SCROLLWIN_TEXT]);
fill_window(pad, text);
win_lines = min(total_lines+4, LINES-2);
@@ -546,9 +546,9 @@ void show_scroll_win(WINDOW *main_window,
win = newwin(win_lines, win_cols, y, x);
keypad(win, TRUE);
/* show the help in the help window, and show the help panel */
- wattrset(win, attributes[SCROLLWIN_BOX]);
+ (void) wattrset(win, attributes[SCROLLWIN_BOX]);
box(win, 0, 0);
- wattrset(win, attributes[SCROLLWIN_HEADING]);
+ (void) wattrset(win, attributes[SCROLLWIN_HEADING]);
mvwprintw(win, 0, 3, " %s ", title);
panel = new_panel(win);
diff --git a/scripts/kconfig/nconf.h b/scripts/kconfig/nconf.h
index fb4296666004..58fbda8fc0dc 100644
--- a/scripts/kconfig/nconf.h
+++ b/scripts/kconfig/nconf.h
@@ -69,7 +69,8 @@ typedef enum {
F_BACK = 5,
F_SAVE = 6,
F_LOAD = 7,
- F_EXIT = 8
+ F_SEARCH = 8,
+ F_EXIT = 9,
} function_key;
void set_colors(void);
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index e95718fea355..943712ca6c0a 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -937,6 +937,8 @@ static void sym_check_print_recursive(struct symbol *last_sym)
sym = stack->sym;
next_sym = stack->next ? stack->next->sym : last_sym;
prop = stack->prop;
+ if (prop == NULL)
+ prop = stack->sym->prop;
/* for choice values find the menu entry (used below) */
if (sym_is_choice(sym) || sym_is_choice_value(sym)) {
diff --git a/scripts/mkmakefile b/scripts/mkmakefile
index 67d59c7a18dc..5325423ceab4 100644
--- a/scripts/mkmakefile
+++ b/scripts/mkmakefile
@@ -44,7 +44,9 @@ all:
Makefile:;
-\$(all) %/: all
+\$(all): all
@:
+%/: all
+ @:
EOF
diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
index 0171060b5fd6..e67f05486087 100755
--- a/scripts/recordmcount.pl
+++ b/scripts/recordmcount.pl
@@ -159,6 +159,7 @@ my $section_regex; # Find the start of a section
my $function_regex; # Find the name of a function
# (return offset and func name)
my $mcount_regex; # Find the call site to mcount (return offset)
+my $mcount_adjust; # Address adjustment to mcount offset
my $alignment; # The .align value to use for $mcount_section
my $section_type; # Section header plus possible alignment command
my $can_use_local = 0; # If we can use local function references
@@ -213,6 +214,7 @@ $section_regex = "Disassembly of section\\s+(\\S+):";
$function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:";
$mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount\$";
$section_type = '@progbits';
+$mcount_adjust = 0;
$type = ".long";
if ($arch eq "x86_64") {
@@ -351,6 +353,9 @@ if ($arch eq "x86_64") {
} elsif ($arch eq "microblaze") {
# Microblaze calls '_mcount' instead of plain 'mcount'.
$mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$";
+} elsif ($arch eq "blackfin") {
+ $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s__mcount\$";
+ $mcount_adjust = -4;
} else {
die "Arch $arch is not supported with CONFIG_FTRACE_MCOUNT_RECORD";
}
@@ -511,7 +516,7 @@ while (<IN>) {
}
# is this a call site to mcount? If so, record it to print later
if ($text_found && /$mcount_regex/) {
- push(@offsets, hex $1);
+ push(@offsets, (hex $1) + $mcount_adjust);
}
}
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
index d5666d3cc21b..82f545a9500f 100644
--- a/security/apparmor/lsm.c
+++ b/security/apparmor/lsm.c
@@ -607,7 +607,7 @@ static int apparmor_setprocattr(struct task_struct *task, char *name,
return error;
}
-static int apparmor_task_setrlimit(unsigned int resource,
+static int apparmor_task_setrlimit(struct task_struct *p, unsigned int resource,
struct rlimit *new_rlim)
{
struct aa_profile *profile = aa_current_profile();
diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c
index 3a29704be8ce..aa5a2fd1cc09 100644
--- a/security/selinux/ss/policydb.c
+++ b/security/selinux/ss/policydb.c
@@ -1624,11 +1624,11 @@ static int role_bounds_sanity_check(void *key, void *datum, void *datap)
static int type_bounds_sanity_check(void *key, void *datum, void *datap)
{
- struct type_datum *upper, *type;
+ struct type_datum *upper;
struct policydb *p = datap;
int depth = 0;
- upper = type = datum;
+ upper = datum;
while (upper->bounds) {
if (++depth == POLICYDB_BOUNDS_MAXDEPTH) {
printk(KERN_ERR "SELinux: type %s: "
diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c
index ef43995119a4..a4dc2d5e4825 100644
--- a/security/tomoyo/common.c
+++ b/security/tomoyo/common.c
@@ -768,8 +768,10 @@ static bool tomoyo_select_one(struct tomoyo_io_buffer *head, const char *data)
return true; /* Do nothing if open(O_WRONLY). */
memset(&head->r, 0, sizeof(head->r));
head->r.print_this_domain_only = true;
- head->r.eof = !domain;
- head->r.domain = &domain->list;
+ if (domain)
+ head->r.domain = &domain->list;
+ else
+ head->r.eof = 1;
tomoyo_io_printf(head, "# select %s\n", data);
if (domain && domain->is_deleted)
tomoyo_io_printf(head, "# This is a deleted domain.\n");
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
index 31b5d9eeba68..c424952a734e 100644
--- a/sound/pci/hda/patch_conexant.c
+++ b/sound/pci/hda/patch_conexant.c
@@ -3049,6 +3049,7 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = {
SND_PCI_QUIRK(0x1028, 0x02f5, "Dell",
CXT5066_DELL_LAPTOP),
SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5),
+ SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTO),
SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO),
SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5),
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 2cd1ae809e46..a4dd04524e43 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -19030,6 +19030,7 @@ static int patch_alc888(struct hda_codec *codec)
/*
* ALC680 support
*/
+#define ALC680_DIGIN_NID ALC880_DIGIN_NID
#define ALC680_DIGOUT_NID ALC880_DIGOUT_NID
#define alc680_modes alc260_modes
@@ -19044,23 +19045,93 @@ static hda_nid_t alc680_adc_nids[3] = {
0x07, 0x08, 0x09
};
+/*
+ * Analog capture ADC cgange
+ */
+static int alc680_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
+ struct hda_codec *codec,
+ unsigned int stream_tag,
+ unsigned int format,
+ struct snd_pcm_substream *substream)
+{
+ struct alc_spec *spec = codec->spec;
+ struct auto_pin_cfg *cfg = &spec->autocfg;
+ unsigned int pre_mic, pre_line;
+
+ pre_mic = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]);
+ pre_line = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_LINE]);
+
+ spec->cur_adc_stream_tag = stream_tag;
+ spec->cur_adc_format = format;
+
+ if (pre_mic || pre_line) {
+ if (pre_mic)
+ snd_hda_codec_setup_stream(codec, 0x08, stream_tag, 0,
+ format);
+ else
+ snd_hda_codec_setup_stream(codec, 0x09, stream_tag, 0,
+ format);
+ } else
+ snd_hda_codec_setup_stream(codec, 0x07, stream_tag, 0, format);
+ return 0;
+}
+
+static int alc680_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
+ struct hda_codec *codec,
+ struct snd_pcm_substream *substream)
+{
+ snd_hda_codec_cleanup_stream(codec, 0x07);
+ snd_hda_codec_cleanup_stream(codec, 0x08);
+ snd_hda_codec_cleanup_stream(codec, 0x09);
+ return 0;
+}
+
+static struct hda_pcm_stream alc680_pcm_analog_auto_capture = {
+ .substreams = 1, /* can be overridden */
+ .channels_min = 2,
+ .channels_max = 2,
+ /* NID is set in alc_build_pcms */
+ .ops = {
+ .prepare = alc680_capture_pcm_prepare,
+ .cleanup = alc680_capture_pcm_cleanup
+ },
+};
+
static struct snd_kcontrol_new alc680_base_mixer[] = {
/* output mixer control */
HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT),
HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT),
+ HDA_CODEC_VOLUME("Int Mic Boost", 0x12, 0, HDA_INPUT),
HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
+ HDA_CODEC_VOLUME("Line In Boost", 0x19, 0, HDA_INPUT),
{ }
};
-static struct snd_kcontrol_new alc680_capture_mixer[] = {
- HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
- HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
- HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT),
- HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT),
- HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT),
- HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT),
+static struct hda_bind_ctls alc680_bind_cap_vol = {
+ .ops = &snd_hda_bind_vol,
+ .values = {
+ HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT),
+ HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
+ HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
+ 0
+ },
+};
+
+static struct hda_bind_ctls alc680_bind_cap_switch = {
+ .ops = &snd_hda_bind_sw,
+ .values = {
+ HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT),
+ HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
+ HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
+ 0
+ },
+};
+
+static struct snd_kcontrol_new alc680_master_capture_mixer[] = {
+ HDA_BIND_VOL("Capture Volume", &alc680_bind_cap_vol),
+ HDA_BIND_SW("Capture Switch", &alc680_bind_cap_switch),
{ } /* end */
};
@@ -19068,25 +19139,73 @@ static struct snd_kcontrol_new alc680_capture_mixer[] = {
* generic initialization of ADC, input mixers and output mixers
*/
static struct hda_verb alc680_init_verbs[] = {
- /* Unmute DAC0-1 and set vol = 0 */
- {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
- {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
- {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
+ {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+ {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+ {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
- {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
- {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
- {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
- {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
- {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
+ {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
+ {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+ {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+ {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
+ {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+ {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+
+ {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
+ {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
+
{ }
};
+/* toggle speaker-output according to the hp-jack state */
+static void alc680_base_setup(struct hda_codec *codec)
+{
+ struct alc_spec *spec = codec->spec;
+
+ spec->autocfg.hp_pins[0] = 0x16;
+ spec->autocfg.speaker_pins[0] = 0x14;
+ spec->autocfg.speaker_pins[1] = 0x15;
+ spec->autocfg.input_pins[AUTO_PIN_MIC] = 0x18;
+ spec->autocfg.input_pins[AUTO_PIN_LINE] = 0x19;
+}
+
+static void alc680_rec_autoswitch(struct hda_codec *codec)
+{
+ struct alc_spec *spec = codec->spec;
+ struct auto_pin_cfg *cfg = &spec->autocfg;
+ unsigned int present;
+ hda_nid_t new_adc;
+
+ present = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]);
+
+ new_adc = present ? 0x8 : 0x7;
+ __snd_hda_codec_cleanup_stream(codec, !present ? 0x8 : 0x7, 1);
+ snd_hda_codec_setup_stream(codec, new_adc,
+ spec->cur_adc_stream_tag, 0,
+ spec->cur_adc_format);
+
+}
+
+static void alc680_unsol_event(struct hda_codec *codec,
+ unsigned int res)
+{
+ if ((res >> 26) == ALC880_HP_EVENT)
+ alc_automute_amp(codec);
+ if ((res >> 26) == ALC880_MIC_EVENT)
+ alc680_rec_autoswitch(codec);
+}
+
+static void alc680_inithook(struct hda_codec *codec)
+{
+ alc_automute_amp(codec);
+ alc680_rec_autoswitch(codec);
+}
+
/* create input playback/capture controls for the given pin */
static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
const char *ctlname, int idx)
@@ -19197,13 +19316,7 @@ static void alc680_auto_init_hp_out(struct hda_codec *codec)
#define alc680_pcm_analog_capture alc880_pcm_analog_capture
#define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
#define alc680_pcm_digital_playback alc880_pcm_digital_playback
-
-static struct hda_input_mux alc680_capture_source = {
- .num_items = 1,
- .items = {
- { "Mic", 0x0 },
- },
-};
+#define alc680_pcm_digital_capture alc880_pcm_digital_capture
/*
* BIOS auto configuration
@@ -19218,6 +19331,7 @@ static int alc680_parse_auto_config(struct hda_codec *codec)
alc680_ignore);
if (err < 0)
return err;
+
if (!spec->autocfg.line_outs) {
if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
spec->multiout.max_channels = 2;
@@ -19239,8 +19353,6 @@ static int alc680_parse_auto_config(struct hda_codec *codec)
add_mixer(spec, spec->kctls.list);
add_verb(spec, alc680_init_verbs);
- spec->num_mux_defs = 1;
- spec->input_mux = &alc680_capture_source;
err = alc_auto_add_mic_boost(codec);
if (err < 0)
@@ -19279,17 +19391,17 @@ static struct snd_pci_quirk alc680_cfg_tbl[] = {
static struct alc_config_preset alc680_presets[] = {
[ALC680_BASE] = {
.mixers = { alc680_base_mixer },
- .cap_mixer = alc680_capture_mixer,
+ .cap_mixer = alc680_master_capture_mixer,
.init_verbs = { alc680_init_verbs },
.num_dacs = ARRAY_SIZE(alc680_dac_nids),
.dac_nids = alc680_dac_nids,
- .num_adc_nids = ARRAY_SIZE(alc680_adc_nids),
- .adc_nids = alc680_adc_nids,
- .hp_nid = 0x04,
.dig_out_nid = ALC680_DIGOUT_NID,
.num_channel_mode = ARRAY_SIZE(alc680_modes),
.channel_mode = alc680_modes,
- .input_mux = &alc680_capture_source,
+ .unsol_event = alc680_unsol_event,
+ .setup = alc680_base_setup,
+ .init_hook = alc680_inithook,
+
},
};
@@ -19333,9 +19445,9 @@ static int patch_alc680(struct hda_codec *codec)
setup_preset(codec, &alc680_presets[board_config]);
spec->stream_analog_playback = &alc680_pcm_analog_playback;
- spec->stream_analog_capture = &alc680_pcm_analog_capture;
- spec->stream_analog_alt_capture = &alc680_pcm_analog_alt_capture;
+ spec->stream_analog_capture = &alc680_pcm_analog_auto_capture;
spec->stream_digital_playback = &alc680_pcm_digital_playback;
+ spec->stream_digital_capture = &alc680_pcm_digital_capture;
if (!spec->adc_nids) {
spec->adc_nids = alc680_adc_nids;
diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c
index f64fb7d988cb..ad5202efd7a9 100644
--- a/sound/pci/riptide/riptide.c
+++ b/sound/pci/riptide/riptide.c
@@ -1224,15 +1224,14 @@ static int try_to_load_firmware(struct cmdif *cif, struct snd_riptide *chip)
firmware.firmware.ASIC, firmware.firmware.CODEC,
firmware.firmware.AUXDSP, firmware.firmware.PROG);
+ if (!chip)
+ return 1;
+
for (i = 0; i < FIRMWARE_VERSIONS; i++) {
if (!memcmp(&firmware_versions[i], &firmware, sizeof(firmware)))
- break;
- }
- if (i >= FIRMWARE_VERSIONS)
- return 0; /* no match */
+ return 1; /* OK */
- if (!chip)
- return 1; /* OK */
+ }
snd_printdd("Writing Firmware\n");
if (!chip->fw_entry) {
diff --git a/sound/soc/atmel/atmel-pcm.c b/sound/soc/atmel/atmel-pcm.c
index dc5249fba85c..d0e75323ec19 100644
--- a/sound/soc/atmel/atmel-pcm.c
+++ b/sound/soc/atmel/atmel-pcm.c
@@ -179,7 +179,7 @@ static int atmel_pcm_hw_params(struct snd_pcm_substream *substream,
snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer);
runtime->dma_bytes = params_buffer_bytes(params);
- prtd->params = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ prtd->params = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
prtd->params->dma_intr_handler = atmel_pcm_dma_irq;
prtd->dma_buffer = runtime->dma_addr;
@@ -374,14 +374,14 @@ static int atmel_pcm_new(struct snd_card *card,
if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = 0xffffffff;
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
ret = atmel_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK);
if (ret)
goto out;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
pr_debug("at32-pcm:"
"Allocating PCM capture DMA buffer\n");
ret = atmel_pcm_preallocate_dma_buffer(pcm,
@@ -414,12 +414,9 @@ static void atmel_pcm_free_dma_buffers(struct snd_pcm *pcm)
}
#ifdef CONFIG_PM
-static int atmel_pcm_suspend(struct snd_soc_dai_link *dai_link)
+static int atmel_pcm_suspend(struct snd_soc_dai *dai)
{
- struct snd_pcm *pcm = dai_link->pcm;
- struct snd_pcm_str *stream = &pcm->streams[0];
- struct snd_pcm_substream *substream = stream->substream;
- struct snd_pcm_runtime *runtime = substream->runtime;
+ struct snd_pcm_runtime *runtime = dai->runtime;
struct atmel_runtime_data *prtd;
struct atmel_pcm_dma_params *params;
@@ -441,12 +438,9 @@ static int atmel_pcm_suspend(struct snd_soc_dai_link *dai_link)
return 0;
}
-static int atmel_pcm_resume(struct snd_soc_dai_link *dai_link)
+static int atmel_pcm_resume(struct snd_soc_dai *dai)
{
- struct snd_pcm *pcm = dai_link->pcm;
- struct snd_pcm_str *stream = &pcm->streams[0];
- struct snd_pcm_substream *substream = stream->substream;
- struct snd_pcm_runtime *runtime = substream->runtime;
+ struct snd_pcm_runtime *runtime = dai->runtime;
struct atmel_runtime_data *prtd;
struct atmel_pcm_dma_params *params;
@@ -470,27 +464,46 @@ static int atmel_pcm_resume(struct snd_soc_dai_link *dai_link)
#define atmel_pcm_resume NULL
#endif
-struct snd_soc_platform atmel_soc_platform = {
- .name = "atmel-audio",
- .pcm_ops = &atmel_pcm_ops,
+static struct snd_soc_platform_driver atmel_soc_platform = {
+ .ops = &atmel_pcm_ops,
.pcm_new = atmel_pcm_new,
.pcm_free = atmel_pcm_free_dma_buffers,
.suspend = atmel_pcm_suspend,
.resume = atmel_pcm_resume,
};
-EXPORT_SYMBOL_GPL(atmel_soc_platform);
-static int __init atmel_pcm_modinit(void)
+static int __devinit atmel_soc_platform_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_platform(&pdev->dev, &atmel_soc_platform);
+}
+
+static int __devexit atmel_soc_platform_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver atmel_pcm_driver = {
+ .driver = {
+ .name = "atmel-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = atmel_soc_platform_probe,
+ .remove = __devexit_p(atmel_soc_platform_remove),
+};
+
+static int __init snd_atmel_pcm_init(void)
{
- return snd_soc_register_platform(&atmel_soc_platform);
+ return platform_driver_register(&atmel_pcm_driver);
}
-module_init(atmel_pcm_modinit);
+module_init(snd_atmel_pcm_init);
-static void __exit atmel_pcm_modexit(void)
+static void __exit snd_atmel_pcm_exit(void)
{
- snd_soc_unregister_platform(&atmel_soc_platform);
+ platform_driver_unregister(&atmel_pcm_driver);
}
-module_exit(atmel_pcm_modexit);
+module_exit(snd_atmel_pcm_exit);
MODULE_AUTHOR("Sedji Gaouaou <sedji.gaouaou@atmel.com>");
MODULE_DESCRIPTION("Atmel PCM module");
diff --git a/sound/soc/atmel/atmel-pcm.h b/sound/soc/atmel/atmel-pcm.h
index ec9b2824b663..2597329302e7 100644
--- a/sound/soc/atmel/atmel-pcm.h
+++ b/sound/soc/atmel/atmel-pcm.h
@@ -74,9 +74,6 @@ struct atmel_pcm_dma_params {
void (*dma_intr_handler)(u32, struct snd_pcm_substream *);
};
-extern struct snd_soc_platform atmel_soc_platform;
-
-
/*
* SSC register access (since ssc_writel() / ssc_readl() require literal name)
*/
diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c
index c85844d4845b..eabf66af12cd 100644
--- a/sound/soc/atmel/atmel_ssc_dai.c
+++ b/sound/soc/atmel/atmel_ssc_dai.c
@@ -205,8 +205,7 @@ static irqreturn_t atmel_ssc_interrupt(int irq, void *dev_id)
static int atmel_ssc_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
- struct atmel_ssc_info *ssc_p = &ssc_info[rtd->dai->cpu_dai->id];
+ struct atmel_ssc_info *ssc_p = &ssc_info[dai->id];
int dir_mask;
pr_debug("atmel_ssc_startup: SSC_SR=0x%u\n",
@@ -235,8 +234,7 @@ static int atmel_ssc_startup(struct snd_pcm_substream *substream,
static void atmel_ssc_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
- struct atmel_ssc_info *ssc_p = &ssc_info[rtd->dai->cpu_dai->id];
+ struct atmel_ssc_info *ssc_p = &ssc_info[dai->id];
struct atmel_pcm_dma_params *dma_params;
int dir, dir_mask;
@@ -338,7 +336,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
- int id = rtd->dai->cpu_dai->id;
+ int id = dai->id;
struct atmel_ssc_info *ssc_p = &ssc_info[id];
struct atmel_pcm_dma_params *dma_params;
int dir, channels, bits;
@@ -368,7 +366,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
* function. It should not be used for other purposes
* as it is common to all substreams.
*/
- snd_soc_dai_set_dma_data(rtd->dai->cpu_dai, substream, dma_params);
+ snd_soc_dai_set_dma_data(rtd->cpu_dai, substream, dma_params);
channels = params_channels(params);
@@ -605,8 +603,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
static int atmel_ssc_prepare(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
- struct atmel_ssc_info *ssc_p = &ssc_info[rtd->dai->cpu_dai->id];
+ struct atmel_ssc_info *ssc_p = &ssc_info[dai->id];
struct atmel_pcm_dma_params *dma_params;
int dir;
@@ -690,6 +687,32 @@ static int atmel_ssc_resume(struct snd_soc_dai *cpu_dai)
# define atmel_ssc_resume NULL
#endif /* CONFIG_PM */
+static int atmel_ssc_probe(struct snd_soc_dai *dai)
+{
+ struct atmel_ssc_info *ssc_p = &ssc_info[dai->id];
+ int ret = 0;
+
+ snd_soc_dai_set_drvdata(dai, ssc_p);
+
+ /*
+ * Request SSC device
+ */
+ ssc_p->ssc = ssc_request(dai->id);
+ if (IS_ERR(ssc_p->ssc)) {
+ printk(KERN_ERR "ASoC: Failed to request SSC %d\n", dai->id);
+ ret = PTR_ERR(ssc_p->ssc);
+ }
+
+ return ret;
+}
+
+static int atmel_ssc_remove(struct snd_soc_dai *dai)
+{
+ struct atmel_ssc_info *ssc_p = snd_soc_dai_get_drvdata(dai);
+
+ ssc_free(ssc_p->ssc);
+ return 0;
+}
#define ATMEL_SSC_RATES (SNDRV_PCM_RATE_8000_96000)
@@ -705,9 +728,11 @@ static struct snd_soc_dai_ops atmel_ssc_dai_ops = {
.set_clkdiv = atmel_ssc_set_dai_clkdiv,
};
-struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = {
- { .name = "atmel-ssc0",
- .id = 0,
+static struct snd_soc_dai_driver atmel_ssc_dai[NUM_SSC_DEVICES] = {
+ {
+ .name = "atmel-ssc-dai.0",
+ .probe = atmel_ssc_probe,
+ .remove = atmel_ssc_remove,
.suspend = atmel_ssc_suspend,
.resume = atmel_ssc_resume,
.playback = {
@@ -721,11 +746,12 @@ struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = {
.rates = ATMEL_SSC_RATES,
.formats = ATMEL_SSC_FORMATS,},
.ops = &atmel_ssc_dai_ops,
- .private_data = &ssc_info[0],
},
#if NUM_SSC_DEVICES == 3
- { .name = "atmel-ssc1",
- .id = 1,
+ {
+ .name = "atmel-ssc-dai.1",
+ .probe = atmel_ssc_probe,
+ .remove = atmel_ssc_remove,
.suspend = atmel_ssc_suspend,
.resume = atmel_ssc_resume,
.playback = {
@@ -739,10 +765,11 @@ struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = {
.rates = ATMEL_SSC_RATES,
.formats = ATMEL_SSC_FORMATS,},
.ops = &atmel_ssc_dai_ops,
- .private_data = &ssc_info[1],
},
- { .name = "atmel-ssc2",
- .id = 2,
+ {
+ .name = "atmel-ssc-dai.2",
+ .probe = atmel_ssc_probe,
+ .remove = atmel_ssc_remove,
.suspend = atmel_ssc_suspend,
.resume = atmel_ssc_resume,
.playback = {
@@ -756,23 +783,43 @@ struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = {
.rates = ATMEL_SSC_RATES,
.formats = ATMEL_SSC_FORMATS,},
.ops = &atmel_ssc_dai_ops,
- .private_data = &ssc_info[2],
},
#endif
};
-EXPORT_SYMBOL_GPL(atmel_ssc_dai);
-static int __init atmel_ssc_modinit(void)
+static __devinit int asoc_ssc_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_dais(&pdev->dev, atmel_ssc_dai,
+ ARRAY_SIZE(atmel_ssc_dai));
+}
+
+static int __devexit asoc_ssc_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(atmel_ssc_dai));
+ return 0;
+}
+
+static struct platform_driver asoc_ssc_driver = {
+ .driver = {
+ .name = "atmel-ssc-dai",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = asoc_ssc_probe,
+ .remove = __devexit_p(asoc_ssc_remove),
+};
+
+static int __init snd_atmel_ssc_init(void)
{
- return snd_soc_register_dais(atmel_ssc_dai, ARRAY_SIZE(atmel_ssc_dai));
+ return platform_driver_register(&asoc_ssc_driver);
}
-module_init(atmel_ssc_modinit);
+module_init(snd_atmel_ssc_init);
-static void __exit atmel_ssc_modexit(void)
+static void __exit snd_atmel_ssc_exit(void)
{
- snd_soc_unregister_dais(atmel_ssc_dai, ARRAY_SIZE(atmel_ssc_dai));
+ platform_driver_unregister(&asoc_ssc_driver);
}
-module_exit(atmel_ssc_modexit);
+module_exit(snd_atmel_ssc_exit);
/* Module information */
MODULE_AUTHOR("Sedji Gaouaou, sedji.gaouaou@atmel.com, www.atmel.com");
diff --git a/sound/soc/atmel/atmel_ssc_dai.h b/sound/soc/atmel/atmel_ssc_dai.h
index 391135f9c6c1..392a46953112 100644
--- a/sound/soc/atmel/atmel_ssc_dai.h
+++ b/sound/soc/atmel/atmel_ssc_dai.h
@@ -116,6 +116,5 @@ struct atmel_ssc_info {
struct atmel_pcm_dma_params *dma_params[2];
struct atmel_ssc_state ssc_state;
};
-extern struct snd_soc_dai atmel_ssc_dai[];
#endif /* _AT91_SSC_DAI_H */
diff --git a/sound/soc/atmel/playpaq_wm8510.c b/sound/soc/atmel/playpaq_wm8510.c
index 9df4c68ef000..5f4e59f4461c 100644
--- a/sound/soc/atmel/playpaq_wm8510.c
+++ b/sound/soc/atmel/playpaq_wm8510.c
@@ -83,7 +83,7 @@ static struct ssc_clock_data playpaq_wm8510_calc_ssc_clock(
struct snd_pcm_hw_params *params,
struct snd_soc_dai *cpu_dai)
{
- struct at32_ssc_info *ssc_p = cpu_dai->private_data;
+ struct at32_ssc_info *ssc_p = snd_soc_dai_get_drvdata(cpu_dai);
struct ssc_device *ssc = ssc_p->ssc;
struct ssc_clock_data cd;
unsigned int rate, width_bits, channels;
@@ -131,9 +131,9 @@ static int playpaq_wm8510_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct at32_ssc_info *ssc_p = cpu_dai->private_data;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct at32_ssc_info *ssc_p = snd_soc_dai_get_drvdata(cpu_dai);
struct ssc_device *ssc = ssc_p->ssc;
unsigned int pll_out = 0, bclk = 0, mclk_div = 0;
int ret;
@@ -315,8 +315,9 @@ static const struct snd_soc_dapm_route intercon[] = {
-static int playpaq_wm8510_init(struct snd_soc_codec *codec)
+static int playpaq_wm8510_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int i;
/*
@@ -342,7 +343,7 @@ static int playpaq_wm8510_init(struct snd_soc_codec *codec)
/* Make CSB show PLL rate */
- snd_soc_dai_set_clkdiv(codec->dai, WM8510_OPCLKDIV,
+ snd_soc_dai_set_clkdiv(rtd->codec_dai, WM8510_OPCLKDIV,
WM8510_OPCLKDIV_1 | 4);
return 0;
@@ -353,8 +354,10 @@ static int playpaq_wm8510_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link playpaq_wm8510_dai = {
.name = "WM8510",
.stream_name = "WM8510 PCM",
- .cpu_dai = &at32_ssc_dai[0],
- .codec_dai = &wm8510_dai,
+ .cpu_dai_name= "atmel-ssc-dai.0",
+ .platform_name = "atmel-pcm-audio",
+ .codec_name = "wm8510-codec.0-0x1a",
+ .codec_dai_name = "wm8510-hifi",
.init = playpaq_wm8510_init,
.ops = &playpaq_wm8510_ops,
};
@@ -363,46 +366,16 @@ static struct snd_soc_dai_link playpaq_wm8510_dai = {
static struct snd_soc_card snd_soc_playpaq = {
.name = "LRS_PlayPaq_WM8510",
- .platform = &at32_soc_platform,
.dai_link = &playpaq_wm8510_dai,
.num_links = 1,
};
-
-
-static struct wm8510_setup_data playpaq_wm8510_setup = {
- .i2c_bus = 0,
- .i2c_address = 0x1a,
-};
-
-
-
-static struct snd_soc_device playpaq_wm8510_snd_devdata = {
- .card = &snd_soc_playpaq,
- .codec_dev = &soc_codec_dev_wm8510,
- .codec_data = &playpaq_wm8510_setup,
-};
-
static struct platform_device *playpaq_snd_device;
static int __init playpaq_asoc_init(void)
{
int ret = 0;
- struct at32_ssc_info *ssc_p = playpaq_wm8510_dai.cpu_dai->private_data;
- struct ssc_device *ssc = NULL;
-
-
- /*
- * Request SSC device
- */
- ssc = ssc_request(0);
- if (IS_ERR(ssc)) {
- ret = PTR_ERR(ssc);
- goto err_ssc;
- }
- ssc_p->ssc = ssc;
-
/*
* Configure MCLK for WM8510
@@ -439,8 +412,7 @@ static int __init playpaq_asoc_init(void)
goto err_device_alloc;
}
- platform_set_drvdata(playpaq_snd_device, &playpaq_wm8510_snd_devdata);
- playpaq_wm8510_snd_devdata.dev = &playpaq_snd_device->dev;
+ platform_set_drvdata(playpaq_snd_device, &snd_soc_playpaq);
ret = platform_device_add(playpaq_snd_device);
if (ret) {
@@ -468,25 +440,12 @@ err_pll0:
clk_put(_gclk0);
_gclk0 = NULL;
}
-err_gclk0:
- ssc_free(ssc);
-err_ssc:
return ret;
}
static void __exit playpaq_asoc_exit(void)
{
- struct at32_ssc_info *ssc_p = playpaq_wm8510_dai.cpu_dai->private_data;
- struct ssc_device *ssc;
-
- if (ssc_p != NULL) {
- ssc = ssc_p->ssc;
- if (ssc != NULL)
- ssc_free(ssc);
- ssc_p->ssc = NULL;
- }
-
if (_gclk0 != NULL) {
clk_put(_gclk0);
_gclk0 = NULL;
diff --git a/sound/soc/atmel/sam9g20_wm8731.c b/sound/soc/atmel/sam9g20_wm8731.c
index e028744c32ce..66a6f1879689 100644
--- a/sound/soc/atmel/sam9g20_wm8731.c
+++ b/sound/soc/atmel/sam9g20_wm8731.c
@@ -69,8 +69,8 @@ static int at91sam9g20ek_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* set codec DAI configuration */
@@ -136,9 +136,10 @@ static const struct snd_soc_dapm_route intercon[] = {
/*
* Logic for a wm8731 as connected on a at91sam9g20ek board.
*/
-static int at91sam9g20ek_wm8731_init(struct snd_soc_codec *codec)
+static int at91sam9g20ek_wm8731_init(struct snd_soc_pcm_runtime *rtd)
{
- struct snd_soc_dai *codec_dai = &codec->dai[0];
+ struct snd_soc_codec *codec = rtd->codec;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
int ret;
printk(KERN_DEBUG
@@ -179,31 +180,25 @@ static int at91sam9g20ek_wm8731_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link at91sam9g20ek_dai = {
.name = "WM8731",
.stream_name = "WM8731 PCM",
- .cpu_dai = &atmel_ssc_dai[0],
- .codec_dai = &wm8731_dai,
+ .cpu_dai_name = "atmel-ssc-dai.0",
+ .codec_dai_name = "wm8731-hifi",
.init = at91sam9g20ek_wm8731_init,
+ .platform_name = "atmel_pcm-audio",
+ .codec_name = "wm8731-codec.0-001a",
.ops = &at91sam9g20ek_ops,
};
static struct snd_soc_card snd_soc_at91sam9g20ek = {
.name = "AT91SAMG20-EK",
- .platform = &atmel_soc_platform,
.dai_link = &at91sam9g20ek_dai,
.num_links = 1,
.set_bias_level = at91sam9g20ek_set_bias_level,
};
-static struct snd_soc_device at91sam9g20ek_snd_devdata = {
- .card = &snd_soc_at91sam9g20ek,
- .codec_dev = &soc_codec_dev_wm8731,
-};
-
static struct platform_device *at91sam9g20ek_snd_device;
static int __init at91sam9g20ek_init(void)
{
- struct atmel_ssc_info *ssc_p = at91sam9g20ek_dai.cpu_dai->private_data;
- struct ssc_device *ssc = NULL;
struct clk *pllb;
int ret;
@@ -235,18 +230,6 @@ static int __init at91sam9g20ek_init(void)
clk_set_rate(mclk, MCLK_RATE);
- /*
- * Request SSC device
- */
- ssc = ssc_request(0);
- if (IS_ERR(ssc)) {
- printk(KERN_ERR "ASoC: Failed to request SSC 0\n");
- ret = PTR_ERR(ssc);
- ssc = NULL;
- goto err_ssc;
- }
- ssc_p->ssc = ssc;
-
at91sam9g20ek_snd_device = platform_device_alloc("soc-audio", -1);
if (!at91sam9g20ek_snd_device) {
printk(KERN_ERR "ASoC: Platform device allocation failed\n");
@@ -254,8 +237,7 @@ static int __init at91sam9g20ek_init(void)
}
platform_set_drvdata(at91sam9g20ek_snd_device,
- &at91sam9g20ek_snd_devdata);
- at91sam9g20ek_snd_devdata.dev = &at91sam9g20ek_snd_device->dev;
+ &snd_soc_at91sam9g20ek);
ret = platform_device_add(at91sam9g20ek_snd_device);
if (ret) {
@@ -265,9 +247,6 @@ static int __init at91sam9g20ek_init(void)
return ret;
-err_ssc:
- ssc_free(ssc);
- ssc_p->ssc = NULL;
err_mclk:
clk_put(mclk);
mclk = NULL;
@@ -277,16 +256,6 @@ err:
static void __exit at91sam9g20ek_exit(void)
{
- struct atmel_ssc_info *ssc_p = at91sam9g20ek_dai.cpu_dai->private_data;
- struct ssc_device *ssc;
-
- if (ssc_p != NULL) {
- ssc = ssc_p->ssc;
- if (ssc != NULL)
- ssc_free(ssc);
- ssc_p->ssc = NULL;
- }
-
platform_device_unregister(at91sam9g20ek_snd_device);
at91sam9g20ek_snd_device = NULL;
clk_put(mclk);
diff --git a/sound/soc/atmel/snd-soc-afeb9260.c b/sound/soc/atmel/snd-soc-afeb9260.c
index 23349de27313..e3d283561c19 100644
--- a/sound/soc/atmel/snd-soc-afeb9260.c
+++ b/sound/soc/atmel/snd-soc-afeb9260.c
@@ -46,8 +46,8 @@ static int afeb9260_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int err;
/* Set codec DAI configuration */
@@ -102,8 +102,9 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"MICIN", NULL, "Mic Jack"},
};
-static int afeb9260_tlv320aic23_init(struct snd_soc_codec *codec)
+static int afeb9260_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
/* Add afeb9260 specific widgets */
snd_soc_dapm_new_controls(codec, tlv320aic23_dapm_widgets,
@@ -125,8 +126,10 @@ static int afeb9260_tlv320aic23_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link afeb9260_dai = {
.name = "TLV320AIC23",
.stream_name = "AIC23",
- .cpu_dai = &atmel_ssc_dai[0],
- .codec_dai = &tlv320aic23_dai,
+ .cpu_dai_name = "atmel-ssc-dai.0",
+ .codec_dai_name = "tlv320aic23-hifi",
+ .platform_name = "atmel_pcm-audio",
+ .codec_name = "tlv320aic23-codec.0-0x1a",
.init = afeb9260_tlv320aic23_init,
.ops = &afeb9260_ops,
};
@@ -134,37 +137,20 @@ static struct snd_soc_dai_link afeb9260_dai = {
/* Audio machine driver */
static struct snd_soc_card snd_soc_machine_afeb9260 = {
.name = "AFEB9260",
- .platform = &atmel_soc_platform,
.dai_link = &afeb9260_dai,
.num_links = 1,
};
-/* Audio subsystem */
-static struct snd_soc_device afeb9260_snd_devdata = {
- .card = &snd_soc_machine_afeb9260,
- .codec_dev = &soc_codec_dev_tlv320aic23,
-};
-
static struct platform_device *afeb9260_snd_device;
static int __init afeb9260_soc_init(void)
{
int err;
struct device *dev;
- struct atmel_ssc_info *ssc_p = afeb9260_dai.cpu_dai->private_data;
- struct ssc_device *ssc = NULL;
if (!(machine_is_afeb9260()))
return -ENODEV;
- ssc = ssc_request(0);
- if (IS_ERR(ssc)) {
- printk(KERN_ERR "ASoC: Failed to request SSC 0\n");
- err = PTR_ERR(ssc);
- ssc = NULL;
- goto err_ssc;
- }
- ssc_p->ssc = ssc;
afeb9260_snd_device = platform_device_alloc("soc-audio", -1);
if (!afeb9260_snd_device) {
@@ -172,8 +158,7 @@ static int __init afeb9260_soc_init(void)
return -ENOMEM;
}
- platform_set_drvdata(afeb9260_snd_device, &afeb9260_snd_devdata);
- afeb9260_snd_devdata.dev = &afeb9260_snd_device->dev;
+ platform_set_drvdata(afeb9260_snd_device, &snd_soc_machine_afeb9260);
err = platform_device_add(afeb9260_snd_device);
if (err)
goto err1;
@@ -184,9 +169,7 @@ static int __init afeb9260_soc_init(void)
err1:
platform_device_del(afeb9260_snd_device);
platform_device_put(afeb9260_snd_device);
-err_ssc:
return err;
-
}
static void __exit afeb9260_soc_exit(void)
diff --git a/sound/soc/au1x/db1200.c b/sound/soc/au1x/db1200.c
index cdf7be1b9b91..8780c90107fc 100644
--- a/sound/soc/au1x/db1200.c
+++ b/sound/soc/au1x/db1200.c
@@ -19,7 +19,6 @@
#include <asm/mach-au1x00/au1xxx_dbdma.h>
#include <asm/mach-db1x00/bcsr.h>
-#include "../codecs/ac97.h"
#include "../codecs/wm8731.h"
#include "psc.h"
@@ -28,20 +27,16 @@
static struct snd_soc_dai_link db1200_ac97_dai = {
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &au1xpsc_ac97_dai,
- .codec_dai = &ac97_dai,
+ .cpu_dai_name = "au1xpsc-ac97",
+ .codec_dai_name = "ac97-hifi",
+ .platform_name = "au1xpsc-pcm-audio",
+ .codec_name = "ac97-codec",
};
static struct snd_soc_card db1200_ac97_machine = {
.name = "DB1200_AC97",
.dai_link = &db1200_ac97_dai,
.num_links = 1,
- .platform = &au1xpsc_soc_platform,
-};
-
-static struct snd_soc_device db1200_ac97_devdata = {
- .card = &db1200_ac97_machine,
- .codec_dev = &soc_codec_dev_ac97,
};
/*------------------------- I2S PART ---------------------------*/
@@ -49,8 +44,8 @@ static struct snd_soc_device db1200_ac97_devdata = {
static int db1200_i2s_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* WM8731 has its own 12MHz crystal */
@@ -80,8 +75,10 @@ static struct snd_soc_ops db1200_i2s_wm8731_ops = {
static struct snd_soc_dai_link db1200_i2s_dai = {
.name = "WM8731",
.stream_name = "WM8731 PCM",
- .cpu_dai = &au1xpsc_i2s_dai,
- .codec_dai = &wm8731_dai,
+ .cpu_dai_name = "au1xpsc",
+ .codec_dai_name = "wm8731-hifi"
+ .platform_name = "au1xpsc-pcm-audio",
+ .codec_name = "wm8731-codec.0-001a",
.ops = &db1200_i2s_wm8731_ops,
};
@@ -89,12 +86,6 @@ static struct snd_soc_card db1200_i2s_machine = {
.name = "DB1200_I2S",
.dai_link = &db1200_i2s_dai,
.num_links = 1,
- .platform = &au1xpsc_soc_platform,
-};
-
-static struct snd_soc_device db1200_i2s_devdata = {
- .card = &db1200_i2s_machine,
- .codec_dev = &soc_codec_dev_wm8731,
};
/*------------------------- COMMON PART ---------------------------*/
@@ -112,12 +103,10 @@ static int __init db1200_audio_load(void)
/* DB1200 board setup set PSC1MUX to preferred audio device */
if (bcsr_read(BCSR_RESETS) & BCSR_RESETS_PSC1MUX)
- platform_set_drvdata(db1200_asoc_dev, &db1200_i2s_devdata);
+ platform_set_drvdata(db1200_asoc_dev, &db1200_i2s_machine);
else
- platform_set_drvdata(db1200_asoc_dev, &db1200_ac97_devdata);
+ platform_set_drvdata(db1200_asoc_dev, &db1200_ac97_machine);
- db1200_ac97_devdata.dev = &db1200_asoc_dev->dev;
- db1200_i2s_devdata.dev = &db1200_asoc_dev->dev;
ret = platform_device_add(db1200_asoc_dev);
if (ret) {
diff --git a/sound/soc/au1x/dbdma2.c b/sound/soc/au1x/dbdma2.c
index 6d9f4c624949..00fdb9cbfc2d 100644
--- a/sound/soc/au1x/dbdma2.c
+++ b/sound/soc/au1x/dbdma2.c
@@ -329,7 +329,7 @@ static int au1xpsc_pcm_new(struct snd_card *card,
return 0;
}
-static int au1xpsc_pcm_probe(struct platform_device *pdev)
+static int au1xpsc_pcm_probe(struct snd_soc_platform *platform)
{
if (!au1xpsc_audio_pcmdma[PCM_TX] || !au1xpsc_audio_pcmdma[PCM_RX])
return -ENODEV;
@@ -337,17 +337,10 @@ static int au1xpsc_pcm_probe(struct platform_device *pdev)
return 0;
}
-static int au1xpsc_pcm_remove(struct platform_device *pdev)
-{
- return 0;
-}
-
/* au1xpsc audio platform */
-struct snd_soc_platform au1xpsc_soc_platform = {
- .name = "au1xpsc-pcm-dbdma",
+struct snd_soc_platform_driver au1xpsc_soc_platform = {
.probe = au1xpsc_pcm_probe,
- .remove = au1xpsc_pcm_remove,
- .pcm_ops = &au1xpsc_pcm_ops,
+ .ops = &au1xpsc_pcm_ops,
.pcm_new = au1xpsc_pcm_new,
.pcm_free = au1xpsc_pcm_free_dma_buffers,
};
@@ -387,7 +380,7 @@ static int __devinit au1xpsc_pcm_drvprobe(struct platform_device *pdev)
}
(au1xpsc_audio_pcmdma[PCM_RX])->ddma_id = r->start;
- ret = snd_soc_register_platform(&au1xpsc_soc_platform);
+ ret = snd_soc_register_platform(&pdev->dev, &au1xpsc_soc_platform);
if (!ret)
return ret;
@@ -404,7 +397,7 @@ static int __devexit au1xpsc_pcm_drvremove(struct platform_device *pdev)
{
int i;
- snd_soc_unregister_platform(&au1xpsc_soc_platform);
+ snd_soc_unregister_platform(&pdev->dev);
for (i = 0; i < 2; i++) {
if (au1xpsc_audio_pcmdma[i]) {
@@ -419,7 +412,7 @@ static int __devexit au1xpsc_pcm_drvremove(struct platform_device *pdev)
static struct platform_driver au1xpsc_pcm_driver = {
.driver = {
- .name = "au1xpsc-pcm",
+ .name = "au1xpsc-pcm-audio",
.owner = THIS_MODULE,
},
.probe = au1xpsc_pcm_drvprobe,
diff --git a/sound/soc/au1x/psc-ac97.c b/sound/soc/au1x/psc-ac97.c
index d14a5a91a465..6a9516cbe424 100644
--- a/sound/soc/au1x/psc-ac97.c
+++ b/sound/soc/au1x/psc-ac97.c
@@ -315,27 +315,19 @@ static int au1xpsc_ac97_trigger(struct snd_pcm_substream *substream,
return ret;
}
-static int au1xpsc_ac97_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int au1xpsc_ac97_probe(struct snd_soc_dai *dai)
{
return au1xpsc_ac97_workdata ? 0 : -ENODEV;
}
-static void au1xpsc_ac97_remove(struct platform_device *pdev,
- struct snd_soc_dai *dai)
-{
-}
-
static struct snd_soc_dai_ops au1xpsc_ac97_dai_ops = {
.trigger = au1xpsc_ac97_trigger,
.hw_params = au1xpsc_ac97_hw_params,
};
-struct snd_soc_dai au1xpsc_ac97_dai = {
- .name = "au1xpsc_ac97",
+struct snd_soc_dai_driver au1xpsc_ac97_dai = {
.ac97_control = 1,
.probe = au1xpsc_ac97_probe,
- .remove = au1xpsc_ac97_remove,
.playback = {
.rates = AC97_RATES,
.formats = AC97_FMTS,
@@ -395,7 +387,7 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev)
au_writel(PSC_SEL_PS_AC97MODE | sel, PSC_SEL(wd));
au_sync();
- ret = snd_soc_register_dai(&au1xpsc_ac97_dai);
+ ret = snd_soc_register_dai(&pdev->dev, &au1xpsc_ac97_dai);
if (ret)
goto out1;
@@ -406,7 +398,7 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev)
return 0;
}
- snd_soc_unregister_dai(&au1xpsc_ac97_dai);
+ snd_soc_unregister_dai(&pdev->dev);
out1:
release_mem_region(r->start, resource_size(r));
out0:
@@ -422,7 +414,7 @@ static int __devexit au1xpsc_ac97_drvremove(struct platform_device *pdev)
if (wd->dmapd)
au1xpsc_pcm_destroy(wd->dmapd);
- snd_soc_unregister_dai(&au1xpsc_ac97_dai);
+ snd_soc_unregister_dai(&pdev->dev);
/* disable PSC completely */
au_writel(0, AC97_CFG(wd));
@@ -485,7 +477,7 @@ static struct dev_pm_ops au1xpscac97_pmops = {
static struct platform_driver au1xpsc_ac97_driver = {
.driver = {
- .name = "au1xpsc_ac97",
+ .name = "au1xpsc-ac97",
.owner = THIS_MODULE,
.pm = AU1XPSCAC97_PMOPS,
},
diff --git a/sound/soc/au1x/psc-i2s.c b/sound/soc/au1x/psc-i2s.c
index 6083fe7799fa..94e560a8756d 100644
--- a/sound/soc/au1x/psc-i2s.c
+++ b/sound/soc/au1x/psc-i2s.c
@@ -263,27 +263,19 @@ static int au1xpsc_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
return ret;
}
-static int au1xpsc_i2s_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int au1xpsc_i2s_probe(struct snd_soc_dai *dai)
{
return au1xpsc_i2s_workdata ? 0 : -ENODEV;
}
-static void au1xpsc_i2s_remove(struct platform_device *pdev,
- struct snd_soc_dai *dai)
-{
-}
-
static struct snd_soc_dai_ops au1xpsc_i2s_dai_ops = {
.trigger = au1xpsc_i2s_trigger,
.hw_params = au1xpsc_i2s_hw_params,
.set_fmt = au1xpsc_i2s_set_fmt,
};
-struct snd_soc_dai au1xpsc_i2s_dai = {
- .name = "au1xpsc_i2s",
+static struct snd_soc_dai_driver au1xpsc_i2s_dai = {
.probe = au1xpsc_i2s_probe,
- .remove = au1xpsc_i2s_remove,
.playback = {
.rates = AU1XPSC_I2S_RATES,
.formats = AU1XPSC_I2S_FMTS,
@@ -298,7 +290,6 @@ struct snd_soc_dai au1xpsc_i2s_dai = {
},
.ops = &au1xpsc_i2s_dai_ops,
};
-EXPORT_SYMBOL(au1xpsc_i2s_dai);
static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev)
{
@@ -346,7 +337,7 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev)
* time out.
*/
- ret = snd_soc_register_dai(&au1xpsc_i2s_dai);
+ ret = snd_soc_register_dai(&pdev->dev, &au1xpsc_i2s_dai);
if (ret)
goto out1;
@@ -358,7 +349,7 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev)
return 0;
}
- snd_soc_unregister_dai(&au1xpsc_i2s_dai);
+ snd_soc_unregister_dai(&pdev->dev);
out1:
release_mem_region(r->start, resource_size(r));
out0:
@@ -374,7 +365,7 @@ static int __devexit au1xpsc_i2s_drvremove(struct platform_device *pdev)
if (wd->dmapd)
au1xpsc_pcm_destroy(wd->dmapd);
- snd_soc_unregister_dai(&au1xpsc_i2s_dai);
+ snd_soc_unregister_dai(&pdev->dev);
au_writel(0, I2S_CFG(wd));
au_sync();
@@ -436,7 +427,7 @@ static struct dev_pm_ops au1xpsci2s_pmops = {
static struct platform_driver au1xpsc_i2s_driver = {
.driver = {
- .name = "au1xpsc_i2s",
+ .name = "au1xpsc",
.owner = THIS_MODULE,
.pm = AU1XPSCI2S_PMOPS,
},
diff --git a/sound/soc/au1x/psc.h b/sound/soc/au1x/psc.h
index 093775d4dc3e..f281443fd52f 100644
--- a/sound/soc/au1x/psc.h
+++ b/sound/soc/au1x/psc.h
@@ -16,9 +16,6 @@
#ifndef _AU1X_PCM_H
#define _AU1X_PCM_H
-extern struct snd_soc_dai au1xpsc_ac97_dai;
-extern struct snd_soc_dai au1xpsc_i2s_dai;
-extern struct snd_soc_platform au1xpsc_soc_platform;
extern struct snd_ac97_bus_ops soc_ac97_ops;
/* DBDMA helpers */
diff --git a/sound/soc/blackfin/bf5xx-ac97-pcm.c b/sound/soc/blackfin/bf5xx-ac97-pcm.c
index 5e7aacf3bb5a..5a2fd8abaefa 100644
--- a/sound/soc/blackfin/bf5xx-ac97-pcm.c
+++ b/sound/soc/blackfin/bf5xx-ac97-pcm.c
@@ -422,14 +422,14 @@ int bf5xx_pcm_ac97_new(struct snd_card *card, struct snd_soc_dai *dai,
if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
ret = bf5xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK);
if (ret)
goto out;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
ret = bf5xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE);
if (ret)
@@ -439,25 +439,44 @@ int bf5xx_pcm_ac97_new(struct snd_card *card, struct snd_soc_dai *dai,
return ret;
}
-struct snd_soc_platform bf5xx_ac97_soc_platform = {
- .name = "bf5xx-audio",
- .pcm_ops = &bf5xx_pcm_ac97_ops,
+static struct snd_soc_platform_driver bf5xx_ac97_soc_platform = {
+ .ops = &bf5xx_pcm_ac97_ops,
.pcm_new = bf5xx_pcm_ac97_new,
.pcm_free = bf5xx_pcm_free_dma_buffers,
};
-EXPORT_SYMBOL_GPL(bf5xx_ac97_soc_platform);
-static int __init bfin_ac97_init(void)
+static int __devinit bf5xx_soc_platform_probe(struct platform_device *pdev)
{
- return snd_soc_register_platform(&bf5xx_ac97_soc_platform);
+ return snd_soc_register_platform(&pdev->dev, &bf5xx_ac97_soc_platform);
}
-module_init(bfin_ac97_init);
-static void __exit bfin_ac97_exit(void)
+static int __devexit bf5xx_soc_platform_remove(struct platform_device *pdev)
{
- snd_soc_unregister_platform(&bf5xx_ac97_soc_platform);
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver bf5xx_pcm_driver = {
+ .driver = {
+ .name = "bf5xx-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = bf5xx_soc_platform_probe,
+ .remove = __devexit_p(bf5xx_soc_platform_remove),
+};
+
+static int __init snd_bf5xx_pcm_init(void)
+{
+ return platform_driver_register(&bf5xx_pcm_driver);
+}
+module_init(snd_bf5xx_pcm_init);
+
+static void __exit snd_bf5xx_pcm_exit(void)
+{
+ platform_driver_unregister(&bf5xx_pcm_driver);
}
-module_exit(bfin_ac97_exit);
+module_exit(snd_bf5xx_pcm_exit);
MODULE_AUTHOR("Cliff Cai");
MODULE_DESCRIPTION("ADI Blackfin AC97 PCM DMA module");
diff --git a/sound/soc/blackfin/bf5xx-ac97-pcm.h b/sound/soc/blackfin/bf5xx-ac97-pcm.h
index 350125a0ae21..d324d5826a9b 100644
--- a/sound/soc/blackfin/bf5xx-ac97-pcm.h
+++ b/sound/soc/blackfin/bf5xx-ac97-pcm.h
@@ -23,7 +23,4 @@ struct bf5xx_gpio {
u32 frm;
};
-/* platform data */
-extern struct snd_soc_platform bf5xx_ac97_soc_platform;
-
#endif
diff --git a/sound/soc/blackfin/bf5xx-ac97.c b/sound/soc/blackfin/bf5xx-ac97.c
index c0eba5109980..c5f856ec27ca 100644
--- a/sound/soc/blackfin/bf5xx-ac97.c
+++ b/sound/soc/blackfin/bf5xx-ac97.c
@@ -255,7 +255,7 @@ EXPORT_SYMBOL_GPL(soc_ac97_ops);
#ifdef CONFIG_PM
static int bf5xx_ac97_suspend(struct snd_soc_dai *dai)
{
- struct sport_device *sport = dai->private_data;
+ struct sport_device *sport = snd_soc_dai_get_drvdata(dai);
pr_debug("%s : sport %d\n", __func__, dai->id);
if (!dai->active)
@@ -270,7 +270,7 @@ static int bf5xx_ac97_suspend(struct snd_soc_dai *dai)
static int bf5xx_ac97_resume(struct snd_soc_dai *dai)
{
int ret;
- struct sport_device *sport = dai->private_data;
+ struct sport_device *sport = snd_soc_dai_get_drvdata(dai);
pr_debug("%s : sport %d\n", __func__, dai->id);
if (!dai->active)
@@ -306,8 +306,7 @@ static int bf5xx_ac97_resume(struct snd_soc_dai *dai)
#define bf5xx_ac97_resume NULL
#endif
-static int bf5xx_ac97_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int bf5xx_ac97_probe(struct snd_soc_dai *dai)
{
int ret = 0;
cmd_count = (int *)get_zeroed_page(GFP_KERNEL);
@@ -379,8 +378,7 @@ peripheral_err:
return ret;
}
-static void bf5xx_ac97_remove(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int bf5xx_ac97_remove(struct snd_soc_dai *dai)
{
free_page((unsigned long)cmd_count);
cmd_count = NULL;
@@ -388,11 +386,10 @@ static void bf5xx_ac97_remove(struct platform_device *pdev,
#ifdef CONFIG_SND_BF5XX_HAVE_COLD_RESET
gpio_free(CONFIG_SND_BF5XX_RESET_GPIO_NUM);
#endif
+ return 0;
}
-struct snd_soc_dai bfin_ac97_dai = {
- .name = "bf5xx-ac97",
- .id = 0,
+struct snd_soc_dai_driver bfin_ac97_dai = {
.ac97_control = 1,
.probe = bf5xx_ac97_probe,
.remove = bf5xx_ac97_remove,
@@ -417,18 +414,40 @@ struct snd_soc_dai bfin_ac97_dai = {
};
EXPORT_SYMBOL_GPL(bfin_ac97_dai);
+static __devinit int asoc_bfin_ac97_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_dai(&pdev->dev, &bfin_ac97_dai);
+}
+
+static int __devexit asoc_bfin_ac97_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_dai(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver asoc_bfin_ac97_driver = {
+ .driver = {
+ .name = "bfin-ac97",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = asoc_bfin_ac97_probe,
+ .remove = __devexit_p(asoc_bfin_ac97_remove),
+};
+
static int __init bfin_ac97_init(void)
{
- return snd_soc_register_dai(&bfin_ac97_dai);
+ return platform_driver_register(&asoc_bfin_ac97_driver);
}
module_init(bfin_ac97_init);
static void __exit bfin_ac97_exit(void)
{
- snd_soc_unregister_dai(&bfin_ac97_dai);
+ platform_driver_unregister(&asoc_bfin_ac97_driver);
}
module_exit(bfin_ac97_exit);
+
MODULE_AUTHOR("Roy Huang");
MODULE_DESCRIPTION("AC97 driver for ADI Blackfin");
MODULE_LICENSE("GPL");
diff --git a/sound/soc/blackfin/bf5xx-ac97.h b/sound/soc/blackfin/bf5xx-ac97.h
index a1f97dd809d6..15c635e33f4d 100644
--- a/sound/soc/blackfin/bf5xx-ac97.h
+++ b/sound/soc/blackfin/bf5xx-ac97.h
@@ -50,8 +50,6 @@ struct ac97_frame {
#define TAG_PCM_SR 0x0080
#define TAG_PCM_LFE 0x0040
-extern struct snd_soc_dai bfin_ac97_dai;
-
void bf5xx_pcm_to_ac97(struct ac97_frame *dst, const __u16 *src, \
size_t count, unsigned int chan_mask);
diff --git a/sound/soc/blackfin/bf5xx-ad1836.c b/sound/soc/blackfin/bf5xx-ad1836.c
index 0f45a3f56be8..2394bff2b655 100644
--- a/sound/soc/blackfin/bf5xx-ad1836.c
+++ b/sound/soc/blackfin/bf5xx-ad1836.c
@@ -40,9 +40,9 @@ static struct snd_soc_card bf5xx_ad1836;
static int bf5xx_ad1836_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
- cpu_dai->private_data = sport_handle;
+ snd_soc_dai_set_drvdata(cpu_dai, sport_handle);
return 0;
}
@@ -50,8 +50,8 @@ static int bf5xx_ad1836_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
unsigned int channel_map[] = {0, 4, 1, 5, 2, 6, 3, 7};
int ret = 0;
/* set cpu DAI configuration */
@@ -83,23 +83,19 @@ static struct snd_soc_ops bf5xx_ad1836_ops = {
static struct snd_soc_dai_link bf5xx_ad1836_dai = {
.name = "ad1836",
.stream_name = "AD1836",
- .cpu_dai = &bf5xx_tdm_dai,
- .codec_dai = &ad1836_dai,
+ .cpu_dai_name = "bf5xx-tdm",
+ .codec_dai_name = "ad1836-hifi",
+ .platform_name = "bf5xx-tdm-pcm-audio",
+ .codec_name = "ad1836-codec.0",
.ops = &bf5xx_ad1836_ops,
};
static struct snd_soc_card bf5xx_ad1836 = {
.name = "bf5xx_ad1836",
- .platform = &bf5xx_tdm_soc_platform,
.dai_link = &bf5xx_ad1836_dai,
.num_links = 1,
};
-static struct snd_soc_device bf5xx_ad1836_snd_devdata = {
- .card = &bf5xx_ad1836,
- .codec_dev = &soc_codec_dev_ad1836,
-};
-
static struct platform_device *bfxx_ad1836_snd_device;
static int __init bf5xx_ad1836_init(void)
@@ -110,8 +106,7 @@ static int __init bf5xx_ad1836_init(void)
if (!bfxx_ad1836_snd_device)
return -ENOMEM;
- platform_set_drvdata(bfxx_ad1836_snd_device, &bf5xx_ad1836_snd_devdata);
- bf5xx_ad1836_snd_devdata.dev = &bfxx_ad1836_snd_device->dev;
+ platform_set_drvdata(bfxx_ad1836_snd_device, &bf5xx_ad1836);
ret = platform_device_add(bfxx_ad1836_snd_device);
if (ret)
diff --git a/sound/soc/blackfin/bf5xx-ad193x.c b/sound/soc/blackfin/bf5xx-ad193x.c
index b8c9060cfd8e..e4a625317a1a 100644
--- a/sound/soc/blackfin/bf5xx-ad193x.c
+++ b/sound/soc/blackfin/bf5xx-ad193x.c
@@ -49,9 +49,9 @@ static struct snd_soc_card bf5xx_ad193x;
static int bf5xx_ad193x_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
- cpu_dai->private_data = sport_handle;
+ snd_soc_dai_set_drvdata(cpu_dai, sport_handle);
return 0;
}
@@ -59,8 +59,8 @@ static int bf5xx_ad193x_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
unsigned int channel_map[] = {0, 1, 2, 3, 4, 5, 6, 7};
int ret = 0;
/* set cpu DAI configuration */
@@ -97,23 +97,19 @@ static struct snd_soc_ops bf5xx_ad193x_ops = {
static struct snd_soc_dai_link bf5xx_ad193x_dai = {
.name = "ad193x",
.stream_name = "AD193X",
- .cpu_dai = &bf5xx_tdm_dai,
- .codec_dai = &ad193x_dai,
+ .cpu_dai_name = "bf5xx-tdm",
+ .codec_dai_name ="ad193x-hifi",
+ .platform_name = "bf5xx-tdm-pcm-audio",
+ .codec_name = "ad193x-codec.5",
.ops = &bf5xx_ad193x_ops,
};
static struct snd_soc_card bf5xx_ad193x = {
.name = "bf5xx_ad193x",
- .platform = &bf5xx_tdm_soc_platform,
.dai_link = &bf5xx_ad193x_dai,
.num_links = 1,
};
-static struct snd_soc_device bf5xx_ad193x_snd_devdata = {
- .card = &bf5xx_ad193x,
- .codec_dev = &soc_codec_dev_ad193x,
-};
-
static struct platform_device *bfxx_ad193x_snd_device;
static int __init bf5xx_ad193x_init(void)
@@ -124,8 +120,7 @@ static int __init bf5xx_ad193x_init(void)
if (!bfxx_ad193x_snd_device)
return -ENOMEM;
- platform_set_drvdata(bfxx_ad193x_snd_device, &bf5xx_ad193x_snd_devdata);
- bf5xx_ad193x_snd_devdata.dev = &bfxx_ad193x_snd_device->dev;
+ platform_set_drvdata(bfxx_ad193x_snd_device, &bf5xx_ad193x);
ret = platform_device_add(bfxx_ad193x_snd_device);
if (ret)
diff --git a/sound/soc/blackfin/bf5xx-ad1980.c b/sound/soc/blackfin/bf5xx-ad1980.c
index 92f7c327bb7a..d57c9c9c9883 100644
--- a/sound/soc/blackfin/bf5xx-ad1980.c
+++ b/sound/soc/blackfin/bf5xx-ad1980.c
@@ -56,10 +56,10 @@ static struct snd_soc_card bf5xx_board;
static int bf5xx_board_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
pr_debug("%s enter\n", __func__);
- cpu_dai->private_data = sport_handle;
+ snd_soc_dai_set_drvdata(cpu_dai, sport_handle);
return 0;
}
@@ -70,23 +70,19 @@ static struct snd_soc_ops bf5xx_board_ops = {
static struct snd_soc_dai_link bf5xx_board_dai = {
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &bfin_ac97_dai,
- .codec_dai = &ad1980_dai,
+ .cpu_dai_name = "bfin-ac97",
+ .codec_dai_name = "ad1980-hifi",
+ .platform_name = "bfin-pcm-audio",
+ .codec_name = "ad1980-codec",
.ops = &bf5xx_board_ops,
};
static struct snd_soc_card bf5xx_board = {
.name = "bf5xx-board",
- .platform = &bf5xx_ac97_soc_platform,
.dai_link = &bf5xx_board_dai,
.num_links = 1,
};
-static struct snd_soc_device bf5xx_board_snd_devdata = {
- .card = &bf5xx_board,
- .codec_dev = &soc_codec_dev_ad1980,
-};
-
static struct platform_device *bf5xx_board_snd_device;
static int __init bf5xx_board_init(void)
@@ -97,8 +93,7 @@ static int __init bf5xx_board_init(void)
if (!bf5xx_board_snd_device)
return -ENOMEM;
- platform_set_drvdata(bf5xx_board_snd_device, &bf5xx_board_snd_devdata);
- bf5xx_board_snd_devdata.dev = &bf5xx_board_snd_device->dev;
+ platform_set_drvdata(bf5xx_board_snd_device, &bf5xx_board);
ret = platform_device_add(bf5xx_board_snd_device);
if (ret)
diff --git a/sound/soc/blackfin/bf5xx-ad73311.c b/sound/soc/blackfin/bf5xx-ad73311.c
index 9825b71d0e28..900ced54ac79 100644
--- a/sound/soc/blackfin/bf5xx-ad73311.c
+++ b/sound/soc/blackfin/bf5xx-ad73311.c
@@ -47,7 +47,6 @@
#include "../codecs/ad73311.h"
#include "bf5xx-sport.h"
#include "bf5xx-i2s-pcm.h"
-#include "bf5xx-i2s.h"
#if CONFIG_SND_BF5XX_SPORT_NUM == 0
#define bfin_write_SPORT_TCR1 bfin_write_SPORT0_TCR1
@@ -150,10 +149,10 @@ static int bf5xx_probe(struct platform_device *pdev)
static int bf5xx_ad73311_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
pr_debug("%s enter\n", __func__);
- cpu_dai->private_data = sport_handle;
+ snd_soc_dai_set_drvdata(cpu_dai, sport_handle);
return 0;
}
@@ -161,7 +160,7 @@ static int bf5xx_ad73311_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret = 0;
pr_debug("%s rate %d format %x\n", __func__, params_rate(params),
@@ -185,24 +184,20 @@ static struct snd_soc_ops bf5xx_ad73311_ops = {
static struct snd_soc_dai_link bf5xx_ad73311_dai = {
.name = "ad73311",
.stream_name = "AD73311",
- .cpu_dai = &bf5xx_i2s_dai,
- .codec_dai = &ad73311_dai,
+ .cpu_dai_name = "bf5xx-i2s",
+ .codec_dai_name = "ad73311-hifi",
+ .platform_name = "bfin-pcm-audio",
+ .codec_name = "ad73311-codec",
.ops = &bf5xx_ad73311_ops,
};
static struct snd_soc_card bf5xx_ad73311 = {
.name = "bf5xx_ad73311",
- .platform = &bf5xx_i2s_soc_platform,
.probe = bf5xx_probe,
.dai_link = &bf5xx_ad73311_dai,
.num_links = 1,
};
-static struct snd_soc_device bf5xx_ad73311_snd_devdata = {
- .card = &bf5xx_ad73311,
- .codec_dev = &soc_codec_dev_ad73311,
-};
-
static struct platform_device *bf5xx_ad73311_snd_device;
static int __init bf5xx_ad73311_init(void)
@@ -214,8 +209,7 @@ static int __init bf5xx_ad73311_init(void)
if (!bf5xx_ad73311_snd_device)
return -ENOMEM;
- platform_set_drvdata(bf5xx_ad73311_snd_device, &bf5xx_ad73311_snd_devdata);
- bf5xx_ad73311_snd_devdata.dev = &bf5xx_ad73311_snd_device->dev;
+ platform_set_drvdata(bf5xx_ad73311_snd_device, &bf5xx_ad73311);
ret = platform_device_add(bf5xx_ad73311_snd_device);
if (ret)
diff --git a/sound/soc/blackfin/bf5xx-i2s-pcm.c b/sound/soc/blackfin/bf5xx-i2s-pcm.c
index 1d2a1adf2575..890a0dccf902 100644
--- a/sound/soc/blackfin/bf5xx-i2s-pcm.c
+++ b/sound/soc/blackfin/bf5xx-i2s-pcm.c
@@ -40,7 +40,6 @@
#include <asm/dma.h>
#include "bf5xx-i2s-pcm.h"
-#include "bf5xx-i2s.h"
#include "bf5xx-sport.h"
static void bf5xx_dma_irq(void *data)
@@ -257,14 +256,14 @@ int bf5xx_pcm_i2s_new(struct snd_card *card, struct snd_soc_dai *dai,
if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
ret = bf5xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK);
if (ret)
goto out;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
ret = bf5xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE);
if (ret)
@@ -274,25 +273,44 @@ int bf5xx_pcm_i2s_new(struct snd_card *card, struct snd_soc_dai *dai,
return ret;
}
-struct snd_soc_platform bf5xx_i2s_soc_platform = {
- .name = "bf5xx-audio",
- .pcm_ops = &bf5xx_pcm_i2s_ops,
+static struct snd_soc_platform_driver bf5xx_i2s_soc_platform = {
+ .ops = &bf5xx_pcm_i2s_ops,
.pcm_new = bf5xx_pcm_i2s_new,
.pcm_free = bf5xx_pcm_free_dma_buffers,
};
-EXPORT_SYMBOL_GPL(bf5xx_i2s_soc_platform);
-static int __init bfin_i2s_init(void)
+static int __devinit bfin_i2s_soc_platform_probe(struct platform_device *pdev)
{
- return snd_soc_register_platform(&bf5xx_i2s_soc_platform);
+ return snd_soc_register_platform(&pdev->dev, &bf5xx_i2s_soc_platform);
}
-module_init(bfin_i2s_init);
-static void __exit bfin_i2s_exit(void)
+static int __devexit bfin_i2s_soc_platform_remove(struct platform_device *pdev)
{
- snd_soc_unregister_platform(&bf5xx_i2s_soc_platform);
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver bfin_i2s_pcm_driver = {
+ .driver = {
+ .name = "bfin-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = bfin_i2s_soc_platform_probe,
+ .remove = __devexit_p(bfin_i2s_soc_platform_remove),
+};
+
+static int __init snd_bfin_i2s_pcm_init(void)
+{
+ return platform_driver_register(&bfin_i2s_pcm_driver);
+}
+module_init(snd_bfin_i2s_pcm_init);
+
+static void __exit snd_bfin_i2s_pcm_exit(void)
+{
+ platform_driver_unregister(&bfin_i2s_pcm_driver);
}
-module_exit(bfin_i2s_exit);
+module_exit(snd_bfin_i2s_pcm_exit);
MODULE_AUTHOR("Cliff Cai");
MODULE_DESCRIPTION("ADI Blackfin I2S PCM DMA module");
diff --git a/sound/soc/blackfin/bf5xx-i2s-pcm.h b/sound/soc/blackfin/bf5xx-i2s-pcm.h
index 4d4609a97c59..0c2c5a68d4ff 100644
--- a/sound/soc/blackfin/bf5xx-i2s-pcm.h
+++ b/sound/soc/blackfin/bf5xx-i2s-pcm.h
@@ -23,7 +23,4 @@ struct bf5xx_gpio {
u32 frm;
};
-/* platform data */
-extern struct snd_soc_platform bf5xx_i2s_soc_platform;
-
#endif
diff --git a/sound/soc/blackfin/bf5xx-i2s.c b/sound/soc/blackfin/bf5xx-i2s.c
index 3e6ada0dd1c4..d453b1e9d607 100644
--- a/sound/soc/blackfin/bf5xx-i2s.c
+++ b/sound/soc/blackfin/bf5xx-i2s.c
@@ -42,7 +42,6 @@
#include <linux/gpio.h>
#include "bf5xx-sport.h"
-#include "bf5xx-i2s.h"
struct bf5xx_i2s_port {
u16 tcr1;
@@ -195,8 +194,7 @@ static void bf5xx_i2s_shutdown(struct snd_pcm_substream *substream,
bf5xx_i2s.configured = 0;
}
-static int bf5xx_i2s_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int bf5xx_i2s_probe(struct snd_soc_dai *dai)
{
pr_debug("%s enter\n", __func__);
if (peripheral_request_list(&sport_req[sport_num][0], "soc-audio")) {
@@ -215,11 +213,11 @@ static int bf5xx_i2s_probe(struct platform_device *pdev,
return 0;
}
-static void bf5xx_i2s_remove(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int bf5xx_i2s_remove(struct snd_soc_dai *dai)
{
pr_debug("%s enter\n", __func__);
peripheral_free_list(&sport_req[sport_num][0]);
+ return 0;
}
#ifdef CONFIG_PM
@@ -228,9 +226,9 @@ static int bf5xx_i2s_suspend(struct snd_soc_dai *dai)
pr_debug("%s : sport %d\n", __func__, dai->id);
- if (dai->capture.active)
+ if (dai->capture_active)
sport_rx_stop(sport_handle);
- if (dai->playback.active)
+ if (dai->playback_active)
sport_tx_stop(sport_handle);
return 0;
}
@@ -277,9 +275,7 @@ static struct snd_soc_dai_ops bf5xx_i2s_dai_ops = {
.set_fmt = bf5xx_i2s_set_dai_fmt,
};
-struct snd_soc_dai bf5xx_i2s_dai = {
- .name = "bf5xx-i2s",
- .id = 0,
+static struct snd_soc_dai_driver bf5xx_i2s_dai = {
.probe = bf5xx_i2s_probe,
.remove = bf5xx_i2s_remove,
.suspend = bf5xx_i2s_suspend,
@@ -296,18 +292,39 @@ struct snd_soc_dai bf5xx_i2s_dai = {
.formats = BF5XX_I2S_FORMATS,},
.ops = &bf5xx_i2s_dai_ops,
};
-EXPORT_SYMBOL_GPL(bf5xx_i2s_dai);
+
+static int bfin_i2s_drv_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_dai(&pdev->dev, &bf5xx_i2s_dai);
+}
+
+static int __devexit bfin_i2s_drv_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_dai(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver bfin_i2s_driver = {
+ .probe = bfin_i2s_drv_probe,
+ .remove = __devexit_p(bfin_i2s_drv_remove),
+
+ .driver = {
+ .name = "bf5xx-i2s",
+ .owner = THIS_MODULE,
+ },
+};
static int __init bfin_i2s_init(void)
{
- return snd_soc_register_dai(&bf5xx_i2s_dai);
+ return platform_driver_register(&bfin_i2s_driver);
}
-module_init(bfin_i2s_init);
static void __exit bfin_i2s_exit(void)
{
- snd_soc_unregister_dai(&bf5xx_i2s_dai);
+ platform_driver_unregister(&bfin_i2s_driver);
}
+
+module_init(bfin_i2s_init);
module_exit(bfin_i2s_exit);
/* Module information */
diff --git a/sound/soc/blackfin/bf5xx-i2s.h b/sound/soc/blackfin/bf5xx-i2s.h
deleted file mode 100644
index 264ecdcba35a..000000000000
--- a/sound/soc/blackfin/bf5xx-i2s.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * sound/soc/blackfin/bf5xx-i2s.h
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef _BF5XX_I2S_H
-#define _BF5XX_I2S_H
-
-extern struct snd_soc_dai bf5xx_i2s_dai;
-
-#endif
diff --git a/sound/soc/blackfin/bf5xx-ssm2602.c b/sound/soc/blackfin/bf5xx-ssm2602.c
index 3a00fa4dbe6d..36f2769eb912 100644
--- a/sound/soc/blackfin/bf5xx-ssm2602.c
+++ b/sound/soc/blackfin/bf5xx-ssm2602.c
@@ -42,17 +42,16 @@
#include "../codecs/ssm2602.h"
#include "bf5xx-sport.h"
#include "bf5xx-i2s-pcm.h"
-#include "bf5xx-i2s.h"
static struct snd_soc_card bf5xx_ssm2602;
static int bf5xx_ssm2602_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
pr_debug("%s enter\n", __func__);
- cpu_dai->private_data = sport_handle;
+ snd_soc_dai_set_drvdata(cpu_dai, sport_handle);
return 0;
}
@@ -60,8 +59,8 @@ static int bf5xx_ssm2602_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int clk = 0;
int ret = 0;
@@ -118,36 +117,19 @@ static struct snd_soc_ops bf5xx_ssm2602_ops = {
static struct snd_soc_dai_link bf5xx_ssm2602_dai = {
.name = "ssm2602",
.stream_name = "SSM2602",
- .cpu_dai = &bf5xx_i2s_dai,
- .codec_dai = &ssm2602_dai,
+ .cpu_dai_name = "bf5xx-i2s",
+ .codec_dai_name = "ssm2602-hifi",
+ .platform_name = "bf5xx-pcm-audio",
+ .codec_name = "ssm2602-codec.0-0x1b",
.ops = &bf5xx_ssm2602_ops,
};
-/*
- * SSM2602 2 wire address is determined by CSB
- * state during powerup.
- * low = 0x1a
- * high = 0x1b
- */
-
-static struct ssm2602_setup_data bf5xx_ssm2602_setup = {
- .i2c_bus = 0,
- .i2c_address = 0x1b,
-};
-
static struct snd_soc_card bf5xx_ssm2602 = {
.name = "bf5xx_ssm2602",
- .platform = &bf5xx_i2s_soc_platform,
.dai_link = &bf5xx_ssm2602_dai,
.num_links = 1,
};
-static struct snd_soc_device bf5xx_ssm2602_snd_devdata = {
- .card = &bf5xx_ssm2602,
- .codec_dev = &soc_codec_dev_ssm2602,
- .codec_data = &bf5xx_ssm2602_setup,
-};
-
static struct platform_device *bf5xx_ssm2602_snd_device;
static int __init bf5xx_ssm2602_init(void)
@@ -159,9 +141,7 @@ static int __init bf5xx_ssm2602_init(void)
if (!bf5xx_ssm2602_snd_device)
return -ENOMEM;
- platform_set_drvdata(bf5xx_ssm2602_snd_device,
- &bf5xx_ssm2602_snd_devdata);
- bf5xx_ssm2602_snd_devdata.dev = &bf5xx_ssm2602_snd_device->dev;
+ platform_set_drvdata(bf5xx_ssm2602_snd_device, &bf5xx_ssm2602);
ret = platform_device_add(bf5xx_ssm2602_snd_device);
if (ret)
diff --git a/sound/soc/blackfin/bf5xx-tdm-pcm.c b/sound/soc/blackfin/bf5xx-tdm-pcm.c
index 6bac1ac1a315..74cf759b78a6 100644
--- a/sound/soc/blackfin/bf5xx-tdm-pcm.c
+++ b/sound/soc/blackfin/bf5xx-tdm-pcm.c
@@ -290,14 +290,14 @@ static int bf5xx_pcm_tdm_new(struct snd_card *card, struct snd_soc_dai *dai,
if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
ret = bf5xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK);
if (ret)
goto out;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
ret = bf5xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE);
if (ret)
@@ -307,25 +307,44 @@ out:
return ret;
}
-struct snd_soc_platform bf5xx_tdm_soc_platform = {
- .name = "bf5xx-audio",
- .pcm_ops = &bf5xx_pcm_tdm_ops,
+static struct snd_soc_platform_driver bf5xx_tdm_soc_platform = {
+ .ops = &bf5xx_pcm_tdm_ops,
.pcm_new = bf5xx_pcm_tdm_new,
.pcm_free = bf5xx_pcm_free_dma_buffers,
};
-EXPORT_SYMBOL_GPL(bf5xx_tdm_soc_platform);
-static int __init bfin_pcm_tdm_init(void)
+static int __devinit bf5xx_soc_platform_probe(struct platform_device *pdev)
{
- return snd_soc_register_platform(&bf5xx_tdm_soc_platform);
+ return snd_soc_register_platform(&pdev->dev, &bf5xx_tdm_soc_platform);
}
-module_init(bfin_pcm_tdm_init);
-static void __exit bfin_pcm_tdm_exit(void)
+static int __devexit bf5xx_soc_platform_remove(struct platform_device *pdev)
{
- snd_soc_unregister_platform(&bf5xx_tdm_soc_platform);
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver bfin_tdm_driver = {
+ .driver = {
+ .name = "bf5xx-tdm-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = bf5xx_soc_platform_probe,
+ .remove = __devexit_p(bf5xx_soc_platform_remove),
+};
+
+static int __init snd_bfin_tdm_init(void)
+{
+ return platform_driver_register(&bfin_tdm_driver);
+}
+module_init(snd_bfin_tdm_init);
+
+static void __exit snd_bfin_tdm_exit(void)
+{
+ platform_driver_unregister(&bfin_tdm_driver);
}
-module_exit(bfin_pcm_tdm_exit);
+module_exit(snd_bfin_tdm_exit);
MODULE_AUTHOR("Barry Song");
MODULE_DESCRIPTION("ADI Blackfin TDM PCM DMA module");
diff --git a/sound/soc/blackfin/bf5xx-tdm-pcm.h b/sound/soc/blackfin/bf5xx-tdm-pcm.h
index ddc5047df88c..7f8cc01c4477 100644
--- a/sound/soc/blackfin/bf5xx-tdm-pcm.h
+++ b/sound/soc/blackfin/bf5xx-tdm-pcm.h
@@ -15,7 +15,4 @@ struct bf5xx_pcm_dma_params {
char *name; /* stream identifier */
};
-/* platform data */
-extern struct snd_soc_platform bf5xx_tdm_soc_platform;
-
#endif
diff --git a/sound/soc/blackfin/bf5xx-tdm.c b/sound/soc/blackfin/bf5xx-tdm.c
index 24c14269f4bc..125123929f16 100644
--- a/sound/soc/blackfin/bf5xx-tdm.c
+++ b/sound/soc/blackfin/bf5xx-tdm.c
@@ -214,9 +214,9 @@ static int bf5xx_tdm_suspend(struct snd_soc_dai *dai)
if (!dai->active)
return 0;
- if (dai->capture.active)
+ if (dai->capture_active)
sport_rx_stop(sport);
- if (dai->playback.active)
+ if (dai->playback_active)
sport_tx_stop(sport);
return 0;
}
@@ -224,7 +224,7 @@ static int bf5xx_tdm_suspend(struct snd_soc_dai *dai)
static int bf5xx_tdm_resume(struct snd_soc_dai *dai)
{
int ret;
- struct sport_device *sport = dai->private_data;
+ struct sport_device *sport = snd_soc_dai_get_drvdata(dai);
if (!dai->active)
return 0;
@@ -262,9 +262,7 @@ static struct snd_soc_dai_ops bf5xx_tdm_dai_ops = {
.set_channel_map = bf5xx_tdm_set_channel_map,
};
-struct snd_soc_dai bf5xx_tdm_dai = {
- .name = "bf5xx-tdm",
- .id = 0,
+static struct snd_soc_dai_driver bf5xx_tdm_dai = {
.suspend = bf5xx_tdm_suspend,
.resume = bf5xx_tdm_resume,
.playback = {
@@ -279,7 +277,6 @@ struct snd_soc_dai bf5xx_tdm_dai = {
.formats = SNDRV_PCM_FMTBIT_S32_LE,},
.ops = &bf5xx_tdm_dai_ops,
};
-EXPORT_SYMBOL_GPL(bf5xx_tdm_dai);
static int __devinit bfin_tdm_probe(struct platform_device *pdev)
{
@@ -320,7 +317,7 @@ static int __devinit bfin_tdm_probe(struct platform_device *pdev)
goto sport_config_err;
}
- ret = snd_soc_register_dai(&bf5xx_tdm_dai);
+ ret = snd_soc_register_dai(&pdev->dev, &bf5xx_tdm_dai);
if (ret) {
pr_err("Failed to register DAI: %d\n", ret);
goto sport_config_err;
@@ -337,7 +334,7 @@ sport_config_err:
static int __devexit bfin_tdm_remove(struct platform_device *pdev)
{
peripheral_free_list(&sport_req[sport_num][0]);
- snd_soc_unregister_dai(&bf5xx_tdm_dai);
+ snd_soc_unregister_dai(&pdev->dev);
return 0;
}
diff --git a/sound/soc/blackfin/bf5xx-tdm.h b/sound/soc/blackfin/bf5xx-tdm.h
index 04189a18c1ba..e986a3ea3315 100644
--- a/sound/soc/blackfin/bf5xx-tdm.h
+++ b/sound/soc/blackfin/bf5xx-tdm.h
@@ -20,6 +20,4 @@ struct bf5xx_tdm_port {
int configured;
};
-extern struct snd_soc_dai bf5xx_tdm_dai;
-
#endif
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index 83f5c67d3c41..bfdd92b78fb6 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -61,6 +61,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_WM8955 if I2C
select SND_SOC_WM8960 if I2C
select SND_SOC_WM8961 if I2C
+ select SND_SOC_WM8962 if I2C
select SND_SOC_WM8971 if I2C
select SND_SOC_WM8974 if I2C
select SND_SOC_WM8978 if I2C
@@ -248,6 +249,9 @@ config SND_SOC_WM8960
config SND_SOC_WM8961
tristate
+config SND_SOC_WM8962
+ tristate
+
config SND_SOC_WM8971
tristate
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index 53524095759c..9c3c39fd99ad 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -46,6 +46,7 @@ snd-soc-wm8940-objs := wm8940.o
snd-soc-wm8955-objs := wm8955.o
snd-soc-wm8960-objs := wm8960.o
snd-soc-wm8961-objs := wm8961.o
+snd-soc-wm8962-objs := wm8962.o wm8962-tables.o
snd-soc-wm8971-objs := wm8971.o
snd-soc-wm8974-objs := wm8974.o
snd-soc-wm8978-objs := wm8978.o
@@ -115,6 +116,7 @@ obj-$(CONFIG_SND_SOC_WM8940) += snd-soc-wm8940.o
obj-$(CONFIG_SND_SOC_WM8955) += snd-soc-wm8955.o
obj-$(CONFIG_SND_SOC_WM8960) += snd-soc-wm8960.o
obj-$(CONFIG_SND_SOC_WM8961) += snd-soc-wm8961.o
+obj-$(CONFIG_SND_SOC_WM8962) += snd-soc-wm8962.o
obj-$(CONFIG_SND_SOC_WM8971) += snd-soc-wm8971.o
obj-$(CONFIG_SND_SOC_WM8974) += snd-soc-wm8974.o
obj-$(CONFIG_SND_SOC_WM8978) += snd-soc-wm8978.o
diff --git a/sound/soc/codecs/ac97.c b/sound/soc/codecs/ac97.c
index 1f5e57a4bb7a..12c87d37eba1 100644
--- a/sound/soc/codecs/ac97.c
+++ b/sound/soc/codecs/ac97.c
@@ -21,7 +21,6 @@
#include <sound/ac97_codec.h>
#include <sound/initval.h>
#include <sound/soc.h>
-#include "ac97.h"
#define AC97_VERSION "0.6"
@@ -30,8 +29,7 @@ static int ac97_prepare(struct snd_pcm_substream *substream,
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
int reg = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
AC97_PCM_FRONT_DAC_RATE : AC97_PCM_LR_ADC_RATE;
@@ -46,8 +44,8 @@ static struct snd_soc_dai_ops ac97_dai_ops = {
.prepare = ac97_prepare,
};
-struct snd_soc_dai ac97_dai = {
- .name = "AC97 HiFi",
+static struct snd_soc_dai_driver ac97_dai = {
+ .name = "ac97-hifi",
.ac97_control = 1,
.playback = {
.stream_name = "AC97 Playback",
@@ -63,7 +61,6 @@ struct snd_soc_dai ac97_dai = {
.formats = SND_SOC_STD_AC97_FMTS,},
.ops = &ac97_dai_ops,
};
-EXPORT_SYMBOL_GPL(ac97_dai);
static unsigned int ac97_read(struct snd_soc_codec *codec,
unsigned int reg)
@@ -78,95 +75,49 @@ static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,
return 0;
}
-static int ac97_soc_probe(struct platform_device *pdev)
+static int ac97_soc_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_codec *codec;
struct snd_ac97_bus *ac97_bus;
struct snd_ac97_template ac97_template;
- int i;
- int ret = 0;
+ int ret;
printk(KERN_INFO "AC97 SoC Audio Codec %s\n", AC97_VERSION);
- socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (!socdev->card->codec)
- return -ENOMEM;
- codec = socdev->card->codec;
- mutex_init(&codec->mutex);
-
- codec->name = "AC97";
- codec->owner = THIS_MODULE;
- codec->dai = &ac97_dai;
- codec->num_dai = 1;
- codec->write = ac97_write;
- codec->read = ac97_read;
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0)
- goto err;
+ ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
+ if (ret < 0) {
+ printk(KERN_ERR "ASoC: failed to init gen ac97 glue\n");
+ return ret;
+ }
/* add codec as bus device for standard ac97 */
- ret = snd_ac97_bus(codec->card, 0, &soc_ac97_ops, NULL, &ac97_bus);
+ ret = snd_ac97_bus(codec->card->snd_card, 0, &soc_ac97_ops, NULL, &ac97_bus);
if (ret < 0)
- goto bus_err;
+ return ret;
memset(&ac97_template, 0, sizeof(struct snd_ac97_template));
ret = snd_ac97_mixer(ac97_bus, &ac97_template, &codec->ac97);
if (ret < 0)
- goto bus_err;
-
- for (i = 0; i < card->num_links; i++) {
- if (card->dai_link[i].codec_dai->ac97_control) {
- snd_ac97_dev_add_pdata(codec->ac97,
- card->dai_link[i].cpu_dai->ac97_pdata);
- }
- }
+ return ret;
return 0;
-
-bus_err:
- snd_soc_free_pcms(socdev);
-
-err:
- kfree(socdev->card->codec);
- socdev->card->codec = NULL;
- return ret;
}
-static int ac97_soc_remove(struct platform_device *pdev)
+static int ac97_soc_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (!codec)
- return 0;
-
- snd_soc_free_pcms(socdev);
- kfree(socdev->card->codec);
-
return 0;
}
#ifdef CONFIG_PM
-static int ac97_soc_suspend(struct platform_device *pdev, pm_message_t msg)
+static int ac97_soc_suspend(struct snd_soc_codec *codec, pm_message_t msg)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_ac97_suspend(socdev->card->codec->ac97);
+ snd_ac97_suspend(codec->ac97);
return 0;
}
-static int ac97_soc_resume(struct platform_device *pdev)
+static int ac97_soc_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_ac97_resume(socdev->card->codec->ac97);
+ snd_ac97_resume(codec->ac97);
return 0;
}
@@ -175,13 +126,48 @@ static int ac97_soc_resume(struct platform_device *pdev)
#define ac97_soc_resume NULL
#endif
-struct snd_soc_codec_device soc_codec_dev_ac97 = {
+static struct snd_soc_codec_driver soc_codec_dev_ac97 = {
+ .write = ac97_write,
+ .read = ac97_read,
.probe = ac97_soc_probe,
.remove = ac97_soc_remove,
.suspend = ac97_soc_suspend,
.resume = ac97_soc_resume,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_ac97);
+
+static __devinit int ac97_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_ac97, &ac97_dai, 1);
+}
+
+static int __devexit ac97_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_codec(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver ac97_codec_driver = {
+ .driver = {
+ .name = "ac97-codec",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = ac97_probe,
+ .remove = __devexit_p(ac97_remove),
+};
+
+static int __init ac97_init(void)
+{
+ return platform_driver_register(&ac97_codec_driver);
+}
+module_init(ac97_init);
+
+static void __exit ac97_exit(void)
+{
+ platform_driver_unregister(&ac97_codec_driver);
+}
+module_exit(ac97_exit);
MODULE_DESCRIPTION("Soc Generic AC97 driver");
MODULE_AUTHOR("Liam Girdwood");
diff --git a/sound/soc/codecs/ac97.h b/sound/soc/codecs/ac97.h
deleted file mode 100644
index 281aa42e2bbb..000000000000
--- a/sound/soc/codecs/ac97.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * linux/sound/codecs/ac97.h -- ALSA SoC Layer
- *
- * Author: Liam Girdwood
- * Created: Dec 1st 2005
- * Copyright: Wolfson Microelectronics. PLC.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __LINUX_SND_SOC_AC97_H
-#define __LINUX_SND_SOC_AC97_H
-
-extern struct snd_soc_codec_device soc_codec_dev_ac97;
-extern struct snd_soc_dai ac97_dai;
-
-#endif
diff --git a/sound/soc/codecs/ad1836.c b/sound/soc/codecs/ad1836.c
index a01006c8c606..d272534c8f84 100644
--- a/sound/soc/codecs/ad1836.c
+++ b/sound/soc/codecs/ad1836.c
@@ -33,15 +33,10 @@
/* codec private data */
struct ad1836_priv {
- struct snd_soc_codec codec;
- u16 reg_cache[AD1836_NUM_REGS];
+ enum snd_soc_control_type control_type;
+ void *control_data;
};
-static struct snd_soc_codec *ad1836_codec;
-struct snd_soc_codec_device soc_codec_dev_ad1836;
-static int ad1836_register(struct ad1836_priv *ad1836);
-static void ad1836_unregister(struct ad1836_priv *ad1836);
-
/*
* AD1836 volume/mute/de-emphasis etc. controls
*/
@@ -146,8 +141,7 @@ static int ad1836_hw_params(struct snd_pcm_substream *substream,
int word_len = 0;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
/* bit size */
switch (params_format(params)) {
@@ -173,12 +167,9 @@ static int ad1836_hw_params(struct snd_pcm_substream *substream,
}
#ifdef CONFIG_PM
-static int ad1836_soc_suspend(struct platform_device *pdev,
+static int ad1836_soc_suspend(struct snd_soc_codec *codec,
pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
/* reset clock control mode */
u16 adc_ctrl2 = snd_soc_read(codec, AD1836_ADC_CTRL2);
adc_ctrl2 &= ~AD1836_ADC_SERFMT_MASK;
@@ -186,11 +177,8 @@ static int ad1836_soc_suspend(struct platform_device *pdev,
return snd_soc_write(codec, AD1836_ADC_CTRL2, adc_ctrl2);
}
-static int ad1836_soc_resume(struct platform_device *pdev)
+static int ad1836_soc_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
/* restore clock control mode */
u16 adc_ctrl2 = snd_soc_read(codec, AD1836_ADC_CTRL2);
adc_ctrl2 |= AD1836_ADC_AUX;
@@ -202,49 +190,14 @@ static int ad1836_soc_resume(struct platform_device *pdev)
#define ad1836_soc_resume NULL
#endif
-static int __devinit ad1836_spi_probe(struct spi_device *spi)
-{
- struct snd_soc_codec *codec;
- struct ad1836_priv *ad1836;
-
- ad1836 = kzalloc(sizeof(struct ad1836_priv), GFP_KERNEL);
- if (ad1836 == NULL)
- return -ENOMEM;
-
- codec = &ad1836->codec;
- codec->control_data = spi;
- codec->dev = &spi->dev;
-
- dev_set_drvdata(&spi->dev, ad1836);
-
- return ad1836_register(ad1836);
-}
-
-static int __devexit ad1836_spi_remove(struct spi_device *spi)
-{
- struct ad1836_priv *ad1836 = dev_get_drvdata(&spi->dev);
-
- ad1836_unregister(ad1836);
- return 0;
-}
-
-static struct spi_driver ad1836_spi_driver = {
- .driver = {
- .name = "ad1836",
- .owner = THIS_MODULE,
- },
- .probe = ad1836_spi_probe,
- .remove = __devexit_p(ad1836_spi_remove),
-};
-
static struct snd_soc_dai_ops ad1836_dai_ops = {
.hw_params = ad1836_hw_params,
.set_fmt = ad1836_set_dai_fmt,
};
/* codec DAI instance */
-struct snd_soc_dai ad1836_dai = {
- .name = "AD1836",
+static struct snd_soc_dai_driver ad1836_dai = {
+ .name = "ad1836-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -263,35 +216,13 @@ struct snd_soc_dai ad1836_dai = {
},
.ops = &ad1836_dai_ops,
};
-EXPORT_SYMBOL_GPL(ad1836_dai);
-static int ad1836_register(struct ad1836_priv *ad1836)
+static int ad1836_probe(struct snd_soc_codec *codec)
{
- int ret;
- struct snd_soc_codec *codec = &ad1836->codec;
-
- if (ad1836_codec) {
- dev_err(codec->dev, "Another ad1836 is registered\n");
- kfree(ad1836);
- return -EINVAL;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
- snd_soc_codec_set_drvdata(codec, ad1836);
- codec->reg_cache = ad1836->reg_cache;
- codec->reg_cache_size = AD1836_NUM_REGS;
- codec->name = "AD1836";
- codec->owner = THIS_MODULE;
- codec->dai = &ad1836_dai;
- codec->num_dai = 1;
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- ad1836_dai.dev = codec->dev;
- ad1836_codec = codec;
+ struct ad1836_priv *ad1836 = snd_soc_codec_get_drvdata(codec);
+ int ret = 0;
+ codec->control_data = ad1836->control_data;
ret = snd_soc_codec_set_cache_io(codec, 4, 12, SND_SOC_SPI);
if (ret < 0) {
dev_err(codec->dev, "failed to set cache I/O: %d\n",
@@ -319,81 +250,69 @@ static int ad1836_register(struct ad1836_priv *ad1836)
snd_soc_write(codec, AD1836_DAC_L3_VOL, 0x3FF);
snd_soc_write(codec, AD1836_DAC_R3_VOL, 0x3FF);
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- kfree(ad1836);
- return ret;
- }
-
- ret = snd_soc_register_dai(&ad1836_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- snd_soc_unregister_codec(codec);
- kfree(ad1836);
- return ret;
- }
-
- return 0;
-}
-
-static void ad1836_unregister(struct ad1836_priv *ad1836)
-{
- snd_soc_unregister_dai(&ad1836_dai);
- snd_soc_unregister_codec(&ad1836->codec);
- kfree(ad1836);
- ad1836_codec = NULL;
-}
-
-static int ad1836_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (ad1836_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = ad1836_codec;
- codec = ad1836_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
snd_soc_add_controls(codec, ad1836_snd_controls,
ARRAY_SIZE(ad1836_snd_controls));
snd_soc_dapm_new_controls(codec, ad1836_dapm_widgets,
ARRAY_SIZE(ad1836_dapm_widgets));
snd_soc_dapm_add_routes(codec, audio_paths, ARRAY_SIZE(audio_paths));
-pcm_err:
return ret;
}
/* power down chip */
-static int ad1836_remove(struct platform_device *pdev)
+static int ad1836_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
+ /* reset clock control mode */
+ u16 adc_ctrl2 = snd_soc_read(codec, AD1836_ADC_CTRL2);
+ adc_ctrl2 &= ~AD1836_ADC_SERFMT_MASK;
- return 0;
+ return snd_soc_write(codec, AD1836_ADC_CTRL2, adc_ctrl2);
}
-struct snd_soc_codec_device soc_codec_dev_ad1836 = {
+static struct snd_soc_codec_driver soc_codec_dev_ad1836 = {
.probe = ad1836_probe,
.remove = ad1836_remove,
.suspend = ad1836_soc_suspend,
.resume = ad1836_soc_resume,
+ .reg_cache_size = AD1836_NUM_REGS,
+ .reg_word_size = sizeof(u16),
+};
+
+static int __devinit ad1836_spi_probe(struct spi_device *spi)
+{
+ struct ad1836_priv *ad1836;
+ int ret;
+
+ ad1836 = kzalloc(sizeof(struct ad1836_priv), GFP_KERNEL);
+ if (ad1836 == NULL)
+ return -ENOMEM;
+
+ spi_set_drvdata(spi, ad1836);
+ ad1836->control_data = spi;
+ ad1836->control_type = SND_SOC_SPI;
+
+ ret = snd_soc_register_codec(&spi->dev,
+ &soc_codec_dev_ad1836, &ad1836_dai, 1);
+ if (ret < 0)
+ kfree(ad1836);
+ return ret;
+}
+
+static int __devexit ad1836_spi_remove(struct spi_device *spi)
+{
+ snd_soc_unregister_codec(&spi->dev);
+ kfree(spi_get_drvdata(spi));
+ return 0;
+}
+
+static struct spi_driver ad1836_spi_driver = {
+ .driver = {
+ .name = "ad1836-codec",
+ .owner = THIS_MODULE,
+ },
+ .probe = ad1836_spi_probe,
+ .remove = __devexit_p(ad1836_spi_remove),
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_ad1836);
static int __init ad1836_init(void)
{
diff --git a/sound/soc/codecs/ad1836.h b/sound/soc/codecs/ad1836.h
index e9d90d3951c5..845596717fdf 100644
--- a/sound/soc/codecs/ad1836.h
+++ b/sound/soc/codecs/ad1836.h
@@ -60,6 +60,4 @@
#define AD1836_NUM_REGS 16
-extern struct snd_soc_dai ad1836_dai;
-extern struct snd_soc_codec_device soc_codec_dev_ad1836;
#endif
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index 1def75e4862f..fa2834c91b9f 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -24,9 +24,10 @@
/* codec private data */
struct ad193x_priv {
- unsigned int sysclk;
- struct snd_soc_codec codec;
u8 reg_cache[AD193X_NUM_REGS];
+ enum snd_soc_control_type bus_type;
+ void *control_data;
+ int sysclk;
};
/* ad193x register cache & default register settings */
@@ -34,9 +35,6 @@ static const u8 ad193x_reg[AD193X_NUM_REGS] = {
0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0, 0,
};
-static struct snd_soc_codec *ad193x_codec;
-struct snd_soc_codec_device soc_codec_dev_ad193x;
-
/*
* AD193X volume/mute/de-emphasis etc. controls
*/
@@ -275,8 +273,7 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,
int word_len = 0, reg = 0, master_rate = 0;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec);
/* bit size */
@@ -323,100 +320,6 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,
return 0;
}
-static int ad193x_bus_probe(struct device *dev, void *ctrl_data, int bus_type)
-{
- struct snd_soc_codec *codec;
- struct ad193x_priv *ad193x;
- int ret;
-
- if (ad193x_codec) {
- dev_err(dev, "Another ad193x is registered\n");
- return -EINVAL;
- }
-
- ad193x = kzalloc(sizeof(struct ad193x_priv), GFP_KERNEL);
- if (ad193x == NULL)
- return -ENOMEM;
-
- dev_set_drvdata(dev, ad193x);
-
- codec = &ad193x->codec;
- mutex_init(&codec->mutex);
- codec->control_data = ctrl_data;
- codec->dev = dev;
- snd_soc_codec_set_drvdata(codec, ad193x);
- codec->reg_cache = ad193x->reg_cache;
- codec->reg_cache_size = AD193X_NUM_REGS;
- codec->name = "AD193X";
- codec->owner = THIS_MODULE;
- codec->dai = &ad193x_dai;
- codec->num_dai = 1;
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- ad193x_dai.dev = codec->dev;
- ad193x_codec = codec;
-
- memcpy(codec->reg_cache, ad193x_reg, AD193X_NUM_REGS);
-
- if (bus_type == SND_SOC_I2C)
- ret = snd_soc_codec_set_cache_io(codec, 8, 8, bus_type);
- else
- ret = snd_soc_codec_set_cache_io(codec, 16, 8, bus_type);
- if (ret < 0) {
- dev_err(codec->dev, "failed to set cache I/O: %d\n",
- ret);
- kfree(ad193x);
- return ret;
- }
-
- /* default setting for ad193x */
-
- /* unmute dac channels */
- snd_soc_write(codec, AD193X_DAC_CHNL_MUTE, 0x0);
- /* de-emphasis: 48kHz, powedown dac */
- snd_soc_write(codec, AD193X_DAC_CTRL2, 0x1A);
- /* powerdown dac, dac in tdm mode */
- snd_soc_write(codec, AD193X_DAC_CTRL0, 0x41);
- /* high-pass filter enable */
- snd_soc_write(codec, AD193X_ADC_CTRL0, 0x3);
- /* sata delay=1, adc aux mode */
- snd_soc_write(codec, AD193X_ADC_CTRL1, 0x43);
- /* pll input: mclki/xi */
- snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */
- snd_soc_write(codec, AD193X_PLL_CLK_CTRL1, 0x04);
- ad193x->sysclk = 12288000;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- kfree(ad193x);
- return ret;
- }
-
- ret = snd_soc_register_dai(&ad193x_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- snd_soc_unregister_codec(codec);
- kfree(ad193x);
- return ret;
- }
-
- return 0;
-}
-
-static int ad193x_bus_remove(struct device *dev)
-{
- struct ad193x_priv *ad193x = dev_get_drvdata(dev);
-
- snd_soc_unregister_dai(&ad193x_dai);
- snd_soc_unregister_codec(&ad193x->codec);
- kfree(ad193x);
- ad193x_codec = NULL;
-
- return 0;
-}
-
static struct snd_soc_dai_ops ad193x_dai_ops = {
.hw_params = ad193x_hw_params,
.digital_mute = ad193x_mute,
@@ -426,8 +329,8 @@ static struct snd_soc_dai_ops ad193x_dai_ops = {
};
/* codec DAI instance */
-struct snd_soc_dai ad193x_dai = {
- .name = "AD193X",
+static struct snd_soc_dai_driver ad193x_dai = {
+ .name = "ad193x-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -446,28 +349,39 @@ struct snd_soc_dai ad193x_dai = {
},
.ops = &ad193x_dai_ops,
};
-EXPORT_SYMBOL_GPL(ad193x_dai);
-static int ad193x_probe(struct platform_device *pdev)
+static int ad193x_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
+ struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec);
+ int ret;
- if (ad193x_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
+ codec->control_data = ad193x->control_data;
+ if (ad193x->bus_type == SND_SOC_I2C)
+ ret = snd_soc_codec_set_cache_io(codec, 8, 8, ad193x->bus_type);
+ else
+ ret = snd_soc_codec_set_cache_io(codec, 16, 8, ad193x->bus_type);
+ if (ret < 0) {
+ dev_err(codec->dev, "failed to set cache I/O: %d\n",
+ ret);
+ kfree(ad193x);
+ return ret;
}
- socdev->card->codec = ad193x_codec;
- codec = ad193x_codec;
+ /* default setting for ad193x */
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
+ /* unmute dac channels */
+ snd_soc_write(codec, AD193X_DAC_CHNL_MUTE, 0x0);
+ /* de-emphasis: 48kHz, powedown dac */
+ snd_soc_write(codec, AD193X_DAC_CTRL2, 0x1A);
+ /* powerdown dac, dac in tdm mode */
+ snd_soc_write(codec, AD193X_DAC_CTRL0, 0x41);
+ /* high-pass filter enable */
+ snd_soc_write(codec, AD193X_ADC_CTRL0, 0x3);
+ /* sata delay=1, adc aux mode */
+ snd_soc_write(codec, AD193X_ADC_CTRL1, 0x43);
+ /* pll input: mclki/xi */
+ snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */
+ snd_soc_write(codec, AD193X_PLL_CLK_CTRL1, 0x04);
snd_soc_add_controls(codec, ad193x_snd_controls,
ARRAY_SIZE(ad193x_snd_controls));
@@ -475,41 +389,47 @@ static int ad193x_probe(struct platform_device *pdev)
ARRAY_SIZE(ad193x_dapm_widgets));
snd_soc_dapm_add_routes(codec, audio_paths, ARRAY_SIZE(audio_paths));
-pcm_err:
return ret;
}
-/* power down chip */
-static int ad193x_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_ad193x = {
+static struct snd_soc_codec_driver soc_codec_dev_ad193x = {
.probe = ad193x_probe,
- .remove = ad193x_remove,
+ .reg_cache_default = ad193x_reg,
+ .reg_cache_size = AD193X_NUM_REGS,
+ .reg_word_size = sizeof(u16),
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_ad193x);
#if defined(CONFIG_SPI_MASTER)
static int __devinit ad193x_spi_probe(struct spi_device *spi)
{
- return ad193x_bus_probe(&spi->dev, spi, SND_SOC_SPI);
+ struct ad193x_priv *ad193x;
+ int ret;
+
+ ad193x = kzalloc(sizeof(struct ad193x_priv), GFP_KERNEL);
+ if (ad193x == NULL)
+ return -ENOMEM;
+
+ spi_set_drvdata(spi, ad193x);
+ ad193x->control_data = spi;
+ ad193x->bus_type = SND_SOC_SPI;
+
+ ret = snd_soc_register_codec(&spi->dev,
+ &soc_codec_dev_ad193x, &ad193x_dai, 1);
+ if (ret < 0)
+ kfree(ad193x);
+ return ret;
}
static int __devexit ad193x_spi_remove(struct spi_device *spi)
{
- return ad193x_bus_remove(&spi->dev);
+ snd_soc_unregister_codec(&spi->dev);
+ kfree(spi_get_drvdata(spi));
+ return 0;
}
static struct spi_driver ad193x_spi_driver = {
.driver = {
- .name = "ad193x",
+ .name = "ad193x-codec",
.owner = THIS_MODULE,
},
.probe = ad193x_spi_probe,
@@ -528,17 +448,34 @@ MODULE_DEVICE_TABLE(i2c, ad193x_id);
static int __devinit ad193x_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
- return ad193x_bus_probe(&client->dev, client, SND_SOC_I2C);
+ struct ad193x_priv *ad193x;
+ int ret;
+
+ ad193x = kzalloc(sizeof(struct ad193x_priv), GFP_KERNEL);
+ if (ad193x == NULL)
+ return -ENOMEM;
+
+ i2c_set_clientdata(client, ad193x);
+ ad193x->control_data = client;
+ ad193x->bus_type = SND_SOC_I2C;
+
+ ret = snd_soc_register_codec(&client->dev,
+ &soc_codec_dev_ad193x, &ad193x_dai, 1);
+ if (ret < 0)
+ kfree(ad193x);
+ return ret;
}
static int __devexit ad193x_i2c_remove(struct i2c_client *client)
{
- return ad193x_bus_remove(&client->dev);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
+ return 0;
}
static struct i2c_driver ad193x_i2c_driver = {
.driver = {
- .name = "ad193x",
+ .name = "ad193x-codec",
},
.probe = ad193x_i2c_probe,
.remove = __devexit_p(ad193x_i2c_remove),
diff --git a/sound/soc/codecs/ad193x.h b/sound/soc/codecs/ad193x.h
index 654ba64ae04c..9747b5497877 100644
--- a/sound/soc/codecs/ad193x.h
+++ b/sound/soc/codecs/ad193x.h
@@ -80,7 +80,4 @@
#define AD193X_NUM_REGS 17
-extern struct snd_soc_dai ad193x_dai;
-extern struct snd_soc_codec_device soc_codec_dev_ad193x;
-
#endif
diff --git a/sound/soc/codecs/ad1980.c b/sound/soc/codecs/ad1980.c
index 70cfaec3be2c..81a444049936 100644
--- a/sound/soc/codecs/ad1980.c
+++ b/sound/soc/codecs/ad1980.c
@@ -138,8 +138,8 @@ static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,
return 0;
}
-struct snd_soc_dai ad1980_dai = {
- .name = "AC97",
+struct snd_soc_dai_driver ad1980_dai = {
+ .name = "ad1980-hifi",
.ac97_control = 1,
.playback = {
.stream_name = "Playback",
@@ -185,53 +185,20 @@ err:
return -EIO;
}
-static int ad1980_soc_probe(struct platform_device *pdev)
+static int ad1980_soc_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
+ int ret;
u16 vendor_id2;
u16 ext_status;
printk(KERN_INFO "AD1980 SoC Audio Codec\n");
- socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (socdev->card->codec == NULL)
- return -ENOMEM;
- codec = socdev->card->codec;
- mutex_init(&codec->mutex);
-
- codec->reg_cache =
- kzalloc(sizeof(u16) * ARRAY_SIZE(ad1980_reg), GFP_KERNEL);
- if (codec->reg_cache == NULL) {
- ret = -ENOMEM;
- goto cache_err;
- }
- memcpy(codec->reg_cache, ad1980_reg, sizeof(u16) * \
- ARRAY_SIZE(ad1980_reg));
- codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(ad1980_reg);
- codec->reg_cache_step = 2;
- codec->name = "AD1980";
- codec->owner = THIS_MODULE;
- codec->dai = &ad1980_dai;
- codec->num_dai = 1;
- codec->write = ac97_write;
- codec->read = ac97_read;
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
if (ret < 0) {
printk(KERN_ERR "ad1980: failed to register AC97 codec\n");
- goto codec_err;
+ return ret;
}
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0)
- goto pcm_err;
-
-
ret = ad1980_reset(codec, 0);
if (ret < 0) {
printk(KERN_ERR "Failed to reset AD1980: AC97 link error\n");
@@ -270,41 +237,59 @@ static int ad1980_soc_probe(struct platform_device *pdev)
return 0;
reset_err:
- snd_soc_free_pcms(socdev);
-
-pcm_err:
snd_soc_free_ac97_codec(codec);
-
-codec_err:
- kfree(codec->reg_cache);
-
-cache_err:
- kfree(socdev->card->codec);
- socdev->card->codec = NULL;
return ret;
}
-static int ad1980_soc_remove(struct platform_device *pdev)
+static int ad1980_soc_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec == NULL)
- return 0;
-
- snd_soc_dapm_free(socdev);
- snd_soc_free_pcms(socdev);
snd_soc_free_ac97_codec(codec);
- kfree(codec->reg_cache);
- kfree(codec);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_ad1980 = {
+static struct snd_soc_codec_driver soc_codec_dev_ad1980 = {
.probe = ad1980_soc_probe,
.remove = ad1980_soc_remove,
+ .reg_cache_size = ARRAY_SIZE(ad1980_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_step = 2,
+ .write = ac97_write,
+ .read = ac97_read,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_ad1980);
+
+static __devinit int ad1980_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_ad1980, &ad1980_dai, 1);
+}
+
+static int __devexit ad1980_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_codec(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver ad1980_codec_driver = {
+ .driver = {
+ .name = "ad1980-codec",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = ad1980_probe,
+ .remove = __devexit_p(ad1980_remove),
+};
+
+static int __init ad1980_init(void)
+{
+ return platform_driver_register(&ad1980_codec_driver);
+}
+module_init(ad1980_init);
+
+static void __exit ad1980_exit(void)
+{
+ platform_driver_unregister(&ad1980_codec_driver);
+}
+module_exit(ad1980_exit);
MODULE_DESCRIPTION("ASoC ad1980 driver (Obsolete)");
MODULE_AUTHOR("Roy Huang, Cliff Cai");
diff --git a/sound/soc/codecs/ad1980.h b/sound/soc/codecs/ad1980.h
index 538f37c90806..eb0af44ad3df 100644
--- a/sound/soc/codecs/ad1980.h
+++ b/sound/soc/codecs/ad1980.h
@@ -23,7 +23,4 @@
#define PR5 0x2000
#define PR6 0x4000
-extern struct snd_soc_dai ad1980_dai;
-extern struct snd_soc_codec_device soc_codec_dev_ad1980;
-
#endif
diff --git a/sound/soc/codecs/ad73311.c b/sound/soc/codecs/ad73311.c
index 475807bea2c2..c53955fe17b6 100644
--- a/sound/soc/codecs/ad73311.c
+++ b/sound/soc/codecs/ad73311.c
@@ -23,8 +23,8 @@
#include "ad73311.h"
-struct snd_soc_dai ad73311_dai = {
- .name = "AD73311",
+static struct snd_soc_dai_driver ad73311_dai = {
+ .name = "ad73311-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -38,68 +38,40 @@ struct snd_soc_dai ad73311_dai = {
.rates = SNDRV_PCM_RATE_8000,
.formats = SNDRV_PCM_FMTBIT_S16_LE, },
};
-EXPORT_SYMBOL_GPL(ad73311_dai);
-static int ad73311_soc_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (codec == NULL)
- return -ENOMEM;
- mutex_init(&codec->mutex);
- codec->name = "AD73311";
- codec->owner = THIS_MODULE;
- codec->dai = &ad73311_dai;
- codec->num_dai = 1;
- socdev->card->codec = codec;
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "ad73311: failed to create pcms\n");
- goto pcm_err;
- }
-
- return ret;
+static struct snd_soc_codec_driver soc_codec_dev_ad73311;
-pcm_err:
- kfree(socdev->card->codec);
- socdev->card->codec = NULL;
- return ret;
+static int ad73311_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_ad73311, &ad73311_dai, 1);
}
-static int ad73311_soc_remove(struct platform_device *pdev)
+static int ad73311_remove(struct platform_device *pdev)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec == NULL)
- return 0;
- snd_soc_free_pcms(socdev);
- kfree(codec);
+ snd_soc_unregister_codec(&pdev->dev);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_ad73311 = {
- .probe = ad73311_soc_probe,
- .remove = ad73311_soc_remove,
+static struct platform_driver ad73311_codec_driver = {
+ .driver = {
+ .name = "ad73311-codec",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = ad73311_probe,
+ .remove = __devexit_p(ad73311_remove),
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_ad73311);
static int __init ad73311_init(void)
{
- return snd_soc_register_dai(&ad73311_dai);
+ return platform_driver_register(&ad73311_codec_driver);
}
module_init(ad73311_init);
static void __exit ad73311_exit(void)
{
- snd_soc_unregister_dai(&ad73311_dai);
+ platform_driver_unregister(&ad73311_codec_driver);
}
module_exit(ad73311_exit);
diff --git a/sound/soc/codecs/ad73311.h b/sound/soc/codecs/ad73311.h
index 569573d2d4d7..4b353eefc0bf 100644
--- a/sound/soc/codecs/ad73311.h
+++ b/sound/soc/codecs/ad73311.h
@@ -85,6 +85,4 @@
#define REGF_INV (1 << 6)
#define REGF_ALB (1 << 7)
-extern struct snd_soc_dai ad73311_dai;
-extern struct snd_soc_codec_device soc_codec_dev_ad73311;
#endif
diff --git a/sound/soc/codecs/ads117x.c b/sound/soc/codecs/ads117x.c
index f8e75edb27b7..8402854ec15e 100644
--- a/sound/soc/codecs/ads117x.c
+++ b/sound/soc/codecs/ads117x.c
@@ -19,16 +19,12 @@
#include <sound/initval.h>
#include <sound/soc.h>
-#include "ads117x.h"
-
#define ADS117X_RATES (SNDRV_PCM_RATE_8000_48000)
-
#define ADS117X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE)
-struct snd_soc_dai ads117x_dai = {
+static struct snd_soc_dai_driver ads117x_dai = {
/* ADC */
- .name = "ADS117X ADC",
- .id = 1,
+ .name = "ads117x-hifi",
.capture = {
.stream_name = "Capture",
.channels_min = 1,
@@ -36,75 +32,29 @@ struct snd_soc_dai ads117x_dai = {
.rates = ADS117X_RATES,
.formats = ADS117X_FORMATS,},
};
-EXPORT_SYMBOL_GPL(ads117x_dai);
-
-static int ads117x_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret;
-
- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (codec == NULL)
- return -ENOMEM;
- socdev->card->codec = codec;
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
- codec->name = "ADS117X";
- codec->owner = THIS_MODULE;
- codec->dai = &ads117x_dai;
- codec->num_dai = 1;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "ads117x: failed to create pcms\n");
- kfree(codec);
- return ret;
- }
-
- return 0;
-}
-
-static int ads117x_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- snd_soc_free_pcms(socdev);
- kfree(codec);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_ads117x = {
- .probe = ads117x_probe,
- .remove = ads117x_remove,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_ads117x);
+static struct snd_soc_codec_driver soc_codec_dev_ads117x;
-static __devinit int ads117x_platform_probe(struct platform_device *pdev)
+static __devinit int ads117x_probe(struct platform_device *pdev)
{
- ads117x_dai.dev = &pdev->dev;
- return snd_soc_register_dai(&ads117x_dai);
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_ads117x, &ads117x_dai, 1);
}
-static int __devexit ads117x_platform_remove(struct platform_device *pdev)
+static int __devexit ads117x_remove(struct platform_device *pdev)
{
- snd_soc_unregister_dai(&ads117x_dai);
+ snd_soc_unregister_codec(&pdev->dev);
return 0;
}
static struct platform_driver ads117x_codec_driver = {
.driver = {
- .name = "ads117x",
+ .name = "ads117x-codec",
.owner = THIS_MODULE,
},
- .probe = ads117x_platform_probe,
- .remove = __devexit_p(ads117x_platform_remove),
+ .probe = ads117x_probe,
+ .remove = __devexit_p(ads117x_remove),
};
static int __init ads117x_init(void)
diff --git a/sound/soc/codecs/ads117x.h b/sound/soc/codecs/ads117x.h
index dbcf50ec9bd1..3ce028614002 100644
--- a/sound/soc/codecs/ads117x.h
+++ b/sound/soc/codecs/ads117x.h
@@ -9,5 +9,5 @@
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
-extern struct snd_soc_dai ads117x_dai;
-extern struct snd_soc_codec_device soc_codec_dev_ads117x;
+extern struct snd_soc_dai_driver ads117x_dai;
+extern struct snd_soc_codec_driver soc_codec_dev_ads117x;
diff --git a/sound/soc/codecs/ak4104.c b/sound/soc/codecs/ak4104.c
index 192aebda3029..c27f8f59dc66 100644
--- a/sound/soc/codecs/ak4104.c
+++ b/sound/soc/codecs/ak4104.c
@@ -17,8 +17,6 @@
#include <linux/spi/spi.h>
#include <sound/asoundef.h>
-#include "ak4104.h"
-
/* AK4104 registers addresses */
#define AK4104_REG_CONTROL1 0x00
#define AK4104_REG_RESERVED 0x01
@@ -45,11 +43,11 @@
#define AK4104_TX_TXE (1 << 0)
#define AK4104_TX_V (1 << 1)
-#define DRV_NAME "ak4104"
+#define DRV_NAME "ak4104-codec"
struct ak4104_private {
- struct snd_soc_codec codec;
- u8 reg_cache[AK4104_NUM_REGS];
+ enum snd_soc_control_type control_type;
+ void *control_data;
};
static int ak4104_fill_cache(struct snd_soc_codec *codec)
@@ -58,7 +56,7 @@ static int ak4104_fill_cache(struct snd_soc_codec *codec)
u8 *reg_cache = codec->reg_cache;
struct spi_device *spi = codec->control_data;
- for (i = 0; i < codec->reg_cache_size; i++) {
+ for (i = 0; i < codec->driver->reg_cache_size; i++) {
int ret = spi_w8r8(spi, i | AK4104_READ);
if (ret < 0) {
dev_err(&spi->dev, "SPI write failure\n");
@@ -76,7 +74,7 @@ static unsigned int ak4104_read_reg_cache(struct snd_soc_codec *codec,
{
u8 *reg_cache = codec->reg_cache;
- if (reg >= codec->reg_cache_size)
+ if (reg >= codec->driver->reg_cache_size)
return -EINVAL;
return reg_cache[reg];
@@ -88,7 +86,7 @@ static int ak4104_spi_write(struct snd_soc_codec *codec, unsigned int reg,
u8 *cache = codec->reg_cache;
struct spi_device *spi = codec->control_data;
- if (reg >= codec->reg_cache_size)
+ if (reg >= codec->driver->reg_cache_size)
return -EINVAL;
/* only write to the hardware if value has changed */
@@ -145,8 +143,7 @@ static int ak4104_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
int val = 0;
/* set the IEC958 bits: consumer mode, no copyright bit */
@@ -178,8 +175,8 @@ static struct snd_soc_dai_ops ak4101_dai_ops = {
.set_fmt = ak4104_set_dai_fmt,
};
-struct snd_soc_dai ak4104_dai = {
- .name = DRV_NAME,
+static struct snd_soc_dai_driver ak4104_dai = {
+ .name = "ak4104-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -192,45 +189,17 @@ struct snd_soc_dai ak4104_dai = {
.ops = &ak4101_dai_ops,
};
-static struct snd_soc_codec *ak4104_codec;
-
-static int ak4104_spi_probe(struct spi_device *spi)
+static int ak4104_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec;
- struct ak4104_private *ak4104;
+ struct ak4104_private *ak4104 = snd_soc_codec_get_drvdata(codec);
int ret, val;
- spi->bits_per_word = 8;
- spi->mode = SPI_MODE_0;
- ret = spi_setup(spi);
- if (ret < 0)
- return ret;
-
- ak4104 = kzalloc(sizeof(struct ak4104_private), GFP_KERNEL);
- if (!ak4104) {
- dev_err(&spi->dev, "could not allocate codec\n");
- return -ENOMEM;
- }
-
- codec = &ak4104->codec;
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->dev = &spi->dev;
- codec->name = DRV_NAME;
- codec->owner = THIS_MODULE;
- codec->dai = &ak4104_dai;
- codec->num_dai = 1;
- snd_soc_codec_set_drvdata(codec, ak4104);
- codec->control_data = spi;
- codec->reg_cache = ak4104->reg_cache;
- codec->reg_cache_size = AK4104_NUM_REGS;
+ codec->control_data = ak4104->control_data;
/* read all regs and fill the cache */
ret = ak4104_fill_cache(codec);
if (ret < 0) {
- dev_err(&spi->dev, "failed to fill register cache\n");
+ dev_err(codec->dev, "failed to fill register cache\n");
return ret;
}
@@ -238,93 +207,81 @@ static int ak4104_spi_probe(struct spi_device *spi)
* should contain 0x5b. Not a good way to verify the presence of
* the device, but there is no hardware ID register. */
if (ak4104_read_reg_cache(codec, AK4104_REG_RESERVED) !=
- AK4104_RESERVED_VAL) {
- ret = -ENODEV;
- goto error_free_codec;
- }
+ AK4104_RESERVED_VAL)
+ return -ENODEV;
/* set power-up and non-reset bits */
val = ak4104_read_reg_cache(codec, AK4104_REG_CONTROL1);
val |= AK4104_CONTROL1_PW | AK4104_CONTROL1_RSTN;
ret = ak4104_spi_write(codec, AK4104_REG_CONTROL1, val);
if (ret < 0)
- goto error_free_codec;
+ return ret;
/* enable transmitter */
val = ak4104_read_reg_cache(codec, AK4104_REG_TX);
val |= AK4104_TX_TXE;
ret = ak4104_spi_write(codec, AK4104_REG_TX, val);
if (ret < 0)
- goto error_free_codec;
-
- ak4104_codec = codec;
- ret = snd_soc_register_dai(&ak4104_dai);
- if (ret < 0) {
- dev_err(&spi->dev, "failed to register DAI\n");
- goto error_free_codec;
- }
+ return ret;
- spi_set_drvdata(spi, ak4104);
- dev_info(&spi->dev, "SPI device initialized\n");
+ dev_info(codec->dev, "SPI device initialized\n");
return 0;
-
-error_free_codec:
- kfree(ak4104);
- ak4104_dai.dev = NULL;
- return ret;
}
-static int __devexit ak4104_spi_remove(struct spi_device *spi)
+static int ak4104_remove(struct snd_soc_codec *codec)
{
- int ret, val;
- struct ak4104_private *ak4104 = spi_get_drvdata(spi);
+ int val, ret;
- val = ak4104_read_reg_cache(&ak4104->codec, AK4104_REG_CONTROL1);
+ val = ak4104_read_reg_cache(codec, AK4104_REG_CONTROL1);
if (val < 0)
return val;
/* clear power-up and non-reset bits */
val &= ~(AK4104_CONTROL1_PW | AK4104_CONTROL1_RSTN);
- ret = ak4104_spi_write(&ak4104->codec, AK4104_REG_CONTROL1, val);
- if (ret < 0)
- return ret;
+ ret = ak4104_spi_write(codec, AK4104_REG_CONTROL1, val);
- ak4104_codec = NULL;
- kfree(ak4104);
- return 0;
+ return ret;
}
-static int ak4104_probe(struct platform_device *pdev)
+static struct snd_soc_codec_driver soc_codec_device_ak4104 = {
+ .probe = ak4104_probe,
+ .remove = ak4104_remove,
+ .reg_cache_size = AK4104_NUM_REGS,
+ .reg_word_size = sizeof(u16),
+};
+
+static int ak4104_spi_probe(struct spi_device *spi)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = ak4104_codec;
+ struct ak4104_private *ak4104;
int ret;
- /* Connect the codec to the socdev. snd_soc_new_pcms() needs this. */
- socdev->card->codec = codec;
-
- /* Register PCMs */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms\n");
+ spi->bits_per_word = 8;
+ spi->mode = SPI_MODE_0;
+ ret = spi_setup(spi);
+ if (ret < 0)
return ret;
- }
- return 0;
+ ak4104 = kzalloc(sizeof(struct ak4104_private), GFP_KERNEL);
+ if (ak4104 == NULL)
+ return -ENOMEM;
+
+ ak4104->control_data = spi;
+ ak4104->control_type = SND_SOC_SPI;
+ spi_set_drvdata(spi, ak4104);
+
+ ret = snd_soc_register_codec(&spi->dev,
+ &soc_codec_device_ak4104, &ak4104_dai, 1);
+ if (ret < 0)
+ kfree(ak4104);
+ return ret;
}
-static int ak4104_remove(struct platform_device *pdev)
+static int __devexit ak4104_spi_remove(struct spi_device *spi)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- snd_soc_free_pcms(socdev);
+ snd_soc_unregister_codec(&spi->dev);
+ kfree(spi_get_drvdata(spi));
return 0;
-};
-
-struct snd_soc_codec_device soc_codec_device_ak4104 = {
- .probe = ak4104_probe,
- .remove = ak4104_remove
-};
-EXPORT_SYMBOL_GPL(soc_codec_device_ak4104);
+}
static struct spi_driver ak4104_spi_driver = {
.driver = {
diff --git a/sound/soc/codecs/ak4104.h b/sound/soc/codecs/ak4104.h
deleted file mode 100644
index eb88fe7e4def..000000000000
--- a/sound/soc/codecs/ak4104.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _AK4104_H
-#define _AK4104_H
-
-extern struct snd_soc_dai ak4104_dai;
-extern struct snd_soc_codec_device soc_codec_device_ak4104;
-
-#endif
diff --git a/sound/soc/codecs/ak4535.c b/sound/soc/codecs/ak4535.c
index d4253675b2d3..cd88c8f32a38 100644
--- a/sound/soc/codecs/ak4535.c
+++ b/sound/soc/codecs/ak4535.c
@@ -31,11 +31,11 @@
#define AK4535_VERSION "0.3"
-struct snd_soc_codec_device soc_codec_dev_ak4535;
-
/* codec private data */
struct ak4535_priv {
unsigned int sysclk;
+ enum snd_soc_control_type control_type;
+ void *control_data;
};
/*
@@ -313,8 +313,7 @@ static int ak4535_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct ak4535_priv *ak4535 = snd_soc_codec_get_drvdata(codec);
u8 mode2 = ak4535_read_reg_cache(codec, AK4535_MODE2) & ~(0x3 << 5);
int rate = params_rate(params), fs = 256;
@@ -378,14 +377,16 @@ static int ak4535_mute(struct snd_soc_dai *dai, int mute)
static int ak4535_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level)
{
- u16 i;
+ u16 i, mute_reg;
switch (level) {
case SND_SOC_BIAS_ON:
- ak4535_mute(codec->dai, 0);
+ mute_reg = ak4535_read_reg_cache(codec, AK4535_DAC) & 0xffdf;
+ ak4535_write(codec, AK4535_DAC, mute_reg);
break;
case SND_SOC_BIAS_PREPARE:
- ak4535_mute(codec->dai, 1);
+ mute_reg = ak4535_read_reg_cache(codec, AK4535_DAC) & 0xffdf;
+ ak4535_write(codec, AK4535_DAC, mute_reg | 0x20);
break;
case SND_SOC_BIAS_STANDBY:
i = ak4535_read_reg_cache(codec, AK4535_PM1);
@@ -413,8 +414,8 @@ static struct snd_soc_dai_ops ak4535_dai_ops = {
.set_sysclk = ak4535_set_dai_sysclk,
};
-struct snd_soc_dai ak4535_dai = {
- .name = "AK4535",
+static struct snd_soc_dai_driver ak4535_dai = {
+ .name = "ak4535-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -429,54 +430,27 @@ struct snd_soc_dai ak4535_dai = {
.formats = SNDRV_PCM_FMTBIT_S16_LE,},
.ops = &ak4535_dai_ops,
};
-EXPORT_SYMBOL_GPL(ak4535_dai);
-static int ak4535_suspend(struct platform_device *pdev, pm_message_t state)
+static int ak4535_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
ak4535_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int ak4535_resume(struct platform_device *pdev)
+static int ak4535_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
ak4535_sync(codec);
ak4535_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
}
-/*
- * initialise the AK4535 driver
- * register the mixer and dsp interfaces with the kernel
- */
-static int ak4535_init(struct snd_soc_device *socdev)
+static int ak4535_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = socdev->card->codec;
- int ret = 0;
+ struct ak4535_priv *ak4535 = snd_soc_codec_get_drvdata(codec);
- codec->name = "AK4535";
- codec->owner = THIS_MODULE;
- codec->read = ak4535_read_reg_cache;
- codec->write = ak4535_write;
- codec->set_bias_level = ak4535_set_bias_level;
- codec->dai = &ak4535_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = ARRAY_SIZE(ak4535_reg);
- codec->reg_cache = kmemdup(ak4535_reg, sizeof(ak4535_reg), GFP_KERNEL);
-
- if (codec->reg_cache == NULL)
- return -ENOMEM;
+ printk(KERN_INFO "AK4535 Audio Codec %s", AK4535_VERSION);
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "ak4535: failed to create pcms\n");
- goto pcm_err;
- }
+ codec->control_data = ak4535->control_data;
/* power on device */
ak4535_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
@@ -485,39 +459,55 @@ static int ak4535_init(struct snd_soc_device *socdev)
ARRAY_SIZE(ak4535_snd_controls));
ak4535_add_widgets(codec);
- return ret;
-
-pcm_err:
- kfree(codec->reg_cache);
+ return 0;
+}
- return ret;
+/* power down chip */
+static int ak4535_remove(struct snd_soc_codec *codec)
+{
+ ak4535_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
}
-static struct snd_soc_device *ak4535_socdev;
+static struct snd_soc_codec_driver soc_codec_dev_ak4535 = {
+ .probe = ak4535_probe,
+ .remove = ak4535_remove,
+ .suspend = ak4535_suspend,
+ .resume = ak4535_resume,
+ .read = ak4535_read_reg_cache,
+ .write = ak4535_write,
+ .set_bias_level = ak4535_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(ak4535_reg),
+ .reg_word_size = sizeof(u8),
+ .reg_cache_default = ak4535_reg,
+};
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
-
-static int ak4535_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+static __devinit int ak4535_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
{
- struct snd_soc_device *socdev = ak4535_socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct ak4535_priv *ak4535;
int ret;
- i2c_set_clientdata(i2c, codec);
- codec->control_data = i2c;
+ ak4535 = kzalloc(sizeof(struct ak4535_priv), GFP_KERNEL);
+ if (ak4535 == NULL)
+ return -ENOMEM;
- ret = ak4535_init(socdev);
- if (ret < 0)
- printk(KERN_ERR "failed to initialise AK4535\n");
+ i2c_set_clientdata(i2c, ak4535);
+ ak4535->control_data = i2c;
+ ak4535->control_type = SND_SOC_I2C;
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_ak4535, &ak4535_dai, 1);
+ if (ret < 0)
+ kfree(ak4535);
return ret;
}
-static int ak4535_i2c_remove(struct i2c_client *client)
+static __devexit int ak4535_i2c_remove(struct i2c_client *client)
{
- struct snd_soc_codec *codec = i2c_get_clientdata(client);
- kfree(codec->reg_cache);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -529,138 +519,34 @@ MODULE_DEVICE_TABLE(i2c, ak4535_i2c_id);
static struct i2c_driver ak4535_i2c_driver = {
.driver = {
- .name = "AK4535 I2C Codec",
+ .name = "ak4535-codec",
.owner = THIS_MODULE,
},
.probe = ak4535_i2c_probe,
- .remove = ak4535_i2c_remove,
+ .remove = __devexit_p(ak4535_i2c_remove),
.id_table = ak4535_i2c_id,
};
-
-static int ak4535_add_i2c_device(struct platform_device *pdev,
- const struct ak4535_setup_data *setup)
-{
- struct i2c_board_info info;
- struct i2c_adapter *adapter;
- struct i2c_client *client;
- int ret;
-
- ret = i2c_add_driver(&ak4535_i2c_driver);
- if (ret != 0) {
- dev_err(&pdev->dev, "can't add i2c driver\n");
- return ret;
- }
-
- memset(&info, 0, sizeof(struct i2c_board_info));
- info.addr = setup->i2c_address;
- strlcpy(info.type, "ak4535", I2C_NAME_SIZE);
-
- adapter = i2c_get_adapter(setup->i2c_bus);
- if (!adapter) {
- dev_err(&pdev->dev, "can't get i2c adapter %d\n",
- setup->i2c_bus);
- goto err_driver;
- }
-
- client = i2c_new_device(adapter, &info);
- i2c_put_adapter(adapter);
- if (!client) {
- dev_err(&pdev->dev, "can't add i2c device at 0x%x\n",
- (unsigned int)info.addr);
- goto err_driver;
- }
-
- return 0;
-
-err_driver:
- i2c_del_driver(&ak4535_i2c_driver);
- return -ENODEV;
-}
#endif
-static int ak4535_probe(struct platform_device *pdev)
+static int __init ak4535_modinit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct ak4535_setup_data *setup;
- struct snd_soc_codec *codec;
- struct ak4535_priv *ak4535;
- int ret;
-
- printk(KERN_INFO "AK4535 Audio Codec %s", AK4535_VERSION);
-
- setup = socdev->codec_data;
- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (codec == NULL)
- return -ENOMEM;
-
- ak4535 = kzalloc(sizeof(struct ak4535_priv), GFP_KERNEL);
- if (ak4535 == NULL) {
- kfree(codec);
- return -ENOMEM;
- }
-
- snd_soc_codec_set_drvdata(codec, ak4535);
- socdev->card->codec = codec;
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- ak4535_socdev = socdev;
- ret = -ENODEV;
-
+ int ret = 0;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
- if (setup->i2c_address) {
- codec->hw_write = (hw_write_t)i2c_master_send;
- ret = ak4535_add_i2c_device(pdev, setup);
- }
-#endif
-
+ ret = i2c_add_driver(&ak4535_i2c_driver);
if (ret != 0) {
- kfree(snd_soc_codec_get_drvdata(codec));
- kfree(codec);
+ printk(KERN_ERR "Failed to register AK4535 I2C driver: %d\n",
+ ret);
}
+#endif
return ret;
}
+module_init(ak4535_modinit);
-/* power down chip */
-static int ak4535_remove(struct platform_device *pdev)
+static void __exit ak4535_exit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec->control_data)
- ak4535_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
- if (codec->control_data)
- i2c_unregister_device(codec->control_data);
i2c_del_driver(&ak4535_i2c_driver);
#endif
- kfree(snd_soc_codec_get_drvdata(codec));
- kfree(codec);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_ak4535 = {
- .probe = ak4535_probe,
- .remove = ak4535_remove,
- .suspend = ak4535_suspend,
- .resume = ak4535_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_ak4535);
-
-static int __init ak4535_modinit(void)
-{
- return snd_soc_register_dai(&ak4535_dai);
-}
-module_init(ak4535_modinit);
-
-static void __exit ak4535_exit(void)
-{
- snd_soc_unregister_dai(&ak4535_dai);
}
module_exit(ak4535_exit);
diff --git a/sound/soc/codecs/ak4535.h b/sound/soc/codecs/ak4535.h
index c7a58703ea39..0431e5f634a2 100644
--- a/sound/soc/codecs/ak4535.h
+++ b/sound/soc/codecs/ak4535.h
@@ -36,12 +36,4 @@
#define AK4535_CACHEREGNUM 0x10
-struct ak4535_setup_data {
- int i2c_bus;
- unsigned short i2c_address;
-};
-
-extern struct snd_soc_dai ak4535_dai;
-extern struct snd_soc_codec_device soc_codec_dev_ak4535;
-
#endif
diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c
index 3d7dc55305ec..31b35e967398 100644
--- a/sound/soc/codecs/ak4642.c
+++ b/sound/soc/codecs/ak4642.c
@@ -30,8 +30,6 @@
#include <sound/initval.h>
#include <sound/tlv.h>
-#include "ak4642.h"
-
#define AK4642_VERSION "0.0.1"
#define PW_MGMT1 0x00
@@ -102,7 +100,6 @@
#define FS3 (1 << 5)
#define FS_MASK (FS0 | FS1 | FS2 | FS3)
-struct snd_soc_codec_device soc_codec_dev_ak4642;
/*
* Playback Volume (table 39)
@@ -123,11 +120,11 @@ static const struct snd_kcontrol_new ak4642_snd_controls[] = {
/* codec private data */
struct ak4642_priv {
- struct snd_soc_codec codec;
+ unsigned int sysclk;
+ enum snd_soc_control_type control_type;
+ void *control_data;
};
-static struct snd_soc_codec *ak4642_codec;
-
/*
* ak4642 register cache
*/
@@ -393,8 +390,8 @@ static struct snd_soc_dai_ops ak4642_dai_ops = {
.hw_params = ak4642_dai_hw_params,
};
-struct snd_soc_dai ak4642_dai = {
- .name = "AK4642",
+static struct snd_soc_dai_driver ak4642_dai = {
+ .name = "ak4642-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -410,112 +407,63 @@ struct snd_soc_dai ak4642_dai = {
.ops = &ak4642_dai_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(ak4642_dai);
-static int ak4642_resume(struct platform_device *pdev)
+static int ak4642_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
ak4642_sync(codec);
return 0;
}
-/*
- * initialise the AK4642 driver
- * register the mixer and dsp interfaces with the kernel
- */
-static int ak4642_init(struct ak4642_priv *ak4642)
+
+static int ak4642_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = &ak4642->codec;
- int ret = 0;
+ struct ak4642_priv *ak4642 = snd_soc_codec_get_drvdata(codec);
- if (ak4642_codec) {
- dev_err(codec->dev, "Another ak4642 is registered\n");
- return -EINVAL;
- }
+ dev_info(codec->dev, "AK4642 Audio Codec %s", AK4642_VERSION);
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, ak4642);
- codec->name = "AK4642";
- codec->owner = THIS_MODULE;
- codec->read = ak4642_read_reg_cache;
- codec->write = ak4642_write;
- codec->dai = &ak4642_dai;
- codec->num_dai = 1;
codec->hw_write = (hw_write_t)i2c_master_send;
- codec->reg_cache_size = ARRAY_SIZE(ak4642_reg);
- codec->reg_cache = kmemdup(ak4642_reg,
- sizeof(ak4642_reg), GFP_KERNEL);
-
- if (!codec->reg_cache)
- return -ENOMEM;
-
- ak4642_dai.dev = codec->dev;
- ak4642_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto reg_cache_err;
- }
+ codec->control_data = ak4642->control_data;
- ret = snd_soc_register_dai(&ak4642_dai);
- if (ret) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- snd_soc_unregister_codec(codec);
- goto reg_cache_err;
- }
-
- return ret;
-
-reg_cache_err:
- kfree(codec->reg_cache);
- codec->reg_cache = NULL;
- return ret;
+ return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_ak4642 = {
+ .probe = ak4642_probe,
+ .resume = ak4642_resume,
+ .read = ak4642_read_reg_cache,
+ .write = ak4642_write,
+ .reg_cache_size = ARRAY_SIZE(ak4642_reg),
+ .reg_word_size = sizeof(u8),
+ .reg_cache_default = ak4642_reg,
+};
+
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
-static int ak4642_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+static __devinit int ak4642_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
{
struct ak4642_priv *ak4642;
- struct snd_soc_codec *codec;
int ret;
ak4642 = kzalloc(sizeof(struct ak4642_priv), GFP_KERNEL);
- if (!ak4642)
+ if (ak4642 == NULL)
return -ENOMEM;
- codec = &ak4642->codec;
- codec->dev = &i2c->dev;
-
i2c_set_clientdata(i2c, ak4642);
- codec->control_data = i2c;
+ ak4642->control_data = i2c;
+ ak4642->control_type = SND_SOC_I2C;
- ret = ak4642_init(ak4642);
- if (ret < 0) {
- printk(KERN_ERR "failed to initialise AK4642\n");
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_ak4642, &ak4642_dai, 1);
+ if (ret < 0)
kfree(ak4642);
- }
-
return ret;
}
-static int ak4642_i2c_remove(struct i2c_client *client)
+static __devexit int ak4642_i2c_remove(struct i2c_client *client)
{
- struct ak4642_priv *ak4642 = i2c_get_clientdata(client);
-
- snd_soc_unregister_dai(&ak4642_dai);
- snd_soc_unregister_codec(&ak4642->codec);
- kfree(ak4642->codec.reg_cache);
- kfree(ak4642);
- ak4642_codec = NULL;
-
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -528,64 +476,15 @@ MODULE_DEVICE_TABLE(i2c, ak4642_i2c_id);
static struct i2c_driver ak4642_i2c_driver = {
.driver = {
- .name = "AK4642 I2C Codec",
+ .name = "ak4642-codec",
.owner = THIS_MODULE,
},
- .probe = ak4642_i2c_probe,
- .remove = ak4642_i2c_remove,
- .id_table = ak4642_i2c_id,
+ .probe = ak4642_i2c_probe,
+ .remove = __devexit_p(ak4642_i2c_remove),
+ .id_table = ak4642_i2c_id,
};
-
#endif
-static int ak4642_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- int ret;
-
- if (!ak4642_codec) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = ak4642_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "ak4642: failed to create pcms\n");
- goto pcm_err;
- }
-
- snd_soc_add_controls(ak4642_codec, ak4642_snd_controls,
- ARRAY_SIZE(ak4642_snd_controls));
-
- dev_info(&pdev->dev, "AK4642 Audio Codec %s", AK4642_VERSION);
- return ret;
-
-pcm_err:
- return ret;
-
-}
-
-/* power down chip */
-static int ak4642_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_ak4642 = {
- .probe = ak4642_probe,
- .remove = ak4642_remove,
- .resume = ak4642_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_ak4642);
-
static int __init ak4642_modinit(void)
{
int ret = 0;
diff --git a/sound/soc/codecs/ak4642.h b/sound/soc/codecs/ak4642.h
deleted file mode 100644
index e476833d314e..000000000000
--- a/sound/soc/codecs/ak4642.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * ak4642.h -- AK4642 Soc Audio driver
- *
- * Copyright (C) 2009 Renesas Solutions Corp.
- * Kuninori Morimoto <morimoto.kuninori@renesas.com>
- *
- * Based on ak4535.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef _AK4642_H
-#define _AK4642_H
-
-extern struct snd_soc_dai ak4642_dai;
-extern struct snd_soc_codec_device soc_codec_dev_ak4642;
-
-#endif
diff --git a/sound/soc/codecs/ak4671.c b/sound/soc/codecs/ak4671.c
index 87566932a3b1..239f0562003c 100644
--- a/sound/soc/codecs/ak4671.c
+++ b/sound/soc/codecs/ak4671.c
@@ -23,11 +23,11 @@
#include "ak4671.h"
-static struct snd_soc_codec *ak4671_codec;
/* codec private data */
struct ak4671_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
+ void *control_data;
u8 reg_cache[AK4671_CACHEREGNUM];
};
@@ -619,8 +619,8 @@ static struct snd_soc_dai_ops ak4671_dai_ops = {
.set_fmt = ak4671_set_dai_fmt,
};
-struct snd_soc_dai ak4671_dai = {
- .name = "AK4671",
+static struct snd_soc_dai_driver ak4671_dai = {
+ .name = "ak4671-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -635,27 +635,19 @@ struct snd_soc_dai ak4671_dai = {
.formats = AK4671_FORMATS,},
.ops = &ak4671_dai_ops,
};
-EXPORT_SYMBOL_GPL(ak4671_dai);
-static int ak4671_probe(struct platform_device *pdev)
+static int ak4671_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (ak4671_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
+ struct ak4671_priv *ak4671 = snd_soc_codec_get_drvdata(codec);
+ int ret;
- socdev->card->codec = ak4671_codec;
- codec = ak4671_codec;
+ codec->hw_write = (hw_write_t)i2c_master_send;
+ codec->bias_level = SND_SOC_BIAS_OFF;
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
+ ret = snd_soc_codec_set_cache_io(codec, 8, 8, ak4671->control_type);
if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
+ dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
+ return ret;
}
snd_soc_add_controls(codec, ak4671_snd_controls,
@@ -665,121 +657,48 @@ static int ak4671_probe(struct platform_device *pdev)
ak4671_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return ret;
-
-pcm_err:
- return ret;
}
-static int ak4671_remove(struct platform_device *pdev)
+static int ak4671_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
+ ak4671_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_ak4671 = {
+static struct snd_soc_codec_driver soc_codec_dev_ak4671 = {
.probe = ak4671_probe,
.remove = ak4671_remove,
+ .set_bias_level = ak4671_set_bias_level,
+ .reg_cache_size = AK4671_CACHEREGNUM,
+ .reg_word_size = sizeof(u8),
+ .reg_cache_default = ak4671_reg,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_ak4671);
-
-static int ak4671_register(struct ak4671_priv *ak4671,
- enum snd_soc_control_type control)
-{
- int ret;
- struct snd_soc_codec *codec = &ak4671->codec;
-
- if (ak4671_codec) {
- dev_err(codec->dev, "Another AK4671 is registered\n");
- ret = -EINVAL;
- goto err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, ak4671);
- codec->name = "AK4671";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = ak4671_set_bias_level;
- codec->dai = &ak4671_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = AK4671_CACHEREGNUM;
- codec->reg_cache = &ak4671->reg_cache;
-
- memcpy(codec->reg_cache, ak4671_reg, sizeof(ak4671_reg));
-
- ret = snd_soc_codec_set_cache_io(codec, 8, 8, control);
- if (ret < 0) {
- dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
- }
-
- ak4671_dai.dev = codec->dev;
- ak4671_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
-
- ret = snd_soc_register_dai(&ak4671_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
-
- return 0;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- kfree(ak4671);
- return ret;
-}
-
-static void ak4671_unregister(struct ak4671_priv *ak4671)
-{
- ak4671_set_bias_level(&ak4671->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dai(&ak4671_dai);
- snd_soc_unregister_codec(&ak4671->codec);
- kfree(ak4671);
- ak4671_codec = NULL;
-}
static int __devinit ak4671_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct ak4671_priv *ak4671;
- struct snd_soc_codec *codec;
+ int ret;
ak4671 = kzalloc(sizeof(struct ak4671_priv), GFP_KERNEL);
if (ak4671 == NULL)
return -ENOMEM;
- codec = &ak4671->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
-
i2c_set_clientdata(client, ak4671);
- codec->control_data = client;
-
- codec->dev = &client->dev;
+ ak4671->control_data = client;
+ ak4671->control_type = SND_SOC_I2C;
- return ak4671_register(ak4671, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&client->dev,
+ &soc_codec_dev_ak4671, &ak4671_dai, 1);
+ if (ret < 0)
+ kfree(ak4671);
+ return ret;
}
static __devexit int ak4671_i2c_remove(struct i2c_client *client)
{
- struct ak4671_priv *ak4671 = i2c_get_clientdata(client);
-
- ak4671_unregister(ak4671);
-
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -791,7 +710,7 @@ MODULE_DEVICE_TABLE(i2c, ak4671_i2c_id);
static struct i2c_driver ak4671_i2c_driver = {
.driver = {
- .name = "ak4671",
+ .name = "ak4671-codec",
.owner = THIS_MODULE,
},
.probe = ak4671_i2c_probe,
diff --git a/sound/soc/codecs/ak4671.h b/sound/soc/codecs/ak4671.h
index e2fad964e88b..61cb7ab7552c 100644
--- a/sound/soc/codecs/ak4671.h
+++ b/sound/soc/codecs/ak4671.h
@@ -150,7 +150,4 @@
/* AK4671_LOUT2_POWER_MANAGEMENT (0x10) Fields */
#define AK4671_MUTEN 0x04
-extern struct snd_soc_dai ak4671_dai;
-extern struct snd_soc_codec_device soc_codec_dev_ak4671;
-
#endif
diff --git a/sound/soc/codecs/cq93vc.c b/sound/soc/codecs/cq93vc.c
index a320fb5a0e26..823643932dde 100644
--- a/sound/soc/codecs/cq93vc.c
+++ b/sound/soc/codecs/cq93vc.c
@@ -30,6 +30,7 @@
#include <linux/slab.h>
#include <linux/clk.h>
#include <linux/mfd/davinci_voicecodec.h>
+#include <linux/spi/spi.h>
#include <sound/core.h>
#include <sound/pcm.h>
@@ -41,8 +42,6 @@
#include <mach/dm365.h>
-#include "cq93vc.h"
-
static inline unsigned int cq93vc_read(struct snd_soc_codec *codec,
unsigned int reg)
{
@@ -130,8 +129,8 @@ static struct snd_soc_dai_ops cq93vc_dai_ops = {
.set_sysclk = cq93vc_set_dai_sysclk,
};
-struct snd_soc_dai cq93vc_dai = {
- .name = "CQ93VC",
+static struct snd_soc_dai_driver cq93vc_dai = {
+ .name = "cq93vc-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -146,36 +145,20 @@ struct snd_soc_dai cq93vc_dai = {
.formats = CQ93VC_FORMATS,},
.ops = &cq93vc_dai_ops,
};
-EXPORT_SYMBOL_GPL(cq93vc_dai);
-static int cq93vc_resume(struct platform_device *pdev)
+static int cq93vc_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
cq93vc_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
}
-static struct snd_soc_codec *cq93vc_codec;
-
-static int cq93vc_probe(struct platform_device *pdev)
+static int cq93vc_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct device *dev = &pdev->dev;
- struct snd_soc_codec *codec;
- int ret;
-
- socdev->card->codec = cq93vc_codec;
- codec = socdev->card->codec;
-
- /* Register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(dev, "%s: failed to create pcms\n", pdev->name);
- return ret;
- }
+ struct davinci_vc *davinci_vc = codec->dev->platform_data;
+
+ davinci_vc->cq93vc.codec = codec;
+ codec->control_data = davinci_vc;
/* Set controls */
snd_soc_add_controls(codec, cq93vc_snd_controls,
@@ -187,108 +170,51 @@ static int cq93vc_probe(struct platform_device *pdev)
return 0;
}
-static int cq93vc_remove(struct platform_device *pdev)
+static int cq93vc_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
+ cq93vc_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_cq93vc = {
+static struct snd_soc_codec_driver soc_codec_dev_cq93vc = {
+ .read = cq93vc_read,
+ .write = cq93vc_write,
+ .set_bias_level = cq93vc_set_bias_level,
.probe = cq93vc_probe,
.remove = cq93vc_remove,
.resume = cq93vc_resume,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_cq93vc);
-static __init int cq93vc_codec_probe(struct platform_device *pdev)
+static int cq93vc_platform_probe(struct platform_device *pdev)
{
- struct davinci_vc *davinci_vc = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret;
-
- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (codec == NULL) {
- dev_dbg(davinci_vc->dev,
- "could not allocate memory for codec data\n");
- return -ENOMEM;
- }
-
- davinci_vc->cq93vc.codec = codec;
-
- cq93vc_dai.dev = &pdev->dev;
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
- codec->dev = &pdev->dev;
- codec->name = "CQ93VC";
- codec->owner = THIS_MODULE;
- codec->read = cq93vc_read;
- codec->write = cq93vc_write;
- codec->set_bias_level = cq93vc_set_bias_level;
- codec->dai = &cq93vc_dai;
- codec->num_dai = 1;
- codec->control_data = davinci_vc;
-
- cq93vc_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret) {
- dev_err(davinci_vc->dev, "failed to register codec\n");
- goto fail1;
- }
-
- ret = snd_soc_register_dai(&cq93vc_dai);
- if (ret) {
- dev_err(davinci_vc->dev, "could register dai\n");
- goto fail2;
- }
- return 0;
-
-fail2:
- snd_soc_unregister_codec(codec);
-
-fail1:
- kfree(codec);
- cq93vc_codec = NULL;
-
- return ret;
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_cq93vc, &cq93vc_dai, 1);
}
-static int __devexit cq93vc_codec_remove(struct platform_device *pdev)
+static int cq93vc_platform_remove(struct platform_device *pdev)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- snd_soc_unregister_dai(&cq93vc_dai);
- snd_soc_unregister_codec(&codec);
-
- kfree(codec);
- cq93vc_codec = NULL;
-
+ snd_soc_unregister_codec(&pdev->dev);
return 0;
}
static struct platform_driver cq93vc_codec_driver = {
.driver = {
- .name = "cq93vc",
- .owner = THIS_MODULE,
- },
- .probe = cq93vc_codec_probe,
- .remove = __devexit_p(cq93vc_codec_remove),
+ .name = "cq93vc-codec",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = cq93vc_platform_probe,
+ .remove = __devexit_p(cq93vc_platform_remove),
};
-static __init int cq93vc_init(void)
+static int __init cq93vc_init(void)
{
- return platform_driver_probe(&cq93vc_codec_driver, cq93vc_codec_probe);
+ return platform_driver_register(&cq93vc_codec_driver);
}
module_init(cq93vc_init);
-static __exit void cq93vc_exit(void)
+static void __exit cq93vc_exit(void)
{
platform_driver_unregister(&cq93vc_codec_driver);
}
diff --git a/sound/soc/codecs/cq93vc.h b/sound/soc/codecs/cq93vc.h
deleted file mode 100644
index 845b1968ef9c..000000000000
--- a/sound/soc/codecs/cq93vc.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * ALSA SoC CQ0093 Voice Codec Driver for DaVinci platforms
- *
- * Copyright (C) 2010 Texas Instruments, Inc
- *
- * Author: Miguel Aguilar <miguel.aguilar@ridgerun.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef _CQ93VC_H
-#define _CQ93VC_H
-
-extern struct snd_soc_dai cq93vc_dai;
-extern struct snd_soc_codec_device soc_codec_dev_cq93vc;
-
-#endif
diff --git a/sound/soc/codecs/cs4270.c b/sound/soc/codecs/cs4270.c
index 30d949239def..6542dc038951 100644
--- a/sound/soc/codecs/cs4270.c
+++ b/sound/soc/codecs/cs4270.c
@@ -31,8 +31,6 @@
#include <linux/delay.h>
#include <linux/regulator/consumer.h>
-#include "cs4270.h"
-
/*
* The codec isn't really big-endian or little-endian, since the I2S
* interface requires data to be sent serially with the MSbit first.
@@ -114,7 +112,8 @@ static const char *supply_names[] = {
/* Private data for the CS4270 */
struct cs4270_private {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
+ void *control_data;
u8 reg_cache[CS4270_NUMREGS];
unsigned int mclk; /* Input frequency of the MCLK pin */
unsigned int mode; /* The mode (I2S or left-justified) */
@@ -212,44 +211,8 @@ static int cs4270_set_dai_sysclk(struct snd_soc_dai *codec_dai,
{
struct snd_soc_codec *codec = codec_dai->codec;
struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
- unsigned int rates = 0;
- unsigned int rate_min = -1;
- unsigned int rate_max = 0;
- unsigned int i;
cs4270->mclk = freq;
-
- if (cs4270->mclk) {
- for (i = 0; i < NUM_MCLK_RATIOS; i++) {
- unsigned int rate = freq / cs4270_mode_ratios[i].ratio;
- rates |= snd_pcm_rate_to_rate_bit(rate);
- if (rate < rate_min)
- rate_min = rate;
- if (rate > rate_max)
- rate_max = rate;
- }
- /* FIXME: soc should support a rate list */
- rates &= ~SNDRV_PCM_RATE_KNOT;
-
- if (!rates) {
- dev_err(codec->dev, "could not find a valid sample rate\n");
- return -EINVAL;
- }
- } else {
- /* enable all possible rates */
- rates = SNDRV_PCM_RATE_8000_192000;
- rate_min = 8000;
- rate_max = 192000;
- }
-
- codec_dai->playback.rates = rates;
- codec_dai->playback.rate_min = rate_min;
- codec_dai->playback.rate_max = rate_max;
-
- codec_dai->capture.rates = rates;
- codec_dai->capture.rate_min = rate_min;
- codec_dai->capture.rate_max = rate_max;
-
return 0;
}
@@ -410,8 +373,7 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
int ret;
unsigned int i;
@@ -549,19 +511,6 @@ static const struct snd_kcontrol_new cs4270_snd_controls[] = {
snd_soc_get_volsw, cs4270_soc_put_mute),
};
-/*
- * cs4270_codec - global variable to store codec for the ASoC probe function
- *
- * If struct i2c_driver had a private_data field, we wouldn't need to use
- * cs4270_codec. This is the only way to pass the codec structure from
- * cs4270_i2c_probe() to cs4270_probe(). Unfortunately, there is no good
- * way to synchronize these two functions. cs4270_i2c_probe() can be called
- * multiple times before cs4270_probe() is called even once. So for now, we
- * also only allow cs4270_i2c_probe() to be run once. That means that we do
- * not support more than one cs4270 device in the system, at least for now.
- */
-static struct snd_soc_codec *cs4270_codec;
-
static struct snd_soc_dai_ops cs4270_dai_ops = {
.hw_params = cs4270_hw_params,
.set_sysclk = cs4270_set_dai_sysclk,
@@ -569,20 +518,24 @@ static struct snd_soc_dai_ops cs4270_dai_ops = {
.digital_mute = cs4270_dai_mute,
};
-struct snd_soc_dai cs4270_dai = {
- .name = "cs4270",
+struct snd_soc_dai_driver cs4270_dai = {
+ .name = "cs4270-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
.channels_max = 2,
- .rates = 0,
+ .rates = SNDRV_PCM_RATE_CONTINUOUS,
+ .rate_min = 4000,
+ .rate_max = 216000,
.formats = CS4270_FORMATS,
},
.capture = {
.stream_name = "Capture",
.channels_min = 1,
.channels_max = 2,
- .rates = 0,
+ .rates = SNDRV_PCM_RATE_CONTINUOUS,
+ .rate_min = 4000,
+ .rate_max = 216000,
.formats = CS4270_FORMATS,
},
.ops = &cs4270_dai_ops,
@@ -596,153 +549,19 @@ EXPORT_SYMBOL_GPL(cs4270_dai);
* This function is called when ASoC has all the pieces it needs to
* instantiate a sound driver.
*/
-static int cs4270_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = cs4270_codec;
- struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
- int i, ret;
-
- /* Connect the codec to the socdev. snd_soc_new_pcms() needs this. */
- socdev->card->codec = codec;
-
- /* Register PCMs */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms\n");
- return ret;
- }
-
- /* Add the non-DAPM controls */
- ret = snd_soc_add_controls(codec, cs4270_snd_controls,
- ARRAY_SIZE(cs4270_snd_controls));
- if (ret < 0) {
- dev_err(codec->dev, "failed to add controls\n");
- goto error_free_pcms;
- }
-
- /* get the power supply regulators */
- for (i = 0; i < ARRAY_SIZE(supply_names); i++)
- cs4270->supplies[i].supply = supply_names[i];
-
- ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(cs4270->supplies),
- cs4270->supplies);
- if (ret < 0)
- goto error_free_pcms;
-
- ret = regulator_bulk_enable(ARRAY_SIZE(cs4270->supplies),
- cs4270->supplies);
- if (ret < 0)
- goto error_free_regulators;
-
- return 0;
-
-error_free_regulators:
- regulator_bulk_free(ARRAY_SIZE(cs4270->supplies),
- cs4270->supplies);
-
-error_free_pcms:
- snd_soc_free_pcms(socdev);
-
- return ret;
-}
-
-/**
- * cs4270_remove - ASoC remove function
- * @pdev: platform device
- *
- * This function is the counterpart to cs4270_probe().
- */
-static int cs4270_remove(struct platform_device *pdev)
+static int cs4270_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = cs4270_codec;
struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
+ int i, ret, reg;
- snd_soc_free_pcms(socdev);
- regulator_bulk_disable(ARRAY_SIZE(cs4270->supplies), cs4270->supplies);
- regulator_bulk_free(ARRAY_SIZE(cs4270->supplies), cs4270->supplies);
-
- return 0;
-};
-
-/**
- * cs4270_i2c_probe - initialize the I2C interface of the CS4270
- * @i2c_client: the I2C client object
- * @id: the I2C device ID (ignored)
- *
- * This function is called whenever the I2C subsystem finds a device that
- * matches the device ID given via a prior call to i2c_add_driver().
- */
-static int cs4270_i2c_probe(struct i2c_client *i2c_client,
- const struct i2c_device_id *id)
-{
- struct snd_soc_codec *codec;
- struct cs4270_private *cs4270;
- unsigned int reg;
- int ret;
-
- /* For now, we only support one cs4270 device in the system. See the
- * comment for cs4270_codec.
- */
- if (cs4270_codec) {
- dev_err(&i2c_client->dev, "ignoring CS4270 at addr %X\n",
- i2c_client->addr);
- dev_err(&i2c_client->dev, "only one per board allowed\n");
- /* Should we return something other than ENODEV here? */
- return -ENODEV;
- }
-
- /* Verify that we have a CS4270 */
-
- ret = i2c_smbus_read_byte_data(i2c_client, CS4270_CHIPID);
- if (ret < 0) {
- dev_err(&i2c_client->dev, "failed to read i2c at addr %X\n",
- i2c_client->addr);
- return ret;
- }
- /* The top four bits of the chip ID should be 1100. */
- if ((ret & 0xF0) != 0xC0) {
- dev_err(&i2c_client->dev, "device at addr %X is not a CS4270\n",
- i2c_client->addr);
- return -ENODEV;
- }
-
- dev_info(&i2c_client->dev, "found device at i2c address %X\n",
- i2c_client->addr);
- dev_info(&i2c_client->dev, "hardware revision %X\n", ret & 0xF);
-
- /* Allocate enough space for the snd_soc_codec structure
- and our private data together. */
- cs4270 = kzalloc(sizeof(struct cs4270_private), GFP_KERNEL);
- if (!cs4270) {
- dev_err(&i2c_client->dev, "could not allocate codec\n");
- return -ENOMEM;
- }
- codec = &cs4270->codec;
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->dev = &i2c_client->dev;
- codec->name = "CS4270";
- codec->owner = THIS_MODULE;
- codec->dai = &cs4270_dai;
- codec->num_dai = 1;
- snd_soc_codec_set_drvdata(codec, cs4270);
- codec->control_data = i2c_client;
- codec->read = cs4270_read_reg_cache;
- codec->write = cs4270_i2c_write;
- codec->reg_cache = cs4270->reg_cache;
- codec->reg_cache_size = CS4270_NUMREGS;
+ codec->control_data = cs4270->control_data;
/* The I2C interface is set up, so pre-fill our register cache */
ret = cs4270_fill_cache(codec);
if (ret < 0) {
- dev_err(&i2c_client->dev, "failed to fill register cache\n");
- goto error_free_codec;
+ dev_err(codec->dev, "failed to fill register cache\n");
+ return ret;
}
/* Disable auto-mute. This feature appears to be buggy. In some
@@ -755,7 +574,7 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client,
reg &= ~CS4270_MUTE_AUTO;
ret = cs4270_i2c_write(codec, CS4270_MUTE, reg);
if (ret < 0) {
- dev_err(&i2c_client->dev, "i2c write failed\n");
+ dev_err(codec->dev, "i2c write failed\n");
return ret;
}
@@ -769,65 +588,56 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client,
reg &= ~(CS4270_TRANS_SOFT | CS4270_TRANS_ZERO);
ret = cs4270_i2c_write(codec, CS4270_TRANS, reg);
if (ret < 0) {
- dev_err(&i2c_client->dev, "i2c write failed\n");
+ dev_err(codec->dev, "i2c write failed\n");
return ret;
}
- /* Initialize the DAI. Normally, we'd prefer to have a kmalloc'd DAI
- * structure for each CS4270 device, but the machine driver needs to
- * have a pointer to the DAI structure, so for now it must be a global
- * variable.
- */
- cs4270_dai.dev = &i2c_client->dev;
-
- /* Register the DAI. If all the other ASoC driver have already
- * registered, then this will call our probe function, so
- * cs4270_codec needs to be ready.
- */
- cs4270_codec = codec;
- ret = snd_soc_register_dai(&cs4270_dai);
+ /* Add the non-DAPM controls */
+ ret = snd_soc_add_controls(codec, cs4270_snd_controls,
+ ARRAY_SIZE(cs4270_snd_controls));
if (ret < 0) {
- dev_err(&i2c_client->dev, "failed to register DAIe\n");
- goto error_free_codec;
+ dev_err(codec->dev, "failed to add controls\n");
+ return ret;
}
- i2c_set_clientdata(i2c_client, cs4270);
+ /* get the power supply regulators */
+ for (i = 0; i < ARRAY_SIZE(supply_names); i++)
+ cs4270->supplies[i].supply = supply_names[i];
+
+ ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(cs4270->supplies),
+ cs4270->supplies);
+ if (ret < 0)
+ return ret;
+
+ ret = regulator_bulk_enable(ARRAY_SIZE(cs4270->supplies),
+ cs4270->supplies);
+ if (ret < 0)
+ goto error_free_regulators;
return 0;
-error_free_codec:
- kfree(cs4270);
- cs4270_codec = NULL;
- cs4270_dai.dev = NULL;
+error_free_regulators:
+ regulator_bulk_free(ARRAY_SIZE(cs4270->supplies),
+ cs4270->supplies);
return ret;
}
/**
- * cs4270_i2c_remove - remove an I2C device
- * @i2c_client: the I2C client object
+ * cs4270_remove - ASoC remove function
+ * @pdev: platform device
*
- * This function is the counterpart to cs4270_i2c_probe().
+ * This function is the counterpart to cs4270_probe().
*/
-static int cs4270_i2c_remove(struct i2c_client *i2c_client)
+static int cs4270_remove(struct snd_soc_codec *codec)
{
- struct cs4270_private *cs4270 = i2c_get_clientdata(i2c_client);
+ struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
- kfree(cs4270);
- cs4270_codec = NULL;
- cs4270_dai.dev = NULL;
+ regulator_bulk_disable(ARRAY_SIZE(cs4270->supplies), cs4270->supplies);
+ regulator_bulk_free(ARRAY_SIZE(cs4270->supplies), cs4270->supplies);
return 0;
-}
-
-/*
- * cs4270_id - I2C device IDs supported by this driver
- */
-static struct i2c_device_id cs4270_id[] = {
- {"cs4270", 0},
- {}
};
-MODULE_DEVICE_TABLE(i2c, cs4270_id);
#ifdef CONFIG_PM
@@ -840,9 +650,8 @@ MODULE_DEVICE_TABLE(i2c, cs4270_id);
* and all registers are written back to the hardware when resuming.
*/
-static int cs4270_soc_suspend(struct platform_device *pdev, pm_message_t mesg)
+static int cs4270_soc_suspend(struct snd_soc_codec *codec, pm_message_t mesg)
{
- struct snd_soc_codec *codec = cs4270_codec;
struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
int reg, ret;
@@ -860,9 +669,8 @@ static int cs4270_soc_suspend(struct platform_device *pdev, pm_message_t mesg)
return 0;
}
-static int cs4270_soc_resume(struct platform_device *pdev)
+static int cs4270_soc_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = cs4270_codec;
struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
struct i2c_client *i2c_client = codec->control_data;
int reg;
@@ -896,6 +704,95 @@ static int cs4270_soc_resume(struct platform_device *pdev)
#endif /* CONFIG_PM */
/*
+ * ASoC codec device structure
+ *
+ * Assign this variable to the codec_dev field of the machine driver's
+ * snd_soc_device structure.
+ */
+static struct snd_soc_codec_driver soc_codec_device_cs4270 = {
+ .probe = cs4270_probe,
+ .remove = cs4270_remove,
+ .suspend = cs4270_soc_suspend,
+ .resume = cs4270_soc_resume,
+ .read = cs4270_read_reg_cache,
+ .write = cs4270_i2c_write,
+ .reg_cache_size = CS4270_NUMREGS,
+ .reg_word_size = sizeof(u8),
+};
+
+/**
+ * cs4270_i2c_probe - initialize the I2C interface of the CS4270
+ * @i2c_client: the I2C client object
+ * @id: the I2C device ID (ignored)
+ *
+ * This function is called whenever the I2C subsystem finds a device that
+ * matches the device ID given via a prior call to i2c_add_driver().
+ */
+static int cs4270_i2c_probe(struct i2c_client *i2c_client,
+ const struct i2c_device_id *id)
+{
+ struct cs4270_private *cs4270;
+ int ret;
+
+ /* Verify that we have a CS4270 */
+
+ ret = i2c_smbus_read_byte_data(i2c_client, CS4270_CHIPID);
+ if (ret < 0) {
+ dev_err(&i2c_client->dev, "failed to read i2c at addr %X\n",
+ i2c_client->addr);
+ return ret;
+ }
+ /* The top four bits of the chip ID should be 1100. */
+ if ((ret & 0xF0) != 0xC0) {
+ dev_err(&i2c_client->dev, "device at addr %X is not a CS4270\n",
+ i2c_client->addr);
+ return -ENODEV;
+ }
+
+ dev_info(&i2c_client->dev, "found device at i2c address %X\n",
+ i2c_client->addr);
+ dev_info(&i2c_client->dev, "hardware revision %X\n", ret & 0xF);
+
+ cs4270 = kzalloc(sizeof(struct cs4270_private), GFP_KERNEL);
+ if (!cs4270) {
+ dev_err(&i2c_client->dev, "could not allocate codec\n");
+ return -ENOMEM;
+ }
+
+ i2c_set_clientdata(i2c_client, cs4270);
+ cs4270->control_data = i2c_client;
+ cs4270->control_type = SND_SOC_I2C;
+
+ ret = snd_soc_register_codec(&i2c_client->dev,
+ &soc_codec_device_cs4270, &cs4270_dai, 1);
+ if (ret < 0)
+ kfree(cs4270);
+ return ret;
+}
+
+/**
+ * cs4270_i2c_remove - remove an I2C device
+ * @i2c_client: the I2C client object
+ *
+ * This function is the counterpart to cs4270_i2c_probe().
+ */
+static int cs4270_i2c_remove(struct i2c_client *i2c_client)
+{
+ snd_soc_unregister_codec(&i2c_client->dev);
+ kfree(i2c_get_clientdata(i2c_client));
+ return 0;
+}
+
+/*
+ * cs4270_id - I2C device IDs supported by this driver
+ */
+static struct i2c_device_id cs4270_id[] = {
+ {"cs4270", 0},
+ {}
+};
+MODULE_DEVICE_TABLE(i2c, cs4270_id);
+
+/*
* cs4270_i2c_driver - I2C device identification
*
* This structure tells the I2C subsystem how to identify and support a
@@ -903,7 +800,7 @@ static int cs4270_soc_resume(struct platform_device *pdev)
*/
static struct i2c_driver cs4270_i2c_driver = {
.driver = {
- .name = "cs4270",
+ .name = "cs4270-codec",
.owner = THIS_MODULE,
},
.id_table = cs4270_id,
@@ -911,20 +808,6 @@ static struct i2c_driver cs4270_i2c_driver = {
.remove = cs4270_i2c_remove,
};
-/*
- * ASoC codec device structure
- *
- * Assign this variable to the codec_dev field of the machine driver's
- * snd_soc_device structure.
- */
-struct snd_soc_codec_device soc_codec_device_cs4270 = {
- .probe = cs4270_probe,
- .remove = cs4270_remove,
- .suspend = cs4270_soc_suspend,
- .resume = cs4270_soc_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_device_cs4270);
-
static int __init cs4270_init(void)
{
pr_info("Cirrus Logic CS4270 ALSA SoC Codec Driver\n");
diff --git a/sound/soc/codecs/cs4270.h b/sound/soc/codecs/cs4270.h
deleted file mode 100644
index adc6cd9667d4..000000000000
--- a/sound/soc/codecs/cs4270.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Cirrus Logic CS4270 ALSA SoC Codec Driver
- *
- * Author: Timur Tabi <timur@freescale.com>
- *
- * Copyright 2007 Freescale Semiconductor, Inc. This file is licensed under
- * the terms of the GNU General Public License version 2. This program
- * is licensed "as is" without any warranty of any kind, whether express
- * or implied.
- */
-
-#ifndef _CS4270_H
-#define _CS4270_H
-
-/*
- * The ASoC codec DAI structure for the CS4270. Assign this structure to
- * the .codec_dai field of your machine driver's snd_soc_dai_link structure.
- */
-extern struct snd_soc_dai cs4270_dai;
-
-/*
- * The ASoC codec device structure for the CS4270. Assign this structure
- * to the .codec_dev field of your machine driver's snd_soc_device
- * structure.
- */
-extern struct snd_soc_codec_device soc_codec_device_cs4270;
-
-#endif
diff --git a/sound/soc/codecs/cs42l51.c b/sound/soc/codecs/cs42l51.c
index dd9b8550c402..8a25743870c2 100644
--- a/sound/soc/codecs/cs42l51.c
+++ b/sound/soc/codecs/cs42l51.c
@@ -42,15 +42,14 @@ enum master_slave_mode {
};
struct cs42l51_private {
+ enum snd_soc_control_type control_type;
+ void *control_data;
unsigned int mclk;
unsigned int audio_mode; /* The mode (I2S or left-justified) */
enum master_slave_mode func;
- struct snd_soc_codec codec;
u8 reg_cache[CS42L51_NUMREGS];
};
-static struct snd_soc_codec *cs42l51_codec;
-
#define CS42L51_FORMATS ( \
SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE | \
SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S18_3BE | \
@@ -75,134 +74,6 @@ static int cs42l51_fill_cache(struct snd_soc_codec *codec)
return 0;
}
-static int cs42l51_i2c_probe(struct i2c_client *i2c_client,
- const struct i2c_device_id *id)
-{
- struct snd_soc_codec *codec;
- struct cs42l51_private *cs42l51;
- int ret = 0;
- int reg;
-
- if (cs42l51_codec)
- return -EBUSY;
-
- /* Verify that we have a CS42L51 */
- ret = i2c_smbus_read_byte_data(i2c_client, CS42L51_CHIP_REV_ID);
- if (ret < 0) {
- dev_err(&i2c_client->dev, "failed to read I2C\n");
- goto error;
- }
-
- if ((ret != CS42L51_MK_CHIP_REV(CS42L51_CHIP_ID, CS42L51_CHIP_REV_A)) &&
- (ret != CS42L51_MK_CHIP_REV(CS42L51_CHIP_ID, CS42L51_CHIP_REV_B))) {
- dev_err(&i2c_client->dev, "Invalid chip id\n");
- ret = -ENODEV;
- goto error;
- }
-
- dev_info(&i2c_client->dev, "found device cs42l51 rev %d\n",
- ret & 7);
-
- cs42l51 = kzalloc(sizeof(struct cs42l51_private), GFP_KERNEL);
- if (!cs42l51) {
- dev_err(&i2c_client->dev, "could not allocate codec\n");
- return -ENOMEM;
- }
- codec = &cs42l51->codec;
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->dev = &i2c_client->dev;
- codec->name = "CS42L51";
- codec->owner = THIS_MODULE;
- codec->dai = &cs42l51_dai;
- codec->num_dai = 1;
- snd_soc_codec_set_drvdata(codec, cs42l51);
-
- codec->control_data = i2c_client;
- codec->reg_cache = cs42l51->reg_cache;
- codec->reg_cache_size = CS42L51_NUMREGS;
- i2c_set_clientdata(i2c_client, codec);
-
- ret = cs42l51_fill_cache(codec);
- if (ret < 0) {
- dev_err(&i2c_client->dev, "failed to fill register cache\n");
- goto error_alloc;
- }
-
- ret = snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_I2C);
- if (ret < 0) {
- dev_err(&i2c_client->dev, "Failed to set cache I/O: %d\n", ret);
- goto error_alloc;
- }
-
- /*
- * DAC configuration
- * - Use signal processor
- * - auto mute
- * - vol changes immediate
- * - no de-emphasize
- */
- reg = CS42L51_DAC_CTL_DATA_SEL(1)
- | CS42L51_DAC_CTL_AMUTE | CS42L51_DAC_CTL_DACSZ(0);
- ret = snd_soc_write(codec, CS42L51_DAC_CTL, reg);
- if (ret < 0)
- goto error_alloc;
-
- cs42l51_dai.dev = codec->dev;
- cs42l51_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto error_alloc;
- }
-
- ret = snd_soc_register_dai(&cs42l51_dai);
- if (ret < 0) {
- dev_err(&i2c_client->dev, "failed to register DAIe\n");
- goto error_reg;
- }
-
- return 0;
-
-error_reg:
- snd_soc_unregister_codec(codec);
-error_alloc:
- kfree(cs42l51);
-error:
- return ret;
-}
-
-static int cs42l51_i2c_remove(struct i2c_client *client)
-{
- struct cs42l51_private *cs42l51 = i2c_get_clientdata(client);
- snd_soc_unregister_dai(&cs42l51_dai);
- snd_soc_unregister_codec(cs42l51_codec);
- cs42l51_codec = NULL;
- kfree(cs42l51);
- return 0;
-}
-
-
-static const struct i2c_device_id cs42l51_id[] = {
- {"cs42l51", 0},
- {}
-};
-MODULE_DEVICE_TABLE(i2c, cs42l51_id);
-
-static struct i2c_driver cs42l51_i2c_driver = {
- .driver = {
- .name = "CS42L51 I2C",
- .owner = THIS_MODULE,
- },
- .id_table = cs42l51_id,
- .probe = cs42l51_i2c_probe,
- .remove = cs42l51_i2c_remove,
-};
-
static int cs42l51_get_chan_mix(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@@ -484,51 +355,8 @@ static int cs42l51_set_dai_sysclk(struct snd_soc_dai *codec_dai,
{
struct snd_soc_codec *codec = codec_dai->codec;
struct cs42l51_private *cs42l51 = snd_soc_codec_get_drvdata(codec);
- struct cs42l51_ratios *ratios = NULL;
- int nr_ratios = 0;
- unsigned int rates = 0;
- unsigned int rate_min = -1;
- unsigned int rate_max = 0;
- int i;
cs42l51->mclk = freq;
-
- switch (cs42l51->func) {
- case MODE_MASTER:
- return -EINVAL;
- case MODE_SLAVE:
- ratios = slave_ratios;
- nr_ratios = ARRAY_SIZE(slave_ratios);
- break;
- case MODE_SLAVE_AUTO:
- ratios = slave_auto_ratios;
- nr_ratios = ARRAY_SIZE(slave_auto_ratios);
- break;
- }
-
- for (i = 0; i < nr_ratios; i++) {
- unsigned int rate = freq / ratios[i].ratio;
- rates |= snd_pcm_rate_to_rate_bit(rate);
- if (rate < rate_min)
- rate_min = rate;
- if (rate > rate_max)
- rate_max = rate;
- }
- rates &= ~SNDRV_PCM_RATE_KNOT;
-
- if (!rates) {
- dev_err(codec->dev, "could not find a valid sample rate\n");
- return -EINVAL;
- }
-
- codec_dai->playback.rates = rates;
- codec_dai->playback.rate_min = rate_min;
- codec_dai->playback.rate_max = rate_max;
-
- codec_dai->capture.rates = rates;
- codec_dai->capture.rate_min = rate_min;
- codec_dai->capture.rate_max = rate_max;
-
return 0;
}
@@ -537,8 +365,7 @@ static int cs42l51_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct cs42l51_private *cs42l51 = snd_soc_codec_get_drvdata(codec);
int ret;
unsigned int i;
@@ -670,8 +497,8 @@ static struct snd_soc_dai_ops cs42l51_dai_ops = {
.digital_mute = cs42l51_dai_mute,
};
-struct snd_soc_dai cs42l51_dai = {
- .name = "CS42L51 HiFi",
+static struct snd_soc_dai_driver cs42l51_dai = {
+ .name = "cs42l51-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -688,30 +515,39 @@ struct snd_soc_dai cs42l51_dai = {
},
.ops = &cs42l51_dai_ops,
};
-EXPORT_SYMBOL_GPL(cs42l51_dai);
-
-static int cs42l51_probe(struct platform_device *pdev)
+static int cs42l51_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
+ struct cs42l51_private *cs42l51 = snd_soc_codec_get_drvdata(codec);
+ int ret, reg;
- if (!cs42l51_codec) {
- dev_err(&pdev->dev, "CS42L51 codec not yet registered\n");
- return -EINVAL;
- }
+ codec->control_data = cs42l51->control_data;
- socdev->card->codec = cs42l51_codec;
- codec = socdev->card->codec;
+ ret = cs42l51_fill_cache(codec);
+ if (ret < 0) {
+ dev_err(codec->dev, "failed to fill register cache\n");
+ return ret;
+ }
- /* Register PCMs */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
+ ret = snd_soc_codec_set_cache_io(codec, 8, 8, cs42l51->control_type);
if (ret < 0) {
- dev_err(&pdev->dev, "failed to create PCMs\n");
+ dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
return ret;
}
+ /*
+ * DAC configuration
+ * - Use signal processor
+ * - auto mute
+ * - vol changes immediate
+ * - no de-emphasize
+ */
+ reg = CS42L51_DAC_CTL_DATA_SEL(1)
+ | CS42L51_DAC_CTL_AMUTE | CS42L51_DAC_CTL_DACSZ(0);
+ ret = snd_soc_write(codec, CS42L51_DAC_CTL, reg);
+ if (ret < 0)
+ return ret;
+
snd_soc_add_controls(codec, cs42l51_snd_controls,
ARRAY_SIZE(cs42l51_snd_controls));
snd_soc_dapm_new_controls(codec, cs42l51_dapm_widgets,
@@ -722,22 +558,77 @@ static int cs42l51_probe(struct platform_device *pdev)
return 0;
}
+static struct snd_soc_codec_driver soc_codec_device_cs42l51 = {
+ .probe = cs42l51_probe,
+ .reg_cache_size = CS42L51_NUMREGS,
+ .reg_word_size = sizeof(u8),
+};
-static int cs42l51_remove(struct platform_device *pdev)
+static int cs42l51_i2c_probe(struct i2c_client *i2c_client,
+ const struct i2c_device_id *id)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+ struct cs42l51_private *cs42l51;
+ int ret;
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
+ /* Verify that we have a CS42L51 */
+ ret = i2c_smbus_read_byte_data(i2c_client, CS42L51_CHIP_REV_ID);
+ if (ret < 0) {
+ dev_err(&i2c_client->dev, "failed to read I2C\n");
+ goto error;
+ }
+
+ if ((ret != CS42L51_MK_CHIP_REV(CS42L51_CHIP_ID, CS42L51_CHIP_REV_A)) &&
+ (ret != CS42L51_MK_CHIP_REV(CS42L51_CHIP_ID, CS42L51_CHIP_REV_B))) {
+ dev_err(&i2c_client->dev, "Invalid chip id\n");
+ ret = -ENODEV;
+ goto error;
+ }
+
+ dev_info(&i2c_client->dev, "found device cs42l51 rev %d\n",
+ ret & 7);
+
+ cs42l51 = kzalloc(sizeof(struct cs42l51_private), GFP_KERNEL);
+ if (!cs42l51) {
+ dev_err(&i2c_client->dev, "could not allocate codec\n");
+ return -ENOMEM;
+ }
+
+ i2c_set_clientdata(i2c_client, cs42l51);
+ cs42l51->control_data = i2c_client;
+ cs42l51->control_type = SND_SOC_I2C;
+ ret = snd_soc_register_codec(&i2c_client->dev,
+ &soc_codec_device_cs42l51, &cs42l51_dai, 1);
+ if (ret < 0)
+ kfree(cs42l51);
+error:
+ return ret;
+}
+
+static int cs42l51_i2c_remove(struct i2c_client *client)
+{
+ struct cs42l51_private *cs42l51 = i2c_get_clientdata(client);
+
+ snd_soc_unregister_codec(&client->dev);
+ kfree(cs42l51);
return 0;
}
-struct snd_soc_codec_device soc_codec_device_cs42l51 = {
- .probe = cs42l51_probe,
- .remove = cs42l51_remove
+static const struct i2c_device_id cs42l51_id[] = {
+ {"cs42l51", 0},
+ {}
+};
+MODULE_DEVICE_TABLE(i2c, cs42l51_id);
+
+static struct i2c_driver cs42l51_i2c_driver = {
+ .driver = {
+ .name = "cs42L51-codec",
+ .owner = THIS_MODULE,
+ },
+ .id_table = cs42l51_id,
+ .probe = cs42l51_i2c_probe,
+ .remove = cs42l51_i2c_remove,
};
-EXPORT_SYMBOL_GPL(soc_codec_device_cs42l51);
static int __init cs42l51_init(void)
{
diff --git a/sound/soc/codecs/cs42l51.h b/sound/soc/codecs/cs42l51.h
index 8f0bd9786ad2..2beeb171db4b 100644
--- a/sound/soc/codecs/cs42l51.h
+++ b/sound/soc/codecs/cs42l51.h
@@ -158,6 +158,4 @@
#define CS42L51_LASTREG 0x20
#define CS42L51_NUMREGS (CS42L51_LASTREG - CS42L51_FIRSTREG + 1)
-extern struct snd_soc_dai cs42l51_dai;
-extern struct snd_soc_codec_device soc_codec_device_cs42l51;
#endif
diff --git a/sound/soc/codecs/cx20442.c b/sound/soc/codecs/cx20442.c
index f07a415c753f..cf4323dbf9c4 100644
--- a/sound/soc/codecs/cx20442.c
+++ b/sound/soc/codecs/cx20442.c
@@ -24,7 +24,8 @@
struct cx20442_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
+ void *control_data;
u8 reg_cache[1];
};
@@ -102,7 +103,7 @@ static unsigned int cx20442_read_reg_cache(struct snd_soc_codec *codec,
{
u8 *reg_cache = codec->reg_cache;
- if (reg >= codec->reg_cache_size)
+ if (reg >= codec->driver->reg_cache_size)
return -EINVAL;
return reg_cache[reg];
@@ -164,16 +165,17 @@ static int cx20442_pm_to_v253_vsp(u8 value)
static int cx20442_write(struct snd_soc_codec *codec, unsigned int reg,
unsigned int value)
{
+ struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec);
u8 *reg_cache = codec->reg_cache;
int vls, vsp, old, len;
char buf[18];
- if (reg >= codec->reg_cache_size)
+ if (reg >= codec->driver->reg_cache_size)
return -EINVAL;
/* hw_write and control_data pointers required for talking to the modem
* are expected to be set by the line discipline initialization code */
- if (!codec->hw_write || !codec->control_data)
+ if (!codec->hw_write || !cx20442->control_data)
return -EIO;
old = reg_cache[reg];
@@ -202,17 +204,13 @@ static int cx20442_write(struct snd_soc_codec *codec, unsigned int reg,
return -ENOMEM;
dev_dbg(codec->dev, "%s: %s\n", __func__, buf);
- if (codec->hw_write(codec->control_data, buf, len) != len)
+ if (codec->hw_write(cx20442->control_data, buf, len) != len)
return -EIO;
return 0;
}
-/* Moved up here as line discipline referres it during initialization */
-static struct snd_soc_codec *cx20442_codec;
-
-
/*
* Line discpline related code
*
@@ -228,15 +226,15 @@ static const char *v253_init = "ate0m0q0+fclass=8\r";
/* Line discipline .open() */
static int v253_open(struct tty_struct *tty)
{
- struct snd_soc_codec *codec = cx20442_codec;
int ret, len = strlen(v253_init);
/* Doesn't make sense without write callback */
if (!tty->ops->write)
return -EINVAL;
- /* Pass the codec structure address for use by other ldisc callbacks */
- tty->disc_data = codec;
+ /* Won't work if no codec pointer has been passed by a card driver */
+ if (!tty->disc_data)
+ return -ENODEV;
if (tty->ops->write(tty, v253_init, len) != len) {
ret = -EIO;
@@ -253,15 +251,18 @@ err:
static void v253_close(struct tty_struct *tty)
{
struct snd_soc_codec *codec = tty->disc_data;
+ struct cx20442_priv *cx20442;
tty->disc_data = NULL;
if (!codec)
return;
+ cx20442 = snd_soc_codec_get_drvdata(codec);
+
/* Prevent the codec driver from further accessing the modem */
codec->hw_write = NULL;
- codec->control_data = NULL;
+ cx20442->control_data = NULL;
codec->pop_time = 0;
}
@@ -277,15 +278,18 @@ static void v253_receive(struct tty_struct *tty,
const unsigned char *cp, char *fp, int count)
{
struct snd_soc_codec *codec = tty->disc_data;
+ struct cx20442_priv *cx20442;
if (!codec)
return;
- if (!codec->control_data) {
+ cx20442 = snd_soc_codec_get_drvdata(codec);
+
+ if (!cx20442->control_data) {
/* First modem response, complete setup procedure */
/* Set up codec driver access to modem controls */
- codec->control_data = tty;
+ cx20442->control_data = tty;
codec->hw_write = (hw_write_t)tty->ops->write;
codec->pop_time = 1;
}
@@ -313,8 +317,8 @@ EXPORT_SYMBOL_GPL(v253_ops);
* Codec DAI
*/
-struct snd_soc_dai cx20442_dai = {
- .name = "CX20442",
+static struct snd_soc_dai_driver cx20442_dai = {
+ .name = "cx20442-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -330,142 +334,63 @@ struct snd_soc_dai cx20442_dai = {
.formats = SNDRV_PCM_FMTBIT_S16_LE,
},
};
-EXPORT_SYMBOL_GPL(cx20442_dai);
-static int cx20442_codec_probe(struct platform_device *pdev)
+static int cx20442_codec_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret;
-
- if (!cx20442_codec) {
- dev_err(&pdev->dev, "cx20442 not yet discovered\n");
- return -ENODEV;
- }
- codec = cx20442_codec;
-
- socdev->card->codec = codec;
+ struct cx20442_priv *cx20442;
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(&pdev->dev, "failed to create pcms\n");
- goto pcm_err;
- }
+ cx20442 = kzalloc(sizeof(struct cx20442_priv), GFP_KERNEL);
+ if (cx20442 == NULL)
+ return -ENOMEM;
+ snd_soc_codec_set_drvdata(codec, cx20442);
cx20442_add_widgets(codec);
-pcm_err:
- return ret;
+ cx20442->control_data = NULL;
+ codec->hw_write = NULL;
+ codec->pop_time = 0;
+
+ return 0;
}
/* power down chip */
-static int cx20442_codec_remove(struct platform_device *pdev)
+static int cx20442_codec_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+ struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec);
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
+ if (cx20442->control_data) {
+ struct tty_struct *tty = cx20442->control_data;
+ tty_hangup(tty);
+ }
+ kfree(cx20442);
return 0;
}
-struct snd_soc_codec_device cx20442_codec_dev = {
+static struct snd_soc_codec_driver cx20442_codec_dev = {
.probe = cx20442_codec_probe,
.remove = cx20442_codec_remove,
+ .reg_cache_size = 1,
+ .reg_word_size = sizeof(u8),
+ .read = cx20442_read_reg_cache,
+ .write = cx20442_write,
};
-EXPORT_SYMBOL_GPL(cx20442_codec_dev);
-
-static int cx20442_register(struct cx20442_priv *cx20442)
-{
- struct snd_soc_codec *codec = &cx20442->codec;
- int ret;
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->name = "CX20442";
- codec->owner = THIS_MODULE;
- snd_soc_codec_set_drvdata(codec, cx20442);
-
- codec->dai = &cx20442_dai;
- codec->num_dai = 1;
-
- codec->reg_cache = &cx20442->reg_cache;
- codec->reg_cache_size = ARRAY_SIZE(cx20442->reg_cache);
- codec->read = cx20442_read_reg_cache;
- codec->write = cx20442_write;
-
- codec->bias_level = SND_SOC_BIAS_OFF;
-
- cx20442_dai.dev = codec->dev;
-
- cx20442_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
-
- ret = snd_soc_register_dai(&cx20442_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
-
- return 0;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- cx20442_codec = NULL;
- kfree(cx20442);
- return ret;
-}
-
-static void cx20442_unregister(struct cx20442_priv *cx20442)
-{
- snd_soc_unregister_dai(&cx20442_dai);
- snd_soc_unregister_codec(&cx20442->codec);
-
- cx20442_codec = NULL;
- kfree(cx20442);
-}
static int cx20442_platform_probe(struct platform_device *pdev)
{
- struct cx20442_priv *cx20442;
- struct snd_soc_codec *codec;
-
- cx20442 = kzalloc(sizeof(struct cx20442_priv), GFP_KERNEL);
- if (cx20442 == NULL)
- return -ENOMEM;
-
- codec = &cx20442->codec;
-
- codec->control_data = NULL;
- codec->hw_write = NULL;
- codec->pop_time = 0;
-
- codec->dev = &pdev->dev;
- platform_set_drvdata(pdev, cx20442);
-
- return cx20442_register(cx20442);
+ return snd_soc_register_codec(&pdev->dev,
+ &cx20442_codec_dev, &cx20442_dai, 1);
}
static int __exit cx20442_platform_remove(struct platform_device *pdev)
{
- struct cx20442_priv *cx20442 = platform_get_drvdata(pdev);
-
- cx20442_unregister(cx20442);
+ snd_soc_unregister_codec(&pdev->dev);
return 0;
}
static struct platform_driver cx20442_platform_driver = {
.driver = {
- .name = "cx20442",
+ .name = "cx20442-codec",
.owner = THIS_MODULE,
},
.probe = cx20442_platform_probe,
@@ -487,4 +412,4 @@ module_exit(cx20442_exit);
MODULE_DESCRIPTION("ASoC CX20442-11 voice modem codec driver");
MODULE_AUTHOR("Janusz Krzysztofik");
MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:cx20442");
+MODULE_ALIAS("platform:cx20442-codec");
diff --git a/sound/soc/codecs/cx20442.h b/sound/soc/codecs/cx20442.h
index 688a5eb62e17..c7a7c79ef0cd 100644
--- a/sound/soc/codecs/cx20442.h
+++ b/sound/soc/codecs/cx20442.h
@@ -13,8 +13,6 @@
#ifndef _CX20442_CODEC_H
#define _CX20442_CODEC_H
-extern struct snd_soc_dai cx20442_dai;
-extern struct snd_soc_codec_device cx20442_codec_dev;
extern struct tty_ldisc_ops v253_ops;
#endif
diff --git a/sound/soc/codecs/da7210.c b/sound/soc/codecs/da7210.c
index 3c51d6a57523..eabf3c062500 100644
--- a/sound/soc/codecs/da7210.c
+++ b/sound/soc/codecs/da7210.c
@@ -25,8 +25,6 @@
#include <sound/initval.h>
#include <sound/tlv.h>
-#include "da7210.h"
-
/* DA7210 register space */
#define DA7210_STATUS 0x02
#define DA7210_STARTUP1 0x03
@@ -162,11 +160,10 @@ static const struct snd_kcontrol_new da7210_snd_controls[] = {
/* Codec private data */
struct da7210_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
+ void *control_data;
};
-static struct snd_soc_codec *da7210_codec;
-
/*
* Register cache
*/
@@ -209,12 +206,12 @@ static int da7210_write(struct snd_soc_codec *codec, u32 reg, u32 value)
u8 *cache = codec->reg_cache;
u8 data[2];
- BUG_ON(codec->volatile_register);
+ BUG_ON(codec->driver->volatile_register);
data[0] = reg & 0xff;
data[1] = value & 0xff;
- if (reg >= codec->reg_cache_size)
+ if (reg >= codec->driver->reg_cache_size)
return -EIO;
if (2 != codec->hw_write(codec->control_data, data, 2))
@@ -267,8 +264,7 @@ static int da7210_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
u32 dai_cfg1;
u32 hpf_reg, hpf_mask, hpf_value;
u32 fs, bypass;
@@ -430,9 +426,8 @@ static struct snd_soc_dai_ops da7210_dai_ops = {
.set_fmt = da7210_set_dai_fmt,
};
-struct snd_soc_dai da7210_dai = {
- .name = "DA7210 IIS",
- .id = 0,
+static struct snd_soc_dai_driver da7210_dai = {
+ .name = "da7210-hifi",
/* playback capabilities */
.playback = {
.stream_name = "Playback",
@@ -452,55 +447,15 @@ struct snd_soc_dai da7210_dai = {
.ops = &da7210_dai_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(da7210_dai);
-/*
- * Initialize the DA7210 driver
- * register the mixer and dsp interfaces with the kernel
- */
-static int da7210_init(struct da7210_priv *da7210)
+static int da7210_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = &da7210->codec;
- int ret = 0;
+ struct da7210_priv *da7210 = snd_soc_codec_get_drvdata(codec);
- if (da7210_codec) {
- dev_err(codec->dev, "Another da7210 is registered\n");
- return -EINVAL;
- }
+ dev_info(codec->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION);
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, da7210);
- codec->name = "DA7210";
- codec->owner = THIS_MODULE;
- codec->read = da7210_read;
- codec->write = da7210_write;
- codec->dai = &da7210_dai;
- codec->num_dai = 1;
+ codec->control_data = da7210->control_data;
codec->hw_write = (hw_write_t)i2c_master_send;
- codec->reg_cache_size = ARRAY_SIZE(da7210_reg);
- codec->reg_cache = kmemdup(da7210_reg,
- sizeof(da7210_reg), GFP_KERNEL);
-
- if (!codec->reg_cache)
- return -ENOMEM;
-
- da7210_dai.dev = codec->dev;
- da7210_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret) {
- dev_err(codec->dev, "Failed to register CODEC: %d\n", ret);
- goto init_err;
- }
-
- ret = snd_soc_register_dai(&da7210_dai);
- if (ret) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto codec_err;
- }
/* FIXME
*
@@ -583,54 +538,50 @@ static int da7210_init(struct da7210_priv *da7210)
/* Activate all enabled subsystem */
da7210_write(codec, DA7210_STARTUP1, DA7210_SC_MST_EN);
- return ret;
-
-codec_err:
- snd_soc_unregister_codec(codec);
-init_err:
- kfree(codec->reg_cache);
- codec->reg_cache = NULL;
+ snd_soc_add_controls(codec, da7210_snd_controls,
+ ARRAY_SIZE(da7210_snd_controls));
- return ret;
+ dev_info(codec->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION);
+ return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_da7210 = {
+ .probe = da7210_probe,
+ .read = da7210_read,
+ .write = da7210_write,
+ .reg_cache_size = ARRAY_SIZE(da7210_reg),
+ .reg_word_size = sizeof(u8),
+ .reg_cache_default = da7210_reg,
+};
+
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static int __devinit da7210_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct da7210_priv *da7210;
- struct snd_soc_codec *codec;
int ret;
da7210 = kzalloc(sizeof(struct da7210_priv), GFP_KERNEL);
if (!da7210)
return -ENOMEM;
- codec = &da7210->codec;
- codec->dev = &i2c->dev;
-
i2c_set_clientdata(i2c, da7210);
- codec->control_data = i2c;
+ da7210->control_data = i2c;
+ da7210->control_type = SND_SOC_I2C;
- ret = da7210_init(da7210);
- if (ret < 0) {
- pr_err("Failed to initialise da7210 audio codec\n");
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_da7210, &da7210_dai, 1);
+ if (ret < 0)
kfree(da7210);
- }
return ret;
}
static int __devexit da7210_i2c_remove(struct i2c_client *client)
{
- struct da7210_priv *da7210 = i2c_get_clientdata(client);
-
- snd_soc_unregister_dai(&da7210_dai);
- kfree(da7210->codec.reg_cache);
- kfree(da7210);
- da7210_codec = NULL;
-
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -643,7 +594,7 @@ MODULE_DEVICE_TABLE(i2c, da7210_i2c_id);
/* I2C codec control layer */
static struct i2c_driver da7210_i2c_driver = {
.driver = {
- .name = "DA7210 I2C Codec",
+ .name = "da7210-codec",
.owner = THIS_MODULE,
},
.probe = da7210_i2c_probe,
@@ -652,50 +603,6 @@ static struct i2c_driver da7210_i2c_driver = {
};
#endif
-static int da7210_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret;
-
- if (!da7210_codec) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = da7210_codec;
- codec = da7210_codec;
-
- /* Register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0)
- goto pcm_err;
-
- snd_soc_add_controls(da7210_codec, da7210_snd_controls,
- ARRAY_SIZE(da7210_snd_controls));
-
- dev_info(&pdev->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION);
-
-pcm_err:
- return ret;
-}
-
-static int da7210_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_da7210 = {
- .probe = da7210_probe,
- .remove = da7210_remove,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_da7210);
-
static int __init da7210_modinit(void)
{
int ret = 0;
diff --git a/sound/soc/codecs/da7210.h b/sound/soc/codecs/da7210.h
deleted file mode 100644
index 390d621eb742..000000000000
--- a/sound/soc/codecs/da7210.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * da7210.h -- audio driver for da7210
- *
- * Copyright (c) 2009 Dialog Semiconductor
- * Written by David Chen <Dajun.chen@diasemi.com>
- *
- * Copyright (C) 2009 Renesas Solutions Corp.
- * Cleanups by Kuninori Morimoto <morimoto.kuninori@renesas.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- */
-
-#ifndef _DA7210_H
-#define _DA7210_H
-
-extern struct snd_soc_dai da7210_dai;
-extern struct snd_soc_codec_device soc_codec_dev_da7210;
-
-#endif
-
diff --git a/sound/soc/codecs/jz4740.c b/sound/soc/codecs/jz4740.c
index 66557de1e4fe..16253ec9b022 100644
--- a/sound/soc/codecs/jz4740.c
+++ b/sound/soc/codecs/jz4740.c
@@ -74,29 +74,22 @@ static const uint32_t jz4740_codec_regs[] = {
struct jz4740_codec {
void __iomem *base;
struct resource *mem;
-
- uint32_t reg_cache[2];
- struct snd_soc_codec codec;
};
-static inline struct jz4740_codec *codec_to_jz4740(struct snd_soc_codec *codec)
-{
- return container_of(codec, struct jz4740_codec, codec);
-}
-
static unsigned int jz4740_codec_read(struct snd_soc_codec *codec,
unsigned int reg)
{
- struct jz4740_codec *jz4740_codec = codec_to_jz4740(codec);
+ struct jz4740_codec *jz4740_codec = snd_soc_codec_get_drvdata(codec);
return readl(jz4740_codec->base + (reg << 2));
}
static int jz4740_codec_write(struct snd_soc_codec *codec, unsigned int reg,
unsigned int val)
{
- struct jz4740_codec *jz4740_codec = codec_to_jz4740(codec);
+ struct jz4740_codec *jz4740_codec = snd_soc_codec_get_drvdata(codec);
+ u32 *cache = codec->reg_cache;
- jz4740_codec->reg_cache[reg] = val;
+ cache[reg] = val;
writel(val, jz4740_codec->base + (reg << 2));
return 0;
@@ -172,8 +165,7 @@ static int jz4740_codec_hw_params(struct snd_pcm_substream *substream,
{
uint32_t val;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec =rtd->codec;
switch (params_rate(params)) {
case 8000:
@@ -219,8 +211,8 @@ static struct snd_soc_dai_ops jz4740_codec_dai_ops = {
.hw_params = jz4740_codec_hw_params,
};
-struct snd_soc_dai jz4740_codec_dai = {
- .name = "jz4740",
+static struct snd_soc_dai_driver jz4740_codec_dai = {
+ .name = "jz4740-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -238,7 +230,6 @@ struct snd_soc_dai jz4740_codec_dai = {
.ops = &jz4740_codec_dai_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(jz4740_codec_dai);
static void jz4740_codec_wakeup(struct snd_soc_codec *codec)
{
@@ -302,23 +293,10 @@ static int jz4740_codec_set_bias_level(struct snd_soc_codec *codec,
return 0;
}
-static struct snd_soc_codec *jz4740_codec_codec;
-
-static int jz4740_codec_dev_probe(struct platform_device *pdev)
+static int jz4740_codec_dev_probe(struct snd_soc_codec *codec)
{
- int ret;
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = jz4740_codec_codec;
-
- BUG_ON(!codec);
-
- socdev->card->codec = codec;
-
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret) {
- dev_err(&pdev->dev, "Failed to create pcms: %d\n", ret);
- return ret;
- }
+ snd_soc_update_bits(codec, JZ4740_REG_CODEC_1,
+ JZ4740_CODEC_1_SW2_ENABLE, JZ4740_CODEC_1_SW2_ENABLE);
snd_soc_add_controls(codec, jz4740_codec_controls,
ARRAY_SIZE(jz4740_codec_controls));
@@ -331,34 +309,27 @@ static int jz4740_codec_dev_probe(struct platform_device *pdev)
snd_soc_dapm_new_widgets(codec);
+ jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+
return 0;
}
-static int jz4740_codec_dev_remove(struct platform_device *pdev)
+static int jz4740_codec_dev_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
+ jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
#ifdef CONFIG_PM_SLEEP
-static int jz4740_codec_suspend(struct platform_device *pdev, pm_message_t state)
+static int jz4740_codec_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
return jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_OFF);
}
-static int jz4740_codec_resume(struct platform_device *pdev)
+static int jz4740_codec_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
return jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
}
@@ -367,19 +338,23 @@ static int jz4740_codec_resume(struct platform_device *pdev)
#define jz4740_codec_resume NULL
#endif
-struct snd_soc_codec_device soc_codec_dev_jz4740_codec = {
+static struct snd_soc_codec_driver soc_codec_dev_jz4740_codec = {
.probe = jz4740_codec_dev_probe,
.remove = jz4740_codec_dev_remove,
.suspend = jz4740_codec_suspend,
.resume = jz4740_codec_resume,
+ .read = jz4740_codec_read,
+ .write = jz4740_codec_write,
+ .set_bias_level = jz4740_codec_set_bias_level,
+ .reg_cache_default = jz4740_codec_regs,
+ .reg_word_size = sizeof(u32),
+ .reg_cache_size = 2,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_jz4740_codec);
static int __devinit jz4740_codec_probe(struct platform_device *pdev)
{
int ret;
struct jz4740_codec *jz4740_codec;
- struct snd_soc_codec *codec;
struct resource *mem;
jz4740_codec = kzalloc(sizeof(*jz4740_codec), GFP_KERNEL);
@@ -408,55 +383,17 @@ static int __devinit jz4740_codec_probe(struct platform_device *pdev)
}
jz4740_codec->mem = mem;
- jz4740_codec_dai.dev = &pdev->dev;
-
- codec = &jz4740_codec->codec;
-
- codec->dev = &pdev->dev;
- codec->name = "jz4740";
- codec->owner = THIS_MODULE;
-
- codec->read = jz4740_codec_read;
- codec->write = jz4740_codec_write;
- codec->set_bias_level = jz4740_codec_set_bias_level;
- codec->bias_level = SND_SOC_BIAS_OFF;
-
- codec->dai = &jz4740_codec_dai;
- codec->num_dai = 1;
-
- codec->reg_cache = jz4740_codec->reg_cache;
- codec->reg_cache_size = 2;
- memcpy(codec->reg_cache, jz4740_codec_regs, sizeof(jz4740_codec_regs));
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- jz4740_codec_codec = codec;
-
- snd_soc_update_bits(codec, JZ4740_REG_CODEC_1,
- JZ4740_CODEC_1_SW2_ENABLE, JZ4740_CODEC_1_SW2_ENABLE);
-
platform_set_drvdata(pdev, jz4740_codec);
- ret = snd_soc_register_codec(codec);
+ ret = snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_jz4740_codec, &jz4740_codec_dai, 1);
if (ret) {
dev_err(&pdev->dev, "Failed to register codec\n");
goto err_iounmap;
}
- ret = snd_soc_register_dai(&jz4740_codec_dai);
- if (ret) {
- dev_err(&pdev->dev, "Failed to register codec dai\n");
- goto err_unregister_codec;
- }
-
- jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
return 0;
-err_unregister_codec:
- snd_soc_unregister_codec(codec);
err_iounmap:
iounmap(jz4740_codec->base);
err_release_mem_region:
@@ -472,8 +409,7 @@ static int __devexit jz4740_codec_remove(struct platform_device *pdev)
struct jz4740_codec *jz4740_codec = platform_get_drvdata(pdev);
struct resource *mem = jz4740_codec->mem;
- snd_soc_unregister_dai(&jz4740_codec_dai);
- snd_soc_unregister_codec(&jz4740_codec->codec);
+ snd_soc_unregister_codec(&pdev->dev);
iounmap(jz4740_codec->base);
release_mem_region(mem->start, resource_size(mem));
diff --git a/sound/soc/codecs/jz4740.h b/sound/soc/codecs/jz4740.h
deleted file mode 100644
index b5a0691be763..000000000000
--- a/sound/soc/codecs/jz4740.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2009, Lars-Peter Clausen <lars@metafoo.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-#ifndef __SND_SOC_CODECS_JZ4740_CODEC_H__
-#define __SND_SOC_CODECS_JZ4740_CODEC_H__
-
-extern struct snd_soc_dai jz4740_codec_dai;
-extern struct snd_soc_codec_device soc_codec_dev_jz4740_codec;
-
-#endif
diff --git a/sound/soc/codecs/pcm3008.c b/sound/soc/codecs/pcm3008.c
index 5a5f187a2657..bd8f26e41602 100644
--- a/sound/soc/codecs/pcm3008.c
+++ b/sound/soc/codecs/pcm3008.c
@@ -32,8 +32,8 @@
#define PCM3008_RATES (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
SNDRV_PCM_RATE_48000)
-struct snd_soc_dai pcm3008_dai = {
- .name = "PCM3008 HiFi",
+static struct snd_soc_dai_driver pcm3008_dai = {
+ .name = "pcm3008-hifi",
.playback = {
.stream_name = "PCM3008 Playback",
.channels_min = 1,
@@ -49,7 +49,6 @@ struct snd_soc_dai pcm3008_dai = {
.formats = SNDRV_PCM_FMTBIT_S16_LE,
},
};
-EXPORT_SYMBOL_GPL(pcm3008_dai);
static void pcm3008_gpio_free(struct pcm3008_setup_data *setup)
{
@@ -59,38 +58,13 @@ static void pcm3008_gpio_free(struct pcm3008_setup_data *setup)
gpio_free(setup->pdda_pin);
}
-static int pcm3008_soc_probe(struct platform_device *pdev)
+static int pcm3008_soc_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- struct pcm3008_setup_data *setup = socdev->codec_data;
+ struct pcm3008_setup_data *setup = codec->dev->platform_data;
int ret = 0;
printk(KERN_INFO "PCM3008 SoC Audio Codec %s\n", PCM3008_VERSION);
- socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (!socdev->card->codec)
- return -ENOMEM;
-
- codec = socdev->card->codec;
- mutex_init(&codec->mutex);
-
- codec->name = "PCM3008";
- codec->owner = THIS_MODULE;
- codec->dai = &pcm3008_dai;
- codec->num_dai = 1;
- codec->write = NULL;
- codec->read = NULL;
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- /* Register PCMs. */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "pcm3008: failed to create pcms\n");
- goto pcm_err;
- }
-
/* DEM1 DEM0 DE-EMPHASIS_MODE
* Low Low De-emphasis 44.1 kHz ON
* Low High De-emphasis OFF
@@ -130,33 +104,22 @@ static int pcm3008_soc_probe(struct platform_device *pdev)
gpio_err:
pcm3008_gpio_free(setup);
-pcm_err:
- kfree(socdev->card->codec);
return ret;
}
-static int pcm3008_soc_remove(struct platform_device *pdev)
+static int pcm3008_soc_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
- struct pcm3008_setup_data *setup = socdev->codec_data;
-
- if (!codec)
- return 0;
+ struct pcm3008_setup_data *setup = codec->dev->platform_data;
pcm3008_gpio_free(setup);
- snd_soc_free_pcms(socdev);
- kfree(socdev->card->codec);
-
return 0;
}
#ifdef CONFIG_PM
-static int pcm3008_soc_suspend(struct platform_device *pdev, pm_message_t msg)
+static int pcm3008_soc_suspend(struct snd_soc_codec *codec, pm_message_t msg)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct pcm3008_setup_data *setup = socdev->codec_data;
+ struct pcm3008_setup_data *setup = codec->dev->platform_data;
gpio_set_value(setup->pdad_pin, 0);
gpio_set_value(setup->pdda_pin, 0);
@@ -164,10 +127,9 @@ static int pcm3008_soc_suspend(struct platform_device *pdev, pm_message_t msg)
return 0;
}
-static int pcm3008_soc_resume(struct platform_device *pdev)
+static int pcm3008_soc_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct pcm3008_setup_data *setup = socdev->codec_data;
+ struct pcm3008_setup_data *setup = codec->dev->platform_data;
gpio_set_value(setup->pdad_pin, 1);
gpio_set_value(setup->pdda_pin, 1);
@@ -179,23 +141,45 @@ static int pcm3008_soc_resume(struct platform_device *pdev)
#define pcm3008_soc_resume NULL
#endif
-struct snd_soc_codec_device soc_codec_dev_pcm3008 = {
+static struct snd_soc_codec_driver soc_codec_dev_pcm3008 = {
.probe = pcm3008_soc_probe,
.remove = pcm3008_soc_remove,
.suspend = pcm3008_soc_suspend,
.resume = pcm3008_soc_resume,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_pcm3008);
-static int __init pcm3008_init(void)
+static int __devinit pcm3008_codec_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_pcm3008, &pcm3008_dai, 1);
+}
+
+static int __devexit pcm3008_codec_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_codec(&pdev->dev);
+ return 0;
+}
+
+MODULE_ALIAS("platform:pcm3008-codec");
+
+static struct platform_driver pcm3008_codec_driver = {
+ .probe = pcm3008_codec_probe,
+ .remove = __devexit_p(pcm3008_codec_remove),
+ .driver = {
+ .name = "pcm3008-codec",
+ .owner = THIS_MODULE,
+ },
+};
+
+static int __init pcm3008_modinit(void)
{
- return snd_soc_register_dai(&pcm3008_dai);
+ return platform_driver_register(&pcm3008_codec_driver);
}
-module_init(pcm3008_init);
+module_init(pcm3008_modinit);
static void __exit pcm3008_exit(void)
{
- snd_soc_unregister_dai(&pcm3008_dai);
+ platform_driver_unregister(&pcm3008_codec_driver);
}
module_exit(pcm3008_exit);
diff --git a/sound/soc/codecs/pcm3008.h b/sound/soc/codecs/pcm3008.h
index d04e87d3c060..7e5489ab4812 100644
--- a/sound/soc/codecs/pcm3008.h
+++ b/sound/soc/codecs/pcm3008.h
@@ -19,7 +19,4 @@ struct pcm3008_setup_data {
unsigned pdda_pin;
};
-extern struct snd_soc_codec_device soc_codec_dev_pcm3008;
-extern struct snd_soc_dai pcm3008_dai;
-
#endif
diff --git a/sound/soc/codecs/spdif_transciever.c b/sound/soc/codecs/spdif_transciever.c
index 9119836051a4..4c32b54913ad 100644
--- a/sound/soc/codecs/spdif_transciever.c
+++ b/sound/soc/codecs/spdif_transciever.c
@@ -21,57 +21,16 @@
#include <sound/pcm.h>
#include <sound/initval.h>
-#include "spdif_transciever.h"
-
MODULE_LICENSE("GPL");
#define STUB_RATES SNDRV_PCM_RATE_8000_96000
#define STUB_FORMATS SNDRV_PCM_FMTBIT_S16_LE
-static struct snd_soc_codec *spdif_dit_codec;
-
-static int spdif_dit_codec_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret;
-
- if (spdif_dit_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = spdif_dit_codec;
- codec = spdif_dit_codec;
-
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto err_create_pcms;
- }
-
- return 0;
-
-err_create_pcms:
- return ret;
-}
-
-static int spdif_dit_codec_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
-
- return 0;
-}
-struct snd_soc_codec_device soc_codec_dev_spdif_dit = {
- .probe = spdif_dit_codec_probe,
- .remove = spdif_dit_codec_remove,
-}; EXPORT_SYMBOL_GPL(soc_codec_dev_spdif_dit);
+static struct snd_soc_codec_driver soc_codec_spdif_dit;
-struct snd_soc_dai dit_stub_dai = {
- .name = "DIT",
+static struct snd_soc_dai_driver dit_stub_dai = {
+ .name = "dit-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -80,65 +39,16 @@ struct snd_soc_dai dit_stub_dai = {
.formats = STUB_FORMATS,
},
};
-EXPORT_SYMBOL_GPL(dit_stub_dai);
static int spdif_dit_probe(struct platform_device *pdev)
{
- struct snd_soc_codec *codec;
- int ret;
-
- if (spdif_dit_codec) {
- dev_err(&pdev->dev, "Another Codec is registered\n");
- ret = -EINVAL;
- goto err_reg_codec;
- }
-
- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (codec == NULL)
- return -ENOMEM;
-
- codec->dev = &pdev->dev;
-
- mutex_init(&codec->mutex);
-
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->name = "spdif-dit";
- codec->owner = THIS_MODULE;
- codec->dai = &dit_stub_dai;
- codec->num_dai = 1;
-
- spdif_dit_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret < 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err_reg_codec;
- }
-
- dit_stub_dai.dev = &pdev->dev;
- ret = snd_soc_register_dai(&dit_stub_dai);
- if (ret < 0) {
- dev_err(codec->dev, "Failed to register dai: %d\n", ret);
- goto err_reg_dai;
- }
-
- return 0;
-
-err_reg_dai:
- snd_soc_unregister_codec(codec);
-err_reg_codec:
- kfree(spdif_dit_codec);
- return ret;
+ return snd_soc_register_codec(&pdev->dev, &soc_codec_spdif_dit,
+ &dit_stub_dai, 1);
}
static int spdif_dit_remove(struct platform_device *pdev)
{
- snd_soc_unregister_dai(&dit_stub_dai);
- snd_soc_unregister_codec(spdif_dit_codec);
- kfree(spdif_dit_codec);
- spdif_dit_codec = NULL;
+ snd_soc_unregister_codec(&pdev->dev);
return 0;
}
diff --git a/sound/soc/codecs/spdif_transciever.h b/sound/soc/codecs/spdif_transciever.h
deleted file mode 100644
index 1e102124f546..000000000000
--- a/sound/soc/codecs/spdif_transciever.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * ALSA SoC DIT/DIR driver header
- *
- * Author: Steve Chen, <schen@mvista.com>
- * Copyright: (C) 2008 MontaVista Software, Inc., <source@mvista.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef CODEC_STUBS_H
-#define CODEC_STUBS_H
-
-extern struct snd_soc_codec_device soc_codec_dev_spdif_dit;
-extern struct snd_soc_dai dit_stub_dai;
-
-#endif /* CODEC_STUBS_H */
diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c
index b47ed4f6ab20..67d8c044ca04 100644
--- a/sound/soc/codecs/ssm2602.c
+++ b/sound/soc/codecs/ssm2602.c
@@ -45,11 +45,11 @@
#define SSM2602_VERSION "0.1"
-struct snd_soc_codec_device soc_codec_dev_ssm2602;
-
/* codec private data */
struct ssm2602_priv {
unsigned int sysclk;
+ enum snd_soc_control_type control_type;
+ void *control_data;
struct snd_pcm_substream *master_substream;
struct snd_pcm_substream *slave_substream;
};
@@ -276,8 +276,7 @@ static int ssm2602_hw_params(struct snd_pcm_substream *substream,
{
u16 srate;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
struct i2c_client *i2c = codec->control_data;
u16 iface = ssm2602_read_reg_cache(codec, SSM2602_IFACE) & 0xfff3;
@@ -321,8 +320,7 @@ static int ssm2602_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
struct i2c_client *i2c = codec->control_data;
struct snd_pcm_runtime *master_runtime;
@@ -360,8 +358,7 @@ static int ssm2602_pcm_prepare(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
/* set active */
ssm2602_write(codec, SSM2602_ACTIVE, ACTIVE_ACTIVATE_CODEC);
@@ -372,8 +369,7 @@ static void ssm2602_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
/* deactivate */
@@ -518,8 +514,8 @@ static struct snd_soc_dai_ops ssm2602_dai_ops = {
.set_fmt = ssm2602_set_dai_fmt,
};
-struct snd_soc_dai ssm2602_dai = {
- .name = "SSM2602",
+static struct snd_soc_dai_driver ssm2602_dai = {
+ .name = "ssm2602-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -534,21 +530,15 @@ struct snd_soc_dai ssm2602_dai = {
.formats = SSM2602_FORMATS,},
.ops = &ssm2602_dai_ops,
};
-EXPORT_SYMBOL_GPL(ssm2602_dai);
-static int ssm2602_suspend(struct platform_device *pdev, pm_message_t state)
+static int ssm2602_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
ssm2602_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int ssm2602_resume(struct platform_device *pdev)
+static int ssm2602_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
u8 data[2];
u16 *cache = codec->reg_cache;
@@ -563,36 +553,18 @@ static int ssm2602_resume(struct platform_device *pdev)
return 0;
}
-/*
- * initialise the ssm2602 driver
- * register the mixer and dsp interfaces with the kernel
- */
-static int ssm2602_init(struct snd_soc_device *socdev)
+static int ssm2602_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = socdev->card->codec;
- int reg, ret = 0;
-
- codec->name = "SSM2602";
- codec->owner = THIS_MODULE;
- codec->read = ssm2602_read_reg_cache;
- codec->write = ssm2602_write;
- codec->set_bias_level = ssm2602_set_bias_level;
- codec->dai = &ssm2602_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = sizeof(ssm2602_reg);
- codec->reg_cache = kmemdup(ssm2602_reg, sizeof(ssm2602_reg),
- GFP_KERNEL);
- if (codec->reg_cache == NULL)
- return -ENOMEM;
+ struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
+ int ret = 0, reg;
+
+ pr_info("ssm2602 Audio Codec %s", SSM2602_VERSION);
+
+ codec->bias_level = SND_SOC_BIAS_OFF,
+ codec->control_data = ssm2602->control_data;
ssm2602_reset(codec);
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- pr_err("ssm2602: failed to create pcms\n");
- goto pcm_err;
- }
/*power on device*/
ssm2602_write(codec, SSM2602_ACTIVE, 0);
/* set the update bits */
@@ -614,13 +586,27 @@ static int ssm2602_init(struct snd_soc_device *socdev)
ssm2602_add_widgets(codec);
return ret;
+}
-pcm_err:
- kfree(codec->reg_cache);
- return ret;
+/* remove everything here */
+static int ssm2602_remove(struct snd_soc_codec *codec)
+{
+ ssm2602_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
}
-static struct snd_soc_device *ssm2602_socdev;
+static struct snd_soc_codec_driver soc_codec_dev_ssm2602 = {
+ .probe = ssm2602_probe,
+ .remove = ssm2602_remove,
+ .suspend = ssm2602_suspend,
+ .resume = ssm2602_resume,
+ .read = ssm2602_read_reg_cache,
+ .write = ssm2602_write,
+ .set_bias_level = ssm2602_set_bias_level,
+ .reg_cache_size = sizeof(ssm2602_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = ssm2602_reg,
+};
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
/*
@@ -632,24 +618,28 @@ static struct snd_soc_device *ssm2602_socdev;
static int ssm2602_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
- struct snd_soc_device *socdev = ssm2602_socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct ssm2602_priv *ssm2602;
int ret;
- i2c_set_clientdata(i2c, codec);
- codec->control_data = i2c;
+ ssm2602 = kzalloc(sizeof(struct ssm2602_priv), GFP_KERNEL);
+ if (ssm2602 == NULL)
+ return -ENOMEM;
- ret = ssm2602_init(socdev);
- if (ret < 0)
- pr_err("failed to initialise SSM2602\n");
+ i2c_set_clientdata(i2c, ssm2602);
+ ssm2602->control_data = i2c;
+ ssm2602->control_type = SND_SOC_I2C;
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_ssm2602, &ssm2602_dai, 1);
+ if (ret < 0)
+ kfree(ssm2602);
return ret;
}
static int ssm2602_i2c_remove(struct i2c_client *client)
{
- struct snd_soc_codec *codec = i2c_get_clientdata(client);
- kfree(codec->reg_cache);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -658,130 +648,39 @@ static const struct i2c_device_id ssm2602_i2c_id[] = {
{ }
};
MODULE_DEVICE_TABLE(i2c, ssm2602_i2c_id);
+
/* corgi i2c codec control layer */
static struct i2c_driver ssm2602_i2c_driver = {
.driver = {
- .name = "SSM2602 I2C Codec",
+ .name = "ssm2602-codec",
.owner = THIS_MODULE,
},
.probe = ssm2602_i2c_probe,
.remove = ssm2602_i2c_remove,
.id_table = ssm2602_i2c_id,
};
-
-static int ssm2602_add_i2c_device(struct platform_device *pdev,
- const struct ssm2602_setup_data *setup)
-{
- struct i2c_board_info info;
- struct i2c_adapter *adapter;
- struct i2c_client *client;
- int ret;
-
- ret = i2c_add_driver(&ssm2602_i2c_driver);
- if (ret != 0) {
- dev_err(&pdev->dev, "can't add i2c driver\n");
- return ret;
- }
- memset(&info, 0, sizeof(struct i2c_board_info));
- info.addr = setup->i2c_address;
- strlcpy(info.type, "ssm2602", I2C_NAME_SIZE);
- adapter = i2c_get_adapter(setup->i2c_bus);
- if (!adapter) {
- dev_err(&pdev->dev, "can't get i2c adapter %d\n",
- setup->i2c_bus);
- goto err_driver;
- }
- client = i2c_new_device(adapter, &info);
- i2c_put_adapter(adapter);
- if (!client) {
- dev_err(&pdev->dev, "can't add i2c device at 0x%x\n",
- (unsigned int)info.addr);
- goto err_driver;
- }
- return 0;
-err_driver:
- i2c_del_driver(&ssm2602_i2c_driver);
- return -ENODEV;
-}
#endif
-static int ssm2602_probe(struct platform_device *pdev)
+
+static int __init ssm2602_modinit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct ssm2602_setup_data *setup;
- struct snd_soc_codec *codec;
- struct ssm2602_priv *ssm2602;
int ret = 0;
-
- pr_info("ssm2602 Audio Codec %s", SSM2602_VERSION);
-
- setup = socdev->codec_data;
- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (codec == NULL)
- return -ENOMEM;
-
- ssm2602 = kzalloc(sizeof(struct ssm2602_priv), GFP_KERNEL);
- if (ssm2602 == NULL) {
- kfree(codec);
- return -ENOMEM;
- }
-
- snd_soc_codec_set_drvdata(codec, ssm2602);
- socdev->card->codec = codec;
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- ssm2602_socdev = socdev;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
- if (setup->i2c_address) {
- codec->hw_write = (hw_write_t)i2c_master_send;
- ret = ssm2602_add_i2c_device(pdev, setup);
+ ret = i2c_add_driver(&ssm2602_i2c_driver);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register SSM2602 I2C driver: %d\n",
+ ret);
}
-#else
- /* other interfaces */
#endif
return ret;
}
+module_init(ssm2602_modinit);
-/* remove everything here */
-static int ssm2602_remove(struct platform_device *pdev)
+static void __exit ssm2602_exit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec->control_data)
- ssm2602_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
- i2c_unregister_device(codec->control_data);
i2c_del_driver(&ssm2602_i2c_driver);
#endif
- kfree(snd_soc_codec_get_drvdata(codec));
- kfree(codec);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_ssm2602 = {
- .probe = ssm2602_probe,
- .remove = ssm2602_remove,
- .suspend = ssm2602_suspend,
- .resume = ssm2602_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_ssm2602);
-
-static int __init ssm2602_modinit(void)
-{
- return snd_soc_register_dai(&ssm2602_dai);
-}
-module_init(ssm2602_modinit);
-
-static void __exit ssm2602_exit(void)
-{
- snd_soc_unregister_dai(&ssm2602_dai);
}
module_exit(ssm2602_exit);
diff --git a/sound/soc/codecs/ssm2602.h b/sound/soc/codecs/ssm2602.h
index f344e6d76e31..42a47d0f8e25 100644
--- a/sound/soc/codecs/ssm2602.h
+++ b/sound/soc/codecs/ssm2602.h
@@ -124,7 +124,4 @@ struct ssm2602_setup_data {
unsigned short i2c_address;
};
-extern struct snd_soc_dai ssm2602_dai;
-extern struct snd_soc_codec_device soc_codec_dev_ssm2602;
-
#endif
diff --git a/sound/soc/codecs/stac9766.c b/sound/soc/codecs/stac9766.c
index ee86568545c2..00d67cc8e206 100644
--- a/sound/soc/codecs/stac9766.c
+++ b/sound/soc/codecs/stac9766.c
@@ -25,7 +25,6 @@
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/tlv.h>
-#include <sound/soc-of-simple.h>
#include "stac9766.h"
@@ -257,20 +256,15 @@ static int stac9766_reset(struct snd_soc_codec *codec, int try_warm)
return 0;
}
-static int stac9766_codec_suspend(struct platform_device *pdev,
+static int stac9766_codec_suspend(struct snd_soc_codec *codec,
pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
stac9766_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int stac9766_codec_resume(struct platform_device *pdev)
+static int stac9766_codec_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
u16 id, reset;
reset = 0;
@@ -300,10 +294,9 @@ static struct snd_soc_dai_ops stac9766_dai_ops_digital = {
.prepare = ac97_digital_prepare,
};
-struct snd_soc_dai stac9766_dai[] = {
+static struct snd_soc_dai_driver stac9766_dai[] = {
{
- .name = "stac9766 analog",
- .id = 0,
+ .name = "stac9766-hifi-analog",
.ac97_control = 1,
/* stream cababilities */
@@ -325,8 +318,7 @@ struct snd_soc_dai stac9766_dai[] = {
.ops = &stac9766_dai_ops_analog,
},
{
- .name = "stac9766 IEC958",
- .id = 1,
+ .name = "stac9766-hifi-IEC958",
.ac97_control = 1,
/* stream cababilities */
@@ -342,57 +334,24 @@ struct snd_soc_dai stac9766_dai[] = {
.ops = &stac9766_dai_ops_digital,
}
};
-EXPORT_SYMBOL_GPL(stac9766_dai);
-static int stac9766_codec_probe(struct platform_device *pdev)
+static int stac9766_codec_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
int ret = 0;
printk(KERN_INFO "STAC9766 SoC Audio Codec %s\n", STAC9766_VERSION);
- socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (socdev->card->codec == NULL)
- return -ENOMEM;
- codec = socdev->card->codec;
- mutex_init(&codec->mutex);
-
- codec->reg_cache = kmemdup(stac9766_reg, sizeof(stac9766_reg),
- GFP_KERNEL);
- if (codec->reg_cache == NULL) {
- ret = -ENOMEM;
- goto cache_err;
- }
- codec->reg_cache_size = sizeof(stac9766_reg);
- codec->reg_cache_step = 2;
-
- codec->name = "STAC9766";
- codec->owner = THIS_MODULE;
- codec->dai = stac9766_dai;
- codec->num_dai = ARRAY_SIZE(stac9766_dai);
- codec->write = stac9766_ac97_write;
- codec->read = stac9766_ac97_read;
- codec->set_bias_level = stac9766_set_bias_level;
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
if (ret < 0)
goto codec_err;
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0)
- goto pcm_err;
-
/* do a cold reset for the controller and then try
* a warm reset followed by an optional cold reset for codec */
stac9766_reset(codec, 0);
ret = stac9766_reset(codec, 1);
if (ret < 0) {
printk(KERN_ERR "Failed to reset STAC9766: AC97 link error\n");
- goto reset_err;
+ goto codec_err;
}
stac9766_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
@@ -402,40 +361,63 @@ static int stac9766_codec_probe(struct platform_device *pdev)
return 0;
-reset_err:
- snd_soc_free_pcms(socdev);
-pcm_err:
- snd_soc_free_ac97_codec(codec);
codec_err:
- kfree(snd_soc_codec_get_drvdata(codec));
-cache_err:
- kfree(socdev->card->codec);
- socdev->card->codec = NULL;
+ snd_soc_free_ac97_codec(codec);
return ret;
}
-static int stac9766_codec_remove(struct platform_device *pdev)
+static int stac9766_codec_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec == NULL)
- return 0;
-
- snd_soc_free_pcms(socdev);
snd_soc_free_ac97_codec(codec);
- kfree(codec->reg_cache);
- kfree(codec);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_stac9766 = {
+static struct snd_soc_codec_driver soc_codec_dev_stac9766 = {
+ .write = stac9766_ac97_write,
+ .read = stac9766_ac97_read,
+ .set_bias_level = stac9766_set_bias_level,
.probe = stac9766_codec_probe,
.remove = stac9766_codec_remove,
.suspend = stac9766_codec_suspend,
.resume = stac9766_codec_resume,
+ .reg_cache_size = sizeof(stac9766_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_step = 2,
+};
+
+static __devinit int stac9766_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_stac9766, stac9766_dai, ARRAY_SIZE(stac9766_dai));
+}
+
+static int __devexit stac9766_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_codec(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver stac9766_codec_driver = {
+ .driver = {
+ .name = "stac9766-codec",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = stac9766_probe,
+ .remove = __devexit_p(stac9766_remove),
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_stac9766);
+
+static int __init stac9766_init(void)
+{
+ return platform_driver_register(&stac9766_codec_driver);
+}
+module_init(stac9766_init);
+
+static void __exit stac9766_exit(void)
+{
+ platform_driver_unregister(&stac9766_codec_driver);
+}
+module_exit(stac9766_exit);
MODULE_DESCRIPTION("ASoC stac9766 driver");
MODULE_AUTHOR("Jon Smirl <jonsmirl@gmail.com>");
diff --git a/sound/soc/codecs/stac9766.h b/sound/soc/codecs/stac9766.h
index 65642eb8393e..c726f907e2c0 100644
--- a/sound/soc/codecs/stac9766.h
+++ b/sound/soc/codecs/stac9766.h
@@ -14,8 +14,4 @@
#define STAC9766_DAI_AC97_ANALOG 0
#define STAC9766_DAI_AC97_DIGITAL 1
-extern struct snd_soc_dai stac9766_dai[];
-extern struct snd_soc_codec_device soc_codec_dev_stac9766;
-
-
#endif
diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c
index 0a4b0fef3355..e8652b1ae326 100644
--- a/sound/soc/codecs/tlv320aic23.c
+++ b/sound/soc/codecs/tlv320aic23.c
@@ -240,7 +240,8 @@ static const struct snd_soc_dapm_route intercon[] = {
/* AIC23 driver data */
struct aic23 {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
+ void *control_data;
int mclk;
int requested_adc;
int requested_dac;
@@ -404,11 +405,10 @@ static int tlv320aic23_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
u16 iface_reg;
int ret;
- struct aic23 *aic23 = container_of(codec, struct aic23, codec);
+ struct aic23 *aic23 = snd_soc_codec_get_drvdata(codec);
u32 sample_rate_adc = aic23->requested_adc;
u32 sample_rate_dac = aic23->requested_dac;
u32 sample_rate = params_rate(params);
@@ -452,8 +452,7 @@ static int tlv320aic23_pcm_prepare(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
/* set active */
tlv320aic23_write(codec, TLV320AIC23_ACTIVE, 0x0001);
@@ -465,9 +464,8 @@ static void tlv320aic23_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
- struct aic23 *aic23 = container_of(codec, struct aic23, codec);
+ struct snd_soc_codec *codec = rtd->codec;
+ struct aic23 *aic23 = snd_soc_codec_get_drvdata(codec);
/* deactivate */
if (!codec->active) {
@@ -546,8 +544,7 @@ static int tlv320aic23_set_dai_fmt(struct snd_soc_dai *codec_dai,
static int tlv320aic23_set_dai_sysclk(struct snd_soc_dai *codec_dai,
int clk_id, unsigned int freq, int dir)
{
- struct snd_soc_codec *codec = codec_dai->codec;
- struct aic23 *aic23 = container_of(codec, struct aic23, codec);
+ struct aic23 *aic23 = snd_soc_dai_get_drvdata(codec_dai);
aic23->mclk = freq;
return 0;
}
@@ -594,8 +591,8 @@ static struct snd_soc_dai_ops tlv320aic23_dai_ops = {
.set_sysclk = tlv320aic23_set_dai_sysclk,
};
-struct snd_soc_dai tlv320aic23_dai = {
- .name = "tlv320aic23",
+static struct snd_soc_dai_driver tlv320aic23_dai = {
+ .name = "tlv320aic23-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -610,23 +607,17 @@ struct snd_soc_dai tlv320aic23_dai = {
.formats = AIC23_FORMATS,},
.ops = &tlv320aic23_dai_ops,
};
-EXPORT_SYMBOL_GPL(tlv320aic23_dai);
-static int tlv320aic23_suspend(struct platform_device *pdev,
+static int tlv320aic23_suspend(struct snd_soc_codec *codec,
pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int tlv320aic23_resume(struct platform_device *pdev)
+static int tlv320aic23_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
u16 reg;
/* Sync reg_cache with the hardware */
@@ -639,39 +630,19 @@ static int tlv320aic23_resume(struct platform_device *pdev)
return 0;
}
-/*
- * initialise the AIC23 driver
- * register the mixer and dsp interfaces with the kernel
- */
-static int tlv320aic23_init(struct snd_soc_device *socdev)
+static int tlv320aic23_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = socdev->card->codec;
- int ret = 0;
- u16 reg;
+ struct aic23 *aic23 = snd_soc_codec_get_drvdata(codec);
+ int reg;
- codec->name = "tlv320aic23";
- codec->owner = THIS_MODULE;
- codec->read = tlv320aic23_read_reg_cache;
- codec->write = tlv320aic23_write;
- codec->set_bias_level = tlv320aic23_set_bias_level;
- codec->dai = &tlv320aic23_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = ARRAY_SIZE(tlv320aic23_reg);
- codec->reg_cache =
- kmemdup(tlv320aic23_reg, sizeof(tlv320aic23_reg), GFP_KERNEL);
- if (codec->reg_cache == NULL)
- return -ENOMEM;
+ printk(KERN_INFO "AIC23 Audio Codec %s\n", AIC23_VERSION);
+ codec->control_data = aic23->control_data;
+ codec->hw_write = (hw_write_t)i2c_master_send;
+ codec->hw_read = NULL;
/* Reset codec */
tlv320aic23_write(codec, TLV320AIC23_RESET, 0);
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "tlv320aic23: failed to create pcms\n");
- goto pcm_err;
- }
-
/* power on device */
tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
@@ -707,13 +678,27 @@ static int tlv320aic23_init(struct snd_soc_device *socdev)
ARRAY_SIZE(tlv320aic23_snd_controls));
tlv320aic23_add_widgets(codec);
- return ret;
+ return 0;
+}
-pcm_err:
- kfree(codec->reg_cache);
- return ret;
+static int tlv320aic23_remove(struct snd_soc_codec *codec)
+{
+ tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
}
-static struct snd_soc_device *tlv320aic23_socdev;
+
+static struct snd_soc_codec_driver soc_codec_dev_tlv320aic23 = {
+ .reg_cache_size = ARRAY_SIZE(tlv320aic23_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = tlv320aic23_reg,
+ .probe = tlv320aic23_probe,
+ .remove = tlv320aic23_remove,
+ .suspend = tlv320aic23_suspend,
+ .resume = tlv320aic23_resume,
+ .read = tlv320aic23_read_reg_cache,
+ .write = tlv320aic23_write,
+ .set_bias_level = tlv320aic23_set_bias_level,
+};
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
/*
@@ -723,31 +708,30 @@ static struct snd_soc_device *tlv320aic23_socdev;
static int tlv320aic23_codec_probe(struct i2c_client *i2c,
const struct i2c_device_id *i2c_id)
{
- struct snd_soc_device *socdev = tlv320aic23_socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct aic23 *aic23;
int ret;
if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
return -EINVAL;
- i2c_set_clientdata(i2c, codec);
- codec->control_data = i2c;
+ aic23 = kzalloc(sizeof(struct aic23), GFP_KERNEL);
+ if (aic23 == NULL)
+ return -ENOMEM;
- ret = tlv320aic23_init(socdev);
- if (ret < 0) {
- printk(KERN_ERR "tlv320aic23: failed to initialise AIC23\n");
- goto err;
- }
- return ret;
+ i2c_set_clientdata(i2c, aic23);
+ aic23->control_data = i2c;
+ aic23->control_type = SND_SOC_I2C;
-err:
- kfree(codec);
- kfree(i2c);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_tlv320aic23, &tlv320aic23_dai, 1);
+ if (ret < 0)
+ kfree(aic23);
return ret;
}
static int __exit tlv320aic23_i2c_remove(struct i2c_client *i2c)
{
- put_device(&i2c->dev);
+ snd_soc_unregister_codec(&i2c->dev);
+ kfree(i2c_get_clientdata(i2c));
return 0;
}
@@ -760,7 +744,7 @@ MODULE_DEVICE_TABLE(i2c, tlv320aic23_id);
static struct i2c_driver tlv320aic23_i2c_driver = {
.driver = {
- .name = "tlv320aic23",
+ .name = "tlv320aic23-codec",
},
.probe = tlv320aic23_codec_probe,
.remove = __exit_p(tlv320aic23_i2c_remove),
@@ -769,71 +753,25 @@ static struct i2c_driver tlv320aic23_i2c_driver = {
#endif
-static int tlv320aic23_probe(struct platform_device *pdev)
+static int __init tlv320aic23_modinit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- struct aic23 *aic23;
- int ret = 0;
-
- printk(KERN_INFO "AIC23 Audio Codec %s\n", AIC23_VERSION);
-
- aic23 = kzalloc(sizeof(struct aic23), GFP_KERNEL);
- if (aic23 == NULL)
- return -ENOMEM;
- codec = &aic23->codec;
- socdev->card->codec = codec;
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- tlv320aic23_socdev = socdev;
+ int ret;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
- codec->hw_write = (hw_write_t) i2c_master_send;
- codec->hw_read = NULL;
ret = i2c_add_driver(&tlv320aic23_i2c_driver);
- if (ret != 0)
- printk(KERN_ERR "can't add i2c driver");
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register TLV320AIC23 I2C driver: %d\n",
+ ret);
+ }
#endif
return ret;
}
+module_init(tlv320aic23_modinit);
-static int tlv320aic23_remove(struct platform_device *pdev)
+static void __exit tlv320aic23_exit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
- struct aic23 *aic23 = container_of(codec, struct aic23, codec);
-
- if (codec->control_data)
- tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_del_driver(&tlv320aic23_i2c_driver);
#endif
- kfree(codec->reg_cache);
- kfree(aic23);
-
- return 0;
-}
-struct snd_soc_codec_device soc_codec_dev_tlv320aic23 = {
- .probe = tlv320aic23_probe,
- .remove = tlv320aic23_remove,
- .suspend = tlv320aic23_suspend,
- .resume = tlv320aic23_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_tlv320aic23);
-
-static int __init tlv320aic23_modinit(void)
-{
- return snd_soc_register_dai(&tlv320aic23_dai);
-}
-module_init(tlv320aic23_modinit);
-
-static void __exit tlv320aic23_exit(void)
-{
- snd_soc_unregister_dai(&tlv320aic23_dai);
}
module_exit(tlv320aic23_exit);
diff --git a/sound/soc/codecs/tlv320aic23.h b/sound/soc/codecs/tlv320aic23.h
index 79d1faf8e570..e804120bd3da 100644
--- a/sound/soc/codecs/tlv320aic23.h
+++ b/sound/soc/codecs/tlv320aic23.h
@@ -116,7 +116,4 @@
#define TLV320AIC23_SIDETONE_12 0x080
#define TLV320AIC23_SIDETONE_18 0x0c0
-extern struct snd_soc_dai tlv320aic23_dai;
-extern struct snd_soc_codec_device soc_codec_dev_tlv320aic23;
-
#endif /* _TLV320AIC23_H */
diff --git a/sound/soc/codecs/tlv320aic26.c b/sound/soc/codecs/tlv320aic26.c
index f0e00fd4b435..6b7d71ec0004 100644
--- a/sound/soc/codecs/tlv320aic26.c
+++ b/sound/soc/codecs/tlv320aic26.c
@@ -19,7 +19,6 @@
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/soc-dapm.h>
-#include <sound/soc-of-simple.h>
#include <sound/initval.h>
#include "tlv320aic26.h"
@@ -130,8 +129,7 @@ static int aic26_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct aic26 *aic26 = snd_soc_codec_get_drvdata(codec);
int fsref, divisor, wlen, pval, jval, dval, qval;
u16 reg;
@@ -278,8 +276,8 @@ static struct snd_soc_dai_ops aic26_dai_ops = {
.set_fmt = aic26_set_fmt,
};
-struct snd_soc_dai aic26_dai = {
- .name = "tlv320aic26",
+static struct snd_soc_dai_driver aic26_dai = {
+ .name = "tlv320aic26-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -296,7 +294,6 @@ struct snd_soc_dai aic26_dai = {
},
.ops = &aic26_dai_ops,
};
-EXPORT_SYMBOL_GPL(aic26_dai);
/* ---------------------------------------------------------------------
* ALSA controls
@@ -319,61 +316,6 @@ static const struct snd_kcontrol_new aic26_snd_controls[] = {
};
/* ---------------------------------------------------------------------
- * SoC CODEC portion of driver: probe and release routines
- */
-static int aic26_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- struct aic26 *aic26;
- int ret, err;
-
- dev_info(&pdev->dev, "Probing AIC26 SoC CODEC driver\n");
- dev_dbg(&pdev->dev, "socdev=%p\n", socdev);
- dev_dbg(&pdev->dev, "codec_data=%p\n", socdev->codec_data);
-
- /* Fetch the relevant aic26 private data here (it's already been
- * stored in the .codec pointer) */
- aic26 = socdev->codec_data;
- if (aic26 == NULL) {
- dev_err(&pdev->dev, "aic26: missing codec pointer\n");
- return -ENODEV;
- }
- codec = &aic26->codec;
- socdev->card->codec = codec;
-
- dev_dbg(&pdev->dev, "Registering PCMs, dev=%p, socdev->dev=%p\n",
- &pdev->dev, socdev->dev);
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(&pdev->dev, "aic26: failed to create pcms\n");
- return -ENODEV;
- }
-
- /* register controls */
- dev_dbg(&pdev->dev, "Registering controls\n");
- err = snd_soc_add_controls(codec, aic26_snd_controls,
- ARRAY_SIZE(aic26_snd_controls));
- WARN_ON(err < 0);
-
- return 0;
-}
-
-static int aic26_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- snd_soc_free_pcms(socdev);
- return 0;
-}
-
-struct snd_soc_codec_device aic26_soc_codec_dev = {
- .probe = aic26_probe,
- .remove = aic26_remove,
-};
-EXPORT_SYMBOL_GPL(aic26_soc_codec_dev);
-
-/* ---------------------------------------------------------------------
* SPI device portion of driver: sysfs files for debugging
*/
@@ -409,95 +351,95 @@ static ssize_t aic26_keyclick_set(struct device *dev,
static DEVICE_ATTR(keyclick, 0644, aic26_keyclick_show, aic26_keyclick_set);
/* ---------------------------------------------------------------------
- * SPI device portion of driver: probe and release routines and SPI
- * driver registration.
+ * SoC CODEC portion of driver: probe and release routines
*/
-static int aic26_spi_probe(struct spi_device *spi)
+static int aic26_probe(struct snd_soc_codec *codec)
{
- struct aic26 *aic26;
- int ret, i, reg;
-
- dev_dbg(&spi->dev, "probing tlv320aic26 spi device\n");
-
- /* Allocate driver data */
- aic26 = kzalloc(sizeof *aic26, GFP_KERNEL);
- if (!aic26)
- return -ENOMEM;
-
- /* Initialize the driver data */
- aic26->spi = spi;
- dev_set_drvdata(&spi->dev, aic26);
+ struct aic26 *aic26 = snd_soc_codec_get_drvdata(codec);
+ int ret, err, i, reg;
- /* Setup what we can in the codec structure so that the register
- * access functions will work as expected. More will be filled
- * out when it is probed by the SoC CODEC part of this driver */
- snd_soc_codec_set_drvdata(&aic26->codec, aic26);
- aic26->codec.name = "aic26";
- aic26->codec.owner = THIS_MODULE;
- aic26->codec.dai = &aic26_dai;
- aic26->codec.num_dai = 1;
- aic26->codec.read = aic26_reg_read;
- aic26->codec.write = aic26_reg_write;
- aic26->master = 1;
- mutex_init(&aic26->codec.mutex);
- INIT_LIST_HEAD(&aic26->codec.dapm_widgets);
- INIT_LIST_HEAD(&aic26->codec.dapm_paths);
- aic26->codec.reg_cache_size = AIC26_NUM_REGS;
- aic26->codec.reg_cache = aic26->reg_cache;
-
- aic26_dai.dev = &spi->dev;
- ret = snd_soc_register_dai(&aic26_dai);
- if (ret != 0) {
- dev_err(&spi->dev, "Failed to register DAI: %d\n", ret);
- kfree(aic26);
- return ret;
- }
+ dev_info(codec->dev, "Probing AIC26 SoC CODEC driver\n");
/* Reset the codec to power on defaults */
- aic26_reg_write(&aic26->codec, AIC26_REG_RESET, 0xBB00);
+ aic26_reg_write(codec, AIC26_REG_RESET, 0xBB00);
/* Power up CODEC */
- aic26_reg_write(&aic26->codec, AIC26_REG_POWER_CTRL, 0);
+ aic26_reg_write(codec, AIC26_REG_POWER_CTRL, 0);
/* Audio Control 3 (master mode, fsref rate) */
- reg = aic26_reg_read(&aic26->codec, AIC26_REG_AUDIO_CTRL3);
+ reg = aic26_reg_read(codec, AIC26_REG_AUDIO_CTRL3);
reg &= ~0xf800;
reg |= 0x0800; /* set master mode */
- aic26_reg_write(&aic26->codec, AIC26_REG_AUDIO_CTRL3, reg);
+ aic26_reg_write(codec, AIC26_REG_AUDIO_CTRL3, reg);
/* Fill register cache */
for (i = 0; i < ARRAY_SIZE(aic26->reg_cache); i++)
- aic26_reg_read(&aic26->codec, i);
+ aic26_reg_read(codec, i);
/* Register the sysfs files for debugging */
/* Create SysFS files */
- ret = device_create_file(&spi->dev, &dev_attr_keyclick);
+ ret = device_create_file(codec->dev, &dev_attr_keyclick);
if (ret)
- dev_info(&spi->dev, "error creating sysfs files\n");
+ dev_info(codec->dev, "error creating sysfs files\n");
-#if defined(CONFIG_SND_SOC_OF_SIMPLE)
- /* Tell the of_soc helper about this codec */
- of_snd_soc_register_codec(&aic26_soc_codec_dev, aic26, &aic26_dai,
- spi->dev.archdata.of_node);
-#endif
+ /* register controls */
+ dev_dbg(codec->dev, "Registering controls\n");
+ err = snd_soc_add_controls(codec, aic26_snd_controls,
+ ARRAY_SIZE(aic26_snd_controls));
+ WARN_ON(err < 0);
- dev_dbg(&spi->dev, "SPI device initialized\n");
return 0;
}
-static int aic26_spi_remove(struct spi_device *spi)
+static struct snd_soc_codec_driver aic26_soc_codec_dev = {
+ .probe = aic26_probe,
+ .read = aic26_reg_read,
+ .write = aic26_reg_write,
+ .reg_cache_size = AIC26_NUM_REGS,
+ .reg_word_size = sizeof(u16),
+};
+
+/* ---------------------------------------------------------------------
+ * SPI device portion of driver: probe and release routines and SPI
+ * driver registration.
+ */
+static int aic26_spi_probe(struct spi_device *spi)
{
- struct aic26 *aic26 = dev_get_drvdata(&spi->dev);
+ struct aic26 *aic26;
+ int ret;
- snd_soc_unregister_dai(&aic26_dai);
- kfree(aic26);
+ dev_dbg(&spi->dev, "probing tlv320aic26 spi device\n");
+
+ /* Allocate driver data */
+ aic26 = kzalloc(sizeof *aic26, GFP_KERNEL);
+ if (!aic26)
+ return -ENOMEM;
+ /* Initialize the driver data */
+ aic26->spi = spi;
+ dev_set_drvdata(&spi->dev, aic26);
+ aic26->master = 1;
+
+ ret = snd_soc_register_codec(&spi->dev,
+ &aic26_soc_codec_dev, &aic26_dai, 1);
+ if (ret < 0)
+ kfree(aic26);
+ return ret;
+
+ dev_dbg(&spi->dev, "SPI device initialized\n");
+ return 0;
+}
+
+static int aic26_spi_remove(struct spi_device *spi)
+{
+ snd_soc_unregister_codec(&spi->dev);
+ kfree(spi_get_drvdata(spi));
return 0;
}
static struct spi_driver aic26_spi = {
.driver = {
- .name = "tlv320aic26",
+ .name = "tlv320aic26-codec",
.owner = THIS_MODULE,
},
.probe = aic26_spi_probe,
diff --git a/sound/soc/codecs/tlv320aic26.h b/sound/soc/codecs/tlv320aic26.h
index 786ba16c945f..62b1f2261429 100644
--- a/sound/soc/codecs/tlv320aic26.h
+++ b/sound/soc/codecs/tlv320aic26.h
@@ -90,7 +90,4 @@ enum aic26_wlen {
AIC26_WLEN_32 = 3 << 10,
};
-extern struct snd_soc_dai aic26_dai;
-extern struct snd_soc_codec_device aic26_soc_codec_dev;
-
#endif /* _TLV320AIC16_H_ */
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c
index 71a69908ccf6..43fd9c171742 100644
--- a/sound/soc/codecs/tlv320aic3x.c
+++ b/sound/soc/codecs/tlv320aic3x.c
@@ -63,8 +63,10 @@ static const char *aic3x_supply_names[AIC3X_NUM_SUPPLIES] = {
/* codec private data */
struct aic3x_priv {
- struct snd_soc_codec codec;
struct regulator_bulk_data supplies[AIC3X_NUM_SUPPLIES];
+ enum snd_soc_control_type control_type;
+ struct aic3x_setup_data *setup;
+ void *control_data;
unsigned int sysclk;
int master;
int gpio_reset;
@@ -773,8 +775,7 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec =rtd->codec;
struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec);
int codec_clk = 0, bypass_pll = 0, fsref, last_clk = 0;
u8 data, j, r, p, pll_q, pll_p = 1, pll_r = 1, pll_j = 1;
@@ -1101,8 +1102,8 @@ static struct snd_soc_dai_ops aic3x_dai_ops = {
.set_fmt = aic3x_set_dai_fmt,
};
-struct snd_soc_dai aic3x_dai = {
- .name = "tlv320aic3x",
+static struct snd_soc_dai_driver aic3x_dai = {
+ .name = "tlv320aic3x-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -1117,22 +1118,16 @@ struct snd_soc_dai aic3x_dai = {
.formats = AIC3X_FORMATS,},
.ops = &aic3x_dai_ops,
};
-EXPORT_SYMBOL_GPL(aic3x_dai);
-static int aic3x_suspend(struct platform_device *pdev, pm_message_t state)
+static int aic3x_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
aic3x_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int aic3x_resume(struct platform_device *pdev)
+static int aic3x_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
u8 data[2];
u8 *cache = codec->reg_cache;
@@ -1157,22 +1152,6 @@ static int aic3x_init(struct snd_soc_codec *codec)
{
int reg;
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->name = "tlv320aic3x";
- codec->owner = THIS_MODULE;
- codec->read = aic3x_read_reg_cache;
- codec->write = aic3x_write;
- codec->set_bias_level = aic3x_set_bias_level;
- codec->dai = &aic3x_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = ARRAY_SIZE(aic3x_reg);
- codec->reg_cache = kmemdup(aic3x_reg, sizeof(aic3x_reg), GFP_KERNEL);
- if (codec->reg_cache == NULL)
- return -ENOMEM;
-
aic3x_write(codec, AIC3X_PAGE_SELECT, PAGE0_SELECT);
aic3x_write(codec, AIC3X_RESET, SOFT_RESET);
@@ -1245,56 +1224,50 @@ static int aic3x_init(struct snd_soc_codec *codec)
return 0;
}
-static struct snd_soc_codec *aic3x_codec;
-
-static int aic3x_register(struct snd_soc_codec *codec)
+static int aic3x_probe(struct snd_soc_codec *codec)
{
- int ret;
+ struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec);
+
+ codec->hw_write = (hw_write_t) i2c_master_send;
+ codec->control_data = aic3x->control_data;
- ret = aic3x_init(codec);
- if (ret < 0) {
- dev_err(codec->dev, "Failed to initialise device\n");
- return ret;
+ if (aic3x->setup) {
+ /* setup GPIO functions */
+ aic3x_write(codec, AIC3X_GPIO1_REG,
+ (aic3x->setup->gpio_func[0] & 0xf) << 4);
+ aic3x_write(codec, AIC3X_GPIO2_REG,
+ (aic3x->setup->gpio_func[1] & 0xf) << 4);
}
- aic3x_codec = codec;
+ aic3x_init(codec);
- ret = snd_soc_register_codec(codec);
- if (ret) {
- dev_err(codec->dev, "Failed to register codec\n");
- return ret;
- }
+ snd_soc_add_controls(codec, aic3x_snd_controls,
+ ARRAY_SIZE(aic3x_snd_controls));
- ret = snd_soc_register_dai(&aic3x_dai);
- if (ret) {
- dev_err(codec->dev, "Failed to register dai\n");
- snd_soc_unregister_codec(codec);
- return ret;
- }
+ aic3x_add_widgets(codec);
return 0;
}
-static int aic3x_unregister(struct aic3x_priv *aic3x)
+static int aic3x_remove(struct snd_soc_codec *codec)
{
- aic3x_set_bias_level(&aic3x->codec, SND_SOC_BIAS_OFF);
-
- snd_soc_unregister_dai(&aic3x_dai);
- snd_soc_unregister_codec(&aic3x->codec);
-
- if (aic3x->gpio_reset >= 0) {
- gpio_set_value(aic3x->gpio_reset, 0);
- gpio_free(aic3x->gpio_reset);
- }
- regulator_bulk_disable(ARRAY_SIZE(aic3x->supplies), aic3x->supplies);
- regulator_bulk_free(ARRAY_SIZE(aic3x->supplies), aic3x->supplies);
-
- kfree(aic3x);
- aic3x_codec = NULL;
-
+ aic3x_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_aic3x = {
+ .read = aic3x_read_reg_cache,
+ .write = aic3x_write,
+ .set_bias_level = aic3x_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(aic3x_reg),
+ .reg_word_size = sizeof(u8),
+ .reg_cache_default = aic3x_reg,
+ .probe = aic3x_probe,
+ .remove = aic3x_remove,
+ .suspend = aic3x_suspend,
+ .resume = aic3x_resume,
+};
+
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
/*
* AIC3X 2 wire address can be up to 4 devices with device addresses
@@ -1308,9 +1281,9 @@ static int aic3x_unregister(struct aic3x_priv *aic3x)
static int aic3x_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
- struct snd_soc_codec *codec;
- struct aic3x_priv *aic3x;
struct aic3x_pdata *pdata = i2c->dev.platform_data;
+ struct aic3x_setup_data *setup = pdata->setup;
+ struct aic3x_priv *aic3x;
int ret, i;
aic3x = kzalloc(sizeof(struct aic3x_priv), GFP_KERNEL);
@@ -1319,12 +1292,8 @@ static int aic3x_i2c_probe(struct i2c_client *i2c,
return -ENOMEM;
}
- codec = &aic3x->codec;
- codec->dev = &i2c->dev;
- snd_soc_codec_set_drvdata(codec, aic3x);
- codec->control_data = i2c;
- codec->hw_write = (hw_write_t) i2c_master_send;
-
+ aic3x->control_data = i2c;
+ aic3x->setup = setup;
i2c_set_clientdata(i2c, aic3x);
aic3x->gpio_reset = -1;
@@ -1339,17 +1308,17 @@ static int aic3x_i2c_probe(struct i2c_client *i2c,
for (i = 0; i < ARRAY_SIZE(aic3x->supplies); i++)
aic3x->supplies[i].supply = aic3x_supply_names[i];
- ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(aic3x->supplies),
+ ret = regulator_bulk_get(&i2c->dev, ARRAY_SIZE(aic3x->supplies),
aic3x->supplies);
if (ret != 0) {
- dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
+ dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
goto err_get;
}
ret = regulator_bulk_enable(ARRAY_SIZE(aic3x->supplies),
aic3x->supplies);
if (ret != 0) {
- dev_err(codec->dev, "Failed to enable supplies: %d\n", ret);
+ dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
goto err_enable;
}
@@ -1358,7 +1327,11 @@ static int aic3x_i2c_probe(struct i2c_client *i2c,
gpio_set_value(aic3x->gpio_reset, 1);
}
- return aic3x_register(codec);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_aic3x, &aic3x_dai, 1);
+ if (ret < 0)
+ goto err_enable;
+ return ret;
err_enable:
regulator_bulk_free(ARRAY_SIZE(aic3x->supplies), aic3x->supplies);
@@ -1374,7 +1347,16 @@ static int aic3x_i2c_remove(struct i2c_client *client)
{
struct aic3x_priv *aic3x = i2c_get_clientdata(client);
- return aic3x_unregister(aic3x);
+ if (aic3x->gpio_reset >= 0) {
+ gpio_set_value(aic3x->gpio_reset, 0);
+ gpio_free(aic3x->gpio_reset);
+ }
+ regulator_bulk_disable(ARRAY_SIZE(aic3x->supplies), aic3x->supplies);
+ regulator_bulk_free(ARRAY_SIZE(aic3x->supplies), aic3x->supplies);
+
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
+ return 0;
}
static const struct i2c_device_id aic3x_i2c_id[] = {
@@ -1387,7 +1369,7 @@ MODULE_DEVICE_TABLE(i2c, aic3x_i2c_id);
/* machine i2c codec control layer */
static struct i2c_driver aic3x_i2c_driver = {
.driver = {
- .name = "aic3x I2C Codec",
+ .name = "tlv320aic3x-codec",
.owner = THIS_MODULE,
},
.probe = aic3x_i2c_probe,
@@ -1409,90 +1391,27 @@ static inline void aic3x_i2c_exit(void)
{
i2c_del_driver(&aic3x_i2c_driver);
}
-#else
-static inline void aic3x_i2c_init(void) { }
-static inline void aic3x_i2c_exit(void) { }
#endif
-static int aic3x_probe(struct platform_device *pdev)
+static int __init aic3x_modinit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct aic3x_setup_data *setup;
- struct snd_soc_codec *codec;
int ret = 0;
-
- codec = aic3x_codec;
- if (!codec) {
- dev_err(&pdev->dev, "Codec not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = codec;
- setup = socdev->codec_data;
-
- if (setup) {
- /* setup GPIO functions */
- aic3x_write(codec, AIC3X_GPIO1_REG,
- (setup->gpio_func[0] & 0xf) << 4);
- aic3x_write(codec, AIC3X_GPIO2_REG,
- (setup->gpio_func[1] & 0xf) << 4);
- }
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "aic3x: failed to create pcms\n");
- goto pcm_err;
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+ ret = i2c_add_driver(&aic3x_i2c_driver);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register TLV320AIC3x I2C driver: %d\n",
+ ret);
}
-
- snd_soc_add_controls(codec, aic3x_snd_controls,
- ARRAY_SIZE(aic3x_snd_controls));
-
- aic3x_add_widgets(codec);
-
- return ret;
-
-pcm_err:
- kfree(codec->reg_cache);
+#endif
return ret;
}
-
-static int aic3x_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- /* power down chip */
- if (codec->control_data)
- aic3x_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- kfree(codec->reg_cache);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_aic3x = {
- .probe = aic3x_probe,
- .remove = aic3x_remove,
- .suspend = aic3x_suspend,
- .resume = aic3x_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_aic3x);
-
-static int __init aic3x_modinit(void)
-{
- aic3x_i2c_init();
-
- return 0;
-}
module_init(aic3x_modinit);
static void __exit aic3x_exit(void)
{
- aic3x_i2c_exit();
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+ i2c_del_driver(&aic3x_i2c_driver);
+#endif
}
module_exit(aic3x_exit);
diff --git a/sound/soc/codecs/tlv320aic3x.h b/sound/soc/codecs/tlv320aic3x.h
index 9af1c886213c..f6e3d9b42daf 100644
--- a/sound/soc/codecs/tlv320aic3x.h
+++ b/sound/soc/codecs/tlv320aic3x.h
@@ -199,42 +199,6 @@
/* Default input volume */
#define DEFAULT_GAIN 0x20
-/* GPIO API */
-enum {
- AIC3X_GPIO1_FUNC_DISABLED = 0,
- AIC3X_GPIO1_FUNC_AUDIO_WORDCLK_ADC = 1,
- AIC3X_GPIO1_FUNC_CLOCK_MUX = 2,
- AIC3X_GPIO1_FUNC_CLOCK_MUX_DIV2 = 3,
- AIC3X_GPIO1_FUNC_CLOCK_MUX_DIV4 = 4,
- AIC3X_GPIO1_FUNC_CLOCK_MUX_DIV8 = 5,
- AIC3X_GPIO1_FUNC_SHORT_CIRCUIT_IRQ = 6,
- AIC3X_GPIO1_FUNC_AGC_NOISE_IRQ = 7,
- AIC3X_GPIO1_FUNC_INPUT = 8,
- AIC3X_GPIO1_FUNC_OUTPUT = 9,
- AIC3X_GPIO1_FUNC_DIGITAL_MIC_MODCLK = 10,
- AIC3X_GPIO1_FUNC_AUDIO_WORDCLK = 11,
- AIC3X_GPIO1_FUNC_BUTTON_IRQ = 12,
- AIC3X_GPIO1_FUNC_HEADSET_DETECT_IRQ = 13,
- AIC3X_GPIO1_FUNC_HEADSET_DETECT_OR_BUTTON_IRQ = 14,
- AIC3X_GPIO1_FUNC_ALL_IRQ = 16
-};
-
-enum {
- AIC3X_GPIO2_FUNC_DISABLED = 0,
- AIC3X_GPIO2_FUNC_HEADSET_DETECT_IRQ = 2,
- AIC3X_GPIO2_FUNC_INPUT = 3,
- AIC3X_GPIO2_FUNC_OUTPUT = 4,
- AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT = 5,
- AIC3X_GPIO2_FUNC_AUDIO_BITCLK = 8,
- AIC3X_GPIO2_FUNC_HEADSET_DETECT_OR_BUTTON_IRQ = 9,
- AIC3X_GPIO2_FUNC_ALL_IRQ = 10,
- AIC3X_GPIO2_FUNC_SHORT_CIRCUIT_OR_AGC_IRQ = 11,
- AIC3X_GPIO2_FUNC_HEADSET_OR_BUTTON_PRESS_OR_SHORT_CIRCUIT_IRQ = 12,
- AIC3X_GPIO2_FUNC_SHORT_CIRCUIT_IRQ = 13,
- AIC3X_GPIO2_FUNC_AGC_NOISE_IRQ = 14,
- AIC3X_GPIO2_FUNC_BUTTON_PRESS_IRQ = 15
-};
-
void aic3x_set_gpio(struct snd_soc_codec *codec, int gpio, int state);
int aic3x_get_gpio(struct snd_soc_codec *codec, int gpio);
@@ -281,11 +245,4 @@ void aic3x_set_headset_detection(struct snd_soc_codec *codec, int detect,
int aic3x_headset_detected(struct snd_soc_codec *codec);
int aic3x_button_pressed(struct snd_soc_codec *codec);
-struct aic3x_setup_data {
- unsigned int gpio_func[2];
-};
-
-extern struct snd_soc_dai aic3x_dai;
-extern struct snd_soc_codec_device soc_codec_dev_aic3x;
-
#endif /* _AIC3X_H */
diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c
index 8651b01ed223..a3c5b521da6a 100644
--- a/sound/soc/codecs/tlv320dac33.c
+++ b/sound/soc/codecs/tlv320dac33.c
@@ -66,8 +66,6 @@
static void dac33_calculate_times(struct snd_pcm_substream *substream);
static int dac33_prepare_chip(struct snd_pcm_substream *substream);
-static struct snd_soc_codec *tlv320dac33_codec;
-
enum dac33_state {
DAC33_IDLE = 0,
DAC33_PREFILL,
@@ -93,7 +91,7 @@ struct tlv320dac33_priv {
struct mutex mutex;
struct workqueue_struct *dac33_wq;
struct work_struct work;
- struct snd_soc_codec codec;
+ struct snd_soc_codec *codec;
struct regulator_bulk_data supplies[DAC33_NUM_SUPPLIES];
struct snd_pcm_substream *substream;
int power_gpio;
@@ -128,6 +126,8 @@ struct tlv320dac33_priv {
unsigned int uthr;
enum dac33_state state;
+ enum snd_soc_control_type control_type;
+ void *control_data;
};
static const u8 dac33_reg[DAC33_CACHEREGNUM] = {
@@ -650,9 +650,7 @@ static int dac33_set_bias_level(struct snd_soc_codec *codec,
static inline void dac33_prefill_handler(struct tlv320dac33_priv *dac33)
{
- struct snd_soc_codec *codec;
-
- codec = &dac33->codec;
+ struct snd_soc_codec *codec = dac33->codec;
switch (dac33->fifo_mode) {
case DAC33_FIFO_MODE1:
@@ -695,9 +693,7 @@ static inline void dac33_prefill_handler(struct tlv320dac33_priv *dac33)
static inline void dac33_playback_handler(struct tlv320dac33_priv *dac33)
{
- struct snd_soc_codec *codec;
-
- codec = &dac33->codec;
+ struct snd_soc_codec *codec = dac33->codec;
switch (dac33->fifo_mode) {
case DAC33_FIFO_MODE1:
@@ -726,7 +722,7 @@ static void dac33_work(struct work_struct *work)
u8 reg;
dac33 = container_of(work, struct tlv320dac33_priv, work);
- codec = &dac33->codec;
+ codec = dac33->codec;
mutex_lock(&dac33->mutex);
switch (dac33->state) {
@@ -787,8 +783,7 @@ static int dac33_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
/* Stream started, save the substream pointer */
@@ -801,8 +796,7 @@ static void dac33_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
dac33->substream = NULL;
@@ -817,8 +811,7 @@ static int dac33_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
/* Check parameters for validity */
switch (params_rate(params)) {
@@ -856,8 +849,7 @@ static int dac33_hw_params(struct snd_pcm_substream *substream,
static int dac33_prepare_chip(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
unsigned int oscset, ratioset, pwr_ctrl, reg_tmp;
u8 aictrl_a, aictrl_b, fifoctrl_a;
@@ -1049,8 +1041,7 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream)
static void dac33_calculate_times(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
unsigned int period_size = substream->runtime->period_size;
unsigned int rate = substream->runtime->rate;
@@ -1129,8 +1120,7 @@ static int dac33_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
int ret = 0;
@@ -1163,8 +1153,7 @@ static snd_pcm_sframes_t dac33_dai_delay(
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
unsigned long long t0, t1, t_now;
unsigned int time_delta, uthr;
@@ -1389,24 +1378,47 @@ static int dac33_set_dai_fmt(struct snd_soc_dai *codec_dai,
return 0;
}
-static int dac33_soc_probe(struct platform_device *pdev)
+static int dac33_soc_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- struct tlv320dac33_priv *dac33;
+ struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
int ret = 0;
- BUG_ON(!tlv320dac33_codec);
+ codec->control_data = dac33->control_data;
+ codec->hw_write = (hw_write_t) i2c_master_send;
+ codec->bias_level = SND_SOC_BIAS_OFF;
+ codec->idle_bias_off = 1;
+ dac33->codec = codec;
- codec = tlv320dac33_codec;
- socdev->card->codec = codec;
- dac33 = snd_soc_codec_get_drvdata(codec);
+ /* Read the tlv320dac33 ID registers */
+ ret = dac33_hard_power(codec, 1);
+ if (ret != 0) {
+ dev_err(codec->dev, "Failed to power up codec: %d\n", ret);
+ goto err_power;
+ }
+ dac33_read_id(codec);
+ dac33_hard_power(codec, 0);
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms\n");
- goto pcm_err;
+ /* Check if the IRQ number is valid and request it */
+ if (dac33->irq >= 0) {
+ ret = request_irq(dac33->irq, dac33_interrupt_handler,
+ IRQF_TRIGGER_RISING | IRQF_DISABLED,
+ codec->name, codec);
+ if (ret < 0) {
+ dev_err(codec->dev, "Could not request IRQ%d (%d)\n",
+ dac33->irq, ret);
+ dac33->irq = -1;
+ }
+ if (dac33->irq != -1) {
+ /* Setup work queue */
+ dac33->dac33_wq =
+ create_singlethread_workqueue("tlv320dac33");
+ if (dac33->dac33_wq == NULL) {
+ free_irq(dac33->irq, codec);
+ return -ENOMEM;
+ }
+
+ INIT_WORK(&dac33->work, dac33_work);
+ }
}
snd_soc_add_controls(codec, dac33_snd_controls,
@@ -1420,56 +1432,51 @@ static int dac33_soc_probe(struct platform_device *pdev)
snd_soc_add_controls(codec, dac33_fifo_snd_controls,
ARRAY_SIZE(dac33_fifo_snd_controls));
}
-
dac33_add_widgets(codec);
- return 0;
-
-pcm_err:
- dac33_hard_power(codec, 0);
+err_power:
return ret;
}
-static int dac33_soc_remove(struct platform_device *pdev)
+static int dac33_soc_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
dac33_set_bias_level(codec, SND_SOC_BIAS_OFF);
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
+ if (dac33->irq >= 0) {
+ free_irq(dac33->irq, dac33->codec);
+ destroy_workqueue(dac33->dac33_wq);
+ }
return 0;
}
-static int dac33_soc_suspend(struct platform_device *pdev, pm_message_t state)
+static int dac33_soc_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
dac33_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int dac33_soc_resume(struct platform_device *pdev)
+static int dac33_soc_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
dac33_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_tlv320dac33 = {
+static struct snd_soc_codec_driver soc_codec_dev_tlv320dac33 = {
+ .read = dac33_read_reg_cache,
+ .write = dac33_write_locked,
+ .set_bias_level = dac33_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(dac33_reg),
+ .reg_word_size = sizeof(u8),
+ .reg_cache_default = dac33_reg,
.probe = dac33_soc_probe,
.remove = dac33_soc_remove,
.suspend = dac33_soc_suspend,
.resume = dac33_soc_resume,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_tlv320dac33);
#define DAC33_RATES (SNDRV_PCM_RATE_44100 | \
SNDRV_PCM_RATE_48000)
@@ -1485,8 +1492,8 @@ static struct snd_soc_dai_ops dac33_dai_ops = {
.set_fmt = dac33_set_dai_fmt,
};
-struct snd_soc_dai dac33_dai = {
- .name = "tlv320dac33",
+static struct snd_soc_dai_driver dac33_dai = {
+ .name = "tlv320dac33-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -1495,14 +1502,12 @@ struct snd_soc_dai dac33_dai = {
.formats = DAC33_FORMATS,},
.ops = &dac33_dai_ops,
};
-EXPORT_SYMBOL_GPL(dac33_dai);
static int __devinit dac33_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct tlv320dac33_platform_data *pdata;
struct tlv320dac33_priv *dac33;
- struct snd_soc_codec *codec;
int ret, i;
if (client->dev.platform_data == NULL) {
@@ -1515,33 +1520,9 @@ static int __devinit dac33_i2c_probe(struct i2c_client *client,
if (dac33 == NULL)
return -ENOMEM;
- codec = &dac33->codec;
- snd_soc_codec_set_drvdata(codec, dac33);
- codec->control_data = client;
-
- mutex_init(&codec->mutex);
+ dac33->control_data = client;
mutex_init(&dac33->mutex);
spin_lock_init(&dac33->lock);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->name = "tlv320dac33";
- codec->owner = THIS_MODULE;
- codec->read = dac33_read_reg_cache;
- codec->write = dac33_write_locked;
- codec->hw_write = (hw_write_t) i2c_master_send;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = dac33_set_bias_level;
- codec->idle_bias_off = 1;
- codec->dai = &dac33_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = ARRAY_SIZE(dac33_reg);
- codec->reg_cache = kmemdup(dac33_reg, ARRAY_SIZE(dac33_reg),
- GFP_KERNEL);
- if (codec->reg_cache == NULL) {
- ret = -ENOMEM;
- goto error_reg;
- }
i2c_set_clientdata(client, dac33);
@@ -1561,125 +1542,59 @@ static int __devinit dac33_i2c_probe(struct i2c_client *client,
/* Disable FIFO use by default */
dac33->fifo_mode = DAC33_FIFO_BYPASS;
- tlv320dac33_codec = codec;
-
- codec->dev = &client->dev;
- dac33_dai.dev = codec->dev;
-
/* Check if the reset GPIO number is valid and request it */
if (dac33->power_gpio >= 0) {
ret = gpio_request(dac33->power_gpio, "tlv320dac33 reset");
if (ret < 0) {
- dev_err(codec->dev,
+ dev_err(&client->dev,
"Failed to request reset GPIO (%d)\n",
dac33->power_gpio);
- snd_soc_unregister_dai(&dac33_dai);
- snd_soc_unregister_codec(codec);
- goto error_gpio;
+ goto err_gpio;
}
gpio_direction_output(dac33->power_gpio, 0);
}
- /* Check if the IRQ number is valid and request it */
- if (dac33->irq >= 0) {
- ret = request_irq(dac33->irq, dac33_interrupt_handler,
- IRQF_TRIGGER_RISING | IRQF_DISABLED,
- codec->name, codec);
- if (ret < 0) {
- dev_err(codec->dev, "Could not request IRQ%d (%d)\n",
- dac33->irq, ret);
- dac33->irq = -1;
- }
- if (dac33->irq != -1) {
- /* Setup work queue */
- dac33->dac33_wq =
- create_singlethread_workqueue("tlv320dac33");
- if (dac33->dac33_wq == NULL) {
- free_irq(dac33->irq, &dac33->codec);
- ret = -ENOMEM;
- goto error_wq;
- }
-
- INIT_WORK(&dac33->work, dac33_work);
- }
- }
-
for (i = 0; i < ARRAY_SIZE(dac33->supplies); i++)
dac33->supplies[i].supply = dac33_supply_names[i];
- ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(dac33->supplies),
+ ret = regulator_bulk_get(&client->dev, ARRAY_SIZE(dac33->supplies),
dac33->supplies);
if (ret != 0) {
- dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
+ dev_err(&client->dev, "Failed to request supplies: %d\n", ret);
goto err_get;
}
- /* Read the tlv320dac33 ID registers */
- ret = dac33_hard_power(codec, 1);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to power up codec: %d\n", ret);
- goto error_codec;
- }
- dac33_read_id(codec);
- dac33_hard_power(codec, 0);
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto error_codec;
- }
-
- ret = snd_soc_register_dai(&dac33_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- snd_soc_unregister_codec(codec);
- goto error_codec;
- }
+ ret = snd_soc_register_codec(&client->dev,
+ &soc_codec_dev_tlv320dac33, &dac33_dai, 1);
+ if (ret < 0)
+ goto err_register;
return ret;
-
-error_codec:
+err_register:
regulator_bulk_free(ARRAY_SIZE(dac33->supplies), dac33->supplies);
err_get:
- if (dac33->irq >= 0) {
- free_irq(dac33->irq, &dac33->codec);
- destroy_workqueue(dac33->dac33_wq);
- }
-error_wq:
if (dac33->power_gpio >= 0)
gpio_free(dac33->power_gpio);
-error_gpio:
- kfree(codec->reg_cache);
-error_reg:
- tlv320dac33_codec = NULL;
+err_gpio:
kfree(dac33);
-
return ret;
}
static int __devexit dac33_i2c_remove(struct i2c_client *client)
{
- struct tlv320dac33_priv *dac33;
-
- dac33 = i2c_get_clientdata(client);
+ struct tlv320dac33_priv *dac33 = i2c_get_clientdata(client);
if (unlikely(dac33->chip_power))
- dac33_hard_power(&dac33->codec, 0);
+ dac33_hard_power(dac33->codec, 0);
if (dac33->power_gpio >= 0)
gpio_free(dac33->power_gpio);
- if (dac33->irq >= 0)
- free_irq(dac33->irq, &dac33->codec);
regulator_bulk_free(ARRAY_SIZE(dac33->supplies), dac33->supplies);
- destroy_workqueue(dac33->dac33_wq);
- snd_soc_unregister_dai(&dac33_dai);
- snd_soc_unregister_codec(&dac33->codec);
- kfree(dac33->codec.reg_cache);
+ snd_soc_unregister_codec(&client->dev);
kfree(dac33);
- tlv320dac33_codec = NULL;
return 0;
}
@@ -1694,7 +1609,7 @@ static const struct i2c_device_id tlv320dac33_i2c_id[] = {
static struct i2c_driver tlv320dac33_i2c_driver = {
.driver = {
- .name = "tlv320dac33",
+ .name = "tlv320dac33-codec",
.owner = THIS_MODULE,
},
.probe = dac33_i2c_probe,
diff --git a/sound/soc/codecs/tlv320dac33.h b/sound/soc/codecs/tlv320dac33.h
index eb8ae07f0bd2..7c318b5da437 100644
--- a/sound/soc/codecs/tlv320dac33.h
+++ b/sound/soc/codecs/tlv320dac33.h
@@ -261,7 +261,4 @@
#define TLV320DAC33_MCLK 0
#define TLV320DAC33_SLEEPCLK 1
-extern struct snd_soc_dai dac33_dai;
-extern struct snd_soc_codec_device soc_codec_dev_tlv320dac33;
-
#endif /* __TLV320DAC33_H */
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c
index 7b618bbff884..c7ee1a4c9d99 100644
--- a/sound/soc/codecs/twl4030.c
+++ b/sound/soc/codecs/twl4030.c
@@ -36,7 +36,16 @@
#include <sound/initval.h>
#include <sound/tlv.h>
-#include "twl4030.h"
+/* Register descriptions are here */
+#include <linux/mfd/twl4030-codec.h>
+
+/* Shadow register used by the audio driver */
+#define TWL4030_REG_SW_SHADOW 0x4A
+#define TWL4030_CACHEREGNUM (TWL4030_REG_SW_SHADOW + 1)
+
+/* TWL4030_REG_SW_SHADOW (0x4A) Fields */
+#define TWL4030_HFL_EN 0x01
+#define TWL4030_HFR_EN 0x02
/*
* twl4030 register cache & default register settings
@@ -277,21 +286,19 @@ static inline void twl4030_reset_registers(struct snd_soc_codec *codec)
}
-static void twl4030_init_chip(struct platform_device *pdev)
+static void twl4030_init_chip(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct twl4030_setup_data *setup = socdev->codec_data;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct twl4030_codec_audio_data *pdata = dev_get_platdata(codec->dev);
struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
u8 reg, byte;
int i = 0;
/* Check defaults, if instructed before anything else */
- if (setup && setup->check_defaults)
+ if (pdata && pdata->check_defaults)
twl4030_check_defaults(codec);
/* Reset registers, if no setup data or if instructed to do so */
- if (!setup || (setup && setup->reset_registers))
+ if (!pdata || (pdata && pdata->reset_registers))
twl4030_reset_registers(codec);
/* Refresh APLL_CTL register from HW */
@@ -312,20 +319,14 @@ static void twl4030_init_chip(struct platform_device *pdev)
twl4030_write(codec, TWL4030_REG_ARXR2_APGA_CTL, 0x32);
/* Machine dependent setup */
- if (!setup)
+ if (!pdata)
return;
- twl4030->digimic_delay = setup->digimic_delay;
-
- /* Configuration for headset ramp delay from setup data */
- if (setup->sysclk != twl4030->sysclk)
- dev_warn(codec->dev,
- "Mismatch in APLL mclk: %u (configured: %u)\n",
- setup->sysclk, twl4030->sysclk);
+ twl4030->digimic_delay = pdata->digimic_delay;
reg = twl4030_read_reg_cache(codec, TWL4030_REG_HS_POPN_SET);
reg &= ~TWL4030_RAMP_DELAY;
- reg |= (setup->ramp_delay_value << 2);
+ reg |= (pdata->ramp_delay_value << 2);
twl4030_write_reg_cache(codec, TWL4030_REG_HS_POPN_SET, reg);
/* initiate offset cancellation */
@@ -333,7 +334,7 @@ static void twl4030_init_chip(struct platform_device *pdev)
reg = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICL);
reg &= ~TWL4030_OFFSET_CNCL_SEL;
- reg |= setup->offset_cncl_path;
+ reg |= pdata->offset_cncl_path;
twl4030_write(codec, TWL4030_REG_ANAMICL,
reg | TWL4030_CNCL_OFFSET_START);
@@ -718,9 +719,7 @@ static int aif_event(struct snd_soc_dapm_widget *w,
static void headset_ramp(struct snd_soc_codec *codec, int ramp)
{
- struct snd_soc_device *socdev = codec->socdev;
- struct twl4030_setup_data *setup = socdev->codec_data;
-
+ struct twl4030_codec_audio_data *pdata = codec->dev->platform_data;
unsigned char hs_gain, hs_pop;
struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
/* Base values for ramp delay calculation: 2^19 - 2^26 */
@@ -732,9 +731,9 @@ static void headset_ramp(struct snd_soc_codec *codec, int ramp)
/* Enable external mute control, this dramatically reduces
* the pop-noise */
- if (setup && setup->hs_extmute) {
- if (setup->set_hs_extmute) {
- setup->set_hs_extmute(1);
+ if (pdata && pdata->hs_extmute) {
+ if (pdata->set_hs_extmute) {
+ pdata->set_hs_extmute(1);
} else {
hs_pop |= TWL4030_EXTMUTE;
twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop);
@@ -772,9 +771,9 @@ static void headset_ramp(struct snd_soc_codec *codec, int ramp)
}
/* Disable external mute */
- if (setup && setup->hs_extmute) {
- if (setup->set_hs_extmute) {
- setup->set_hs_extmute(0);
+ if (pdata && pdata->hs_extmute) {
+ if (pdata->set_hs_extmute) {
+ pdata->set_hs_extmute(0);
} else {
hs_pop &= ~TWL4030_EXTMUTE;
twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop);
@@ -1707,8 +1706,7 @@ static int twl4030_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
if (twl4030->master_substream) {
@@ -1738,8 +1736,7 @@ static void twl4030_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
if (twl4030->master_substream == substream)
@@ -1764,8 +1761,7 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
u8 mode, old_mode, format, old_format;
@@ -1999,8 +1995,7 @@ static int twl4030_voice_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
u8 mode;
@@ -2033,8 +2028,7 @@ static void twl4030_voice_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
/* Enable voice digital filters */
twl4030_voice_enable(codec, substream->stream, 0);
@@ -2044,8 +2038,7 @@ static int twl4030_voice_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
u8 old_mode, mode;
@@ -2175,7 +2168,7 @@ static int twl4030_voice_set_tristate(struct snd_soc_dai *dai, int tristate)
#define TWL4030_RATES (SNDRV_PCM_RATE_8000_48000)
#define TWL4030_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FORMAT_S24_LE)
-static struct snd_soc_dai_ops twl4030_dai_ops = {
+static struct snd_soc_dai_ops twl4030_dai_hifi_ops = {
.startup = twl4030_startup,
.shutdown = twl4030_shutdown,
.hw_params = twl4030_hw_params,
@@ -2193,9 +2186,9 @@ static struct snd_soc_dai_ops twl4030_dai_voice_ops = {
.set_tristate = twl4030_voice_set_tristate,
};
-struct snd_soc_dai twl4030_dai[] = {
+static struct snd_soc_dai_driver twl4030_dai[] = {
{
- .name = "twl4030",
+ .name = "twl4030-hifi",
.playback = {
.stream_name = "HiFi Playback",
.channels_min = 2,
@@ -2208,10 +2201,10 @@ struct snd_soc_dai twl4030_dai[] = {
.channels_max = 4,
.rates = TWL4030_RATES,
.formats = TWL4030_FORMATS,},
- .ops = &twl4030_dai_ops,
+ .ops = &twl4030_dai_hifi_ops,
},
{
- .name = "twl4030 Voice",
+ .name = "twl4030-voice",
.playback = {
.stream_name = "Voice Playback",
.channels_min = 1,
@@ -2227,164 +2220,92 @@ struct snd_soc_dai twl4030_dai[] = {
.ops = &twl4030_dai_voice_ops,
},
};
-EXPORT_SYMBOL_GPL(twl4030_dai);
-static int twl4030_soc_suspend(struct platform_device *pdev, pm_message_t state)
+static int twl4030_soc_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
twl4030_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
return 0;
}
-static int twl4030_soc_resume(struct platform_device *pdev)
+static int twl4030_soc_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
twl4030_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
}
-static struct snd_soc_codec *twl4030_codec;
-
-static int twl4030_soc_probe(struct platform_device *pdev)
+static int twl4030_soc_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret;
-
- BUG_ON(!twl4030_codec);
-
- codec = twl4030_codec;
- socdev->card->codec = codec;
-
- twl4030_init_chip(pdev);
+ struct twl4030_priv *twl4030;
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(&pdev->dev, "failed to create pcms\n");
- return ret;
+ twl4030 = kzalloc(sizeof(struct twl4030_priv), GFP_KERNEL);
+ if (twl4030 == NULL) {
+ printk("Can not allocate memroy\n");
+ return -ENOMEM;
}
+ snd_soc_codec_set_drvdata(codec, twl4030);
+ /* Set the defaults, and power up the codec */
+ twl4030->sysclk = twl4030_codec_get_mclk() / 1000;
+ codec->bias_level = SND_SOC_BIAS_OFF;
+ codec->idle_bias_off = 1;
+
+ twl4030_init_chip(codec);
snd_soc_add_controls(codec, twl4030_snd_controls,
ARRAY_SIZE(twl4030_snd_controls));
twl4030_add_widgets(codec);
-
return 0;
}
-static int twl4030_soc_remove(struct platform_device *pdev)
+static int twl4030_soc_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
/* Reset registers to their chip default before leaving */
twl4030_reset_registers(codec);
twl4030_set_bias_level(codec, SND_SOC_BIAS_OFF);
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_twl4030 = {
+ .probe = twl4030_soc_probe,
+ .remove = twl4030_soc_remove,
+ .suspend = twl4030_soc_suspend,
+ .resume = twl4030_soc_resume,
+ .read = twl4030_read_reg_cache,
+ .write = twl4030_write,
+ .set_bias_level = twl4030_set_bias_level,
+ .reg_cache_size = sizeof(twl4030_reg),
+ .reg_word_size = sizeof(u8),
+ .reg_cache_default = twl4030_reg,
+};
+
static int __devinit twl4030_codec_probe(struct platform_device *pdev)
{
struct twl4030_codec_audio_data *pdata = pdev->dev.platform_data;
- struct snd_soc_codec *codec;
- struct twl4030_priv *twl4030;
- int ret;
if (!pdata) {
dev_err(&pdev->dev, "platform_data is missing\n");
return -EINVAL;
}
- twl4030 = kzalloc(sizeof(struct twl4030_priv), GFP_KERNEL);
- if (twl4030 == NULL) {
- dev_err(&pdev->dev, "Can not allocate memroy\n");
- return -ENOMEM;
- }
-
- codec = &twl4030->codec;
- snd_soc_codec_set_drvdata(codec, twl4030);
- codec->dev = &pdev->dev;
- twl4030_dai[0].dev = &pdev->dev;
- twl4030_dai[1].dev = &pdev->dev;
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->name = "twl4030";
- codec->owner = THIS_MODULE;
- codec->read = twl4030_read_reg_cache;
- codec->write = twl4030_write;
- codec->set_bias_level = twl4030_set_bias_level;
- codec->idle_bias_off = 1;
- codec->dai = twl4030_dai;
- codec->num_dai = ARRAY_SIZE(twl4030_dai);
- codec->reg_cache_size = sizeof(twl4030_reg);
- codec->reg_cache = kmemdup(twl4030_reg, sizeof(twl4030_reg),
- GFP_KERNEL);
- if (codec->reg_cache == NULL) {
- ret = -ENOMEM;
- goto error_cache;
- }
-
- platform_set_drvdata(pdev, twl4030);
- twl4030_codec = codec;
-
- /* Set the defaults, and power up the codec */
- twl4030->sysclk = twl4030_codec_get_mclk() / 1000;
- codec->bias_level = SND_SOC_BIAS_OFF;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto error_codec;
- }
-
- ret = snd_soc_register_dais(&twl4030_dai[0], ARRAY_SIZE(twl4030_dai));
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAIs: %d\n", ret);
- snd_soc_unregister_codec(codec);
- goto error_codec;
- }
-
- return 0;
-
-error_codec:
- twl4030_codec_enable(codec, 0);
- kfree(codec->reg_cache);
-error_cache:
- kfree(twl4030);
- return ret;
+ return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_twl4030,
+ twl4030_dai, ARRAY_SIZE(twl4030_dai));
}
static int __devexit twl4030_codec_remove(struct platform_device *pdev)
{
- struct twl4030_priv *twl4030 = platform_get_drvdata(pdev);
+ struct twl4030_priv *twl4030 = dev_get_drvdata(&pdev->dev);
- snd_soc_unregister_dais(&twl4030_dai[0], ARRAY_SIZE(twl4030_dai));
- snd_soc_unregister_codec(&twl4030->codec);
- kfree(twl4030->codec.reg_cache);
+ snd_soc_unregister_codec(&pdev->dev);
kfree(twl4030);
-
- twl4030_codec = NULL;
return 0;
}
-MODULE_ALIAS("platform:twl4030_codec_audio");
+MODULE_ALIAS("platform:twl4030-codec");
static struct platform_driver twl4030_codec_driver = {
.probe = twl4030_codec_probe,
.remove = __devexit_p(twl4030_codec_remove),
.driver = {
- .name = "twl4030_codec_audio",
+ .name = "twl4030-codec",
.owner = THIS_MODULE,
},
};
@@ -2401,14 +2322,6 @@ static void __exit twl4030_exit(void)
}
module_exit(twl4030_exit);
-struct snd_soc_codec_device soc_codec_dev_twl4030 = {
- .probe = twl4030_soc_probe,
- .remove = twl4030_soc_remove,
- .suspend = twl4030_soc_suspend,
- .resume = twl4030_soc_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_twl4030);
-
MODULE_DESCRIPTION("ASoC TWL4030 codec driver");
MODULE_AUTHOR("Steve Sakoman");
MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/twl4030.h b/sound/soc/codecs/twl4030.h
deleted file mode 100644
index 6c57430f6e24..000000000000
--- a/sound/soc/codecs/twl4030.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * ALSA SoC TWL4030 codec driver
- *
- * Author: Steve Sakoman <steve@sakoman.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- *
- */
-
-#ifndef __TWL4030_AUDIO_H__
-#define __TWL4030_AUDIO_H__
-
-/* Register descriptions are here */
-#include <linux/mfd/twl4030-codec.h>
-
-/* Shadow register used by the audio driver */
-#define TWL4030_REG_SW_SHADOW 0x4A
-#define TWL4030_CACHEREGNUM (TWL4030_REG_SW_SHADOW + 1)
-
-/* TWL4030_REG_SW_SHADOW (0x4A) Fields */
-#define TWL4030_HFL_EN 0x01
-#define TWL4030_HFR_EN 0x02
-
-#define TWL4030_DAI_HIFI 0
-#define TWL4030_DAI_VOICE 1
-
-extern struct snd_soc_dai twl4030_dai[2];
-extern struct snd_soc_codec_device soc_codec_dev_twl4030;
-
-struct twl4030_setup_data {
- unsigned int ramp_delay_value;
- unsigned int digimic_delay; /* in ms */
- unsigned int sysclk;
- unsigned int offset_cncl_path;
- unsigned int check_defaults:1;
- unsigned int reset_registers:1;
- unsigned int hs_extmute:1;
- void (*set_hs_extmute)(int mute);
-};
-
-#endif /* End of __TWL4030_AUDIO_H__ */
-
-
diff --git a/sound/soc/codecs/twl6040.c b/sound/soc/codecs/twl6040.c
index 64a807f1a8a1..10f6e5214511 100644
--- a/sound/soc/codecs/twl6040.c
+++ b/sound/soc/codecs/twl6040.c
@@ -45,7 +45,6 @@
/* codec private data */
struct twl6040_data {
- struct snd_soc_codec codec;
int audpwron;
int naudint;
int codec_powered;
@@ -770,8 +769,7 @@ static int twl6040_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
if (!priv->sysclk) {
@@ -803,8 +801,7 @@ static int twl6040_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
u8 lppllctl;
int rate;
@@ -839,8 +836,7 @@ static int twl6040_trigger(struct snd_pcm_substream *substream,
int cmd, struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
switch (cmd) {
@@ -978,8 +974,8 @@ static struct snd_soc_dai_ops twl6040_dai_ops = {
.set_sysclk = twl6040_set_dai_sysclk,
};
-struct snd_soc_dai twl6040_dai = {
- .name = "twl6040",
+static struct snd_soc_dai_driver twl6040_dai = {
+ .name = "twl6040-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -996,24 +992,17 @@ struct snd_soc_dai twl6040_dai = {
},
.ops = &twl6040_dai_ops,
};
-EXPORT_SYMBOL_GPL(twl6040_dai);
#ifdef CONFIG_PM
-static int twl6040_suspend(struct platform_device *pdev, pm_message_t state)
+static int twl6040_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
twl6040_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int twl6040_resume(struct platform_device *pdev)
+static int twl6040_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
twl6040_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
@@ -1023,68 +1012,9 @@ static int twl6040_resume(struct platform_device *pdev)
#define twl6040_resume NULL
#endif
-static struct snd_soc_codec *twl6040_codec;
-
-static int twl6040_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- BUG_ON(!twl6040_codec);
-
- codec = twl6040_codec;
- socdev->card->codec = codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(&pdev->dev, "failed to create pcms\n");
- return ret;
- }
-
- snd_soc_add_controls(codec, twl6040_snd_controls,
- ARRAY_SIZE(twl6040_snd_controls));
- twl6040_add_widgets(codec);
-
- if (ret < 0) {
- dev_err(&pdev->dev, "failed to register card\n");
- goto card_err;
- }
-
- return ret;
-
-card_err:
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
- return ret;
-}
-
-static int twl6040_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- twl6040_set_bias_level(codec, SND_SOC_BIAS_OFF);
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
- kfree(codec);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_twl6040 = {
- .probe = twl6040_probe,
- .remove = twl6040_remove,
- .suspend = twl6040_suspend,
- .resume = twl6040_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_twl6040);
-
-static int __devinit twl6040_codec_probe(struct platform_device *pdev)
+static int twl6040_probe(struct snd_soc_codec *codec)
{
- struct twl4030_codec_data *twl_codec = pdev->dev.platform_data;
- struct snd_soc_codec *codec;
+ struct twl4030_codec_data *twl_codec = codec->dev->platform_data;
struct twl6040_data *priv;
int audpwron, naudint;
int ret = 0;
@@ -1092,6 +1022,7 @@ static int __devinit twl6040_codec_probe(struct platform_device *pdev)
priv = kzalloc(sizeof(struct twl6040_data), GFP_KERNEL);
if (priv == NULL)
return -ENOMEM;
+ snd_soc_codec_set_drvdata(codec, priv);
if (twl_codec) {
audpwron = twl_codec->audpwron_gpio;
@@ -1104,29 +1035,6 @@ static int __devinit twl6040_codec_probe(struct platform_device *pdev)
priv->audpwron = audpwron;
priv->naudint = naudint;
- codec = &priv->codec;
- codec->dev = &pdev->dev;
- twl6040_dai.dev = &pdev->dev;
-
- codec->name = "twl6040";
- codec->owner = THIS_MODULE;
- codec->read = twl6040_read_reg_cache;
- codec->write = twl6040_write;
- codec->set_bias_level = twl6040_set_bias_level;
- snd_soc_codec_set_drvdata(codec, priv);
- codec->dai = &twl6040_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = ARRAY_SIZE(twl6040_reg);
- codec->reg_cache = kmemdup(twl6040_reg, sizeof(twl6040_reg),
- GFP_KERNEL);
- if (codec->reg_cache == NULL) {
- ret = -ENOMEM;
- goto cache_err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
init_completion(&priv->ready);
if (gpio_is_valid(audpwron)) {
@@ -1169,23 +1077,12 @@ static int __devinit twl6040_codec_probe(struct platform_device *pdev)
if (ret)
goto irq_err;
- ret = snd_soc_register_codec(codec);
- if (ret)
- goto reg_err;
-
- twl6040_codec = codec;
-
- ret = snd_soc_register_dai(&twl6040_dai);
- if (ret)
- goto dai_err;
+ snd_soc_add_controls(codec, twl6040_snd_controls,
+ ARRAY_SIZE(twl6040_snd_controls));
+ twl6040_add_widgets(codec);
return 0;
-dai_err:
- snd_soc_unregister_codec(codec);
- twl6040_codec = NULL;
-reg_err:
- twl6040_set_bias_level(codec, SND_SOC_BIAS_OFF);
irq_err:
if (naudint)
free_irq(naudint, codec);
@@ -1193,36 +1090,57 @@ gpio2_err:
if (gpio_is_valid(audpwron))
gpio_free(audpwron);
gpio1_err:
- kfree(codec->reg_cache);
-cache_err:
kfree(priv);
return ret;
}
-static int __devexit twl6040_codec_remove(struct platform_device *pdev)
+static int twl6040_remove(struct snd_soc_codec *codec)
{
- struct twl6040_data *priv = snd_soc_codec_get_drvdata(twl6040_codec);
+ struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
int audpwron = priv->audpwron;
int naudint = priv->naudint;
+ twl6040_set_bias_level(codec, SND_SOC_BIAS_OFF);
+
if (gpio_is_valid(audpwron))
gpio_free(audpwron);
if (naudint)
- free_irq(naudint, twl6040_codec);
+ free_irq(naudint, codec);
- snd_soc_unregister_dai(&twl6040_dai);
- snd_soc_unregister_codec(twl6040_codec);
+ kfree(priv);
- kfree(twl6040_codec);
- twl6040_codec = NULL;
+ return 0;
+}
+static struct snd_soc_codec_driver soc_codec_dev_twl6040 = {
+ .probe = twl6040_probe,
+ .remove = twl6040_remove,
+ .suspend = twl6040_suspend,
+ .resume = twl6040_resume,
+ .read = twl6040_read_reg_cache,
+ .write = twl6040_write,
+ .set_bias_level = twl6040_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(twl6040_reg),
+ .reg_word_size = sizeof(u8),
+ .reg_cache_default = twl6040_reg,
+};
+
+static int __devinit twl6040_codec_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_twl6040, &twl6040_dai, 1);
+}
+
+static int __devexit twl6040_codec_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_codec(&pdev->dev);
return 0;
}
static struct platform_driver twl6040_codec_driver = {
.driver = {
- .name = "twl6040_codec",
+ .name = "twl6040-codec",
.owner = THIS_MODULE,
},
.probe = twl6040_codec_probe,
diff --git a/sound/soc/codecs/twl6040.h b/sound/soc/codecs/twl6040.h
index c472070a1da2..f7c77fa58a3c 100644
--- a/sound/soc/codecs/twl6040.h
+++ b/sound/soc/codecs/twl6040.h
@@ -135,7 +135,4 @@
#define TWL6040_HPPLL_ID 1
#define TWL6040_LPPLL_ID 2
-extern struct snd_soc_dai twl6040_dai;
-extern struct snd_soc_codec_device soc_codec_dev_twl6040;
-
#endif /* End of __TWL6040_H__ */
diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c
index f3b4c1d6a82d..7540a509a6f5 100644
--- a/sound/soc/codecs/uda134x.c
+++ b/sound/soc/codecs/uda134x.c
@@ -161,8 +161,7 @@ static int uda134x_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec =rtd->codec;
struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec);
struct snd_pcm_runtime *master_runtime;
@@ -194,8 +193,7 @@ static void uda134x_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec);
if (uda134x->master_substream == substream)
@@ -209,8 +207,7 @@ static int uda134x_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec);
u8 hw_params;
@@ -364,7 +361,7 @@ static int uda134x_set_bias_level(struct snd_soc_codec *codec,
pd->power(1);
/* Sync reg_cache with the hardware */
for (i = 0; i < ARRAY_SIZE(uda134x_reg); i++)
- codec->write(codec, i, *cache++);
+ codec->driver->write(codec, i, *cache++);
}
break;
case SND_SOC_BIAS_STANDBY:
@@ -465,8 +462,8 @@ static struct snd_soc_dai_ops uda134x_dai_ops = {
.set_fmt = uda134x_set_dai_fmt,
};
-struct snd_soc_dai uda134x_dai = {
- .name = "UDA134X",
+static struct snd_soc_dai_driver uda134x_dai = {
+ .name = "uda134x-hifi",
/* playback capabilities */
.playback = {
.stream_name = "Playback",
@@ -486,27 +483,21 @@ struct snd_soc_dai uda134x_dai = {
/* pcm operations */
.ops = &uda134x_dai_ops,
};
-EXPORT_SYMBOL(uda134x_dai);
-
-static int uda134x_soc_probe(struct platform_device *pdev)
+static int uda134x_soc_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
struct uda134x_priv *uda134x;
- void *codec_setup_data = socdev->codec_data;
- int ret = -ENOMEM;
- struct uda134x_platform_data *pd;
+ struct uda134x_platform_data *pd = dev_get_drvdata(codec->card->dev);
+ int ret;
printk(KERN_INFO "UDA134X SoC Audio Codec\n");
- if (!codec_setup_data) {
+ if (!pd) {
printk(KERN_ERR "UDA134X SoC codec: "
"missing L3 bitbang function\n");
return -ENODEV;
}
- pd = codec_setup_data;
switch (pd->model) {
case UDA134X_UDA1340:
case UDA134X_UDA1341:
@@ -520,58 +511,22 @@ static int uda134x_soc_probe(struct platform_device *pdev)
return -EINVAL;
}
- socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (socdev->card->codec == NULL)
- return ret;
-
- codec = socdev->card->codec;
-
uda134x = kzalloc(sizeof(struct uda134x_priv), GFP_KERNEL);
if (uda134x == NULL)
- goto priv_err;
+ return -ENOMEM;
snd_soc_codec_set_drvdata(codec, uda134x);
- codec->reg_cache = kmemdup(uda134x_reg, sizeof(uda134x_reg),
- GFP_KERNEL);
- if (codec->reg_cache == NULL)
- goto reg_err;
-
- mutex_init(&codec->mutex);
-
- codec->reg_cache_size = sizeof(uda134x_reg);
- codec->reg_cache_step = 1;
-
- codec->name = "UDA134X";
- codec->owner = THIS_MODULE;
- codec->dai = &uda134x_dai;
- codec->num_dai = 1;
- codec->read = uda134x_read_reg_cache;
- codec->write = uda134x_write;
-
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->control_data = codec_setup_data;
+ codec->control_data = pd;
if (pd->power)
pd->power(1);
uda134x_reset(codec);
- if (pd->is_powered_on_standby) {
- codec->set_bias_level = NULL;
+ if (pd->is_powered_on_standby)
uda134x_set_bias_level(codec, SND_SOC_BIAS_ON);
- } else {
- codec->set_bias_level = uda134x_set_bias_level;
+ else
uda134x_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
- }
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "UDA134X: failed to register pcms\n");
- goto pcm_err;
- }
switch (pd->model) {
case UDA134X_UDA1340:
@@ -590,61 +545,42 @@ static int uda134x_soc_probe(struct platform_device *pdev)
default:
printk(KERN_ERR "%s unknown codec type: %d",
__func__, pd->model);
- return -EINVAL;
+ kfree(uda134x);
+ return -EINVAL;
}
if (ret < 0) {
printk(KERN_ERR "UDA134X: failed to register controls\n");
- goto pcm_err;
+ kfree(uda134x);
+ return ret;
}
return 0;
-
-pcm_err:
- kfree(codec->reg_cache);
-reg_err:
- kfree(snd_soc_codec_get_drvdata(codec));
-priv_err:
- kfree(codec);
- return ret;
}
/* power down chip */
-static int uda134x_soc_remove(struct platform_device *pdev)
+static int uda134x_soc_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec);
uda134x_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
uda134x_set_bias_level(codec, SND_SOC_BIAS_OFF);
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- kfree(snd_soc_codec_get_drvdata(codec));
- kfree(codec->reg_cache);
- kfree(codec);
-
+ kfree(uda134x);
return 0;
}
#if defined(CONFIG_PM)
-static int uda134x_soc_suspend(struct platform_device *pdev,
+static int uda134x_soc_suspend(struct snd_soc_codec *codec,
pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
uda134x_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
uda134x_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int uda134x_soc_resume(struct platform_device *pdev)
+static int uda134x_soc_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
uda134x_set_bias_level(codec, SND_SOC_BIAS_PREPARE);
uda134x_set_bias_level(codec, SND_SOC_BIAS_ON);
return 0;
@@ -654,25 +590,53 @@ static int uda134x_soc_resume(struct platform_device *pdev)
#define uda134x_soc_resume NULL
#endif /* CONFIG_PM */
-struct snd_soc_codec_device soc_codec_dev_uda134x = {
+static struct snd_soc_codec_driver soc_codec_dev_uda134x = {
.probe = uda134x_soc_probe,
.remove = uda134x_soc_remove,
.suspend = uda134x_soc_suspend,
.resume = uda134x_soc_resume,
+ .reg_cache_size = sizeof(uda134x_reg),
+ .reg_word_size = sizeof(u8),
+ .reg_cache_step = 1,
+ .read = uda134x_read_reg_cache,
+ .write = uda134x_write,
+#ifdef POWER_OFF_ON_STANDBY
+ .set_bias_level = uda134x_set_bias_level,
+#endif
+};
+
+static int __devinit uda134x_codec_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_uda134x, &uda134x_dai, 1);
+}
+
+static int __devexit uda134x_codec_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_codec(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver uda134x_codec_driver = {
+ .driver = {
+ .name = "uda134x-codec",
+ .owner = THIS_MODULE,
+ },
+ .probe = uda134x_codec_probe,
+ .remove = __devexit_p(uda134x_codec_remove),
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_uda134x);
-static int __init uda134x_init(void)
+static int __init uda134x_codec_init(void)
{
- return snd_soc_register_dai(&uda134x_dai);
+ return platform_driver_register(&uda134x_codec_driver);
}
-module_init(uda134x_init);
+module_init(uda134x_codec_init);
-static void __exit uda134x_exit(void)
+static void __exit uda134x_codec_exit(void)
{
- snd_soc_unregister_dai(&uda134x_dai);
+ platform_driver_unregister(&uda134x_codec_driver);
}
-module_exit(uda134x_exit);
+module_exit(uda134x_codec_exit);
MODULE_DESCRIPTION("UDA134X ALSA soc codec driver");
MODULE_AUTHOR("Zoltan Devai, Christian Pellegrin <chripell@evolware.org>");
diff --git a/sound/soc/codecs/uda134x.h b/sound/soc/codecs/uda134x.h
index 205f03b3eaf8..9faae06972b3 100644
--- a/sound/soc/codecs/uda134x.h
+++ b/sound/soc/codecs/uda134x.h
@@ -31,7 +31,4 @@
#define STATUS0_DAIFMT_MASK (~(7<<1))
#define STATUS0_SYSCLK_MASK (~(3<<4))
-extern struct snd_soc_dai uda134x_dai;
-extern struct snd_soc_codec_device soc_codec_dev_uda134x;
-
#endif
diff --git a/sound/soc/codecs/uda1380.c b/sound/soc/codecs/uda1380.c
index 2f925a27dcde..1a51c816e542 100644
--- a/sound/soc/codecs/uda1380.c
+++ b/sound/soc/codecs/uda1380.c
@@ -33,11 +33,9 @@
#include "uda1380.h"
-static struct snd_soc_codec *uda1380_codec;
-
/* codec private data */
struct uda1380_priv {
- struct snd_soc_codec codec;
+ struct snd_soc_codec *codec;
u16 reg_cache[UDA1380_CACHEREGNUM];
unsigned int dac_clk;
struct work_struct work;
@@ -135,6 +133,8 @@ static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg,
static void uda1380_flush_work(struct work_struct *work)
{
+ struct uda1380_priv *uda1380 = container_of(work, struct uda1380_priv, work);
+ struct snd_soc_codec *uda1380_codec = uda1380->codec;
int bit, reg;
for_each_set_bit(bit, &uda1380_cache_dirty, UDA1380_CACHEREGNUM - 0x10) {
@@ -145,6 +145,7 @@ static void uda1380_flush_work(struct work_struct *work)
uda1380_read_reg_cache(uda1380_codec, reg));
clear_bit(bit, &uda1380_cache_dirty);
}
+
}
/* declarations of ALSA reg_elem_REAL controls */
@@ -474,8 +475,7 @@ static int uda1380_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec);
int mixer = uda1380_read_reg_cache(codec, UDA1380_MIXER);
@@ -501,8 +501,7 @@ static int uda1380_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
u16 clk = uda1380_read_reg_cache(codec, UDA1380_CLK);
/* set WSPLL power and divider if running from this clock */
@@ -540,8 +539,7 @@ static void uda1380_pcm_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
u16 clk = uda1380_read_reg_cache(codec, UDA1380_CLK);
/* shut down WSPLL power if running from this clock */
@@ -604,9 +602,9 @@ static struct snd_soc_dai_ops uda1380_dai_ops_capture = {
.set_fmt = uda1380_set_dai_fmt_capture,
};
-struct snd_soc_dai uda1380_dai[] = {
+static struct snd_soc_dai_driver uda1380_dai[] = {
{
- .name = "UDA1380",
+ .name = "uda1380-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -622,7 +620,7 @@ struct snd_soc_dai uda1380_dai[] = {
.ops = &uda1380_dai_ops,
},
{ /* playback only - dual interface */
- .name = "UDA1380",
+ .name = "uda1380-hifi-playback",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -633,7 +631,7 @@ struct snd_soc_dai uda1380_dai[] = {
.ops = &uda1380_dai_ops_playback,
},
{ /* capture only - dual interface*/
- .name = "UDA1380",
+ .name = "uda1380-hifi-capture",
.capture = {
.stream_name = "Capture",
.channels_min = 1,
@@ -644,21 +642,15 @@ struct snd_soc_dai uda1380_dai[] = {
.ops = &uda1380_dai_ops_capture,
},
};
-EXPORT_SYMBOL_GPL(uda1380_dai);
-static int uda1380_suspend(struct platform_device *pdev, pm_message_t state)
+static int uda1380_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
uda1380_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int uda1380_resume(struct platform_device *pdev)
+static int uda1380_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
u8 data[2];
u16 *cache = codec->reg_cache;
@@ -673,91 +665,20 @@ static int uda1380_resume(struct platform_device *pdev)
return 0;
}
-static int uda1380_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- struct uda1380_platform_data *pdata;
- int ret = 0;
-
- if (uda1380_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = uda1380_codec;
- codec = uda1380_codec;
- pdata = codec->dev->platform_data;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
- /* power on device */
- uda1380_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
- /* set clock input */
- switch (pdata->dac_clk) {
- case UDA1380_DAC_CLK_SYSCLK:
- uda1380_write(codec, UDA1380_CLK, 0);
- break;
- case UDA1380_DAC_CLK_WSPLL:
- uda1380_write(codec, UDA1380_CLK, R00_DAC_CLK);
- break;
- }
-
- snd_soc_add_controls(codec, uda1380_snd_controls,
- ARRAY_SIZE(uda1380_snd_controls));
- uda1380_add_widgets(codec);
-
- return ret;
-
-pcm_err:
- return ret;
-}
-
-/* power down chip */
-static int uda1380_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec->control_data)
- uda1380_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_uda1380 = {
- .probe = uda1380_probe,
- .remove = uda1380_remove,
- .suspend = uda1380_suspend,
- .resume = uda1380_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_uda1380);
-
-static int uda1380_register(struct uda1380_priv *uda1380)
+static int uda1380_probe(struct snd_soc_codec *codec)
{
- int ret, i;
- struct snd_soc_codec *codec = &uda1380->codec;
- struct uda1380_platform_data *pdata = codec->dev->platform_data;
+ struct uda1380_platform_data *pdata =codec->dev->platform_data;
+ struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec);
+ int ret;
- if (uda1380_codec) {
- dev_err(codec->dev, "Another UDA1380 is registered\n");
- return -EINVAL;
- }
+ codec->hw_write = (hw_write_t)i2c_master_send;
if (!pdata || !pdata->gpio_power || !pdata->gpio_reset)
return -EINVAL;
ret = gpio_request(pdata->gpio_power, "uda1380 power");
if (ret)
- goto err_out;
+ return ret;
ret = gpio_request(pdata->gpio_reset, "uda1380 reset");
if (ret)
goto err_gpio;
@@ -769,25 +690,6 @@ static int uda1380_register(struct uda1380_priv *uda1380)
udelay(5);
gpio_set_value(pdata->gpio_reset, 0);
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, uda1380);
- codec->name = "UDA1380";
- codec->owner = THIS_MODULE;
- codec->read = uda1380_read_reg_cache;
- codec->write = uda1380_write;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = uda1380_set_bias_level;
- codec->dai = uda1380_dai;
- codec->num_dai = ARRAY_SIZE(uda1380_dai);
- codec->reg_cache_size = ARRAY_SIZE(uda1380_reg);
- codec->reg_cache = &uda1380->reg_cache;
- codec->reg_cache_step = 1;
-
- memcpy(codec->reg_cache, uda1380_reg, sizeof(uda1380_reg));
-
ret = uda1380_reset(codec);
if (ret < 0) {
dev_err(codec->dev, "Failed to issue reset\n");
@@ -796,83 +698,84 @@ static int uda1380_register(struct uda1380_priv *uda1380)
INIT_WORK(&uda1380->work, uda1380_flush_work);
- for (i = 0; i < ARRAY_SIZE(uda1380_dai); i++)
- uda1380_dai[i].dev = codec->dev;
-
- uda1380_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err_reset;
+ /* power on device */
+ uda1380_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+ /* set clock input */
+ switch (pdata->dac_clk) {
+ case UDA1380_DAC_CLK_SYSCLK:
+ uda1380_write(codec, UDA1380_CLK, 0);
+ break;
+ case UDA1380_DAC_CLK_WSPLL:
+ uda1380_write(codec, UDA1380_CLK, R00_DAC_CLK);
+ break;
}
- ret = snd_soc_register_dais(uda1380_dai, ARRAY_SIZE(uda1380_dai));
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAIs: %d\n", ret);
- goto err_dai;
- }
+ snd_soc_add_controls(codec, uda1380_snd_controls,
+ ARRAY_SIZE(uda1380_snd_controls));
+ uda1380_add_widgets(codec);
return 0;
-err_dai:
- snd_soc_unregister_codec(codec);
err_reset:
gpio_set_value(pdata->gpio_power, 0);
gpio_free(pdata->gpio_reset);
err_gpio:
gpio_free(pdata->gpio_power);
-err_out:
return ret;
}
-static void uda1380_unregister(struct uda1380_priv *uda1380)
+/* power down chip */
+static int uda1380_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = &uda1380->codec;
- struct uda1380_platform_data *pdata = codec->dev->platform_data;
+ struct uda1380_platform_data *pdata =codec->dev->platform_data;
- snd_soc_unregister_dais(uda1380_dai, ARRAY_SIZE(uda1380_dai));
- snd_soc_unregister_codec(&uda1380->codec);
+ uda1380_set_bias_level(codec, SND_SOC_BIAS_OFF);
gpio_set_value(pdata->gpio_power, 0);
gpio_free(pdata->gpio_reset);
gpio_free(pdata->gpio_power);
- kfree(uda1380);
- uda1380_codec = NULL;
+ return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_uda1380 = {
+ .probe = uda1380_probe,
+ .remove = uda1380_remove,
+ .suspend = uda1380_suspend,
+ .resume = uda1380_resume,
+ .read = uda1380_read_reg_cache,
+ .write = uda1380_write,
+ .set_bias_level = uda1380_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(uda1380_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = uda1380_reg,
+ .reg_cache_step = 1,
+};
+
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static __devinit int uda1380_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct uda1380_priv *uda1380;
- struct snd_soc_codec *codec;
int ret;
uda1380 = kzalloc(sizeof(struct uda1380_priv), GFP_KERNEL);
if (uda1380 == NULL)
return -ENOMEM;
- codec = &uda1380->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
-
i2c_set_clientdata(i2c, uda1380);
- codec->control_data = i2c;
-
- codec->dev = &i2c->dev;
- ret = uda1380_register(uda1380);
- if (ret != 0)
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_uda1380, uda1380_dai, ARRAY_SIZE(uda1380_dai));
+ if (ret < 0)
kfree(uda1380);
-
return ret;
}
static int __devexit uda1380_i2c_remove(struct i2c_client *i2c)
{
- struct uda1380_priv *uda1380 = i2c_get_clientdata(i2c);
- uda1380_unregister(uda1380);
+ snd_soc_unregister_codec(&i2c->dev);
+ kfree(i2c_get_clientdata(i2c));
return 0;
}
@@ -884,7 +787,7 @@ MODULE_DEVICE_TABLE(i2c, uda1380_i2c_id);
static struct i2c_driver uda1380_i2c_driver = {
.driver = {
- .name = "UDA1380 I2C Codec",
+ .name = "uda1380-codec",
.owner = THIS_MODULE,
},
.probe = uda1380_i2c_probe,
diff --git a/sound/soc/codecs/uda1380.h b/sound/soc/codecs/uda1380.h
index 9cefa8a54770..942e3927c72b 100644
--- a/sound/soc/codecs/uda1380.h
+++ b/sound/soc/codecs/uda1380.h
@@ -76,7 +76,4 @@
#define UDA1380_DAI_PLAYBACK 1 /* playback DAI */
#define UDA1380_DAI_CAPTURE 2 /* capture DAI */
-extern struct snd_soc_dai uda1380_dai[3];
-extern struct snd_soc_codec_device soc_codec_dev_uda1380;
-
#endif /* _UDA1380_H */
diff --git a/sound/soc/codecs/wm2000.h b/sound/soc/codecs/wm2000.h
index c18e261c3c7f..0b6f056f73cc 100644
--- a/sound/soc/codecs/wm2000.h
+++ b/sound/soc/codecs/wm2000.h
@@ -16,9 +16,6 @@ struct wm2000_setup_data {
extern int wm2000_add_controls(struct snd_soc_codec *codec);
-extern struct snd_soc_dai wm2000_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm2000;
-
#define WM2000_REG_SYS_START 0x8000
#define WM2000_REG_SPEECH_CLARITY 0x8fef
#define WM2000_REG_SYS_WATCHDOG 0x8ff6
diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c
index 0221ca79b3ae..f4f1fba38eb9 100644
--- a/sound/soc/codecs/wm8350.c
+++ b/sound/soc/codecs/wm8350.c
@@ -1321,20 +1321,14 @@ static int wm8350_set_bias_level(struct snd_soc_codec *codec,
return 0;
}
-static int wm8350_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8350_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8350_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8350_resume(struct platform_device *pdev)
+static int wm8350_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8350_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
@@ -1489,24 +1483,74 @@ int wm8350_mic_jack_detect(struct snd_soc_codec *codec,
}
EXPORT_SYMBOL_GPL(wm8350_mic_jack_detect);
-static struct snd_soc_codec *wm8350_codec;
+#define WM8350_RATES (SNDRV_PCM_RATE_8000_96000)
+
+#define WM8350_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
+ SNDRV_PCM_FMTBIT_S20_3LE |\
+ SNDRV_PCM_FMTBIT_S24_LE)
+
+static struct snd_soc_dai_ops wm8350_dai_ops = {
+ .hw_params = wm8350_pcm_hw_params,
+ .digital_mute = wm8350_mute,
+ .trigger = wm8350_pcm_trigger,
+ .set_fmt = wm8350_set_dai_fmt,
+ .set_sysclk = wm8350_set_dai_sysclk,
+ .set_pll = wm8350_set_fll,
+ .set_clkdiv = wm8350_set_clkdiv,
+};
+
+static struct snd_soc_dai_driver wm8350_dai = {
+ .name = "wm8350-hifi",
+ .playback = {
+ .stream_name = "Playback",
+ .channels_min = 1,
+ .channels_max = 2,
+ .rates = WM8350_RATES,
+ .formats = WM8350_FORMATS,
+ },
+ .capture = {
+ .stream_name = "Capture",
+ .channels_min = 1,
+ .channels_max = 2,
+ .rates = WM8350_RATES,
+ .formats = WM8350_FORMATS,
+ },
+ .ops = &wm8350_dai_ops,
+};
-static int wm8350_probe(struct platform_device *pdev)
+static int wm8350_codec_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- struct wm8350 *wm8350;
+ struct wm8350 *wm8350 = dev_get_platdata(codec->dev);
struct wm8350_data *priv;
- int ret;
struct wm8350_output *out1;
struct wm8350_output *out2;
+ int ret, i;
- BUG_ON(!wm8350_codec);
+ if (wm8350->codec.platform_data == NULL) {
+ dev_err(codec->dev, "No audio platform data supplied\n");
+ return -EINVAL;
+ }
+
+ priv = kzalloc(sizeof(struct wm8350_data), GFP_KERNEL);
+ if (priv == NULL)
+ return -ENOMEM;
+ snd_soc_codec_set_drvdata(codec, priv);
+
+ for (i = 0; i < ARRAY_SIZE(supply_names); i++)
+ priv->supplies[i].supply = supply_names[i];
+
+ ret = regulator_bulk_get(wm8350->dev, ARRAY_SIZE(priv->supplies),
+ priv->supplies);
+ if (ret != 0)
+ goto err_priv;
+
+ wm8350->codec.codec = codec;
+ codec->control_data = wm8350;
- socdev->card->codec = wm8350_codec;
- codec = socdev->card->codec;
- wm8350 = codec->control_data;
- priv = snd_soc_codec_get_drvdata(codec);
+ /* Put the codec into reset if it wasn't already */
+ wm8350_clear_bits(wm8350, WM8350_POWER_MGMT_5, WM8350_CODEC_ENA);
+
+ INIT_DELAYED_WORK(&codec->delayed_work, wm8350_pga_work);
/* Enable the codec */
wm8350_set_bits(wm8350, WM8350_POWER_MGMT_5, WM8350_CODEC_ENA);
@@ -1557,11 +1601,6 @@ static int wm8350_probe(struct platform_device *pdev)
wm8350_register_irq(wm8350, WM8350_IRQ_CODEC_MICD,
wm8350_mic_handler, 0, "Microphone detect", priv);
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(&pdev->dev, "failed to create pcms\n");
- return ret;
- }
snd_soc_add_controls(codec, wm8350_snd_controls,
ARRAY_SIZE(wm8350_snd_controls));
@@ -1570,14 +1609,16 @@ static int wm8350_probe(struct platform_device *pdev)
wm8350_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
+
+err_priv:
+ kfree(priv);
+ return ret;
}
-static int wm8350_remove(struct platform_device *pdev)
+static int wm8350_codec_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
- struct wm8350 *wm8350 = codec->control_data;
struct wm8350_data *priv = snd_soc_codec_get_drvdata(codec);
+ struct wm8350 *wm8350 = dev_get_platdata(codec->dev);
int ret;
wm8350_clear_bits(wm8350, WM8350_JACK_DETECT,
@@ -1607,134 +1648,30 @@ static int wm8350_remove(struct platform_device *pdev)
wm8350_clear_bits(wm8350, WM8350_POWER_MGMT_5, WM8350_CODEC_ENA);
+ regulator_bulk_free(ARRAY_SIZE(priv->supplies), priv->supplies);
+ kfree(priv);
return 0;
}
-#define WM8350_RATES (SNDRV_PCM_RATE_8000_96000)
-
-#define WM8350_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
- SNDRV_PCM_FMTBIT_S20_3LE |\
- SNDRV_PCM_FMTBIT_S24_LE)
-
-static struct snd_soc_dai_ops wm8350_dai_ops = {
- .hw_params = wm8350_pcm_hw_params,
- .digital_mute = wm8350_mute,
- .trigger = wm8350_pcm_trigger,
- .set_fmt = wm8350_set_dai_fmt,
- .set_sysclk = wm8350_set_dai_sysclk,
- .set_pll = wm8350_set_fll,
- .set_clkdiv = wm8350_set_clkdiv,
-};
-
-struct snd_soc_dai wm8350_dai = {
- .name = "WM8350",
- .playback = {
- .stream_name = "Playback",
- .channels_min = 1,
- .channels_max = 2,
- .rates = WM8350_RATES,
- .formats = WM8350_FORMATS,
- },
- .capture = {
- .stream_name = "Capture",
- .channels_min = 1,
- .channels_max = 2,
- .rates = WM8350_RATES,
- .formats = WM8350_FORMATS,
- },
- .ops = &wm8350_dai_ops,
-};
-EXPORT_SYMBOL_GPL(wm8350_dai);
-
-struct snd_soc_codec_device soc_codec_dev_wm8350 = {
- .probe = wm8350_probe,
- .remove = wm8350_remove,
+static struct snd_soc_codec_driver soc_codec_dev_wm8350 = {
+ .probe = wm8350_codec_probe,
+ .remove = wm8350_codec_remove,
.suspend = wm8350_suspend,
.resume = wm8350_resume,
+ .read = wm8350_codec_read,
+ .write = wm8350_codec_write,
+ .set_bias_level = wm8350_set_bias_level,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8350);
-static __devinit int wm8350_codec_probe(struct platform_device *pdev)
+static int __devinit wm8350_probe(struct platform_device *pdev)
{
- struct wm8350 *wm8350 = platform_get_drvdata(pdev);
- struct wm8350_data *priv;
- struct snd_soc_codec *codec;
- int ret, i;
-
- if (wm8350->codec.platform_data == NULL) {
- dev_err(&pdev->dev, "No audio platform data supplied\n");
- return -EINVAL;
- }
-
- priv = kzalloc(sizeof(struct wm8350_data), GFP_KERNEL);
- if (priv == NULL)
- return -ENOMEM;
-
- for (i = 0; i < ARRAY_SIZE(supply_names); i++)
- priv->supplies[i].supply = supply_names[i];
-
- ret = regulator_bulk_get(wm8350->dev, ARRAY_SIZE(priv->supplies),
- priv->supplies);
- if (ret != 0)
- goto err_priv;
-
- codec = &priv->codec;
- wm8350->codec.codec = codec;
-
- wm8350_dai.dev = &pdev->dev;
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
- codec->dev = &pdev->dev;
- codec->name = "WM8350";
- codec->owner = THIS_MODULE;
- codec->read = wm8350_codec_read;
- codec->write = wm8350_codec_write;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8350_set_bias_level;
- codec->dai = &wm8350_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = WM8350_MAX_REGISTER;
- snd_soc_codec_set_drvdata(codec, priv);
- codec->control_data = wm8350;
-
- /* Put the codec into reset if it wasn't already */
- wm8350_clear_bits(wm8350, WM8350_POWER_MGMT_5, WM8350_CODEC_ENA);
-
- INIT_DELAYED_WORK(&codec->delayed_work, wm8350_pga_work);
- ret = snd_soc_register_codec(codec);
- if (ret != 0)
- goto err_supply;
-
- wm8350_codec = codec;
-
- ret = snd_soc_register_dai(&wm8350_dai);
- if (ret != 0)
- goto err_codec;
- return 0;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err_supply:
- regulator_bulk_free(ARRAY_SIZE(priv->supplies), priv->supplies);
-err_priv:
- kfree(priv);
- wm8350_codec = NULL;
- return ret;
+ return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8350,
+ &wm8350_dai, 1);
}
-static int __devexit wm8350_codec_remove(struct platform_device *pdev)
+static int __devexit wm8350_remove(struct platform_device *pdev)
{
- struct wm8350 *wm8350 = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = wm8350->codec.codec;
- struct wm8350_data *priv = snd_soc_codec_get_drvdata(codec);
-
- snd_soc_unregister_dai(&wm8350_dai);
- snd_soc_unregister_codec(codec);
- regulator_bulk_free(ARRAY_SIZE(priv->supplies), priv->supplies);
- kfree(priv);
- wm8350_codec = NULL;
+ snd_soc_unregister_codec(&pdev->dev);
return 0;
}
@@ -1743,8 +1680,8 @@ static struct platform_driver wm8350_codec_driver = {
.name = "wm8350-codec",
.owner = THIS_MODULE,
},
- .probe = wm8350_codec_probe,
- .remove = __devexit_p(wm8350_codec_remove),
+ .probe = wm8350_probe,
+ .remove = __devexit_p(wm8350_remove),
};
static __init int wm8350_init(void)
diff --git a/sound/soc/codecs/wm8350.h b/sound/soc/codecs/wm8350.h
index 9ed0467c71db..74108eb82938 100644
--- a/sound/soc/codecs/wm8350.h
+++ b/sound/soc/codecs/wm8350.h
@@ -15,9 +15,6 @@
#include <sound/soc.h>
#include <linux/mfd/wm8350/audio.h>
-extern struct snd_soc_dai wm8350_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8350;
-
enum wm8350_jack {
WM8350_JDL = 1,
WM8350_JDR = 2,
diff --git a/sound/soc/codecs/wm8400.c b/sound/soc/codecs/wm8400.c
index 8f294066b0ed..850299786e02 100644
--- a/sound/soc/codecs/wm8400.c
+++ b/sound/soc/codecs/wm8400.c
@@ -65,7 +65,7 @@ static struct regulator_bulk_data power[] = {
/* codec private data */
struct wm8400_priv {
- struct snd_soc_codec codec;
+ struct snd_soc_codec *codec;
struct wm8400 *wm8400;
u16 fake_register;
unsigned int sysclk;
@@ -1163,8 +1163,7 @@ static int wm8400_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
u16 audio1 = wm8400_read(codec, WM8400_AUDIO_INTERFACE_1);
audio1 &= ~WM8400_AIF_WL_MASK;
@@ -1332,10 +1331,9 @@ static struct snd_soc_dai_ops wm8400_dai_ops = {
* 1. ADC/DAC on Primary Interface
* 2. ADC on Primary Interface/DAC on secondary
*/
-struct snd_soc_dai wm8400_dai = {
+static struct snd_soc_dai_driver wm8400_dai = {
/* ADC/DAC on primary */
- .name = "WM8400 ADC/DAC Primary",
- .id = 1,
+ .name = "wm8400-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -1352,147 +1350,53 @@ struct snd_soc_dai wm8400_dai = {
},
.ops = &wm8400_dai_ops,
};
-EXPORT_SYMBOL_GPL(wm8400_dai);
-static int wm8400_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8400_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8400_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8400_resume(struct platform_device *pdev)
+static int wm8400_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8400_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
}
-static struct snd_soc_codec *wm8400_codec;
-
-static int wm8400_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret;
-
- if (!wm8400_codec) {
- dev_err(&pdev->dev, "wm8400 not yet discovered\n");
- return -ENODEV;
- }
- codec = wm8400_codec;
-
- socdev->card->codec = codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(&pdev->dev, "failed to create pcms\n");
- goto pcm_err;
- }
-
- wm8400_add_controls(codec);
- wm8400_add_widgets(codec);
-
-pcm_err:
- return ret;
-}
-
-/* power down chip */
-static int wm8400_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8400 = {
- .probe = wm8400_probe,
- .remove = wm8400_remove,
- .suspend = wm8400_suspend,
- .resume = wm8400_resume,
-};
-
static void wm8400_probe_deferred(struct work_struct *work)
{
struct wm8400_priv *priv = container_of(work, struct wm8400_priv,
work);
- struct snd_soc_codec *codec = &priv->codec;
- int ret;
+ struct snd_soc_codec *codec = priv->codec;
/* charge output caps */
wm8400_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
- /* We're done, tell the subsystem. */
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(priv->wm8400->dev,
- "Failed to register codec: %d\n", ret);
- goto err;
- }
-
- ret = snd_soc_register_dai(&wm8400_dai);
- if (ret != 0) {
- dev_err(priv->wm8400->dev,
- "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
-
- return;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- wm8400_set_bias_level(codec, SND_SOC_BIAS_OFF);
}
-static int wm8400_codec_probe(struct platform_device *dev)
+static int wm8400_codec_probe(struct snd_soc_codec *codec)
{
+ struct wm8400 *wm8400 = dev_get_platdata(codec->dev);
struct wm8400_priv *priv;
int ret;
u16 reg;
- struct snd_soc_codec *codec;
priv = kzalloc(sizeof(struct wm8400_priv), GFP_KERNEL);
if (priv == NULL)
return -ENOMEM;
- codec = &priv->codec;
snd_soc_codec_set_drvdata(codec, priv);
- codec->control_data = dev_get_drvdata(&dev->dev);
- priv->wm8400 = dev_get_drvdata(&dev->dev);
+ codec->control_data = priv->wm8400 = wm8400;
+ priv->codec = codec;
- ret = regulator_bulk_get(priv->wm8400->dev,
+ ret = regulator_bulk_get(wm8400->dev,
ARRAY_SIZE(power), &power[0]);
if (ret != 0) {
- dev_err(&dev->dev, "Failed to get regulators: %d\n", ret);
+ dev_err(codec->dev, "Failed to get regulators: %d\n", ret);
goto err;
}
- codec->dev = &dev->dev;
- wm8400_dai.dev = &dev->dev;
-
- codec->name = "WM8400";
- codec->owner = THIS_MODULE;
- codec->read = wm8400_read;
- codec->write = wm8400_write;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8400_set_bias_level;
- codec->dai = &wm8400_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = WM8400_REGISTER_COUNT;
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
INIT_WORK(&priv->work, wm8400_probe_deferred);
wm8400_codec_reset(codec);
@@ -1511,65 +1415,78 @@ static int wm8400_codec_probe(struct platform_device *dev)
wm8400_write(codec, WM8400_LEFT_OUTPUT_VOLUME, 0x50 | (1<<8));
wm8400_write(codec, WM8400_RIGHT_OUTPUT_VOLUME, 0x50 | (1<<8));
- wm8400_codec = codec;
-
if (!schedule_work(&priv->work)) {
ret = -EINVAL;
goto err_regulator;
}
-
+ wm8400_add_controls(codec);
+ wm8400_add_widgets(codec);
return 0;
err_regulator:
- wm8400_codec = NULL;
regulator_bulk_free(ARRAY_SIZE(power), power);
err:
kfree(priv);
return ret;
}
-static int __exit wm8400_codec_remove(struct platform_device *dev)
+static int wm8400_codec_remove(struct snd_soc_codec *codec)
{
- struct wm8400_priv *priv = snd_soc_codec_get_drvdata(wm8400_codec);
+ struct wm8400_priv *priv = snd_soc_codec_get_drvdata(codec);
u16 reg;
- snd_soc_unregister_dai(&wm8400_dai);
- snd_soc_unregister_codec(wm8400_codec);
-
- reg = wm8400_read(wm8400_codec, WM8400_POWER_MANAGEMENT_1);
- wm8400_write(wm8400_codec, WM8400_POWER_MANAGEMENT_1,
+ reg = wm8400_read(codec, WM8400_POWER_MANAGEMENT_1);
+ wm8400_write(codec, WM8400_POWER_MANAGEMENT_1,
reg & (~WM8400_CODEC_ENA));
regulator_bulk_free(ARRAY_SIZE(power), power);
kfree(priv);
- wm8400_codec = NULL;
+ return 0;
+}
+
+static struct snd_soc_codec_driver soc_codec_dev_wm8400 = {
+ .probe = wm8400_codec_probe,
+ .remove = wm8400_codec_remove,
+ .suspend = wm8400_suspend,
+ .resume = wm8400_resume,
+ .read = wm8400_read,
+ .write = wm8400_write,
+ .set_bias_level = wm8400_set_bias_level,
+};
+
+static int __devinit wm8400_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8400,
+ &wm8400_dai, 1);
+}
+static int __devexit wm8400_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_codec(&pdev->dev);
return 0;
}
static struct platform_driver wm8400_codec_driver = {
.driver = {
- .name = "wm8400-codec",
- .owner = THIS_MODULE,
- },
- .probe = wm8400_codec_probe,
- .remove = __exit_p(wm8400_codec_remove),
+ .name = "wm8400-codec",
+ .owner = THIS_MODULE,
+ },
+ .probe = wm8400_probe,
+ .remove = __devexit_p(wm8400_remove),
};
-static int __init wm8400_codec_init(void)
+static __init int wm8400_init(void)
{
return platform_driver_register(&wm8400_codec_driver);
}
-module_init(wm8400_codec_init);
+module_init(wm8400_init);
-static void __exit wm8400_codec_exit(void)
+static __exit void wm8400_exit(void)
{
platform_driver_unregister(&wm8400_codec_driver);
}
-module_exit(wm8400_codec_exit);
-
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8400);
+module_exit(wm8400_exit);
MODULE_DESCRIPTION("ASoC WM8400 driver");
MODULE_AUTHOR("Mark Brown");
diff --git a/sound/soc/codecs/wm8400.h b/sound/soc/codecs/wm8400.h
index 79c5934d4776..521adb193870 100644
--- a/sound/soc/codecs/wm8400.h
+++ b/sound/soc/codecs/wm8400.h
@@ -56,7 +56,4 @@
#define WM8400_BCLK_DIV_44 (0xE << 1)
#define WM8400_BCLK_DIV_48 (0xF << 1)
-extern struct snd_soc_dai wm8400_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8400;
-
#endif
diff --git a/sound/soc/codecs/wm8510.c b/sound/soc/codecs/wm8510.c
index 0f7bcb61071a..d00da2001a12 100644
--- a/sound/soc/codecs/wm8510.c
+++ b/sound/soc/codecs/wm8510.c
@@ -29,10 +29,6 @@
#include "wm8510.h"
-#define WM8510_VERSION "0.6"
-
-struct snd_soc_codec_device soc_codec_dev_wm8510;
-
/*
* wm8510 register cache
* We can't read the WM8510 register space when we are
@@ -61,6 +57,11 @@ static const u16 wm8510_reg[WM8510_CACHEREGNUM] = {
#define wm8510_reset(c) snd_soc_write(c, WM8510_RESET, 0)
+/* codec private data */
+struct wm8510_priv {
+ enum snd_soc_control_type control_type;
+};
+
static const char *wm8510_companding[] = { "Off", "NC", "u-law", "A-law" };
static const char *wm8510_deemp[] = { "None", "32kHz", "44.1kHz", "48kHz" };
static const char *wm8510_alc[] = { "ALC", "Limiter" };
@@ -403,8 +404,7 @@ static int wm8510_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
u16 iface = snd_soc_read(codec, WM8510_IFACE) & 0x19f;
u16 adn = snd_soc_read(codec, WM8510_ADD) & 0x1f1;
@@ -514,8 +514,8 @@ static struct snd_soc_dai_ops wm8510_dai_ops = {
.set_pll = wm8510_set_dai_pll,
};
-struct snd_soc_dai wm8510_dai = {
- .name = "WM8510 HiFi",
+static struct snd_soc_dai_driver wm8510_dai = {
+ .name = "wm8510-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -531,21 +531,15 @@ struct snd_soc_dai wm8510_dai = {
.ops = &wm8510_dai_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(wm8510_dai);
-static int wm8510_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8510_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8510_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8510_resume(struct platform_device *pdev)
+static int wm8510_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
u8 data[2];
u16 *cache = codec->reg_cache;
@@ -561,43 +555,19 @@ static int wm8510_resume(struct platform_device *pdev)
return 0;
}
-/*
- * initialise the WM8510 driver
- * register the mixer and dsp interfaces with the kernel
- */
-static int wm8510_init(struct snd_soc_device *socdev,
- enum snd_soc_control_type control)
+static int wm8510_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = socdev->card->codec;
- int ret = 0;
-
- codec->name = "WM8510";
- codec->owner = THIS_MODULE;
- codec->set_bias_level = wm8510_set_bias_level;
- codec->dai = &wm8510_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = ARRAY_SIZE(wm8510_reg);
- codec->reg_cache = kmemdup(wm8510_reg, sizeof(wm8510_reg), GFP_KERNEL);
-
- if (codec->reg_cache == NULL)
- return -ENOMEM;
+ struct wm8510_priv *wm8510 = snd_soc_codec_get_drvdata(codec);
+ int ret;
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8510->control_type);
if (ret < 0) {
- printk(KERN_ERR "wm8510: failed to set cache I/O: %d\n",
- ret);
- goto err;
+ printk(KERN_ERR "wm8510: failed to set cache I/O: %d\n", ret);
+ return ret;
}
wm8510_reset(codec);
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "wm8510: failed to create pcms\n");
- goto err;
- }
-
/* power on device */
codec->bias_level = SND_SOC_BIAS_OFF;
wm8510_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
@@ -606,119 +576,52 @@ static int wm8510_init(struct snd_soc_device *socdev,
wm8510_add_widgets(codec);
return ret;
-
-err:
- kfree(codec->reg_cache);
- return ret;
}
-static struct snd_soc_device *wm8510_socdev;
-
-#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
-
-/*
- * WM8510 2 wire address is 0x1a
- */
-
-static int wm8510_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+/* power down chip */
+static int wm8510_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = wm8510_socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
- int ret;
-
- i2c_set_clientdata(i2c, codec);
- codec->control_data = i2c;
+ struct wm8510_priv *wm8510 = snd_soc_codec_get_drvdata(codec);
- ret = wm8510_init(socdev, SND_SOC_I2C);
- if (ret < 0)
- pr_err("failed to initialise WM8510\n");
-
- return ret;
-}
-
-static int wm8510_i2c_remove(struct i2c_client *client)
-{
- struct snd_soc_codec *codec = i2c_get_clientdata(client);
- kfree(codec->reg_cache);
+ wm8510_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ kfree(wm8510);
return 0;
}
-static const struct i2c_device_id wm8510_i2c_id[] = {
- { "wm8510", 0 },
- { }
-};
-MODULE_DEVICE_TABLE(i2c, wm8510_i2c_id);
-
-static struct i2c_driver wm8510_i2c_driver = {
- .driver = {
- .name = "WM8510 I2C Codec",
- .owner = THIS_MODULE,
- },
- .probe = wm8510_i2c_probe,
- .remove = wm8510_i2c_remove,
- .id_table = wm8510_i2c_id,
+static struct snd_soc_codec_driver soc_codec_dev_wm8510 = {
+ .probe = wm8510_probe,
+ .remove = wm8510_remove,
+ .suspend = wm8510_suspend,
+ .resume = wm8510_resume,
+ .set_bias_level = wm8510_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(wm8510_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default =wm8510_reg,
};
-static int wm8510_add_i2c_device(struct platform_device *pdev,
- const struct wm8510_setup_data *setup)
-{
- struct i2c_board_info info;
- struct i2c_adapter *adapter;
- struct i2c_client *client;
- int ret;
-
- ret = i2c_add_driver(&wm8510_i2c_driver);
- if (ret != 0) {
- dev_err(&pdev->dev, "can't add i2c driver\n");
- return ret;
- }
-
- memset(&info, 0, sizeof(struct i2c_board_info));
- info.addr = setup->i2c_address;
- strlcpy(info.type, "wm8510", I2C_NAME_SIZE);
-
- adapter = i2c_get_adapter(setup->i2c_bus);
- if (!adapter) {
- dev_err(&pdev->dev, "can't get i2c adapter %d\n",
- setup->i2c_bus);
- goto err_driver;
- }
-
- client = i2c_new_device(adapter, &info);
- i2c_put_adapter(adapter);
- if (!client) {
- dev_err(&pdev->dev, "can't add i2c device at 0x%x\n",
- (unsigned int)info.addr);
- goto err_driver;
- }
-
- return 0;
-
-err_driver:
- i2c_del_driver(&wm8510_i2c_driver);
- return -ENODEV;
-}
-#endif
-
#if defined(CONFIG_SPI_MASTER)
static int __devinit wm8510_spi_probe(struct spi_device *spi)
{
- struct snd_soc_device *socdev = wm8510_socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct wm8510_priv *wm8510;
int ret;
- codec->control_data = spi;
+ wm8510 = kzalloc(sizeof(struct wm8510_priv), GFP_KERNEL);
+ if (wm8510 == NULL)
+ return -ENOMEM;
- ret = wm8510_init(socdev, SND_SOC_SPI);
- if (ret < 0)
- dev_err(&spi->dev, "failed to initialise WM8510\n");
+ wm8510->control_type = SND_SOC_SPI;
+ spi_set_drvdata(spi, wm8510);
+ ret = snd_soc_register_codec(&spi->dev,
+ &soc_codec_dev_wm8510, &wm8510_dai, 1);
+ if (ret < 0)
+ kfree(wm8510);
return ret;
}
static int __devexit wm8510_spi_remove(struct spi_device *spi)
{
+ snd_soc_unregister_codec(&spi->dev);
return 0;
}
@@ -733,84 +636,79 @@ static struct spi_driver wm8510_spi_driver = {
};
#endif /* CONFIG_SPI_MASTER */
-static int wm8510_probe(struct platform_device *pdev)
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static __devinit int wm8510_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct wm8510_setup_data *setup;
- struct snd_soc_codec *codec;
- int ret = 0;
-
- pr_info("WM8510 Audio Codec %s", WM8510_VERSION);
+ struct wm8510_priv *wm8510;
+ int ret;
- setup = socdev->codec_data;
- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (codec == NULL)
+ wm8510 = kzalloc(sizeof(struct wm8510_priv), GFP_KERNEL);
+ if (wm8510 == NULL)
return -ENOMEM;
- socdev->card->codec = codec;
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
+ i2c_set_clientdata(i2c, wm8510);
+ wm8510->control_type = SND_SOC_I2C;
- wm8510_socdev = socdev;
-#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
- if (setup->i2c_address) {
- ret = wm8510_add_i2c_device(pdev, setup);
- }
-#endif
-#if defined(CONFIG_SPI_MASTER)
- if (setup->spi) {
- ret = spi_register_driver(&wm8510_spi_driver);
- if (ret != 0)
- printk(KERN_ERR "can't add spi driver");
- }
-#endif
-
- if (ret != 0)
- kfree(codec);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8510, &wm8510_dai, 1);
+ if (ret < 0)
+ kfree(wm8510);
return ret;
}
-/* power down chip */
-static int wm8510_remove(struct platform_device *pdev)
+static __devexit int wm8510_i2c_remove(struct i2c_client *client)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec->control_data)
- wm8510_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
- i2c_unregister_device(codec->control_data);
- i2c_del_driver(&wm8510_i2c_driver);
-#endif
-#if defined(CONFIG_SPI_MASTER)
- spi_unregister_driver(&wm8510_spi_driver);
-#endif
- kfree(codec);
-
+ snd_soc_unregister_codec(&client->dev);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_wm8510 = {
- .probe = wm8510_probe,
- .remove = wm8510_remove,
- .suspend = wm8510_suspend,
- .resume = wm8510_resume,
+static const struct i2c_device_id wm8510_i2c_id[] = {
+ { "wm8510", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, wm8510_i2c_id);
+
+static struct i2c_driver wm8510_i2c_driver = {
+ .driver = {
+ .name = "wm8510-codec",
+ .owner = THIS_MODULE,
+ },
+ .probe = wm8510_i2c_probe,
+ .remove = __devexit_p(wm8510_i2c_remove),
+ .id_table = wm8510_i2c_id,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8510);
+#endif
static int __init wm8510_modinit(void)
{
- return snd_soc_register_dai(&wm8510_dai);
+ int ret = 0;
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+ ret = i2c_add_driver(&wm8510_i2c_driver);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register WM8510 I2C driver: %d\n",
+ ret);
+ }
+#endif
+#if defined(CONFIG_SPI_MASTER)
+ ret = spi_register_driver(&wm8510_spi_driver);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register WM8510 SPI driver: %d\n",
+ ret);
+ }
+#endif
+ return ret;
}
module_init(wm8510_modinit);
static void __exit wm8510_exit(void)
{
- snd_soc_unregister_dai(&wm8510_dai);
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+ i2c_del_driver(&wm8510_i2c_driver);
+#endif
+#if defined(CONFIG_SPI_MASTER)
+ spi_unregister_driver(&wm8510_spi_driver);
+#endif
}
module_exit(wm8510_exit);
diff --git a/sound/soc/codecs/wm8510.h b/sound/soc/codecs/wm8510.h
index bdefcf5c69ff..b3e26ed9f2d0 100644
--- a/sound/soc/codecs/wm8510.h
+++ b/sound/soc/codecs/wm8510.h
@@ -99,7 +99,4 @@ struct wm8510_setup_data {
unsigned short i2c_address;
};
-extern struct snd_soc_dai wm8510_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8510;
-
#endif
diff --git a/sound/soc/codecs/wm8523.c b/sound/soc/codecs/wm8523.c
index 0ad039b4adf5..712ef7c76f90 100644
--- a/sound/soc/codecs/wm8523.c
+++ b/sound/soc/codecs/wm8523.c
@@ -30,9 +30,6 @@
#include "wm8523.h"
-static struct snd_soc_codec *wm8523_codec;
-struct snd_soc_codec_device soc_codec_dev_wm8523;
-
#define WM8523_NUM_SUPPLIES 2
static const char *wm8523_supply_names[WM8523_NUM_SUPPLIES] = {
"AVDD",
@@ -43,7 +40,7 @@ static const char *wm8523_supply_names[WM8523_NUM_SUPPLIES] = {
/* codec private data */
struct wm8523_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
u16 reg_cache[WM8523_REGISTER_COUNT];
struct regulator_bulk_data supplies[WM8523_NUM_SUPPLIES];
unsigned int sysclk;
@@ -162,8 +159,7 @@ static int wm8523_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec);
int i;
u16 aifctrl1 = snd_soc_read(codec, WM8523_AIF_CTRL1);
@@ -387,8 +383,8 @@ static struct snd_soc_dai_ops wm8523_dai_ops = {
.set_fmt = wm8523_set_dai_fmt,
};
-struct snd_soc_dai wm8523_dai = {
- .name = "WM8523",
+static struct snd_soc_dai_driver wm8523_dai = {
+ .name = "wm8523-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2, /* Mono modes not yet supported */
@@ -398,25 +394,17 @@ struct snd_soc_dai wm8523_dai = {
},
.ops = &wm8523_dai_ops,
};
-EXPORT_SYMBOL_GPL(wm8523_dai);
#ifdef CONFIG_PM
-static int wm8523_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8523_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8523_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8523_resume(struct platform_device *pdev)
+static int wm8523_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8523_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
return 0;
}
#else
@@ -424,93 +412,20 @@ static int wm8523_resume(struct platform_device *pdev)
#define wm8523_resume NULL
#endif
-static int wm8523_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (wm8523_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = wm8523_codec;
- codec = wm8523_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
- snd_soc_add_controls(codec, wm8523_snd_controls,
- ARRAY_SIZE(wm8523_snd_controls));
- wm8523_add_widgets(codec);
-
- return ret;
-
-pcm_err:
- return ret;
-}
-
-static int wm8523_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8523 = {
- .probe = wm8523_probe,
- .remove = wm8523_remove,
- .suspend = wm8523_suspend,
- .resume = wm8523_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8523);
-
-static int wm8523_register(struct wm8523_priv *wm8523,
- enum snd_soc_control_type control)
+static int wm8523_probe(struct snd_soc_codec *codec)
{
- int ret;
- struct snd_soc_codec *codec = &wm8523->codec;
- int i;
-
- if (wm8523_codec) {
- dev_err(codec->dev, "Another WM8523 is registered\n");
- ret = -EINVAL;
- goto err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8523);
- codec->name = "WM8523";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8523_set_bias_level;
- codec->dai = &wm8523_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = WM8523_REGISTER_COUNT;
- codec->reg_cache = &wm8523->reg_cache;
- codec->volatile_register = wm8523_volatile_register;
+ struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec);
+ int ret, i;
+ codec->hw_write = (hw_write_t)i2c_master_send;
wm8523->rate_constraint.list = &wm8523->rate_constraint_list[0];
wm8523->rate_constraint.count =
ARRAY_SIZE(wm8523->rate_constraint_list);
- memcpy(codec->reg_cache, wm8523_reg, sizeof(wm8523_reg));
-
- ret = snd_soc_codec_set_cache_io(codec, 8, 16, control);
+ ret = snd_soc_codec_set_cache_io(codec, 8, 16, wm8523->control_type);
if (ret != 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
+ return ret;
}
for (i = 0; i < ARRAY_SIZE(wm8523->supplies); i++)
@@ -520,7 +435,7 @@ static int wm8523_register(struct wm8523_priv *wm8523,
wm8523->supplies);
if (ret != 0) {
dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
- goto err;
+ return ret;
}
ret = regulator_bulk_enable(ARRAY_SIZE(wm8523->supplies),
@@ -555,8 +470,6 @@ static int wm8523_register(struct wm8523_priv *wm8523,
goto err_enable;
}
- wm8523_dai.dev = codec->dev;
-
/* Change some default settings - latch VU and enable ZC */
wm8523->reg_cache[WM8523_DAC_GAINR] |= WM8523_DACR_VU;
wm8523->reg_cache[WM8523_DAC_CTRL3] |= WM8523_ZC;
@@ -566,69 +479,67 @@ static int wm8523_register(struct wm8523_priv *wm8523,
/* Bias level configuration will have done an extra enable */
regulator_bulk_disable(ARRAY_SIZE(wm8523->supplies), wm8523->supplies);
- wm8523_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err_enable;
- }
-
- ret = snd_soc_register_dai(&wm8523_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
+ snd_soc_add_controls(codec, wm8523_snd_controls,
+ ARRAY_SIZE(wm8523_snd_controls));
+ wm8523_add_widgets(codec);
return 0;
-err_codec:
- snd_soc_unregister_codec(codec);
err_enable:
regulator_bulk_disable(ARRAY_SIZE(wm8523->supplies), wm8523->supplies);
err_get:
regulator_bulk_free(ARRAY_SIZE(wm8523->supplies), wm8523->supplies);
-err:
- kfree(wm8523);
+
return ret;
}
-static void wm8523_unregister(struct wm8523_priv *wm8523)
+static int wm8523_remove(struct snd_soc_codec *codec)
{
- wm8523_set_bias_level(&wm8523->codec, SND_SOC_BIAS_OFF);
+ struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec);
+
+ wm8523_set_bias_level(codec, SND_SOC_BIAS_OFF);
regulator_bulk_free(ARRAY_SIZE(wm8523->supplies), wm8523->supplies);
- snd_soc_unregister_dai(&wm8523_dai);
- snd_soc_unregister_codec(&wm8523->codec);
- kfree(wm8523);
- wm8523_codec = NULL;
+ return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_wm8523 = {
+ .probe = wm8523_probe,
+ .remove = wm8523_remove,
+ .suspend = wm8523_suspend,
+ .resume = wm8523_resume,
+ .set_bias_level = wm8523_set_bias_level,
+ .reg_cache_size = WM8523_REGISTER_COUNT,
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8523_reg,
+ .volatile_register = wm8523_volatile_register,
+};
+
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static __devinit int wm8523_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct wm8523_priv *wm8523;
- struct snd_soc_codec *codec;
+ int ret;
wm8523 = kzalloc(sizeof(struct wm8523_priv), GFP_KERNEL);
if (wm8523 == NULL)
return -ENOMEM;
- codec = &wm8523->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
-
i2c_set_clientdata(i2c, wm8523);
- codec->control_data = i2c;
+ wm8523->control_type = SND_SOC_I2C;
- codec->dev = &i2c->dev;
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8523, &wm8523_dai, 1);
+ if (ret < 0)
+ kfree(wm8523);
+ return ret;
- return wm8523_register(wm8523, SND_SOC_I2C);
}
static __devexit int wm8523_i2c_remove(struct i2c_client *client)
{
- struct wm8523_priv *wm8523 = i2c_get_clientdata(client);
- wm8523_unregister(wm8523);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -640,7 +551,7 @@ MODULE_DEVICE_TABLE(i2c, wm8523_i2c_id);
static struct i2c_driver wm8523_i2c_driver = {
.driver = {
- .name = "WM8523",
+ .name = "wm8523-codec",
.owner = THIS_MODULE,
},
.probe = wm8523_i2c_probe,
diff --git a/sound/soc/codecs/wm8523.h b/sound/soc/codecs/wm8523.h
index 1aa9ce3e1357..4d5b1eb8f2fc 100644
--- a/sound/soc/codecs/wm8523.h
+++ b/sound/soc/codecs/wm8523.h
@@ -154,7 +154,4 @@
#define WM8523_ZD_COUNT_SHIFT 0 /* ZD_COUNT - [1:0] */
#define WM8523_ZD_COUNT_WIDTH 2 /* ZD_COUNT - [1:0] */
-extern struct snd_soc_dai wm8523_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8523;
-
#endif
diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c
index 72deeabef4fe..910c62a3f594 100644
--- a/sound/soc/codecs/wm8580.c
+++ b/sound/soc/codecs/wm8580.c
@@ -94,6 +94,8 @@
#define WM8580_MAX_REGISTER 0x35
+#define WM8580_DACOSR 0x40
+
/* PLLB4 (register 7h) */
#define WM8580_PLLB4_MCLKOUTSRC_MASK 0x60
#define WM8580_PLLB4_MCLKOUTSRC_PLLA 0x20
@@ -112,19 +114,7 @@
/* AIF control 1 (registers 9h-bh) */
#define WM8580_AIF_RATE_MASK 0x7
-#define WM8580_AIF_RATE_128 0x0
-#define WM8580_AIF_RATE_192 0x1
-#define WM8580_AIF_RATE_256 0x2
-#define WM8580_AIF_RATE_384 0x3
-#define WM8580_AIF_RATE_512 0x4
-#define WM8580_AIF_RATE_768 0x5
-#define WM8580_AIF_RATE_1152 0x6
-
#define WM8580_AIF_BCLKSEL_MASK 0x18
-#define WM8580_AIF_BCLKSEL_64 0x00
-#define WM8580_AIF_BCLKSEL_128 0x08
-#define WM8580_AIF_BCLKSEL_256 0x10
-#define WM8580_AIF_BCLKSEL_SYSCLK 0x18
#define WM8580_AIF_MS 0x20
@@ -199,11 +189,12 @@ static const char *wm8580_supply_names[WM8580_NUM_SUPPLIES] = {
/* codec private data */
struct wm8580_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
struct regulator_bulk_data supplies[WM8580_NUM_SUPPLIES];
u16 reg_cache[WM8580_MAX_REGISTER + 1];
struct pll_state a;
struct pll_state b;
+ int sysclk[2];
};
static const DECLARE_TLV_DB_SCALE(dac_tlv, -12750, 50, 1);
@@ -273,8 +264,8 @@ SOC_SINGLE("DAC1 Switch", WM8580_DAC_CONTROL5, 0, 1, 1),
SOC_SINGLE("DAC2 Switch", WM8580_DAC_CONTROL5, 1, 1, 1),
SOC_SINGLE("DAC3 Switch", WM8580_DAC_CONTROL5, 2, 1, 1),
-SOC_DOUBLE("ADC Mute Switch", WM8580_ADC_CONTROL1, 0, 1, 1, 0),
-SOC_SINGLE("ADC High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0),
+SOC_DOUBLE("Capture Switch", WM8580_ADC_CONTROL1, 0, 1, 1, 1),
+SOC_SINGLE("Capture High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0),
};
static const struct snd_soc_dapm_widget wm8580_dapm_widgets[] = {
@@ -476,6 +467,10 @@ static int wm8580_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
return 0;
}
+static const int wm8580_sysclk_ratios[] = {
+ 128, 192, 256, 384, 512, 768, 1152,
+};
+
/*
* Set PCM DAI bit size and sample rate.
*/
@@ -484,29 +479,68 @@ static int wm8580_paif_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
- u16 paifb = snd_soc_read(codec, WM8580_PAIF3 + dai->id);
+ struct snd_soc_codec *codec = rtd->codec;
+ struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec);
+ u16 paifa = 0;
+ u16 paifb = 0;
+ int i, ratio, osr;
- paifb &= ~WM8580_AIF_LENGTH_MASK;
/* bit size */
switch (params_format(params)) {
case SNDRV_PCM_FORMAT_S16_LE:
+ paifa |= 0x8;
break;
case SNDRV_PCM_FORMAT_S20_3LE:
+ paifa |= 0x10;
paifb |= WM8580_AIF_LENGTH_20;
break;
case SNDRV_PCM_FORMAT_S24_LE:
+ paifa |= 0x10;
paifb |= WM8580_AIF_LENGTH_24;
break;
case SNDRV_PCM_FORMAT_S32_LE:
+ paifa |= 0x10;
paifb |= WM8580_AIF_LENGTH_24;
break;
default:
return -EINVAL;
}
- snd_soc_write(codec, WM8580_PAIF3 + dai->id, paifb);
+ /* Look up the SYSCLK ratio; accept only exact matches */
+ ratio = wm8580->sysclk[dai->id] / params_rate(params);
+ for (i = 0; i < ARRAY_SIZE(wm8580_sysclk_ratios); i++)
+ if (ratio == wm8580_sysclk_ratios[i])
+ break;
+ if (i == ARRAY_SIZE(wm8580_sysclk_ratios)) {
+ dev_err(codec->dev, "Invalid clock ratio %d/%d\n",
+ wm8580->sysclk[dai->id], params_rate(params));
+ return -EINVAL;
+ }
+ paifa |= i;
+ dev_dbg(codec->dev, "Running at %dfs with %dHz clock\n",
+ wm8580_sysclk_ratios[i], wm8580->sysclk[dai->driver->id]);
+
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+ switch (ratio) {
+ case 128:
+ case 192:
+ osr = WM8580_DACOSR;
+ dev_dbg(codec->dev, "Selecting 64x OSR\n");
+ break;
+ default:
+ osr = 0;
+ dev_dbg(codec->dev, "Selecting 128x OSR\n");
+ break;
+ }
+
+ snd_soc_update_bits(codec, WM8580_PAIF3, WM8580_DACOSR, osr);
+ }
+
+ snd_soc_update_bits(codec, WM8580_PAIF1 + dai->driver->id,
+ WM8580_AIF_RATE_MASK | WM8580_AIF_BCLKSEL_MASK,
+ paifa);
+ snd_soc_update_bits(codec, WM8580_PAIF3 + dai->driver->id,
+ WM8580_AIF_LENGTH_MASK, paifb);
return 0;
}
@@ -514,12 +548,14 @@ static int wm8580_set_paif_dai_fmt(struct snd_soc_dai *codec_dai,
unsigned int fmt)
{
struct snd_soc_codec *codec = codec_dai->codec;
+ struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec);
unsigned int aifa;
unsigned int aifb;
int can_invert_lrclk;
+ int sysclk;
- aifa = snd_soc_read(codec, WM8580_PAIF1 + codec_dai->id);
- aifb = snd_soc_read(codec, WM8580_PAIF3 + codec_dai->id);
+ aifa = snd_soc_read(codec, WM8580_PAIF1 + codec_dai->driver->id);
+ aifb = snd_soc_read(codec, WM8580_PAIF3 + codec_dai->driver->id);
aifb &= ~(WM8580_AIF_FMT_MASK | WM8580_AIF_LRP | WM8580_AIF_BCP);
@@ -585,8 +621,10 @@ static int wm8580_set_paif_dai_fmt(struct snd_soc_dai *codec_dai,
return -EINVAL;
}
- snd_soc_write(codec, WM8580_PAIF1 + codec_dai->id, aifa);
- snd_soc_write(codec, WM8580_PAIF3 + codec_dai->id, aifb);
+ sysclk = wm8580->sysclk[codec_dai->driver->id];
+
+ snd_soc_write(codec, WM8580_PAIF1 + codec_dai->driver->id, aifa);
+ snd_soc_write(codec, WM8580_PAIF3 + codec_dai->driver->id, aifb);
return 0;
}
@@ -624,28 +662,6 @@ static int wm8580_set_dai_clkdiv(struct snd_soc_dai *codec_dai,
snd_soc_write(codec, WM8580_PLLB4, reg);
break;
- case WM8580_DAC_CLKSEL:
- reg = snd_soc_read(codec, WM8580_CLKSEL);
- reg &= ~WM8580_CLKSEL_DAC_CLKSEL_MASK;
-
- switch (div) {
- case WM8580_CLKSRC_MCLK:
- break;
-
- case WM8580_CLKSRC_PLLA:
- reg |= WM8580_CLKSEL_DAC_CLKSEL_PLLA;
- break;
-
- case WM8580_CLKSRC_PLLB:
- reg |= WM8580_CLKSEL_DAC_CLKSEL_PLLB;
- break;
-
- default:
- return -EINVAL;
- }
- snd_soc_write(codec, WM8580_CLKSEL, reg);
- break;
-
case WM8580_CLKOUTSRC:
reg = snd_soc_read(codec, WM8580_PLLB4);
reg &= ~WM8580_PLLB4_CLKOUTSRC_MASK;
@@ -679,6 +695,55 @@ static int wm8580_set_dai_clkdiv(struct snd_soc_dai *codec_dai,
return 0;
}
+static int wm8580_set_sysclk(struct snd_soc_dai *dai, int clk_id,
+ unsigned int freq, int dir)
+{
+ struct snd_soc_codec *codec = dai->codec;
+ struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec);
+ int sel, sel_mask, sel_shift;
+
+ switch (dai->driver->id) {
+ case WM8580_DAI_PAIFRX:
+ sel_mask = 0x3;
+ sel_shift = 0;
+ break;
+
+ case WM8580_DAI_PAIFTX:
+ sel_mask = 0xc;
+ sel_shift = 2;
+ break;
+
+ default:
+ BUG_ON("Unknown DAI driver ID\n");
+ return -EINVAL;
+ }
+
+ switch (clk_id) {
+ case WM8580_CLKSRC_ADCMCLK:
+ if (dai->id != WM8580_DAI_PAIFTX)
+ return -EINVAL;
+ sel = 0 << sel_shift;
+ break;
+ case WM8580_CLKSRC_PLLA:
+ sel = 1 << sel_shift;
+ break;
+ case WM8580_CLKSRC_PLLB:
+ sel = 2 << sel_shift;
+ break;
+ case WM8580_CLKSRC_MCLK:
+ sel = 3 << sel_shift;
+ break;
+ default:
+ dev_err(codec->dev, "Unknown clock %d\n", clk_id);
+ return -EINVAL;
+ }
+
+ /* We really should validate PLL settings but not yet */
+ wm8580->sysclk[dai->id] = freq;
+
+ return snd_soc_update_bits(codec, WM8580_CLKSEL, sel_mask, sel);
+}
+
static int wm8580_digital_mute(struct snd_soc_dai *codec_dai, int mute)
{
struct snd_soc_codec *codec = codec_dai->codec;
@@ -732,6 +797,7 @@ static int wm8580_set_bias_level(struct snd_soc_codec *codec,
SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
static struct snd_soc_dai_ops wm8580_dai_ops_playback = {
+ .set_sysclk = wm8580_set_sysclk,
.hw_params = wm8580_paif_hw_params,
.set_fmt = wm8580_set_paif_dai_fmt,
.set_clkdiv = wm8580_set_dai_clkdiv,
@@ -740,16 +806,17 @@ static struct snd_soc_dai_ops wm8580_dai_ops_playback = {
};
static struct snd_soc_dai_ops wm8580_dai_ops_capture = {
+ .set_sysclk = wm8580_set_sysclk,
.hw_params = wm8580_paif_hw_params,
.set_fmt = wm8580_set_paif_dai_fmt,
.set_clkdiv = wm8580_set_dai_clkdiv,
.set_pll = wm8580_set_dai_pll,
};
-struct snd_soc_dai wm8580_dai[] = {
+static struct snd_soc_dai_driver wm8580_dai[] = {
{
- .name = "WM8580 PAIFRX",
- .id = 0,
+ .name = "wm8580-hifi-playback",
+ .id = WM8580_DAI_PAIFRX,
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -760,8 +827,8 @@ struct snd_soc_dai wm8580_dai[] = {
.ops = &wm8580_dai_ops_playback,
},
{
- .name = "WM8580 PAIFTX",
- .id = 1,
+ .name = "wm8580-hifi-capture",
+ .id = WM8580_DAI_PAIFTX,
.capture = {
.stream_name = "Capture",
.channels_min = 2,
@@ -772,90 +839,16 @@ struct snd_soc_dai wm8580_dai[] = {
.ops = &wm8580_dai_ops_capture,
},
};
-EXPORT_SYMBOL_GPL(wm8580_dai);
-static struct snd_soc_codec *wm8580_codec;
-
-static int wm8580_probe(struct platform_device *pdev)
+static int wm8580_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (wm8580_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = wm8580_codec;
- codec = wm8580_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
- snd_soc_add_controls(codec, wm8580_snd_controls,
- ARRAY_SIZE(wm8580_snd_controls));
- wm8580_add_widgets(codec);
-
- return ret;
-
-pcm_err:
- return ret;
-}
-
-/* power down chip */
-static int wm8580_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8580 = {
- .probe = wm8580_probe,
- .remove = wm8580_remove,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8580);
-
-static int wm8580_register(struct wm8580_priv *wm8580,
- enum snd_soc_control_type control)
-{
- int ret, i;
- struct snd_soc_codec *codec = &wm8580->codec;
-
- if (wm8580_codec) {
- dev_err(codec->dev, "Another WM8580 is registered\n");
- ret = -EINVAL;
- goto err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8580);
- codec->name = "WM8580";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8580_set_bias_level;
- codec->dai = wm8580_dai;
- codec->num_dai = ARRAY_SIZE(wm8580_dai);
- codec->reg_cache_size = ARRAY_SIZE(wm8580->reg_cache);
- codec->reg_cache = &wm8580->reg_cache;
-
- memcpy(codec->reg_cache, wm8580_reg, sizeof(wm8580_reg));
+ struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec);
+ int ret = 0,i;
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8580->control_type);
if (ret < 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
+ return ret;
}
for (i = 0; i < ARRAY_SIZE(wm8580->supplies); i++)
@@ -865,7 +858,7 @@ static int wm8580_register(struct wm8580_priv *wm8580,
wm8580->supplies);
if (ret != 0) {
dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
- goto err;
+ return ret;
}
ret = regulator_bulk_enable(ARRAY_SIZE(wm8580->supplies),
@@ -882,74 +875,68 @@ static int wm8580_register(struct wm8580_priv *wm8580,
goto err_regulator_enable;
}
- for (i = 0; i < ARRAY_SIZE(wm8580_dai); i++)
- wm8580_dai[i].dev = codec->dev;
-
wm8580_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
- wm8580_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err_regulator_enable;
- }
-
- ret = snd_soc_register_dais(wm8580_dai, ARRAY_SIZE(wm8580_dai));
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
+ snd_soc_add_controls(codec, wm8580_snd_controls,
+ ARRAY_SIZE(wm8580_snd_controls));
+ wm8580_add_widgets(codec);
return 0;
-err_codec:
- snd_soc_unregister_codec(codec);
err_regulator_enable:
regulator_bulk_disable(ARRAY_SIZE(wm8580->supplies), wm8580->supplies);
err_regulator_get:
regulator_bulk_free(ARRAY_SIZE(wm8580->supplies), wm8580->supplies);
-err:
- kfree(wm8580);
return ret;
}
-static void wm8580_unregister(struct wm8580_priv *wm8580)
+/* power down chip */
+static int wm8580_remove(struct snd_soc_codec *codec)
{
- wm8580_set_bias_level(&wm8580->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dais(wm8580_dai, ARRAY_SIZE(wm8580_dai));
- snd_soc_unregister_codec(&wm8580->codec);
+ struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec);
+
+ wm8580_set_bias_level(codec, SND_SOC_BIAS_OFF);
+
regulator_bulk_disable(ARRAY_SIZE(wm8580->supplies), wm8580->supplies);
regulator_bulk_free(ARRAY_SIZE(wm8580->supplies), wm8580->supplies);
- kfree(wm8580);
- wm8580_codec = NULL;
+
+ return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_wm8580 = {
+ .probe = wm8580_probe,
+ .remove = wm8580_remove,
+ .set_bias_level = wm8580_set_bias_level,
+ .reg_cache_size = sizeof(wm8580_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = &wm8580_reg,
+};
+
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static int wm8580_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct wm8580_priv *wm8580;
- struct snd_soc_codec *codec;
+ int ret;
wm8580 = kzalloc(sizeof(struct wm8580_priv), GFP_KERNEL);
if (wm8580 == NULL)
return -ENOMEM;
- codec = &wm8580->codec;
-
i2c_set_clientdata(i2c, wm8580);
- codec->control_data = i2c;
+ wm8580->control_type = SND_SOC_I2C;
- codec->dev = &i2c->dev;
-
- return wm8580_register(wm8580, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8580, wm8580_dai, ARRAY_SIZE(wm8580_dai));
+ if (ret < 0)
+ kfree(wm8580);
+ return ret;
}
static int wm8580_i2c_remove(struct i2c_client *client)
{
- struct wm8580_priv *wm8580 = i2c_get_clientdata(client);
- wm8580_unregister(wm8580);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -961,7 +948,7 @@ MODULE_DEVICE_TABLE(i2c, wm8580_i2c_id);
static struct i2c_driver wm8580_i2c_driver = {
.driver = {
- .name = "wm8580",
+ .name = "wm8580-codec",
.owner = THIS_MODULE,
},
.probe = wm8580_i2c_probe,
@@ -972,7 +959,7 @@ static struct i2c_driver wm8580_i2c_driver = {
static int __init wm8580_modinit(void)
{
- int ret;
+ int ret = 0;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8580_i2c_driver);
@@ -981,7 +968,7 @@ static int __init wm8580_modinit(void)
}
#endif
- return 0;
+ return ret;
}
module_init(wm8580_modinit);
diff --git a/sound/soc/codecs/wm8580.h b/sound/soc/codecs/wm8580.h
index 0dfb5ddde6a2..1d34656d0dcb 100644
--- a/sound/soc/codecs/wm8580.h
+++ b/sound/soc/codecs/wm8580.h
@@ -19,20 +19,17 @@
#define WM8580_PLLB 2
#define WM8580_MCLK 1
-#define WM8580_DAC_CLKSEL 2
-#define WM8580_CLKOUTSRC 3
+#define WM8580_CLKOUTSRC 2
-#define WM8580_CLKSRC_MCLK 1
-#define WM8580_CLKSRC_PLLA 2
-#define WM8580_CLKSRC_PLLB 3
-#define WM8580_CLKSRC_OSC 4
-#define WM8580_CLKSRC_NONE 5
+#define WM8580_CLKSRC_MCLK 1
+#define WM8580_CLKSRC_PLLA 2
+#define WM8580_CLKSRC_PLLB 3
+#define WM8580_CLKSRC_OSC 4
+#define WM8580_CLKSRC_NONE 5
+#define WM8580_CLKSRC_ADCMCLK 6
#define WM8580_DAI_PAIFRX 0
#define WM8580_DAI_PAIFTX 1
-extern struct snd_soc_dai wm8580_dai[];
-extern struct snd_soc_codec_device soc_codec_dev_wm8580;
-
#endif
diff --git a/sound/soc/codecs/wm8711.c b/sound/soc/codecs/wm8711.c
index e2dba07f0260..f8d9c60e7fad 100644
--- a/sound/soc/codecs/wm8711.c
+++ b/sound/soc/codecs/wm8711.c
@@ -31,11 +31,9 @@
#include "wm8711.h"
-static struct snd_soc_codec *wm8711_codec;
-
/* codec private data */
struct wm8711_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type bus_type;
u16 reg_cache[WM8711_CACHEREGNUM];
unsigned int sysclk;
};
@@ -163,7 +161,7 @@ static int wm8711_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_codec *codec = dai->codec;
- struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec);
+ struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec);
u16 iface = snd_soc_read(codec, WM8711_IFACE) & 0xfffc;
int i = get_coeff(wm8711->sysclk, params_rate(params));
u16 srate = (coeff_div[i].sr << 2) |
@@ -227,7 +225,7 @@ static int wm8711_set_dai_sysclk(struct snd_soc_dai *codec_dai,
int clk_id, unsigned int freq, int dir)
{
struct snd_soc_codec *codec = codec_dai->codec;
- struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec);
+ struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec);
switch (freq) {
case 11289600:
@@ -338,8 +336,8 @@ static struct snd_soc_dai_ops wm8711_ops = {
.set_fmt = wm8711_set_dai_fmt,
};
-struct snd_soc_dai wm8711_dai = {
- .name = "WM8711",
+static struct snd_soc_dai_driver wm8711_dai = {
+ .name = "wm8711-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -349,22 +347,16 @@ struct snd_soc_dai wm8711_dai = {
},
.ops = &wm8711_ops,
};
-EXPORT_SYMBOL_GPL(wm8711_dai);
-static int wm8711_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8711_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
snd_soc_write(codec, WM8711_ACTIVE, 0x0);
wm8711_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8711_resume(struct platform_device *pdev)
+static int wm8711_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
u8 data[2];
u16 *cache = codec->reg_cache;
@@ -380,99 +372,23 @@ static int wm8711_resume(struct platform_device *pdev)
return 0;
}
-static int wm8711_probe(struct platform_device *pdev)
+static int wm8711_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (wm8711_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = wm8711_codec;
- codec = wm8711_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
- snd_soc_add_controls(codec, wm8711_snd_controls,
- ARRAY_SIZE(wm8711_snd_controls));
- wm8711_add_widgets(codec);
-
- return ret;
-
-pcm_err:
- return ret;
-}
-
-/* power down chip */
-static int wm8711_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8711 = {
- .probe = wm8711_probe,
- .remove = wm8711_remove,
- .suspend = wm8711_suspend,
- .resume = wm8711_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8711);
-
-static int wm8711_register(struct wm8711_priv *wm8711,
- enum snd_soc_control_type control)
-{
- int ret;
- struct snd_soc_codec *codec = &wm8711->codec;
- u16 reg;
-
- if (wm8711_codec) {
- dev_err(codec->dev, "Another WM8711 is registered\n");
- ret = -EINVAL;
- goto err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8711);
- codec->name = "WM8711";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8711_set_bias_level;
- codec->dai = &wm8711_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = WM8711_CACHEREGNUM;
- codec->reg_cache = &wm8711->reg_cache;
-
- memcpy(codec->reg_cache, wm8711_reg, sizeof(wm8711_reg));
+ struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec);
+ int ret, reg;
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8711->bus_type);
if (ret < 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
+ return ret;
}
ret = wm8711_reset(codec);
if (ret < 0) {
dev_err(codec->dev, "Failed to issue reset\n");
- goto err;
+ return ret;
}
- wm8711_dai.dev = codec->dev;
-
wm8711_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
/* Latch the update bits */
@@ -481,69 +397,62 @@ static int wm8711_register(struct wm8711_priv *wm8711,
reg = snd_soc_read(codec, WM8711_ROUT1V);
snd_soc_write(codec, WM8711_ROUT1V, reg | 0x0100);
- wm8711_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
-
- ret = snd_soc_register_dai(&wm8711_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
-
- return 0;
+ snd_soc_add_controls(codec, wm8711_snd_controls,
+ ARRAY_SIZE(wm8711_snd_controls));
+ wm8711_add_widgets(codec);
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- kfree(wm8711);
return ret;
+
}
-static void wm8711_unregister(struct wm8711_priv *wm8711)
+/* power down chip */
+static int wm8711_remove(struct snd_soc_codec *codec)
{
- wm8711_set_bias_level(&wm8711->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dai(&wm8711_dai);
- snd_soc_unregister_codec(&wm8711->codec);
- kfree(wm8711);
- wm8711_codec = NULL;
+ wm8711_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_wm8711 = {
+ .probe = wm8711_probe,
+ .remove = wm8711_remove,
+ .suspend = wm8711_suspend,
+ .resume = wm8711_resume,
+ .set_bias_level = wm8711_set_bias_level,
+ .reg_cache_size = sizeof(wm8711_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8711_reg,
+};
+
#if defined(CONFIG_SPI_MASTER)
static int __devinit wm8711_spi_probe(struct spi_device *spi)
{
- struct snd_soc_codec *codec;
struct wm8711_priv *wm8711;
+ int ret;
wm8711 = kzalloc(sizeof(struct wm8711_priv), GFP_KERNEL);
if (wm8711 == NULL)
return -ENOMEM;
- codec = &wm8711->codec;
- codec->control_data = spi;
- codec->dev = &spi->dev;
+ spi_set_drvdata(spi, wm8711);
+ wm8711->bus_type = SND_SOC_SPI;
- dev_set_drvdata(&spi->dev, wm8711);
-
- return wm8711_register(wm8711, SND_SOC_SPI);
+ ret = snd_soc_register_codec(&spi->dev,
+ &soc_codec_dev_wm8711, &wm8711_dai, 1);
+ if (ret < 0)
+ kfree(wm8711);
+ return ret;
}
static int __devexit wm8711_spi_remove(struct spi_device *spi)
{
- struct wm8711_priv *wm8711 = dev_get_drvdata(&spi->dev);
-
- wm8711_unregister(wm8711);
-
+ snd_soc_unregister_codec(&spi->dev);
+ kfree(spi_get_drvdata(spi));
return 0;
}
static struct spi_driver wm8711_spi_driver = {
.driver = {
- .name = "wm8711",
+ .name = "wm8711-codec",
.bus = &spi_bus_type,
.owner = THIS_MODULE,
},
@@ -553,31 +462,30 @@ static struct spi_driver wm8711_spi_driver = {
#endif /* CONFIG_SPI_MASTER */
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
-static __devinit int wm8711_i2c_probe(struct i2c_client *i2c,
+static __devinit int wm8711_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct wm8711_priv *wm8711;
- struct snd_soc_codec *codec;
+ int ret;
wm8711 = kzalloc(sizeof(struct wm8711_priv), GFP_KERNEL);
if (wm8711 == NULL)
return -ENOMEM;
- codec = &wm8711->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
-
- i2c_set_clientdata(i2c, wm8711);
- codec->control_data = i2c;
+ i2c_set_clientdata(client, wm8711);
+ wm8711->bus_type = SND_SOC_I2C;
- codec->dev = &i2c->dev;
-
- return wm8711_register(wm8711, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&client->dev,
+ &soc_codec_dev_wm8711, &wm8711_dai, 1);
+ if (ret < 0)
+ kfree(wm8711);
+ return ret;
}
static __devexit int wm8711_i2c_remove(struct i2c_client *client)
{
- struct wm8711_priv *wm8711 = i2c_get_clientdata(client);
- wm8711_unregister(wm8711);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -589,7 +497,7 @@ MODULE_DEVICE_TABLE(i2c, wm8711_i2c_id);
static struct i2c_driver wm8711_i2c_driver = {
.driver = {
- .name = "WM8711 I2C Codec",
+ .name = "wm8711-codec",
.owner = THIS_MODULE,
},
.probe = wm8711_i2c_probe,
diff --git a/sound/soc/codecs/wm8711.h b/sound/soc/codecs/wm8711.h
index 381e84a43816..a61db985499f 100644
--- a/sound/soc/codecs/wm8711.h
+++ b/sound/soc/codecs/wm8711.h
@@ -36,7 +36,4 @@ struct wm8711_setup_data {
unsigned short i2c_address;
};
-extern struct snd_soc_dai wm8711_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8711;
-
#endif
diff --git a/sound/soc/codecs/wm8727.c b/sound/soc/codecs/wm8727.c
index 9d1df2628136..748808285119 100644
--- a/sound/soc/codecs/wm8727.c
+++ b/sound/soc/codecs/wm8727.c
@@ -23,7 +23,6 @@
#include <sound/initval.h>
#include <sound/soc.h>
-#include "wm8727.h"
/*
* Note this is a simple chip with no configuration interface, sample rate is
* determined automatically by examining the Master clock and Bit clock ratios
@@ -33,8 +32,8 @@
SNDRV_PCM_RATE_192000)
-struct snd_soc_dai wm8727_dai = {
- .name = "WM8727",
+static struct snd_soc_dai_driver wm8727_dai = {
+ .name = "wm8727-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -43,103 +42,18 @@ struct snd_soc_dai wm8727_dai = {
.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
},
};
-EXPORT_SYMBOL_GPL(wm8727_dai);
-static struct snd_soc_codec *wm8727_codec;
+static struct snd_soc_codec_driver soc_codec_dev_wm8727;
-static int wm8727_soc_probe(struct platform_device *pdev)
+static __devinit int wm8727_probe(struct platform_device *pdev)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- int ret = 0;
-
- BUG_ON(!wm8727_codec);
-
- socdev->card->codec = wm8727_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "wm8727: failed to create pcms\n");
- goto pcm_err;
- }
-
- return ret;
-
-pcm_err:
- kfree(socdev->card->codec);
- socdev->card->codec = NULL;
- return ret;
-}
-
-static int wm8727_soc_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8727 = {
- .probe = wm8727_soc_probe,
- .remove = wm8727_soc_remove,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8727);
-
-
-static __devinit int wm8727_platform_probe(struct platform_device *pdev)
-{
- struct snd_soc_codec *codec;
- int ret;
-
- if (wm8727_codec) {
- dev_err(&pdev->dev, "Another WM8727 is registered\n");
- return -EBUSY;
- }
-
- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (codec == NULL)
- return -ENOMEM;
- wm8727_codec = codec;
-
- platform_set_drvdata(pdev, codec);
-
- mutex_init(&codec->mutex);
- codec->dev = &pdev->dev;
- codec->name = "WM8727";
- codec->owner = THIS_MODULE;
- codec->dai = &wm8727_dai;
- codec->num_dai = 1;
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- wm8727_dai.dev = &pdev->dev;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(&pdev->dev, "Failed to register CODEC: %d\n", ret);
- goto err;
- }
-
- ret = snd_soc_register_dai(&wm8727_dai);
- if (ret != 0) {
- dev_err(&pdev->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
-
- return 0;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- kfree(codec);
- return ret;
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_wm8727, &wm8727_dai, 1);
}
-static int __devexit wm8727_platform_remove(struct platform_device *pdev)
+static int __devexit wm8727_remove(struct platform_device *pdev)
{
- snd_soc_unregister_dai(&wm8727_dai);
- snd_soc_unregister_codec(platform_get_drvdata(pdev));
+ snd_soc_unregister_codec(&pdev->dev);
return 0;
}
@@ -149,8 +63,8 @@ static struct platform_driver wm8727_codec_driver = {
.owner = THIS_MODULE,
},
- .probe = wm8727_platform_probe,
- .remove = __devexit_p(wm8727_platform_remove),
+ .probe = wm8727_probe,
+ .remove = __devexit_p(wm8727_remove),
};
static int __init wm8727_init(void)
diff --git a/sound/soc/codecs/wm8727.h b/sound/soc/codecs/wm8727.h
deleted file mode 100644
index ee19aa71bcdc..000000000000
--- a/sound/soc/codecs/wm8727.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * wm8727.h
- *
- * Created on: 15-Oct-2009
- * Author: neil.jones@imgtec.com
- *
- * Copyright (C) 2009 Imagination Technologies Ltd.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- */
-
-#ifndef WM8727_H_
-#define WM8727_H_
-
-extern struct snd_soc_dai wm8727_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8727;
-
-#endif /* WM8727_H_ */
diff --git a/sound/soc/codecs/wm8728.c b/sound/soc/codecs/wm8728.c
index 34be2d2b69ef..5e5a1625194c 100644
--- a/sound/soc/codecs/wm8728.c
+++ b/sound/soc/codecs/wm8728.c
@@ -29,8 +29,6 @@
#include "wm8728.h"
-struct snd_soc_codec_device soc_codec_dev_wm8728;
-
/*
* We can't read the WM8728 register space so we cache them instead.
* Note that the defaults here aren't the physical defaults, we latch
@@ -44,6 +42,11 @@ static const u16 wm8728_reg_defaults[] = {
0x100,
};
+/* codec private data */
+struct wm8728_priv {
+ enum snd_soc_control_type control_type;
+};
+
static const DECLARE_TLV_DB_SCALE(wm8728_tlv, -12750, 50, 1);
static const struct snd_kcontrol_new wm8728_snd_controls[] = {
@@ -96,8 +99,7 @@ static int wm8728_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
u16 dac = snd_soc_read(codec, WM8728_DACCTL);
dac &= ~0x18;
@@ -210,8 +212,8 @@ static struct snd_soc_dai_ops wm8728_dai_ops = {
.set_fmt = wm8728_set_dai_fmt,
};
-struct snd_soc_dai wm8728_dai = {
- .name = "WM8728",
+static struct snd_soc_dai_driver wm8728_dai = {
+ .name = "wm8728-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -221,63 +223,31 @@ struct snd_soc_dai wm8728_dai = {
},
.ops = &wm8728_dai_ops,
};
-EXPORT_SYMBOL_GPL(wm8728_dai);
-static int wm8728_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8728_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8728_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8728_resume(struct platform_device *pdev)
+static int wm8728_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8728_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
}
-/*
- * initialise the WM8728 driver
- * register the mixer and dsp interfaces with the kernel
- */
-static int wm8728_init(struct snd_soc_device *socdev,
- enum snd_soc_control_type control)
+static int wm8728_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = socdev->card->codec;
- int ret = 0;
-
- codec->name = "WM8728";
- codec->owner = THIS_MODULE;
- codec->set_bias_level = wm8728_set_bias_level;
- codec->dai = &wm8728_dai;
- codec->num_dai = 1;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->reg_cache_size = ARRAY_SIZE(wm8728_reg_defaults);
- codec->reg_cache = kmemdup(wm8728_reg_defaults,
- sizeof(wm8728_reg_defaults),
- GFP_KERNEL);
- if (codec->reg_cache == NULL)
- return -ENOMEM;
+ struct wm8728_priv *wm8728 = snd_soc_codec_get_drvdata(codec);
+ int ret;
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8728->control_type);
if (ret < 0) {
printk(KERN_ERR "wm8728: failed to configure cache I/O: %d\n",
ret);
- goto err;
- }
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "wm8728: failed to create pcms\n");
- goto err;
+ return ret;
}
/* power on device */
@@ -288,128 +258,55 @@ static int wm8728_init(struct snd_soc_device *socdev,
wm8728_add_widgets(codec);
return ret;
-
-err:
- kfree(codec->reg_cache);
- return ret;
}
-static struct snd_soc_device *wm8728_socdev;
-
-#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
-
-/*
- * WM8728 2 wire address is determined by GPIO5
- * state during powerup.
- * low = 0x1a
- * high = 0x1b
- */
-
-static int wm8728_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+static int wm8728_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = wm8728_socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
- int ret;
-
- i2c_set_clientdata(i2c, codec);
- codec->control_data = i2c;
-
- ret = wm8728_init(socdev, SND_SOC_I2C);
- if (ret < 0)
- pr_err("failed to initialise WM8728\n");
-
- return ret;
-}
-
-static int wm8728_i2c_remove(struct i2c_client *client)
-{
- struct snd_soc_codec *codec = i2c_get_clientdata(client);
- kfree(codec->reg_cache);
+ wm8728_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static const struct i2c_device_id wm8728_i2c_id[] = {
- { "wm8728", 0 },
- { }
-};
-MODULE_DEVICE_TABLE(i2c, wm8728_i2c_id);
-
-static struct i2c_driver wm8728_i2c_driver = {
- .driver = {
- .name = "WM8728 I2C Codec",
- .owner = THIS_MODULE,
- },
- .probe = wm8728_i2c_probe,
- .remove = wm8728_i2c_remove,
- .id_table = wm8728_i2c_id,
+static struct snd_soc_codec_driver soc_codec_dev_wm8728 = {
+ .probe = wm8728_probe,
+ .remove = wm8728_remove,
+ .suspend = wm8728_suspend,
+ .resume = wm8728_resume,
+ .set_bias_level = wm8728_set_bias_level,
+ .reg_cache_size = sizeof(wm8728_reg_defaults),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8728_reg_defaults,
};
-static int wm8728_add_i2c_device(struct platform_device *pdev,
- const struct wm8728_setup_data *setup)
-{
- struct i2c_board_info info;
- struct i2c_adapter *adapter;
- struct i2c_client *client;
- int ret;
-
- ret = i2c_add_driver(&wm8728_i2c_driver);
- if (ret != 0) {
- dev_err(&pdev->dev, "can't add i2c driver\n");
- return ret;
- }
-
- memset(&info, 0, sizeof(struct i2c_board_info));
- info.addr = setup->i2c_address;
- strlcpy(info.type, "wm8728", I2C_NAME_SIZE);
-
- adapter = i2c_get_adapter(setup->i2c_bus);
- if (!adapter) {
- dev_err(&pdev->dev, "can't get i2c adapter %d\n",
- setup->i2c_bus);
- goto err_driver;
- }
-
- client = i2c_new_device(adapter, &info);
- i2c_put_adapter(adapter);
- if (!client) {
- dev_err(&pdev->dev, "can't add i2c device at 0x%x\n",
- (unsigned int)info.addr);
- goto err_driver;
- }
-
- return 0;
-
-err_driver:
- i2c_del_driver(&wm8728_i2c_driver);
- return -ENODEV;
-}
-#endif
-
#if defined(CONFIG_SPI_MASTER)
static int __devinit wm8728_spi_probe(struct spi_device *spi)
{
- struct snd_soc_device *socdev = wm8728_socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct wm8728_priv *wm8728;
int ret;
- codec->control_data = spi;
+ wm8728 = kzalloc(sizeof(struct wm8728_priv), GFP_KERNEL);
+ if (wm8728 == NULL)
+ return -ENOMEM;
- ret = wm8728_init(socdev, SND_SOC_SPI);
- if (ret < 0)
- dev_err(&spi->dev, "failed to initialise WM8728\n");
+ wm8728->control_type = SND_SOC_SPI;
+ spi_set_drvdata(spi, wm8728);
+ ret = snd_soc_register_codec(&spi->dev,
+ &soc_codec_dev_wm8728, &wm8728_dai, 1);
+ if (ret < 0)
+ kfree(wm8728);
return ret;
}
static int __devexit wm8728_spi_remove(struct spi_device *spi)
{
+ snd_soc_unregister_codec(&spi->dev);
+ kfree(spi_get_drvdata(spi));
return 0;
}
static struct spi_driver wm8728_spi_driver = {
.driver = {
- .name = "wm8728",
+ .name = "wm8728-codec",
.bus = &spi_bus_type,
.owner = THIS_MODULE,
},
@@ -418,85 +315,80 @@ static struct spi_driver wm8728_spi_driver = {
};
#endif /* CONFIG_SPI_MASTER */
-static int wm8728_probe(struct platform_device *pdev)
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static __devinit int wm8728_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct wm8728_setup_data *setup;
- struct snd_soc_codec *codec;
- int ret = 0;
+ struct wm8728_priv *wm8728;
+ int ret;
- setup = socdev->codec_data;
- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (codec == NULL)
+ wm8728 = kzalloc(sizeof(struct wm8728_priv), GFP_KERNEL);
+ if (wm8728 == NULL)
return -ENOMEM;
- socdev->card->codec = codec;
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
+ i2c_set_clientdata(i2c, wm8728);
+ wm8728->control_type = SND_SOC_I2C;
+
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8728, &wm8728_dai, 1);
+ if (ret < 0)
+ kfree(wm8728);
+ return ret;
+}
+
+static __devexit int wm8728_i2c_remove(struct i2c_client *client)
+{
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
+ return 0;
+}
- wm8728_socdev = socdev;
- ret = -ENODEV;
+static const struct i2c_device_id wm8728_i2c_id[] = {
+ { "wm8728", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, wm8728_i2c_id);
+
+static struct i2c_driver wm8728_i2c_driver = {
+ .driver = {
+ .name = "wm8728-codec",
+ .owner = THIS_MODULE,
+ },
+ .probe = wm8728_i2c_probe,
+ .remove = __devexit_p(wm8728_i2c_remove),
+ .id_table = wm8728_i2c_id,
+};
+#endif
+static int __init wm8728_modinit(void)
+{
+ int ret = 0;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
- if (setup->i2c_address) {
- ret = wm8728_add_i2c_device(pdev, setup);
+ ret = i2c_add_driver(&wm8728_i2c_driver);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register wm8728 I2C driver: %d\n",
+ ret);
}
#endif
#if defined(CONFIG_SPI_MASTER)
- if (setup->spi) {
- ret = spi_register_driver(&wm8728_spi_driver);
- if (ret != 0)
- printk(KERN_ERR "can't add spi driver");
+ ret = spi_register_driver(&wm8728_spi_driver);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register wm8728 SPI driver: %d\n",
+ ret);
}
#endif
-
- if (ret != 0)
- kfree(codec);
-
return ret;
}
+module_init(wm8728_modinit);
-/* power down chip */
-static int wm8728_remove(struct platform_device *pdev)
+static void __exit wm8728_exit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec->control_data)
- wm8728_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
- i2c_unregister_device(codec->control_data);
i2c_del_driver(&wm8728_i2c_driver);
#endif
#if defined(CONFIG_SPI_MASTER)
spi_unregister_driver(&wm8728_spi_driver);
#endif
- kfree(codec);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8728 = {
- .probe = wm8728_probe,
- .remove = wm8728_remove,
- .suspend = wm8728_suspend,
- .resume = wm8728_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8728);
-
-static int __init wm8728_modinit(void)
-{
- return snd_soc_register_dai(&wm8728_dai);
-}
-module_init(wm8728_modinit);
-
-static void __exit wm8728_exit(void)
-{
- snd_soc_unregister_dai(&wm8728_dai);
}
module_exit(wm8728_exit);
diff --git a/sound/soc/codecs/wm8728.h b/sound/soc/codecs/wm8728.h
index d269c132474b..8aea362ffd47 100644
--- a/sound/soc/codecs/wm8728.h
+++ b/sound/soc/codecs/wm8728.h
@@ -18,13 +18,4 @@
#define WM8728_DACCTL 0x02
#define WM8728_IFCTL 0x03
-struct wm8728_setup_data {
- int spi;
- int i2c_bus;
- unsigned short i2c_address;
-};
-
-extern struct snd_soc_dai wm8728_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8728;
-
#endif
diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c
index 0ab9b6355297..19844fc8cb1d 100644
--- a/sound/soc/codecs/wm8731.c
+++ b/sound/soc/codecs/wm8731.c
@@ -32,9 +32,6 @@
#include "wm8731.h"
-static struct snd_soc_codec *wm8731_codec;
-struct snd_soc_codec_device soc_codec_dev_wm8731;
-
#define WM8731_NUM_SUPPLIES 4
static const char *wm8731_supply_names[WM8731_NUM_SUPPLIES] = {
"AVDD",
@@ -45,7 +42,7 @@ static const char *wm8731_supply_names[WM8731_NUM_SUPPLIES] = {
/* codec private data */
struct wm8731_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
struct regulator_bulk_data supplies[WM8731_NUM_SUPPLIES];
u16 reg_cache[WM8731_CACHEREGNUM];
unsigned int sysclk;
@@ -222,9 +219,7 @@ static int wm8731_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = dai->codec;
struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec);
u16 iface = snd_soc_read(codec, WM8731_IFACE) & 0xfff3;
int i = get_coeff(wm8731->sysclk, params_rate(params));
@@ -252,9 +247,7 @@ static int wm8731_hw_params(struct snd_pcm_substream *substream,
static int wm8731_pcm_prepare(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = dai->codec;
/* set active */
snd_soc_write(codec, WM8731_ACTIVE, 0x0001);
@@ -265,9 +258,7 @@ static int wm8731_pcm_prepare(struct snd_pcm_substream *substream,
static void wm8731_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = dai->codec;
/* deactivate */
if (!codec->active) {
@@ -428,8 +419,8 @@ static struct snd_soc_dai_ops wm8731_dai_ops = {
.set_fmt = wm8731_set_dai_fmt,
};
-struct snd_soc_dai wm8731_dai = {
- .name = "WM8731",
+static struct snd_soc_dai_driver wm8731_dai = {
+ .name = "wm8731-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -445,24 +436,17 @@ struct snd_soc_dai wm8731_dai = {
.ops = &wm8731_dai_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(wm8731_dai);
#ifdef CONFIG_PM
-static int wm8731_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8731_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8731_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8731_resume(struct platform_device *pdev)
+static int wm8731_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8731_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
@@ -472,88 +456,17 @@ static int wm8731_resume(struct platform_device *pdev)
#define wm8731_resume NULL
#endif
-static int wm8731_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (wm8731_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = wm8731_codec;
- codec = wm8731_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
- snd_soc_add_controls(codec, wm8731_snd_controls,
- ARRAY_SIZE(wm8731_snd_controls));
- wm8731_add_widgets(codec);
-
- return ret;
-
-pcm_err:
- return ret;
-}
-
-/* power down chip */
-static int wm8731_remove(struct platform_device *pdev)
+static int wm8731_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8731 = {
- .probe = wm8731_probe,
- .remove = wm8731_remove,
- .suspend = wm8731_suspend,
- .resume = wm8731_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8731);
-
-static int wm8731_register(struct wm8731_priv *wm8731,
- enum snd_soc_control_type control)
-{
- int ret, i;
- struct snd_soc_codec *codec = &wm8731->codec;
-
- if (wm8731_codec) {
- dev_err(codec->dev, "Another WM8731 is registered\n");
- ret = -EINVAL;
- goto err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8731);
- codec->name = "WM8731";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8731_set_bias_level;
- codec->dai = &wm8731_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = WM8731_CACHEREGNUM;
- codec->reg_cache = &wm8731->reg_cache;
+ struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec);
+ int ret = 0, i;
- memcpy(codec->reg_cache, wm8731_reg, sizeof(wm8731_reg));
+ codec->bias_level = SND_SOC_BIAS_OFF,
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8731->control_type);
if (ret < 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
+ return ret;
}
for (i = 0; i < ARRAY_SIZE(wm8731->supplies); i++)
@@ -563,7 +476,7 @@ static int wm8731_register(struct wm8731_priv *wm8731,
wm8731->supplies);
if (ret != 0) {
dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
- goto err;
+ return ret;
}
ret = regulator_bulk_enable(ARRAY_SIZE(wm8731->supplies),
@@ -579,8 +492,6 @@ static int wm8731_register(struct wm8731_priv *wm8731,
goto err_regulator_enable;
}
- wm8731_dai.dev = codec->dev;
-
wm8731_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
/* Latch the update bits */
@@ -592,78 +503,78 @@ static int wm8731_register(struct wm8731_priv *wm8731,
/* Disable bypass path by default */
snd_soc_update_bits(codec, WM8731_APANA, 0x4, 0);
- wm8731_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err_regulator_enable;
- }
-
- ret = snd_soc_register_dai(&wm8731_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- snd_soc_unregister_codec(codec);
- goto err_codec;
- }
+ snd_soc_add_controls(codec, wm8731_snd_controls,
+ ARRAY_SIZE(wm8731_snd_controls));
+ wm8731_add_widgets(codec);
/* Regulators will have been enabled by bias management */
regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
return 0;
-err_codec:
- snd_soc_unregister_codec(codec);
err_regulator_enable:
regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
err_regulator_get:
regulator_bulk_free(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
-err:
+
kfree(wm8731);
return ret;
}
-static void wm8731_unregister(struct wm8731_priv *wm8731)
+/* power down chip */
+static int wm8731_remove(struct snd_soc_codec *codec)
{
- wm8731_set_bias_level(&wm8731->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dai(&wm8731_dai);
- snd_soc_unregister_codec(&wm8731->codec);
+ struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec);
+
+ wm8731_set_bias_level(codec, SND_SOC_BIAS_OFF);
+
+ regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
regulator_bulk_free(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
- kfree(wm8731);
- wm8731_codec = NULL;
+
+ return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_wm8731 = {
+ .probe = wm8731_probe,
+ .remove = wm8731_remove,
+ .suspend = wm8731_suspend,
+ .resume = wm8731_resume,
+ .set_bias_level = wm8731_set_bias_level,
+ .reg_cache_size = sizeof(wm8731_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8731_reg,
+};
+
#if defined(CONFIG_SPI_MASTER)
static int __devinit wm8731_spi_probe(struct spi_device *spi)
{
- struct snd_soc_codec *codec;
struct wm8731_priv *wm8731;
+ int ret;
wm8731 = kzalloc(sizeof(struct wm8731_priv), GFP_KERNEL);
if (wm8731 == NULL)
return -ENOMEM;
- codec = &wm8731->codec;
- codec->control_data = spi;
- codec->dev = &spi->dev;
-
- dev_set_drvdata(&spi->dev, wm8731);
+ wm8731->control_type = SND_SOC_SPI;
+ spi_set_drvdata(spi, wm8731);
- return wm8731_register(wm8731, SND_SOC_SPI);
+ ret = snd_soc_register_codec(&spi->dev,
+ &soc_codec_dev_wm8731, &wm8731_dai, 1);
+ if (ret < 0)
+ kfree(wm8731);
+ return ret;
}
static int __devexit wm8731_spi_remove(struct spi_device *spi)
{
- struct wm8731_priv *wm8731 = dev_get_drvdata(&spi->dev);
-
- wm8731_unregister(wm8731);
-
+ snd_soc_unregister_codec(&spi->dev);
+ kfree(spi_get_drvdata(spi));
return 0;
}
static struct spi_driver wm8731_spi_driver = {
.driver = {
- .name = "wm8731",
+ .name = "wm8731-codec",
.bus = &spi_bus_type,
.owner = THIS_MODULE,
},
@@ -677,26 +588,26 @@ static __devinit int wm8731_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct wm8731_priv *wm8731;
- struct snd_soc_codec *codec;
+ int ret;
wm8731 = kzalloc(sizeof(struct wm8731_priv), GFP_KERNEL);
if (wm8731 == NULL)
return -ENOMEM;
- codec = &wm8731->codec;
-
i2c_set_clientdata(i2c, wm8731);
- codec->control_data = i2c;
+ wm8731->control_type = SND_SOC_I2C;
- codec->dev = &i2c->dev;
-
- return wm8731_register(wm8731, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8731, &wm8731_dai, 1);
+ if (ret < 0)
+ kfree(wm8731);
+ return ret;
}
static __devexit int wm8731_i2c_remove(struct i2c_client *client)
{
- struct wm8731_priv *wm8731 = i2c_get_clientdata(client);
- wm8731_unregister(wm8731);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -708,7 +619,7 @@ MODULE_DEVICE_TABLE(i2c, wm8731_i2c_id);
static struct i2c_driver wm8731_i2c_driver = {
.driver = {
- .name = "wm8731",
+ .name = "wm8731-codec",
.owner = THIS_MODULE,
},
.probe = wm8731_i2c_probe,
@@ -719,7 +630,7 @@ static struct i2c_driver wm8731_i2c_driver = {
static int __init wm8731_modinit(void)
{
- int ret;
+ int ret = 0;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8731_i2c_driver);
if (ret != 0) {
@@ -734,7 +645,7 @@ static int __init wm8731_modinit(void)
ret);
}
#endif
- return 0;
+ return ret;
}
module_init(wm8731_modinit);
diff --git a/sound/soc/codecs/wm8731.h b/sound/soc/codecs/wm8731.h
index cd7b806e8ad0..73a70e206ba9 100644
--- a/sound/soc/codecs/wm8731.h
+++ b/sound/soc/codecs/wm8731.h
@@ -34,7 +34,4 @@
#define WM8731_SYSCLK 0
#define WM8731_DAI 0
-extern struct snd_soc_dai wm8731_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8731;
-
#endif
diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c
index b9ea8904ad4b..782fe539662b 100644
--- a/sound/soc/codecs/wm8741.c
+++ b/sound/soc/codecs/wm8741.c
@@ -30,9 +30,6 @@
#include "wm8741.h"
-static struct snd_soc_codec *wm8741_codec;
-struct snd_soc_codec_device soc_codec_dev_wm8741;
-
#define WM8741_NUM_SUPPLIES 2
static const char *wm8741_supply_names[WM8741_NUM_SUPPLIES] = {
"AVDD",
@@ -43,7 +40,7 @@ static const char *wm8741_supply_names[WM8741_NUM_SUPPLIES] = {
/* codec private data */
struct wm8741_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
u16 reg_cache[WM8741_REGISTER_COUNT];
struct regulator_bulk_data supplies[WM8741_NUM_SUPPLIES];
unsigned int sysclk;
@@ -145,8 +142,7 @@ static int wm8741_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec);
u16 iface = snd_soc_read(codec, WM8741_FORMAT_CONTROL) & 0x1FC;
int i;
@@ -314,7 +310,7 @@ static struct snd_soc_dai_ops wm8741_dai_ops = {
.set_fmt = wm8741_set_dai_fmt,
};
-struct snd_soc_dai wm8741_dai = {
+static struct snd_soc_dai_driver wm8741_dai = {
.name = "WM8741",
.playback = {
.stream_name = "Playback",
@@ -325,13 +321,10 @@ struct snd_soc_dai wm8741_dai = {
},
.ops = &wm8741_dai_ops,
};
-EXPORT_SYMBOL_GPL(wm8741_dai);
#ifdef CONFIG_PM
-static int wm8741_resume(struct platform_device *pdev)
+static int wm8741_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
u16 *cache = codec->reg_cache;
int i;
@@ -348,189 +341,103 @@ static int wm8741_resume(struct platform_device *pdev)
#define wm8741_resume NULL
#endif
-static int wm8741_probe(struct platform_device *pdev)
+static int wm8741_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
+ struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec);
int ret = 0;
- if (wm8741_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8741->control_type);
+ if (ret != 0) {
+ dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
+ return ret;
}
- socdev->card->codec = wm8741_codec;
- codec = wm8741_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
+ ret = wm8741_reset(codec);
if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
+ dev_err(codec->dev, "Failed to issue reset\n");
+ return ret;
}
+ /* Change some default settings - latch VU */
+ wm8741->reg_cache[WM8741_DACLLSB_ATTENUATION] |= WM8741_UPDATELL;
+ wm8741->reg_cache[WM8741_DACLMSB_ATTENUATION] |= WM8741_UPDATELM;
+ wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERL;
+ wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERM;
+
snd_soc_add_controls(codec, wm8741_snd_controls,
ARRAY_SIZE(wm8741_snd_controls));
wm8741_add_widgets(codec);
+ dev_dbg(codec->dev, "Successful registration\n");
return ret;
-
-pcm_err:
- return ret;
-}
-
-static int wm8741_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
}
-struct snd_soc_codec_device soc_codec_dev_wm8741 = {
+static struct snd_soc_codec_driver soc_codec_dev_wm8741 = {
.probe = wm8741_probe,
- .remove = wm8741_remove,
.resume = wm8741_resume,
+ .reg_cache_size = sizeof(wm8741_reg_defaults),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = &wm8741_reg_defaults,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8741);
-static int wm8741_register(struct wm8741_priv *wm8741,
- enum snd_soc_control_type control)
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static int wm8741_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
{
- int ret;
- struct snd_soc_codec *codec = &wm8741->codec;
- int i;
-
- if (wm8741_codec) {
- dev_err(codec->dev, "Another WM8741 is registered\n");
- return -EINVAL;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
+ struct wm8741_priv *wm8741;
+ int ret, i;
- snd_soc_codec_set_drvdata(codec, wm8741);
- codec->name = "WM8741";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = NULL;
- codec->dai = &wm8741_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = WM8741_REGISTER_COUNT;
- codec->reg_cache = &wm8741->reg_cache;
+ wm8741 = kzalloc(sizeof(struct wm8741_priv), GFP_KERNEL);
+ if (wm8741 == NULL)
+ return -ENOMEM;
wm8741->rate_constraint.list = &wm8741->rate_constraint_list[0];
wm8741->rate_constraint.count =
ARRAY_SIZE(wm8741->rate_constraint_list);
- memcpy(codec->reg_cache, wm8741_reg_defaults,
- sizeof(wm8741->reg_cache));
-
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
- }
-
for (i = 0; i < ARRAY_SIZE(wm8741->supplies); i++)
wm8741->supplies[i].supply = wm8741_supply_names[i];
- ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8741->supplies),
+ ret = regulator_bulk_get(&i2c->dev, ARRAY_SIZE(wm8741->supplies),
wm8741->supplies);
if (ret != 0) {
- dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
+ dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
goto err;
}
ret = regulator_bulk_enable(ARRAY_SIZE(wm8741->supplies),
wm8741->supplies);
if (ret != 0) {
- dev_err(codec->dev, "Failed to enable supplies: %d\n", ret);
+ dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
goto err_get;
}
- ret = wm8741_reset(codec);
- if (ret < 0) {
- dev_err(codec->dev, "Failed to issue reset\n");
- goto err_enable;
- }
-
- wm8741_dai.dev = codec->dev;
-
- /* Change some default settings - latch VU */
- wm8741->reg_cache[WM8741_DACLLSB_ATTENUATION] |= WM8741_UPDATELL;
- wm8741->reg_cache[WM8741_DACLMSB_ATTENUATION] |= WM8741_UPDATELM;
- wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERL;
- wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERM;
-
- wm8741_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- return ret;
- }
-
- ret = snd_soc_register_dai(&wm8741_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- snd_soc_unregister_codec(codec);
- return ret;
- }
+ i2c_set_clientdata(i2c, wm8741);
+ wm8741->control_type = SND_SOC_I2C;
- dev_dbg(codec->dev, "Successful registration\n");
- return 0;
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8741, &wm8741_dai, 1);
+ if (ret < 0)
+ goto err_enable;
+ return ret;
err_enable:
regulator_bulk_disable(ARRAY_SIZE(wm8741->supplies), wm8741->supplies);
err_get:
regulator_bulk_free(ARRAY_SIZE(wm8741->supplies), wm8741->supplies);
-
err:
kfree(wm8741);
return ret;
}
-static void wm8741_unregister(struct wm8741_priv *wm8741)
-{
- regulator_bulk_free(ARRAY_SIZE(wm8741->supplies), wm8741->supplies);
-
- snd_soc_unregister_dai(&wm8741_dai);
- snd_soc_unregister_codec(&wm8741->codec);
- kfree(wm8741);
- wm8741_codec = NULL;
-}
-
-#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
-static __devinit int wm8741_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
-{
- struct wm8741_priv *wm8741;
- struct snd_soc_codec *codec;
-
- wm8741 = kzalloc(sizeof(struct wm8741_priv), GFP_KERNEL);
- if (wm8741 == NULL)
- return -ENOMEM;
-
- codec = &wm8741->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
-
- i2c_set_clientdata(i2c, wm8741);
- codec->control_data = i2c;
-
- codec->dev = &i2c->dev;
-
- return wm8741_register(wm8741, SND_SOC_I2C);
-}
-
-static __devexit int wm8741_i2c_remove(struct i2c_client *client)
+static int wm8741_i2c_remove(struct i2c_client *client)
{
struct wm8741_priv *wm8741 = i2c_get_clientdata(client);
- wm8741_unregister(wm8741);
+
+ snd_soc_unregister_codec(&client->dev);
+ regulator_bulk_free(ARRAY_SIZE(wm8741->supplies), wm8741->supplies);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -540,29 +447,29 @@ static const struct i2c_device_id wm8741_i2c_id[] = {
};
MODULE_DEVICE_TABLE(i2c, wm8741_i2c_id);
-
static struct i2c_driver wm8741_i2c_driver = {
.driver = {
- .name = "WM8741",
+ .name = "wm8741-codec",
.owner = THIS_MODULE,
},
.probe = wm8741_i2c_probe,
- .remove = __devexit_p(wm8741_i2c_remove),
+ .remove = wm8741_i2c_remove,
.id_table = wm8741_i2c_id,
};
#endif
static int __init wm8741_modinit(void)
{
- int ret;
+ int ret = 0;
+
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8741_i2c_driver);
if (ret != 0) {
- printk(KERN_ERR "Failed to register WM8741 I2C driver: %d\n",
- ret);
+ pr_err("Failed to register WM8741 I2C driver: %d\n", ret);
}
#endif
- return 0;
+
+ return ret;
}
module_init(wm8741_modinit);
diff --git a/sound/soc/codecs/wm8741.h b/sound/soc/codecs/wm8741.h
index fdef6ecd1f6f..56c1b1d4a681 100644
--- a/sound/soc/codecs/wm8741.h
+++ b/sound/soc/codecs/wm8741.h
@@ -208,7 +208,4 @@
#define WM8741_SYSCLK 0
-extern struct snd_soc_dai wm8741_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8741;
-
#endif
diff --git a/sound/soc/codecs/wm8750.c b/sound/soc/codecs/wm8750.c
index e2c05e3e323a..92d4b2aef93b 100644
--- a/sound/soc/codecs/wm8750.c
+++ b/sound/soc/codecs/wm8750.c
@@ -52,7 +52,7 @@ static const u16 wm8750_reg[] = {
/* codec private data */
struct wm8750_priv {
unsigned int sysclk;
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
u16 reg_cache[ARRAY_SIZE(wm8750_reg)];
};
@@ -560,8 +560,7 @@ static int wm8750_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct wm8750_priv *wm8750 = snd_soc_codec_get_drvdata(codec);
u16 iface = snd_soc_read(codec, WM8750_IFACE) & 0x1f3;
u16 srate = snd_soc_read(codec, WM8750_SRATE) & 0x1c0;
@@ -649,8 +648,8 @@ static struct snd_soc_dai_ops wm8750_dai_ops = {
.set_sysclk = wm8750_set_dai_sysclk,
};
-struct snd_soc_dai wm8750_dai = {
- .name = "WM8750",
+static struct snd_soc_dai_driver wm8750_dai = {
+ .name = "wm8750-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -665,21 +664,15 @@ struct snd_soc_dai wm8750_dai = {
.formats = WM8750_FORMATS,},
.ops = &wm8750_dai_ops,
};
-EXPORT_SYMBOL_GPL(wm8750_dai);
-static int wm8750_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8750_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8750_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8750_resume(struct platform_device *pdev)
+static int wm8750_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
u8 data[2];
u16 *cache = codec->reg_cache;
@@ -698,100 +691,21 @@ static int wm8750_resume(struct platform_device *pdev)
return 0;
}
-static struct snd_soc_codec *wm8750_codec;
-
-static int wm8750_probe(struct platform_device *pdev)
+static int wm8750_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (!wm8750_codec) {
- dev_err(&pdev->dev, "WM8750 codec not yet registered\n");
- return -EINVAL;
- }
-
- socdev->card->codec = wm8750_codec;
- codec = wm8750_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "wm8750: failed to create pcms\n");
- goto err;
- }
-
- snd_soc_add_controls(codec, wm8750_snd_controls,
- ARRAY_SIZE(wm8750_snd_controls));
- wm8750_add_widgets(codec);
-
- return 0;
-
-err:
- return ret;
-}
-
-/* power down chip */
-static int wm8750_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8750 = {
- .probe = wm8750_probe,
- .remove = wm8750_remove,
- .suspend = wm8750_suspend,
- .resume = wm8750_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8750);
-
-/*
- * initialise the WM8750 driver
- * register the mixer and dsp interfaces with the kernel
- */
-static int wm8750_register(struct wm8750_priv *wm8750,
- enum snd_soc_control_type control)
-{
- struct snd_soc_codec *codec = &wm8750->codec;
- int reg, ret = 0;
-
- if (wm8750_codec) {
- dev_err(codec->dev, "Multiple WM8750 devices not supported\n");
- ret = -EINVAL;
- goto err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->name = "WM8750";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_STANDBY;
- codec->set_bias_level = wm8750_set_bias_level;
- codec->dai = &wm8750_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = ARRAY_SIZE(wm8750->reg_cache) + 1;
- codec->reg_cache = &wm8750->reg_cache;
- snd_soc_codec_set_drvdata(codec, wm8750);
-
- memcpy(codec->reg_cache, wm8750_reg, sizeof(wm8750->reg_cache));
+ struct wm8750_priv *wm8750 = snd_soc_codec_get_drvdata(codec);
+ int reg, ret;
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8750->control_type);
if (ret < 0) {
printk(KERN_ERR "wm8750: failed to set cache I/O: %d\n", ret);
- goto err;
+ return ret;
}
ret = wm8750_reset(codec);
if (ret < 0) {
printk(KERN_ERR "wm8750: failed to reset: %d\n", ret);
- goto err;
+ return ret;
}
/* charge output caps */
@@ -815,150 +729,131 @@ static int wm8750_register(struct wm8750_priv *wm8750,
reg = snd_soc_read(codec, WM8750_RINVOL);
snd_soc_write(codec, WM8750_RINVOL, reg | 0x0100);
- wm8750_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
-
- ret = snd_soc_register_dais(&wm8750_dai, 1);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAIs: %d\n", ret);
- goto err_codec;
- }
-
- return 0;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- kfree(wm8750);
+ snd_soc_add_controls(codec, wm8750_snd_controls,
+ ARRAY_SIZE(wm8750_snd_controls));
+ wm8750_add_widgets(codec);
return ret;
}
-static void wm8750_unregister(struct wm8750_priv *wm8750)
+static int wm8750_remove(struct snd_soc_codec *codec)
{
- wm8750_set_bias_level(&wm8750->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dais(&wm8750_dai, 1);
- snd_soc_unregister_codec(&wm8750->codec);
- kfree(wm8750);
- wm8750_codec = NULL;
+ wm8750_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
}
-#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
-
-/*
- * WM8750 2 wire address is determined by GPIO5
- * state during powerup.
- * low = 0x1a
- * high = 0x1b
- */
+static struct snd_soc_codec_driver soc_codec_dev_wm8750 = {
+ .probe = wm8750_probe,
+ .remove = wm8750_remove,
+ .suspend = wm8750_suspend,
+ .resume = wm8750_resume,
+ .set_bias_level = wm8750_set_bias_level,
+ .reg_cache_size = sizeof(wm8750_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8750_reg,
+};
-static int wm8750_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+#if defined(CONFIG_SPI_MASTER)
+static int __devinit wm8750_spi_probe(struct spi_device *spi)
{
- struct snd_soc_codec *codec;
struct wm8750_priv *wm8750;
+ int ret;
wm8750 = kzalloc(sizeof(struct wm8750_priv), GFP_KERNEL);
if (wm8750 == NULL)
return -ENOMEM;
- codec = &wm8750->codec;
- codec->control_data = i2c;
- i2c_set_clientdata(i2c, wm8750);
-
- codec->dev = &i2c->dev;
+ wm8750->control_type = SND_SOC_SPI;
+ spi_set_drvdata(spi, wm8750);
- return wm8750_register(wm8750, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&spi->dev,
+ &soc_codec_dev_wm8750, &wm8750_dai, 1);
+ if (ret < 0)
+ kfree(wm8750);
+ return ret;
}
-static int wm8750_i2c_remove(struct i2c_client *client)
+static int __devexit wm8750_spi_remove(struct spi_device *spi)
{
- struct wm8750_priv *wm8750 = i2c_get_clientdata(client);
- wm8750_unregister(wm8750);
+ snd_soc_unregister_codec(&spi->dev);
+ kfree(spi_get_drvdata(spi));
return 0;
}
-static const struct i2c_device_id wm8750_i2c_id[] = {
- { "wm8750", 0 },
- { "wm8987", 0 }, /* WM8987 is register compatible with WM8750 */
- { }
-};
-MODULE_DEVICE_TABLE(i2c, wm8750_i2c_id);
-
-static struct i2c_driver wm8750_i2c_driver = {
+static struct spi_driver wm8750_spi_driver = {
.driver = {
- .name = "WM8750 I2C Codec",
- .owner = THIS_MODULE,
+ .name = "wm8750-codec",
+ .bus = &spi_bus_type,
+ .owner = THIS_MODULE,
},
- .probe = wm8750_i2c_probe,
- .remove = wm8750_i2c_remove,
- .id_table = wm8750_i2c_id,
+ .probe = wm8750_spi_probe,
+ .remove = __devexit_p(wm8750_spi_remove),
};
-#endif
+#endif /* CONFIG_SPI_MASTER */
-#if defined(CONFIG_SPI_MASTER)
-static int __devinit wm8750_spi_probe(struct spi_device *spi)
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static __devinit int wm8750_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
{
- struct snd_soc_codec *codec;
struct wm8750_priv *wm8750;
+ int ret;
wm8750 = kzalloc(sizeof(struct wm8750_priv), GFP_KERNEL);
if (wm8750 == NULL)
return -ENOMEM;
- codec = &wm8750->codec;
- codec->control_data = spi;
- codec->dev = &spi->dev;
-
- dev_set_drvdata(&spi->dev, wm8750);
+ i2c_set_clientdata(i2c, wm8750);
+ wm8750->control_type = SND_SOC_I2C;
- return wm8750_register(wm8750, SND_SOC_SPI);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8750, &wm8750_dai, 1);
+ if (ret < 0)
+ kfree(wm8750);
+ return ret;
}
-static int __devexit wm8750_spi_remove(struct spi_device *spi)
+static __devexit int wm8750_i2c_remove(struct i2c_client *client)
{
- struct wm8750_priv *wm8750 = dev_get_drvdata(&spi->dev);
- wm8750_unregister(wm8750);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
-static const struct spi_device_id wm8750_spi_id[] = {
+static const struct i2c_device_id wm8750_i2c_id[] = {
{ "wm8750", 0 },
{ "wm8987", 0 },
{ }
};
-MODULE_DEVICE_TABLE(spi, wm8750_spi_id);
+MODULE_DEVICE_TABLE(i2c, wm8750_i2c_id);
-static struct spi_driver wm8750_spi_driver = {
+static struct i2c_driver wm8750_i2c_driver = {
.driver = {
- .name = "WM8750 SPI Codec",
- .bus = &spi_bus_type,
- .owner = THIS_MODULE,
+ .name = "wm8750-codec",
+ .owner = THIS_MODULE,
},
- .probe = wm8750_spi_probe,
- .remove = __devexit_p(wm8750_spi_remove),
- .id_table = wm8750_spi_id,
+ .probe = wm8750_i2c_probe,
+ .remove = __devexit_p(wm8750_i2c_remove),
+ .id_table = wm8750_i2c_id,
};
#endif
static int __init wm8750_modinit(void)
{
- int ret;
+ int ret = 0;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8750_i2c_driver);
- if (ret != 0)
- pr_err("Failed to register WM8750 I2C driver: %d\n", ret);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register wm8750 I2C driver: %d\n",
+ ret);
+ }
#endif
#if defined(CONFIG_SPI_MASTER)
ret = spi_register_driver(&wm8750_spi_driver);
- if (ret != 0)
- pr_err("Failed to register WM8750 SPI driver: %d\n", ret);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register wm8750 SPI driver: %d\n",
+ ret);
+ }
#endif
- return 0;
+ return ret;
}
module_init(wm8750_modinit);
diff --git a/sound/soc/codecs/wm8750.h b/sound/soc/codecs/wm8750.h
index 1dc100e19cfe..121427c047fb 100644
--- a/sound/soc/codecs/wm8750.h
+++ b/sound/soc/codecs/wm8750.h
@@ -57,13 +57,4 @@
#define WM8750_SYSCLK 0
-struct wm8750_setup_data {
- int spi;
- int i2c_bus;
- unsigned short i2c_address;
-};
-
-extern struct snd_soc_dai wm8750_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8750;
-
#endif
diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c
index b59f349c5218..484423248c26 100644
--- a/sound/soc/codecs/wm8753.c
+++ b/sound/soc/codecs/wm8753.c
@@ -57,7 +57,7 @@ module_param(caps_charge, int, 0);
MODULE_PARM_DESC(caps_charge, "WM8753 cap charge time (msecs)");
static void wm8753_set_dai_mode(struct snd_soc_codec *codec,
- unsigned int mode);
+ struct snd_soc_dai *dai, unsigned int hifi);
/*
* wm8753 register cache
@@ -85,10 +85,11 @@ static const u16 wm8753_reg[] = {
/* codec private data */
struct wm8753_priv {
+ enum snd_soc_control_type control_type;
unsigned int sysclk;
unsigned int pcmclk;
- struct snd_soc_codec codec;
u16 reg_cache[ARRAY_SIZE(wm8753_reg)];
+ int dai_func;
};
/*
@@ -228,6 +229,7 @@ static int wm8753_set_dai(struct snd_kcontrol *kcontrol,
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
int mode = wm8753_read_reg_cache(codec, WM8753_IOCTL);
+ struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
if (((mode & 0xc) >> 2) == ucontrol->value.integer.value[0])
return 0;
@@ -235,8 +237,7 @@ static int wm8753_set_dai(struct snd_kcontrol *kcontrol,
mode &= 0xfff3;
mode |= (ucontrol->value.integer.value[0] << 2);
- wm8753_write(codec, WM8753_IOCTL, mode);
- wm8753_set_dai_mode(codec, ucontrol->value.integer.value[0]);
+ wm8753->dai_func = ucontrol->value.integer.value[0];
return 1;
}
@@ -904,6 +905,13 @@ static int wm8753_vdac_adc_set_dai_fmt(struct snd_soc_dai *codec_dai,
return 0;
}
+static int wm8753_pcm_startup(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ wm8753_set_dai_mode(dai->codec, dai, 0);
+ return 0;
+}
+
/*
* Set PCM DAI bit size and sample rate.
*/
@@ -912,8 +920,7 @@ static int wm8753_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
u16 voice = wm8753_read_reg_cache(codec, WM8753_PCM) & 0x01f3;
u16 srate = wm8753_read_reg_cache(codec, WM8753_SRATE1) & 0x017f;
@@ -1138,6 +1145,13 @@ static int wm8753_i2s_set_dai_fmt(struct snd_soc_dai *codec_dai,
return 0;
}
+static int wm8753_i2s_startup(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ wm8753_set_dai_mode(dai->codec, dai, 1);
+ return 0;
+}
+
/*
* Set PCM DAI bit size and sample rate.
*/
@@ -1146,8 +1160,7 @@ static int wm8753_i2s_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
u16 srate = wm8753_read_reg_cache(codec, WM8753_SRATE1) & 0x01c0;
u16 hifi = wm8753_read_reg_cache(codec, WM8753_HIFI) & 0x01f3;
@@ -1240,12 +1253,12 @@ static int wm8753_mute(struct snd_soc_dai *dai, int mute)
{
struct snd_soc_codec *codec = dai->codec;
u16 mute_reg = wm8753_read_reg_cache(codec, WM8753_DAC) & 0xfff7;
+ struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
/* the digital mute covers the HiFi and Voice DAC's on the WM8753.
* make sure we check if they are not both active when we mute */
- if (mute && dai->id == 1) {
- if (!wm8753_dai[WM8753_DAI_VOICE].playback.active ||
- !wm8753_dai[WM8753_DAI_HIFI].playback.active)
+ if (mute && wm8753->dai_func == 1) {
+ if (!codec->active)
wm8753_write(codec, WM8753_DAC, mute_reg | 0x8);
} else {
if (mute)
@@ -1303,6 +1316,7 @@ static int wm8753_set_bias_level(struct snd_soc_codec *codec,
* 4. Voice disabled - HIFI over HIFI, uses voice DAI LRC for capture
*/
static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode1 = {
+ .startup = wm8753_i2s_startup,
.hw_params = wm8753_i2s_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode1h_set_dai_fmt,
@@ -1312,6 +1326,7 @@ static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode1 = {
};
static struct snd_soc_dai_ops wm8753_dai_ops_voice_mode1 = {
+ .startup = wm8753_pcm_startup,
.hw_params = wm8753_pcm_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode1v_set_dai_fmt,
@@ -1321,6 +1336,7 @@ static struct snd_soc_dai_ops wm8753_dai_ops_voice_mode1 = {
};
static struct snd_soc_dai_ops wm8753_dai_ops_voice_mode2 = {
+ .startup = wm8753_pcm_startup,
.hw_params = wm8753_pcm_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode2_set_dai_fmt,
@@ -1330,6 +1346,7 @@ static struct snd_soc_dai_ops wm8753_dai_ops_voice_mode2 = {
};
static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode3 = {
+ .startup = wm8753_i2s_startup,
.hw_params = wm8753_i2s_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode3_4_set_dai_fmt,
@@ -1339,6 +1356,7 @@ static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode3 = {
};
static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode4 = {
+ .startup = wm8753_i2s_startup,
.hw_params = wm8753_i2s_hw_params,
.digital_mute = wm8753_mute,
.set_fmt = wm8753_mode3_4_set_dai_fmt,
@@ -1347,10 +1365,9 @@ static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode4 = {
.set_sysclk = wm8753_set_dai_sysclk,
};
-static const struct snd_soc_dai wm8753_all_dai[] = {
+static struct snd_soc_dai_driver wm8753_all_dai[] = {
/* DAI HiFi mode 1 */
-{ .name = "WM8753 HiFi",
- .id = 1,
+{ .name = "wm8753-hifi",
.playback = {
.stream_name = "HiFi Playback",
.channels_min = 1,
@@ -1366,8 +1383,7 @@ static const struct snd_soc_dai wm8753_all_dai[] = {
.ops = &wm8753_dai_ops_hifi_mode1,
},
/* DAI Voice mode 1 */
-{ .name = "WM8753 Voice",
- .id = 1,
+{ .name = "wm8753-voice",
.playback = {
.stream_name = "Voice Playback",
.channels_min = 1,
@@ -1383,12 +1399,10 @@ static const struct snd_soc_dai wm8753_all_dai[] = {
.ops = &wm8753_dai_ops_voice_mode1,
},
/* DAI HiFi mode 2 - dummy */
-{ .name = "WM8753 HiFi",
- .id = 2,
+{ .name = "wm8753-hifi",
},
/* DAI Voice mode 2 */
-{ .name = "WM8753 Voice",
- .id = 2,
+{ .name = "wm8753-voice",
.playback = {
.stream_name = "Voice Playback",
.channels_min = 1,
@@ -1404,8 +1418,7 @@ static const struct snd_soc_dai wm8753_all_dai[] = {
.ops = &wm8753_dai_ops_voice_mode2,
},
/* DAI HiFi mode 3 */
-{ .name = "WM8753 HiFi",
- .id = 3,
+{ .name = "wm8753-hifi",
.playback = {
.stream_name = "HiFi Playback",
.channels_min = 1,
@@ -1421,12 +1434,10 @@ static const struct snd_soc_dai wm8753_all_dai[] = {
.ops = &wm8753_dai_ops_hifi_mode3,
},
/* DAI Voice mode 3 - dummy */
-{ .name = "WM8753 Voice",
- .id = 3,
+{ .name = "wm8753-voice",
},
/* DAI HiFi mode 4 */
-{ .name = "WM8753 HiFi",
- .id = 4,
+{ .name = "wm8753-hifi",
.playback = {
.stream_name = "HiFi Playback",
.channels_min = 1,
@@ -1442,58 +1453,31 @@ static const struct snd_soc_dai wm8753_all_dai[] = {
.ops = &wm8753_dai_ops_hifi_mode4,
},
/* DAI Voice mode 4 - dummy */
-{ .name = "WM8753 Voice",
- .id = 4,
+{ .name = "wm8753-voice",
},
};
-struct snd_soc_dai wm8753_dai[] = {
+static struct snd_soc_dai_driver wm8753_dai[] = {
{
- .name = "WM8753 DAI 0",
+ .name = "wm8753-aif0",
},
{
- .name = "WM8753 DAI 1",
+ .name = "wm8753-aif1",
},
};
-EXPORT_SYMBOL_GPL(wm8753_dai);
-static void wm8753_set_dai_mode(struct snd_soc_codec *codec, unsigned int mode)
+static void wm8753_set_dai_mode(struct snd_soc_codec *codec,
+ struct snd_soc_dai *dai, unsigned int hifi)
{
- if (mode < 4) {
- int playback_active, capture_active, codec_active, pop_wait;
- void *private_data;
- struct list_head list;
-
- playback_active = wm8753_dai[0].playback.active;
- capture_active = wm8753_dai[0].capture.active;
- codec_active = wm8753_dai[0].active;
- private_data = wm8753_dai[0].private_data;
- pop_wait = wm8753_dai[0].pop_wait;
- list = wm8753_dai[0].list;
- wm8753_dai[0] = wm8753_all_dai[mode << 1];
- wm8753_dai[0].playback.active = playback_active;
- wm8753_dai[0].capture.active = capture_active;
- wm8753_dai[0].active = codec_active;
- wm8753_dai[0].private_data = private_data;
- wm8753_dai[0].pop_wait = pop_wait;
- wm8753_dai[0].list = list;
-
- playback_active = wm8753_dai[1].playback.active;
- capture_active = wm8753_dai[1].capture.active;
- codec_active = wm8753_dai[1].active;
- private_data = wm8753_dai[1].private_data;
- pop_wait = wm8753_dai[1].pop_wait;
- list = wm8753_dai[1].list;
- wm8753_dai[1] = wm8753_all_dai[(mode << 1) + 1];
- wm8753_dai[1].playback.active = playback_active;
- wm8753_dai[1].capture.active = capture_active;
- wm8753_dai[1].active = codec_active;
- wm8753_dai[1].private_data = private_data;
- wm8753_dai[1].pop_wait = pop_wait;
- wm8753_dai[1].list = list;
+ struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
+
+ if (wm8753->dai_func < 4) {
+ if (hifi)
+ dai->driver = &wm8753_all_dai[wm8753->dai_func << 1];
+ else
+ dai->driver = &wm8753_all_dai[(wm8753->dai_func << 1) + 1];
}
- wm8753_dai[0].codec = codec;
- wm8753_dai[1].codec = codec;
+ wm8753_write(codec, WM8753_IOCTL, wm8753->dai_func);
}
static void wm8753_work(struct work_struct *work)
@@ -1503,19 +1487,14 @@ static void wm8753_work(struct work_struct *work)
wm8753_set_bias_level(codec, codec->bias_level);
}
-static int wm8753_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8753_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8753_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8753_resume(struct platform_device *pdev)
+static int wm8753_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
u8 data[2];
u16 *cache = codec->reg_cache;
@@ -1547,41 +1526,6 @@ static int wm8753_resume(struct platform_device *pdev)
return 0;
}
-static struct snd_soc_codec *wm8753_codec;
-
-static int wm8753_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (!wm8753_codec) {
- dev_err(&pdev->dev, "WM8753 codec not yet registered\n");
- return -EINVAL;
- }
-
- socdev->card->codec = wm8753_codec;
- codec = wm8753_codec;
-
- wm8753_set_dai_mode(codec, 0);
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "wm8753: failed to create pcms\n");
- goto pcm_err;
- }
-
- snd_soc_add_controls(codec, wm8753_snd_controls,
- ARRAY_SIZE(wm8753_snd_controls));
- wm8753_add_widgets(codec);
-
- return 0;
-
-pcm_err:
- return ret;
-}
-
/*
* This function forces any delayed work to be queued and run.
*/
@@ -1601,62 +1545,29 @@ static int run_delayed_work(struct delayed_work *dwork)
return ret;
}
-/* power down chip */
-static int wm8753_remove(struct platform_device *pdev)
+static int wm8753_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8753 = {
- .probe = wm8753_probe,
- .remove = wm8753_remove,
- .suspend = wm8753_suspend,
- .resume = wm8753_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8753);
+ struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
+ int ret = 0, reg;
-static int wm8753_register(struct wm8753_priv *wm8753)
-{
- int ret, i;
- struct snd_soc_codec *codec = &wm8753->codec;
- u16 reg;
+ codec->bias_level = SND_SOC_BIAS_OFF;
+ INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work);
- if (wm8753_codec) {
- dev_err(codec->dev, "Multiple WM8753 devices not supported\n");
- ret = -EINVAL;
- goto err;
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8753->control_type);
+ if (ret < 0) {
+ dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
+ return ret;
}
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->name = "WM8753";
- codec->owner = THIS_MODULE;
- codec->read = wm8753_read_reg_cache;
- codec->write = wm8753_write;
- codec->bias_level = SND_SOC_BIAS_STANDBY;
- codec->set_bias_level = wm8753_set_bias_level;
- codec->dai = wm8753_dai;
- codec->num_dai = 2;
- codec->reg_cache_size = ARRAY_SIZE(wm8753->reg_cache) + 1;
- codec->reg_cache = &wm8753->reg_cache;
- snd_soc_codec_set_drvdata(codec, wm8753);
-
- memcpy(codec->reg_cache, wm8753_reg, sizeof(wm8753->reg_cache));
- INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work);
-
ret = wm8753_reset(codec);
if (ret < 0) {
- dev_err(codec->dev, "Failed to issue reset\n");
- goto err;
+ dev_err(codec->dev, "Failed to issue reset: %d\n", ret);
+ return ret;
}
+ wm8753_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+ wm8753->dai_func = 0;
+
/* charge output caps */
wm8753_set_bias_level(codec, SND_SOC_BIAS_PREPARE);
schedule_delayed_work(&codec->delayed_work,
@@ -1684,165 +1595,137 @@ static int wm8753_register(struct wm8753_priv *wm8753)
reg = wm8753_read_reg_cache(codec, WM8753_RINVOL);
wm8753_write(codec, WM8753_RINVOL, reg | 0x0100);
- wm8753_codec = codec;
-
- for (i = 0; i < ARRAY_SIZE(wm8753_dai); i++)
- wm8753_dai[i].dev = codec->dev;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
-
- ret = snd_soc_register_dais(&wm8753_dai[0], ARRAY_SIZE(wm8753_dai));
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAIs: %d\n", ret);
- goto err_codec;
- }
+ snd_soc_add_controls(codec, wm8753_snd_controls,
+ ARRAY_SIZE(wm8753_snd_controls));
+ wm8753_add_widgets(codec);
return 0;
-err_codec:
run_delayed_work(&codec->delayed_work);
- snd_soc_unregister_codec(codec);
-err:
- kfree(wm8753);
return ret;
}
-static void wm8753_unregister(struct wm8753_priv *wm8753)
+/* power down chip */
+static int wm8753_remove(struct snd_soc_codec *codec)
{
- wm8753_set_bias_level(&wm8753->codec, SND_SOC_BIAS_OFF);
- run_delayed_work(&wm8753->codec.delayed_work);
- snd_soc_unregister_dais(&wm8753_dai[0], ARRAY_SIZE(wm8753_dai));
- snd_soc_unregister_codec(&wm8753->codec);
- kfree(wm8753);
- wm8753_codec = NULL;
+ run_delayed_work(&codec->delayed_work);
+ wm8753_set_bias_level(codec, SND_SOC_BIAS_OFF);
+
+ return 0;
}
-#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static struct snd_soc_codec_driver soc_codec_dev_wm8753 = {
+ .probe = wm8753_probe,
+ .remove = wm8753_remove,
+ .suspend = wm8753_suspend,
+ .resume = wm8753_resume,
+ .set_bias_level = wm8753_set_bias_level,
+ .reg_cache_size = sizeof(wm8753_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8753_reg,
+};
-static int wm8753_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+#if defined(CONFIG_SPI_MASTER)
+static int __devinit wm8753_spi_probe(struct spi_device *spi)
{
- struct snd_soc_codec *codec;
struct wm8753_priv *wm8753;
+ int ret;
wm8753 = kzalloc(sizeof(struct wm8753_priv), GFP_KERNEL);
if (wm8753 == NULL)
return -ENOMEM;
- codec = &wm8753->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
- codec->control_data = i2c;
- i2c_set_clientdata(i2c, wm8753);
-
- codec->dev = &i2c->dev;
+ wm8753->control_type = SND_SOC_SPI;
+ spi_set_drvdata(spi, wm8753);
- return wm8753_register(wm8753);
+ ret = snd_soc_register_codec(&spi->dev,
+ &soc_codec_dev_wm8753, wm8753_dai, ARRAY_SIZE(wm8753_dai));
+ if (ret < 0)
+ kfree(wm8753);
+ return ret;
}
-static int wm8753_i2c_remove(struct i2c_client *client)
+static int __devexit wm8753_spi_remove(struct spi_device *spi)
{
- struct wm8753_priv *wm8753 = i2c_get_clientdata(client);
- wm8753_unregister(wm8753);
- return 0;
+ snd_soc_unregister_codec(&spi->dev);
+ kfree(spi_get_drvdata(spi));
+ return 0;
}
-static const struct i2c_device_id wm8753_i2c_id[] = {
- { "wm8753", 0 },
- { }
-};
-MODULE_DEVICE_TABLE(i2c, wm8753_i2c_id);
-
-static struct i2c_driver wm8753_i2c_driver = {
+static struct spi_driver wm8753_spi_driver = {
.driver = {
- .name = "wm8753",
- .owner = THIS_MODULE,
+ .name = "wm8753-codec",
+ .bus = &spi_bus_type,
+ .owner = THIS_MODULE,
},
- .probe = wm8753_i2c_probe,
- .remove = wm8753_i2c_remove,
- .id_table = wm8753_i2c_id,
+ .probe = wm8753_spi_probe,
+ .remove = __devexit_p(wm8753_spi_remove),
};
-#endif
-
-#if defined(CONFIG_SPI_MASTER)
-static int wm8753_spi_write(struct spi_device *spi, const char *data, int len)
-{
- struct spi_transfer t;
- struct spi_message m;
- u8 msg[2];
-
- if (len <= 0)
- return 0;
-
- msg[0] = data[0];
- msg[1] = data[1];
+#endif /* CONFIG_SPI_MASTER */
- spi_message_init(&m);
- memset(&t, 0, (sizeof t));
-
- t.tx_buf = &msg[0];
- t.len = len;
-
- spi_message_add_tail(&t, &m);
- spi_sync(spi, &m);
-
- return len;
-}
-
-static int __devinit wm8753_spi_probe(struct spi_device *spi)
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static __devinit int wm8753_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
{
- struct snd_soc_codec *codec;
struct wm8753_priv *wm8753;
+ int ret;
wm8753 = kzalloc(sizeof(struct wm8753_priv), GFP_KERNEL);
if (wm8753 == NULL)
return -ENOMEM;
- codec = &wm8753->codec;
- codec->control_data = spi;
- codec->hw_write = (hw_write_t)wm8753_spi_write;
- codec->dev = &spi->dev;
-
- dev_set_drvdata(&spi->dev, wm8753);
+ i2c_set_clientdata(i2c, wm8753);
+ wm8753->control_type = SND_SOC_I2C;
- return wm8753_register(wm8753);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8753, wm8753_dai, ARRAY_SIZE(wm8753_dai));
+ if (ret < 0)
+ kfree(wm8753);
+ return ret;
}
-static int __devexit wm8753_spi_remove(struct spi_device *spi)
+static __devexit int wm8753_i2c_remove(struct i2c_client *client)
{
- struct wm8753_priv *wm8753 = dev_get_drvdata(&spi->dev);
- wm8753_unregister(wm8753);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
-static struct spi_driver wm8753_spi_driver = {
+static const struct i2c_device_id wm8753_i2c_id[] = {
+ { "wm8753", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, wm8753_i2c_id);
+
+static struct i2c_driver wm8753_i2c_driver = {
.driver = {
- .name = "wm8753",
- .bus = &spi_bus_type,
- .owner = THIS_MODULE,
+ .name = "wm8753-codec",
+ .owner = THIS_MODULE,
},
- .probe = wm8753_spi_probe,
- .remove = __devexit_p(wm8753_spi_remove),
+ .probe = wm8753_i2c_probe,
+ .remove = __devexit_p(wm8753_i2c_remove),
+ .id_table = wm8753_i2c_id,
};
#endif
static int __init wm8753_modinit(void)
{
- int ret;
+ int ret = 0;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8753_i2c_driver);
- if (ret != 0)
- pr_err("Failed to register WM8753 I2C driver: %d\n", ret);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register wm8753 I2C driver: %d\n",
+ ret);
+ }
#endif
#if defined(CONFIG_SPI_MASTER)
ret = spi_register_driver(&wm8753_spi_driver);
- if (ret != 0)
- pr_err("Failed to register WM8753 SPI driver: %d\n", ret);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register wm8753 SPI driver: %d\n",
+ ret);
+ }
#endif
- return 0;
+ return ret;
}
module_init(wm8753_modinit);
diff --git a/sound/soc/codecs/wm8753.h b/sound/soc/codecs/wm8753.h
index 57b2ba244040..94edac144bcb 100644
--- a/sound/soc/codecs/wm8753.h
+++ b/sound/soc/codecs/wm8753.h
@@ -115,7 +115,4 @@
#define WM8753_DAI_HIFI 0
#define WM8753_DAI_VOICE 1
-extern struct snd_soc_dai wm8753_dai[2];
-extern struct snd_soc_codec_device soc_codec_dev_wm8753;
-
#endif
diff --git a/sound/soc/codecs/wm8776.c b/sound/soc/codecs/wm8776.c
index 4e212ed62ea6..05d98dd26072 100644
--- a/sound/soc/codecs/wm8776.c
+++ b/sound/soc/codecs/wm8776.c
@@ -31,20 +31,13 @@
#include "wm8776.h"
-static struct snd_soc_codec *wm8776_codec;
-struct snd_soc_codec_device soc_codec_dev_wm8776;
-
/* codec private data */
struct wm8776_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
u16 reg_cache[WM8776_CACHEREGNUM];
int sysclk[2];
};
-#ifdef CONFIG_SPI_MASTER
-static int wm8776_spi_write(struct spi_device *spi, const char *data, int len);
-#endif
-
static const u16 wm8776_reg[WM8776_CACHEREGNUM] = {
0x79, 0x79, 0x79, 0xff, 0xff, /* 4 */
0xff, 0x00, 0x90, 0x00, 0x00, /* 9 */
@@ -144,7 +137,7 @@ static int wm8776_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
struct snd_soc_codec *codec = dai->codec;
int reg, iface, master;
- switch (dai->id) {
+ switch (dai->driver->id) {
case WM8776_DAI_DAC:
reg = WM8776_DACIFCTRL;
master = 0x80;
@@ -178,13 +171,6 @@ static int wm8776_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
case SND_SOC_DAIFMT_LEFT_J:
iface |= 0x0001;
break;
- /* FIXME: CHECK A/B */
- case SND_SOC_DAIFMT_DSP_A:
- iface |= 0x0003;
- break;
- case SND_SOC_DAIFMT_DSP_B:
- iface |= 0x0007;
- break;
default:
return -EINVAL;
}
@@ -233,7 +219,7 @@ static int wm8776_hw_params(struct snd_pcm_substream *substream,
iface = 0;
- switch (dai->id) {
+ switch (dai->driver->id) {
case WM8776_DAI_DAC:
iface_reg = WM8776_DACIFCTRL;
master = 0x80;
@@ -267,7 +253,7 @@ static int wm8776_hw_params(struct snd_pcm_substream *substream,
/* Only need to set MCLK/LRCLK ratio if we're master */
if (snd_soc_read(codec, WM8776_MSTRCTRL) & master) {
for (i = 0; i < ARRAY_SIZE(mclk_ratios); i++) {
- if (wm8776->sysclk[dai->id] / params_rate(params)
+ if (wm8776->sysclk[dai->driver->id] / params_rate(params)
== mclk_ratios[i])
break;
}
@@ -275,7 +261,7 @@ static int wm8776_hw_params(struct snd_pcm_substream *substream,
if (i == ARRAY_SIZE(mclk_ratios)) {
dev_err(codec->dev,
"Unable to configure MCLK ratio %d/%d\n",
- wm8776->sysclk[dai->id], params_rate(params));
+ wm8776->sysclk[dai->driver->id], params_rate(params));
return -EINVAL;
}
@@ -305,9 +291,9 @@ static int wm8776_set_sysclk(struct snd_soc_dai *dai,
struct snd_soc_codec *codec = dai->codec;
struct wm8776_priv *wm8776 = snd_soc_codec_get_drvdata(codec);
- BUG_ON(dai->id >= ARRAY_SIZE(wm8776->sysclk));
+ BUG_ON(dai->driver->id >= ARRAY_SIZE(wm8776->sysclk));
- wm8776->sysclk[dai->id] = freq;
+ wm8776->sysclk[dai->driver->id] = freq;
return 0;
}
@@ -357,10 +343,10 @@ static struct snd_soc_dai_ops wm8776_adc_ops = {
.set_sysclk = wm8776_set_sysclk,
};
-struct snd_soc_dai wm8776_dai[] = {
+static struct snd_soc_dai_driver wm8776_dai[] = {
{
- .name = "WM8776 Playback",
- .id = WM8776_DAI_DAC,
+ .name = "wm8776-hifi-playback",
+ .id = WM8776_DAI_DAC,
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -371,8 +357,8 @@ struct snd_soc_dai wm8776_dai[] = {
.ops = &wm8776_dac_ops,
},
{
- .name = "WM8776 Capture",
- .id = WM8776_DAI_ADC,
+ .name = "wm8776-hifi-capture",
+ .id = WM8776_DAI_ADC,
.capture = {
.stream_name = "Capture",
.channels_min = 2,
@@ -383,23 +369,17 @@ struct snd_soc_dai wm8776_dai[] = {
.ops = &wm8776_adc_ops,
},
};
-EXPORT_SYMBOL_GPL(wm8776_dai);
#ifdef CONFIG_PM
-static int wm8776_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8776_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8776_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8776_resume(struct platform_device *pdev)
+static int wm8776_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
u8 data[2];
u16 *cache = codec->reg_cache;
@@ -422,27 +402,30 @@ static int wm8776_resume(struct platform_device *pdev)
#define wm8776_resume NULL
#endif
-static int wm8776_probe(struct platform_device *pdev)
+static int wm8776_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
+ struct wm8776_priv *wm8776 = snd_soc_codec_get_drvdata(codec);
int ret = 0;
- if (wm8776_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8776->control_type);
+ if (ret < 0) {
+ dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
+ return ret;
}
- socdev->card->codec = wm8776_codec;
- codec = wm8776_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
+ ret = wm8776_reset(codec);
if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
+ dev_err(codec->dev, "Failed to issue reset: %d\n", ret);
+ return ret;
}
+ wm8776_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+
+ /* Latch the update bits; right channel only since we always
+ * update both. */
+ snd_soc_update_bits(codec, WM8776_HPRVOL, 0x100, 0x100);
+ snd_soc_update_bits(codec, WM8776_DACRVOL, 0x100, 0x100);
+
snd_soc_add_controls(codec, wm8776_snd_controls,
ARRAY_SIZE(wm8776_snd_controls));
snd_soc_dapm_new_controls(codec, wm8776_dapm_widgets,
@@ -450,168 +433,56 @@ static int wm8776_probe(struct platform_device *pdev)
snd_soc_dapm_add_routes(codec, routes, ARRAY_SIZE(routes));
return ret;
-
-pcm_err:
- return ret;
}
/* power down chip */
-static int wm8776_remove(struct platform_device *pdev)
+static int wm8776_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
+ wm8776_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_wm8776 = {
+static struct snd_soc_codec_driver soc_codec_dev_wm8776 = {
.probe = wm8776_probe,
.remove = wm8776_remove,
.suspend = wm8776_suspend,
.resume = wm8776_resume,
+ .set_bias_level = wm8776_set_bias_level,
+ .reg_cache_size = sizeof(wm8776_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8776_reg,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8776);
-
-static int wm8776_register(struct wm8776_priv *wm8776,
- enum snd_soc_control_type control)
-{
- int ret, i;
- struct snd_soc_codec *codec = &wm8776->codec;
-
- if (wm8776_codec) {
- dev_err(codec->dev, "Another WM8776 is registered\n");
- ret = -EINVAL;
- goto err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8776);
- codec->name = "WM8776";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8776_set_bias_level;
- codec->dai = wm8776_dai;
- codec->num_dai = ARRAY_SIZE(wm8776_dai);
- codec->reg_cache_size = WM8776_CACHEREGNUM;
- codec->reg_cache = &wm8776->reg_cache;
-
- memcpy(codec->reg_cache, wm8776_reg, sizeof(wm8776_reg));
-
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
- if (ret < 0) {
- dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
- }
-
- for (i = 0; i < ARRAY_SIZE(wm8776_dai); i++)
- wm8776_dai[i].dev = codec->dev;
-
- ret = wm8776_reset(codec);
- if (ret < 0) {
- dev_err(codec->dev, "Failed to issue reset: %d\n", ret);
- goto err;
- }
-
- wm8776_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
- /* Latch the update bits; right channel only since we always
- * update both. */
- snd_soc_update_bits(codec, WM8776_HPRVOL, 0x100, 0x100);
- snd_soc_update_bits(codec, WM8776_DACRVOL, 0x100, 0x100);
-
- wm8776_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
-
- ret = snd_soc_register_dais(wm8776_dai, ARRAY_SIZE(wm8776_dai));
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAIs: %d\n", ret);
- goto err_codec;
- }
-
- return 0;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- kfree(wm8776);
- return ret;
-}
-
-static void wm8776_unregister(struct wm8776_priv *wm8776)
-{
- wm8776_set_bias_level(&wm8776->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dais(wm8776_dai, ARRAY_SIZE(wm8776_dai));
- snd_soc_unregister_codec(&wm8776->codec);
- kfree(wm8776);
- wm8776_codec = NULL;
-}
#if defined(CONFIG_SPI_MASTER)
-static int wm8776_spi_write(struct spi_device *spi, const char *data, int len)
-{
- struct spi_transfer t;
- struct spi_message m;
- u8 msg[2];
-
- if (len <= 0)
- return 0;
-
- msg[0] = data[0];
- msg[1] = data[1];
-
- spi_message_init(&m);
- memset(&t, 0, (sizeof t));
-
- t.tx_buf = &msg[0];
- t.len = len;
-
- spi_message_add_tail(&t, &m);
- spi_sync(spi, &m);
-
- return len;
-}
-
static int __devinit wm8776_spi_probe(struct spi_device *spi)
{
- struct snd_soc_codec *codec;
struct wm8776_priv *wm8776;
+ int ret;
wm8776 = kzalloc(sizeof(struct wm8776_priv), GFP_KERNEL);
if (wm8776 == NULL)
return -ENOMEM;
- codec = &wm8776->codec;
- codec->control_data = spi;
- codec->hw_write = (hw_write_t)wm8776_spi_write;
- codec->dev = &spi->dev;
+ wm8776->control_type = SND_SOC_SPI;
+ spi_set_drvdata(spi, wm8776);
- dev_set_drvdata(&spi->dev, wm8776);
-
- return wm8776_register(wm8776, SND_SOC_SPI);
+ ret = snd_soc_register_codec(&spi->dev,
+ &soc_codec_dev_wm8776, wm8776_dai, ARRAY_SIZE(wm8776_dai));
+ if (ret < 0)
+ kfree(wm8776);
+ return ret;
}
static int __devexit wm8776_spi_remove(struct spi_device *spi)
{
- struct wm8776_priv *wm8776 = dev_get_drvdata(&spi->dev);
-
- wm8776_unregister(wm8776);
-
+ snd_soc_unregister_codec(&spi->dev);
+ kfree(spi_get_drvdata(spi));
return 0;
}
static struct spi_driver wm8776_spi_driver = {
.driver = {
- .name = "wm8776",
+ .name = "wm8776-codec",
.bus = &spi_bus_type,
.owner = THIS_MODULE,
},
@@ -625,27 +496,26 @@ static __devinit int wm8776_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct wm8776_priv *wm8776;
- struct snd_soc_codec *codec;
+ int ret;
wm8776 = kzalloc(sizeof(struct wm8776_priv), GFP_KERNEL);
if (wm8776 == NULL)
return -ENOMEM;
- codec = &wm8776->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
-
i2c_set_clientdata(i2c, wm8776);
- codec->control_data = i2c;
-
- codec->dev = &i2c->dev;
+ wm8776->control_type = SND_SOC_I2C;
- return wm8776_register(wm8776, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8776, wm8776_dai, ARRAY_SIZE(wm8776_dai));
+ if (ret < 0)
+ kfree(wm8776);
+ return ret;
}
static __devexit int wm8776_i2c_remove(struct i2c_client *client)
{
- struct wm8776_priv *wm8776 = i2c_get_clientdata(client);
- wm8776_unregister(wm8776);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -657,7 +527,7 @@ MODULE_DEVICE_TABLE(i2c, wm8776_i2c_id);
static struct i2c_driver wm8776_i2c_driver = {
.driver = {
- .name = "wm8776",
+ .name = "wm8776-codec",
.owner = THIS_MODULE,
},
.probe = wm8776_i2c_probe,
@@ -668,22 +538,22 @@ static struct i2c_driver wm8776_i2c_driver = {
static int __init wm8776_modinit(void)
{
- int ret;
+ int ret = 0;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8776_i2c_driver);
if (ret != 0) {
- printk(KERN_ERR "Failed to register WM8776 I2C driver: %d\n",
+ printk(KERN_ERR "Failed to register wm8776 I2C driver: %d\n",
ret);
}
#endif
#if defined(CONFIG_SPI_MASTER)
ret = spi_register_driver(&wm8776_spi_driver);
if (ret != 0) {
- printk(KERN_ERR "Failed to register WM8776 SPI driver: %d\n",
+ printk(KERN_ERR "Failed to register wm8776 SPI driver: %d\n",
ret);
}
#endif
- return 0;
+ return ret;
}
module_init(wm8776_modinit);
diff --git a/sound/soc/codecs/wm8776.h b/sound/soc/codecs/wm8776.h
index 6606d25d2d83..4cf1c8e0bfc9 100644
--- a/sound/soc/codecs/wm8776.h
+++ b/sound/soc/codecs/wm8776.h
@@ -45,7 +45,4 @@
#define WM8776_DAI_DAC 0
#define WM8776_DAI_ADC 1
-extern struct snd_soc_dai wm8776_dai[];
-extern struct snd_soc_codec_device soc_codec_dev_wm8776;
-
#endif
diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c
index 5da17a704e5a..1378aab5ca75 100644
--- a/sound/soc/codecs/wm8900.c
+++ b/sound/soc/codecs/wm8900.c
@@ -23,6 +23,7 @@
#include <linux/delay.h>
#include <linux/pm.h>
#include <linux/i2c.h>
+#include <linux/spi/spi.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <sound/core.h>
@@ -137,11 +138,8 @@
#define WM8900_LRC_MASK 0xfc00
-struct snd_soc_codec_device soc_codec_dev_wm8900;
-
struct wm8900_priv {
- struct snd_soc_codec codec;
-
+ enum snd_soc_control_type control_type;
u16 reg_cache[WM8900_MAXREG];
u32 fll_in; /* FLL input frequency */
@@ -627,8 +625,7 @@ static int wm8900_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
u16 reg;
reg = snd_soc_read(codec, WM8900_REG_AUDIO1) & ~0x60;
@@ -1015,8 +1012,8 @@ static struct snd_soc_dai_ops wm8900_dai_ops = {
.digital_mute = wm8900_digital_mute,
};
-struct snd_soc_dai wm8900_dai = {
- .name = "WM8900 HiFi",
+static struct snd_soc_dai_driver wm8900_dai = {
+ .name = "wm8900-hifi",
.playback = {
.stream_name = "HiFi Playback",
.channels_min = 1,
@@ -1033,7 +1030,6 @@ struct snd_soc_dai wm8900_dai = {
},
.ops = &wm8900_dai_ops,
};
-EXPORT_SYMBOL_GPL(wm8900_dai);
static int wm8900_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level)
@@ -1128,10 +1124,8 @@ static int wm8900_set_bias_level(struct snd_soc_codec *codec,
return 0;
}
-static int wm8900_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8900_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
struct wm8900_priv *wm8900 = snd_soc_codec_get_drvdata(codec);
int fll_out = wm8900->fll_out;
int fll_in = wm8900->fll_in;
@@ -1140,7 +1134,7 @@ static int wm8900_suspend(struct platform_device *pdev, pm_message_t state)
/* Stop the FLL in an orderly fashion */
ret = wm8900_set_fll(codec, 0, 0, 0);
if (ret != 0) {
- dev_err(&pdev->dev, "Failed to stop FLL\n");
+ dev_err(codec->dev, "Failed to stop FLL\n");
return ret;
}
@@ -1152,10 +1146,8 @@ static int wm8900_suspend(struct platform_device *pdev, pm_message_t state)
return 0;
}
-static int wm8900_resume(struct platform_device *pdev)
+static int wm8900_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
struct wm8900_priv *wm8900 = snd_soc_codec_get_drvdata(codec);
u16 *cache;
int i, ret;
@@ -1176,7 +1168,7 @@ static int wm8900_resume(struct platform_device *pdev)
ret = wm8900_set_fll(codec, 0, fll_in, fll_out);
if (ret != 0) {
- dev_err(&pdev->dev, "Failed to restart FLL\n");
+ dev_err(codec->dev, "Failed to restart FLL\n");
return ret;
}
}
@@ -1186,60 +1178,32 @@ static int wm8900_resume(struct platform_device *pdev)
snd_soc_write(codec, i, cache[i]);
kfree(cache);
} else
- dev_err(&pdev->dev, "Unable to allocate register cache\n");
+ dev_err(codec->dev, "Unable to allocate register cache\n");
return 0;
}
-static struct snd_soc_codec *wm8900_codec;
-
-static __devinit int wm8900_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+static int wm8900_probe(struct snd_soc_codec *codec)
{
- struct wm8900_priv *wm8900;
- struct snd_soc_codec *codec;
- unsigned int reg;
- int ret;
-
- wm8900 = kzalloc(sizeof(struct wm8900_priv), GFP_KERNEL);
- if (wm8900 == NULL)
- return -ENOMEM;
+ struct wm8900_priv *wm8900 = snd_soc_codec_get_drvdata(codec);
+ int ret = 0, reg;
- codec = &wm8900->codec;
- snd_soc_codec_set_drvdata(codec, wm8900);
- codec->reg_cache = &wm8900->reg_cache[0];
- codec->reg_cache_size = WM8900_MAXREG;
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->name = "WM8900";
- codec->owner = THIS_MODULE;
- codec->dai = &wm8900_dai;
- codec->num_dai = 1;
- codec->control_data = i2c;
- codec->set_bias_level = wm8900_set_bias_level;
- codec->volatile_register = wm8900_volatile_register;
- codec->dev = &i2c->dev;
-
- ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C);
+ ret = snd_soc_codec_set_cache_io(codec, 8, 16, wm8900->control_type);
if (ret != 0) {
- dev_err(&i2c->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
+ dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
+ return ret;
}
reg = snd_soc_read(codec, WM8900_REG_ID);
if (reg != 0x8900) {
- dev_err(&i2c->dev, "Device is not a WM8900 - ID %x\n", reg);
- ret = -ENODEV;
- goto err;
+ dev_err(codec->dev, "Device is not a WM8900 - ID %x\n", reg);
+ return -ENODEV;
}
/* Read back from the chip */
reg = snd_soc_read(codec, WM8900_REG_POWER1);
reg = (reg >> 12) & 0xf;
- dev_info(&i2c->dev, "WM8900 revision %d\n", reg);
+ dev_info(codec->dev, "WM8900 revision %d\n", reg);
wm8900_reset(codec);
@@ -1271,43 +1235,95 @@ static __devinit int wm8900_i2c_probe(struct i2c_client *i2c,
/* Set the DAC and mixer output bias */
snd_soc_write(codec, WM8900_REG_OUTBIASCTL, 0x81);
- wm8900_dai.dev = &i2c->dev;
+ snd_soc_add_controls(codec, wm8900_snd_controls,
+ ARRAY_SIZE(wm8900_snd_controls));
+ wm8900_add_widgets(codec);
- wm8900_codec = codec;
+ return 0;
+}
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(&i2c->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
+/* power down chip */
+static int wm8900_remove(struct snd_soc_codec *codec)
+{
+ wm8900_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
+}
- ret = snd_soc_register_dai(&wm8900_dai);
- if (ret != 0) {
- dev_err(&i2c->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
+static struct snd_soc_codec_driver soc_codec_dev_wm8900 = {
+ .probe = wm8900_probe,
+ .remove = wm8900_remove,
+ .suspend = wm8900_suspend,
+ .resume = wm8900_resume,
+ .set_bias_level = wm8900_set_bias_level,
+ .volatile_register = wm8900_volatile_register,
+ .reg_cache_size = sizeof(wm8900_reg_defaults),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8900_reg_defaults,
+};
- return ret;
+#if defined(CONFIG_SPI_MASTER)
+static int __devinit wm8900_spi_probe(struct spi_device *spi)
+{
+ struct wm8900_priv *wm8900;
+ int ret;
+
+ wm8900 = kzalloc(sizeof(struct wm8900_priv), GFP_KERNEL);
+ if (wm8900 == NULL)
+ return -ENOMEM;
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- kfree(wm8900);
- wm8900_codec = NULL;
+ wm8900->control_type = SND_SOC_SPI;
+ spi_set_drvdata(spi, wm8900);
+
+ ret = snd_soc_register_codec(&spi->dev,
+ &soc_codec_dev_wm8900, &wm8900_dai, 1);
+ if (ret < 0)
+ kfree(wm8900);
return ret;
}
-static __devexit int wm8900_i2c_remove(struct i2c_client *client)
+static int __devexit wm8900_spi_remove(struct spi_device *spi)
{
- snd_soc_unregister_dai(&wm8900_dai);
- snd_soc_unregister_codec(wm8900_codec);
+ snd_soc_unregister_codec(&spi->dev);
+ kfree(spi_get_drvdata(spi));
+ return 0;
+}
- wm8900_set_bias_level(wm8900_codec, SND_SOC_BIAS_OFF);
+static struct spi_driver wm8900_spi_driver = {
+ .driver = {
+ .name = "wm8900-codec",
+ .bus = &spi_bus_type,
+ .owner = THIS_MODULE,
+ },
+ .probe = wm8900_spi_probe,
+ .remove = __devexit_p(wm8900_spi_remove),
+};
+#endif /* CONFIG_SPI_MASTER */
+
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static __devinit int wm8900_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
+{
+ struct wm8900_priv *wm8900;
+ int ret;
+
+ wm8900 = kzalloc(sizeof(struct wm8900_priv), GFP_KERNEL);
+ if (wm8900 == NULL)
+ return -ENOMEM;
+
+ i2c_set_clientdata(i2c, wm8900);
+ wm8900->control_type = SND_SOC_I2C;
- wm8900_dai.dev = NULL;
- kfree(snd_soc_codec_get_drvdata(wm8900_codec));
- wm8900_codec = NULL;
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8900, &wm8900_dai, 1);
+ if (ret < 0)
+ kfree(wm8900);
+ return ret;
+}
+static __devexit int wm8900_i2c_remove(struct i2c_client *client)
+{
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -1319,71 +1335,44 @@ MODULE_DEVICE_TABLE(i2c, wm8900_i2c_id);
static struct i2c_driver wm8900_i2c_driver = {
.driver = {
- .name = "WM8900",
+ .name = "wm8900-codec",
.owner = THIS_MODULE,
},
- .probe = wm8900_i2c_probe,
- .remove = __devexit_p(wm8900_i2c_remove),
+ .probe = wm8900_i2c_probe,
+ .remove = __devexit_p(wm8900_i2c_remove),
.id_table = wm8900_i2c_id,
};
+#endif
-static int wm8900_probe(struct platform_device *pdev)
+static int __init wm8900_modinit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
int ret = 0;
-
- if (!wm8900_codec) {
- dev_err(&pdev->dev, "I2C client not yet instantiated\n");
- return -ENODEV;
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+ ret = i2c_add_driver(&wm8900_i2c_driver);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register wm8900 I2C driver: %d\n",
+ ret);
}
-
- codec = wm8900_codec;
- socdev->card->codec = codec;
-
- /* Register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(&pdev->dev, "Failed to register new PCMs\n");
- goto pcm_err;
+#endif
+#if defined(CONFIG_SPI_MASTER)
+ ret = spi_register_driver(&wm8900_spi_driver);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register wm8900 SPI driver: %d\n",
+ ret);
}
-
- snd_soc_add_controls(codec, wm8900_snd_controls,
- ARRAY_SIZE(wm8900_snd_controls));
- wm8900_add_widgets(codec);
-
-pcm_err:
+#endif
return ret;
}
-
-/* power down chip */
-static int wm8900_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8900 = {
- .probe = wm8900_probe,
- .remove = wm8900_remove,
- .suspend = wm8900_suspend,
- .resume = wm8900_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8900);
-
-static int __init wm8900_modinit(void)
-{
- return i2c_add_driver(&wm8900_i2c_driver);
-}
module_init(wm8900_modinit);
static void __exit wm8900_exit(void)
{
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_del_driver(&wm8900_i2c_driver);
+#endif
+#if defined(CONFIG_SPI_MASTER)
+ spi_unregister_driver(&wm8900_spi_driver);
+#endif
}
module_exit(wm8900_exit);
diff --git a/sound/soc/codecs/wm8900.h b/sound/soc/codecs/wm8900.h
index fd15007d10c7..583f257e799b 100644
--- a/sound/soc/codecs/wm8900.h
+++ b/sound/soc/codecs/wm8900.h
@@ -52,7 +52,4 @@
#define WM8900_DAC_CLKDIV_5_5 0x14
#define WM8900_DAC_CLKDIV_6 0x18
-extern struct snd_soc_dai wm8900_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8900;
-
#endif
diff --git a/sound/soc/codecs/wm8903.c b/sound/soc/codecs/wm8903.c
index bf08282d5ee5..622b60238a82 100644
--- a/sound/soc/codecs/wm8903.c
+++ b/sound/soc/codecs/wm8903.c
@@ -213,10 +213,11 @@ static u16 wm8903_reg_defaults[] = {
};
struct wm8903_priv {
- struct snd_soc_codec codec;
+
u16 reg_cache[ARRAY_SIZE(wm8903_reg_defaults)];
int sysclk;
+ int irq;
/* Reference counts */
int class_w_users;
@@ -252,7 +253,6 @@ static int wm8903_volatile_register(unsigned int reg)
static int wm8903_run_sequence(struct snd_soc_codec *codec, unsigned int start)
{
u16 reg[5];
- struct i2c_client *i2c = codec->control_data;
struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec);
BUG_ON(start > 48);
@@ -262,7 +262,7 @@ static int wm8903_run_sequence(struct snd_soc_codec *codec, unsigned int start)
snd_soc_write(codec, WM8903_WRITE_SEQUENCER_0,
reg[0] | WM8903_WSEQ_ENA);
- dev_dbg(&i2c->dev, "Starting sequence at %d\n", start);
+ dev_dbg(codec->dev, "Starting sequence at %d\n", start);
snd_soc_write(codec, WM8903_WRITE_SEQUENCER_3,
start | WM8903_WSEQ_START);
@@ -277,7 +277,7 @@ static int wm8903_run_sequence(struct snd_soc_codec *codec, unsigned int start)
reg[4] = snd_soc_read(codec, WM8903_WRITE_SEQUENCER_4);
} while (reg[4] & WM8903_WSEQ_BUSY);
- dev_dbg(&i2c->dev, "Sequence complete\n");
+ dev_dbg(codec->dev, "Sequence complete\n");
/* Disable the sequencer again if we enabled it */
snd_soc_write(codec, WM8903_WRITE_SEQUENCER_0, reg[0]);
@@ -422,7 +422,6 @@ static int wm8903_class_w_put(struct snd_kcontrol *kcontrol,
struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
struct snd_soc_codec *codec = widget->codec;
struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec);
- struct i2c_client *i2c = codec->control_data;
u16 reg;
int ret;
@@ -431,7 +430,7 @@ static int wm8903_class_w_put(struct snd_kcontrol *kcontrol,
/* Turn it off if we're about to enable bypass */
if (ucontrol->value.integer.value[0]) {
if (wm8903->class_w_users == 0) {
- dev_dbg(&i2c->dev, "Disabling Class W\n");
+ dev_dbg(codec->dev, "Disabling Class W\n");
snd_soc_write(codec, WM8903_CLASS_W_0, reg &
~(WM8903_CP_DYN_FREQ | WM8903_CP_DYN_V));
}
@@ -444,14 +443,14 @@ static int wm8903_class_w_put(struct snd_kcontrol *kcontrol,
/* If we've just disabled the last bypass path turn Class W on */
if (!ucontrol->value.integer.value[0]) {
if (wm8903->class_w_users == 1) {
- dev_dbg(&i2c->dev, "Enabling Class W\n");
+ dev_dbg(codec->dev, "Enabling Class W\n");
snd_soc_write(codec, WM8903_CLASS_W_0, reg |
WM8903_CP_DYN_FREQ | WM8903_CP_DYN_V);
}
wm8903->class_w_users--;
}
- dev_dbg(&i2c->dev, "Bypass use count now %d\n",
+ dev_dbg(codec->dev, "Bypass use count now %d\n",
wm8903->class_w_users);
return ret;
@@ -935,7 +934,6 @@ static int wm8903_add_widgets(struct snd_soc_codec *codec)
static int wm8903_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level)
{
- struct i2c_client *i2c = codec->control_data;
u16 reg, reg2;
switch (level) {
@@ -974,7 +972,7 @@ static int wm8903_set_bias_level(struct snd_soc_codec *codec,
/* By default no bypass paths are enabled so
* enable Class W support.
*/
- dev_dbg(&i2c->dev, "Enabling Class W\n");
+ dev_dbg(codec->dev, "Enabling Class W\n");
snd_soc_write(codec, WM8903_CLASS_W_0, reg |
WM8903_CP_DYN_FREQ | WM8903_CP_DYN_V);
}
@@ -1228,10 +1226,8 @@ static int wm8903_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec);
- struct i2c_client *i2c = codec->control_data;
struct snd_pcm_runtime *master_runtime;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
@@ -1245,7 +1241,7 @@ static int wm8903_startup(struct snd_pcm_substream *substream,
if (wm8903->master_substream) {
master_runtime = wm8903->master_substream->runtime;
- dev_dbg(&i2c->dev, "Constraining to %d bits\n",
+ dev_dbg(codec->dev, "Constraining to %d bits\n",
master_runtime->sample_bits);
snd_pcm_hw_constraint_minmax(substream->runtime,
@@ -1264,8 +1260,7 @@ static void wm8903_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
@@ -1284,10 +1279,8 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec =rtd->codec;
struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec);
- struct i2c_client *i2c = codec->control_data;
int fs = params_rate(params);
int bclk;
int bclk_div;
@@ -1306,7 +1299,7 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream,
u16 dac_digital1 = snd_soc_read(codec, WM8903_DAC_DIGITAL_1);
if (substream == wm8903->slave_substream) {
- dev_dbg(&i2c->dev, "Ignoring hw_params for slave substream\n");
+ dev_dbg(codec->dev, "Ignoring hw_params for slave substream\n");
return 0;
}
@@ -1332,7 +1325,7 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream,
switch (sample_rates[dsp_config].rate) {
case 88200:
case 96000:
- dev_err(&i2c->dev, "%dHz unsupported by ADC\n",
+ dev_err(codec->dev, "%dHz unsupported by ADC\n",
fs);
return -EINVAL;
@@ -1340,7 +1333,7 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream,
break;
}
- dev_dbg(&i2c->dev, "DSP fs = %dHz\n", sample_rates[dsp_config].rate);
+ dev_dbg(codec->dev, "DSP fs = %dHz\n", sample_rates[dsp_config].rate);
clock1 &= ~WM8903_SAMPLE_RATE_MASK;
clock1 |= sample_rates[dsp_config].value;
@@ -1366,7 +1359,7 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream,
return -EINVAL;
}
- dev_dbg(&i2c->dev, "MCLK = %dHz, target sample rate = %dHz\n",
+ dev_dbg(codec->dev, "MCLK = %dHz, target sample rate = %dHz\n",
wm8903->sysclk, fs);
/* We may not have an MCLK which allows us to generate exactly
@@ -1401,12 +1394,12 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream,
clock1 |= clk_sys_ratios[clk_config].rate << WM8903_CLK_SYS_RATE_SHIFT;
clock1 |= clk_sys_ratios[clk_config].mode << WM8903_CLK_SYS_MODE_SHIFT;
- dev_dbg(&i2c->dev, "CLK_SYS_RATE=%x, CLK_SYS_MODE=%x div=%d\n",
+ dev_dbg(codec->dev, "CLK_SYS_RATE=%x, CLK_SYS_MODE=%x div=%d\n",
clk_sys_ratios[clk_config].rate,
clk_sys_ratios[clk_config].mode,
clk_sys_ratios[clk_config].div);
- dev_dbg(&i2c->dev, "Actual CLK_SYS = %dHz\n", clk_sys);
+ dev_dbg(codec->dev, "Actual CLK_SYS = %dHz\n", clk_sys);
/* We may not get quite the right frequency if using
* approximate clocks so look for the closest match that is
@@ -1428,7 +1421,7 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream,
aif2 &= ~WM8903_BCLK_DIV_MASK;
aif3 &= ~WM8903_LRCLK_RATE_MASK;
- dev_dbg(&i2c->dev, "BCLK ratio %d for %dHz - actual BCLK = %dHz\n",
+ dev_dbg(codec->dev, "BCLK ratio %d for %dHz - actual BCLK = %dHz\n",
bclk_divs[bclk_div].ratio / 10, bclk,
(clk_sys * 10) / bclk_divs[bclk_div].ratio);
@@ -1504,8 +1497,8 @@ EXPORT_SYMBOL_GPL(wm8903_mic_detect);
static irqreturn_t wm8903_irq(int irq, void *data)
{
- struct wm8903_priv *wm8903 = data;
- struct snd_soc_codec *codec = &wm8903->codec;
+ struct snd_soc_codec *codec = data;
+ struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec);
int mic_report;
int int_pol;
int int_val = 0;
@@ -1586,8 +1579,8 @@ static struct snd_soc_dai_ops wm8903_dai_ops = {
.set_sysclk = wm8903_set_dai_sysclk,
};
-struct snd_soc_dai wm8903_dai = {
- .name = "WM8903",
+static struct snd_soc_dai_driver wm8903_dai = {
+ .name = "wm8903-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -1605,23 +1598,16 @@ struct snd_soc_dai wm8903_dai = {
.ops = &wm8903_dai_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(wm8903_dai);
-static int wm8903_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8903_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8903_resume(struct platform_device *pdev)
+static int wm8903_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
- struct i2c_client *i2c = codec->control_data;
int i;
u16 *reg_cache = codec->reg_cache;
u16 *tmp_cache = kmemdup(reg_cache, sizeof(wm8903_reg_defaults),
@@ -1637,65 +1623,37 @@ static int wm8903_resume(struct platform_device *pdev)
snd_soc_write(codec, i, tmp_cache[i]);
kfree(tmp_cache);
} else {
- dev_err(&i2c->dev, "Failed to allocate temporary cache\n");
+ dev_err(codec->dev, "Failed to allocate temporary cache\n");
}
return 0;
}
-static struct snd_soc_codec *wm8903_codec;
-
-static __devinit int wm8903_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+static int wm8903_probe(struct snd_soc_codec *codec)
{
- struct wm8903_platform_data *pdata = dev_get_platdata(&i2c->dev);
- struct wm8903_priv *wm8903;
- struct snd_soc_codec *codec;
+ struct wm8903_platform_data *pdata = dev_get_platdata(codec->dev);
+ struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec);
int ret, i;
int trigger, irq_pol;
u16 val;
- wm8903 = kzalloc(sizeof(struct wm8903_priv), GFP_KERNEL);
- if (wm8903 == NULL)
- return -ENOMEM;
-
- codec = &wm8903->codec;
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->dev = &i2c->dev;
- codec->name = "WM8903";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8903_set_bias_level;
- codec->dai = &wm8903_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = ARRAY_SIZE(wm8903->reg_cache);
- codec->reg_cache = &wm8903->reg_cache[0];
- snd_soc_codec_set_drvdata(codec, wm8903);
- codec->volatile_register = wm8903_volatile_register;
init_completion(&wm8903->wseq);
- i2c_set_clientdata(i2c, codec);
- codec->control_data = i2c;
-
ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C);
if (ret != 0) {
- dev_err(&i2c->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
+ dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
+ return ret;
}
val = snd_soc_read(codec, WM8903_SW_RESET_AND_ID);
if (val != wm8903_reg_defaults[WM8903_SW_RESET_AND_ID]) {
- dev_err(&i2c->dev,
+ dev_err(codec->dev,
"Device with ID register %x is not a WM8903\n", val);
return -ENODEV;
}
val = snd_soc_read(codec, WM8903_REVISION_NUMBER);
- dev_info(&i2c->dev, "WM8903 revision %d\n",
+ dev_info(codec->dev, "WM8903 revision %d\n",
val & WM8903_CHIP_REV_MASK);
wm8903_reset(codec);
@@ -1721,7 +1679,7 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c,
wm8903->mic_delay = pdata->micdet_delay;
}
- if (i2c->irq) {
+ if (wm8903->irq) {
if (pdata && pdata->irq_active_low) {
trigger = IRQF_TRIGGER_LOW;
irq_pol = WM8903_IRQ_POL;
@@ -1733,13 +1691,13 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c,
snd_soc_update_bits(codec, WM8903_INTERRUPT_CONTROL,
WM8903_IRQ_POL, irq_pol);
- ret = request_threaded_irq(i2c->irq, NULL, wm8903_irq,
+ ret = request_threaded_irq(wm8903->irq, NULL, wm8903_irq,
trigger | IRQF_ONESHOT,
- "wm8903", wm8903);
+ "wm8903", codec);
if (ret != 0) {
- dev_err(&i2c->dev, "Failed to request IRQ: %d\n",
+ dev_err(codec->dev, "Failed to request IRQ: %d\n",
ret);
- goto err;
+ return ret;
}
/* Enable write sequencer interrupts */
@@ -1781,133 +1739,96 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c,
val |= WM8903_DAC_MUTEMODE;
snd_soc_write(codec, WM8903_DAC_DIGITAL_1, val);
- wm8903_dai.dev = &i2c->dev;
- wm8903_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(&i2c->dev, "Failed to register codec: %d\n", ret);
- goto err_irq;
- }
-
- ret = snd_soc_register_dai(&wm8903_dai);
- if (ret != 0) {
- dev_err(&i2c->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
-
- return ret;
+ snd_soc_add_controls(codec, wm8903_snd_controls,
+ ARRAY_SIZE(wm8903_snd_controls));
+ wm8903_add_widgets(codec);
-err_codec:
- snd_soc_unregister_codec(codec);
-err_irq:
- if (i2c->irq)
- free_irq(i2c->irq, wm8903);
-err:
- wm8903_codec = NULL;
- kfree(wm8903);
return ret;
}
-static __devexit int wm8903_i2c_remove(struct i2c_client *client)
+/* power down chip */
+static int wm8903_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = i2c_get_clientdata(client);
- struct wm8903_priv *priv = snd_soc_codec_get_drvdata(codec);
+ wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
+}
- snd_soc_unregister_dai(&wm8903_dai);
- snd_soc_unregister_codec(codec);
+static struct snd_soc_codec_driver soc_codec_dev_wm8903 = {
+ .probe = wm8903_probe,
+ .remove = wm8903_remove,
+ .suspend = wm8903_suspend,
+ .resume = wm8903_resume,
+ .set_bias_level = wm8903_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(wm8903_reg_defaults),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8903_reg_defaults,
+ .volatile_register = wm8903_volatile_register,
+};
- wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF);
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static __devinit int wm8903_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
+{
+ struct wm8903_priv *wm8903;
+ int ret;
- if (client->irq)
- free_irq(client->irq, priv);
+ wm8903 = kzalloc(sizeof(struct wm8903_priv), GFP_KERNEL);
+ if (wm8903 == NULL)
+ return -ENOMEM;
- kfree(priv);
+ i2c_set_clientdata(i2c, wm8903);
+ wm8903->irq = i2c->irq;
- wm8903_codec = NULL;
- wm8903_dai.dev = NULL;
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8903, &wm8903_dai, 1);
+ if (ret < 0)
+ kfree(wm8903);
+ return ret;
+}
+static __devexit int wm8903_i2c_remove(struct i2c_client *client)
+{
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
-/* i2c codec control layer */
static const struct i2c_device_id wm8903_i2c_id[] = {
- { "wm8903", 0 },
- { }
+ { "wm8903", 0 },
+ { }
};
MODULE_DEVICE_TABLE(i2c, wm8903_i2c_id);
static struct i2c_driver wm8903_i2c_driver = {
.driver = {
- .name = "WM8903",
+ .name = "wm8903-codec",
.owner = THIS_MODULE,
},
- .probe = wm8903_i2c_probe,
- .remove = __devexit_p(wm8903_i2c_remove),
+ .probe = wm8903_i2c_probe,
+ .remove = __devexit_p(wm8903_i2c_remove),
.id_table = wm8903_i2c_id,
};
+#endif
-static int wm8903_probe(struct platform_device *pdev)
+static int __init wm8903_modinit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
int ret = 0;
-
- if (!wm8903_codec) {
- dev_err(&pdev->dev, "I2C device not yet probed\n");
- goto err;
- }
-
- socdev->card->codec = wm8903_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(&pdev->dev, "failed to create pcms\n");
- goto err;
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+ ret = i2c_add_driver(&wm8903_i2c_driver);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register wm8903 I2C driver: %d\n",
+ ret);
}
-
- snd_soc_add_controls(socdev->card->codec, wm8903_snd_controls,
- ARRAY_SIZE(wm8903_snd_controls));
- wm8903_add_widgets(socdev->card->codec);
-
+#endif
return ret;
-
-err:
- return ret;
-}
-
-/* power down chip */
-static int wm8903_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec->control_data)
- wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8903 = {
- .probe = wm8903_probe,
- .remove = wm8903_remove,
- .suspend = wm8903_suspend,
- .resume = wm8903_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8903);
-
-static int __init wm8903_modinit(void)
-{
- return i2c_add_driver(&wm8903_i2c_driver);
}
module_init(wm8903_modinit);
static void __exit wm8903_exit(void)
{
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_del_driver(&wm8903_i2c_driver);
+#endif
}
module_exit(wm8903_exit);
diff --git a/sound/soc/codecs/wm8903.h b/sound/soc/codecs/wm8903.h
index ce384a2ad820..996435e681e5 100644
--- a/sound/soc/codecs/wm8903.h
+++ b/sound/soc/codecs/wm8903.h
@@ -15,9 +15,6 @@
#include <linux/i2c.h>
-extern struct snd_soc_dai wm8903_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8903;
-
extern int wm8903_mic_detect(struct snd_soc_codec *codec,
struct snd_soc_jack *jack,
int det, int shrt);
diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c
index f7dcabf6283c..33be84e506ea 100644
--- a/sound/soc/codecs/wm8904.c
+++ b/sound/soc/codecs/wm8904.c
@@ -31,9 +31,6 @@
#include "wm8904.h"
-static struct snd_soc_codec *wm8904_codec;
-struct snd_soc_codec_device soc_codec_dev_wm8904;
-
enum wm8904_type {
WM8904,
WM8912,
@@ -52,10 +49,11 @@ static const char *wm8904_supply_names[WM8904_NUM_SUPPLIES] = {
/* codec private data */
struct wm8904_priv {
- struct snd_soc_codec codec;
+
u16 reg_cache[WM8904_MAX_REGISTER + 1];
enum wm8904_type devtype;
+ void *control_data;
struct regulator_bulk_data supplies[WM8904_NUM_SUPPLIES];
@@ -689,7 +687,7 @@ static int wm8904_put_drc_enum(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
- struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
+ struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
struct wm8904_pdata *pdata = wm8904->pdata;
int value = ucontrol->value.integer.value[0];
@@ -760,7 +758,7 @@ static int wm8904_put_retune_mobile_enum(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
- struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
+ struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
struct wm8904_pdata *pdata = wm8904->pdata;
int value = ucontrol->value.integer.value[0];
@@ -2218,8 +2216,8 @@ static struct snd_soc_dai_ops wm8904_dai_ops = {
.digital_mute = wm8904_digital_mute,
};
-struct snd_soc_dai wm8904_dai = {
- .name = "WM8904",
+static struct snd_soc_dai_driver wm8904_dai = {
+ .name = "wm8904-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -2237,24 +2235,17 @@ struct snd_soc_dai wm8904_dai = {
.ops = &wm8904_dai_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(wm8904_dai);
#ifdef CONFIG_PM
-static int wm8904_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8904_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8904_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8904_resume(struct platform_device *pdev)
+static int wm8904_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8904_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
@@ -2264,9 +2255,9 @@ static int wm8904_resume(struct platform_device *pdev)
#define wm8904_resume NULL
#endif
-static void wm8904_handle_retune_mobile_pdata(struct wm8904_priv *wm8904)
+static void wm8904_handle_retune_mobile_pdata(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = &wm8904->codec;
+ struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
struct wm8904_pdata *pdata = wm8904->pdata;
struct snd_kcontrol_new control =
SOC_ENUM_EXT("EQ Mode",
@@ -2315,20 +2306,20 @@ static void wm8904_handle_retune_mobile_pdata(struct wm8904_priv *wm8904)
wm8904->retune_mobile_enum.max = wm8904->num_retune_mobile_texts;
wm8904->retune_mobile_enum.texts = wm8904->retune_mobile_texts;
- ret = snd_soc_add_controls(&wm8904->codec, &control, 1);
+ ret = snd_soc_add_controls(codec, &control, 1);
if (ret != 0)
- dev_err(wm8904->codec.dev,
+ dev_err(codec->dev,
"Failed to add ReTune Mobile control: %d\n", ret);
}
-static void wm8904_handle_pdata(struct wm8904_priv *wm8904)
+static void wm8904_handle_pdata(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = &wm8904->codec;
+ struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
struct wm8904_pdata *pdata = wm8904->pdata;
int ret, i;
if (!pdata) {
- snd_soc_add_controls(&wm8904->codec, wm8904_eq_controls,
+ snd_soc_add_controls(codec, wm8904_eq_controls,
ARRAY_SIZE(wm8904_eq_controls));
return;
}
@@ -2344,7 +2335,7 @@ static void wm8904_handle_pdata(struct wm8904_priv *wm8904)
wm8904->drc_texts = kmalloc(sizeof(char *)
* pdata->num_drc_cfgs, GFP_KERNEL);
if (!wm8904->drc_texts) {
- dev_err(wm8904->codec.dev,
+ dev_err(codec->dev,
"Failed to allocate %d DRC config texts\n",
pdata->num_drc_cfgs);
return;
@@ -2356,9 +2347,9 @@ static void wm8904_handle_pdata(struct wm8904_priv *wm8904)
wm8904->drc_enum.max = pdata->num_drc_cfgs;
wm8904->drc_enum.texts = wm8904->drc_texts;
- ret = snd_soc_add_controls(&wm8904->codec, &control, 1);
+ ret = snd_soc_add_controls(codec, &control, 1);
if (ret != 0)
- dev_err(wm8904->codec.dev,
+ dev_err(codec->dev,
"Failed to add DRC mode control: %d\n", ret);
wm8904_set_drc(codec);
@@ -2368,89 +2359,19 @@ static void wm8904_handle_pdata(struct wm8904_priv *wm8904)
pdata->num_retune_mobile_cfgs);
if (pdata->num_retune_mobile_cfgs)
- wm8904_handle_retune_mobile_pdata(wm8904);
+ wm8904_handle_retune_mobile_pdata(codec);
else
- snd_soc_add_controls(&wm8904->codec, wm8904_eq_controls,
+ snd_soc_add_controls(codec, wm8904_eq_controls,
ARRAY_SIZE(wm8904_eq_controls));
}
-static int wm8904_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (wm8904_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
- socdev->card->codec = wm8904_codec;
- codec = wm8904_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
- wm8904_handle_pdata(snd_soc_codec_get_drvdata(codec));
-
- wm8904_add_widgets(codec);
-
- return ret;
-
-pcm_err:
- return ret;
-}
-
-static int wm8904_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8904 = {
- .probe = wm8904_probe,
- .remove = wm8904_remove,
- .suspend = wm8904_suspend,
- .resume = wm8904_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8904);
-
-static int wm8904_register(struct wm8904_priv *wm8904,
- enum snd_soc_control_type control)
+static int wm8904_probe(struct snd_soc_codec *codec)
{
+ struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
struct wm8904_pdata *pdata = wm8904->pdata;
- int ret;
- struct snd_soc_codec *codec = &wm8904->codec;
- int i;
-
- if (wm8904_codec) {
- dev_err(codec->dev, "Another WM8904 is registered\n");
- ret = -EINVAL;
- goto err;
- }
+ int ret, i;
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8904);
- codec->name = "WM8904";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8904_set_bias_level;
- codec->dai = &wm8904_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = WM8904_MAX_REGISTER;
- codec->reg_cache = &wm8904->reg_cache;
- codec->volatile_register = wm8904_volatile_register;
codec->cache_sync = 1;
codec->idle_bias_off = 1;
@@ -2463,16 +2384,13 @@ static int wm8904_register(struct wm8904_priv *wm8904,
default:
dev_err(codec->dev, "Unknown device type %d\n",
wm8904->devtype);
- ret = -EINVAL;
- goto err;
+ return -EINVAL;
}
- memcpy(codec->reg_cache, wm8904_reg, sizeof(wm8904_reg));
-
- ret = snd_soc_codec_set_cache_io(codec, 8, 16, control);
+ ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C);
if (ret != 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
+ return ret;
}
for (i = 0; i < ARRAY_SIZE(wm8904->supplies); i++)
@@ -2482,7 +2400,7 @@ static int wm8904_register(struct wm8904_priv *wm8904,
wm8904->supplies);
if (ret != 0) {
dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
- goto err;
+ return ret;
}
ret = regulator_bulk_enable(ARRAY_SIZE(wm8904->supplies),
@@ -2517,8 +2435,6 @@ static int wm8904_register(struct wm8904_priv *wm8904,
goto err_enable;
}
- wm8904_dai.dev = codec->dev;
-
/* Change some default settings - latch VU and enable ZC */
wm8904->reg_cache[WM8904_ADC_DIGITAL_VOLUME_LEFT] |= WM8904_ADC_VU;
wm8904->reg_cache[WM8904_ADC_DIGITAL_VOLUME_RIGHT] |= WM8904_ADC_VU;
@@ -2563,72 +2479,68 @@ static int wm8904_register(struct wm8904_priv *wm8904,
/* Bias level configuration will have done an extra enable */
regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies), wm8904->supplies);
- wm8904_codec = codec;
+ wm8904_handle_pdata(codec);
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err_enable;
- }
-
- ret = snd_soc_register_dai(&wm8904_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
+ wm8904_add_widgets(codec);
return 0;
-err_codec:
- snd_soc_unregister_codec(codec);
err_enable:
regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies), wm8904->supplies);
err_get:
regulator_bulk_free(ARRAY_SIZE(wm8904->supplies), wm8904->supplies);
-err:
- kfree(wm8904);
return ret;
}
-static void wm8904_unregister(struct wm8904_priv *wm8904)
+static int wm8904_remove(struct snd_soc_codec *codec)
{
- wm8904_set_bias_level(&wm8904->codec, SND_SOC_BIAS_OFF);
+ struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
+
+ wm8904_set_bias_level(codec, SND_SOC_BIAS_OFF);
regulator_bulk_free(ARRAY_SIZE(wm8904->supplies), wm8904->supplies);
- snd_soc_unregister_dai(&wm8904_dai);
- snd_soc_unregister_codec(&wm8904->codec);
- kfree(wm8904);
- wm8904_codec = NULL;
+
+ return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_wm8904 = {
+ .probe = wm8904_probe,
+ .remove = wm8904_remove,
+ .suspend = wm8904_suspend,
+ .resume = wm8904_resume,
+ .set_bias_level = wm8904_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(wm8904_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8904_reg,
+ .volatile_register = wm8904_volatile_register,
+};
+
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static __devinit int wm8904_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct wm8904_priv *wm8904;
- struct snd_soc_codec *codec;
+ int ret;
wm8904 = kzalloc(sizeof(struct wm8904_priv), GFP_KERNEL);
if (wm8904 == NULL)
return -ENOMEM;
- codec = &wm8904->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
-
wm8904->devtype = id->driver_data;
-
i2c_set_clientdata(i2c, wm8904);
- codec->control_data = i2c;
+ wm8904->control_data = i2c;
wm8904->pdata = i2c->dev.platform_data;
- codec->dev = &i2c->dev;
-
- return wm8904_register(wm8904, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8904, &wm8904_dai, 1);
+ if (ret < 0)
+ kfree(wm8904);
+ return ret;
}
static __devexit int wm8904_i2c_remove(struct i2c_client *client)
{
- struct wm8904_priv *wm8904 = i2c_get_clientdata(client);
- wm8904_unregister(wm8904);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -2641,7 +2553,7 @@ MODULE_DEVICE_TABLE(i2c, wm8904_i2c_id);
static struct i2c_driver wm8904_i2c_driver = {
.driver = {
- .name = "WM8904",
+ .name = "wm8904-codec",
.owner = THIS_MODULE,
},
.probe = wm8904_i2c_probe,
@@ -2652,15 +2564,15 @@ static struct i2c_driver wm8904_i2c_driver = {
static int __init wm8904_modinit(void)
{
- int ret;
+ int ret = 0;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8904_i2c_driver);
if (ret != 0) {
- printk(KERN_ERR "Failed to register WM8904 I2C driver: %d\n",
+ printk(KERN_ERR "Failed to register wm8904 I2C driver: %d\n",
ret);
}
#endif
- return 0;
+ return ret;
}
module_init(wm8904_modinit);
diff --git a/sound/soc/codecs/wm8904.h b/sound/soc/codecs/wm8904.h
index abe5059b3004..9e8c84188ba7 100644
--- a/sound/soc/codecs/wm8904.h
+++ b/sound/soc/codecs/wm8904.h
@@ -21,9 +21,6 @@
#define WM8904_FLL_LRCLK 3
#define WM8904_FLL_FREE_RUNNING 4
-extern struct snd_soc_dai wm8904_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8904;
-
/*
* Register values.
*/
diff --git a/sound/soc/codecs/wm8940.c b/sound/soc/codecs/wm8940.c
index f0c11138e610..d28bf0dfdb1d 100644
--- a/sound/soc/codecs/wm8940.c
+++ b/sound/soc/codecs/wm8940.c
@@ -44,7 +44,8 @@
struct wm8940_priv {
unsigned int sysclk;
u16 reg_cache[WM8940_CACHEREGNUM];
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
+ void *control_data;
};
static u16 wm8940_reg_defaults[] = {
@@ -365,8 +366,7 @@ static int wm8940_i2s_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
u16 iface = snd_soc_read(codec, WM8940_IFACE) & 0xFD9F;
u16 addcntrl = snd_soc_read(codec, WM8940_ADDCNTRL) & 0xFFF1;
u16 companding = snd_soc_read(codec,
@@ -636,8 +636,8 @@ static struct snd_soc_dai_ops wm8940_dai_ops = {
.set_pll = wm8940_set_dai_pll,
};
-struct snd_soc_dai wm8940_dai = {
- .name = "WM8940",
+static struct snd_soc_dai_driver wm8940_dai = {
+ .name = "wm8940-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -655,20 +655,14 @@ struct snd_soc_dai wm8940_dai = {
.ops = &wm8940_dai_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(wm8940_dai);
-static int wm8940_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8940_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
return wm8940_set_bias_level(codec, SND_SOC_BIAS_OFF);
}
-static int wm8940_resume(struct platform_device *pdev)
+static int wm8940_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
int ret;
u8 data[3];
@@ -697,108 +691,26 @@ error_ret:
return ret;
}
-static struct snd_soc_codec *wm8940_codec;
-
-static int wm8940_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
-
- int ret = 0;
-
- if (wm8940_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = wm8940_codec;
- codec = wm8940_codec;
-
- mutex_init(&codec->mutex);
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
- ret = snd_soc_add_controls(codec, wm8940_snd_controls,
- ARRAY_SIZE(wm8940_snd_controls));
- if (ret)
- goto error_free_pcms;
- ret = wm8940_add_widgets(codec);
- if (ret)
- goto error_free_pcms;
-
- return ret;
-
-error_free_pcms:
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-pcm_err:
- return ret;
-}
-
-static int wm8940_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8940 = {
- .probe = wm8940_probe,
- .remove = wm8940_remove,
- .suspend = wm8940_suspend,
- .resume = wm8940_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8940);
-
-static int wm8940_register(struct wm8940_priv *wm8940,
- enum snd_soc_control_type control)
+static int wm8940_probe(struct snd_soc_codec *codec)
{
- struct wm8940_setup_data *pdata = wm8940->codec.dev->platform_data;
- struct snd_soc_codec *codec = &wm8940->codec;
+ struct wm8940_priv *wm8940 = snd_soc_codec_get_drvdata(codec);
+ struct wm8940_setup_data *pdata = codec->dev->platform_data;
int ret;
u16 reg;
- if (wm8940_codec) {
- dev_err(codec->dev, "Another WM8940 is registered\n");
- return -EINVAL;
- }
-
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8940);
- codec->name = "WM8940";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8940_set_bias_level;
- codec->dai = &wm8940_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = ARRAY_SIZE(wm8940_reg_defaults);
- codec->reg_cache = &wm8940->reg_cache;
- ret = snd_soc_codec_set_cache_io(codec, 8, 16, control);
+ codec->control_data = wm8940->control_data;
+ ret = snd_soc_codec_set_cache_io(codec, 8, 16, wm8940->control_type);
if (ret < 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
return ret;
}
- memcpy(codec->reg_cache, wm8940_reg_defaults,
- sizeof(wm8940_reg_defaults));
-
ret = wm8940_reset(codec);
if (ret < 0) {
dev_err(codec->dev, "Failed to issue reset\n");
return ret;
}
- wm8940_dai.dev = codec->dev;
-
wm8940_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
ret = snd_soc_write(codec, WM8940_POWER1, 0x180);
@@ -814,64 +726,60 @@ static int wm8940_register(struct wm8940_priv *wm8940,
return ret;
}
-
- wm8940_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
+ ret = snd_soc_add_controls(codec, wm8940_snd_controls,
+ ARRAY_SIZE(wm8940_snd_controls));
+ if (ret)
return ret;
- }
-
- ret = snd_soc_register_dai(&wm8940_dai);
- if (ret) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- snd_soc_unregister_codec(codec);
+ ret = wm8940_add_widgets(codec);
+ if (ret)
return ret;
- }
- return 0;
+ return ret;
+;
}
-static void wm8940_unregister(struct wm8940_priv *wm8940)
+static int wm8940_remove(struct snd_soc_codec *codec)
{
- wm8940_set_bias_level(&wm8940->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dai(&wm8940_dai);
- snd_soc_unregister_codec(&wm8940->codec);
- kfree(wm8940);
- wm8940_codec = NULL;
+ wm8940_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
}
-static int wm8940_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+static struct snd_soc_codec_driver soc_codec_dev_wm8940 = {
+ .probe = wm8940_probe,
+ .remove = wm8940_remove,
+ .suspend = wm8940_suspend,
+ .resume = wm8940_resume,
+ .set_bias_level = wm8940_set_bias_level,
+ .reg_cache_size = sizeof(wm8940_reg_defaults),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8940_reg_defaults,
+};
+
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static __devinit int wm8940_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
{
- int ret;
struct wm8940_priv *wm8940;
- struct snd_soc_codec *codec;
+ int ret;
- wm8940 = kzalloc(sizeof *wm8940, GFP_KERNEL);
+ wm8940 = kzalloc(sizeof(struct wm8940_priv), GFP_KERNEL);
if (wm8940 == NULL)
return -ENOMEM;
- codec = &wm8940->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
i2c_set_clientdata(i2c, wm8940);
- codec->control_data = i2c;
- codec->dev = &i2c->dev;
+ wm8940->control_data = i2c;
- ret = wm8940_register(wm8940, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8940, &wm8940_dai, 1);
if (ret < 0)
kfree(wm8940);
-
return ret;
}
-static int __devexit wm8940_i2c_remove(struct i2c_client *client)
+static __devexit int wm8940_i2c_remove(struct i2c_client *client)
{
- struct wm8940_priv *wm8940 = i2c_get_clientdata(client);
-
- wm8940_unregister(wm8940);
-
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -883,29 +791,34 @@ MODULE_DEVICE_TABLE(i2c, wm8940_i2c_id);
static struct i2c_driver wm8940_i2c_driver = {
.driver = {
- .name = "WM8940 I2C Codec",
+ .name = "wm8940-codec",
.owner = THIS_MODULE,
},
- .probe = wm8940_i2c_probe,
- .remove = __devexit_p(wm8940_i2c_remove),
+ .probe = wm8940_i2c_probe,
+ .remove = __devexit_p(wm8940_i2c_remove),
.id_table = wm8940_i2c_id,
};
+#endif
static int __init wm8940_modinit(void)
{
- int ret;
-
+ int ret = 0;
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8940_i2c_driver);
- if (ret)
- printk(KERN_ERR "Failed to register WM8940 I2C driver: %d\n",
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register wm8940 I2C driver: %d\n",
ret);
+ }
+#endif
return ret;
}
module_init(wm8940_modinit);
static void __exit wm8940_exit(void)
{
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_del_driver(&wm8940_i2c_driver);
+#endif
}
module_exit(wm8940_exit);
diff --git a/sound/soc/codecs/wm8940.h b/sound/soc/codecs/wm8940.h
index 8410eed3ef84..907fe192e9e0 100644
--- a/sound/soc/codecs/wm8940.h
+++ b/sound/soc/codecs/wm8940.h
@@ -15,8 +15,6 @@ struct wm8940_setup_data {
#define WM8940_VROI_30K 1
unsigned int vroi:1;
};
-extern struct snd_soc_dai wm8940_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8940;
/* WM8940 register space */
#define WM8940_SOFTRESET 0x00
diff --git a/sound/soc/codecs/wm8955.c b/sound/soc/codecs/wm8955.c
index 5f025593d84d..f89ad6c9a80b 100644
--- a/sound/soc/codecs/wm8955.c
+++ b/sound/soc/codecs/wm8955.c
@@ -30,9 +30,6 @@
#include "wm8955.h"
-static struct snd_soc_codec *wm8955_codec;
-struct snd_soc_codec_device soc_codec_dev_wm8955;
-
#define WM8955_NUM_SUPPLIES 4
static const char *wm8955_supply_names[WM8955_NUM_SUPPLIES] = {
"DCVDD",
@@ -43,7 +40,8 @@ static const char *wm8955_supply_names[WM8955_NUM_SUPPLIES] = {
/* codec private data */
struct wm8955_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
+
u16 reg_cache[WM8955_MAX_REGISTER + 1];
unsigned int mclk_rate;
@@ -52,8 +50,6 @@ struct wm8955_priv {
int fs;
struct regulator_bulk_data supplies[WM8955_NUM_SUPPLIES];
-
- struct wm8955_pdata *pdata;
};
static const u16 wm8955_reg[WM8955_MAX_REGISTER + 1] = {
@@ -870,8 +866,8 @@ static struct snd_soc_dai_ops wm8955_dai_ops = {
.digital_mute = wm8955_digital_mute,
};
-struct snd_soc_dai wm8955_dai = {
- .name = "WM8955",
+static struct snd_soc_dai_driver wm8955_dai = {
+ .name = "wm8955-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
@@ -881,24 +877,17 @@ struct snd_soc_dai wm8955_dai = {
},
.ops = &wm8955_dai_ops,
};
-EXPORT_SYMBOL_GPL(wm8955_dai);
#ifdef CONFIG_PM
-static int wm8955_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8955_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8955_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8955_resume(struct platform_device *pdev)
+static int wm8955_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8955_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
@@ -908,86 +897,16 @@ static int wm8955_resume(struct platform_device *pdev)
#define wm8955_resume NULL
#endif
-static int wm8955_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (wm8955_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = wm8955_codec;
- codec = wm8955_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
- wm8955_add_widgets(codec);
-
- return ret;
-
-pcm_err:
- return ret;
-}
-
-static int wm8955_remove(struct platform_device *pdev)
+static int wm8955_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8955 = {
- .probe = wm8955_probe,
- .remove = wm8955_remove,
- .suspend = wm8955_suspend,
- .resume = wm8955_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8955);
-
-static int wm8955_register(struct wm8955_priv *wm8955,
- enum snd_soc_control_type control)
-{
- int ret;
- struct snd_soc_codec *codec = &wm8955->codec;
- int i;
-
- if (wm8955_codec) {
- dev_err(codec->dev, "Another WM8955 is registered\n");
- ret = -EINVAL;
- goto err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8955);
- codec->name = "WM8955";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8955_set_bias_level;
- codec->dai = &wm8955_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = WM8955_MAX_REGISTER;
- codec->reg_cache = &wm8955->reg_cache;
-
- memcpy(codec->reg_cache, wm8955_reg, sizeof(wm8955_reg));
+ struct wm8955_priv *wm8955 = snd_soc_codec_get_drvdata(codec);
+ struct wm8955_pdata *pdata = dev_get_platdata(codec->dev);
+ int ret, i;
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8955->control_type);
if (ret != 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
+ return ret;
}
for (i = 0; i < ARRAY_SIZE(wm8955->supplies); i++)
@@ -997,7 +916,7 @@ static int wm8955_register(struct wm8955_priv *wm8955,
wm8955->supplies);
if (ret != 0) {
dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
- goto err;
+ return ret;
}
ret = regulator_bulk_enable(ARRAY_SIZE(wm8955->supplies),
@@ -1013,8 +932,6 @@ static int wm8955_register(struct wm8955_priv *wm8955,
goto err_enable;
}
- wm8955_dai.dev = codec->dev;
-
/* Change some default settings - latch VU and enable ZC */
wm8955->reg_cache[WM8955_LEFT_DAC_VOLUME] |= WM8955_LDVU;
wm8955->reg_cache[WM8955_RIGHT_DAC_VOLUME] |= WM8955_RDVU;
@@ -1028,12 +945,12 @@ static int wm8955_register(struct wm8955_priv *wm8955,
wm8955->reg_cache[WM8955_BASS_CONTROL] |= WM8955_BB;
/* Set platform data values */
- if (wm8955->pdata) {
- if (wm8955->pdata->out2_speaker)
+ if (pdata) {
+ if (pdata->out2_speaker)
wm8955->reg_cache[WM8955_ADDITIONAL_CONTROL_2]
|= WM8955_ROUT2INV;
- if (wm8955->pdata->monoin_diff)
+ if (pdata->monoin_diff)
wm8955->reg_cache[WM8955_MONO_OUT_MIX_1]
|= WM8955_DMEN;
}
@@ -1043,70 +960,60 @@ static int wm8955_register(struct wm8955_priv *wm8955,
/* Bias level configuration will have done an extra enable */
regulator_bulk_disable(ARRAY_SIZE(wm8955->supplies), wm8955->supplies);
- wm8955_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err_enable;
- }
-
- ret = snd_soc_register_dai(&wm8955_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
-
+ wm8955_add_widgets(codec);
return 0;
-err_codec:
- snd_soc_unregister_codec(codec);
err_enable:
regulator_bulk_disable(ARRAY_SIZE(wm8955->supplies), wm8955->supplies);
err_get:
regulator_bulk_free(ARRAY_SIZE(wm8955->supplies), wm8955->supplies);
-err:
- kfree(wm8955);
return ret;
}
-static void wm8955_unregister(struct wm8955_priv *wm8955)
+static int wm8955_remove(struct snd_soc_codec *codec)
{
- wm8955_set_bias_level(&wm8955->codec, SND_SOC_BIAS_OFF);
+ struct wm8955_priv *wm8955 = snd_soc_codec_get_drvdata(codec);
+
+ wm8955_set_bias_level(codec, SND_SOC_BIAS_OFF);
regulator_bulk_free(ARRAY_SIZE(wm8955->supplies), wm8955->supplies);
- snd_soc_unregister_dai(&wm8955_dai);
- snd_soc_unregister_codec(&wm8955->codec);
- kfree(wm8955);
- wm8955_codec = NULL;
+ return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_wm8955 = {
+ .probe = wm8955_probe,
+ .remove = wm8955_remove,
+ .suspend = wm8955_suspend,
+ .resume = wm8955_resume,
+ .set_bias_level = wm8955_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(wm8955_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8955_reg,
+};
+
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static __devinit int wm8955_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct wm8955_priv *wm8955;
- struct snd_soc_codec *codec;
+ int ret;
wm8955 = kzalloc(sizeof(struct wm8955_priv), GFP_KERNEL);
if (wm8955 == NULL)
return -ENOMEM;
- codec = &wm8955->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
-
i2c_set_clientdata(i2c, wm8955);
- codec->control_data = i2c;
- wm8955->pdata = i2c->dev.platform_data;
-
- codec->dev = &i2c->dev;
- return wm8955_register(wm8955, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8955, &wm8955_dai, 1);
+ if (ret < 0)
+ kfree(wm8955);
+ return ret;
}
static __devexit int wm8955_i2c_remove(struct i2c_client *client)
{
- struct wm8955_priv *wm8955 = i2c_get_clientdata(client);
- wm8955_unregister(wm8955);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -1118,7 +1025,7 @@ MODULE_DEVICE_TABLE(i2c, wm8955_i2c_id);
static struct i2c_driver wm8955_i2c_driver = {
.driver = {
- .name = "wm8955",
+ .name = "wm8955-codec",
.owner = THIS_MODULE,
},
.probe = wm8955_i2c_probe,
@@ -1129,7 +1036,7 @@ static struct i2c_driver wm8955_i2c_driver = {
static int __init wm8955_modinit(void)
{
- int ret;
+ int ret = 0;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8955_i2c_driver);
if (ret != 0) {
@@ -1137,7 +1044,7 @@ static int __init wm8955_modinit(void)
ret);
}
#endif
- return 0;
+ return ret;
}
module_init(wm8955_modinit);
diff --git a/sound/soc/codecs/wm8955.h b/sound/soc/codecs/wm8955.h
index ae349c8531f6..d13fd5c5fa63 100644
--- a/sound/soc/codecs/wm8955.h
+++ b/sound/soc/codecs/wm8955.h
@@ -15,9 +15,6 @@
#define WM8955_CLK_MCLK 1
-extern struct snd_soc_dai wm8955_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8955;
-
/*
* Register values.
*/
diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c
index 3c6ee61f6c95..8d5efb333c33 100644
--- a/sound/soc/codecs/wm8960.c
+++ b/sound/soc/codecs/wm8960.c
@@ -29,8 +29,6 @@
#define AUDIO_NAME "wm8960"
-struct snd_soc_codec_device soc_codec_dev_wm8960;
-
/* R25 - Power 1 */
#define WM8960_VMID_MASK 0x180
#define WM8960_VREF 0x40
@@ -75,7 +73,10 @@ static const u16 wm8960_reg[WM8960_CACHEREGNUM] = {
struct wm8960_priv {
u16 reg_cache[WM8960_CACHEREGNUM];
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
+ void *control_data;
+ int (*set_bias_level)(struct snd_soc_codec *,
+ enum snd_soc_bias_level level);
struct snd_soc_dapm_widget *lout1;
struct snd_soc_dapm_widget *rout1;
struct snd_soc_dapm_widget *out3;
@@ -507,8 +508,7 @@ static int wm8960_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
u16 iface = snd_soc_read(codec, WM8960_IFACE1) & 0xfff3;
int i;
@@ -849,6 +849,14 @@ static int wm8960_set_dai_clkdiv(struct snd_soc_dai *codec_dai,
return 0;
}
+static int wm8960_set_bias_level(struct snd_soc_codec *codec,
+ enum snd_soc_bias_level level)
+{
+ struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
+
+ return wm8960->set_bias_level(codec, level);
+}
+
#define WM8960_RATES SNDRV_PCM_RATE_8000_48000
#define WM8960_FORMATS \
@@ -863,8 +871,8 @@ static struct snd_soc_dai_ops wm8960_dai_ops = {
.set_pll = wm8960_set_dai_pll,
};
-struct snd_soc_dai wm8960_dai = {
- .name = "WM8960",
+static struct snd_soc_dai_driver wm8960_dai = {
+ .name = "wm8960-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -880,21 +888,18 @@ struct snd_soc_dai wm8960_dai = {
.ops = &wm8960_dai_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(wm8960_dai);
-static int wm8960_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8960_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
- codec->set_bias_level(codec, SND_SOC_BIAS_OFF);
+ wm8960->set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8960_resume(struct platform_device *pdev)
+static int wm8960_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
int i;
u8 data[2];
u16 *cache = codec->reg_cache;
@@ -906,78 +911,19 @@ static int wm8960_resume(struct platform_device *pdev)
codec->hw_write(codec->control_data, data, 2);
}
- codec->set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
+ wm8960->set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
}
-static struct snd_soc_codec *wm8960_codec;
-
-static int wm8960_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (wm8960_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = wm8960_codec;
- codec = wm8960_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
- snd_soc_add_controls(codec, wm8960_snd_controls,
- ARRAY_SIZE(wm8960_snd_controls));
- wm8960_add_widgets(codec);
-
- return ret;
-
-pcm_err:
- return ret;
-}
-
-/* power down chip */
-static int wm8960_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8960 = {
- .probe = wm8960_probe,
- .remove = wm8960_remove,
- .suspend = wm8960_suspend,
- .resume = wm8960_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8960);
-
-static int wm8960_register(struct wm8960_priv *wm8960,
- enum snd_soc_control_type control)
+static int wm8960_probe(struct snd_soc_codec *codec)
{
- struct wm8960_data *pdata = wm8960->codec.dev->platform_data;
- struct snd_soc_codec *codec = &wm8960->codec;
+ struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
+ struct wm8960_data *pdata = dev_get_platdata(codec->dev);
int ret;
u16 reg;
- if (wm8960_codec) {
- dev_err(codec->dev, "Another WM8960 is registered\n");
- ret = -EINVAL;
- goto err;
- }
-
- codec->set_bias_level = wm8960_set_bias_level_out3;
+ wm8960->set_bias_level = wm8960_set_bias_level_out3;
+ codec->control_data = wm8960->control_data;
if (!pdata) {
dev_warn(codec->dev, "No platform data supplied\n");
@@ -988,39 +934,22 @@ static int wm8960_register(struct wm8960_priv *wm8960,
}
if (pdata->capless)
- codec->set_bias_level = wm8960_set_bias_level_capless;
+ wm8960->set_bias_level = wm8960_set_bias_level_capless;
}
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8960);
- codec->name = "WM8960";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->dai = &wm8960_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = WM8960_CACHEREGNUM;
- codec->reg_cache = &wm8960->reg_cache;
-
- memcpy(codec->reg_cache, wm8960_reg, sizeof(wm8960_reg));
-
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8960->control_type);
if (ret < 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
+ return ret;
}
ret = wm8960_reset(codec);
if (ret < 0) {
dev_err(codec->dev, "Failed to issue reset\n");
- goto err;
+ return ret;
}
- wm8960_dai.dev = codec->dev;
-
- codec->set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+ wm8960->set_bias_level(codec, SND_SOC_BIAS_STANDBY);
/* Latch the update bits */
reg = snd_soc_read(codec, WM8960_LINVOL);
@@ -1044,62 +973,58 @@ static int wm8960_register(struct wm8960_priv *wm8960,
reg = snd_soc_read(codec, WM8960_ROUT2);
snd_soc_write(codec, WM8960_ROUT2, reg | 0x100);
- wm8960_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
-
- ret = snd_soc_register_dai(&wm8960_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
+ snd_soc_add_controls(codec, wm8960_snd_controls,
+ ARRAY_SIZE(wm8960_snd_controls));
+ wm8960_add_widgets(codec);
return 0;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- kfree(wm8960);
- return ret;
}
-static void wm8960_unregister(struct wm8960_priv *wm8960)
+/* power down chip */
+static int wm8960_remove(struct snd_soc_codec *codec)
{
- wm8960->codec.set_bias_level(&wm8960->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dai(&wm8960_dai);
- snd_soc_unregister_codec(&wm8960->codec);
- kfree(wm8960);
- wm8960_codec = NULL;
+ struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
+
+ wm8960->set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_wm8960 = {
+ .probe = wm8960_probe,
+ .remove = wm8960_remove,
+ .suspend = wm8960_suspend,
+ .resume = wm8960_resume,
+ .set_bias_level = wm8960_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(wm8960_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8960_reg,
+};
+
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static __devinit int wm8960_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct wm8960_priv *wm8960;
- struct snd_soc_codec *codec;
+ int ret;
wm8960 = kzalloc(sizeof(struct wm8960_priv), GFP_KERNEL);
if (wm8960 == NULL)
return -ENOMEM;
- codec = &wm8960->codec;
-
i2c_set_clientdata(i2c, wm8960);
- codec->control_data = i2c;
-
- codec->dev = &i2c->dev;
+ wm8960->control_data = i2c;
- return wm8960_register(wm8960, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8960, &wm8960_dai, 1);
+ if (ret < 0)
+ kfree(wm8960);
+ return ret;
}
static __devexit int wm8960_i2c_remove(struct i2c_client *client)
{
- struct wm8960_priv *wm8960 = i2c_get_clientdata(client);
- wm8960_unregister(wm8960);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -1111,35 +1036,37 @@ MODULE_DEVICE_TABLE(i2c, wm8960_i2c_id);
static struct i2c_driver wm8960_i2c_driver = {
.driver = {
- .name = "wm8960",
+ .name = "wm8960-codec",
.owner = THIS_MODULE,
},
.probe = wm8960_i2c_probe,
.remove = __devexit_p(wm8960_i2c_remove),
.id_table = wm8960_i2c_id,
};
+#endif
static int __init wm8960_modinit(void)
{
- int ret;
-
+ int ret = 0;
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8960_i2c_driver);
if (ret != 0) {
printk(KERN_ERR "Failed to register WM8960 I2C driver: %d\n",
ret);
}
-
+#endif
return ret;
}
module_init(wm8960_modinit);
static void __exit wm8960_exit(void)
{
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_del_driver(&wm8960_i2c_driver);
+#endif
}
module_exit(wm8960_exit);
-
MODULE_DESCRIPTION("ASoC WM8960 driver");
MODULE_AUTHOR("Liam Girdwood");
MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/wm8960.h b/sound/soc/codecs/wm8960.h
index a5ef65481b86..2d8163d7004b 100644
--- a/sound/soc/codecs/wm8960.h
+++ b/sound/soc/codecs/wm8960.h
@@ -110,7 +110,4 @@
#define WM8960_OPCLK_DIV_5_5 (4 << 0)
#define WM8960_OPCLK_DIV_6 (5 << 0)
-extern struct snd_soc_dai wm8960_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8960;
-
#endif
diff --git a/sound/soc/codecs/wm8961.c b/sound/soc/codecs/wm8961.c
index 2549d3a297ab..bfc6578ed060 100644
--- a/sound/soc/codecs/wm8961.c
+++ b/sound/soc/codecs/wm8961.c
@@ -288,7 +288,7 @@ static u16 wm8961_reg_defaults[] = {
};
struct wm8961_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
int sysclk;
u16 reg_cache[WM8961_MAX_REGISTER];
};
@@ -940,8 +940,8 @@ static struct snd_soc_dai_ops wm8961_dai_ops = {
.set_clkdiv = wm8961_set_clkdiv,
};
-struct snd_soc_dai wm8961_dai = {
- .name = "WM8961",
+static struct snd_soc_dai_driver wm8961_dai = {
+ .name = "wm8961-hifi",
.playback = {
.stream_name = "HiFi Playback",
.channels_min = 1,
@@ -956,140 +956,22 @@ struct snd_soc_dai wm8961_dai = {
.formats = WM8961_FORMATS,},
.ops = &wm8961_dai_ops,
};
-EXPORT_SYMBOL_GPL(wm8961_dai);
-
-static struct snd_soc_codec *wm8961_codec;
-
-static int wm8961_probe(struct platform_device *pdev)
+static int wm8961_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
int ret = 0;
-
- if (wm8961_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = wm8961_codec;
- codec = wm8961_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
- snd_soc_add_controls(codec, wm8961_snd_controls,
- ARRAY_SIZE(wm8961_snd_controls));
- snd_soc_dapm_new_controls(codec, wm8961_dapm_widgets,
- ARRAY_SIZE(wm8961_dapm_widgets));
- snd_soc_dapm_add_routes(codec, audio_paths, ARRAY_SIZE(audio_paths));
-
- return ret;
-
-pcm_err:
- return ret;
-}
-
-static int wm8961_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-#ifdef CONFIG_PM
-static int wm8961_suspend(struct platform_device *pdev, pm_message_t state)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- wm8961_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
- return 0;
-}
-
-static int wm8961_resume(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
- u16 *reg_cache = codec->reg_cache;
- int i;
-
- for (i = 0; i < codec->reg_cache_size; i++) {
- if (reg_cache[i] == wm8961_reg_defaults[i])
- continue;
-
- if (i == WM8961_SOFTWARE_RESET)
- continue;
-
- snd_soc_write(codec, i, reg_cache[i]);
- }
-
- wm8961_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
- return 0;
-}
-#else
-#define wm8961_suspend NULL
-#define wm8961_resume NULL
-#endif
-
-struct snd_soc_codec_device soc_codec_dev_wm8961 = {
- .probe = wm8961_probe,
- .remove = wm8961_remove,
- .suspend = wm8961_suspend,
- .resume = wm8961_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8961);
-
-static int wm8961_register(struct wm8961_priv *wm8961)
-{
- struct snd_soc_codec *codec = &wm8961->codec;
- int ret;
u16 reg;
- if (wm8961_codec) {
- dev_err(codec->dev, "Another WM8961 is registered\n");
- ret = -EINVAL;
- goto err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8961);
- codec->name = "WM8961";
- codec->owner = THIS_MODULE;
- codec->dai = &wm8961_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = ARRAY_SIZE(wm8961->reg_cache);
- codec->reg_cache = &wm8961->reg_cache;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8961_set_bias_level;
- codec->volatile_register = wm8961_volatile_register;
-
- memcpy(codec->reg_cache, wm8961_reg_defaults,
- sizeof(wm8961_reg_defaults));
-
ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C);
if (ret != 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
+ return ret;
}
reg = snd_soc_read(codec, WM8961_SOFTWARE_RESET);
if (reg != 0x1801) {
dev_err(codec->dev, "Device is not a WM8961: ID=0x%x\n", reg);
- ret = -EINVAL;
- goto err;
+ return -EINVAL;
}
/* This isn't volatile - readback doesn't correspond to write */
@@ -1102,7 +984,7 @@ static int wm8961_register(struct wm8961_priv *wm8961)
ret = wm8961_reset(codec);
if (ret < 0) {
dev_err(codec->dev, "Failed to issue reset\n");
- goto err;
+ return ret;
}
/* Enable class W */
@@ -1140,64 +1022,89 @@ static int wm8961_register(struct wm8961_priv *wm8961)
wm8961_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
- wm8961_dai.dev = codec->dev;
+ snd_soc_add_controls(codec, wm8961_snd_controls,
+ ARRAY_SIZE(wm8961_snd_controls));
+ snd_soc_dapm_new_controls(codec, wm8961_dapm_widgets,
+ ARRAY_SIZE(wm8961_dapm_widgets));
+ snd_soc_dapm_add_routes(codec, audio_paths, ARRAY_SIZE(audio_paths));
- wm8961_codec = codec;
+ return 0;
+}
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
+static int wm8961_remove(struct snd_soc_codec *codec)
+{
+ wm8961_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
+}
- ret = snd_soc_register_dai(&wm8961_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
+#ifdef CONFIG_PM
+static int wm8961_suspend(struct snd_soc_codec *codec, pm_message_t state)
+{
+ wm8961_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- kfree(wm8961);
- return ret;
}
-static void wm8961_unregister(struct wm8961_priv *wm8961)
+static int wm8961_resume(struct snd_soc_codec *codec)
{
- wm8961_set_bias_level(&wm8961->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dai(&wm8961_dai);
- snd_soc_unregister_codec(&wm8961->codec);
- kfree(wm8961);
- wm8961_codec = NULL;
+ u16 *reg_cache = codec->reg_cache;
+ int i;
+
+ for (i = 0; i < codec->driver->reg_cache_size; i++) {
+ if (reg_cache[i] == wm8961_reg_defaults[i])
+ continue;
+
+ if (i == WM8961_SOFTWARE_RESET)
+ continue;
+
+ snd_soc_write(codec, i, reg_cache[i]);
+ }
+
+ wm8961_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+
+ return 0;
}
+#else
+#define wm8961_suspend NULL
+#define wm8961_resume NULL
+#endif
+
+static struct snd_soc_codec_driver soc_codec_dev_wm8961 = {
+ .probe = wm8961_probe,
+ .remove = wm8961_remove,
+ .suspend = wm8961_suspend,
+ .resume = wm8961_resume,
+ .set_bias_level = wm8961_set_bias_level,
+ .reg_cache_size = sizeof(wm8961_reg_defaults),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8961_reg_defaults,
+ .volatile_register = wm8961_volatile_register,
+};
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static __devinit int wm8961_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct wm8961_priv *wm8961;
- struct snd_soc_codec *codec;
+ int ret;
wm8961 = kzalloc(sizeof(struct wm8961_priv), GFP_KERNEL);
if (wm8961 == NULL)
return -ENOMEM;
- codec = &wm8961->codec;
-
i2c_set_clientdata(i2c, wm8961);
- codec->control_data = i2c;
-
- codec->dev = &i2c->dev;
- return wm8961_register(wm8961);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8961, &wm8961_dai, 1);
+ if (ret < 0)
+ kfree(wm8961);
+ return ret;
}
static __devexit int wm8961_i2c_remove(struct i2c_client *client)
{
- struct wm8961_priv *wm8961 = i2c_get_clientdata(client);
- wm8961_unregister(wm8961);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -1209,35 +1116,37 @@ MODULE_DEVICE_TABLE(i2c, wm8961_i2c_id);
static struct i2c_driver wm8961_i2c_driver = {
.driver = {
- .name = "wm8961",
+ .name = "wm8961-codec",
.owner = THIS_MODULE,
},
.probe = wm8961_i2c_probe,
.remove = __devexit_p(wm8961_i2c_remove),
.id_table = wm8961_i2c_id,
};
+#endif
static int __init wm8961_modinit(void)
{
- int ret;
-
+ int ret = 0;
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8961_i2c_driver);
if (ret != 0) {
- printk(KERN_ERR "Failed to register WM8961 I2C driver: %d\n",
+ printk(KERN_ERR "Failed to register wm8961 I2C driver: %d\n",
ret);
}
-
+#endif
return ret;
}
module_init(wm8961_modinit);
static void __exit wm8961_exit(void)
{
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_del_driver(&wm8961_i2c_driver);
+#endif
}
module_exit(wm8961_exit);
-
MODULE_DESCRIPTION("ASoC WM8961 driver");
MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/wm8961.h b/sound/soc/codecs/wm8961.h
index 5513bfd720d6..1d736e5701c8 100644
--- a/sound/soc/codecs/wm8961.h
+++ b/sound/soc/codecs/wm8961.h
@@ -11,9 +11,6 @@
#include <sound/soc.h>
-extern struct snd_soc_codec_device soc_codec_dev_wm8961;
-extern struct snd_soc_dai wm8961_dai;
-
#define WM8961_BCLK 1
#define WM8961_LRCLK 2
diff --git a/sound/soc/codecs/wm8962-tables.c b/sound/soc/codecs/wm8962-tables.c
new file mode 100644
index 000000000000..f21a8c1b9d47
--- /dev/null
+++ b/sound/soc/codecs/wm8962-tables.c
@@ -0,0 +1,42299 @@
+/*
+ * wm8962-tables.c -- WM8962 ASoC driver
+ *
+ * Copyright 2010 Wolfson Microelectronics, plc
+ *
+ * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include "wm8962.h"
+
+const u16 wm8962_reg[WM8962_MAX_REGISTER + 1] = {
+ 0x009F, /* R0 - Left Input volume */
+ 0x049F, /* R1 - Right Input volume */
+ 0x0000, /* R2 - HPOUTL volume */
+ 0x0000, /* R3 - HPOUTR volume */
+ 0x0020, /* R4 - Clocking1 */
+ 0x0018, /* R5 - ADC & DAC Control 1 */
+ 0x2008, /* R6 - ADC & DAC Control 2 */
+ 0x000A, /* R7 - Audio Interface 0 */
+ 0x01E4, /* R8 - Clocking2 */
+ 0x0300, /* R9 - Audio Interface 1 */
+ 0x00C0, /* R10 - Left DAC volume */
+ 0x00C0, /* R11 - Right DAC volume */
+ 0x0000, /* R12 */
+ 0x0000, /* R13 */
+ 0x0040, /* R14 - Audio Interface 2 */
+ 0x6243, /* R15 - Software Reset */
+ 0x0000, /* R16 */
+ 0x007B, /* R17 - ALC1 */
+ 0x0000, /* R18 - ALC2 */
+ 0x1C32, /* R19 - ALC3 */
+ 0x3200, /* R20 - Noise Gate */
+ 0x00C0, /* R21 - Left ADC volume */
+ 0x00C0, /* R22 - Right ADC volume */
+ 0x0160, /* R23 - Additional control(1) */
+ 0x0000, /* R24 - Additional control(2) */
+ 0x0000, /* R25 - Pwr Mgmt (1) */
+ 0x0000, /* R26 - Pwr Mgmt (2) */
+ 0x0010, /* R27 - Additional Control (3) */
+ 0x0000, /* R28 - Anti-pop */
+ 0x0000, /* R29 */
+ 0x005E, /* R30 - Clocking 3 */
+ 0x0000, /* R31 - Input mixer control (1) */
+ 0x0145, /* R32 - Left input mixer volume */
+ 0x0145, /* R33 - Right input mixer volume */
+ 0x0009, /* R34 - Input mixer control (2) */
+ 0x0003, /* R35 - Input bias control */
+ 0x0000, /* R36 */
+ 0x0008, /* R37 - Left input PGA control */
+ 0x0008, /* R38 - Right input PGA control */
+ 0x0000, /* R39 */
+ 0x0000, /* R40 - SPKOUTL volume */
+ 0x0000, /* R41 - SPKOUTR volume */
+ 0x0000, /* R42 */
+ 0x0000, /* R43 */
+ 0x0000, /* R44 */
+ 0x0000, /* R45 */
+ 0x0000, /* R46 */
+ 0x0000, /* R47 - Thermal Shutdown Status */
+ 0x8027, /* R48 - Additional Control (4) */
+ 0x0010, /* R49 - Class D Control 1 */
+ 0x0000, /* R50 */
+ 0x0003, /* R51 - Class D Control 2 */
+ 0x0000, /* R52 */
+ 0x0000, /* R53 */
+ 0x0000, /* R54 */
+ 0x0000, /* R55 */
+ 0x0506, /* R56 - Clocking 4 */
+ 0x0000, /* R57 - DAC DSP Mixing (1) */
+ 0x0000, /* R58 - DAC DSP Mixing (2) */
+ 0x0000, /* R59 */
+ 0x0300, /* R60 - DC Servo 0 */
+ 0x0300, /* R61 - DC Servo 1 */
+ 0x0000, /* R62 */
+ 0x0000, /* R63 */
+ 0x0810, /* R64 - DC Servo 4 */
+ 0x0000, /* R65 */
+ 0x0000, /* R66 - DC Servo 6 */
+ 0x0000, /* R67 */
+ 0x001B, /* R68 - Analogue PGA Bias */
+ 0x0000, /* R69 - Analogue HP 0 */
+ 0x0000, /* R70 */
+ 0x01FB, /* R71 - Analogue HP 2 */
+ 0x0000, /* R72 - Charge Pump 1 */
+ 0x0000, /* R73 */
+ 0x0000, /* R74 */
+ 0x0000, /* R75 */
+ 0x0000, /* R76 */
+ 0x0000, /* R77 */
+ 0x0000, /* R78 */
+ 0x0000, /* R79 */
+ 0x0000, /* R80 */
+ 0x0000, /* R81 */
+ 0x0004, /* R82 - Charge Pump B */
+ 0x0000, /* R83 */
+ 0x0000, /* R84 */
+ 0x0000, /* R85 */
+ 0x0000, /* R86 */
+ 0x0000, /* R87 - Write Sequencer Control 1 */
+ 0x0000, /* R88 */
+ 0x0000, /* R89 */
+ 0x0000, /* R90 - Write Sequencer Control 2 */
+ 0x0000, /* R91 */
+ 0x0000, /* R92 */
+ 0x0000, /* R93 - Write Sequencer Control 3 */
+ 0x0000, /* R94 - Control Interface */
+ 0x0000, /* R95 */
+ 0x0000, /* R96 */
+ 0x0000, /* R97 */
+ 0x0000, /* R98 */
+ 0x0000, /* R99 - Mixer Enables */
+ 0x0000, /* R100 - Headphone Mixer (1) */
+ 0x0000, /* R101 - Headphone Mixer (2) */
+ 0x013F, /* R102 - Headphone Mixer (3) */
+ 0x013F, /* R103 - Headphone Mixer (4) */
+ 0x0000, /* R104 */
+ 0x0000, /* R105 - Speaker Mixer (1) */
+ 0x0000, /* R106 - Speaker Mixer (2) */
+ 0x013F, /* R107 - Speaker Mixer (3) */
+ 0x013F, /* R108 - Speaker Mixer (4) */
+ 0x0003, /* R109 - Speaker Mixer (5) */
+ 0x0002, /* R110 - Beep Generator (1) */
+ 0x0000, /* R111 */
+ 0x0000, /* R112 */
+ 0x0000, /* R113 */
+ 0x0000, /* R114 */
+ 0x0006, /* R115 - Oscillator Trim (3) */
+ 0x0026, /* R116 - Oscillator Trim (4) */
+ 0x0000, /* R117 */
+ 0x0000, /* R118 */
+ 0x0000, /* R119 - Oscillator Trim (7) */
+ 0x0000, /* R120 */
+ 0x0000, /* R121 */
+ 0x0000, /* R122 */
+ 0x0000, /* R123 */
+ 0x0011, /* R124 - Analogue Clocking1 */
+ 0x004B, /* R125 - Analogue Clocking2 */
+ 0x000D, /* R126 - Analogue Clocking3 */
+ 0x0000, /* R127 - PLL Software Reset */
+ 0x0000, /* R128 */
+ 0x0000, /* R129 - PLL2 */
+ 0x0000, /* R130 */
+ 0x0000, /* R131 - PLL 4 */
+ 0x0000, /* R132 */
+ 0x0000, /* R133 */
+ 0x0000, /* R134 */
+ 0x0000, /* R135 */
+ 0x0067, /* R136 - PLL 9 */
+ 0x001C, /* R137 - PLL 10 */
+ 0x0071, /* R138 - PLL 11 */
+ 0x00C7, /* R139 - PLL 12 */
+ 0x0067, /* R140 - PLL 13 */
+ 0x0048, /* R141 - PLL 14 */
+ 0x0022, /* R142 - PLL 15 */
+ 0x0097, /* R143 - PLL 16 */
+ 0x0000, /* R144 */
+ 0x0000, /* R145 */
+ 0x0000, /* R146 */
+ 0x0000, /* R147 */
+ 0x0000, /* R148 */
+ 0x0000, /* R149 */
+ 0x0000, /* R150 */
+ 0x0000, /* R151 */
+ 0x0000, /* R152 */
+ 0x0000, /* R153 */
+ 0x0000, /* R154 */
+ 0x000C, /* R155 - FLL Control (1) */
+ 0x0039, /* R156 - FLL Control (2) */
+ 0x0180, /* R157 - FLL Control (3) */
+ 0x0000, /* R158 */
+ 0x0032, /* R159 - FLL Control (5) */
+ 0x0018, /* R160 - FLL Control (6) */
+ 0x007D, /* R161 - FLL Control (7) */
+ 0x0008, /* R162 - FLL Control (8) */
+ 0x0000, /* R163 */
+ 0x0000, /* R164 */
+ 0x0000, /* R165 */
+ 0x0000, /* R166 */
+ 0x0000, /* R167 */
+ 0x0000, /* R168 */
+ 0x0000, /* R169 */
+ 0x0000, /* R170 */
+ 0x0000, /* R171 */
+ 0x0000, /* R172 */
+ 0x0000, /* R173 */
+ 0x0000, /* R174 */
+ 0x0000, /* R175 */
+ 0x0000, /* R176 */
+ 0x0000, /* R177 */
+ 0x0000, /* R178 */
+ 0x0000, /* R179 */
+ 0x0000, /* R180 */
+ 0x0000, /* R181 */
+ 0x0000, /* R182 */
+ 0x0000, /* R183 */
+ 0x0000, /* R184 */
+ 0x0000, /* R185 */
+ 0x0000, /* R186 */
+ 0x0000, /* R187 */
+ 0x0000, /* R188 */
+ 0x0000, /* R189 */
+ 0x0000, /* R190 */
+ 0x0000, /* R191 */
+ 0x0000, /* R192 */
+ 0x0000, /* R193 */
+ 0x0000, /* R194 */
+ 0x0000, /* R195 */
+ 0x0000, /* R196 */
+ 0x0000, /* R197 */
+ 0x0000, /* R198 */
+ 0x0000, /* R199 */
+ 0x0000, /* R200 */
+ 0x0000, /* R201 */
+ 0x0000, /* R202 */
+ 0x0000, /* R203 */
+ 0x0000, /* R204 */
+ 0x0000, /* R205 */
+ 0x0000, /* R206 */
+ 0x0000, /* R207 */
+ 0x0000, /* R208 */
+ 0x0000, /* R209 */
+ 0x0000, /* R210 */
+ 0x0000, /* R211 */
+ 0x0000, /* R212 */
+ 0x0000, /* R213 */
+ 0x0000, /* R214 */
+ 0x0000, /* R215 */
+ 0x0000, /* R216 */
+ 0x0000, /* R217 */
+ 0x0000, /* R218 */
+ 0x0000, /* R219 */
+ 0x0000, /* R220 */
+ 0x0000, /* R221 */
+ 0x0000, /* R222 */
+ 0x0000, /* R223 */
+ 0x0000, /* R224 */
+ 0x0000, /* R225 */
+ 0x0000, /* R226 */
+ 0x0000, /* R227 */
+ 0x0000, /* R228 */
+ 0x0000, /* R229 */
+ 0x0000, /* R230 */
+ 0x0000, /* R231 */
+ 0x0000, /* R232 */
+ 0x0000, /* R233 */
+ 0x0000, /* R234 */
+ 0x0000, /* R235 */
+ 0x0000, /* R236 */
+ 0x0000, /* R237 */
+ 0x0000, /* R238 */
+ 0x0000, /* R239 */
+ 0x0000, /* R240 */
+ 0x0000, /* R241 */
+ 0x0000, /* R242 */
+ 0x0000, /* R243 */
+ 0x0000, /* R244 */
+ 0x0000, /* R245 */
+ 0x0000, /* R246 */
+ 0x0000, /* R247 */
+ 0x0000, /* R248 */
+ 0x0000, /* R249 */
+ 0x0000, /* R250 */
+ 0x0000, /* R251 */
+ 0x0005, /* R252 - General test 1 */
+ 0x0000, /* R253 */
+ 0x0000, /* R254 */
+ 0x0000, /* R255 */
+ 0x0000, /* R256 - DF1 */
+ 0x0000, /* R257 - DF2 */
+ 0x0000, /* R258 - DF3 */
+ 0x0000, /* R259 - DF4 */
+ 0x0000, /* R260 - DF5 */
+ 0x0000, /* R261 - DF6 */
+ 0x0000, /* R262 - DF7 */
+ 0x0000, /* R263 */
+ 0x0000, /* R264 - LHPF1 */
+ 0x0000, /* R265 - LHPF2 */
+ 0x0000, /* R266 */
+ 0x0000, /* R267 */
+ 0x0000, /* R268 - THREED1 */
+ 0x0000, /* R269 - THREED2 */
+ 0x0000, /* R270 - THREED3 */
+ 0x0000, /* R271 - THREED4 */
+ 0x0000, /* R272 */
+ 0x0000, /* R273 */
+ 0x0000, /* R274 */
+ 0x0000, /* R275 */
+ 0x000C, /* R276 - DRC 1 */
+ 0x0925, /* R277 - DRC 2 */
+ 0x0000, /* R278 - DRC 3 */
+ 0x0000, /* R279 - DRC 4 */
+ 0x0000, /* R280 - DRC 5 */
+ 0x0000, /* R281 */
+ 0x0000, /* R282 */
+ 0x0000, /* R283 */
+ 0x0000, /* R284 */
+ 0x0000, /* R285 - Tloopback */
+ 0x0000, /* R286 */
+ 0x0000, /* R287 */
+ 0x0000, /* R288 */
+ 0x0000, /* R289 */
+ 0x0000, /* R290 */
+ 0x0000, /* R291 */
+ 0x0000, /* R292 */
+ 0x0000, /* R293 */
+ 0x0000, /* R294 */
+ 0x0000, /* R295 */
+ 0x0000, /* R296 */
+ 0x0000, /* R297 */
+ 0x0000, /* R298 */
+ 0x0000, /* R299 */
+ 0x0000, /* R300 */
+ 0x0000, /* R301 */
+ 0x0000, /* R302 */
+ 0x0000, /* R303 */
+ 0x0000, /* R304 */
+ 0x0000, /* R305 */
+ 0x0000, /* R306 */
+ 0x0000, /* R307 */
+ 0x0000, /* R308 */
+ 0x0000, /* R309 */
+ 0x0000, /* R310 */
+ 0x0000, /* R311 */
+ 0x0000, /* R312 */
+ 0x0000, /* R313 */
+ 0x0000, /* R314 */
+ 0x0000, /* R315 */
+ 0x0000, /* R316 */
+ 0x0000, /* R317 */
+ 0x0000, /* R318 */
+ 0x0000, /* R319 */
+ 0x0000, /* R320 */
+ 0x0000, /* R321 */
+ 0x0000, /* R322 */
+ 0x0000, /* R323 */
+ 0x0000, /* R324 */
+ 0x0000, /* R325 */
+ 0x0000, /* R326 */
+ 0x0000, /* R327 */
+ 0x0000, /* R328 */
+ 0x0000, /* R329 */
+ 0x0000, /* R330 */
+ 0x0000, /* R331 */
+ 0x0000, /* R332 */
+ 0x0000, /* R333 */
+ 0x0000, /* R334 */
+ 0x0004, /* R335 - EQ1 */
+ 0x6318, /* R336 - EQ2 */
+ 0x6300, /* R337 - EQ3 */
+ 0x0FCA, /* R338 - EQ4 */
+ 0x0400, /* R339 - EQ5 */
+ 0x00D8, /* R340 - EQ6 */
+ 0x1EB5, /* R341 - EQ7 */
+ 0xF145, /* R342 - EQ8 */
+ 0x0B75, /* R343 - EQ9 */
+ 0x01C5, /* R344 - EQ10 */
+ 0x1C58, /* R345 - EQ11 */
+ 0xF373, /* R346 - EQ12 */
+ 0x0A54, /* R347 - EQ13 */
+ 0x0558, /* R348 - EQ14 */
+ 0x168E, /* R349 - EQ15 */
+ 0xF829, /* R350 - EQ16 */
+ 0x07AD, /* R351 - EQ17 */
+ 0x1103, /* R352 - EQ18 */
+ 0x0564, /* R353 - EQ19 */
+ 0x0559, /* R354 - EQ20 */
+ 0x4000, /* R355 - EQ21 */
+ 0x6318, /* R356 - EQ22 */
+ 0x6300, /* R357 - EQ23 */
+ 0x0FCA, /* R358 - EQ24 */
+ 0x0400, /* R359 - EQ25 */
+ 0x00D8, /* R360 - EQ26 */
+ 0x1EB5, /* R361 - EQ27 */
+ 0xF145, /* R362 - EQ28 */
+ 0x0B75, /* R363 - EQ29 */
+ 0x01C5, /* R364 - EQ30 */
+ 0x1C58, /* R365 - EQ31 */
+ 0xF373, /* R366 - EQ32 */
+ 0x0A54, /* R367 - EQ33 */
+ 0x0558, /* R368 - EQ34 */
+ 0x168E, /* R369 - EQ35 */
+ 0xF829, /* R370 - EQ36 */
+ 0x07AD, /* R371 - EQ37 */
+ 0x1103, /* R372 - EQ38 */
+ 0x0564, /* R373 - EQ39 */
+ 0x0559, /* R374 - EQ40 */
+ 0x4000, /* R375 - EQ41 */
+ 0x0000, /* R376 */
+ 0x0000, /* R377 */
+ 0x0000, /* R378 */
+ 0x0000, /* R379 */
+ 0x0000, /* R380 */
+ 0x0000, /* R381 */
+ 0x0000, /* R382 */
+ 0x0000, /* R383 */
+ 0x0000, /* R384 */
+ 0x0000, /* R385 */
+ 0x0000, /* R386 */
+ 0x0000, /* R387 */
+ 0x0000, /* R388 */
+ 0x0000, /* R389 */
+ 0x0000, /* R390 */
+ 0x0000, /* R391 */
+ 0x0000, /* R392 */
+ 0x0000, /* R393 */
+ 0x0000, /* R394 */
+ 0x0000, /* R395 */
+ 0x0000, /* R396 */
+ 0x0000, /* R397 */
+ 0x0000, /* R398 */
+ 0x0000, /* R399 */
+ 0x0000, /* R400 */
+ 0x0000, /* R401 */
+ 0x0000, /* R402 */
+ 0x0000, /* R403 */
+ 0x0000, /* R404 */
+ 0x0000, /* R405 */
+ 0x0000, /* R406 */
+ 0x0000, /* R407 */
+ 0x0000, /* R408 */
+ 0x0000, /* R409 */
+ 0x0000, /* R410 */
+ 0x0000, /* R411 */
+ 0x0000, /* R412 */
+ 0x0000, /* R413 */
+ 0x0000, /* R414 */
+ 0x0000, /* R415 */
+ 0x0000, /* R416 */
+ 0x0000, /* R417 */
+ 0x0000, /* R418 */
+ 0x0000, /* R419 */
+ 0x0000, /* R420 */
+ 0x0000, /* R421 */
+ 0x0000, /* R422 */
+ 0x0000, /* R423 */
+ 0x0000, /* R424 */
+ 0x0000, /* R425 */
+ 0x0000, /* R426 */
+ 0x0000, /* R427 */
+ 0x0000, /* R428 */
+ 0x0000, /* R429 */
+ 0x0000, /* R430 */
+ 0x0000, /* R431 */
+ 0x0000, /* R432 */
+ 0x0000, /* R433 */
+ 0x0000, /* R434 */
+ 0x0000, /* R435 */
+ 0x0000, /* R436 */
+ 0x0000, /* R437 */
+ 0x0000, /* R438 */
+ 0x0000, /* R439 */
+ 0x0000, /* R440 */
+ 0x0000, /* R441 */
+ 0x0000, /* R442 */
+ 0x0000, /* R443 */
+ 0x0000, /* R444 */
+ 0x0000, /* R445 */
+ 0x0000, /* R446 */
+ 0x0000, /* R447 */
+ 0x0000, /* R448 */
+ 0x0000, /* R449 */
+ 0x0000, /* R450 */
+ 0x0000, /* R451 */
+ 0x0000, /* R452 */
+ 0x0000, /* R453 */
+ 0x0000, /* R454 */
+ 0x0000, /* R455 */
+ 0x0000, /* R456 */
+ 0x0000, /* R457 */
+ 0x0000, /* R458 */
+ 0x0000, /* R459 */
+ 0x0000, /* R460 */
+ 0x0000, /* R461 */
+ 0x0000, /* R462 */
+ 0x0000, /* R463 */
+ 0x0000, /* R464 */
+ 0x0000, /* R465 */
+ 0x0000, /* R466 */
+ 0x0000, /* R467 */
+ 0x0000, /* R468 */
+ 0x0000, /* R469 */
+ 0x0000, /* R470 */
+ 0x0000, /* R471 */
+ 0x0000, /* R472 */
+ 0x0000, /* R473 */
+ 0x0000, /* R474 */
+ 0x0000, /* R475 */
+ 0x0000, /* R476 */
+ 0x0000, /* R477 */
+ 0x0000, /* R478 */
+ 0x0000, /* R479 */
+ 0x0000, /* R480 */
+ 0x0000, /* R481 */
+ 0x0000, /* R482 */
+ 0x0000, /* R483 */
+ 0x0000, /* R484 */
+ 0x0000, /* R485 */
+ 0x0000, /* R486 */
+ 0x0000, /* R487 */
+ 0x0000, /* R488 */
+ 0x0000, /* R489 */
+ 0x0000, /* R490 */
+ 0x0000, /* R491 */
+ 0x0000, /* R492 */
+ 0x0000, /* R493 */
+ 0x0000, /* R494 */
+ 0x0000, /* R495 */
+ 0x0000, /* R496 */
+ 0x0000, /* R497 */
+ 0x0000, /* R498 */
+ 0x0000, /* R499 */
+ 0x0000, /* R500 */
+ 0x0000, /* R501 */
+ 0x0000, /* R502 */
+ 0x0000, /* R503 */
+ 0x0000, /* R504 */
+ 0x0000, /* R505 */
+ 0x0000, /* R506 */
+ 0x0000, /* R507 */
+ 0x0000, /* R508 */
+ 0x0000, /* R509 */
+ 0x0000, /* R510 */
+ 0x0000, /* R511 */
+ 0x0000, /* R512 */
+ 0x0000, /* R513 - GPIO 2 */
+ 0x0000, /* R514 - GPIO 3 */
+ 0x0000, /* R515 */
+ 0x8100, /* R516 - GPIO 5 */
+ 0x8100, /* R517 - GPIO 6 */
+ 0x0000, /* R518 */
+ 0x0000, /* R519 */
+ 0x0000, /* R520 */
+ 0x0000, /* R521 */
+ 0x0000, /* R522 */
+ 0x0000, /* R523 */
+ 0x0000, /* R524 */
+ 0x0000, /* R525 */
+ 0x0000, /* R526 */
+ 0x0000, /* R527 */
+ 0x0000, /* R528 */
+ 0x0000, /* R529 */
+ 0x0000, /* R530 */
+ 0x0000, /* R531 */
+ 0x0000, /* R532 */
+ 0x0000, /* R533 */
+ 0x0000, /* R534 */
+ 0x0000, /* R535 */
+ 0x0000, /* R536 */
+ 0x0000, /* R537 */
+ 0x0000, /* R538 */
+ 0x0000, /* R539 */
+ 0x0000, /* R540 */
+ 0x0000, /* R541 */
+ 0x0000, /* R542 */
+ 0x0000, /* R543 */
+ 0x0000, /* R544 */
+ 0x0000, /* R545 */
+ 0x0000, /* R546 */
+ 0x0000, /* R547 */
+ 0x0000, /* R548 */
+ 0x0000, /* R549 */
+ 0x0000, /* R550 */
+ 0x0000, /* R551 */
+ 0x0000, /* R552 */
+ 0x0000, /* R553 */
+ 0x0000, /* R554 */
+ 0x0000, /* R555 */
+ 0x0000, /* R556 */
+ 0x0000, /* R557 */
+ 0x0000, /* R558 */
+ 0x0000, /* R559 */
+ 0x0000, /* R560 - Interrupt Status 1 */
+ 0x0000, /* R561 - Interrupt Status 2 */
+ 0x0000, /* R562 */
+ 0x0000, /* R563 */
+ 0x0000, /* R564 */
+ 0x0000, /* R565 */
+ 0x0000, /* R566 */
+ 0x0000, /* R567 */
+ 0x0030, /* R568 - Interrupt Status 1 Mask */
+ 0xFFED, /* R569 - Interrupt Status 2 Mask */
+ 0x0000, /* R570 */
+ 0x0000, /* R571 */
+ 0x0000, /* R572 */
+ 0x0000, /* R573 */
+ 0x0000, /* R574 */
+ 0x0000, /* R575 */
+ 0x0000, /* R576 - Interrupt Control */
+ 0x0000, /* R577 */
+ 0x0000, /* R578 */
+ 0x0000, /* R579 */
+ 0x0000, /* R580 */
+ 0x0000, /* R581 */
+ 0x0000, /* R582 */
+ 0x0000, /* R583 */
+ 0x002D, /* R584 - IRQ Debounce */
+ 0x0000, /* R585 */
+ 0x0000, /* R586 - MICINT Source Pol */
+ 0x0000, /* R587 */
+ 0x0000, /* R588 */
+ 0x0000, /* R589 */
+ 0x0000, /* R590 */
+ 0x0000, /* R591 */
+ 0x0000, /* R592 */
+ 0x0000, /* R593 */
+ 0x0000, /* R594 */
+ 0x0000, /* R595 */
+ 0x0000, /* R596 */
+ 0x0000, /* R597 */
+ 0x0000, /* R598 */
+ 0x0000, /* R599 */
+ 0x0000, /* R600 */
+ 0x0000, /* R601 */
+ 0x0000, /* R602 */
+ 0x0000, /* R603 */
+ 0x0000, /* R604 */
+ 0x0000, /* R605 */
+ 0x0000, /* R606 */
+ 0x0000, /* R607 */
+ 0x0000, /* R608 */
+ 0x0000, /* R609 */
+ 0x0000, /* R610 */
+ 0x0000, /* R611 */
+ 0x0000, /* R612 */
+ 0x0000, /* R613 */
+ 0x0000, /* R614 */
+ 0x0000, /* R615 */
+ 0x0000, /* R616 */
+ 0x0000, /* R617 */
+ 0x0000, /* R618 */
+ 0x0000, /* R619 */
+ 0x0000, /* R620 */
+ 0x0000, /* R621 */
+ 0x0000, /* R622 */
+ 0x0000, /* R623 */
+ 0x0000, /* R624 */
+ 0x0000, /* R625 */
+ 0x0000, /* R626 */
+ 0x0000, /* R627 */
+ 0x0000, /* R628 */
+ 0x0000, /* R629 */
+ 0x0000, /* R630 */
+ 0x0000, /* R631 */
+ 0x0000, /* R632 */
+ 0x0000, /* R633 */
+ 0x0000, /* R634 */
+ 0x0000, /* R635 */
+ 0x0000, /* R636 */
+ 0x0000, /* R637 */
+ 0x0000, /* R638 */
+ 0x0000, /* R639 */
+ 0x0000, /* R640 */
+ 0x0000, /* R641 */
+ 0x0000, /* R642 */
+ 0x0000, /* R643 */
+ 0x0000, /* R644 */
+ 0x0000, /* R645 */
+ 0x0000, /* R646 */
+ 0x0000, /* R647 */
+ 0x0000, /* R648 */
+ 0x0000, /* R649 */
+ 0x0000, /* R650 */
+ 0x0000, /* R651 */
+ 0x0000, /* R652 */
+ 0x0000, /* R653 */
+ 0x0000, /* R654 */
+ 0x0000, /* R655 */
+ 0x0000, /* R656 */
+ 0x0000, /* R657 */
+ 0x0000, /* R658 */
+ 0x0000, /* R659 */
+ 0x0000, /* R660 */
+ 0x0000, /* R661 */
+ 0x0000, /* R662 */
+ 0x0000, /* R663 */
+ 0x0000, /* R664 */
+ 0x0000, /* R665 */
+ 0x0000, /* R666 */
+ 0x0000, /* R667 */
+ 0x0000, /* R668 */
+ 0x0000, /* R669 */
+ 0x0000, /* R670 */
+ 0x0000, /* R671 */
+ 0x0000, /* R672 */
+ 0x0000, /* R673 */
+ 0x0000, /* R674 */
+ 0x0000, /* R675 */
+ 0x0000, /* R676 */
+ 0x0000, /* R677 */
+ 0x0000, /* R678 */
+ 0x0000, /* R679 */
+ 0x0000, /* R680 */
+ 0x0000, /* R681 */
+ 0x0000, /* R682 */
+ 0x0000, /* R683 */
+ 0x0000, /* R684 */
+ 0x0000, /* R685 */
+ 0x0000, /* R686 */
+ 0x0000, /* R687 */
+ 0x0000, /* R688 */
+ 0x0000, /* R689 */
+ 0x0000, /* R690 */
+ 0x0000, /* R691 */
+ 0x0000, /* R692 */
+ 0x0000, /* R693 */
+ 0x0000, /* R694 */
+ 0x0000, /* R695 */
+ 0x0000, /* R696 */
+ 0x0000, /* R697 */
+ 0x0000, /* R698 */
+ 0x0000, /* R699 */
+ 0x0000, /* R700 */
+ 0x0000, /* R701 */
+ 0x0000, /* R702 */
+ 0x0000, /* R703 */
+ 0x0000, /* R704 */
+ 0x0000, /* R705 */
+ 0x0000, /* R706 */
+ 0x0000, /* R707 */
+ 0x0000, /* R708 */
+ 0x0000, /* R709 */
+ 0x0000, /* R710 */
+ 0x0000, /* R711 */
+ 0x0000, /* R712 */
+ 0x0000, /* R713 */
+ 0x0000, /* R714 */
+ 0x0000, /* R715 */
+ 0x0000, /* R716 */
+ 0x0000, /* R717 */
+ 0x0000, /* R718 */
+ 0x0000, /* R719 */
+ 0x0000, /* R720 */
+ 0x0000, /* R721 */
+ 0x0000, /* R722 */
+ 0x0000, /* R723 */
+ 0x0000, /* R724 */
+ 0x0000, /* R725 */
+ 0x0000, /* R726 */
+ 0x0000, /* R727 */
+ 0x0000, /* R728 */
+ 0x0000, /* R729 */
+ 0x0000, /* R730 */
+ 0x0000, /* R731 */
+ 0x0000, /* R732 */
+ 0x0000, /* R733 */
+ 0x0000, /* R734 */
+ 0x0000, /* R735 */
+ 0x0000, /* R736 */
+ 0x0000, /* R737 */
+ 0x0000, /* R738 */
+ 0x0000, /* R739 */
+ 0x0000, /* R740 */
+ 0x0000, /* R741 */
+ 0x0000, /* R742 */
+ 0x0000, /* R743 */
+ 0x0000, /* R744 */
+ 0x0000, /* R745 */
+ 0x0000, /* R746 */
+ 0x0000, /* R747 */
+ 0x0000, /* R748 */
+ 0x0000, /* R749 */
+ 0x0000, /* R750 */
+ 0x0000, /* R751 */
+ 0x0000, /* R752 */
+ 0x0000, /* R753 */
+ 0x0000, /* R754 */
+ 0x0000, /* R755 */
+ 0x0000, /* R756 */
+ 0x0000, /* R757 */
+ 0x0000, /* R758 */
+ 0x0000, /* R759 */
+ 0x0000, /* R760 */
+ 0x0000, /* R761 */
+ 0x0000, /* R762 */
+ 0x0000, /* R763 */
+ 0x0000, /* R764 */
+ 0x0000, /* R765 */
+ 0x0000, /* R766 */
+ 0x0000, /* R767 */
+ 0x1C00, /* R768 - DSP2 Power Management */
+ 0x0000, /* R769 */
+ 0x0000, /* R770 */
+ 0x0000, /* R771 */
+ 0x0000, /* R772 */
+ 0x0000, /* R773 */
+ 0x0000, /* R774 */
+ 0x0000, /* R775 */
+ 0x0000, /* R776 */
+ 0x0000, /* R777 */
+ 0x0000, /* R778 */
+ 0x0000, /* R779 */
+ 0x0000, /* R780 */
+ 0x0000, /* R781 */
+ 0x0000, /* R782 */
+ 0x0000, /* R783 */
+ 0x0000, /* R784 */
+ 0x0000, /* R785 */
+ 0x0000, /* R786 */
+ 0x0000, /* R787 */
+ 0x0000, /* R788 */
+ 0x0000, /* R789 */
+ 0x0000, /* R790 */
+ 0x0000, /* R791 */
+ 0x0000, /* R792 */
+ 0x0000, /* R793 */
+ 0x0000, /* R794 */
+ 0x0000, /* R795 */
+ 0x0000, /* R796 */
+ 0x0000, /* R797 */
+ 0x0000, /* R798 */
+ 0x0000, /* R799 */
+ 0x0000, /* R800 */
+ 0x0000, /* R801 */
+ 0x0000, /* R802 */
+ 0x0000, /* R803 */
+ 0x0000, /* R804 */
+ 0x0000, /* R805 */
+ 0x0000, /* R806 */
+ 0x0000, /* R807 */
+ 0x0000, /* R808 */
+ 0x0000, /* R809 */
+ 0x0000, /* R810 */
+ 0x0000, /* R811 */
+ 0x0000, /* R812 */
+ 0x0000, /* R813 */
+ 0x0000, /* R814 */
+ 0x0000, /* R815 */
+ 0x0000, /* R816 */
+ 0x0000, /* R817 */
+ 0x0000, /* R818 */
+ 0x0000, /* R819 */
+ 0x0000, /* R820 */
+ 0x0000, /* R821 */
+ 0x0000, /* R822 */
+ 0x0000, /* R823 */
+ 0x0000, /* R824 */
+ 0x0000, /* R825 */
+ 0x0000, /* R826 */
+ 0x0000, /* R827 */
+ 0x0000, /* R828 */
+ 0x0000, /* R829 */
+ 0x0000, /* R830 */
+ 0x0000, /* R831 */
+ 0x0000, /* R832 */
+ 0x0000, /* R833 */
+ 0x0000, /* R834 */
+ 0x0000, /* R835 */
+ 0x0000, /* R836 */
+ 0x0000, /* R837 */
+ 0x0000, /* R838 */
+ 0x0000, /* R839 */
+ 0x0000, /* R840 */
+ 0x0000, /* R841 */
+ 0x0000, /* R842 */
+ 0x0000, /* R843 */
+ 0x0000, /* R844 */
+ 0x0000, /* R845 */
+ 0x0000, /* R846 */
+ 0x0000, /* R847 */
+ 0x0000, /* R848 */
+ 0x0000, /* R849 */
+ 0x0000, /* R850 */
+ 0x0000, /* R851 */
+ 0x0000, /* R852 */
+ 0x0000, /* R853 */
+ 0x0000, /* R854 */
+ 0x0000, /* R855 */
+ 0x0000, /* R856 */
+ 0x0000, /* R857 */
+ 0x0000, /* R858 */
+ 0x0000, /* R859 */
+ 0x0000, /* R860 */
+ 0x0000, /* R861 */
+ 0x0000, /* R862 */
+ 0x0000, /* R863 */
+ 0x0000, /* R864 */
+ 0x0000, /* R865 */
+ 0x0000, /* R866 */
+ 0x0000, /* R867 */
+ 0x0000, /* R868 */
+ 0x0000, /* R869 */
+ 0x0000, /* R870 */
+ 0x0000, /* R871 */
+ 0x0000, /* R872 */
+ 0x0000, /* R873 */
+ 0x0000, /* R874 */
+ 0x0000, /* R875 */
+ 0x0000, /* R876 */
+ 0x0000, /* R877 */
+ 0x0000, /* R878 */
+ 0x0000, /* R879 */
+ 0x0000, /* R880 */
+ 0x0000, /* R881 */
+ 0x0000, /* R882 */
+ 0x0000, /* R883 */
+ 0x0000, /* R884 */
+ 0x0000, /* R885 */
+ 0x0000, /* R886 */
+ 0x0000, /* R887 */
+ 0x0000, /* R888 */
+ 0x0000, /* R889 */
+ 0x0000, /* R890 */
+ 0x0000, /* R891 */
+ 0x0000, /* R892 */
+ 0x0000, /* R893 */
+ 0x0000, /* R894 */
+ 0x0000, /* R895 */
+ 0x0000, /* R896 */
+ 0x0000, /* R897 */
+ 0x0000, /* R898 */
+ 0x0000, /* R899 */
+ 0x0000, /* R900 */
+ 0x0000, /* R901 */
+ 0x0000, /* R902 */
+ 0x0000, /* R903 */
+ 0x0000, /* R904 */
+ 0x0000, /* R905 */
+ 0x0000, /* R906 */
+ 0x0000, /* R907 */
+ 0x0000, /* R908 */
+ 0x0000, /* R909 */
+ 0x0000, /* R910 */
+ 0x0000, /* R911 */
+ 0x0000, /* R912 */
+ 0x0000, /* R913 */
+ 0x0000, /* R914 */
+ 0x0000, /* R915 */
+ 0x0000, /* R916 */
+ 0x0000, /* R917 */
+ 0x0000, /* R918 */
+ 0x0000, /* R919 */
+ 0x0000, /* R920 */
+ 0x0000, /* R921 */
+ 0x0000, /* R922 */
+ 0x0000, /* R923 */
+ 0x0000, /* R924 */
+ 0x0000, /* R925 */
+ 0x0000, /* R926 */
+ 0x0000, /* R927 */
+ 0x0000, /* R928 */
+ 0x0000, /* R929 */
+ 0x0000, /* R930 */
+ 0x0000, /* R931 */
+ 0x0000, /* R932 */
+ 0x0000, /* R933 */
+ 0x0000, /* R934 */
+ 0x0000, /* R935 */
+ 0x0000, /* R936 */
+ 0x0000, /* R937 */
+ 0x0000, /* R938 */
+ 0x0000, /* R939 */
+ 0x0000, /* R940 */
+ 0x0000, /* R941 */
+ 0x0000, /* R942 */
+ 0x0000, /* R943 */
+ 0x0000, /* R944 */
+ 0x0000, /* R945 */
+ 0x0000, /* R946 */
+ 0x0000, /* R947 */
+ 0x0000, /* R948 */
+ 0x0000, /* R949 */
+ 0x0000, /* R950 */
+ 0x0000, /* R951 */
+ 0x0000, /* R952 */
+ 0x0000, /* R953 */
+ 0x0000, /* R954 */
+ 0x0000, /* R955 */
+ 0x0000, /* R956 */
+ 0x0000, /* R957 */
+ 0x0000, /* R958 */
+ 0x0000, /* R959 */
+ 0x0000, /* R960 */
+ 0x0000, /* R961 */
+ 0x0000, /* R962 */
+ 0x0000, /* R963 */
+ 0x0000, /* R964 */
+ 0x0000, /* R965 */
+ 0x0000, /* R966 */
+ 0x0000, /* R967 */
+ 0x0000, /* R968 */
+ 0x0000, /* R969 */
+ 0x0000, /* R970 */
+ 0x0000, /* R971 */
+ 0x0000, /* R972 */
+ 0x0000, /* R973 */
+ 0x0000, /* R974 */
+ 0x0000, /* R975 */
+ 0x0000, /* R976 */
+ 0x0000, /* R977 */
+ 0x0000, /* R978 */
+ 0x0000, /* R979 */
+ 0x0000, /* R980 */
+ 0x0000, /* R981 */
+ 0x0000, /* R982 */
+ 0x0000, /* R983 */
+ 0x0000, /* R984 */
+ 0x0000, /* R985 */
+ 0x0000, /* R986 */
+ 0x0000, /* R987 */
+ 0x0000, /* R988 */
+ 0x0000, /* R989 */
+ 0x0000, /* R990 */
+ 0x0000, /* R991 */
+ 0x0000, /* R992 */
+ 0x0000, /* R993 */
+ 0x0000, /* R994 */
+ 0x0000, /* R995 */
+ 0x0000, /* R996 */
+ 0x0000, /* R997 */
+ 0x0000, /* R998 */
+ 0x0000, /* R999 */
+ 0x0000, /* R1000 */
+ 0x0000, /* R1001 */
+ 0x0000, /* R1002 */
+ 0x0000, /* R1003 */
+ 0x0000, /* R1004 */
+ 0x0000, /* R1005 */
+ 0x0000, /* R1006 */
+ 0x0000, /* R1007 */
+ 0x0000, /* R1008 */
+ 0x0000, /* R1009 */
+ 0x0000, /* R1010 */
+ 0x0000, /* R1011 */
+ 0x0000, /* R1012 */
+ 0x0000, /* R1013 */
+ 0x0000, /* R1014 */
+ 0x0000, /* R1015 */
+ 0x0000, /* R1016 */
+ 0x0000, /* R1017 */
+ 0x0000, /* R1018 */
+ 0x0000, /* R1019 */
+ 0x0000, /* R1020 */
+ 0x0000, /* R1021 */
+ 0x0000, /* R1022 */
+ 0x0000, /* R1023 */
+ 0x0000, /* R1024 */
+ 0x0000, /* R1025 */
+ 0x0000, /* R1026 */
+ 0x0000, /* R1027 */
+ 0x0000, /* R1028 */
+ 0x0000, /* R1029 */
+ 0x0000, /* R1030 */
+ 0x0000, /* R1031 */
+ 0x0000, /* R1032 */
+ 0x0000, /* R1033 */
+ 0x0000, /* R1034 */
+ 0x0000, /* R1035 */
+ 0x0000, /* R1036 */
+ 0x0000, /* R1037 - DSP2_ExecControl */
+ 0x0000, /* R1038 */
+ 0x0000, /* R1039 */
+ 0x0000, /* R1040 */
+ 0x0000, /* R1041 */
+ 0x0000, /* R1042 */
+ 0x0000, /* R1043 */
+ 0x0000, /* R1044 */
+ 0x0000, /* R1045 */
+ 0x0000, /* R1046 */
+ 0x0000, /* R1047 */
+ 0x0000, /* R1048 */
+ 0x0000, /* R1049 */
+ 0x0000, /* R1050 */
+ 0x0000, /* R1051 */
+ 0x0000, /* R1052 */
+ 0x0000, /* R1053 */
+ 0x0000, /* R1054 */
+ 0x0000, /* R1055 */
+ 0x0000, /* R1056 */
+ 0x0000, /* R1057 */
+ 0x0000, /* R1058 */
+ 0x0000, /* R1059 */
+ 0x0000, /* R1060 */
+ 0x0000, /* R1061 */
+ 0x0000, /* R1062 */
+ 0x0000, /* R1063 */
+ 0x0000, /* R1064 */
+ 0x0000, /* R1065 */
+ 0x0000, /* R1066 */
+ 0x0000, /* R1067 */
+ 0x0000, /* R1068 */
+ 0x0000, /* R1069 */
+ 0x0000, /* R1070 */
+ 0x0000, /* R1071 */
+ 0x0000, /* R1072 */
+ 0x0000, /* R1073 */
+ 0x0000, /* R1074 */
+ 0x0000, /* R1075 */
+ 0x0000, /* R1076 */
+ 0x0000, /* R1077 */
+ 0x0000, /* R1078 */
+ 0x0000, /* R1079 */
+ 0x0000, /* R1080 */
+ 0x0000, /* R1081 */
+ 0x0000, /* R1082 */
+ 0x0000, /* R1083 */
+ 0x0000, /* R1084 */
+ 0x0000, /* R1085 */
+ 0x0000, /* R1086 */
+ 0x0000, /* R1087 */
+ 0x0000, /* R1088 */
+ 0x0000, /* R1089 */
+ 0x0000, /* R1090 */
+ 0x0000, /* R1091 */
+ 0x0000, /* R1092 */
+ 0x0000, /* R1093 */
+ 0x0000, /* R1094 */
+ 0x0000, /* R1095 */
+ 0x0000, /* R1096 */
+ 0x0000, /* R1097 */
+ 0x0000, /* R1098 */
+ 0x0000, /* R1099 */
+ 0x0000, /* R1100 */
+ 0x0000, /* R1101 */
+ 0x0000, /* R1102 */
+ 0x0000, /* R1103 */
+ 0x0000, /* R1104 */
+ 0x0000, /* R1105 */
+ 0x0000, /* R1106 */
+ 0x0000, /* R1107 */
+ 0x0000, /* R1108 */
+ 0x0000, /* R1109 */
+ 0x0000, /* R1110 */
+ 0x0000, /* R1111 */
+ 0x0000, /* R1112 */
+ 0x0000, /* R1113 */
+ 0x0000, /* R1114 */
+ 0x0000, /* R1115 */
+ 0x0000, /* R1116 */
+ 0x0000, /* R1117 */
+ 0x0000, /* R1118 */
+ 0x0000, /* R1119 */
+ 0x0000, /* R1120 */
+ 0x0000, /* R1121 */
+ 0x0000, /* R1122 */
+ 0x0000, /* R1123 */
+ 0x0000, /* R1124 */
+ 0x0000, /* R1125 */
+ 0x0000, /* R1126 */
+ 0x0000, /* R1127 */
+ 0x0000, /* R1128 */
+ 0x0000, /* R1129 */
+ 0x0000, /* R1130 */
+ 0x0000, /* R1131 */
+ 0x0000, /* R1132 */
+ 0x0000, /* R1133 */
+ 0x0000, /* R1134 */
+ 0x0000, /* R1135 */
+ 0x0000, /* R1136 */
+ 0x0000, /* R1137 */
+ 0x0000, /* R1138 */
+ 0x0000, /* R1139 */
+ 0x0000, /* R1140 */
+ 0x0000, /* R1141 */
+ 0x0000, /* R1142 */
+ 0x0000, /* R1143 */
+ 0x0000, /* R1144 */
+ 0x0000, /* R1145 */
+ 0x0000, /* R1146 */
+ 0x0000, /* R1147 */
+ 0x0000, /* R1148 */
+ 0x0000, /* R1149 */
+ 0x0000, /* R1150 */
+ 0x0000, /* R1151 */
+ 0x0000, /* R1152 */
+ 0x0000, /* R1153 */
+ 0x0000, /* R1154 */
+ 0x0000, /* R1155 */
+ 0x0000, /* R1156 */
+ 0x0000, /* R1157 */
+ 0x0000, /* R1158 */
+ 0x0000, /* R1159 */
+ 0x0000, /* R1160 */
+ 0x0000, /* R1161 */
+ 0x0000, /* R1162 */
+ 0x0000, /* R1163 */
+ 0x0000, /* R1164 */
+ 0x0000, /* R1165 */
+ 0x0000, /* R1166 */
+ 0x0000, /* R1167 */
+ 0x0000, /* R1168 */
+ 0x0000, /* R1169 */
+ 0x0000, /* R1170 */
+ 0x0000, /* R1171 */
+ 0x0000, /* R1172 */
+ 0x0000, /* R1173 */
+ 0x0000, /* R1174 */
+ 0x0000, /* R1175 */
+ 0x0000, /* R1176 */
+ 0x0000, /* R1177 */
+ 0x0000, /* R1178 */
+ 0x0000, /* R1179 */
+ 0x0000, /* R1180 */
+ 0x0000, /* R1181 */
+ 0x0000, /* R1182 */
+ 0x0000, /* R1183 */
+ 0x0000, /* R1184 */
+ 0x0000, /* R1185 */
+ 0x0000, /* R1186 */
+ 0x0000, /* R1187 */
+ 0x0000, /* R1188 */
+ 0x0000, /* R1189 */
+ 0x0000, /* R1190 */
+ 0x0000, /* R1191 */
+ 0x0000, /* R1192 */
+ 0x0000, /* R1193 */
+ 0x0000, /* R1194 */
+ 0x0000, /* R1195 */
+ 0x0000, /* R1196 */
+ 0x0000, /* R1197 */
+ 0x0000, /* R1198 */
+ 0x0000, /* R1199 */
+ 0x0000, /* R1200 */
+ 0x0000, /* R1201 */
+ 0x0000, /* R1202 */
+ 0x0000, /* R1203 */
+ 0x0000, /* R1204 */
+ 0x0000, /* R1205 */
+ 0x0000, /* R1206 */
+ 0x0000, /* R1207 */
+ 0x0000, /* R1208 */
+ 0x0000, /* R1209 */
+ 0x0000, /* R1210 */
+ 0x0000, /* R1211 */
+ 0x0000, /* R1212 */
+ 0x0000, /* R1213 */
+ 0x0000, /* R1214 */
+ 0x0000, /* R1215 */
+ 0x0000, /* R1216 */
+ 0x0000, /* R1217 */
+ 0x0000, /* R1218 */
+ 0x0000, /* R1219 */
+ 0x0000, /* R1220 */
+ 0x0000, /* R1221 */
+ 0x0000, /* R1222 */
+ 0x0000, /* R1223 */
+ 0x0000, /* R1224 */
+ 0x0000, /* R1225 */
+ 0x0000, /* R1226 */
+ 0x0000, /* R1227 */
+ 0x0000, /* R1228 */
+ 0x0000, /* R1229 */
+ 0x0000, /* R1230 */
+ 0x0000, /* R1231 */
+ 0x0000, /* R1232 */
+ 0x0000, /* R1233 */
+ 0x0000, /* R1234 */
+ 0x0000, /* R1235 */
+ 0x0000, /* R1236 */
+ 0x0000, /* R1237 */
+ 0x0000, /* R1238 */
+ 0x0000, /* R1239 */
+ 0x0000, /* R1240 */
+ 0x0000, /* R1241 */
+ 0x0000, /* R1242 */
+ 0x0000, /* R1243 */
+ 0x0000, /* R1244 */
+ 0x0000, /* R1245 */
+ 0x0000, /* R1246 */
+ 0x0000, /* R1247 */
+ 0x0000, /* R1248 */
+ 0x0000, /* R1249 */
+ 0x0000, /* R1250 */
+ 0x0000, /* R1251 */
+ 0x0000, /* R1252 */
+ 0x0000, /* R1253 */
+ 0x0000, /* R1254 */
+ 0x0000, /* R1255 */
+ 0x0000, /* R1256 */
+ 0x0000, /* R1257 */
+ 0x0000, /* R1258 */
+ 0x0000, /* R1259 */
+ 0x0000, /* R1260 */
+ 0x0000, /* R1261 */
+ 0x0000, /* R1262 */
+ 0x0000, /* R1263 */
+ 0x0000, /* R1264 */
+ 0x0000, /* R1265 */
+ 0x0000, /* R1266 */
+ 0x0000, /* R1267 */
+ 0x0000, /* R1268 */
+ 0x0000, /* R1269 */
+ 0x0000, /* R1270 */
+ 0x0000, /* R1271 */
+ 0x0000, /* R1272 */
+ 0x0000, /* R1273 */
+ 0x0000, /* R1274 */
+ 0x0000, /* R1275 */
+ 0x0000, /* R1276 */
+ 0x0000, /* R1277 */
+ 0x0000, /* R1278 */
+ 0x0000, /* R1279 */
+ 0x0000, /* R1280 */
+ 0x0000, /* R1281 */
+ 0x0000, /* R1282 */
+ 0x0000, /* R1283 */
+ 0x0000, /* R1284 */
+ 0x0000, /* R1285 */
+ 0x0000, /* R1286 */
+ 0x0000, /* R1287 */
+ 0x0000, /* R1288 */
+ 0x0000, /* R1289 */
+ 0x0000, /* R1290 */
+ 0x0000, /* R1291 */
+ 0x0000, /* R1292 */
+ 0x0000, /* R1293 */
+ 0x0000, /* R1294 */
+ 0x0000, /* R1295 */
+ 0x0000, /* R1296 */
+ 0x0000, /* R1297 */
+ 0x0000, /* R1298 */
+ 0x0000, /* R1299 */
+ 0x0000, /* R1300 */
+ 0x0000, /* R1301 */
+ 0x0000, /* R1302 */
+ 0x0000, /* R1303 */
+ 0x0000, /* R1304 */
+ 0x0000, /* R1305 */
+ 0x0000, /* R1306 */
+ 0x0000, /* R1307 */
+ 0x0000, /* R1308 */
+ 0x0000, /* R1309 */
+ 0x0000, /* R1310 */
+ 0x0000, /* R1311 */
+ 0x0000, /* R1312 */
+ 0x0000, /* R1313 */
+ 0x0000, /* R1314 */
+ 0x0000, /* R1315 */
+ 0x0000, /* R1316 */
+ 0x0000, /* R1317 */
+ 0x0000, /* R1318 */
+ 0x0000, /* R1319 */
+ 0x0000, /* R1320 */
+ 0x0000, /* R1321 */
+ 0x0000, /* R1322 */
+ 0x0000, /* R1323 */
+ 0x0000, /* R1324 */
+ 0x0000, /* R1325 */
+ 0x0000, /* R1326 */
+ 0x0000, /* R1327 */
+ 0x0000, /* R1328 */
+ 0x0000, /* R1329 */
+ 0x0000, /* R1330 */
+ 0x0000, /* R1331 */
+ 0x0000, /* R1332 */
+ 0x0000, /* R1333 */
+ 0x0000, /* R1334 */
+ 0x0000, /* R1335 */
+ 0x0000, /* R1336 */
+ 0x0000, /* R1337 */
+ 0x0000, /* R1338 */
+ 0x0000, /* R1339 */
+ 0x0000, /* R1340 */
+ 0x0000, /* R1341 */
+ 0x0000, /* R1342 */
+ 0x0000, /* R1343 */
+ 0x0000, /* R1344 */
+ 0x0000, /* R1345 */
+ 0x0000, /* R1346 */
+ 0x0000, /* R1347 */
+ 0x0000, /* R1348 */
+ 0x0000, /* R1349 */
+ 0x0000, /* R1350 */
+ 0x0000, /* R1351 */
+ 0x0000, /* R1352 */
+ 0x0000, /* R1353 */
+ 0x0000, /* R1354 */
+ 0x0000, /* R1355 */
+ 0x0000, /* R1356 */
+ 0x0000, /* R1357 */
+ 0x0000, /* R1358 */
+ 0x0000, /* R1359 */
+ 0x0000, /* R1360 */
+ 0x0000, /* R1361 */
+ 0x0000, /* R1362 */
+ 0x0000, /* R1363 */
+ 0x0000, /* R1364 */
+ 0x0000, /* R1365 */
+ 0x0000, /* R1366 */
+ 0x0000, /* R1367 */
+ 0x0000, /* R1368 */
+ 0x0000, /* R1369 */
+ 0x0000, /* R1370 */
+ 0x0000, /* R1371 */
+ 0x0000, /* R1372 */
+ 0x0000, /* R1373 */
+ 0x0000, /* R1374 */
+ 0x0000, /* R1375 */
+ 0x0000, /* R1376 */
+ 0x0000, /* R1377 */
+ 0x0000, /* R1378 */
+ 0x0000, /* R1379 */
+ 0x0000, /* R1380 */
+ 0x0000, /* R1381 */
+ 0x0000, /* R1382 */
+ 0x0000, /* R1383 */
+ 0x0000, /* R1384 */
+ 0x0000, /* R1385 */
+ 0x0000, /* R1386 */
+ 0x0000, /* R1387 */
+ 0x0000, /* R1388 */
+ 0x0000, /* R1389 */
+ 0x0000, /* R1390 */
+ 0x0000, /* R1391 */
+ 0x0000, /* R1392 */
+ 0x0000, /* R1393 */
+ 0x0000, /* R1394 */
+ 0x0000, /* R1395 */
+ 0x0000, /* R1396 */
+ 0x0000, /* R1397 */
+ 0x0000, /* R1398 */
+ 0x0000, /* R1399 */
+ 0x0000, /* R1400 */
+ 0x0000, /* R1401 */
+ 0x0000, /* R1402 */
+ 0x0000, /* R1403 */
+ 0x0000, /* R1404 */
+ 0x0000, /* R1405 */
+ 0x0000, /* R1406 */
+ 0x0000, /* R1407 */
+ 0x0000, /* R1408 */
+ 0x0000, /* R1409 */
+ 0x0000, /* R1410 */
+ 0x0000, /* R1411 */
+ 0x0000, /* R1412 */
+ 0x0000, /* R1413 */
+ 0x0000, /* R1414 */
+ 0x0000, /* R1415 */
+ 0x0000, /* R1416 */
+ 0x0000, /* R1417 */
+ 0x0000, /* R1418 */
+ 0x0000, /* R1419 */
+ 0x0000, /* R1420 */
+ 0x0000, /* R1421 */
+ 0x0000, /* R1422 */
+ 0x0000, /* R1423 */
+ 0x0000, /* R1424 */
+ 0x0000, /* R1425 */
+ 0x0000, /* R1426 */
+ 0x0000, /* R1427 */
+ 0x0000, /* R1428 */
+ 0x0000, /* R1429 */
+ 0x0000, /* R1430 */
+ 0x0000, /* R1431 */
+ 0x0000, /* R1432 */
+ 0x0000, /* R1433 */
+ 0x0000, /* R1434 */
+ 0x0000, /* R1435 */
+ 0x0000, /* R1436 */
+ 0x0000, /* R1437 */
+ 0x0000, /* R1438 */
+ 0x0000, /* R1439 */
+ 0x0000, /* R1440 */
+ 0x0000, /* R1441 */
+ 0x0000, /* R1442 */
+ 0x0000, /* R1443 */
+ 0x0000, /* R1444 */
+ 0x0000, /* R1445 */
+ 0x0000, /* R1446 */
+ 0x0000, /* R1447 */
+ 0x0000, /* R1448 */
+ 0x0000, /* R1449 */
+ 0x0000, /* R1450 */
+ 0x0000, /* R1451 */
+ 0x0000, /* R1452 */
+ 0x0000, /* R1453 */
+ 0x0000, /* R1454 */
+ 0x0000, /* R1455 */
+ 0x0000, /* R1456 */
+ 0x0000, /* R1457 */
+ 0x0000, /* R1458 */
+ 0x0000, /* R1459 */
+ 0x0000, /* R1460 */
+ 0x0000, /* R1461 */
+ 0x0000, /* R1462 */
+ 0x0000, /* R1463 */
+ 0x0000, /* R1464 */
+ 0x0000, /* R1465 */
+ 0x0000, /* R1466 */
+ 0x0000, /* R1467 */
+ 0x0000, /* R1468 */
+ 0x0000, /* R1469 */
+ 0x0000, /* R1470 */
+ 0x0000, /* R1471 */
+ 0x0000, /* R1472 */
+ 0x0000, /* R1473 */
+ 0x0000, /* R1474 */
+ 0x0000, /* R1475 */
+ 0x0000, /* R1476 */
+ 0x0000, /* R1477 */
+ 0x0000, /* R1478 */
+ 0x0000, /* R1479 */
+ 0x0000, /* R1480 */
+ 0x0000, /* R1481 */
+ 0x0000, /* R1482 */
+ 0x0000, /* R1483 */
+ 0x0000, /* R1484 */
+ 0x0000, /* R1485 */
+ 0x0000, /* R1486 */
+ 0x0000, /* R1487 */
+ 0x0000, /* R1488 */
+ 0x0000, /* R1489 */
+ 0x0000, /* R1490 */
+ 0x0000, /* R1491 */
+ 0x0000, /* R1492 */
+ 0x0000, /* R1493 */
+ 0x0000, /* R1494 */
+ 0x0000, /* R1495 */
+ 0x0000, /* R1496 */
+ 0x0000, /* R1497 */
+ 0x0000, /* R1498 */
+ 0x0000, /* R1499 */
+ 0x0000, /* R1500 */
+ 0x0000, /* R1501 */
+ 0x0000, /* R1502 */
+ 0x0000, /* R1503 */
+ 0x0000, /* R1504 */
+ 0x0000, /* R1505 */
+ 0x0000, /* R1506 */
+ 0x0000, /* R1507 */
+ 0x0000, /* R1508 */
+ 0x0000, /* R1509 */
+ 0x0000, /* R1510 */
+ 0x0000, /* R1511 */
+ 0x0000, /* R1512 */
+ 0x0000, /* R1513 */
+ 0x0000, /* R1514 */
+ 0x0000, /* R1515 */
+ 0x0000, /* R1516 */
+ 0x0000, /* R1517 */
+ 0x0000, /* R1518 */
+ 0x0000, /* R1519 */
+ 0x0000, /* R1520 */
+ 0x0000, /* R1521 */
+ 0x0000, /* R1522 */
+ 0x0000, /* R1523 */
+ 0x0000, /* R1524 */
+ 0x0000, /* R1525 */
+ 0x0000, /* R1526 */
+ 0x0000, /* R1527 */
+ 0x0000, /* R1528 */
+ 0x0000, /* R1529 */
+ 0x0000, /* R1530 */
+ 0x0000, /* R1531 */
+ 0x0000, /* R1532 */
+ 0x0000, /* R1533 */
+ 0x0000, /* R1534 */
+ 0x0000, /* R1535 */
+ 0x0000, /* R1536 */
+ 0x0000, /* R1537 */
+ 0x0000, /* R1538 */
+ 0x0000, /* R1539 */
+ 0x0000, /* R1540 */
+ 0x0000, /* R1541 */
+ 0x0000, /* R1542 */
+ 0x0000, /* R1543 */
+ 0x0000, /* R1544 */
+ 0x0000, /* R1545 */
+ 0x0000, /* R1546 */
+ 0x0000, /* R1547 */
+ 0x0000, /* R1548 */
+ 0x0000, /* R1549 */
+ 0x0000, /* R1550 */
+ 0x0000, /* R1551 */
+ 0x0000, /* R1552 */
+ 0x0000, /* R1553 */
+ 0x0000, /* R1554 */
+ 0x0000, /* R1555 */
+ 0x0000, /* R1556 */
+ 0x0000, /* R1557 */
+ 0x0000, /* R1558 */
+ 0x0000, /* R1559 */
+ 0x0000, /* R1560 */
+ 0x0000, /* R1561 */
+ 0x0000, /* R1562 */
+ 0x0000, /* R1563 */
+ 0x0000, /* R1564 */
+ 0x0000, /* R1565 */
+ 0x0000, /* R1566 */
+ 0x0000, /* R1567 */
+ 0x0000, /* R1568 */
+ 0x0000, /* R1569 */
+ 0x0000, /* R1570 */
+ 0x0000, /* R1571 */
+ 0x0000, /* R1572 */
+ 0x0000, /* R1573 */
+ 0x0000, /* R1574 */
+ 0x0000, /* R1575 */
+ 0x0000, /* R1576 */
+ 0x0000, /* R1577 */
+ 0x0000, /* R1578 */
+ 0x0000, /* R1579 */
+ 0x0000, /* R1580 */
+ 0x0000, /* R1581 */
+ 0x0000, /* R1582 */
+ 0x0000, /* R1583 */
+ 0x0000, /* R1584 */
+ 0x0000, /* R1585 */
+ 0x0000, /* R1586 */
+ 0x0000, /* R1587 */
+ 0x0000, /* R1588 */
+ 0x0000, /* R1589 */
+ 0x0000, /* R1590 */
+ 0x0000, /* R1591 */
+ 0x0000, /* R1592 */
+ 0x0000, /* R1593 */
+ 0x0000, /* R1594 */
+ 0x0000, /* R1595 */
+ 0x0000, /* R1596 */
+ 0x0000, /* R1597 */
+ 0x0000, /* R1598 */
+ 0x0000, /* R1599 */
+ 0x0000, /* R1600 */
+ 0x0000, /* R1601 */
+ 0x0000, /* R1602 */
+ 0x0000, /* R1603 */
+ 0x0000, /* R1604 */
+ 0x0000, /* R1605 */
+ 0x0000, /* R1606 */
+ 0x0000, /* R1607 */
+ 0x0000, /* R1608 */
+ 0x0000, /* R1609 */
+ 0x0000, /* R1610 */
+ 0x0000, /* R1611 */
+ 0x0000, /* R1612 */
+ 0x0000, /* R1613 */
+ 0x0000, /* R1614 */
+ 0x0000, /* R1615 */
+ 0x0000, /* R1616 */
+ 0x0000, /* R1617 */
+ 0x0000, /* R1618 */
+ 0x0000, /* R1619 */
+ 0x0000, /* R1620 */
+ 0x0000, /* R1621 */
+ 0x0000, /* R1622 */
+ 0x0000, /* R1623 */
+ 0x0000, /* R1624 */
+ 0x0000, /* R1625 */
+ 0x0000, /* R1626 */
+ 0x0000, /* R1627 */
+ 0x0000, /* R1628 */
+ 0x0000, /* R1629 */
+ 0x0000, /* R1630 */
+ 0x0000, /* R1631 */
+ 0x0000, /* R1632 */
+ 0x0000, /* R1633 */
+ 0x0000, /* R1634 */
+ 0x0000, /* R1635 */
+ 0x0000, /* R1636 */
+ 0x0000, /* R1637 */
+ 0x0000, /* R1638 */
+ 0x0000, /* R1639 */
+ 0x0000, /* R1640 */
+ 0x0000, /* R1641 */
+ 0x0000, /* R1642 */
+ 0x0000, /* R1643 */
+ 0x0000, /* R1644 */
+ 0x0000, /* R1645 */
+ 0x0000, /* R1646 */
+ 0x0000, /* R1647 */
+ 0x0000, /* R1648 */
+ 0x0000, /* R1649 */
+ 0x0000, /* R1650 */
+ 0x0000, /* R1651 */
+ 0x0000, /* R1652 */
+ 0x0000, /* R1653 */
+ 0x0000, /* R1654 */
+ 0x0000, /* R1655 */
+ 0x0000, /* R1656 */
+ 0x0000, /* R1657 */
+ 0x0000, /* R1658 */
+ 0x0000, /* R1659 */
+ 0x0000, /* R1660 */
+ 0x0000, /* R1661 */
+ 0x0000, /* R1662 */
+ 0x0000, /* R1663 */
+ 0x0000, /* R1664 */
+ 0x0000, /* R1665 */
+ 0x0000, /* R1666 */
+ 0x0000, /* R1667 */
+ 0x0000, /* R1668 */
+ 0x0000, /* R1669 */
+ 0x0000, /* R1670 */
+ 0x0000, /* R1671 */
+ 0x0000, /* R1672 */
+ 0x0000, /* R1673 */
+ 0x0000, /* R1674 */
+ 0x0000, /* R1675 */
+ 0x0000, /* R1676 */
+ 0x0000, /* R1677 */
+ 0x0000, /* R1678 */
+ 0x0000, /* R1679 */
+ 0x0000, /* R1680 */
+ 0x0000, /* R1681 */
+ 0x0000, /* R1682 */
+ 0x0000, /* R1683 */
+ 0x0000, /* R1684 */
+ 0x0000, /* R1685 */
+ 0x0000, /* R1686 */
+ 0x0000, /* R1687 */
+ 0x0000, /* R1688 */
+ 0x0000, /* R1689 */
+ 0x0000, /* R1690 */
+ 0x0000, /* R1691 */
+ 0x0000, /* R1692 */
+ 0x0000, /* R1693 */
+ 0x0000, /* R1694 */
+ 0x0000, /* R1695 */
+ 0x0000, /* R1696 */
+ 0x0000, /* R1697 */
+ 0x0000, /* R1698 */
+ 0x0000, /* R1699 */
+ 0x0000, /* R1700 */
+ 0x0000, /* R1701 */
+ 0x0000, /* R1702 */
+ 0x0000, /* R1703 */
+ 0x0000, /* R1704 */
+ 0x0000, /* R1705 */
+ 0x0000, /* R1706 */
+ 0x0000, /* R1707 */
+ 0x0000, /* R1708 */
+ 0x0000, /* R1709 */
+ 0x0000, /* R1710 */
+ 0x0000, /* R1711 */
+ 0x0000, /* R1712 */
+ 0x0000, /* R1713 */
+ 0x0000, /* R1714 */
+ 0x0000, /* R1715 */
+ 0x0000, /* R1716 */
+ 0x0000, /* R1717 */
+ 0x0000, /* R1718 */
+ 0x0000, /* R1719 */
+ 0x0000, /* R1720 */
+ 0x0000, /* R1721 */
+ 0x0000, /* R1722 */
+ 0x0000, /* R1723 */
+ 0x0000, /* R1724 */
+ 0x0000, /* R1725 */
+ 0x0000, /* R1726 */
+ 0x0000, /* R1727 */
+ 0x0000, /* R1728 */
+ 0x0000, /* R1729 */
+ 0x0000, /* R1730 */
+ 0x0000, /* R1731 */
+ 0x0000, /* R1732 */
+ 0x0000, /* R1733 */
+ 0x0000, /* R1734 */
+ 0x0000, /* R1735 */
+ 0x0000, /* R1736 */
+ 0x0000, /* R1737 */
+ 0x0000, /* R1738 */
+ 0x0000, /* R1739 */
+ 0x0000, /* R1740 */
+ 0x0000, /* R1741 */
+ 0x0000, /* R1742 */
+ 0x0000, /* R1743 */
+ 0x0000, /* R1744 */
+ 0x0000, /* R1745 */
+ 0x0000, /* R1746 */
+ 0x0000, /* R1747 */
+ 0x0000, /* R1748 */
+ 0x0000, /* R1749 */
+ 0x0000, /* R1750 */
+ 0x0000, /* R1751 */
+ 0x0000, /* R1752 */
+ 0x0000, /* R1753 */
+ 0x0000, /* R1754 */
+ 0x0000, /* R1755 */
+ 0x0000, /* R1756 */
+ 0x0000, /* R1757 */
+ 0x0000, /* R1758 */
+ 0x0000, /* R1759 */
+ 0x0000, /* R1760 */
+ 0x0000, /* R1761 */
+ 0x0000, /* R1762 */
+ 0x0000, /* R1763 */
+ 0x0000, /* R1764 */
+ 0x0000, /* R1765 */
+ 0x0000, /* R1766 */
+ 0x0000, /* R1767 */
+ 0x0000, /* R1768 */
+ 0x0000, /* R1769 */
+ 0x0000, /* R1770 */
+ 0x0000, /* R1771 */
+ 0x0000, /* R1772 */
+ 0x0000, /* R1773 */
+ 0x0000, /* R1774 */
+ 0x0000, /* R1775 */
+ 0x0000, /* R1776 */
+ 0x0000, /* R1777 */
+ 0x0000, /* R1778 */
+ 0x0000, /* R1779 */
+ 0x0000, /* R1780 */
+ 0x0000, /* R1781 */
+ 0x0000, /* R1782 */
+ 0x0000, /* R1783 */
+ 0x0000, /* R1784 */
+ 0x0000, /* R1785 */
+ 0x0000, /* R1786 */
+ 0x0000, /* R1787 */
+ 0x0000, /* R1788 */
+ 0x0000, /* R1789 */
+ 0x0000, /* R1790 */
+ 0x0000, /* R1791 */
+ 0x0000, /* R1792 */
+ 0x0000, /* R1793 */
+ 0x0000, /* R1794 */
+ 0x0000, /* R1795 */
+ 0x0000, /* R1796 */
+ 0x0000, /* R1797 */
+ 0x0000, /* R1798 */
+ 0x0000, /* R1799 */
+ 0x0000, /* R1800 */
+ 0x0000, /* R1801 */
+ 0x0000, /* R1802 */
+ 0x0000, /* R1803 */
+ 0x0000, /* R1804 */
+ 0x0000, /* R1805 */
+ 0x0000, /* R1806 */
+ 0x0000, /* R1807 */
+ 0x0000, /* R1808 */
+ 0x0000, /* R1809 */
+ 0x0000, /* R1810 */
+ 0x0000, /* R1811 */
+ 0x0000, /* R1812 */
+ 0x0000, /* R1813 */
+ 0x0000, /* R1814 */
+ 0x0000, /* R1815 */
+ 0x0000, /* R1816 */
+ 0x0000, /* R1817 */
+ 0x0000, /* R1818 */
+ 0x0000, /* R1819 */
+ 0x0000, /* R1820 */
+ 0x0000, /* R1821 */
+ 0x0000, /* R1822 */
+ 0x0000, /* R1823 */
+ 0x0000, /* R1824 */
+ 0x0000, /* R1825 */
+ 0x0000, /* R1826 */
+ 0x0000, /* R1827 */
+ 0x0000, /* R1828 */
+ 0x0000, /* R1829 */
+ 0x0000, /* R1830 */
+ 0x0000, /* R1831 */
+ 0x0000, /* R1832 */
+ 0x0000, /* R1833 */
+ 0x0000, /* R1834 */
+ 0x0000, /* R1835 */
+ 0x0000, /* R1836 */
+ 0x0000, /* R1837 */
+ 0x0000, /* R1838 */
+ 0x0000, /* R1839 */
+ 0x0000, /* R1840 */
+ 0x0000, /* R1841 */
+ 0x0000, /* R1842 */
+ 0x0000, /* R1843 */
+ 0x0000, /* R1844 */
+ 0x0000, /* R1845 */
+ 0x0000, /* R1846 */
+ 0x0000, /* R1847 */
+ 0x0000, /* R1848 */
+ 0x0000, /* R1849 */
+ 0x0000, /* R1850 */
+ 0x0000, /* R1851 */
+ 0x0000, /* R1852 */
+ 0x0000, /* R1853 */
+ 0x0000, /* R1854 */
+ 0x0000, /* R1855 */
+ 0x0000, /* R1856 */
+ 0x0000, /* R1857 */
+ 0x0000, /* R1858 */
+ 0x0000, /* R1859 */
+ 0x0000, /* R1860 */
+ 0x0000, /* R1861 */
+ 0x0000, /* R1862 */
+ 0x0000, /* R1863 */
+ 0x0000, /* R1864 */
+ 0x0000, /* R1865 */
+ 0x0000, /* R1866 */
+ 0x0000, /* R1867 */
+ 0x0000, /* R1868 */
+ 0x0000, /* R1869 */
+ 0x0000, /* R1870 */
+ 0x0000, /* R1871 */
+ 0x0000, /* R1872 */
+ 0x0000, /* R1873 */
+ 0x0000, /* R1874 */
+ 0x0000, /* R1875 */
+ 0x0000, /* R1876 */
+ 0x0000, /* R1877 */
+ 0x0000, /* R1878 */
+ 0x0000, /* R1879 */
+ 0x0000, /* R1880 */
+ 0x0000, /* R1881 */
+ 0x0000, /* R1882 */
+ 0x0000, /* R1883 */
+ 0x0000, /* R1884 */
+ 0x0000, /* R1885 */
+ 0x0000, /* R1886 */
+ 0x0000, /* R1887 */
+ 0x0000, /* R1888 */
+ 0x0000, /* R1889 */
+ 0x0000, /* R1890 */
+ 0x0000, /* R1891 */
+ 0x0000, /* R1892 */
+ 0x0000, /* R1893 */
+ 0x0000, /* R1894 */
+ 0x0000, /* R1895 */
+ 0x0000, /* R1896 */
+ 0x0000, /* R1897 */
+ 0x0000, /* R1898 */
+ 0x0000, /* R1899 */
+ 0x0000, /* R1900 */
+ 0x0000, /* R1901 */
+ 0x0000, /* R1902 */
+ 0x0000, /* R1903 */
+ 0x0000, /* R1904 */
+ 0x0000, /* R1905 */
+ 0x0000, /* R1906 */
+ 0x0000, /* R1907 */
+ 0x0000, /* R1908 */
+ 0x0000, /* R1909 */
+ 0x0000, /* R1910 */
+ 0x0000, /* R1911 */
+ 0x0000, /* R1912 */
+ 0x0000, /* R1913 */
+ 0x0000, /* R1914 */
+ 0x0000, /* R1915 */
+ 0x0000, /* R1916 */
+ 0x0000, /* R1917 */
+ 0x0000, /* R1918 */
+ 0x0000, /* R1919 */
+ 0x0000, /* R1920 */
+ 0x0000, /* R1921 */
+ 0x0000, /* R1922 */
+ 0x0000, /* R1923 */
+ 0x0000, /* R1924 */
+ 0x0000, /* R1925 */
+ 0x0000, /* R1926 */
+ 0x0000, /* R1927 */
+ 0x0000, /* R1928 */
+ 0x0000, /* R1929 */
+ 0x0000, /* R1930 */
+ 0x0000, /* R1931 */
+ 0x0000, /* R1932 */
+ 0x0000, /* R1933 */
+ 0x0000, /* R1934 */
+ 0x0000, /* R1935 */
+ 0x0000, /* R1936 */
+ 0x0000, /* R1937 */
+ 0x0000, /* R1938 */
+ 0x0000, /* R1939 */
+ 0x0000, /* R1940 */
+ 0x0000, /* R1941 */
+ 0x0000, /* R1942 */
+ 0x0000, /* R1943 */
+ 0x0000, /* R1944 */
+ 0x0000, /* R1945 */
+ 0x0000, /* R1946 */
+ 0x0000, /* R1947 */
+ 0x0000, /* R1948 */
+ 0x0000, /* R1949 */
+ 0x0000, /* R1950 */
+ 0x0000, /* R1951 */
+ 0x0000, /* R1952 */
+ 0x0000, /* R1953 */
+ 0x0000, /* R1954 */
+ 0x0000, /* R1955 */
+ 0x0000, /* R1956 */
+ 0x0000, /* R1957 */
+ 0x0000, /* R1958 */
+ 0x0000, /* R1959 */
+ 0x0000, /* R1960 */
+ 0x0000, /* R1961 */
+ 0x0000, /* R1962 */
+ 0x0000, /* R1963 */
+ 0x0000, /* R1964 */
+ 0x0000, /* R1965 */
+ 0x0000, /* R1966 */
+ 0x0000, /* R1967 */
+ 0x0000, /* R1968 */
+ 0x0000, /* R1969 */
+ 0x0000, /* R1970 */
+ 0x0000, /* R1971 */
+ 0x0000, /* R1972 */
+ 0x0000, /* R1973 */
+ 0x0000, /* R1974 */
+ 0x0000, /* R1975 */
+ 0x0000, /* R1976 */
+ 0x0000, /* R1977 */
+ 0x0000, /* R1978 */
+ 0x0000, /* R1979 */
+ 0x0000, /* R1980 */
+ 0x0000, /* R1981 */
+ 0x0000, /* R1982 */
+ 0x0000, /* R1983 */
+ 0x0000, /* R1984 */
+ 0x0000, /* R1985 */
+ 0x0000, /* R1986 */
+ 0x0000, /* R1987 */
+ 0x0000, /* R1988 */
+ 0x0000, /* R1989 */
+ 0x0000, /* R1990 */
+ 0x0000, /* R1991 */
+ 0x0000, /* R1992 */
+ 0x0000, /* R1993 */
+ 0x0000, /* R1994 */
+ 0x0000, /* R1995 */
+ 0x0000, /* R1996 */
+ 0x0000, /* R1997 */
+ 0x0000, /* R1998 */
+ 0x0000, /* R1999 */
+ 0x0000, /* R2000 */
+ 0x0000, /* R2001 */
+ 0x0000, /* R2002 */
+ 0x0000, /* R2003 */
+ 0x0000, /* R2004 */
+ 0x0000, /* R2005 */
+ 0x0000, /* R2006 */
+ 0x0000, /* R2007 */
+ 0x0000, /* R2008 */
+ 0x0000, /* R2009 */
+ 0x0000, /* R2010 */
+ 0x0000, /* R2011 */
+ 0x0000, /* R2012 */
+ 0x0000, /* R2013 */
+ 0x0000, /* R2014 */
+ 0x0000, /* R2015 */
+ 0x0000, /* R2016 */
+ 0x0000, /* R2017 */
+ 0x0000, /* R2018 */
+ 0x0000, /* R2019 */
+ 0x0000, /* R2020 */
+ 0x0000, /* R2021 */
+ 0x0000, /* R2022 */
+ 0x0000, /* R2023 */
+ 0x0000, /* R2024 */
+ 0x0000, /* R2025 */
+ 0x0000, /* R2026 */
+ 0x0000, /* R2027 */
+ 0x0000, /* R2028 */
+ 0x0000, /* R2029 */
+ 0x0000, /* R2030 */
+ 0x0000, /* R2031 */
+ 0x0000, /* R2032 */
+ 0x0000, /* R2033 */
+ 0x0000, /* R2034 */
+ 0x0000, /* R2035 */
+ 0x0000, /* R2036 */
+ 0x0000, /* R2037 */
+ 0x0000, /* R2038 */
+ 0x0000, /* R2039 */
+ 0x0000, /* R2040 */
+ 0x0000, /* R2041 */
+ 0x0000, /* R2042 */
+ 0x0000, /* R2043 */
+ 0x0000, /* R2044 */
+ 0x0000, /* R2045 */
+ 0x0000, /* R2046 */
+ 0x0000, /* R2047 */
+ 0x0000, /* R2048 */
+ 0x0000, /* R2049 */
+ 0x0000, /* R2050 */
+ 0x0000, /* R2051 */
+ 0x0000, /* R2052 */
+ 0x0000, /* R2053 */
+ 0x0000, /* R2054 */
+ 0x0000, /* R2055 */
+ 0x0000, /* R2056 */
+ 0x0000, /* R2057 */
+ 0x0000, /* R2058 */
+ 0x0000, /* R2059 */
+ 0x0000, /* R2060 */
+ 0x0000, /* R2061 */
+ 0x0000, /* R2062 */
+ 0x0000, /* R2063 */
+ 0x0000, /* R2064 */
+ 0x0000, /* R2065 */
+ 0x0000, /* R2066 */
+ 0x0000, /* R2067 */
+ 0x0000, /* R2068 */
+ 0x0000, /* R2069 */
+ 0x0000, /* R2070 */
+ 0x0000, /* R2071 */
+ 0x0000, /* R2072 */
+ 0x0000, /* R2073 */
+ 0x0000, /* R2074 */
+ 0x0000, /* R2075 */
+ 0x0000, /* R2076 */
+ 0x0000, /* R2077 */
+ 0x0000, /* R2078 */
+ 0x0000, /* R2079 */
+ 0x0000, /* R2080 */
+ 0x0000, /* R2081 */
+ 0x0000, /* R2082 */
+ 0x0000, /* R2083 */
+ 0x0000, /* R2084 */
+ 0x0000, /* R2085 */
+ 0x0000, /* R2086 */
+ 0x0000, /* R2087 */
+ 0x0000, /* R2088 */
+ 0x0000, /* R2089 */
+ 0x0000, /* R2090 */
+ 0x0000, /* R2091 */
+ 0x0000, /* R2092 */
+ 0x0000, /* R2093 */
+ 0x0000, /* R2094 */
+ 0x0000, /* R2095 */
+ 0x0000, /* R2096 */
+ 0x0000, /* R2097 */
+ 0x0000, /* R2098 */
+ 0x0000, /* R2099 */
+ 0x0000, /* R2100 */
+ 0x0000, /* R2101 */
+ 0x0000, /* R2102 */
+ 0x0000, /* R2103 */
+ 0x0000, /* R2104 */
+ 0x0000, /* R2105 */
+ 0x0000, /* R2106 */
+ 0x0000, /* R2107 */
+ 0x0000, /* R2108 */
+ 0x0000, /* R2109 */
+ 0x0000, /* R2110 */
+ 0x0000, /* R2111 */
+ 0x0000, /* R2112 */
+ 0x0000, /* R2113 */
+ 0x0000, /* R2114 */
+ 0x0000, /* R2115 */
+ 0x0000, /* R2116 */
+ 0x0000, /* R2117 */
+ 0x0000, /* R2118 */
+ 0x0000, /* R2119 */
+ 0x0000, /* R2120 */
+ 0x0000, /* R2121 */
+ 0x0000, /* R2122 */
+ 0x0000, /* R2123 */
+ 0x0000, /* R2124 */
+ 0x0000, /* R2125 */
+ 0x0000, /* R2126 */
+ 0x0000, /* R2127 */
+ 0x0000, /* R2128 */
+ 0x0000, /* R2129 */
+ 0x0000, /* R2130 */
+ 0x0000, /* R2131 */
+ 0x0000, /* R2132 */
+ 0x0000, /* R2133 */
+ 0x0000, /* R2134 */
+ 0x0000, /* R2135 */
+ 0x0000, /* R2136 */
+ 0x0000, /* R2137 */
+ 0x0000, /* R2138 */
+ 0x0000, /* R2139 */
+ 0x0000, /* R2140 */
+ 0x0000, /* R2141 */
+ 0x0000, /* R2142 */
+ 0x0000, /* R2143 */
+ 0x0000, /* R2144 */
+ 0x0000, /* R2145 */
+ 0x0000, /* R2146 */
+ 0x0000, /* R2147 */
+ 0x0000, /* R2148 */
+ 0x0000, /* R2149 */
+ 0x0000, /* R2150 */
+ 0x0000, /* R2151 */
+ 0x0000, /* R2152 */
+ 0x0000, /* R2153 */
+ 0x0000, /* R2154 */
+ 0x0000, /* R2155 */
+ 0x0000, /* R2156 */
+ 0x0000, /* R2157 */
+ 0x0000, /* R2158 */
+ 0x0000, /* R2159 */
+ 0x0000, /* R2160 */
+ 0x0000, /* R2161 */
+ 0x0000, /* R2162 */
+ 0x0000, /* R2163 */
+ 0x0000, /* R2164 */
+ 0x0000, /* R2165 */
+ 0x0000, /* R2166 */
+ 0x0000, /* R2167 */
+ 0x0000, /* R2168 */
+ 0x0000, /* R2169 */
+ 0x0000, /* R2170 */
+ 0x0000, /* R2171 */
+ 0x0000, /* R2172 */
+ 0x0000, /* R2173 */
+ 0x0000, /* R2174 */
+ 0x0000, /* R2175 */
+ 0x0000, /* R2176 */
+ 0x0000, /* R2177 */
+ 0x0000, /* R2178 */
+ 0x0000, /* R2179 */
+ 0x0000, /* R2180 */
+ 0x0000, /* R2181 */
+ 0x0000, /* R2182 */
+ 0x0000, /* R2183 */
+ 0x0000, /* R2184 */
+ 0x0000, /* R2185 */
+ 0x0000, /* R2186 */
+ 0x0000, /* R2187 */
+ 0x0000, /* R2188 */
+ 0x0000, /* R2189 */
+ 0x0000, /* R2190 */
+ 0x0000, /* R2191 */
+ 0x0000, /* R2192 */
+ 0x0000, /* R2193 */
+ 0x0000, /* R2194 */
+ 0x0000, /* R2195 */
+ 0x0000, /* R2196 */
+ 0x0000, /* R2197 */
+ 0x0000, /* R2198 */
+ 0x0000, /* R2199 */
+ 0x0000, /* R2200 */
+ 0x0000, /* R2201 */
+ 0x0000, /* R2202 */
+ 0x0000, /* R2203 */
+ 0x0000, /* R2204 */
+ 0x0000, /* R2205 */
+ 0x0000, /* R2206 */
+ 0x0000, /* R2207 */
+ 0x0000, /* R2208 */
+ 0x0000, /* R2209 */
+ 0x0000, /* R2210 */
+ 0x0000, /* R2211 */
+ 0x0000, /* R2212 */
+ 0x0000, /* R2213 */
+ 0x0000, /* R2214 */
+ 0x0000, /* R2215 */
+ 0x0000, /* R2216 */
+ 0x0000, /* R2217 */
+ 0x0000, /* R2218 */
+ 0x0000, /* R2219 */
+ 0x0000, /* R2220 */
+ 0x0000, /* R2221 */
+ 0x0000, /* R2222 */
+ 0x0000, /* R2223 */
+ 0x0000, /* R2224 */
+ 0x0000, /* R2225 */
+ 0x0000, /* R2226 */
+ 0x0000, /* R2227 */
+ 0x0000, /* R2228 */
+ 0x0000, /* R2229 */
+ 0x0000, /* R2230 */
+ 0x0000, /* R2231 */
+ 0x0000, /* R2232 */
+ 0x0000, /* R2233 */
+ 0x0000, /* R2234 */
+ 0x0000, /* R2235 */
+ 0x0000, /* R2236 */
+ 0x0000, /* R2237 */
+ 0x0000, /* R2238 */
+ 0x0000, /* R2239 */
+ 0x0000, /* R2240 */
+ 0x0000, /* R2241 */
+ 0x0000, /* R2242 */
+ 0x0000, /* R2243 */
+ 0x0000, /* R2244 */
+ 0x0000, /* R2245 */
+ 0x0000, /* R2246 */
+ 0x0000, /* R2247 */
+ 0x0000, /* R2248 */
+ 0x0000, /* R2249 */
+ 0x0000, /* R2250 */
+ 0x0000, /* R2251 */
+ 0x0000, /* R2252 */
+ 0x0000, /* R2253 */
+ 0x0000, /* R2254 */
+ 0x0000, /* R2255 */
+ 0x0000, /* R2256 */
+ 0x0000, /* R2257 */
+ 0x0000, /* R2258 */
+ 0x0000, /* R2259 */
+ 0x0000, /* R2260 */
+ 0x0000, /* R2261 */
+ 0x0000, /* R2262 */
+ 0x0000, /* R2263 */
+ 0x0000, /* R2264 */
+ 0x0000, /* R2265 */
+ 0x0000, /* R2266 */
+ 0x0000, /* R2267 */
+ 0x0000, /* R2268 */
+ 0x0000, /* R2269 */
+ 0x0000, /* R2270 */
+ 0x0000, /* R2271 */
+ 0x0000, /* R2272 */
+ 0x0000, /* R2273 */
+ 0x0000, /* R2274 */
+ 0x0000, /* R2275 */
+ 0x0000, /* R2276 */
+ 0x0000, /* R2277 */
+ 0x0000, /* R2278 */
+ 0x0000, /* R2279 */
+ 0x0000, /* R2280 */
+ 0x0000, /* R2281 */
+ 0x0000, /* R2282 */
+ 0x0000, /* R2283 */
+ 0x0000, /* R2284 */
+ 0x0000, /* R2285 */
+ 0x0000, /* R2286 */
+ 0x0000, /* R2287 */
+ 0x0000, /* R2288 */
+ 0x0000, /* R2289 */
+ 0x0000, /* R2290 */
+ 0x0000, /* R2291 */
+ 0x0000, /* R2292 */
+ 0x0000, /* R2293 */
+ 0x0000, /* R2294 */
+ 0x0000, /* R2295 */
+ 0x0000, /* R2296 */
+ 0x0000, /* R2297 */
+ 0x0000, /* R2298 */
+ 0x0000, /* R2299 */
+ 0x0000, /* R2300 */
+ 0x0000, /* R2301 */
+ 0x0000, /* R2302 */
+ 0x0000, /* R2303 */
+ 0x0000, /* R2304 */
+ 0x0000, /* R2305 */
+ 0x0000, /* R2306 */
+ 0x0000, /* R2307 */
+ 0x0000, /* R2308 */
+ 0x0000, /* R2309 */
+ 0x0000, /* R2310 */
+ 0x0000, /* R2311 */
+ 0x0000, /* R2312 */
+ 0x0000, /* R2313 */
+ 0x0000, /* R2314 */
+ 0x0000, /* R2315 */
+ 0x0000, /* R2316 */
+ 0x0000, /* R2317 */
+ 0x0000, /* R2318 */
+ 0x0000, /* R2319 */
+ 0x0000, /* R2320 */
+ 0x0000, /* R2321 */
+ 0x0000, /* R2322 */
+ 0x0000, /* R2323 */
+ 0x0000, /* R2324 */
+ 0x0000, /* R2325 */
+ 0x0000, /* R2326 */
+ 0x0000, /* R2327 */
+ 0x0000, /* R2328 */
+ 0x0000, /* R2329 */
+ 0x0000, /* R2330 */
+ 0x0000, /* R2331 */
+ 0x0000, /* R2332 */
+ 0x0000, /* R2333 */
+ 0x0000, /* R2334 */
+ 0x0000, /* R2335 */
+ 0x0000, /* R2336 */
+ 0x0000, /* R2337 */
+ 0x0000, /* R2338 */
+ 0x0000, /* R2339 */
+ 0x0000, /* R2340 */
+ 0x0000, /* R2341 */
+ 0x0000, /* R2342 */
+ 0x0000, /* R2343 */
+ 0x0000, /* R2344 */
+ 0x0000, /* R2345 */
+ 0x0000, /* R2346 */
+ 0x0000, /* R2347 */
+ 0x0000, /* R2348 */
+ 0x0000, /* R2349 */
+ 0x0000, /* R2350 */
+ 0x0000, /* R2351 */
+ 0x0000, /* R2352 */
+ 0x0000, /* R2353 */
+ 0x0000, /* R2354 */
+ 0x0000, /* R2355 */
+ 0x0000, /* R2356 */
+ 0x0000, /* R2357 */
+ 0x0000, /* R2358 */
+ 0x0000, /* R2359 */
+ 0x0000, /* R2360 */
+ 0x0000, /* R2361 */
+ 0x0000, /* R2362 */
+ 0x0000, /* R2363 */
+ 0x0000, /* R2364 */
+ 0x0000, /* R2365 */
+ 0x0000, /* R2366 */
+ 0x0000, /* R2367 */
+ 0x0000, /* R2368 */
+ 0x0000, /* R2369 */
+ 0x0000, /* R2370 */
+ 0x0000, /* R2371 */
+ 0x0000, /* R2372 */
+ 0x0000, /* R2373 */
+ 0x0000, /* R2374 */
+ 0x0000, /* R2375 */
+ 0x0000, /* R2376 */
+ 0x0000, /* R2377 */
+ 0x0000, /* R2378 */
+ 0x0000, /* R2379 */
+ 0x0000, /* R2380 */
+ 0x0000, /* R2381 */
+ 0x0000, /* R2382 */
+ 0x0000, /* R2383 */
+ 0x0000, /* R2384 */
+ 0x0000, /* R2385 */
+ 0x0000, /* R2386 */
+ 0x0000, /* R2387 */
+ 0x0000, /* R2388 */
+ 0x0000, /* R2389 */
+ 0x0000, /* R2390 */
+ 0x0000, /* R2391 */
+ 0x0000, /* R2392 */
+ 0x0000, /* R2393 */
+ 0x0000, /* R2394 */
+ 0x0000, /* R2395 */
+ 0x0000, /* R2396 */
+ 0x0000, /* R2397 */
+ 0x0000, /* R2398 */
+ 0x0000, /* R2399 */
+ 0x0000, /* R2400 */
+ 0x0000, /* R2401 */
+ 0x0000, /* R2402 */
+ 0x0000, /* R2403 */
+ 0x0000, /* R2404 */
+ 0x0000, /* R2405 */
+ 0x0000, /* R2406 */
+ 0x0000, /* R2407 */
+ 0x0000, /* R2408 */
+ 0x0000, /* R2409 */
+ 0x0000, /* R2410 */
+ 0x0000, /* R2411 */
+ 0x0000, /* R2412 */
+ 0x0000, /* R2413 */
+ 0x0000, /* R2414 */
+ 0x0000, /* R2415 */
+ 0x0000, /* R2416 */
+ 0x0000, /* R2417 */
+ 0x0000, /* R2418 */
+ 0x0000, /* R2419 */
+ 0x0000, /* R2420 */
+ 0x0000, /* R2421 */
+ 0x0000, /* R2422 */
+ 0x0000, /* R2423 */
+ 0x0000, /* R2424 */
+ 0x0000, /* R2425 */
+ 0x0000, /* R2426 */
+ 0x0000, /* R2427 */
+ 0x0000, /* R2428 */
+ 0x0000, /* R2429 */
+ 0x0000, /* R2430 */
+ 0x0000, /* R2431 */
+ 0x0000, /* R2432 */
+ 0x0000, /* R2433 */
+ 0x0000, /* R2434 */
+ 0x0000, /* R2435 */
+ 0x0000, /* R2436 */
+ 0x0000, /* R2437 */
+ 0x0000, /* R2438 */
+ 0x0000, /* R2439 */
+ 0x0000, /* R2440 */
+ 0x0000, /* R2441 */
+ 0x0000, /* R2442 */
+ 0x0000, /* R2443 */
+ 0x0000, /* R2444 */
+ 0x0000, /* R2445 */
+ 0x0000, /* R2446 */
+ 0x0000, /* R2447 */
+ 0x0000, /* R2448 */
+ 0x0000, /* R2449 */
+ 0x0000, /* R2450 */
+ 0x0000, /* R2451 */
+ 0x0000, /* R2452 */
+ 0x0000, /* R2453 */
+ 0x0000, /* R2454 */
+ 0x0000, /* R2455 */
+ 0x0000, /* R2456 */
+ 0x0000, /* R2457 */
+ 0x0000, /* R2458 */
+ 0x0000, /* R2459 */
+ 0x0000, /* R2460 */
+ 0x0000, /* R2461 */
+ 0x0000, /* R2462 */
+ 0x0000, /* R2463 */
+ 0x0000, /* R2464 */
+ 0x0000, /* R2465 */
+ 0x0000, /* R2466 */
+ 0x0000, /* R2467 */
+ 0x0000, /* R2468 */
+ 0x0000, /* R2469 */
+ 0x0000, /* R2470 */
+ 0x0000, /* R2471 */
+ 0x0000, /* R2472 */
+ 0x0000, /* R2473 */
+ 0x0000, /* R2474 */
+ 0x0000, /* R2475 */
+ 0x0000, /* R2476 */
+ 0x0000, /* R2477 */
+ 0x0000, /* R2478 */
+ 0x0000, /* R2479 */
+ 0x0000, /* R2480 */
+ 0x0000, /* R2481 */
+ 0x0000, /* R2482 */
+ 0x0000, /* R2483 */
+ 0x0000, /* R2484 */
+ 0x0000, /* R2485 */
+ 0x0000, /* R2486 */
+ 0x0000, /* R2487 */
+ 0x0000, /* R2488 */
+ 0x0000, /* R2489 */
+ 0x0000, /* R2490 */
+ 0x0000, /* R2491 */
+ 0x0000, /* R2492 */
+ 0x0000, /* R2493 */
+ 0x0000, /* R2494 */
+ 0x0000, /* R2495 */
+ 0x0000, /* R2496 */
+ 0x0000, /* R2497 */
+ 0x0000, /* R2498 */
+ 0x0000, /* R2499 */
+ 0x0000, /* R2500 */
+ 0x0000, /* R2501 */
+ 0x0000, /* R2502 */
+ 0x0000, /* R2503 */
+ 0x0000, /* R2504 */
+ 0x0000, /* R2505 */
+ 0x0000, /* R2506 */
+ 0x0000, /* R2507 */
+ 0x0000, /* R2508 */
+ 0x0000, /* R2509 */
+ 0x0000, /* R2510 */
+ 0x0000, /* R2511 */
+ 0x0000, /* R2512 */
+ 0x0000, /* R2513 */
+ 0x0000, /* R2514 */
+ 0x0000, /* R2515 */
+ 0x0000, /* R2516 */
+ 0x0000, /* R2517 */
+ 0x0000, /* R2518 */
+ 0x0000, /* R2519 */
+ 0x0000, /* R2520 */
+ 0x0000, /* R2521 */
+ 0x0000, /* R2522 */
+ 0x0000, /* R2523 */
+ 0x0000, /* R2524 */
+ 0x0000, /* R2525 */
+ 0x0000, /* R2526 */
+ 0x0000, /* R2527 */
+ 0x0000, /* R2528 */
+ 0x0000, /* R2529 */
+ 0x0000, /* R2530 */
+ 0x0000, /* R2531 */
+ 0x0000, /* R2532 */
+ 0x0000, /* R2533 */
+ 0x0000, /* R2534 */
+ 0x0000, /* R2535 */
+ 0x0000, /* R2536 */
+ 0x0000, /* R2537 */
+ 0x0000, /* R2538 */
+ 0x0000, /* R2539 */
+ 0x0000, /* R2540 */
+ 0x0000, /* R2541 */
+ 0x0000, /* R2542 */
+ 0x0000, /* R2543 */
+ 0x0000, /* R2544 */
+ 0x0000, /* R2545 */
+ 0x0000, /* R2546 */
+ 0x0000, /* R2547 */
+ 0x0000, /* R2548 */
+ 0x0000, /* R2549 */
+ 0x0000, /* R2550 */
+ 0x0000, /* R2551 */
+ 0x0000, /* R2552 */
+ 0x0000, /* R2553 */
+ 0x0000, /* R2554 */
+ 0x0000, /* R2555 */
+ 0x0000, /* R2556 */
+ 0x0000, /* R2557 */
+ 0x0000, /* R2558 */
+ 0x0000, /* R2559 */
+ 0x0000, /* R2560 */
+ 0x0000, /* R2561 */
+ 0x0000, /* R2562 */
+ 0x0000, /* R2563 */
+ 0x0000, /* R2564 */
+ 0x0000, /* R2565 */
+ 0x0000, /* R2566 */
+ 0x0000, /* R2567 */
+ 0x0000, /* R2568 */
+ 0x0000, /* R2569 */
+ 0x0000, /* R2570 */
+ 0x0000, /* R2571 */
+ 0x0000, /* R2572 */
+ 0x0000, /* R2573 */
+ 0x0000, /* R2574 */
+ 0x0000, /* R2575 */
+ 0x0000, /* R2576 */
+ 0x0000, /* R2577 */
+ 0x0000, /* R2578 */
+ 0x0000, /* R2579 */
+ 0x0000, /* R2580 */
+ 0x0000, /* R2581 */
+ 0x0000, /* R2582 */
+ 0x0000, /* R2583 */
+ 0x0000, /* R2584 */
+ 0x0000, /* R2585 */
+ 0x0000, /* R2586 */
+ 0x0000, /* R2587 */
+ 0x0000, /* R2588 */
+ 0x0000, /* R2589 */
+ 0x0000, /* R2590 */
+ 0x0000, /* R2591 */
+ 0x0000, /* R2592 */
+ 0x0000, /* R2593 */
+ 0x0000, /* R2594 */
+ 0x0000, /* R2595 */
+ 0x0000, /* R2596 */
+ 0x0000, /* R2597 */
+ 0x0000, /* R2598 */
+ 0x0000, /* R2599 */
+ 0x0000, /* R2600 */
+ 0x0000, /* R2601 */
+ 0x0000, /* R2602 */
+ 0x0000, /* R2603 */
+ 0x0000, /* R2604 */
+ 0x0000, /* R2605 */
+ 0x0000, /* R2606 */
+ 0x0000, /* R2607 */
+ 0x0000, /* R2608 */
+ 0x0000, /* R2609 */
+ 0x0000, /* R2610 */
+ 0x0000, /* R2611 */
+ 0x0000, /* R2612 */
+ 0x0000, /* R2613 */
+ 0x0000, /* R2614 */
+ 0x0000, /* R2615 */
+ 0x0000, /* R2616 */
+ 0x0000, /* R2617 */
+ 0x0000, /* R2618 */
+ 0x0000, /* R2619 */
+ 0x0000, /* R2620 */
+ 0x0000, /* R2621 */
+ 0x0000, /* R2622 */
+ 0x0000, /* R2623 */
+ 0x0000, /* R2624 */
+ 0x0000, /* R2625 */
+ 0x0000, /* R2626 */
+ 0x0000, /* R2627 */
+ 0x0000, /* R2628 */
+ 0x0000, /* R2629 */
+ 0x0000, /* R2630 */
+ 0x0000, /* R2631 */
+ 0x0000, /* R2632 */
+ 0x0000, /* R2633 */
+ 0x0000, /* R2634 */
+ 0x0000, /* R2635 */
+ 0x0000, /* R2636 */
+ 0x0000, /* R2637 */
+ 0x0000, /* R2638 */
+ 0x0000, /* R2639 */
+ 0x0000, /* R2640 */
+ 0x0000, /* R2641 */
+ 0x0000, /* R2642 */
+ 0x0000, /* R2643 */
+ 0x0000, /* R2644 */
+ 0x0000, /* R2645 */
+ 0x0000, /* R2646 */
+ 0x0000, /* R2647 */
+ 0x0000, /* R2648 */
+ 0x0000, /* R2649 */
+ 0x0000, /* R2650 */
+ 0x0000, /* R2651 */
+ 0x0000, /* R2652 */
+ 0x0000, /* R2653 */
+ 0x0000, /* R2654 */
+ 0x0000, /* R2655 */
+ 0x0000, /* R2656 */
+ 0x0000, /* R2657 */
+ 0x0000, /* R2658 */
+ 0x0000, /* R2659 */
+ 0x0000, /* R2660 */
+ 0x0000, /* R2661 */
+ 0x0000, /* R2662 */
+ 0x0000, /* R2663 */
+ 0x0000, /* R2664 */
+ 0x0000, /* R2665 */
+ 0x0000, /* R2666 */
+ 0x0000, /* R2667 */
+ 0x0000, /* R2668 */
+ 0x0000, /* R2669 */
+ 0x0000, /* R2670 */
+ 0x0000, /* R2671 */
+ 0x0000, /* R2672 */
+ 0x0000, /* R2673 */
+ 0x0000, /* R2674 */
+ 0x0000, /* R2675 */
+ 0x0000, /* R2676 */
+ 0x0000, /* R2677 */
+ 0x0000, /* R2678 */
+ 0x0000, /* R2679 */
+ 0x0000, /* R2680 */
+ 0x0000, /* R2681 */
+ 0x0000, /* R2682 */
+ 0x0000, /* R2683 */
+ 0x0000, /* R2684 */
+ 0x0000, /* R2685 */
+ 0x0000, /* R2686 */
+ 0x0000, /* R2687 */
+ 0x0000, /* R2688 */
+ 0x0000, /* R2689 */
+ 0x0000, /* R2690 */
+ 0x0000, /* R2691 */
+ 0x0000, /* R2692 */
+ 0x0000, /* R2693 */
+ 0x0000, /* R2694 */
+ 0x0000, /* R2695 */
+ 0x0000, /* R2696 */
+ 0x0000, /* R2697 */
+ 0x0000, /* R2698 */
+ 0x0000, /* R2699 */
+ 0x0000, /* R2700 */
+ 0x0000, /* R2701 */
+ 0x0000, /* R2702 */
+ 0x0000, /* R2703 */
+ 0x0000, /* R2704 */
+ 0x0000, /* R2705 */
+ 0x0000, /* R2706 */
+ 0x0000, /* R2707 */
+ 0x0000, /* R2708 */
+ 0x0000, /* R2709 */
+ 0x0000, /* R2710 */
+ 0x0000, /* R2711 */
+ 0x0000, /* R2712 */
+ 0x0000, /* R2713 */
+ 0x0000, /* R2714 */
+ 0x0000, /* R2715 */
+ 0x0000, /* R2716 */
+ 0x0000, /* R2717 */
+ 0x0000, /* R2718 */
+ 0x0000, /* R2719 */
+ 0x0000, /* R2720 */
+ 0x0000, /* R2721 */
+ 0x0000, /* R2722 */
+ 0x0000, /* R2723 */
+ 0x0000, /* R2724 */
+ 0x0000, /* R2725 */
+ 0x0000, /* R2726 */
+ 0x0000, /* R2727 */
+ 0x0000, /* R2728 */
+ 0x0000, /* R2729 */
+ 0x0000, /* R2730 */
+ 0x0000, /* R2731 */
+ 0x0000, /* R2732 */
+ 0x0000, /* R2733 */
+ 0x0000, /* R2734 */
+ 0x0000, /* R2735 */
+ 0x0000, /* R2736 */
+ 0x0000, /* R2737 */
+ 0x0000, /* R2738 */
+ 0x0000, /* R2739 */
+ 0x0000, /* R2740 */
+ 0x0000, /* R2741 */
+ 0x0000, /* R2742 */
+ 0x0000, /* R2743 */
+ 0x0000, /* R2744 */
+ 0x0000, /* R2745 */
+ 0x0000, /* R2746 */
+ 0x0000, /* R2747 */
+ 0x0000, /* R2748 */
+ 0x0000, /* R2749 */
+ 0x0000, /* R2750 */
+ 0x0000, /* R2751 */
+ 0x0000, /* R2752 */
+ 0x0000, /* R2753 */
+ 0x0000, /* R2754 */
+ 0x0000, /* R2755 */
+ 0x0000, /* R2756 */
+ 0x0000, /* R2757 */
+ 0x0000, /* R2758 */
+ 0x0000, /* R2759 */
+ 0x0000, /* R2760 */
+ 0x0000, /* R2761 */
+ 0x0000, /* R2762 */
+ 0x0000, /* R2763 */
+ 0x0000, /* R2764 */
+ 0x0000, /* R2765 */
+ 0x0000, /* R2766 */
+ 0x0000, /* R2767 */
+ 0x0000, /* R2768 */
+ 0x0000, /* R2769 */
+ 0x0000, /* R2770 */
+ 0x0000, /* R2771 */
+ 0x0000, /* R2772 */
+ 0x0000, /* R2773 */
+ 0x0000, /* R2774 */
+ 0x0000, /* R2775 */
+ 0x0000, /* R2776 */
+ 0x0000, /* R2777 */
+ 0x0000, /* R2778 */
+ 0x0000, /* R2779 */
+ 0x0000, /* R2780 */
+ 0x0000, /* R2781 */
+ 0x0000, /* R2782 */
+ 0x0000, /* R2783 */
+ 0x0000, /* R2784 */
+ 0x0000, /* R2785 */
+ 0x0000, /* R2786 */
+ 0x0000, /* R2787 */
+ 0x0000, /* R2788 */
+ 0x0000, /* R2789 */
+ 0x0000, /* R2790 */
+ 0x0000, /* R2791 */
+ 0x0000, /* R2792 */
+ 0x0000, /* R2793 */
+ 0x0000, /* R2794 */
+ 0x0000, /* R2795 */
+ 0x0000, /* R2796 */
+ 0x0000, /* R2797 */
+ 0x0000, /* R2798 */
+ 0x0000, /* R2799 */
+ 0x0000, /* R2800 */
+ 0x0000, /* R2801 */
+ 0x0000, /* R2802 */
+ 0x0000, /* R2803 */
+ 0x0000, /* R2804 */
+ 0x0000, /* R2805 */
+ 0x0000, /* R2806 */
+ 0x0000, /* R2807 */
+ 0x0000, /* R2808 */
+ 0x0000, /* R2809 */
+ 0x0000, /* R2810 */
+ 0x0000, /* R2811 */
+ 0x0000, /* R2812 */
+ 0x0000, /* R2813 */
+ 0x0000, /* R2814 */
+ 0x0000, /* R2815 */
+ 0x0000, /* R2816 */
+ 0x0000, /* R2817 */
+ 0x0000, /* R2818 */
+ 0x0000, /* R2819 */
+ 0x0000, /* R2820 */
+ 0x0000, /* R2821 */
+ 0x0000, /* R2822 */
+ 0x0000, /* R2823 */
+ 0x0000, /* R2824 */
+ 0x0000, /* R2825 */
+ 0x0000, /* R2826 */
+ 0x0000, /* R2827 */
+ 0x0000, /* R2828 */
+ 0x0000, /* R2829 */
+ 0x0000, /* R2830 */
+ 0x0000, /* R2831 */
+ 0x0000, /* R2832 */
+ 0x0000, /* R2833 */
+ 0x0000, /* R2834 */
+ 0x0000, /* R2835 */
+ 0x0000, /* R2836 */
+ 0x0000, /* R2837 */
+ 0x0000, /* R2838 */
+ 0x0000, /* R2839 */
+ 0x0000, /* R2840 */
+ 0x0000, /* R2841 */
+ 0x0000, /* R2842 */
+ 0x0000, /* R2843 */
+ 0x0000, /* R2844 */
+ 0x0000, /* R2845 */
+ 0x0000, /* R2846 */
+ 0x0000, /* R2847 */
+ 0x0000, /* R2848 */
+ 0x0000, /* R2849 */
+ 0x0000, /* R2850 */
+ 0x0000, /* R2851 */
+ 0x0000, /* R2852 */
+ 0x0000, /* R2853 */
+ 0x0000, /* R2854 */
+ 0x0000, /* R2855 */
+ 0x0000, /* R2856 */
+ 0x0000, /* R2857 */
+ 0x0000, /* R2858 */
+ 0x0000, /* R2859 */
+ 0x0000, /* R2860 */
+ 0x0000, /* R2861 */
+ 0x0000, /* R2862 */
+ 0x0000, /* R2863 */
+ 0x0000, /* R2864 */
+ 0x0000, /* R2865 */
+ 0x0000, /* R2866 */
+ 0x0000, /* R2867 */
+ 0x0000, /* R2868 */
+ 0x0000, /* R2869 */
+ 0x0000, /* R2870 */
+ 0x0000, /* R2871 */
+ 0x0000, /* R2872 */
+ 0x0000, /* R2873 */
+ 0x0000, /* R2874 */
+ 0x0000, /* R2875 */
+ 0x0000, /* R2876 */
+ 0x0000, /* R2877 */
+ 0x0000, /* R2878 */
+ 0x0000, /* R2879 */
+ 0x0000, /* R2880 */
+ 0x0000, /* R2881 */
+ 0x0000, /* R2882 */
+ 0x0000, /* R2883 */
+ 0x0000, /* R2884 */
+ 0x0000, /* R2885 */
+ 0x0000, /* R2886 */
+ 0x0000, /* R2887 */
+ 0x0000, /* R2888 */
+ 0x0000, /* R2889 */
+ 0x0000, /* R2890 */
+ 0x0000, /* R2891 */
+ 0x0000, /* R2892 */
+ 0x0000, /* R2893 */
+ 0x0000, /* R2894 */
+ 0x0000, /* R2895 */
+ 0x0000, /* R2896 */
+ 0x0000, /* R2897 */
+ 0x0000, /* R2898 */
+ 0x0000, /* R2899 */
+ 0x0000, /* R2900 */
+ 0x0000, /* R2901 */
+ 0x0000, /* R2902 */
+ 0x0000, /* R2903 */
+ 0x0000, /* R2904 */
+ 0x0000, /* R2905 */
+ 0x0000, /* R2906 */
+ 0x0000, /* R2907 */
+ 0x0000, /* R2908 */
+ 0x0000, /* R2909 */
+ 0x0000, /* R2910 */
+ 0x0000, /* R2911 */
+ 0x0000, /* R2912 */
+ 0x0000, /* R2913 */
+ 0x0000, /* R2914 */
+ 0x0000, /* R2915 */
+ 0x0000, /* R2916 */
+ 0x0000, /* R2917 */
+ 0x0000, /* R2918 */
+ 0x0000, /* R2919 */
+ 0x0000, /* R2920 */
+ 0x0000, /* R2921 */
+ 0x0000, /* R2922 */
+ 0x0000, /* R2923 */
+ 0x0000, /* R2924 */
+ 0x0000, /* R2925 */
+ 0x0000, /* R2926 */
+ 0x0000, /* R2927 */
+ 0x0000, /* R2928 */
+ 0x0000, /* R2929 */
+ 0x0000, /* R2930 */
+ 0x0000, /* R2931 */
+ 0x0000, /* R2932 */
+ 0x0000, /* R2933 */
+ 0x0000, /* R2934 */
+ 0x0000, /* R2935 */
+ 0x0000, /* R2936 */
+ 0x0000, /* R2937 */
+ 0x0000, /* R2938 */
+ 0x0000, /* R2939 */
+ 0x0000, /* R2940 */
+ 0x0000, /* R2941 */
+ 0x0000, /* R2942 */
+ 0x0000, /* R2943 */
+ 0x0000, /* R2944 */
+ 0x0000, /* R2945 */
+ 0x0000, /* R2946 */
+ 0x0000, /* R2947 */
+ 0x0000, /* R2948 */
+ 0x0000, /* R2949 */
+ 0x0000, /* R2950 */
+ 0x0000, /* R2951 */
+ 0x0000, /* R2952 */
+ 0x0000, /* R2953 */
+ 0x0000, /* R2954 */
+ 0x0000, /* R2955 */
+ 0x0000, /* R2956 */
+ 0x0000, /* R2957 */
+ 0x0000, /* R2958 */
+ 0x0000, /* R2959 */
+ 0x0000, /* R2960 */
+ 0x0000, /* R2961 */
+ 0x0000, /* R2962 */
+ 0x0000, /* R2963 */
+ 0x0000, /* R2964 */
+ 0x0000, /* R2965 */
+ 0x0000, /* R2966 */
+ 0x0000, /* R2967 */
+ 0x0000, /* R2968 */
+ 0x0000, /* R2969 */
+ 0x0000, /* R2970 */
+ 0x0000, /* R2971 */
+ 0x0000, /* R2972 */
+ 0x0000, /* R2973 */
+ 0x0000, /* R2974 */
+ 0x0000, /* R2975 */
+ 0x0000, /* R2976 */
+ 0x0000, /* R2977 */
+ 0x0000, /* R2978 */
+ 0x0000, /* R2979 */
+ 0x0000, /* R2980 */
+ 0x0000, /* R2981 */
+ 0x0000, /* R2982 */
+ 0x0000, /* R2983 */
+ 0x0000, /* R2984 */
+ 0x0000, /* R2985 */
+ 0x0000, /* R2986 */
+ 0x0000, /* R2987 */
+ 0x0000, /* R2988 */
+ 0x0000, /* R2989 */
+ 0x0000, /* R2990 */
+ 0x0000, /* R2991 */
+ 0x0000, /* R2992 */
+ 0x0000, /* R2993 */
+ 0x0000, /* R2994 */
+ 0x0000, /* R2995 */
+ 0x0000, /* R2996 */
+ 0x0000, /* R2997 */
+ 0x0000, /* R2998 */
+ 0x0000, /* R2999 */
+ 0x0000, /* R3000 */
+ 0x0000, /* R3001 */
+ 0x0000, /* R3002 */
+ 0x0000, /* R3003 */
+ 0x0000, /* R3004 */
+ 0x0000, /* R3005 */
+ 0x0000, /* R3006 */
+ 0x0000, /* R3007 */
+ 0x0000, /* R3008 */
+ 0x0000, /* R3009 */
+ 0x0000, /* R3010 */
+ 0x0000, /* R3011 */
+ 0x0000, /* R3012 */
+ 0x0000, /* R3013 */
+ 0x0000, /* R3014 */
+ 0x0000, /* R3015 */
+ 0x0000, /* R3016 */
+ 0x0000, /* R3017 */
+ 0x0000, /* R3018 */
+ 0x0000, /* R3019 */
+ 0x0000, /* R3020 */
+ 0x0000, /* R3021 */
+ 0x0000, /* R3022 */
+ 0x0000, /* R3023 */
+ 0x0000, /* R3024 */
+ 0x0000, /* R3025 */
+ 0x0000, /* R3026 */
+ 0x0000, /* R3027 */
+ 0x0000, /* R3028 */
+ 0x0000, /* R3029 */
+ 0x0000, /* R3030 */
+ 0x0000, /* R3031 */
+ 0x0000, /* R3032 */
+ 0x0000, /* R3033 */
+ 0x0000, /* R3034 */
+ 0x0000, /* R3035 */
+ 0x0000, /* R3036 */
+ 0x0000, /* R3037 */
+ 0x0000, /* R3038 */
+ 0x0000, /* R3039 */
+ 0x0000, /* R3040 */
+ 0x0000, /* R3041 */
+ 0x0000, /* R3042 */
+ 0x0000, /* R3043 */
+ 0x0000, /* R3044 */
+ 0x0000, /* R3045 */
+ 0x0000, /* R3046 */
+ 0x0000, /* R3047 */
+ 0x0000, /* R3048 */
+ 0x0000, /* R3049 */
+ 0x0000, /* R3050 */
+ 0x0000, /* R3051 */
+ 0x0000, /* R3052 */
+ 0x0000, /* R3053 */
+ 0x0000, /* R3054 */
+ 0x0000, /* R3055 */
+ 0x0000, /* R3056 */
+ 0x0000, /* R3057 */
+ 0x0000, /* R3058 */
+ 0x0000, /* R3059 */
+ 0x0000, /* R3060 */
+ 0x0000, /* R3061 */
+ 0x0000, /* R3062 */
+ 0x0000, /* R3063 */
+ 0x0000, /* R3064 */
+ 0x0000, /* R3065 */
+ 0x0000, /* R3066 */
+ 0x0000, /* R3067 */
+ 0x0000, /* R3068 */
+ 0x0000, /* R3069 */
+ 0x0000, /* R3070 */
+ 0x0000, /* R3071 */
+ 0x0000, /* R3072 */
+ 0x0000, /* R3073 */
+ 0x0000, /* R3074 */
+ 0x0000, /* R3075 */
+ 0x0000, /* R3076 */
+ 0x0000, /* R3077 */
+ 0x0000, /* R3078 */
+ 0x0000, /* R3079 */
+ 0x0000, /* R3080 */
+ 0x0000, /* R3081 */
+ 0x0000, /* R3082 */
+ 0x0000, /* R3083 */
+ 0x0000, /* R3084 */
+ 0x0000, /* R3085 */
+ 0x0000, /* R3086 */
+ 0x0000, /* R3087 */
+ 0x0000, /* R3088 */
+ 0x0000, /* R3089 */
+ 0x0000, /* R3090 */
+ 0x0000, /* R3091 */
+ 0x0000, /* R3092 */
+ 0x0000, /* R3093 */
+ 0x0000, /* R3094 */
+ 0x0000, /* R3095 */
+ 0x0000, /* R3096 */
+ 0x0000, /* R3097 */
+ 0x0000, /* R3098 */
+ 0x0000, /* R3099 */
+ 0x0000, /* R3100 */
+ 0x0000, /* R3101 */
+ 0x0000, /* R3102 */
+ 0x0000, /* R3103 */
+ 0x0000, /* R3104 */
+ 0x0000, /* R3105 */
+ 0x0000, /* R3106 */
+ 0x0000, /* R3107 */
+ 0x0000, /* R3108 */
+ 0x0000, /* R3109 */
+ 0x0000, /* R3110 */
+ 0x0000, /* R3111 */
+ 0x0000, /* R3112 */
+ 0x0000, /* R3113 */
+ 0x0000, /* R3114 */
+ 0x0000, /* R3115 */
+ 0x0000, /* R3116 */
+ 0x0000, /* R3117 */
+ 0x0000, /* R3118 */
+ 0x0000, /* R3119 */
+ 0x0000, /* R3120 */
+ 0x0000, /* R3121 */
+ 0x0000, /* R3122 */
+ 0x0000, /* R3123 */
+ 0x0000, /* R3124 */
+ 0x0000, /* R3125 */
+ 0x0000, /* R3126 */
+ 0x0000, /* R3127 */
+ 0x0000, /* R3128 */
+ 0x0000, /* R3129 */
+ 0x0000, /* R3130 */
+ 0x0000, /* R3131 */
+ 0x0000, /* R3132 */
+ 0x0000, /* R3133 */
+ 0x0000, /* R3134 */
+ 0x0000, /* R3135 */
+ 0x0000, /* R3136 */
+ 0x0000, /* R3137 */
+ 0x0000, /* R3138 */
+ 0x0000, /* R3139 */
+ 0x0000, /* R3140 */
+ 0x0000, /* R3141 */
+ 0x0000, /* R3142 */
+ 0x0000, /* R3143 */
+ 0x0000, /* R3144 */
+ 0x0000, /* R3145 */
+ 0x0000, /* R3146 */
+ 0x0000, /* R3147 */
+ 0x0000, /* R3148 */
+ 0x0000, /* R3149 */
+ 0x0000, /* R3150 */
+ 0x0000, /* R3151 */
+ 0x0000, /* R3152 */
+ 0x0000, /* R3153 */
+ 0x0000, /* R3154 */
+ 0x0000, /* R3155 */
+ 0x0000, /* R3156 */
+ 0x0000, /* R3157 */
+ 0x0000, /* R3158 */
+ 0x0000, /* R3159 */
+ 0x0000, /* R3160 */
+ 0x0000, /* R3161 */
+ 0x0000, /* R3162 */
+ 0x0000, /* R3163 */
+ 0x0000, /* R3164 */
+ 0x0000, /* R3165 */
+ 0x0000, /* R3166 */
+ 0x0000, /* R3167 */
+ 0x0000, /* R3168 */
+ 0x0000, /* R3169 */
+ 0x0000, /* R3170 */
+ 0x0000, /* R3171 */
+ 0x0000, /* R3172 */
+ 0x0000, /* R3173 */
+ 0x0000, /* R3174 */
+ 0x0000, /* R3175 */
+ 0x0000, /* R3176 */
+ 0x0000, /* R3177 */
+ 0x0000, /* R3178 */
+ 0x0000, /* R3179 */
+ 0x0000, /* R3180 */
+ 0x0000, /* R3181 */
+ 0x0000, /* R3182 */
+ 0x0000, /* R3183 */
+ 0x0000, /* R3184 */
+ 0x0000, /* R3185 */
+ 0x0000, /* R3186 */
+ 0x0000, /* R3187 */
+ 0x0000, /* R3188 */
+ 0x0000, /* R3189 */
+ 0x0000, /* R3190 */
+ 0x0000, /* R3191 */
+ 0x0000, /* R3192 */
+ 0x0000, /* R3193 */
+ 0x0000, /* R3194 */
+ 0x0000, /* R3195 */
+ 0x0000, /* R3196 */
+ 0x0000, /* R3197 */
+ 0x0000, /* R3198 */
+ 0x0000, /* R3199 */
+ 0x0000, /* R3200 */
+ 0x0000, /* R3201 */
+ 0x0000, /* R3202 */
+ 0x0000, /* R3203 */
+ 0x0000, /* R3204 */
+ 0x0000, /* R3205 */
+ 0x0000, /* R3206 */
+ 0x0000, /* R3207 */
+ 0x0000, /* R3208 */
+ 0x0000, /* R3209 */
+ 0x0000, /* R3210 */
+ 0x0000, /* R3211 */
+ 0x0000, /* R3212 */
+ 0x0000, /* R3213 */
+ 0x0000, /* R3214 */
+ 0x0000, /* R3215 */
+ 0x0000, /* R3216 */
+ 0x0000, /* R3217 */
+ 0x0000, /* R3218 */
+ 0x0000, /* R3219 */
+ 0x0000, /* R3220 */
+ 0x0000, /* R3221 */
+ 0x0000, /* R3222 */
+ 0x0000, /* R3223 */
+ 0x0000, /* R3224 */
+ 0x0000, /* R3225 */
+ 0x0000, /* R3226 */
+ 0x0000, /* R3227 */
+ 0x0000, /* R3228 */
+ 0x0000, /* R3229 */
+ 0x0000, /* R3230 */
+ 0x0000, /* R3231 */
+ 0x0000, /* R3232 */
+ 0x0000, /* R3233 */
+ 0x0000, /* R3234 */
+ 0x0000, /* R3235 */
+ 0x0000, /* R3236 */
+ 0x0000, /* R3237 */
+ 0x0000, /* R3238 */
+ 0x0000, /* R3239 */
+ 0x0000, /* R3240 */
+ 0x0000, /* R3241 */
+ 0x0000, /* R3242 */
+ 0x0000, /* R3243 */
+ 0x0000, /* R3244 */
+ 0x0000, /* R3245 */
+ 0x0000, /* R3246 */
+ 0x0000, /* R3247 */
+ 0x0000, /* R3248 */
+ 0x0000, /* R3249 */
+ 0x0000, /* R3250 */
+ 0x0000, /* R3251 */
+ 0x0000, /* R3252 */
+ 0x0000, /* R3253 */
+ 0x0000, /* R3254 */
+ 0x0000, /* R3255 */
+ 0x0000, /* R3256 */
+ 0x0000, /* R3257 */
+ 0x0000, /* R3258 */
+ 0x0000, /* R3259 */
+ 0x0000, /* R3260 */
+ 0x0000, /* R3261 */
+ 0x0000, /* R3262 */
+ 0x0000, /* R3263 */
+ 0x0000, /* R3264 */
+ 0x0000, /* R3265 */
+ 0x0000, /* R3266 */
+ 0x0000, /* R3267 */
+ 0x0000, /* R3268 */
+ 0x0000, /* R3269 */
+ 0x0000, /* R3270 */
+ 0x0000, /* R3271 */
+ 0x0000, /* R3272 */
+ 0x0000, /* R3273 */
+ 0x0000, /* R3274 */
+ 0x0000, /* R3275 */
+ 0x0000, /* R3276 */
+ 0x0000, /* R3277 */
+ 0x0000, /* R3278 */
+ 0x0000, /* R3279 */
+ 0x0000, /* R3280 */
+ 0x0000, /* R3281 */
+ 0x0000, /* R3282 */
+ 0x0000, /* R3283 */
+ 0x0000, /* R3284 */
+ 0x0000, /* R3285 */
+ 0x0000, /* R3286 */
+ 0x0000, /* R3287 */
+ 0x0000, /* R3288 */
+ 0x0000, /* R3289 */
+ 0x0000, /* R3290 */
+ 0x0000, /* R3291 */
+ 0x0000, /* R3292 */
+ 0x0000, /* R3293 */
+ 0x0000, /* R3294 */
+ 0x0000, /* R3295 */
+ 0x0000, /* R3296 */
+ 0x0000, /* R3297 */
+ 0x0000, /* R3298 */
+ 0x0000, /* R3299 */
+ 0x0000, /* R3300 */
+ 0x0000, /* R3301 */
+ 0x0000, /* R3302 */
+ 0x0000, /* R3303 */
+ 0x0000, /* R3304 */
+ 0x0000, /* R3305 */
+ 0x0000, /* R3306 */
+ 0x0000, /* R3307 */
+ 0x0000, /* R3308 */
+ 0x0000, /* R3309 */
+ 0x0000, /* R3310 */
+ 0x0000, /* R3311 */
+ 0x0000, /* R3312 */
+ 0x0000, /* R3313 */
+ 0x0000, /* R3314 */
+ 0x0000, /* R3315 */
+ 0x0000, /* R3316 */
+ 0x0000, /* R3317 */
+ 0x0000, /* R3318 */
+ 0x0000, /* R3319 */
+ 0x0000, /* R3320 */
+ 0x0000, /* R3321 */
+ 0x0000, /* R3322 */
+ 0x0000, /* R3323 */
+ 0x0000, /* R3324 */
+ 0x0000, /* R3325 */
+ 0x0000, /* R3326 */
+ 0x0000, /* R3327 */
+ 0x0000, /* R3328 */
+ 0x0000, /* R3329 */
+ 0x0000, /* R3330 */
+ 0x0000, /* R3331 */
+ 0x0000, /* R3332 */
+ 0x0000, /* R3333 */
+ 0x0000, /* R3334 */
+ 0x0000, /* R3335 */
+ 0x0000, /* R3336 */
+ 0x0000, /* R3337 */
+ 0x0000, /* R3338 */
+ 0x0000, /* R3339 */
+ 0x0000, /* R3340 */
+ 0x0000, /* R3341 */
+ 0x0000, /* R3342 */
+ 0x0000, /* R3343 */
+ 0x0000, /* R3344 */
+ 0x0000, /* R3345 */
+ 0x0000, /* R3346 */
+ 0x0000, /* R3347 */
+ 0x0000, /* R3348 */
+ 0x0000, /* R3349 */
+ 0x0000, /* R3350 */
+ 0x0000, /* R3351 */
+ 0x0000, /* R3352 */
+ 0x0000, /* R3353 */
+ 0x0000, /* R3354 */
+ 0x0000, /* R3355 */
+ 0x0000, /* R3356 */
+ 0x0000, /* R3357 */
+ 0x0000, /* R3358 */
+ 0x0000, /* R3359 */
+ 0x0000, /* R3360 */
+ 0x0000, /* R3361 */
+ 0x0000, /* R3362 */
+ 0x0000, /* R3363 */
+ 0x0000, /* R3364 */
+ 0x0000, /* R3365 */
+ 0x0000, /* R3366 */
+ 0x0000, /* R3367 */
+ 0x0000, /* R3368 */
+ 0x0000, /* R3369 */
+ 0x0000, /* R3370 */
+ 0x0000, /* R3371 */
+ 0x0000, /* R3372 */
+ 0x0000, /* R3373 */
+ 0x0000, /* R3374 */
+ 0x0000, /* R3375 */
+ 0x0000, /* R3376 */
+ 0x0000, /* R3377 */
+ 0x0000, /* R3378 */
+ 0x0000, /* R3379 */
+ 0x0000, /* R3380 */
+ 0x0000, /* R3381 */
+ 0x0000, /* R3382 */
+ 0x0000, /* R3383 */
+ 0x0000, /* R3384 */
+ 0x0000, /* R3385 */
+ 0x0000, /* R3386 */
+ 0x0000, /* R3387 */
+ 0x0000, /* R3388 */
+ 0x0000, /* R3389 */
+ 0x0000, /* R3390 */
+ 0x0000, /* R3391 */
+ 0x0000, /* R3392 */
+ 0x0000, /* R3393 */
+ 0x0000, /* R3394 */
+ 0x0000, /* R3395 */
+ 0x0000, /* R3396 */
+ 0x0000, /* R3397 */
+ 0x0000, /* R3398 */
+ 0x0000, /* R3399 */
+ 0x0000, /* R3400 */
+ 0x0000, /* R3401 */
+ 0x0000, /* R3402 */
+ 0x0000, /* R3403 */
+ 0x0000, /* R3404 */
+ 0x0000, /* R3405 */
+ 0x0000, /* R3406 */
+ 0x0000, /* R3407 */
+ 0x0000, /* R3408 */
+ 0x0000, /* R3409 */
+ 0x0000, /* R3410 */
+ 0x0000, /* R3411 */
+ 0x0000, /* R3412 */
+ 0x0000, /* R3413 */
+ 0x0000, /* R3414 */
+ 0x0000, /* R3415 */
+ 0x0000, /* R3416 */
+ 0x0000, /* R3417 */
+ 0x0000, /* R3418 */
+ 0x0000, /* R3419 */
+ 0x0000, /* R3420 */
+ 0x0000, /* R3421 */
+ 0x0000, /* R3422 */
+ 0x0000, /* R3423 */
+ 0x0000, /* R3424 */
+ 0x0000, /* R3425 */
+ 0x0000, /* R3426 */
+ 0x0000, /* R3427 */
+ 0x0000, /* R3428 */
+ 0x0000, /* R3429 */
+ 0x0000, /* R3430 */
+ 0x0000, /* R3431 */
+ 0x0000, /* R3432 */
+ 0x0000, /* R3433 */
+ 0x0000, /* R3434 */
+ 0x0000, /* R3435 */
+ 0x0000, /* R3436 */
+ 0x0000, /* R3437 */
+ 0x0000, /* R3438 */
+ 0x0000, /* R3439 */
+ 0x0000, /* R3440 */
+ 0x0000, /* R3441 */
+ 0x0000, /* R3442 */
+ 0x0000, /* R3443 */
+ 0x0000, /* R3444 */
+ 0x0000, /* R3445 */
+ 0x0000, /* R3446 */
+ 0x0000, /* R3447 */
+ 0x0000, /* R3448 */
+ 0x0000, /* R3449 */
+ 0x0000, /* R3450 */
+ 0x0000, /* R3451 */
+ 0x0000, /* R3452 */
+ 0x0000, /* R3453 */
+ 0x0000, /* R3454 */
+ 0x0000, /* R3455 */
+ 0x0000, /* R3456 */
+ 0x0000, /* R3457 */
+ 0x0000, /* R3458 */
+ 0x0000, /* R3459 */
+ 0x0000, /* R3460 */
+ 0x0000, /* R3461 */
+ 0x0000, /* R3462 */
+ 0x0000, /* R3463 */
+ 0x0000, /* R3464 */
+ 0x0000, /* R3465 */
+ 0x0000, /* R3466 */
+ 0x0000, /* R3467 */
+ 0x0000, /* R3468 */
+ 0x0000, /* R3469 */
+ 0x0000, /* R3470 */
+ 0x0000, /* R3471 */
+ 0x0000, /* R3472 */
+ 0x0000, /* R3473 */
+ 0x0000, /* R3474 */
+ 0x0000, /* R3475 */
+ 0x0000, /* R3476 */
+ 0x0000, /* R3477 */
+ 0x0000, /* R3478 */
+ 0x0000, /* R3479 */
+ 0x0000, /* R3480 */
+ 0x0000, /* R3481 */
+ 0x0000, /* R3482 */
+ 0x0000, /* R3483 */
+ 0x0000, /* R3484 */
+ 0x0000, /* R3485 */
+ 0x0000, /* R3486 */
+ 0x0000, /* R3487 */
+ 0x0000, /* R3488 */
+ 0x0000, /* R3489 */
+ 0x0000, /* R3490 */
+ 0x0000, /* R3491 */
+ 0x0000, /* R3492 */
+ 0x0000, /* R3493 */
+ 0x0000, /* R3494 */
+ 0x0000, /* R3495 */
+ 0x0000, /* R3496 */
+ 0x0000, /* R3497 */
+ 0x0000, /* R3498 */
+ 0x0000, /* R3499 */
+ 0x0000, /* R3500 */
+ 0x0000, /* R3501 */
+ 0x0000, /* R3502 */
+ 0x0000, /* R3503 */
+ 0x0000, /* R3504 */
+ 0x0000, /* R3505 */
+ 0x0000, /* R3506 */
+ 0x0000, /* R3507 */
+ 0x0000, /* R3508 */
+ 0x0000, /* R3509 */
+ 0x0000, /* R3510 */
+ 0x0000, /* R3511 */
+ 0x0000, /* R3512 */
+ 0x0000, /* R3513 */
+ 0x0000, /* R3514 */
+ 0x0000, /* R3515 */
+ 0x0000, /* R3516 */
+ 0x0000, /* R3517 */
+ 0x0000, /* R3518 */
+ 0x0000, /* R3519 */
+ 0x0000, /* R3520 */
+ 0x0000, /* R3521 */
+ 0x0000, /* R3522 */
+ 0x0000, /* R3523 */
+ 0x0000, /* R3524 */
+ 0x0000, /* R3525 */
+ 0x0000, /* R3526 */
+ 0x0000, /* R3527 */
+ 0x0000, /* R3528 */
+ 0x0000, /* R3529 */
+ 0x0000, /* R3530 */
+ 0x0000, /* R3531 */
+ 0x0000, /* R3532 */
+ 0x0000, /* R3533 */
+ 0x0000, /* R3534 */
+ 0x0000, /* R3535 */
+ 0x0000, /* R3536 */
+ 0x0000, /* R3537 */
+ 0x0000, /* R3538 */
+ 0x0000, /* R3539 */
+ 0x0000, /* R3540 */
+ 0x0000, /* R3541 */
+ 0x0000, /* R3542 */
+ 0x0000, /* R3543 */
+ 0x0000, /* R3544 */
+ 0x0000, /* R3545 */
+ 0x0000, /* R3546 */
+ 0x0000, /* R3547 */
+ 0x0000, /* R3548 */
+ 0x0000, /* R3549 */
+ 0x0000, /* R3550 */
+ 0x0000, /* R3551 */
+ 0x0000, /* R3552 */
+ 0x0000, /* R3553 */
+ 0x0000, /* R3554 */
+ 0x0000, /* R3555 */
+ 0x0000, /* R3556 */
+ 0x0000, /* R3557 */
+ 0x0000, /* R3558 */
+ 0x0000, /* R3559 */
+ 0x0000, /* R3560 */
+ 0x0000, /* R3561 */
+ 0x0000, /* R3562 */
+ 0x0000, /* R3563 */
+ 0x0000, /* R3564 */
+ 0x0000, /* R3565 */
+ 0x0000, /* R3566 */
+ 0x0000, /* R3567 */
+ 0x0000, /* R3568 */
+ 0x0000, /* R3569 */
+ 0x0000, /* R3570 */
+ 0x0000, /* R3571 */
+ 0x0000, /* R3572 */
+ 0x0000, /* R3573 */
+ 0x0000, /* R3574 */
+ 0x0000, /* R3575 */
+ 0x0000, /* R3576 */
+ 0x0000, /* R3577 */
+ 0x0000, /* R3578 */
+ 0x0000, /* R3579 */
+ 0x0000, /* R3580 */
+ 0x0000, /* R3581 */
+ 0x0000, /* R3582 */
+ 0x0000, /* R3583 */
+ 0x0000, /* R3584 */
+ 0x0000, /* R3585 */
+ 0x0000, /* R3586 */
+ 0x0000, /* R3587 */
+ 0x0000, /* R3588 */
+ 0x0000, /* R3589 */
+ 0x0000, /* R3590 */
+ 0x0000, /* R3591 */
+ 0x0000, /* R3592 */
+ 0x0000, /* R3593 */
+ 0x0000, /* R3594 */
+ 0x0000, /* R3595 */
+ 0x0000, /* R3596 */
+ 0x0000, /* R3597 */
+ 0x0000, /* R3598 */
+ 0x0000, /* R3599 */
+ 0x0000, /* R3600 */
+ 0x0000, /* R3601 */
+ 0x0000, /* R3602 */
+ 0x0000, /* R3603 */
+ 0x0000, /* R3604 */
+ 0x0000, /* R3605 */
+ 0x0000, /* R3606 */
+ 0x0000, /* R3607 */
+ 0x0000, /* R3608 */
+ 0x0000, /* R3609 */
+ 0x0000, /* R3610 */
+ 0x0000, /* R3611 */
+ 0x0000, /* R3612 */
+ 0x0000, /* R3613 */
+ 0x0000, /* R3614 */
+ 0x0000, /* R3615 */
+ 0x0000, /* R3616 */
+ 0x0000, /* R3617 */
+ 0x0000, /* R3618 */
+ 0x0000, /* R3619 */
+ 0x0000, /* R3620 */
+ 0x0000, /* R3621 */
+ 0x0000, /* R3622 */
+ 0x0000, /* R3623 */
+ 0x0000, /* R3624 */
+ 0x0000, /* R3625 */
+ 0x0000, /* R3626 */
+ 0x0000, /* R3627 */
+ 0x0000, /* R3628 */
+ 0x0000, /* R3629 */
+ 0x0000, /* R3630 */
+ 0x0000, /* R3631 */
+ 0x0000, /* R3632 */
+ 0x0000, /* R3633 */
+ 0x0000, /* R3634 */
+ 0x0000, /* R3635 */
+ 0x0000, /* R3636 */
+ 0x0000, /* R3637 */
+ 0x0000, /* R3638 */
+ 0x0000, /* R3639 */
+ 0x0000, /* R3640 */
+ 0x0000, /* R3641 */
+ 0x0000, /* R3642 */
+ 0x0000, /* R3643 */
+ 0x0000, /* R3644 */
+ 0x0000, /* R3645 */
+ 0x0000, /* R3646 */
+ 0x0000, /* R3647 */
+ 0x0000, /* R3648 */
+ 0x0000, /* R3649 */
+ 0x0000, /* R3650 */
+ 0x0000, /* R3651 */
+ 0x0000, /* R3652 */
+ 0x0000, /* R3653 */
+ 0x0000, /* R3654 */
+ 0x0000, /* R3655 */
+ 0x0000, /* R3656 */
+ 0x0000, /* R3657 */
+ 0x0000, /* R3658 */
+ 0x0000, /* R3659 */
+ 0x0000, /* R3660 */
+ 0x0000, /* R3661 */
+ 0x0000, /* R3662 */
+ 0x0000, /* R3663 */
+ 0x0000, /* R3664 */
+ 0x0000, /* R3665 */
+ 0x0000, /* R3666 */
+ 0x0000, /* R3667 */
+ 0x0000, /* R3668 */
+ 0x0000, /* R3669 */
+ 0x0000, /* R3670 */
+ 0x0000, /* R3671 */
+ 0x0000, /* R3672 */
+ 0x0000, /* R3673 */
+ 0x0000, /* R3674 */
+ 0x0000, /* R3675 */
+ 0x0000, /* R3676 */
+ 0x0000, /* R3677 */
+ 0x0000, /* R3678 */
+ 0x0000, /* R3679 */
+ 0x0000, /* R3680 */
+ 0x0000, /* R3681 */
+ 0x0000, /* R3682 */
+ 0x0000, /* R3683 */
+ 0x0000, /* R3684 */
+ 0x0000, /* R3685 */
+ 0x0000, /* R3686 */
+ 0x0000, /* R3687 */
+ 0x0000, /* R3688 */
+ 0x0000, /* R3689 */
+ 0x0000, /* R3690 */
+ 0x0000, /* R3691 */
+ 0x0000, /* R3692 */
+ 0x0000, /* R3693 */
+ 0x0000, /* R3694 */
+ 0x0000, /* R3695 */
+ 0x0000, /* R3696 */
+ 0x0000, /* R3697 */
+ 0x0000, /* R3698 */
+ 0x0000, /* R3699 */
+ 0x0000, /* R3700 */
+ 0x0000, /* R3701 */
+ 0x0000, /* R3702 */
+ 0x0000, /* R3703 */
+ 0x0000, /* R3704 */
+ 0x0000, /* R3705 */
+ 0x0000, /* R3706 */
+ 0x0000, /* R3707 */
+ 0x0000, /* R3708 */
+ 0x0000, /* R3709 */
+ 0x0000, /* R3710 */
+ 0x0000, /* R3711 */
+ 0x0000, /* R3712 */
+ 0x0000, /* R3713 */
+ 0x0000, /* R3714 */
+ 0x0000, /* R3715 */
+ 0x0000, /* R3716 */
+ 0x0000, /* R3717 */
+ 0x0000, /* R3718 */
+ 0x0000, /* R3719 */
+ 0x0000, /* R3720 */
+ 0x0000, /* R3721 */
+ 0x0000, /* R3722 */
+ 0x0000, /* R3723 */
+ 0x0000, /* R3724 */
+ 0x0000, /* R3725 */
+ 0x0000, /* R3726 */
+ 0x0000, /* R3727 */
+ 0x0000, /* R3728 */
+ 0x0000, /* R3729 */
+ 0x0000, /* R3730 */
+ 0x0000, /* R3731 */
+ 0x0000, /* R3732 */
+ 0x0000, /* R3733 */
+ 0x0000, /* R3734 */
+ 0x0000, /* R3735 */
+ 0x0000, /* R3736 */
+ 0x0000, /* R3737 */
+ 0x0000, /* R3738 */
+ 0x0000, /* R3739 */
+ 0x0000, /* R3740 */
+ 0x0000, /* R3741 */
+ 0x0000, /* R3742 */
+ 0x0000, /* R3743 */
+ 0x0000, /* R3744 */
+ 0x0000, /* R3745 */
+ 0x0000, /* R3746 */
+ 0x0000, /* R3747 */
+ 0x0000, /* R3748 */
+ 0x0000, /* R3749 */
+ 0x0000, /* R3750 */
+ 0x0000, /* R3751 */
+ 0x0000, /* R3752 */
+ 0x0000, /* R3753 */
+ 0x0000, /* R3754 */
+ 0x0000, /* R3755 */
+ 0x0000, /* R3756 */
+ 0x0000, /* R3757 */
+ 0x0000, /* R3758 */
+ 0x0000, /* R3759 */
+ 0x0000, /* R3760 */
+ 0x0000, /* R3761 */
+ 0x0000, /* R3762 */
+ 0x0000, /* R3763 */
+ 0x0000, /* R3764 */
+ 0x0000, /* R3765 */
+ 0x0000, /* R3766 */
+ 0x0000, /* R3767 */
+ 0x0000, /* R3768 */
+ 0x0000, /* R3769 */
+ 0x0000, /* R3770 */
+ 0x0000, /* R3771 */
+ 0x0000, /* R3772 */
+ 0x0000, /* R3773 */
+ 0x0000, /* R3774 */
+ 0x0000, /* R3775 */
+ 0x0000, /* R3776 */
+ 0x0000, /* R3777 */
+ 0x0000, /* R3778 */
+ 0x0000, /* R3779 */
+ 0x0000, /* R3780 */
+ 0x0000, /* R3781 */
+ 0x0000, /* R3782 */
+ 0x0000, /* R3783 */
+ 0x0000, /* R3784 */
+ 0x0000, /* R3785 */
+ 0x0000, /* R3786 */
+ 0x0000, /* R3787 */
+ 0x0000, /* R3788 */
+ 0x0000, /* R3789 */
+ 0x0000, /* R3790 */
+ 0x0000, /* R3791 */
+ 0x0000, /* R3792 */
+ 0x0000, /* R3793 */
+ 0x0000, /* R3794 */
+ 0x0000, /* R3795 */
+ 0x0000, /* R3796 */
+ 0x0000, /* R3797 */
+ 0x0000, /* R3798 */
+ 0x0000, /* R3799 */
+ 0x0000, /* R3800 */
+ 0x0000, /* R3801 */
+ 0x0000, /* R3802 */
+ 0x0000, /* R3803 */
+ 0x0000, /* R3804 */
+ 0x0000, /* R3805 */
+ 0x0000, /* R3806 */
+ 0x0000, /* R3807 */
+ 0x0000, /* R3808 */
+ 0x0000, /* R3809 */
+ 0x0000, /* R3810 */
+ 0x0000, /* R3811 */
+ 0x0000, /* R3812 */
+ 0x0000, /* R3813 */
+ 0x0000, /* R3814 */
+ 0x0000, /* R3815 */
+ 0x0000, /* R3816 */
+ 0x0000, /* R3817 */
+ 0x0000, /* R3818 */
+ 0x0000, /* R3819 */
+ 0x0000, /* R3820 */
+ 0x0000, /* R3821 */
+ 0x0000, /* R3822 */
+ 0x0000, /* R3823 */
+ 0x0000, /* R3824 */
+ 0x0000, /* R3825 */
+ 0x0000, /* R3826 */
+ 0x0000, /* R3827 */
+ 0x0000, /* R3828 */
+ 0x0000, /* R3829 */
+ 0x0000, /* R3830 */
+ 0x0000, /* R3831 */
+ 0x0000, /* R3832 */
+ 0x0000, /* R3833 */
+ 0x0000, /* R3834 */
+ 0x0000, /* R3835 */
+ 0x0000, /* R3836 */
+ 0x0000, /* R3837 */
+ 0x0000, /* R3838 */
+ 0x0000, /* R3839 */
+ 0x0000, /* R3840 */
+ 0x0000, /* R3841 */
+ 0x0000, /* R3842 */
+ 0x0000, /* R3843 */
+ 0x0000, /* R3844 */
+ 0x0000, /* R3845 */
+ 0x0000, /* R3846 */
+ 0x0000, /* R3847 */
+ 0x0000, /* R3848 */
+ 0x0000, /* R3849 */
+ 0x0000, /* R3850 */
+ 0x0000, /* R3851 */
+ 0x0000, /* R3852 */
+ 0x0000, /* R3853 */
+ 0x0000, /* R3854 */
+ 0x0000, /* R3855 */
+ 0x0000, /* R3856 */
+ 0x0000, /* R3857 */
+ 0x0000, /* R3858 */
+ 0x0000, /* R3859 */
+ 0x0000, /* R3860 */
+ 0x0000, /* R3861 */
+ 0x0000, /* R3862 */
+ 0x0000, /* R3863 */
+ 0x0000, /* R3864 */
+ 0x0000, /* R3865 */
+ 0x0000, /* R3866 */
+ 0x0000, /* R3867 */
+ 0x0000, /* R3868 */
+ 0x0000, /* R3869 */
+ 0x0000, /* R3870 */
+ 0x0000, /* R3871 */
+ 0x0000, /* R3872 */
+ 0x0000, /* R3873 */
+ 0x0000, /* R3874 */
+ 0x0000, /* R3875 */
+ 0x0000, /* R3876 */
+ 0x0000, /* R3877 */
+ 0x0000, /* R3878 */
+ 0x0000, /* R3879 */
+ 0x0000, /* R3880 */
+ 0x0000, /* R3881 */
+ 0x0000, /* R3882 */
+ 0x0000, /* R3883 */
+ 0x0000, /* R3884 */
+ 0x0000, /* R3885 */
+ 0x0000, /* R3886 */
+ 0x0000, /* R3887 */
+ 0x0000, /* R3888 */
+ 0x0000, /* R3889 */
+ 0x0000, /* R3890 */
+ 0x0000, /* R3891 */
+ 0x0000, /* R3892 */
+ 0x0000, /* R3893 */
+ 0x0000, /* R3894 */
+ 0x0000, /* R3895 */
+ 0x0000, /* R3896 */
+ 0x0000, /* R3897 */
+ 0x0000, /* R3898 */
+ 0x0000, /* R3899 */
+ 0x0000, /* R3900 */
+ 0x0000, /* R3901 */
+ 0x0000, /* R3902 */
+ 0x0000, /* R3903 */
+ 0x0000, /* R3904 */
+ 0x0000, /* R3905 */
+ 0x0000, /* R3906 */
+ 0x0000, /* R3907 */
+ 0x0000, /* R3908 */
+ 0x0000, /* R3909 */
+ 0x0000, /* R3910 */
+ 0x0000, /* R3911 */
+ 0x0000, /* R3912 */
+ 0x0000, /* R3913 */
+ 0x0000, /* R3914 */
+ 0x0000, /* R3915 */
+ 0x0000, /* R3916 */
+ 0x0000, /* R3917 */
+ 0x0000, /* R3918 */
+ 0x0000, /* R3919 */
+ 0x0000, /* R3920 */
+ 0x0000, /* R3921 */
+ 0x0000, /* R3922 */
+ 0x0000, /* R3923 */
+ 0x0000, /* R3924 */
+ 0x0000, /* R3925 */
+ 0x0000, /* R3926 */
+ 0x0000, /* R3927 */
+ 0x0000, /* R3928 */
+ 0x0000, /* R3929 */
+ 0x0000, /* R3930 */
+ 0x0000, /* R3931 */
+ 0x0000, /* R3932 */
+ 0x0000, /* R3933 */
+ 0x0000, /* R3934 */
+ 0x0000, /* R3935 */
+ 0x0000, /* R3936 */
+ 0x0000, /* R3937 */
+ 0x0000, /* R3938 */
+ 0x0000, /* R3939 */
+ 0x0000, /* R3940 */
+ 0x0000, /* R3941 */
+ 0x0000, /* R3942 */
+ 0x0000, /* R3943 */
+ 0x0000, /* R3944 */
+ 0x0000, /* R3945 */
+ 0x0000, /* R3946 */
+ 0x0000, /* R3947 */
+ 0x0000, /* R3948 */
+ 0x0000, /* R3949 */
+ 0x0000, /* R3950 */
+ 0x0000, /* R3951 */
+ 0x0000, /* R3952 */
+ 0x0000, /* R3953 */
+ 0x0000, /* R3954 */
+ 0x0000, /* R3955 */
+ 0x0000, /* R3956 */
+ 0x0000, /* R3957 */
+ 0x0000, /* R3958 */
+ 0x0000, /* R3959 */
+ 0x0000, /* R3960 */
+ 0x0000, /* R3961 */
+ 0x0000, /* R3962 */
+ 0x0000, /* R3963 */
+ 0x0000, /* R3964 */
+ 0x0000, /* R3965 */
+ 0x0000, /* R3966 */
+ 0x0000, /* R3967 */
+ 0x0000, /* R3968 */
+ 0x0000, /* R3969 */
+ 0x0000, /* R3970 */
+ 0x0000, /* R3971 */
+ 0x0000, /* R3972 */
+ 0x0000, /* R3973 */
+ 0x0000, /* R3974 */
+ 0x0000, /* R3975 */
+ 0x0000, /* R3976 */
+ 0x0000, /* R3977 */
+ 0x0000, /* R3978 */
+ 0x0000, /* R3979 */
+ 0x0000, /* R3980 */
+ 0x0000, /* R3981 */
+ 0x0000, /* R3982 */
+ 0x0000, /* R3983 */
+ 0x0000, /* R3984 */
+ 0x0000, /* R3985 */
+ 0x0000, /* R3986 */
+ 0x0000, /* R3987 */
+ 0x0000, /* R3988 */
+ 0x0000, /* R3989 */
+ 0x0000, /* R3990 */
+ 0x0000, /* R3991 */
+ 0x0000, /* R3992 */
+ 0x0000, /* R3993 */
+ 0x0000, /* R3994 */
+ 0x0000, /* R3995 */
+ 0x0000, /* R3996 */
+ 0x0000, /* R3997 */
+ 0x0000, /* R3998 */
+ 0x0000, /* R3999 */
+ 0x0000, /* R4000 */
+ 0x0000, /* R4001 */
+ 0x0000, /* R4002 */
+ 0x0000, /* R4003 */
+ 0x0000, /* R4004 */
+ 0x0000, /* R4005 */
+ 0x0000, /* R4006 */
+ 0x0000, /* R4007 */
+ 0x0000, /* R4008 */
+ 0x0000, /* R4009 */
+ 0x0000, /* R4010 */
+ 0x0000, /* R4011 */
+ 0x0000, /* R4012 */
+ 0x0000, /* R4013 */
+ 0x0000, /* R4014 */
+ 0x0000, /* R4015 */
+ 0x0000, /* R4016 */
+ 0x0000, /* R4017 */
+ 0x0000, /* R4018 */
+ 0x0000, /* R4019 */
+ 0x0000, /* R4020 */
+ 0x0000, /* R4021 */
+ 0x0000, /* R4022 */
+ 0x0000, /* R4023 */
+ 0x0000, /* R4024 */
+ 0x0000, /* R4025 */
+ 0x0000, /* R4026 */
+ 0x0000, /* R4027 */
+ 0x0000, /* R4028 */
+ 0x0000, /* R4029 */
+ 0x0000, /* R4030 */
+ 0x0000, /* R4031 */
+ 0x0000, /* R4032 */
+ 0x0000, /* R4033 */
+ 0x0000, /* R4034 */
+ 0x0000, /* R4035 */
+ 0x0000, /* R4036 */
+ 0x0000, /* R4037 */
+ 0x0000, /* R4038 */
+ 0x0000, /* R4039 */
+ 0x0000, /* R4040 */
+ 0x0000, /* R4041 */
+ 0x0000, /* R4042 */
+ 0x0000, /* R4043 */
+ 0x0000, /* R4044 */
+ 0x0000, /* R4045 */
+ 0x0000, /* R4046 */
+ 0x0000, /* R4047 */
+ 0x0000, /* R4048 */
+ 0x0000, /* R4049 */
+ 0x0000, /* R4050 */
+ 0x0000, /* R4051 */
+ 0x0000, /* R4052 */
+ 0x0000, /* R4053 */
+ 0x0000, /* R4054 */
+ 0x0000, /* R4055 */
+ 0x0000, /* R4056 */
+ 0x0000, /* R4057 */
+ 0x0000, /* R4058 */
+ 0x0000, /* R4059 */
+ 0x0000, /* R4060 */
+ 0x0000, /* R4061 */
+ 0x0000, /* R4062 */
+ 0x0000, /* R4063 */
+ 0x0000, /* R4064 */
+ 0x0000, /* R4065 */
+ 0x0000, /* R4066 */
+ 0x0000, /* R4067 */
+ 0x0000, /* R4068 */
+ 0x0000, /* R4069 */
+ 0x0000, /* R4070 */
+ 0x0000, /* R4071 */
+ 0x0000, /* R4072 */
+ 0x0000, /* R4073 */
+ 0x0000, /* R4074 */
+ 0x0000, /* R4075 */
+ 0x0000, /* R4076 */
+ 0x0000, /* R4077 */
+ 0x0000, /* R4078 */
+ 0x0000, /* R4079 */
+ 0x0000, /* R4080 */
+ 0x0000, /* R4081 */
+ 0x0000, /* R4082 */
+ 0x0000, /* R4083 */
+ 0x0000, /* R4084 */
+ 0x0000, /* R4085 */
+ 0x0000, /* R4086 */
+ 0x0000, /* R4087 */
+ 0x0000, /* R4088 */
+ 0x0000, /* R4089 */
+ 0x0000, /* R4090 */
+ 0x0000, /* R4091 */
+ 0x0000, /* R4092 */
+ 0x0000, /* R4093 */
+ 0x0000, /* R4094 */
+ 0x0000, /* R4095 */
+ 0x001C, /* R4096 - Write Sequencer 0 */
+ 0x0003, /* R4097 - Write Sequencer 1 */
+ 0x0103, /* R4098 - Write Sequencer 2 */
+ 0x0000, /* R4099 - Write Sequencer 3 */
+ 0x0019, /* R4100 - Write Sequencer 4 */
+ 0x0007, /* R4101 - Write Sequencer 5 */
+ 0x0206, /* R4102 - Write Sequencer 6 */
+ 0x0000, /* R4103 - Write Sequencer 7 */
+ 0x0048, /* R4104 - Write Sequencer 8 */
+ 0x0001, /* R4105 - Write Sequencer 9 */
+ 0x0000, /* R4106 - Write Sequencer 10 */
+ 0x0006, /* R4107 - Write Sequencer 11 */
+ 0x001A, /* R4108 - Write Sequencer 12 */
+ 0x000F, /* R4109 - Write Sequencer 13 */
+ 0x0305, /* R4110 - Write Sequencer 14 */
+ 0x0000, /* R4111 - Write Sequencer 15 */
+ 0x0045, /* R4112 - Write Sequencer 16 */
+ 0x0011, /* R4113 - Write Sequencer 17 */
+ 0x0400, /* R4114 - Write Sequencer 18 */
+ 0x0000, /* R4115 - Write Sequencer 19 */
+ 0x0045, /* R4116 - Write Sequencer 20 */
+ 0x0019, /* R4117 - Write Sequencer 21 */
+ 0x0401, /* R4118 - Write Sequencer 22 */
+ 0x0000, /* R4119 - Write Sequencer 23 */
+ 0x0002, /* R4120 - Write Sequencer 24 */
+ 0x0030, /* R4121 - Write Sequencer 25 */
+ 0x0600, /* R4122 - Write Sequencer 26 */
+ 0x0000, /* R4123 - Write Sequencer 27 */
+ 0x0003, /* R4124 - Write Sequencer 28 */
+ 0x0030, /* R4125 - Write Sequencer 29 */
+ 0x0600, /* R4126 - Write Sequencer 30 */
+ 0x0000, /* R4127 - Write Sequencer 31 */
+ 0x0003, /* R4128 - Write Sequencer 32 */
+ 0x0001, /* R4129 - Write Sequencer 33 */
+ 0x0008, /* R4130 - Write Sequencer 34 */
+ 0x0000, /* R4131 - Write Sequencer 35 */
+ 0x003D, /* R4132 - Write Sequencer 36 */
+ 0x0033, /* R4133 - Write Sequencer 37 */
+ 0x0502, /* R4134 - Write Sequencer 38 */
+ 0x000A, /* R4135 - Write Sequencer 39 */
+ 0x00FE, /* R4136 - Write Sequencer 40 */
+ 0x0000, /* R4137 - Write Sequencer 41 */
+ 0x0000, /* R4138 - Write Sequencer 42 */
+ 0x0000, /* R4139 - Write Sequencer 43 */
+ 0x0007, /* R4140 - Write Sequencer 44 */
+ 0x0000, /* R4141 - Write Sequencer 45 */
+ 0x0102, /* R4142 - Write Sequencer 46 */
+ 0x0000, /* R4143 - Write Sequencer 47 */
+ 0x0045, /* R4144 - Write Sequencer 48 */
+ 0x001D, /* R4145 - Write Sequencer 49 */
+ 0x0402, /* R4146 - Write Sequencer 50 */
+ 0x0000, /* R4147 - Write Sequencer 51 */
+ 0x0045, /* R4148 - Write Sequencer 52 */
+ 0x001F, /* R4149 - Write Sequencer 53 */
+ 0x0403, /* R4150 - Write Sequencer 54 */
+ 0x0000, /* R4151 - Write Sequencer 55 */
+ 0x00FE, /* R4152 - Write Sequencer 56 */
+ 0x0000, /* R4153 - Write Sequencer 57 */
+ 0x0000, /* R4154 - Write Sequencer 58 */
+ 0x0000, /* R4155 - Write Sequencer 59 */
+ 0x0005, /* R4156 - Write Sequencer 60 */
+ 0x0000, /* R4157 - Write Sequencer 61 */
+ 0x0003, /* R4158 - Write Sequencer 62 */
+ 0x0107, /* R4159 - Write Sequencer 63 */
+ 0x00FE, /* R4160 - Write Sequencer 64 */
+ 0x0000, /* R4161 - Write Sequencer 65 */
+ 0x0000, /* R4162 - Write Sequencer 66 */
+ 0x0000, /* R4163 - Write Sequencer 67 */
+ 0x00FE, /* R4164 - Write Sequencer 68 */
+ 0x0000, /* R4165 - Write Sequencer 69 */
+ 0x0000, /* R4166 - Write Sequencer 70 */
+ 0x0000, /* R4167 - Write Sequencer 71 */
+ 0x0020, /* R4168 - Write Sequencer 72 */
+ 0x0007, /* R4169 - Write Sequencer 73 */
+ 0x0203, /* R4170 - Write Sequencer 74 */
+ 0x0000, /* R4171 - Write Sequencer 75 */
+ 0x0021, /* R4172 - Write Sequencer 76 */
+ 0x0007, /* R4173 - Write Sequencer 77 */
+ 0x0203, /* R4174 - Write Sequencer 78 */
+ 0x0000, /* R4175 - Write Sequencer 79 */
+ 0x0019, /* R4176 - Write Sequencer 80 */
+ 0x0019, /* R4177 - Write Sequencer 81 */
+ 0x0401, /* R4178 - Write Sequencer 82 */
+ 0x0000, /* R4179 - Write Sequencer 83 */
+ 0x003C, /* R4180 - Write Sequencer 84 */
+ 0x0033, /* R4181 - Write Sequencer 85 */
+ 0x0502, /* R4182 - Write Sequencer 86 */
+ 0x000A, /* R4183 - Write Sequencer 87 */
+ 0x00FE, /* R4184 - Write Sequencer 88 */
+ 0x0000, /* R4185 - Write Sequencer 89 */
+ 0x0000, /* R4186 - Write Sequencer 90 */
+ 0x0000, /* R4187 - Write Sequencer 91 */
+ 0x0019, /* R4188 - Write Sequencer 92 */
+ 0x0003, /* R4189 - Write Sequencer 93 */
+ 0x0102, /* R4190 - Write Sequencer 94 */
+ 0x0000, /* R4191 - Write Sequencer 95 */
+ 0x0020, /* R4192 - Write Sequencer 96 */
+ 0x0000, /* R4193 - Write Sequencer 97 */
+ 0x0203, /* R4194 - Write Sequencer 98 */
+ 0x0000, /* R4195 - Write Sequencer 99 */
+ 0x0021, /* R4196 - Write Sequencer 100 */
+ 0x0000, /* R4197 - Write Sequencer 101 */
+ 0x0203, /* R4198 - Write Sequencer 102 */
+ 0x0100, /* R4199 - Write Sequencer 103 */
+ 0x00FE, /* R4200 - Write Sequencer 104 */
+ 0x0000, /* R4201 - Write Sequencer 105 */
+ 0x0000, /* R4202 - Write Sequencer 106 */
+ 0x0000, /* R4203 - Write Sequencer 107 */
+ 0x0005, /* R4204 - Write Sequencer 108 */
+ 0x0001, /* R4205 - Write Sequencer 109 */
+ 0x0003, /* R4206 - Write Sequencer 110 */
+ 0x0008, /* R4207 - Write Sequencer 111 */
+ 0x0000, /* R4208 - Write Sequencer 112 */
+ 0x0001, /* R4209 - Write Sequencer 113 */
+ 0x0007, /* R4210 - Write Sequencer 114 */
+ 0x0000, /* R4211 - Write Sequencer 115 */
+ 0x0001, /* R4212 - Write Sequencer 116 */
+ 0x0003, /* R4213 - Write Sequencer 117 */
+ 0x0107, /* R4214 - Write Sequencer 118 */
+ 0x0000, /* R4215 - Write Sequencer 119 */
+ 0x0045, /* R4216 - Write Sequencer 120 */
+ 0x000E, /* R4217 - Write Sequencer 121 */
+ 0x0403, /* R4218 - Write Sequencer 122 */
+ 0x0000, /* R4219 - Write Sequencer 123 */
+ 0x0060, /* R4220 - Write Sequencer 124 */
+ 0x000E, /* R4221 - Write Sequencer 125 */
+ 0x0403, /* R4222 - Write Sequencer 126 */
+ 0x0000, /* R4223 - Write Sequencer 127 */
+ 0x0002, /* R4224 - Write Sequencer 128 */
+ 0x0000, /* R4225 - Write Sequencer 129 */
+ 0x0600, /* R4226 - Write Sequencer 130 */
+ 0x0000, /* R4227 - Write Sequencer 131 */
+ 0x0003, /* R4228 - Write Sequencer 132 */
+ 0x0000, /* R4229 - Write Sequencer 133 */
+ 0x0600, /* R4230 - Write Sequencer 134 */
+ 0x0000, /* R4231 - Write Sequencer 135 */
+ 0x0003, /* R4232 - Write Sequencer 136 */
+ 0x0001, /* R4233 - Write Sequencer 137 */
+ 0x0008, /* R4234 - Write Sequencer 138 */
+ 0x0000, /* R4235 - Write Sequencer 139 */
+ 0x0028, /* R4236 - Write Sequencer 140 */
+ 0x0000, /* R4237 - Write Sequencer 141 */
+ 0x0600, /* R4238 - Write Sequencer 142 */
+ 0x0000, /* R4239 - Write Sequencer 143 */
+ 0x0029, /* R4240 - Write Sequencer 144 */
+ 0x0000, /* R4241 - Write Sequencer 145 */
+ 0x0600, /* R4242 - Write Sequencer 146 */
+ 0x0000, /* R4243 - Write Sequencer 147 */
+ 0x0029, /* R4244 - Write Sequencer 148 */
+ 0x0001, /* R4245 - Write Sequencer 149 */
+ 0x0008, /* R4246 - Write Sequencer 150 */
+ 0x0000, /* R4247 - Write Sequencer 151 */
+ 0x003C, /* R4248 - Write Sequencer 152 */
+ 0x0000, /* R4249 - Write Sequencer 153 */
+ 0x0403, /* R4250 - Write Sequencer 154 */
+ 0x0000, /* R4251 - Write Sequencer 155 */
+ 0x003D, /* R4252 - Write Sequencer 156 */
+ 0x0000, /* R4253 - Write Sequencer 157 */
+ 0x0403, /* R4254 - Write Sequencer 158 */
+ 0x0000, /* R4255 - Write Sequencer 159 */
+ 0x003E, /* R4256 - Write Sequencer 160 */
+ 0x0000, /* R4257 - Write Sequencer 161 */
+ 0x0403, /* R4258 - Write Sequencer 162 */
+ 0x0000, /* R4259 - Write Sequencer 163 */
+ 0x0045, /* R4260 - Write Sequencer 164 */
+ 0x0000, /* R4261 - Write Sequencer 165 */
+ 0x0700, /* R4262 - Write Sequencer 166 */
+ 0x0000, /* R4263 - Write Sequencer 167 */
+ 0x0060, /* R4264 - Write Sequencer 168 */
+ 0x0000, /* R4265 - Write Sequencer 169 */
+ 0x0700, /* R4266 - Write Sequencer 170 */
+ 0x0000, /* R4267 - Write Sequencer 171 */
+ 0x0031, /* R4268 - Write Sequencer 172 */
+ 0x0000, /* R4269 - Write Sequencer 173 */
+ 0x0106, /* R4270 - Write Sequencer 174 */
+ 0x0000, /* R4271 - Write Sequencer 175 */
+ 0x0063, /* R4272 - Write Sequencer 176 */
+ 0x0000, /* R4273 - Write Sequencer 177 */
+ 0x0300, /* R4274 - Write Sequencer 178 */
+ 0x0000, /* R4275 - Write Sequencer 179 */
+ 0x001A, /* R4276 - Write Sequencer 180 */
+ 0x0000, /* R4277 - Write Sequencer 181 */
+ 0x0503, /* R4278 - Write Sequencer 182 */
+ 0x0000, /* R4279 - Write Sequencer 183 */
+ 0x0048, /* R4280 - Write Sequencer 184 */
+ 0x0000, /* R4281 - Write Sequencer 185 */
+ 0x0000, /* R4282 - Write Sequencer 186 */
+ 0x0000, /* R4283 - Write Sequencer 187 */
+ 0x0019, /* R4284 - Write Sequencer 188 */
+ 0x0000, /* R4285 - Write Sequencer 189 */
+ 0x0501, /* R4286 - Write Sequencer 190 */
+ 0x0000, /* R4287 - Write Sequencer 191 */
+ 0x001C, /* R4288 - Write Sequencer 192 */
+ 0x0000, /* R4289 - Write Sequencer 193 */
+ 0x0103, /* R4290 - Write Sequencer 194 */
+ 0x0000, /* R4291 - Write Sequencer 195 */
+ 0x0019, /* R4292 - Write Sequencer 196 */
+ 0x0000, /* R4293 - Write Sequencer 197 */
+ 0x0107, /* R4294 - Write Sequencer 198 */
+ 0x0100, /* R4295 - Write Sequencer 199 */
+ 0x00FE, /* R4296 - Write Sequencer 200 */
+ 0x0000, /* R4297 - Write Sequencer 201 */
+ 0x0000, /* R4298 - Write Sequencer 202 */
+ 0x0000, /* R4299 - Write Sequencer 203 */
+ 0x00FE, /* R4300 - Write Sequencer 204 */
+ 0x0000, /* R4301 - Write Sequencer 205 */
+ 0x0000, /* R4302 - Write Sequencer 206 */
+ 0x0000, /* R4303 - Write Sequencer 207 */
+ 0x001C, /* R4304 - Write Sequencer 208 */
+ 0x0003, /* R4305 - Write Sequencer 209 */
+ 0x0103, /* R4306 - Write Sequencer 210 */
+ 0x0000, /* R4307 - Write Sequencer 211 */
+ 0x0019, /* R4308 - Write Sequencer 212 */
+ 0x0007, /* R4309 - Write Sequencer 213 */
+ 0x0206, /* R4310 - Write Sequencer 214 */
+ 0x0000, /* R4311 - Write Sequencer 215 */
+ 0x0048, /* R4312 - Write Sequencer 216 */
+ 0x0001, /* R4313 - Write Sequencer 217 */
+ 0x0000, /* R4314 - Write Sequencer 218 */
+ 0x0006, /* R4315 - Write Sequencer 219 */
+ 0x001A, /* R4316 - Write Sequencer 220 */
+ 0x000F, /* R4317 - Write Sequencer 221 */
+ 0x0305, /* R4318 - Write Sequencer 222 */
+ 0x0000, /* R4319 - Write Sequencer 223 */
+ 0x0045, /* R4320 - Write Sequencer 224 */
+ 0x0011, /* R4321 - Write Sequencer 225 */
+ 0x0400, /* R4322 - Write Sequencer 226 */
+ 0x0000, /* R4323 - Write Sequencer 227 */
+ 0x0045, /* R4324 - Write Sequencer 228 */
+ 0x0019, /* R4325 - Write Sequencer 229 */
+ 0x0401, /* R4326 - Write Sequencer 230 */
+ 0x0000, /* R4327 - Write Sequencer 231 */
+ 0x0060, /* R4328 - Write Sequencer 232 */
+ 0x0011, /* R4329 - Write Sequencer 233 */
+ 0x0400, /* R4330 - Write Sequencer 234 */
+ 0x0000, /* R4331 - Write Sequencer 235 */
+ 0x0060, /* R4332 - Write Sequencer 236 */
+ 0x0019, /* R4333 - Write Sequencer 237 */
+ 0x0401, /* R4334 - Write Sequencer 238 */
+ 0x0000, /* R4335 - Write Sequencer 239 */
+ 0x0002, /* R4336 - Write Sequencer 240 */
+ 0x0030, /* R4337 - Write Sequencer 241 */
+ 0x0600, /* R4338 - Write Sequencer 242 */
+ 0x0000, /* R4339 - Write Sequencer 243 */
+ 0x0003, /* R4340 - Write Sequencer 244 */
+ 0x0030, /* R4341 - Write Sequencer 245 */
+ 0x0600, /* R4342 - Write Sequencer 246 */
+ 0x0000, /* R4343 - Write Sequencer 247 */
+ 0x0003, /* R4344 - Write Sequencer 248 */
+ 0x0001, /* R4345 - Write Sequencer 249 */
+ 0x0008, /* R4346 - Write Sequencer 250 */
+ 0x0000, /* R4347 - Write Sequencer 251 */
+ 0x003D, /* R4348 - Write Sequencer 252 */
+ 0x0033, /* R4349 - Write Sequencer 253 */
+ 0x0502, /* R4350 - Write Sequencer 254 */
+ 0x000A, /* R4351 - Write Sequencer 255 */
+ 0x003E, /* R4352 - Write Sequencer 256 */
+ 0x0033, /* R4353 - Write Sequencer 257 */
+ 0x0502, /* R4354 - Write Sequencer 258 */
+ 0x000A, /* R4355 - Write Sequencer 259 */
+ 0x0007, /* R4356 - Write Sequencer 260 */
+ 0x0000, /* R4357 - Write Sequencer 261 */
+ 0x0102, /* R4358 - Write Sequencer 262 */
+ 0x0000, /* R4359 - Write Sequencer 263 */
+ 0x0045, /* R4360 - Write Sequencer 264 */
+ 0x001D, /* R4361 - Write Sequencer 265 */
+ 0x0402, /* R4362 - Write Sequencer 266 */
+ 0x0000, /* R4363 - Write Sequencer 267 */
+ 0x0045, /* R4364 - Write Sequencer 268 */
+ 0x001F, /* R4365 - Write Sequencer 269 */
+ 0x0403, /* R4366 - Write Sequencer 270 */
+ 0x0000, /* R4367 - Write Sequencer 271 */
+ 0x0060, /* R4368 - Write Sequencer 272 */
+ 0x001D, /* R4369 - Write Sequencer 273 */
+ 0x0402, /* R4370 - Write Sequencer 274 */
+ 0x0000, /* R4371 - Write Sequencer 275 */
+ 0x0060, /* R4372 - Write Sequencer 276 */
+ 0x001F, /* R4373 - Write Sequencer 277 */
+ 0x0403, /* R4374 - Write Sequencer 278 */
+ 0x0000, /* R4375 - Write Sequencer 279 */
+ 0x0005, /* R4376 - Write Sequencer 280 */
+ 0x0000, /* R4377 - Write Sequencer 281 */
+ 0x0003, /* R4378 - Write Sequencer 282 */
+ 0x0108, /* R4379 - Write Sequencer 283 */
+ 0x00FE, /* R4380 - Write Sequencer 284 */
+ 0x0000, /* R4381 - Write Sequencer 285 */
+ 0x0000, /* R4382 - Write Sequencer 286 */
+ 0x0000, /* R4383 - Write Sequencer 287 */
+ 0x0045, /* R4384 - Write Sequencer 288 */
+ 0x000E, /* R4385 - Write Sequencer 289 */
+ 0x0403, /* R4386 - Write Sequencer 290 */
+ 0x0000, /* R4387 - Write Sequencer 291 */
+ 0x001A, /* R4388 - Write Sequencer 292 */
+ 0x0003, /* R4389 - Write Sequencer 293 */
+ 0x0100, /* R4390 - Write Sequencer 294 */
+ 0x0000, /* R4391 - Write Sequencer 295 */
+ 0x0002, /* R4392 - Write Sequencer 296 */
+ 0x0001, /* R4393 - Write Sequencer 297 */
+ 0x0008, /* R4394 - Write Sequencer 298 */
+ 0x0000, /* R4395 - Write Sequencer 299 */
+ 0x0045, /* R4396 - Write Sequencer 300 */
+ 0x0000, /* R4397 - Write Sequencer 301 */
+ 0x0700, /* R4398 - Write Sequencer 302 */
+ 0x0000, /* R4399 - Write Sequencer 303 */
+ 0x0060, /* R4400 - Write Sequencer 304 */
+ 0x0011, /* R4401 - Write Sequencer 305 */
+ 0x0400, /* R4402 - Write Sequencer 306 */
+ 0x0000, /* R4403 - Write Sequencer 307 */
+ 0x0060, /* R4404 - Write Sequencer 308 */
+ 0x0019, /* R4405 - Write Sequencer 309 */
+ 0x0401, /* R4406 - Write Sequencer 310 */
+ 0x0000, /* R4407 - Write Sequencer 311 */
+ 0x001A, /* R4408 - Write Sequencer 312 */
+ 0x0000, /* R4409 - Write Sequencer 313 */
+ 0x0100, /* R4410 - Write Sequencer 314 */
+ 0x0000, /* R4411 - Write Sequencer 315 */
+ 0x0002, /* R4412 - Write Sequencer 316 */
+ 0x0001, /* R4413 - Write Sequencer 317 */
+ 0x0008, /* R4414 - Write Sequencer 318 */
+ 0x0000, /* R4415 - Write Sequencer 319 */
+ 0x0060, /* R4416 - Write Sequencer 320 */
+ 0x001D, /* R4417 - Write Sequencer 321 */
+ 0x0402, /* R4418 - Write Sequencer 322 */
+ 0x0000, /* R4419 - Write Sequencer 323 */
+ 0x0060, /* R4420 - Write Sequencer 324 */
+ 0x001F, /* R4421 - Write Sequencer 325 */
+ 0x0403, /* R4422 - Write Sequencer 326 */
+ 0x0000, /* R4423 - Write Sequencer 327 */
+ 0x0005, /* R4424 - Write Sequencer 328 */
+ 0x0000, /* R4425 - Write Sequencer 329 */
+ 0x0003, /* R4426 - Write Sequencer 330 */
+ 0x0100, /* R4427 - Write Sequencer 331 */
+ 0x00FE, /* R4428 - Write Sequencer 332 */
+ 0x0000, /* R4429 - Write Sequencer 333 */
+ 0x0000, /* R4430 - Write Sequencer 334 */
+ 0x0000, /* R4431 - Write Sequencer 335 */
+ 0x0060, /* R4432 - Write Sequencer 336 */
+ 0x000E, /* R4433 - Write Sequencer 337 */
+ 0x0403, /* R4434 - Write Sequencer 338 */
+ 0x0000, /* R4435 - Write Sequencer 339 */
+ 0x001A, /* R4436 - Write Sequencer 340 */
+ 0x0003, /* R4437 - Write Sequencer 341 */
+ 0x0100, /* R4438 - Write Sequencer 342 */
+ 0x0000, /* R4439 - Write Sequencer 343 */
+ 0x0002, /* R4440 - Write Sequencer 344 */
+ 0x0001, /* R4441 - Write Sequencer 345 */
+ 0x0008, /* R4442 - Write Sequencer 346 */
+ 0x0000, /* R4443 - Write Sequencer 347 */
+ 0x0060, /* R4444 - Write Sequencer 348 */
+ 0x0000, /* R4445 - Write Sequencer 349 */
+ 0x0700, /* R4446 - Write Sequencer 350 */
+ 0x0000, /* R4447 - Write Sequencer 351 */
+ 0x0045, /* R4448 - Write Sequencer 352 */
+ 0x0011, /* R4449 - Write Sequencer 353 */
+ 0x0400, /* R4450 - Write Sequencer 354 */
+ 0x0000, /* R4451 - Write Sequencer 355 */
+ 0x0045, /* R4452 - Write Sequencer 356 */
+ 0x0019, /* R4453 - Write Sequencer 357 */
+ 0x0401, /* R4454 - Write Sequencer 358 */
+ 0x0000, /* R4455 - Write Sequencer 359 */
+ 0x001A, /* R4456 - Write Sequencer 360 */
+ 0x0000, /* R4457 - Write Sequencer 361 */
+ 0x0100, /* R4458 - Write Sequencer 362 */
+ 0x0000, /* R4459 - Write Sequencer 363 */
+ 0x0002, /* R4460 - Write Sequencer 364 */
+ 0x0001, /* R4461 - Write Sequencer 365 */
+ 0x0008, /* R4462 - Write Sequencer 366 */
+ 0x0000, /* R4463 - Write Sequencer 367 */
+ 0x0045, /* R4464 - Write Sequencer 368 */
+ 0x001D, /* R4465 - Write Sequencer 369 */
+ 0x0402, /* R4466 - Write Sequencer 370 */
+ 0x0000, /* R4467 - Write Sequencer 371 */
+ 0x0045, /* R4468 - Write Sequencer 372 */
+ 0x001F, /* R4469 - Write Sequencer 373 */
+ 0x0403, /* R4470 - Write Sequencer 374 */
+ 0x0000, /* R4471 - Write Sequencer 375 */
+ 0x0005, /* R4472 - Write Sequencer 376 */
+ 0x0000, /* R4473 - Write Sequencer 377 */
+ 0x0003, /* R4474 - Write Sequencer 378 */
+ 0x0100, /* R4475 - Write Sequencer 379 */
+ 0x00FE, /* R4476 - Write Sequencer 380 */
+ 0x0000, /* R4477 - Write Sequencer 381 */
+ 0x0000, /* R4478 - Write Sequencer 382 */
+ 0x0000, /* R4479 - Write Sequencer 383 */
+ 0x00FE, /* R4480 - Write Sequencer 384 */
+ 0x0000, /* R4481 - Write Sequencer 385 */
+ 0x0000, /* R4482 - Write Sequencer 386 */
+ 0x0000, /* R4483 - Write Sequencer 387 */
+ 0x00FE, /* R4484 - Write Sequencer 388 */
+ 0x0000, /* R4485 - Write Sequencer 389 */
+ 0x0000, /* R4486 - Write Sequencer 390 */
+ 0x0000, /* R4487 - Write Sequencer 391 */
+ 0x00FE, /* R4488 - Write Sequencer 392 */
+ 0x0000, /* R4489 - Write Sequencer 393 */
+ 0x0000, /* R4490 - Write Sequencer 394 */
+ 0x0000, /* R4491 - Write Sequencer 395 */
+ 0x00FE, /* R4492 - Write Sequencer 396 */
+ 0x0000, /* R4493 - Write Sequencer 397 */
+ 0x0000, /* R4494 - Write Sequencer 398 */
+ 0x0000, /* R4495 - Write Sequencer 399 */
+ 0x0031, /* R4496 - Write Sequencer 400 */
+ 0x0001, /* R4497 - Write Sequencer 401 */
+ 0x0004, /* R4498 - Write Sequencer 402 */
+ 0x0000, /* R4499 - Write Sequencer 403 */
+ 0x0031, /* R4500 - Write Sequencer 404 */
+ 0x0007, /* R4501 - Write Sequencer 405 */
+ 0x0200, /* R4502 - Write Sequencer 406 */
+ 0x0000, /* R4503 - Write Sequencer 407 */
+ 0x0031, /* R4504 - Write Sequencer 408 */
+ 0x0000, /* R4505 - Write Sequencer 409 */
+ 0x0106, /* R4506 - Write Sequencer 410 */
+ 0x0100, /* R4507 - Write Sequencer 411 */
+ 0x00FE, /* R4508 - Write Sequencer 412 */
+ 0x0000, /* R4509 - Write Sequencer 413 */
+ 0x0000, /* R4510 - Write Sequencer 414 */
+ 0x0000, /* R4511 - Write Sequencer 415 */
+ 0x0031, /* R4512 - Write Sequencer 416 */
+ 0x0003, /* R4513 - Write Sequencer 417 */
+ 0x0106, /* R4514 - Write Sequencer 418 */
+ 0x0000, /* R4515 - Write Sequencer 419 */
+ 0x0031, /* R4516 - Write Sequencer 420 */
+ 0x0004, /* R4517 - Write Sequencer 421 */
+ 0x0200, /* R4518 - Write Sequencer 422 */
+ 0x0000, /* R4519 - Write Sequencer 423 */
+ 0x0031, /* R4520 - Write Sequencer 424 */
+ 0x0000, /* R4521 - Write Sequencer 425 */
+ 0x0004, /* R4522 - Write Sequencer 426 */
+ 0x0100, /* R4523 - Write Sequencer 427 */
+ 0x0000, /* R4524 - Write Sequencer 428 */
+ 0x0000, /* R4525 - Write Sequencer 429 */
+ 0x0000, /* R4526 - Write Sequencer 430 */
+ 0x0000, /* R4527 - Write Sequencer 431 */
+ 0x0000, /* R4528 - Write Sequencer 432 */
+ 0x0000, /* R4529 - Write Sequencer 433 */
+ 0x0000, /* R4530 - Write Sequencer 434 */
+ 0x0000, /* R4531 - Write Sequencer 435 */
+ 0x0000, /* R4532 - Write Sequencer 436 */
+ 0x0000, /* R4533 - Write Sequencer 437 */
+ 0x0000, /* R4534 - Write Sequencer 438 */
+ 0x0000, /* R4535 - Write Sequencer 439 */
+ 0x0000, /* R4536 - Write Sequencer 440 */
+ 0x0000, /* R4537 - Write Sequencer 441 */
+ 0x0000, /* R4538 - Write Sequencer 442 */
+ 0x0000, /* R4539 - Write Sequencer 443 */
+ 0x0000, /* R4540 - Write Sequencer 444 */
+ 0x0000, /* R4541 - Write Sequencer 445 */
+ 0x0000, /* R4542 - Write Sequencer 446 */
+ 0x0000, /* R4543 - Write Sequencer 447 */
+ 0x0000, /* R4544 - Write Sequencer 448 */
+ 0x0000, /* R4545 - Write Sequencer 449 */
+ 0x0000, /* R4546 - Write Sequencer 450 */
+ 0x0000, /* R4547 - Write Sequencer 451 */
+ 0x0000, /* R4548 - Write Sequencer 452 */
+ 0x0000, /* R4549 - Write Sequencer 453 */
+ 0x0000, /* R4550 - Write Sequencer 454 */
+ 0x0000, /* R4551 - Write Sequencer 455 */
+ 0x0000, /* R4552 - Write Sequencer 456 */
+ 0x0000, /* R4553 - Write Sequencer 457 */
+ 0x0000, /* R4554 - Write Sequencer 458 */
+ 0x0000, /* R4555 - Write Sequencer 459 */
+ 0x0000, /* R4556 - Write Sequencer 460 */
+ 0x0000, /* R4557 - Write Sequencer 461 */
+ 0x0000, /* R4558 - Write Sequencer 462 */
+ 0x0000, /* R4559 - Write Sequencer 463 */
+ 0x0000, /* R4560 - Write Sequencer 464 */
+ 0x0000, /* R4561 - Write Sequencer 465 */
+ 0x0000, /* R4562 - Write Sequencer 466 */
+ 0x0000, /* R4563 - Write Sequencer 467 */
+ 0x0000, /* R4564 - Write Sequencer 468 */
+ 0x0000, /* R4565 - Write Sequencer 469 */
+ 0x0000, /* R4566 - Write Sequencer 470 */
+ 0x0000, /* R4567 - Write Sequencer 471 */
+ 0x0000, /* R4568 - Write Sequencer 472 */
+ 0x0000, /* R4569 - Write Sequencer 473 */
+ 0x0000, /* R4570 - Write Sequencer 474 */
+ 0x0000, /* R4571 - Write Sequencer 475 */
+ 0x0000, /* R4572 - Write Sequencer 476 */
+ 0x0000, /* R4573 - Write Sequencer 477 */
+ 0x0000, /* R4574 - Write Sequencer 478 */
+ 0x0000, /* R4575 - Write Sequencer 479 */
+ 0x0000, /* R4576 - Write Sequencer 480 */
+ 0x0000, /* R4577 - Write Sequencer 481 */
+ 0x0000, /* R4578 - Write Sequencer 482 */
+ 0x0000, /* R4579 - Write Sequencer 483 */
+ 0x0000, /* R4580 - Write Sequencer 484 */
+ 0x0000, /* R4581 - Write Sequencer 485 */
+ 0x0000, /* R4582 - Write Sequencer 486 */
+ 0x0000, /* R4583 - Write Sequencer 487 */
+ 0x0000, /* R4584 - Write Sequencer 488 */
+ 0x0000, /* R4585 - Write Sequencer 489 */
+ 0x0000, /* R4586 - Write Sequencer 490 */
+ 0x0000, /* R4587 - Write Sequencer 491 */
+ 0x0000, /* R4588 - Write Sequencer 492 */
+ 0x0000, /* R4589 - Write Sequencer 493 */
+ 0x0000, /* R4590 - Write Sequencer 494 */
+ 0x0000, /* R4591 - Write Sequencer 495 */
+ 0x0000, /* R4592 - Write Sequencer 496 */
+ 0x0000, /* R4593 - Write Sequencer 497 */
+ 0x0000, /* R4594 - Write Sequencer 498 */
+ 0x0000, /* R4595 - Write Sequencer 499 */
+ 0x0000, /* R4596 - Write Sequencer 500 */
+ 0x0000, /* R4597 - Write Sequencer 501 */
+ 0x0000, /* R4598 - Write Sequencer 502 */
+ 0x0000, /* R4599 - Write Sequencer 503 */
+ 0x0000, /* R4600 - Write Sequencer 504 */
+ 0x0000, /* R4601 - Write Sequencer 505 */
+ 0x0000, /* R4602 - Write Sequencer 506 */
+ 0x0000, /* R4603 - Write Sequencer 507 */
+ 0x0000, /* R4604 - Write Sequencer 508 */
+ 0x0000, /* R4605 - Write Sequencer 509 */
+ 0x0000, /* R4606 - Write Sequencer 510 */
+ 0x0000, /* R4607 - Write Sequencer 511 */
+ 0x0000, /* R4608 */
+ 0x0000, /* R4609 */
+ 0x0000, /* R4610 */
+ 0x0000, /* R4611 */
+ 0x0000, /* R4612 */
+ 0x0000, /* R4613 */
+ 0x0000, /* R4614 */
+ 0x0000, /* R4615 */
+ 0x0000, /* R4616 */
+ 0x0000, /* R4617 */
+ 0x0000, /* R4618 */
+ 0x0000, /* R4619 */
+ 0x0000, /* R4620 */
+ 0x0000, /* R4621 */
+ 0x0000, /* R4622 */
+ 0x0000, /* R4623 */
+ 0x0000, /* R4624 */
+ 0x0000, /* R4625 */
+ 0x0000, /* R4626 */
+ 0x0000, /* R4627 */
+ 0x0000, /* R4628 */
+ 0x0000, /* R4629 */
+ 0x0000, /* R4630 */
+ 0x0000, /* R4631 */
+ 0x0000, /* R4632 */
+ 0x0000, /* R4633 */
+ 0x0000, /* R4634 */
+ 0x0000, /* R4635 */
+ 0x0000, /* R4636 */
+ 0x0000, /* R4637 */
+ 0x0000, /* R4638 */
+ 0x0000, /* R4639 */
+ 0x0000, /* R4640 */
+ 0x0000, /* R4641 */
+ 0x0000, /* R4642 */
+ 0x0000, /* R4643 */
+ 0x0000, /* R4644 */
+ 0x0000, /* R4645 */
+ 0x0000, /* R4646 */
+ 0x0000, /* R4647 */
+ 0x0000, /* R4648 */
+ 0x0000, /* R4649 */
+ 0x0000, /* R4650 */
+ 0x0000, /* R4651 */
+ 0x0000, /* R4652 */
+ 0x0000, /* R4653 */
+ 0x0000, /* R4654 */
+ 0x0000, /* R4655 */
+ 0x0000, /* R4656 */
+ 0x0000, /* R4657 */
+ 0x0000, /* R4658 */
+ 0x0000, /* R4659 */
+ 0x0000, /* R4660 */
+ 0x0000, /* R4661 */
+ 0x0000, /* R4662 */
+ 0x0000, /* R4663 */
+ 0x0000, /* R4664 */
+ 0x0000, /* R4665 */
+ 0x0000, /* R4666 */
+ 0x0000, /* R4667 */
+ 0x0000, /* R4668 */
+ 0x0000, /* R4669 */
+ 0x0000, /* R4670 */
+ 0x0000, /* R4671 */
+ 0x0000, /* R4672 */
+ 0x0000, /* R4673 */
+ 0x0000, /* R4674 */
+ 0x0000, /* R4675 */
+ 0x0000, /* R4676 */
+ 0x0000, /* R4677 */
+ 0x0000, /* R4678 */
+ 0x0000, /* R4679 */
+ 0x0000, /* R4680 */
+ 0x0000, /* R4681 */
+ 0x0000, /* R4682 */
+ 0x0000, /* R4683 */
+ 0x0000, /* R4684 */
+ 0x0000, /* R4685 */
+ 0x0000, /* R4686 */
+ 0x0000, /* R4687 */
+ 0x0000, /* R4688 */
+ 0x0000, /* R4689 */
+ 0x0000, /* R4690 */
+ 0x0000, /* R4691 */
+ 0x0000, /* R4692 */
+ 0x0000, /* R4693 */
+ 0x0000, /* R4694 */
+ 0x0000, /* R4695 */
+ 0x0000, /* R4696 */
+ 0x0000, /* R4697 */
+ 0x0000, /* R4698 */
+ 0x0000, /* R4699 */
+ 0x0000, /* R4700 */
+ 0x0000, /* R4701 */
+ 0x0000, /* R4702 */
+ 0x0000, /* R4703 */
+ 0x0000, /* R4704 */
+ 0x0000, /* R4705 */
+ 0x0000, /* R4706 */
+ 0x0000, /* R4707 */
+ 0x0000, /* R4708 */
+ 0x0000, /* R4709 */
+ 0x0000, /* R4710 */
+ 0x0000, /* R4711 */
+ 0x0000, /* R4712 */
+ 0x0000, /* R4713 */
+ 0x0000, /* R4714 */
+ 0x0000, /* R4715 */
+ 0x0000, /* R4716 */
+ 0x0000, /* R4717 */
+ 0x0000, /* R4718 */
+ 0x0000, /* R4719 */
+ 0x0000, /* R4720 */
+ 0x0000, /* R4721 */
+ 0x0000, /* R4722 */
+ 0x0000, /* R4723 */
+ 0x0000, /* R4724 */
+ 0x0000, /* R4725 */
+ 0x0000, /* R4726 */
+ 0x0000, /* R4727 */
+ 0x0000, /* R4728 */
+ 0x0000, /* R4729 */
+ 0x0000, /* R4730 */
+ 0x0000, /* R4731 */
+ 0x0000, /* R4732 */
+ 0x0000, /* R4733 */
+ 0x0000, /* R4734 */
+ 0x0000, /* R4735 */
+ 0x0000, /* R4736 */
+ 0x0000, /* R4737 */
+ 0x0000, /* R4738 */
+ 0x0000, /* R4739 */
+ 0x0000, /* R4740 */
+ 0x0000, /* R4741 */
+ 0x0000, /* R4742 */
+ 0x0000, /* R4743 */
+ 0x0000, /* R4744 */
+ 0x0000, /* R4745 */
+ 0x0000, /* R4746 */
+ 0x0000, /* R4747 */
+ 0x0000, /* R4748 */
+ 0x0000, /* R4749 */
+ 0x0000, /* R4750 */
+ 0x0000, /* R4751 */
+ 0x0000, /* R4752 */
+ 0x0000, /* R4753 */
+ 0x0000, /* R4754 */
+ 0x0000, /* R4755 */
+ 0x0000, /* R4756 */
+ 0x0000, /* R4757 */
+ 0x0000, /* R4758 */
+ 0x0000, /* R4759 */
+ 0x0000, /* R4760 */
+ 0x0000, /* R4761 */
+ 0x0000, /* R4762 */
+ 0x0000, /* R4763 */
+ 0x0000, /* R4764 */
+ 0x0000, /* R4765 */
+ 0x0000, /* R4766 */
+ 0x0000, /* R4767 */
+ 0x0000, /* R4768 */
+ 0x0000, /* R4769 */
+ 0x0000, /* R4770 */
+ 0x0000, /* R4771 */
+ 0x0000, /* R4772 */
+ 0x0000, /* R4773 */
+ 0x0000, /* R4774 */
+ 0x0000, /* R4775 */
+ 0x0000, /* R4776 */
+ 0x0000, /* R4777 */
+ 0x0000, /* R4778 */
+ 0x0000, /* R4779 */
+ 0x0000, /* R4780 */
+ 0x0000, /* R4781 */
+ 0x0000, /* R4782 */
+ 0x0000, /* R4783 */
+ 0x0000, /* R4784 */
+ 0x0000, /* R4785 */
+ 0x0000, /* R4786 */
+ 0x0000, /* R4787 */
+ 0x0000, /* R4788 */
+ 0x0000, /* R4789 */
+ 0x0000, /* R4790 */
+ 0x0000, /* R4791 */
+ 0x0000, /* R4792 */
+ 0x0000, /* R4793 */
+ 0x0000, /* R4794 */
+ 0x0000, /* R4795 */
+ 0x0000, /* R4796 */
+ 0x0000, /* R4797 */
+ 0x0000, /* R4798 */
+ 0x0000, /* R4799 */
+ 0x0000, /* R4800 */
+ 0x0000, /* R4801 */
+ 0x0000, /* R4802 */
+ 0x0000, /* R4803 */
+ 0x0000, /* R4804 */
+ 0x0000, /* R4805 */
+ 0x0000, /* R4806 */
+ 0x0000, /* R4807 */
+ 0x0000, /* R4808 */
+ 0x0000, /* R4809 */
+ 0x0000, /* R4810 */
+ 0x0000, /* R4811 */
+ 0x0000, /* R4812 */
+ 0x0000, /* R4813 */
+ 0x0000, /* R4814 */
+ 0x0000, /* R4815 */
+ 0x0000, /* R4816 */
+ 0x0000, /* R4817 */
+ 0x0000, /* R4818 */
+ 0x0000, /* R4819 */
+ 0x0000, /* R4820 */
+ 0x0000, /* R4821 */
+ 0x0000, /* R4822 */
+ 0x0000, /* R4823 */
+ 0x0000, /* R4824 */
+ 0x0000, /* R4825 */
+ 0x0000, /* R4826 */
+ 0x0000, /* R4827 */
+ 0x0000, /* R4828 */
+ 0x0000, /* R4829 */
+ 0x0000, /* R4830 */
+ 0x0000, /* R4831 */
+ 0x0000, /* R4832 */
+ 0x0000, /* R4833 */
+ 0x0000, /* R4834 */
+ 0x0000, /* R4835 */
+ 0x0000, /* R4836 */
+ 0x0000, /* R4837 */
+ 0x0000, /* R4838 */
+ 0x0000, /* R4839 */
+ 0x0000, /* R4840 */
+ 0x0000, /* R4841 */
+ 0x0000, /* R4842 */
+ 0x0000, /* R4843 */
+ 0x0000, /* R4844 */
+ 0x0000, /* R4845 */
+ 0x0000, /* R4846 */
+ 0x0000, /* R4847 */
+ 0x0000, /* R4848 */
+ 0x0000, /* R4849 */
+ 0x0000, /* R4850 */
+ 0x0000, /* R4851 */
+ 0x0000, /* R4852 */
+ 0x0000, /* R4853 */
+ 0x0000, /* R4854 */
+ 0x0000, /* R4855 */
+ 0x0000, /* R4856 */
+ 0x0000, /* R4857 */
+ 0x0000, /* R4858 */
+ 0x0000, /* R4859 */
+ 0x0000, /* R4860 */
+ 0x0000, /* R4861 */
+ 0x0000, /* R4862 */
+ 0x0000, /* R4863 */
+ 0x0000, /* R4864 */
+ 0x0000, /* R4865 */
+ 0x0000, /* R4866 */
+ 0x0000, /* R4867 */
+ 0x0000, /* R4868 */
+ 0x0000, /* R4869 */
+ 0x0000, /* R4870 */
+ 0x0000, /* R4871 */
+ 0x0000, /* R4872 */
+ 0x0000, /* R4873 */
+ 0x0000, /* R4874 */
+ 0x0000, /* R4875 */
+ 0x0000, /* R4876 */
+ 0x0000, /* R4877 */
+ 0x0000, /* R4878 */
+ 0x0000, /* R4879 */
+ 0x0000, /* R4880 */
+ 0x0000, /* R4881 */
+ 0x0000, /* R4882 */
+ 0x0000, /* R4883 */
+ 0x0000, /* R4884 */
+ 0x0000, /* R4885 */
+ 0x0000, /* R4886 */
+ 0x0000, /* R4887 */
+ 0x0000, /* R4888 */
+ 0x0000, /* R4889 */
+ 0x0000, /* R4890 */
+ 0x0000, /* R4891 */
+ 0x0000, /* R4892 */
+ 0x0000, /* R4893 */
+ 0x0000, /* R4894 */
+ 0x0000, /* R4895 */
+ 0x0000, /* R4896 */
+ 0x0000, /* R4897 */
+ 0x0000, /* R4898 */
+ 0x0000, /* R4899 */
+ 0x0000, /* R4900 */
+ 0x0000, /* R4901 */
+ 0x0000, /* R4902 */
+ 0x0000, /* R4903 */
+ 0x0000, /* R4904 */
+ 0x0000, /* R4905 */
+ 0x0000, /* R4906 */
+ 0x0000, /* R4907 */
+ 0x0000, /* R4908 */
+ 0x0000, /* R4909 */
+ 0x0000, /* R4910 */
+ 0x0000, /* R4911 */
+ 0x0000, /* R4912 */
+ 0x0000, /* R4913 */
+ 0x0000, /* R4914 */
+ 0x0000, /* R4915 */
+ 0x0000, /* R4916 */
+ 0x0000, /* R4917 */
+ 0x0000, /* R4918 */
+ 0x0000, /* R4919 */
+ 0x0000, /* R4920 */
+ 0x0000, /* R4921 */
+ 0x0000, /* R4922 */
+ 0x0000, /* R4923 */
+ 0x0000, /* R4924 */
+ 0x0000, /* R4925 */
+ 0x0000, /* R4926 */
+ 0x0000, /* R4927 */
+ 0x0000, /* R4928 */
+ 0x0000, /* R4929 */
+ 0x0000, /* R4930 */
+ 0x0000, /* R4931 */
+ 0x0000, /* R4932 */
+ 0x0000, /* R4933 */
+ 0x0000, /* R4934 */
+ 0x0000, /* R4935 */
+ 0x0000, /* R4936 */
+ 0x0000, /* R4937 */
+ 0x0000, /* R4938 */
+ 0x0000, /* R4939 */
+ 0x0000, /* R4940 */
+ 0x0000, /* R4941 */
+ 0x0000, /* R4942 */
+ 0x0000, /* R4943 */
+ 0x0000, /* R4944 */
+ 0x0000, /* R4945 */
+ 0x0000, /* R4946 */
+ 0x0000, /* R4947 */
+ 0x0000, /* R4948 */
+ 0x0000, /* R4949 */
+ 0x0000, /* R4950 */
+ 0x0000, /* R4951 */
+ 0x0000, /* R4952 */
+ 0x0000, /* R4953 */
+ 0x0000, /* R4954 */
+ 0x0000, /* R4955 */
+ 0x0000, /* R4956 */
+ 0x0000, /* R4957 */
+ 0x0000, /* R4958 */
+ 0x0000, /* R4959 */
+ 0x0000, /* R4960 */
+ 0x0000, /* R4961 */
+ 0x0000, /* R4962 */
+ 0x0000, /* R4963 */
+ 0x0000, /* R4964 */
+ 0x0000, /* R4965 */
+ 0x0000, /* R4966 */
+ 0x0000, /* R4967 */
+ 0x0000, /* R4968 */
+ 0x0000, /* R4969 */
+ 0x0000, /* R4970 */
+ 0x0000, /* R4971 */
+ 0x0000, /* R4972 */
+ 0x0000, /* R4973 */
+ 0x0000, /* R4974 */
+ 0x0000, /* R4975 */
+ 0x0000, /* R4976 */
+ 0x0000, /* R4977 */
+ 0x0000, /* R4978 */
+ 0x0000, /* R4979 */
+ 0x0000, /* R4980 */
+ 0x0000, /* R4981 */
+ 0x0000, /* R4982 */
+ 0x0000, /* R4983 */
+ 0x0000, /* R4984 */
+ 0x0000, /* R4985 */
+ 0x0000, /* R4986 */
+ 0x0000, /* R4987 */
+ 0x0000, /* R4988 */
+ 0x0000, /* R4989 */
+ 0x0000, /* R4990 */
+ 0x0000, /* R4991 */
+ 0x0000, /* R4992 */
+ 0x0000, /* R4993 */
+ 0x0000, /* R4994 */
+ 0x0000, /* R4995 */
+ 0x0000, /* R4996 */
+ 0x0000, /* R4997 */
+ 0x0000, /* R4998 */
+ 0x0000, /* R4999 */
+ 0x0000, /* R5000 */
+ 0x0000, /* R5001 */
+ 0x0000, /* R5002 */
+ 0x0000, /* R5003 */
+ 0x0000, /* R5004 */
+ 0x0000, /* R5005 */
+ 0x0000, /* R5006 */
+ 0x0000, /* R5007 */
+ 0x0000, /* R5008 */
+ 0x0000, /* R5009 */
+ 0x0000, /* R5010 */
+ 0x0000, /* R5011 */
+ 0x0000, /* R5012 */
+ 0x0000, /* R5013 */
+ 0x0000, /* R5014 */
+ 0x0000, /* R5015 */
+ 0x0000, /* R5016 */
+ 0x0000, /* R5017 */
+ 0x0000, /* R5018 */
+ 0x0000, /* R5019 */
+ 0x0000, /* R5020 */
+ 0x0000, /* R5021 */
+ 0x0000, /* R5022 */
+ 0x0000, /* R5023 */
+ 0x0000, /* R5024 */
+ 0x0000, /* R5025 */
+ 0x0000, /* R5026 */
+ 0x0000, /* R5027 */
+ 0x0000, /* R5028 */
+ 0x0000, /* R5029 */
+ 0x0000, /* R5030 */
+ 0x0000, /* R5031 */
+ 0x0000, /* R5032 */
+ 0x0000, /* R5033 */
+ 0x0000, /* R5034 */
+ 0x0000, /* R5035 */
+ 0x0000, /* R5036 */
+ 0x0000, /* R5037 */
+ 0x0000, /* R5038 */
+ 0x0000, /* R5039 */
+ 0x0000, /* R5040 */
+ 0x0000, /* R5041 */
+ 0x0000, /* R5042 */
+ 0x0000, /* R5043 */
+ 0x0000, /* R5044 */
+ 0x0000, /* R5045 */
+ 0x0000, /* R5046 */
+ 0x0000, /* R5047 */
+ 0x0000, /* R5048 */
+ 0x0000, /* R5049 */
+ 0x0000, /* R5050 */
+ 0x0000, /* R5051 */
+ 0x0000, /* R5052 */
+ 0x0000, /* R5053 */
+ 0x0000, /* R5054 */
+ 0x0000, /* R5055 */
+ 0x0000, /* R5056 */
+ 0x0000, /* R5057 */
+ 0x0000, /* R5058 */
+ 0x0000, /* R5059 */
+ 0x0000, /* R5060 */
+ 0x0000, /* R5061 */
+ 0x0000, /* R5062 */
+ 0x0000, /* R5063 */
+ 0x0000, /* R5064 */
+ 0x0000, /* R5065 */
+ 0x0000, /* R5066 */
+ 0x0000, /* R5067 */
+ 0x0000, /* R5068 */
+ 0x0000, /* R5069 */
+ 0x0000, /* R5070 */
+ 0x0000, /* R5071 */
+ 0x0000, /* R5072 */
+ 0x0000, /* R5073 */
+ 0x0000, /* R5074 */
+ 0x0000, /* R5075 */
+ 0x0000, /* R5076 */
+ 0x0000, /* R5077 */
+ 0x0000, /* R5078 */
+ 0x0000, /* R5079 */
+ 0x0000, /* R5080 */
+ 0x0000, /* R5081 */
+ 0x0000, /* R5082 */
+ 0x0000, /* R5083 */
+ 0x0000, /* R5084 */
+ 0x0000, /* R5085 */
+ 0x0000, /* R5086 */
+ 0x0000, /* R5087 */
+ 0x0000, /* R5088 */
+ 0x0000, /* R5089 */
+ 0x0000, /* R5090 */
+ 0x0000, /* R5091 */
+ 0x0000, /* R5092 */
+ 0x0000, /* R5093 */
+ 0x0000, /* R5094 */
+ 0x0000, /* R5095 */
+ 0x0000, /* R5096 */
+ 0x0000, /* R5097 */
+ 0x0000, /* R5098 */
+ 0x0000, /* R5099 */
+ 0x0000, /* R5100 */
+ 0x0000, /* R5101 */
+ 0x0000, /* R5102 */
+ 0x0000, /* R5103 */
+ 0x0000, /* R5104 */
+ 0x0000, /* R5105 */
+ 0x0000, /* R5106 */
+ 0x0000, /* R5107 */
+ 0x0000, /* R5108 */
+ 0x0000, /* R5109 */
+ 0x0000, /* R5110 */
+ 0x0000, /* R5111 */
+ 0x0000, /* R5112 */
+ 0x0000, /* R5113 */
+ 0x0000, /* R5114 */
+ 0x0000, /* R5115 */
+ 0x0000, /* R5116 */
+ 0x0000, /* R5117 */
+ 0x0000, /* R5118 */
+ 0x0000, /* R5119 */
+ 0x0000, /* R5120 */
+ 0x0000, /* R5121 */
+ 0x0000, /* R5122 */
+ 0x0000, /* R5123 */
+ 0x0000, /* R5124 */
+ 0x0000, /* R5125 */
+ 0x0000, /* R5126 */
+ 0x0000, /* R5127 */
+ 0x0000, /* R5128 */
+ 0x0000, /* R5129 */
+ 0x0000, /* R5130 */
+ 0x0000, /* R5131 */
+ 0x0000, /* R5132 */
+ 0x0000, /* R5133 */
+ 0x0000, /* R5134 */
+ 0x0000, /* R5135 */
+ 0x0000, /* R5136 */
+ 0x0000, /* R5137 */
+ 0x0000, /* R5138 */
+ 0x0000, /* R5139 */
+ 0x0000, /* R5140 */
+ 0x0000, /* R5141 */
+ 0x0000, /* R5142 */
+ 0x0000, /* R5143 */
+ 0x0000, /* R5144 */
+ 0x0000, /* R5145 */
+ 0x0000, /* R5146 */
+ 0x0000, /* R5147 */
+ 0x0000, /* R5148 */
+ 0x0000, /* R5149 */
+ 0x0000, /* R5150 */
+ 0x0000, /* R5151 */
+ 0x0000, /* R5152 */
+ 0x0000, /* R5153 */
+ 0x0000, /* R5154 */
+ 0x0000, /* R5155 */
+ 0x0000, /* R5156 */
+ 0x0000, /* R5157 */
+ 0x0000, /* R5158 */
+ 0x0000, /* R5159 */
+ 0x0000, /* R5160 */
+ 0x0000, /* R5161 */
+ 0x0000, /* R5162 */
+ 0x0000, /* R5163 */
+ 0x0000, /* R5164 */
+ 0x0000, /* R5165 */
+ 0x0000, /* R5166 */
+ 0x0000, /* R5167 */
+ 0x0000, /* R5168 */
+ 0x0000, /* R5169 */
+ 0x0000, /* R5170 */
+ 0x0000, /* R5171 */
+ 0x0000, /* R5172 */
+ 0x0000, /* R5173 */
+ 0x0000, /* R5174 */
+ 0x0000, /* R5175 */
+ 0x0000, /* R5176 */
+ 0x0000, /* R5177 */
+ 0x0000, /* R5178 */
+ 0x0000, /* R5179 */
+ 0x0000, /* R5180 */
+ 0x0000, /* R5181 */
+ 0x0000, /* R5182 */
+ 0x0000, /* R5183 */
+ 0x0000, /* R5184 */
+ 0x0000, /* R5185 */
+ 0x0000, /* R5186 */
+ 0x0000, /* R5187 */
+ 0x0000, /* R5188 */
+ 0x0000, /* R5189 */
+ 0x0000, /* R5190 */
+ 0x0000, /* R5191 */
+ 0x0000, /* R5192 */
+ 0x0000, /* R5193 */
+ 0x0000, /* R5194 */
+ 0x0000, /* R5195 */
+ 0x0000, /* R5196 */
+ 0x0000, /* R5197 */
+ 0x0000, /* R5198 */
+ 0x0000, /* R5199 */
+ 0x0000, /* R5200 */
+ 0x0000, /* R5201 */
+ 0x0000, /* R5202 */
+ 0x0000, /* R5203 */
+ 0x0000, /* R5204 */
+ 0x0000, /* R5205 */
+ 0x0000, /* R5206 */
+ 0x0000, /* R5207 */
+ 0x0000, /* R5208 */
+ 0x0000, /* R5209 */
+ 0x0000, /* R5210 */
+ 0x0000, /* R5211 */
+ 0x0000, /* R5212 */
+ 0x0000, /* R5213 */
+ 0x0000, /* R5214 */
+ 0x0000, /* R5215 */
+ 0x0000, /* R5216 */
+ 0x0000, /* R5217 */
+ 0x0000, /* R5218 */
+ 0x0000, /* R5219 */
+ 0x0000, /* R5220 */
+ 0x0000, /* R5221 */
+ 0x0000, /* R5222 */
+ 0x0000, /* R5223 */
+ 0x0000, /* R5224 */
+ 0x0000, /* R5225 */
+ 0x0000, /* R5226 */
+ 0x0000, /* R5227 */
+ 0x0000, /* R5228 */
+ 0x0000, /* R5229 */
+ 0x0000, /* R5230 */
+ 0x0000, /* R5231 */
+ 0x0000, /* R5232 */
+ 0x0000, /* R5233 */
+ 0x0000, /* R5234 */
+ 0x0000, /* R5235 */
+ 0x0000, /* R5236 */
+ 0x0000, /* R5237 */
+ 0x0000, /* R5238 */
+ 0x0000, /* R5239 */
+ 0x0000, /* R5240 */
+ 0x0000, /* R5241 */
+ 0x0000, /* R5242 */
+ 0x0000, /* R5243 */
+ 0x0000, /* R5244 */
+ 0x0000, /* R5245 */
+ 0x0000, /* R5246 */
+ 0x0000, /* R5247 */
+ 0x0000, /* R5248 */
+ 0x0000, /* R5249 */
+ 0x0000, /* R5250 */
+ 0x0000, /* R5251 */
+ 0x0000, /* R5252 */
+ 0x0000, /* R5253 */
+ 0x0000, /* R5254 */
+ 0x0000, /* R5255 */
+ 0x0000, /* R5256 */
+ 0x0000, /* R5257 */
+ 0x0000, /* R5258 */
+ 0x0000, /* R5259 */
+ 0x0000, /* R5260 */
+ 0x0000, /* R5261 */
+ 0x0000, /* R5262 */
+ 0x0000, /* R5263 */
+ 0x0000, /* R5264 */
+ 0x0000, /* R5265 */
+ 0x0000, /* R5266 */
+ 0x0000, /* R5267 */
+ 0x0000, /* R5268 */
+ 0x0000, /* R5269 */
+ 0x0000, /* R5270 */
+ 0x0000, /* R5271 */
+ 0x0000, /* R5272 */
+ 0x0000, /* R5273 */
+ 0x0000, /* R5274 */
+ 0x0000, /* R5275 */
+ 0x0000, /* R5276 */
+ 0x0000, /* R5277 */
+ 0x0000, /* R5278 */
+ 0x0000, /* R5279 */
+ 0x0000, /* R5280 */
+ 0x0000, /* R5281 */
+ 0x0000, /* R5282 */
+ 0x0000, /* R5283 */
+ 0x0000, /* R5284 */
+ 0x0000, /* R5285 */
+ 0x0000, /* R5286 */
+ 0x0000, /* R5287 */
+ 0x0000, /* R5288 */
+ 0x0000, /* R5289 */
+ 0x0000, /* R5290 */
+ 0x0000, /* R5291 */
+ 0x0000, /* R5292 */
+ 0x0000, /* R5293 */
+ 0x0000, /* R5294 */
+ 0x0000, /* R5295 */
+ 0x0000, /* R5296 */
+ 0x0000, /* R5297 */
+ 0x0000, /* R5298 */
+ 0x0000, /* R5299 */
+ 0x0000, /* R5300 */
+ 0x0000, /* R5301 */
+ 0x0000, /* R5302 */
+ 0x0000, /* R5303 */
+ 0x0000, /* R5304 */
+ 0x0000, /* R5305 */
+ 0x0000, /* R5306 */
+ 0x0000, /* R5307 */
+ 0x0000, /* R5308 */
+ 0x0000, /* R5309 */
+ 0x0000, /* R5310 */
+ 0x0000, /* R5311 */
+ 0x0000, /* R5312 */
+ 0x0000, /* R5313 */
+ 0x0000, /* R5314 */
+ 0x0000, /* R5315 */
+ 0x0000, /* R5316 */
+ 0x0000, /* R5317 */
+ 0x0000, /* R5318 */
+ 0x0000, /* R5319 */
+ 0x0000, /* R5320 */
+ 0x0000, /* R5321 */
+ 0x0000, /* R5322 */
+ 0x0000, /* R5323 */
+ 0x0000, /* R5324 */
+ 0x0000, /* R5325 */
+ 0x0000, /* R5326 */
+ 0x0000, /* R5327 */
+ 0x0000, /* R5328 */
+ 0x0000, /* R5329 */
+ 0x0000, /* R5330 */
+ 0x0000, /* R5331 */
+ 0x0000, /* R5332 */
+ 0x0000, /* R5333 */
+ 0x0000, /* R5334 */
+ 0x0000, /* R5335 */
+ 0x0000, /* R5336 */
+ 0x0000, /* R5337 */
+ 0x0000, /* R5338 */
+ 0x0000, /* R5339 */
+ 0x0000, /* R5340 */
+ 0x0000, /* R5341 */
+ 0x0000, /* R5342 */
+ 0x0000, /* R5343 */
+ 0x0000, /* R5344 */
+ 0x0000, /* R5345 */
+ 0x0000, /* R5346 */
+ 0x0000, /* R5347 */
+ 0x0000, /* R5348 */
+ 0x0000, /* R5349 */
+ 0x0000, /* R5350 */
+ 0x0000, /* R5351 */
+ 0x0000, /* R5352 */
+ 0x0000, /* R5353 */
+ 0x0000, /* R5354 */
+ 0x0000, /* R5355 */
+ 0x0000, /* R5356 */
+ 0x0000, /* R5357 */
+ 0x0000, /* R5358 */
+ 0x0000, /* R5359 */
+ 0x0000, /* R5360 */
+ 0x0000, /* R5361 */
+ 0x0000, /* R5362 */
+ 0x0000, /* R5363 */
+ 0x0000, /* R5364 */
+ 0x0000, /* R5365 */
+ 0x0000, /* R5366 */
+ 0x0000, /* R5367 */
+ 0x0000, /* R5368 */
+ 0x0000, /* R5369 */
+ 0x0000, /* R5370 */
+ 0x0000, /* R5371 */
+ 0x0000, /* R5372 */
+ 0x0000, /* R5373 */
+ 0x0000, /* R5374 */
+ 0x0000, /* R5375 */
+ 0x0000, /* R5376 */
+ 0x0000, /* R5377 */
+ 0x0000, /* R5378 */
+ 0x0000, /* R5379 */
+ 0x0000, /* R5380 */
+ 0x0000, /* R5381 */
+ 0x0000, /* R5382 */
+ 0x0000, /* R5383 */
+ 0x0000, /* R5384 */
+ 0x0000, /* R5385 */
+ 0x0000, /* R5386 */
+ 0x0000, /* R5387 */
+ 0x0000, /* R5388 */
+ 0x0000, /* R5389 */
+ 0x0000, /* R5390 */
+ 0x0000, /* R5391 */
+ 0x0000, /* R5392 */
+ 0x0000, /* R5393 */
+ 0x0000, /* R5394 */
+ 0x0000, /* R5395 */
+ 0x0000, /* R5396 */
+ 0x0000, /* R5397 */
+ 0x0000, /* R5398 */
+ 0x0000, /* R5399 */
+ 0x0000, /* R5400 */
+ 0x0000, /* R5401 */
+ 0x0000, /* R5402 */
+ 0x0000, /* R5403 */
+ 0x0000, /* R5404 */
+ 0x0000, /* R5405 */
+ 0x0000, /* R5406 */
+ 0x0000, /* R5407 */
+ 0x0000, /* R5408 */
+ 0x0000, /* R5409 */
+ 0x0000, /* R5410 */
+ 0x0000, /* R5411 */
+ 0x0000, /* R5412 */
+ 0x0000, /* R5413 */
+ 0x0000, /* R5414 */
+ 0x0000, /* R5415 */
+ 0x0000, /* R5416 */
+ 0x0000, /* R5417 */
+ 0x0000, /* R5418 */
+ 0x0000, /* R5419 */
+ 0x0000, /* R5420 */
+ 0x0000, /* R5421 */
+ 0x0000, /* R5422 */
+ 0x0000, /* R5423 */
+ 0x0000, /* R5424 */
+ 0x0000, /* R5425 */
+ 0x0000, /* R5426 */
+ 0x0000, /* R5427 */
+ 0x0000, /* R5428 */
+ 0x0000, /* R5429 */
+ 0x0000, /* R5430 */
+ 0x0000, /* R5431 */
+ 0x0000, /* R5432 */
+ 0x0000, /* R5433 */
+ 0x0000, /* R5434 */
+ 0x0000, /* R5435 */
+ 0x0000, /* R5436 */
+ 0x0000, /* R5437 */
+ 0x0000, /* R5438 */
+ 0x0000, /* R5439 */
+ 0x0000, /* R5440 */
+ 0x0000, /* R5441 */
+ 0x0000, /* R5442 */
+ 0x0000, /* R5443 */
+ 0x0000, /* R5444 */
+ 0x0000, /* R5445 */
+ 0x0000, /* R5446 */
+ 0x0000, /* R5447 */
+ 0x0000, /* R5448 */
+ 0x0000, /* R5449 */
+ 0x0000, /* R5450 */
+ 0x0000, /* R5451 */
+ 0x0000, /* R5452 */
+ 0x0000, /* R5453 */
+ 0x0000, /* R5454 */
+ 0x0000, /* R5455 */
+ 0x0000, /* R5456 */
+ 0x0000, /* R5457 */
+ 0x0000, /* R5458 */
+ 0x0000, /* R5459 */
+ 0x0000, /* R5460 */
+ 0x0000, /* R5461 */
+ 0x0000, /* R5462 */
+ 0x0000, /* R5463 */
+ 0x0000, /* R5464 */
+ 0x0000, /* R5465 */
+ 0x0000, /* R5466 */
+ 0x0000, /* R5467 */
+ 0x0000, /* R5468 */
+ 0x0000, /* R5469 */
+ 0x0000, /* R5470 */
+ 0x0000, /* R5471 */
+ 0x0000, /* R5472 */
+ 0x0000, /* R5473 */
+ 0x0000, /* R5474 */
+ 0x0000, /* R5475 */
+ 0x0000, /* R5476 */
+ 0x0000, /* R5477 */
+ 0x0000, /* R5478 */
+ 0x0000, /* R5479 */
+ 0x0000, /* R5480 */
+ 0x0000, /* R5481 */
+ 0x0000, /* R5482 */
+ 0x0000, /* R5483 */
+ 0x0000, /* R5484 */
+ 0x0000, /* R5485 */
+ 0x0000, /* R5486 */
+ 0x0000, /* R5487 */
+ 0x0000, /* R5488 */
+ 0x0000, /* R5489 */
+ 0x0000, /* R5490 */
+ 0x0000, /* R5491 */
+ 0x0000, /* R5492 */
+ 0x0000, /* R5493 */
+ 0x0000, /* R5494 */
+ 0x0000, /* R5495 */
+ 0x0000, /* R5496 */
+ 0x0000, /* R5497 */
+ 0x0000, /* R5498 */
+ 0x0000, /* R5499 */
+ 0x0000, /* R5500 */
+ 0x0000, /* R5501 */
+ 0x0000, /* R5502 */
+ 0x0000, /* R5503 */
+ 0x0000, /* R5504 */
+ 0x0000, /* R5505 */
+ 0x0000, /* R5506 */
+ 0x0000, /* R5507 */
+ 0x0000, /* R5508 */
+ 0x0000, /* R5509 */
+ 0x0000, /* R5510 */
+ 0x0000, /* R5511 */
+ 0x0000, /* R5512 */
+ 0x0000, /* R5513 */
+ 0x0000, /* R5514 */
+ 0x0000, /* R5515 */
+ 0x0000, /* R5516 */
+ 0x0000, /* R5517 */
+ 0x0000, /* R5518 */
+ 0x0000, /* R5519 */
+ 0x0000, /* R5520 */
+ 0x0000, /* R5521 */
+ 0x0000, /* R5522 */
+ 0x0000, /* R5523 */
+ 0x0000, /* R5524 */
+ 0x0000, /* R5525 */
+ 0x0000, /* R5526 */
+ 0x0000, /* R5527 */
+ 0x0000, /* R5528 */
+ 0x0000, /* R5529 */
+ 0x0000, /* R5530 */
+ 0x0000, /* R5531 */
+ 0x0000, /* R5532 */
+ 0x0000, /* R5533 */
+ 0x0000, /* R5534 */
+ 0x0000, /* R5535 */
+ 0x0000, /* R5536 */
+ 0x0000, /* R5537 */
+ 0x0000, /* R5538 */
+ 0x0000, /* R5539 */
+ 0x0000, /* R5540 */
+ 0x0000, /* R5541 */
+ 0x0000, /* R5542 */
+ 0x0000, /* R5543 */
+ 0x0000, /* R5544 */
+ 0x0000, /* R5545 */
+ 0x0000, /* R5546 */
+ 0x0000, /* R5547 */
+ 0x0000, /* R5548 */
+ 0x0000, /* R5549 */
+ 0x0000, /* R5550 */
+ 0x0000, /* R5551 */
+ 0x0000, /* R5552 */
+ 0x0000, /* R5553 */
+ 0x0000, /* R5554 */
+ 0x0000, /* R5555 */
+ 0x0000, /* R5556 */
+ 0x0000, /* R5557 */
+ 0x0000, /* R5558 */
+ 0x0000, /* R5559 */
+ 0x0000, /* R5560 */
+ 0x0000, /* R5561 */
+ 0x0000, /* R5562 */
+ 0x0000, /* R5563 */
+ 0x0000, /* R5564 */
+ 0x0000, /* R5565 */
+ 0x0000, /* R5566 */
+ 0x0000, /* R5567 */
+ 0x0000, /* R5568 */
+ 0x0000, /* R5569 */
+ 0x0000, /* R5570 */
+ 0x0000, /* R5571 */
+ 0x0000, /* R5572 */
+ 0x0000, /* R5573 */
+ 0x0000, /* R5574 */
+ 0x0000, /* R5575 */
+ 0x0000, /* R5576 */
+ 0x0000, /* R5577 */
+ 0x0000, /* R5578 */
+ 0x0000, /* R5579 */
+ 0x0000, /* R5580 */
+ 0x0000, /* R5581 */
+ 0x0000, /* R5582 */
+ 0x0000, /* R5583 */
+ 0x0000, /* R5584 */
+ 0x0000, /* R5585 */
+ 0x0000, /* R5586 */
+ 0x0000, /* R5587 */
+ 0x0000, /* R5588 */
+ 0x0000, /* R5589 */
+ 0x0000, /* R5590 */
+ 0x0000, /* R5591 */
+ 0x0000, /* R5592 */
+ 0x0000, /* R5593 */
+ 0x0000, /* R5594 */
+ 0x0000, /* R5595 */
+ 0x0000, /* R5596 */
+ 0x0000, /* R5597 */
+ 0x0000, /* R5598 */
+ 0x0000, /* R5599 */
+ 0x0000, /* R5600 */
+ 0x0000, /* R5601 */
+ 0x0000, /* R5602 */
+ 0x0000, /* R5603 */
+ 0x0000, /* R5604 */
+ 0x0000, /* R5605 */
+ 0x0000, /* R5606 */
+ 0x0000, /* R5607 */
+ 0x0000, /* R5608 */
+ 0x0000, /* R5609 */
+ 0x0000, /* R5610 */
+ 0x0000, /* R5611 */
+ 0x0000, /* R5612 */
+ 0x0000, /* R5613 */
+ 0x0000, /* R5614 */
+ 0x0000, /* R5615 */
+ 0x0000, /* R5616 */
+ 0x0000, /* R5617 */
+ 0x0000, /* R5618 */
+ 0x0000, /* R5619 */
+ 0x0000, /* R5620 */
+ 0x0000, /* R5621 */
+ 0x0000, /* R5622 */
+ 0x0000, /* R5623 */
+ 0x0000, /* R5624 */
+ 0x0000, /* R5625 */
+ 0x0000, /* R5626 */
+ 0x0000, /* R5627 */
+ 0x0000, /* R5628 */
+ 0x0000, /* R5629 */
+ 0x0000, /* R5630 */
+ 0x0000, /* R5631 */
+ 0x0000, /* R5632 */
+ 0x0000, /* R5633 */
+ 0x0000, /* R5634 */
+ 0x0000, /* R5635 */
+ 0x0000, /* R5636 */
+ 0x0000, /* R5637 */
+ 0x0000, /* R5638 */
+ 0x0000, /* R5639 */
+ 0x0000, /* R5640 */
+ 0x0000, /* R5641 */
+ 0x0000, /* R5642 */
+ 0x0000, /* R5643 */
+ 0x0000, /* R5644 */
+ 0x0000, /* R5645 */
+ 0x0000, /* R5646 */
+ 0x0000, /* R5647 */
+ 0x0000, /* R5648 */
+ 0x0000, /* R5649 */
+ 0x0000, /* R5650 */
+ 0x0000, /* R5651 */
+ 0x0000, /* R5652 */
+ 0x0000, /* R5653 */
+ 0x0000, /* R5654 */
+ 0x0000, /* R5655 */
+ 0x0000, /* R5656 */
+ 0x0000, /* R5657 */
+ 0x0000, /* R5658 */
+ 0x0000, /* R5659 */
+ 0x0000, /* R5660 */
+ 0x0000, /* R5661 */
+ 0x0000, /* R5662 */
+ 0x0000, /* R5663 */
+ 0x0000, /* R5664 */
+ 0x0000, /* R5665 */
+ 0x0000, /* R5666 */
+ 0x0000, /* R5667 */
+ 0x0000, /* R5668 */
+ 0x0000, /* R5669 */
+ 0x0000, /* R5670 */
+ 0x0000, /* R5671 */
+ 0x0000, /* R5672 */
+ 0x0000, /* R5673 */
+ 0x0000, /* R5674 */
+ 0x0000, /* R5675 */
+ 0x0000, /* R5676 */
+ 0x0000, /* R5677 */
+ 0x0000, /* R5678 */
+ 0x0000, /* R5679 */
+ 0x0000, /* R5680 */
+ 0x0000, /* R5681 */
+ 0x0000, /* R5682 */
+ 0x0000, /* R5683 */
+ 0x0000, /* R5684 */
+ 0x0000, /* R5685 */
+ 0x0000, /* R5686 */
+ 0x0000, /* R5687 */
+ 0x0000, /* R5688 */
+ 0x0000, /* R5689 */
+ 0x0000, /* R5690 */
+ 0x0000, /* R5691 */
+ 0x0000, /* R5692 */
+ 0x0000, /* R5693 */
+ 0x0000, /* R5694 */
+ 0x0000, /* R5695 */
+ 0x0000, /* R5696 */
+ 0x0000, /* R5697 */
+ 0x0000, /* R5698 */
+ 0x0000, /* R5699 */
+ 0x0000, /* R5700 */
+ 0x0000, /* R5701 */
+ 0x0000, /* R5702 */
+ 0x0000, /* R5703 */
+ 0x0000, /* R5704 */
+ 0x0000, /* R5705 */
+ 0x0000, /* R5706 */
+ 0x0000, /* R5707 */
+ 0x0000, /* R5708 */
+ 0x0000, /* R5709 */
+ 0x0000, /* R5710 */
+ 0x0000, /* R5711 */
+ 0x0000, /* R5712 */
+ 0x0000, /* R5713 */
+ 0x0000, /* R5714 */
+ 0x0000, /* R5715 */
+ 0x0000, /* R5716 */
+ 0x0000, /* R5717 */
+ 0x0000, /* R5718 */
+ 0x0000, /* R5719 */
+ 0x0000, /* R5720 */
+ 0x0000, /* R5721 */
+ 0x0000, /* R5722 */
+ 0x0000, /* R5723 */
+ 0x0000, /* R5724 */
+ 0x0000, /* R5725 */
+ 0x0000, /* R5726 */
+ 0x0000, /* R5727 */
+ 0x0000, /* R5728 */
+ 0x0000, /* R5729 */
+ 0x0000, /* R5730 */
+ 0x0000, /* R5731 */
+ 0x0000, /* R5732 */
+ 0x0000, /* R5733 */
+ 0x0000, /* R5734 */
+ 0x0000, /* R5735 */
+ 0x0000, /* R5736 */
+ 0x0000, /* R5737 */
+ 0x0000, /* R5738 */
+ 0x0000, /* R5739 */
+ 0x0000, /* R5740 */
+ 0x0000, /* R5741 */
+ 0x0000, /* R5742 */
+ 0x0000, /* R5743 */
+ 0x0000, /* R5744 */
+ 0x0000, /* R5745 */
+ 0x0000, /* R5746 */
+ 0x0000, /* R5747 */
+ 0x0000, /* R5748 */
+ 0x0000, /* R5749 */
+ 0x0000, /* R5750 */
+ 0x0000, /* R5751 */
+ 0x0000, /* R5752 */
+ 0x0000, /* R5753 */
+ 0x0000, /* R5754 */
+ 0x0000, /* R5755 */
+ 0x0000, /* R5756 */
+ 0x0000, /* R5757 */
+ 0x0000, /* R5758 */
+ 0x0000, /* R5759 */
+ 0x0000, /* R5760 */
+ 0x0000, /* R5761 */
+ 0x0000, /* R5762 */
+ 0x0000, /* R5763 */
+ 0x0000, /* R5764 */
+ 0x0000, /* R5765 */
+ 0x0000, /* R5766 */
+ 0x0000, /* R5767 */
+ 0x0000, /* R5768 */
+ 0x0000, /* R5769 */
+ 0x0000, /* R5770 */
+ 0x0000, /* R5771 */
+ 0x0000, /* R5772 */
+ 0x0000, /* R5773 */
+ 0x0000, /* R5774 */
+ 0x0000, /* R5775 */
+ 0x0000, /* R5776 */
+ 0x0000, /* R5777 */
+ 0x0000, /* R5778 */
+ 0x0000, /* R5779 */
+ 0x0000, /* R5780 */
+ 0x0000, /* R5781 */
+ 0x0000, /* R5782 */
+ 0x0000, /* R5783 */
+ 0x0000, /* R5784 */
+ 0x0000, /* R5785 */
+ 0x0000, /* R5786 */
+ 0x0000, /* R5787 */
+ 0x0000, /* R5788 */
+ 0x0000, /* R5789 */
+ 0x0000, /* R5790 */
+ 0x0000, /* R5791 */
+ 0x0000, /* R5792 */
+ 0x0000, /* R5793 */
+ 0x0000, /* R5794 */
+ 0x0000, /* R5795 */
+ 0x0000, /* R5796 */
+ 0x0000, /* R5797 */
+ 0x0000, /* R5798 */
+ 0x0000, /* R5799 */
+ 0x0000, /* R5800 */
+ 0x0000, /* R5801 */
+ 0x0000, /* R5802 */
+ 0x0000, /* R5803 */
+ 0x0000, /* R5804 */
+ 0x0000, /* R5805 */
+ 0x0000, /* R5806 */
+ 0x0000, /* R5807 */
+ 0x0000, /* R5808 */
+ 0x0000, /* R5809 */
+ 0x0000, /* R5810 */
+ 0x0000, /* R5811 */
+ 0x0000, /* R5812 */
+ 0x0000, /* R5813 */
+ 0x0000, /* R5814 */
+ 0x0000, /* R5815 */
+ 0x0000, /* R5816 */
+ 0x0000, /* R5817 */
+ 0x0000, /* R5818 */
+ 0x0000, /* R5819 */
+ 0x0000, /* R5820 */
+ 0x0000, /* R5821 */
+ 0x0000, /* R5822 */
+ 0x0000, /* R5823 */
+ 0x0000, /* R5824 */
+ 0x0000, /* R5825 */
+ 0x0000, /* R5826 */
+ 0x0000, /* R5827 */
+ 0x0000, /* R5828 */
+ 0x0000, /* R5829 */
+ 0x0000, /* R5830 */
+ 0x0000, /* R5831 */
+ 0x0000, /* R5832 */
+ 0x0000, /* R5833 */
+ 0x0000, /* R5834 */
+ 0x0000, /* R5835 */
+ 0x0000, /* R5836 */
+ 0x0000, /* R5837 */
+ 0x0000, /* R5838 */
+ 0x0000, /* R5839 */
+ 0x0000, /* R5840 */
+ 0x0000, /* R5841 */
+ 0x0000, /* R5842 */
+ 0x0000, /* R5843 */
+ 0x0000, /* R5844 */
+ 0x0000, /* R5845 */
+ 0x0000, /* R5846 */
+ 0x0000, /* R5847 */
+ 0x0000, /* R5848 */
+ 0x0000, /* R5849 */
+ 0x0000, /* R5850 */
+ 0x0000, /* R5851 */
+ 0x0000, /* R5852 */
+ 0x0000, /* R5853 */
+ 0x0000, /* R5854 */
+ 0x0000, /* R5855 */
+ 0x0000, /* R5856 */
+ 0x0000, /* R5857 */
+ 0x0000, /* R5858 */
+ 0x0000, /* R5859 */
+ 0x0000, /* R5860 */
+ 0x0000, /* R5861 */
+ 0x0000, /* R5862 */
+ 0x0000, /* R5863 */
+ 0x0000, /* R5864 */
+ 0x0000, /* R5865 */
+ 0x0000, /* R5866 */
+ 0x0000, /* R5867 */
+ 0x0000, /* R5868 */
+ 0x0000, /* R5869 */
+ 0x0000, /* R5870 */
+ 0x0000, /* R5871 */
+ 0x0000, /* R5872 */
+ 0x0000, /* R5873 */
+ 0x0000, /* R5874 */
+ 0x0000, /* R5875 */
+ 0x0000, /* R5876 */
+ 0x0000, /* R5877 */
+ 0x0000, /* R5878 */
+ 0x0000, /* R5879 */
+ 0x0000, /* R5880 */
+ 0x0000, /* R5881 */
+ 0x0000, /* R5882 */
+ 0x0000, /* R5883 */
+ 0x0000, /* R5884 */
+ 0x0000, /* R5885 */
+ 0x0000, /* R5886 */
+ 0x0000, /* R5887 */
+ 0x0000, /* R5888 */
+ 0x0000, /* R5889 */
+ 0x0000, /* R5890 */
+ 0x0000, /* R5891 */
+ 0x0000, /* R5892 */
+ 0x0000, /* R5893 */
+ 0x0000, /* R5894 */
+ 0x0000, /* R5895 */
+ 0x0000, /* R5896 */
+ 0x0000, /* R5897 */
+ 0x0000, /* R5898 */
+ 0x0000, /* R5899 */
+ 0x0000, /* R5900 */
+ 0x0000, /* R5901 */
+ 0x0000, /* R5902 */
+ 0x0000, /* R5903 */
+ 0x0000, /* R5904 */
+ 0x0000, /* R5905 */
+ 0x0000, /* R5906 */
+ 0x0000, /* R5907 */
+ 0x0000, /* R5908 */
+ 0x0000, /* R5909 */
+ 0x0000, /* R5910 */
+ 0x0000, /* R5911 */
+ 0x0000, /* R5912 */
+ 0x0000, /* R5913 */
+ 0x0000, /* R5914 */
+ 0x0000, /* R5915 */
+ 0x0000, /* R5916 */
+ 0x0000, /* R5917 */
+ 0x0000, /* R5918 */
+ 0x0000, /* R5919 */
+ 0x0000, /* R5920 */
+ 0x0000, /* R5921 */
+ 0x0000, /* R5922 */
+ 0x0000, /* R5923 */
+ 0x0000, /* R5924 */
+ 0x0000, /* R5925 */
+ 0x0000, /* R5926 */
+ 0x0000, /* R5927 */
+ 0x0000, /* R5928 */
+ 0x0000, /* R5929 */
+ 0x0000, /* R5930 */
+ 0x0000, /* R5931 */
+ 0x0000, /* R5932 */
+ 0x0000, /* R5933 */
+ 0x0000, /* R5934 */
+ 0x0000, /* R5935 */
+ 0x0000, /* R5936 */
+ 0x0000, /* R5937 */
+ 0x0000, /* R5938 */
+ 0x0000, /* R5939 */
+ 0x0000, /* R5940 */
+ 0x0000, /* R5941 */
+ 0x0000, /* R5942 */
+ 0x0000, /* R5943 */
+ 0x0000, /* R5944 */
+ 0x0000, /* R5945 */
+ 0x0000, /* R5946 */
+ 0x0000, /* R5947 */
+ 0x0000, /* R5948 */
+ 0x0000, /* R5949 */
+ 0x0000, /* R5950 */
+ 0x0000, /* R5951 */
+ 0x0000, /* R5952 */
+ 0x0000, /* R5953 */
+ 0x0000, /* R5954 */
+ 0x0000, /* R5955 */
+ 0x0000, /* R5956 */
+ 0x0000, /* R5957 */
+ 0x0000, /* R5958 */
+ 0x0000, /* R5959 */
+ 0x0000, /* R5960 */
+ 0x0000, /* R5961 */
+ 0x0000, /* R5962 */
+ 0x0000, /* R5963 */
+ 0x0000, /* R5964 */
+ 0x0000, /* R5965 */
+ 0x0000, /* R5966 */
+ 0x0000, /* R5967 */
+ 0x0000, /* R5968 */
+ 0x0000, /* R5969 */
+ 0x0000, /* R5970 */
+ 0x0000, /* R5971 */
+ 0x0000, /* R5972 */
+ 0x0000, /* R5973 */
+ 0x0000, /* R5974 */
+ 0x0000, /* R5975 */
+ 0x0000, /* R5976 */
+ 0x0000, /* R5977 */
+ 0x0000, /* R5978 */
+ 0x0000, /* R5979 */
+ 0x0000, /* R5980 */
+ 0x0000, /* R5981 */
+ 0x0000, /* R5982 */
+ 0x0000, /* R5983 */
+ 0x0000, /* R5984 */
+ 0x0000, /* R5985 */
+ 0x0000, /* R5986 */
+ 0x0000, /* R5987 */
+ 0x0000, /* R5988 */
+ 0x0000, /* R5989 */
+ 0x0000, /* R5990 */
+ 0x0000, /* R5991 */
+ 0x0000, /* R5992 */
+ 0x0000, /* R5993 */
+ 0x0000, /* R5994 */
+ 0x0000, /* R5995 */
+ 0x0000, /* R5996 */
+ 0x0000, /* R5997 */
+ 0x0000, /* R5998 */
+ 0x0000, /* R5999 */
+ 0x0000, /* R6000 */
+ 0x0000, /* R6001 */
+ 0x0000, /* R6002 */
+ 0x0000, /* R6003 */
+ 0x0000, /* R6004 */
+ 0x0000, /* R6005 */
+ 0x0000, /* R6006 */
+ 0x0000, /* R6007 */
+ 0x0000, /* R6008 */
+ 0x0000, /* R6009 */
+ 0x0000, /* R6010 */
+ 0x0000, /* R6011 */
+ 0x0000, /* R6012 */
+ 0x0000, /* R6013 */
+ 0x0000, /* R6014 */
+ 0x0000, /* R6015 */
+ 0x0000, /* R6016 */
+ 0x0000, /* R6017 */
+ 0x0000, /* R6018 */
+ 0x0000, /* R6019 */
+ 0x0000, /* R6020 */
+ 0x0000, /* R6021 */
+ 0x0000, /* R6022 */
+ 0x0000, /* R6023 */
+ 0x0000, /* R6024 */
+ 0x0000, /* R6025 */
+ 0x0000, /* R6026 */
+ 0x0000, /* R6027 */
+ 0x0000, /* R6028 */
+ 0x0000, /* R6029 */
+ 0x0000, /* R6030 */
+ 0x0000, /* R6031 */
+ 0x0000, /* R6032 */
+ 0x0000, /* R6033 */
+ 0x0000, /* R6034 */
+ 0x0000, /* R6035 */
+ 0x0000, /* R6036 */
+ 0x0000, /* R6037 */
+ 0x0000, /* R6038 */
+ 0x0000, /* R6039 */
+ 0x0000, /* R6040 */
+ 0x0000, /* R6041 */
+ 0x0000, /* R6042 */
+ 0x0000, /* R6043 */
+ 0x0000, /* R6044 */
+ 0x0000, /* R6045 */
+ 0x0000, /* R6046 */
+ 0x0000, /* R6047 */
+ 0x0000, /* R6048 */
+ 0x0000, /* R6049 */
+ 0x0000, /* R6050 */
+ 0x0000, /* R6051 */
+ 0x0000, /* R6052 */
+ 0x0000, /* R6053 */
+ 0x0000, /* R6054 */
+ 0x0000, /* R6055 */
+ 0x0000, /* R6056 */
+ 0x0000, /* R6057 */
+ 0x0000, /* R6058 */
+ 0x0000, /* R6059 */
+ 0x0000, /* R6060 */
+ 0x0000, /* R6061 */
+ 0x0000, /* R6062 */
+ 0x0000, /* R6063 */
+ 0x0000, /* R6064 */
+ 0x0000, /* R6065 */
+ 0x0000, /* R6066 */
+ 0x0000, /* R6067 */
+ 0x0000, /* R6068 */
+ 0x0000, /* R6069 */
+ 0x0000, /* R6070 */
+ 0x0000, /* R6071 */
+ 0x0000, /* R6072 */
+ 0x0000, /* R6073 */
+ 0x0000, /* R6074 */
+ 0x0000, /* R6075 */
+ 0x0000, /* R6076 */
+ 0x0000, /* R6077 */
+ 0x0000, /* R6078 */
+ 0x0000, /* R6079 */
+ 0x0000, /* R6080 */
+ 0x0000, /* R6081 */
+ 0x0000, /* R6082 */
+ 0x0000, /* R6083 */
+ 0x0000, /* R6084 */
+ 0x0000, /* R6085 */
+ 0x0000, /* R6086 */
+ 0x0000, /* R6087 */
+ 0x0000, /* R6088 */
+ 0x0000, /* R6089 */
+ 0x0000, /* R6090 */
+ 0x0000, /* R6091 */
+ 0x0000, /* R6092 */
+ 0x0000, /* R6093 */
+ 0x0000, /* R6094 */
+ 0x0000, /* R6095 */
+ 0x0000, /* R6096 */
+ 0x0000, /* R6097 */
+ 0x0000, /* R6098 */
+ 0x0000, /* R6099 */
+ 0x0000, /* R6100 */
+ 0x0000, /* R6101 */
+ 0x0000, /* R6102 */
+ 0x0000, /* R6103 */
+ 0x0000, /* R6104 */
+ 0x0000, /* R6105 */
+ 0x0000, /* R6106 */
+ 0x0000, /* R6107 */
+ 0x0000, /* R6108 */
+ 0x0000, /* R6109 */
+ 0x0000, /* R6110 */
+ 0x0000, /* R6111 */
+ 0x0000, /* R6112 */
+ 0x0000, /* R6113 */
+ 0x0000, /* R6114 */
+ 0x0000, /* R6115 */
+ 0x0000, /* R6116 */
+ 0x0000, /* R6117 */
+ 0x0000, /* R6118 */
+ 0x0000, /* R6119 */
+ 0x0000, /* R6120 */
+ 0x0000, /* R6121 */
+ 0x0000, /* R6122 */
+ 0x0000, /* R6123 */
+ 0x0000, /* R6124 */
+ 0x0000, /* R6125 */
+ 0x0000, /* R6126 */
+ 0x0000, /* R6127 */
+ 0x0000, /* R6128 */
+ 0x0000, /* R6129 */
+ 0x0000, /* R6130 */
+ 0x0000, /* R6131 */
+ 0x0000, /* R6132 */
+ 0x0000, /* R6133 */
+ 0x0000, /* R6134 */
+ 0x0000, /* R6135 */
+ 0x0000, /* R6136 */
+ 0x0000, /* R6137 */
+ 0x0000, /* R6138 */
+ 0x0000, /* R6139 */
+ 0x0000, /* R6140 */
+ 0x0000, /* R6141 */
+ 0x0000, /* R6142 */
+ 0x0000, /* R6143 */
+ 0x0000, /* R6144 */
+ 0x0000, /* R6145 */
+ 0x0000, /* R6146 */
+ 0x0000, /* R6147 */
+ 0x0000, /* R6148 */
+ 0x0000, /* R6149 */
+ 0x0000, /* R6150 */
+ 0x0000, /* R6151 */
+ 0x0000, /* R6152 */
+ 0x0000, /* R6153 */
+ 0x0000, /* R6154 */
+ 0x0000, /* R6155 */
+ 0x0000, /* R6156 */
+ 0x0000, /* R6157 */
+ 0x0000, /* R6158 */
+ 0x0000, /* R6159 */
+ 0x0000, /* R6160 */
+ 0x0000, /* R6161 */
+ 0x0000, /* R6162 */
+ 0x0000, /* R6163 */
+ 0x0000, /* R6164 */
+ 0x0000, /* R6165 */
+ 0x0000, /* R6166 */
+ 0x0000, /* R6167 */
+ 0x0000, /* R6168 */
+ 0x0000, /* R6169 */
+ 0x0000, /* R6170 */
+ 0x0000, /* R6171 */
+ 0x0000, /* R6172 */
+ 0x0000, /* R6173 */
+ 0x0000, /* R6174 */
+ 0x0000, /* R6175 */
+ 0x0000, /* R6176 */
+ 0x0000, /* R6177 */
+ 0x0000, /* R6178 */
+ 0x0000, /* R6179 */
+ 0x0000, /* R6180 */
+ 0x0000, /* R6181 */
+ 0x0000, /* R6182 */
+ 0x0000, /* R6183 */
+ 0x0000, /* R6184 */
+ 0x0000, /* R6185 */
+ 0x0000, /* R6186 */
+ 0x0000, /* R6187 */
+ 0x0000, /* R6188 */
+ 0x0000, /* R6189 */
+ 0x0000, /* R6190 */
+ 0x0000, /* R6191 */
+ 0x0000, /* R6192 */
+ 0x0000, /* R6193 */
+ 0x0000, /* R6194 */
+ 0x0000, /* R6195 */
+ 0x0000, /* R6196 */
+ 0x0000, /* R6197 */
+ 0x0000, /* R6198 */
+ 0x0000, /* R6199 */
+ 0x0000, /* R6200 */
+ 0x0000, /* R6201 */
+ 0x0000, /* R6202 */
+ 0x0000, /* R6203 */
+ 0x0000, /* R6204 */
+ 0x0000, /* R6205 */
+ 0x0000, /* R6206 */
+ 0x0000, /* R6207 */
+ 0x0000, /* R6208 */
+ 0x0000, /* R6209 */
+ 0x0000, /* R6210 */
+ 0x0000, /* R6211 */
+ 0x0000, /* R6212 */
+ 0x0000, /* R6213 */
+ 0x0000, /* R6214 */
+ 0x0000, /* R6215 */
+ 0x0000, /* R6216 */
+ 0x0000, /* R6217 */
+ 0x0000, /* R6218 */
+ 0x0000, /* R6219 */
+ 0x0000, /* R6220 */
+ 0x0000, /* R6221 */
+ 0x0000, /* R6222 */
+ 0x0000, /* R6223 */
+ 0x0000, /* R6224 */
+ 0x0000, /* R6225 */
+ 0x0000, /* R6226 */
+ 0x0000, /* R6227 */
+ 0x0000, /* R6228 */
+ 0x0000, /* R6229 */
+ 0x0000, /* R6230 */
+ 0x0000, /* R6231 */
+ 0x0000, /* R6232 */
+ 0x0000, /* R6233 */
+ 0x0000, /* R6234 */
+ 0x0000, /* R6235 */
+ 0x0000, /* R6236 */
+ 0x0000, /* R6237 */
+ 0x0000, /* R6238 */
+ 0x0000, /* R6239 */
+ 0x0000, /* R6240 */
+ 0x0000, /* R6241 */
+ 0x0000, /* R6242 */
+ 0x0000, /* R6243 */
+ 0x0000, /* R6244 */
+ 0x0000, /* R6245 */
+ 0x0000, /* R6246 */
+ 0x0000, /* R6247 */
+ 0x0000, /* R6248 */
+ 0x0000, /* R6249 */
+ 0x0000, /* R6250 */
+ 0x0000, /* R6251 */
+ 0x0000, /* R6252 */
+ 0x0000, /* R6253 */
+ 0x0000, /* R6254 */
+ 0x0000, /* R6255 */
+ 0x0000, /* R6256 */
+ 0x0000, /* R6257 */
+ 0x0000, /* R6258 */
+ 0x0000, /* R6259 */
+ 0x0000, /* R6260 */
+ 0x0000, /* R6261 */
+ 0x0000, /* R6262 */
+ 0x0000, /* R6263 */
+ 0x0000, /* R6264 */
+ 0x0000, /* R6265 */
+ 0x0000, /* R6266 */
+ 0x0000, /* R6267 */
+ 0x0000, /* R6268 */
+ 0x0000, /* R6269 */
+ 0x0000, /* R6270 */
+ 0x0000, /* R6271 */
+ 0x0000, /* R6272 */
+ 0x0000, /* R6273 */
+ 0x0000, /* R6274 */
+ 0x0000, /* R6275 */
+ 0x0000, /* R6276 */
+ 0x0000, /* R6277 */
+ 0x0000, /* R6278 */
+ 0x0000, /* R6279 */
+ 0x0000, /* R6280 */
+ 0x0000, /* R6281 */
+ 0x0000, /* R6282 */
+ 0x0000, /* R6283 */
+ 0x0000, /* R6284 */
+ 0x0000, /* R6285 */
+ 0x0000, /* R6286 */
+ 0x0000, /* R6287 */
+ 0x0000, /* R6288 */
+ 0x0000, /* R6289 */
+ 0x0000, /* R6290 */
+ 0x0000, /* R6291 */
+ 0x0000, /* R6292 */
+ 0x0000, /* R6293 */
+ 0x0000, /* R6294 */
+ 0x0000, /* R6295 */
+ 0x0000, /* R6296 */
+ 0x0000, /* R6297 */
+ 0x0000, /* R6298 */
+ 0x0000, /* R6299 */
+ 0x0000, /* R6300 */
+ 0x0000, /* R6301 */
+ 0x0000, /* R6302 */
+ 0x0000, /* R6303 */
+ 0x0000, /* R6304 */
+ 0x0000, /* R6305 */
+ 0x0000, /* R6306 */
+ 0x0000, /* R6307 */
+ 0x0000, /* R6308 */
+ 0x0000, /* R6309 */
+ 0x0000, /* R6310 */
+ 0x0000, /* R6311 */
+ 0x0000, /* R6312 */
+ 0x0000, /* R6313 */
+ 0x0000, /* R6314 */
+ 0x0000, /* R6315 */
+ 0x0000, /* R6316 */
+ 0x0000, /* R6317 */
+ 0x0000, /* R6318 */
+ 0x0000, /* R6319 */
+ 0x0000, /* R6320 */
+ 0x0000, /* R6321 */
+ 0x0000, /* R6322 */
+ 0x0000, /* R6323 */
+ 0x0000, /* R6324 */
+ 0x0000, /* R6325 */
+ 0x0000, /* R6326 */
+ 0x0000, /* R6327 */
+ 0x0000, /* R6328 */
+ 0x0000, /* R6329 */
+ 0x0000, /* R6330 */
+ 0x0000, /* R6331 */
+ 0x0000, /* R6332 */
+ 0x0000, /* R6333 */
+ 0x0000, /* R6334 */
+ 0x0000, /* R6335 */
+ 0x0000, /* R6336 */
+ 0x0000, /* R6337 */
+ 0x0000, /* R6338 */
+ 0x0000, /* R6339 */
+ 0x0000, /* R6340 */
+ 0x0000, /* R6341 */
+ 0x0000, /* R6342 */
+ 0x0000, /* R6343 */
+ 0x0000, /* R6344 */
+ 0x0000, /* R6345 */
+ 0x0000, /* R6346 */
+ 0x0000, /* R6347 */
+ 0x0000, /* R6348 */
+ 0x0000, /* R6349 */
+ 0x0000, /* R6350 */
+ 0x0000, /* R6351 */
+ 0x0000, /* R6352 */
+ 0x0000, /* R6353 */
+ 0x0000, /* R6354 */
+ 0x0000, /* R6355 */
+ 0x0000, /* R6356 */
+ 0x0000, /* R6357 */
+ 0x0000, /* R6358 */
+ 0x0000, /* R6359 */
+ 0x0000, /* R6360 */
+ 0x0000, /* R6361 */
+ 0x0000, /* R6362 */
+ 0x0000, /* R6363 */
+ 0x0000, /* R6364 */
+ 0x0000, /* R6365 */
+ 0x0000, /* R6366 */
+ 0x0000, /* R6367 */
+ 0x0000, /* R6368 */
+ 0x0000, /* R6369 */
+ 0x0000, /* R6370 */
+ 0x0000, /* R6371 */
+ 0x0000, /* R6372 */
+ 0x0000, /* R6373 */
+ 0x0000, /* R6374 */
+ 0x0000, /* R6375 */
+ 0x0000, /* R6376 */
+ 0x0000, /* R6377 */
+ 0x0000, /* R6378 */
+ 0x0000, /* R6379 */
+ 0x0000, /* R6380 */
+ 0x0000, /* R6381 */
+ 0x0000, /* R6382 */
+ 0x0000, /* R6383 */
+ 0x0000, /* R6384 */
+ 0x0000, /* R6385 */
+ 0x0000, /* R6386 */
+ 0x0000, /* R6387 */
+ 0x0000, /* R6388 */
+ 0x0000, /* R6389 */
+ 0x0000, /* R6390 */
+ 0x0000, /* R6391 */
+ 0x0000, /* R6392 */
+ 0x0000, /* R6393 */
+ 0x0000, /* R6394 */
+ 0x0000, /* R6395 */
+ 0x0000, /* R6396 */
+ 0x0000, /* R6397 */
+ 0x0000, /* R6398 */
+ 0x0000, /* R6399 */
+ 0x0000, /* R6400 */
+ 0x0000, /* R6401 */
+ 0x0000, /* R6402 */
+ 0x0000, /* R6403 */
+ 0x0000, /* R6404 */
+ 0x0000, /* R6405 */
+ 0x0000, /* R6406 */
+ 0x0000, /* R6407 */
+ 0x0000, /* R6408 */
+ 0x0000, /* R6409 */
+ 0x0000, /* R6410 */
+ 0x0000, /* R6411 */
+ 0x0000, /* R6412 */
+ 0x0000, /* R6413 */
+ 0x0000, /* R6414 */
+ 0x0000, /* R6415 */
+ 0x0000, /* R6416 */
+ 0x0000, /* R6417 */
+ 0x0000, /* R6418 */
+ 0x0000, /* R6419 */
+ 0x0000, /* R6420 */
+ 0x0000, /* R6421 */
+ 0x0000, /* R6422 */
+ 0x0000, /* R6423 */
+ 0x0000, /* R6424 */
+ 0x0000, /* R6425 */
+ 0x0000, /* R6426 */
+ 0x0000, /* R6427 */
+ 0x0000, /* R6428 */
+ 0x0000, /* R6429 */
+ 0x0000, /* R6430 */
+ 0x0000, /* R6431 */
+ 0x0000, /* R6432 */
+ 0x0000, /* R6433 */
+ 0x0000, /* R6434 */
+ 0x0000, /* R6435 */
+ 0x0000, /* R6436 */
+ 0x0000, /* R6437 */
+ 0x0000, /* R6438 */
+ 0x0000, /* R6439 */
+ 0x0000, /* R6440 */
+ 0x0000, /* R6441 */
+ 0x0000, /* R6442 */
+ 0x0000, /* R6443 */
+ 0x0000, /* R6444 */
+ 0x0000, /* R6445 */
+ 0x0000, /* R6446 */
+ 0x0000, /* R6447 */
+ 0x0000, /* R6448 */
+ 0x0000, /* R6449 */
+ 0x0000, /* R6450 */
+ 0x0000, /* R6451 */
+ 0x0000, /* R6452 */
+ 0x0000, /* R6453 */
+ 0x0000, /* R6454 */
+ 0x0000, /* R6455 */
+ 0x0000, /* R6456 */
+ 0x0000, /* R6457 */
+ 0x0000, /* R6458 */
+ 0x0000, /* R6459 */
+ 0x0000, /* R6460 */
+ 0x0000, /* R6461 */
+ 0x0000, /* R6462 */
+ 0x0000, /* R6463 */
+ 0x0000, /* R6464 */
+ 0x0000, /* R6465 */
+ 0x0000, /* R6466 */
+ 0x0000, /* R6467 */
+ 0x0000, /* R6468 */
+ 0x0000, /* R6469 */
+ 0x0000, /* R6470 */
+ 0x0000, /* R6471 */
+ 0x0000, /* R6472 */
+ 0x0000, /* R6473 */
+ 0x0000, /* R6474 */
+ 0x0000, /* R6475 */
+ 0x0000, /* R6476 */
+ 0x0000, /* R6477 */
+ 0x0000, /* R6478 */
+ 0x0000, /* R6479 */
+ 0x0000, /* R6480 */
+ 0x0000, /* R6481 */
+ 0x0000, /* R6482 */
+ 0x0000, /* R6483 */
+ 0x0000, /* R6484 */
+ 0x0000, /* R6485 */
+ 0x0000, /* R6486 */
+ 0x0000, /* R6487 */
+ 0x0000, /* R6488 */
+ 0x0000, /* R6489 */
+ 0x0000, /* R6490 */
+ 0x0000, /* R6491 */
+ 0x0000, /* R6492 */
+ 0x0000, /* R6493 */
+ 0x0000, /* R6494 */
+ 0x0000, /* R6495 */
+ 0x0000, /* R6496 */
+ 0x0000, /* R6497 */
+ 0x0000, /* R6498 */
+ 0x0000, /* R6499 */
+ 0x0000, /* R6500 */
+ 0x0000, /* R6501 */
+ 0x0000, /* R6502 */
+ 0x0000, /* R6503 */
+ 0x0000, /* R6504 */
+ 0x0000, /* R6505 */
+ 0x0000, /* R6506 */
+ 0x0000, /* R6507 */
+ 0x0000, /* R6508 */
+ 0x0000, /* R6509 */
+ 0x0000, /* R6510 */
+ 0x0000, /* R6511 */
+ 0x0000, /* R6512 */
+ 0x0000, /* R6513 */
+ 0x0000, /* R6514 */
+ 0x0000, /* R6515 */
+ 0x0000, /* R6516 */
+ 0x0000, /* R6517 */
+ 0x0000, /* R6518 */
+ 0x0000, /* R6519 */
+ 0x0000, /* R6520 */
+ 0x0000, /* R6521 */
+ 0x0000, /* R6522 */
+ 0x0000, /* R6523 */
+ 0x0000, /* R6524 */
+ 0x0000, /* R6525 */
+ 0x0000, /* R6526 */
+ 0x0000, /* R6527 */
+ 0x0000, /* R6528 */
+ 0x0000, /* R6529 */
+ 0x0000, /* R6530 */
+ 0x0000, /* R6531 */
+ 0x0000, /* R6532 */
+ 0x0000, /* R6533 */
+ 0x0000, /* R6534 */
+ 0x0000, /* R6535 */
+ 0x0000, /* R6536 */
+ 0x0000, /* R6537 */
+ 0x0000, /* R6538 */
+ 0x0000, /* R6539 */
+ 0x0000, /* R6540 */
+ 0x0000, /* R6541 */
+ 0x0000, /* R6542 */
+ 0x0000, /* R6543 */
+ 0x0000, /* R6544 */
+ 0x0000, /* R6545 */
+ 0x0000, /* R6546 */
+ 0x0000, /* R6547 */
+ 0x0000, /* R6548 */
+ 0x0000, /* R6549 */
+ 0x0000, /* R6550 */
+ 0x0000, /* R6551 */
+ 0x0000, /* R6552 */
+ 0x0000, /* R6553 */
+ 0x0000, /* R6554 */
+ 0x0000, /* R6555 */
+ 0x0000, /* R6556 */
+ 0x0000, /* R6557 */
+ 0x0000, /* R6558 */
+ 0x0000, /* R6559 */
+ 0x0000, /* R6560 */
+ 0x0000, /* R6561 */
+ 0x0000, /* R6562 */
+ 0x0000, /* R6563 */
+ 0x0000, /* R6564 */
+ 0x0000, /* R6565 */
+ 0x0000, /* R6566 */
+ 0x0000, /* R6567 */
+ 0x0000, /* R6568 */
+ 0x0000, /* R6569 */
+ 0x0000, /* R6570 */
+ 0x0000, /* R6571 */
+ 0x0000, /* R6572 */
+ 0x0000, /* R6573 */
+ 0x0000, /* R6574 */
+ 0x0000, /* R6575 */
+ 0x0000, /* R6576 */
+ 0x0000, /* R6577 */
+ 0x0000, /* R6578 */
+ 0x0000, /* R6579 */
+ 0x0000, /* R6580 */
+ 0x0000, /* R6581 */
+ 0x0000, /* R6582 */
+ 0x0000, /* R6583 */
+ 0x0000, /* R6584 */
+ 0x0000, /* R6585 */
+ 0x0000, /* R6586 */
+ 0x0000, /* R6587 */
+ 0x0000, /* R6588 */
+ 0x0000, /* R6589 */
+ 0x0000, /* R6590 */
+ 0x0000, /* R6591 */
+ 0x0000, /* R6592 */
+ 0x0000, /* R6593 */
+ 0x0000, /* R6594 */
+ 0x0000, /* R6595 */
+ 0x0000, /* R6596 */
+ 0x0000, /* R6597 */
+ 0x0000, /* R6598 */
+ 0x0000, /* R6599 */
+ 0x0000, /* R6600 */
+ 0x0000, /* R6601 */
+ 0x0000, /* R6602 */
+ 0x0000, /* R6603 */
+ 0x0000, /* R6604 */
+ 0x0000, /* R6605 */
+ 0x0000, /* R6606 */
+ 0x0000, /* R6607 */
+ 0x0000, /* R6608 */
+ 0x0000, /* R6609 */
+ 0x0000, /* R6610 */
+ 0x0000, /* R6611 */
+ 0x0000, /* R6612 */
+ 0x0000, /* R6613 */
+ 0x0000, /* R6614 */
+ 0x0000, /* R6615 */
+ 0x0000, /* R6616 */
+ 0x0000, /* R6617 */
+ 0x0000, /* R6618 */
+ 0x0000, /* R6619 */
+ 0x0000, /* R6620 */
+ 0x0000, /* R6621 */
+ 0x0000, /* R6622 */
+ 0x0000, /* R6623 */
+ 0x0000, /* R6624 */
+ 0x0000, /* R6625 */
+ 0x0000, /* R6626 */
+ 0x0000, /* R6627 */
+ 0x0000, /* R6628 */
+ 0x0000, /* R6629 */
+ 0x0000, /* R6630 */
+ 0x0000, /* R6631 */
+ 0x0000, /* R6632 */
+ 0x0000, /* R6633 */
+ 0x0000, /* R6634 */
+ 0x0000, /* R6635 */
+ 0x0000, /* R6636 */
+ 0x0000, /* R6637 */
+ 0x0000, /* R6638 */
+ 0x0000, /* R6639 */
+ 0x0000, /* R6640 */
+ 0x0000, /* R6641 */
+ 0x0000, /* R6642 */
+ 0x0000, /* R6643 */
+ 0x0000, /* R6644 */
+ 0x0000, /* R6645 */
+ 0x0000, /* R6646 */
+ 0x0000, /* R6647 */
+ 0x0000, /* R6648 */
+ 0x0000, /* R6649 */
+ 0x0000, /* R6650 */
+ 0x0000, /* R6651 */
+ 0x0000, /* R6652 */
+ 0x0000, /* R6653 */
+ 0x0000, /* R6654 */
+ 0x0000, /* R6655 */
+ 0x0000, /* R6656 */
+ 0x0000, /* R6657 */
+ 0x0000, /* R6658 */
+ 0x0000, /* R6659 */
+ 0x0000, /* R6660 */
+ 0x0000, /* R6661 */
+ 0x0000, /* R6662 */
+ 0x0000, /* R6663 */
+ 0x0000, /* R6664 */
+ 0x0000, /* R6665 */
+ 0x0000, /* R6666 */
+ 0x0000, /* R6667 */
+ 0x0000, /* R6668 */
+ 0x0000, /* R6669 */
+ 0x0000, /* R6670 */
+ 0x0000, /* R6671 */
+ 0x0000, /* R6672 */
+ 0x0000, /* R6673 */
+ 0x0000, /* R6674 */
+ 0x0000, /* R6675 */
+ 0x0000, /* R6676 */
+ 0x0000, /* R6677 */
+ 0x0000, /* R6678 */
+ 0x0000, /* R6679 */
+ 0x0000, /* R6680 */
+ 0x0000, /* R6681 */
+ 0x0000, /* R6682 */
+ 0x0000, /* R6683 */
+ 0x0000, /* R6684 */
+ 0x0000, /* R6685 */
+ 0x0000, /* R6686 */
+ 0x0000, /* R6687 */
+ 0x0000, /* R6688 */
+ 0x0000, /* R6689 */
+ 0x0000, /* R6690 */
+ 0x0000, /* R6691 */
+ 0x0000, /* R6692 */
+ 0x0000, /* R6693 */
+ 0x0000, /* R6694 */
+ 0x0000, /* R6695 */
+ 0x0000, /* R6696 */
+ 0x0000, /* R6697 */
+ 0x0000, /* R6698 */
+ 0x0000, /* R6699 */
+ 0x0000, /* R6700 */
+ 0x0000, /* R6701 */
+ 0x0000, /* R6702 */
+ 0x0000, /* R6703 */
+ 0x0000, /* R6704 */
+ 0x0000, /* R6705 */
+ 0x0000, /* R6706 */
+ 0x0000, /* R6707 */
+ 0x0000, /* R6708 */
+ 0x0000, /* R6709 */
+ 0x0000, /* R6710 */
+ 0x0000, /* R6711 */
+ 0x0000, /* R6712 */
+ 0x0000, /* R6713 */
+ 0x0000, /* R6714 */
+ 0x0000, /* R6715 */
+ 0x0000, /* R6716 */
+ 0x0000, /* R6717 */
+ 0x0000, /* R6718 */
+ 0x0000, /* R6719 */
+ 0x0000, /* R6720 */
+ 0x0000, /* R6721 */
+ 0x0000, /* R6722 */
+ 0x0000, /* R6723 */
+ 0x0000, /* R6724 */
+ 0x0000, /* R6725 */
+ 0x0000, /* R6726 */
+ 0x0000, /* R6727 */
+ 0x0000, /* R6728 */
+ 0x0000, /* R6729 */
+ 0x0000, /* R6730 */
+ 0x0000, /* R6731 */
+ 0x0000, /* R6732 */
+ 0x0000, /* R6733 */
+ 0x0000, /* R6734 */
+ 0x0000, /* R6735 */
+ 0x0000, /* R6736 */
+ 0x0000, /* R6737 */
+ 0x0000, /* R6738 */
+ 0x0000, /* R6739 */
+ 0x0000, /* R6740 */
+ 0x0000, /* R6741 */
+ 0x0000, /* R6742 */
+ 0x0000, /* R6743 */
+ 0x0000, /* R6744 */
+ 0x0000, /* R6745 */
+ 0x0000, /* R6746 */
+ 0x0000, /* R6747 */
+ 0x0000, /* R6748 */
+ 0x0000, /* R6749 */
+ 0x0000, /* R6750 */
+ 0x0000, /* R6751 */
+ 0x0000, /* R6752 */
+ 0x0000, /* R6753 */
+ 0x0000, /* R6754 */
+ 0x0000, /* R6755 */
+ 0x0000, /* R6756 */
+ 0x0000, /* R6757 */
+ 0x0000, /* R6758 */
+ 0x0000, /* R6759 */
+ 0x0000, /* R6760 */
+ 0x0000, /* R6761 */
+ 0x0000, /* R6762 */
+ 0x0000, /* R6763 */
+ 0x0000, /* R6764 */
+ 0x0000, /* R6765 */
+ 0x0000, /* R6766 */
+ 0x0000, /* R6767 */
+ 0x0000, /* R6768 */
+ 0x0000, /* R6769 */
+ 0x0000, /* R6770 */
+ 0x0000, /* R6771 */
+ 0x0000, /* R6772 */
+ 0x0000, /* R6773 */
+ 0x0000, /* R6774 */
+ 0x0000, /* R6775 */
+ 0x0000, /* R6776 */
+ 0x0000, /* R6777 */
+ 0x0000, /* R6778 */
+ 0x0000, /* R6779 */
+ 0x0000, /* R6780 */
+ 0x0000, /* R6781 */
+ 0x0000, /* R6782 */
+ 0x0000, /* R6783 */
+ 0x0000, /* R6784 */
+ 0x0000, /* R6785 */
+ 0x0000, /* R6786 */
+ 0x0000, /* R6787 */
+ 0x0000, /* R6788 */
+ 0x0000, /* R6789 */
+ 0x0000, /* R6790 */
+ 0x0000, /* R6791 */
+ 0x0000, /* R6792 */
+ 0x0000, /* R6793 */
+ 0x0000, /* R6794 */
+ 0x0000, /* R6795 */
+ 0x0000, /* R6796 */
+ 0x0000, /* R6797 */
+ 0x0000, /* R6798 */
+ 0x0000, /* R6799 */
+ 0x0000, /* R6800 */
+ 0x0000, /* R6801 */
+ 0x0000, /* R6802 */
+ 0x0000, /* R6803 */
+ 0x0000, /* R6804 */
+ 0x0000, /* R6805 */
+ 0x0000, /* R6806 */
+ 0x0000, /* R6807 */
+ 0x0000, /* R6808 */
+ 0x0000, /* R6809 */
+ 0x0000, /* R6810 */
+ 0x0000, /* R6811 */
+ 0x0000, /* R6812 */
+ 0x0000, /* R6813 */
+ 0x0000, /* R6814 */
+ 0x0000, /* R6815 */
+ 0x0000, /* R6816 */
+ 0x0000, /* R6817 */
+ 0x0000, /* R6818 */
+ 0x0000, /* R6819 */
+ 0x0000, /* R6820 */
+ 0x0000, /* R6821 */
+ 0x0000, /* R6822 */
+ 0x0000, /* R6823 */
+ 0x0000, /* R6824 */
+ 0x0000, /* R6825 */
+ 0x0000, /* R6826 */
+ 0x0000, /* R6827 */
+ 0x0000, /* R6828 */
+ 0x0000, /* R6829 */
+ 0x0000, /* R6830 */
+ 0x0000, /* R6831 */
+ 0x0000, /* R6832 */
+ 0x0000, /* R6833 */
+ 0x0000, /* R6834 */
+ 0x0000, /* R6835 */
+ 0x0000, /* R6836 */
+ 0x0000, /* R6837 */
+ 0x0000, /* R6838 */
+ 0x0000, /* R6839 */
+ 0x0000, /* R6840 */
+ 0x0000, /* R6841 */
+ 0x0000, /* R6842 */
+ 0x0000, /* R6843 */
+ 0x0000, /* R6844 */
+ 0x0000, /* R6845 */
+ 0x0000, /* R6846 */
+ 0x0000, /* R6847 */
+ 0x0000, /* R6848 */
+ 0x0000, /* R6849 */
+ 0x0000, /* R6850 */
+ 0x0000, /* R6851 */
+ 0x0000, /* R6852 */
+ 0x0000, /* R6853 */
+ 0x0000, /* R6854 */
+ 0x0000, /* R6855 */
+ 0x0000, /* R6856 */
+ 0x0000, /* R6857 */
+ 0x0000, /* R6858 */
+ 0x0000, /* R6859 */
+ 0x0000, /* R6860 */
+ 0x0000, /* R6861 */
+ 0x0000, /* R6862 */
+ 0x0000, /* R6863 */
+ 0x0000, /* R6864 */
+ 0x0000, /* R6865 */
+ 0x0000, /* R6866 */
+ 0x0000, /* R6867 */
+ 0x0000, /* R6868 */
+ 0x0000, /* R6869 */
+ 0x0000, /* R6870 */
+ 0x0000, /* R6871 */
+ 0x0000, /* R6872 */
+ 0x0000, /* R6873 */
+ 0x0000, /* R6874 */
+ 0x0000, /* R6875 */
+ 0x0000, /* R6876 */
+ 0x0000, /* R6877 */
+ 0x0000, /* R6878 */
+ 0x0000, /* R6879 */
+ 0x0000, /* R6880 */
+ 0x0000, /* R6881 */
+ 0x0000, /* R6882 */
+ 0x0000, /* R6883 */
+ 0x0000, /* R6884 */
+ 0x0000, /* R6885 */
+ 0x0000, /* R6886 */
+ 0x0000, /* R6887 */
+ 0x0000, /* R6888 */
+ 0x0000, /* R6889 */
+ 0x0000, /* R6890 */
+ 0x0000, /* R6891 */
+ 0x0000, /* R6892 */
+ 0x0000, /* R6893 */
+ 0x0000, /* R6894 */
+ 0x0000, /* R6895 */
+ 0x0000, /* R6896 */
+ 0x0000, /* R6897 */
+ 0x0000, /* R6898 */
+ 0x0000, /* R6899 */
+ 0x0000, /* R6900 */
+ 0x0000, /* R6901 */
+ 0x0000, /* R6902 */
+ 0x0000, /* R6903 */
+ 0x0000, /* R6904 */
+ 0x0000, /* R6905 */
+ 0x0000, /* R6906 */
+ 0x0000, /* R6907 */
+ 0x0000, /* R6908 */
+ 0x0000, /* R6909 */
+ 0x0000, /* R6910 */
+ 0x0000, /* R6911 */
+ 0x0000, /* R6912 */
+ 0x0000, /* R6913 */
+ 0x0000, /* R6914 */
+ 0x0000, /* R6915 */
+ 0x0000, /* R6916 */
+ 0x0000, /* R6917 */
+ 0x0000, /* R6918 */
+ 0x0000, /* R6919 */
+ 0x0000, /* R6920 */
+ 0x0000, /* R6921 */
+ 0x0000, /* R6922 */
+ 0x0000, /* R6923 */
+ 0x0000, /* R6924 */
+ 0x0000, /* R6925 */
+ 0x0000, /* R6926 */
+ 0x0000, /* R6927 */
+ 0x0000, /* R6928 */
+ 0x0000, /* R6929 */
+ 0x0000, /* R6930 */
+ 0x0000, /* R6931 */
+ 0x0000, /* R6932 */
+ 0x0000, /* R6933 */
+ 0x0000, /* R6934 */
+ 0x0000, /* R6935 */
+ 0x0000, /* R6936 */
+ 0x0000, /* R6937 */
+ 0x0000, /* R6938 */
+ 0x0000, /* R6939 */
+ 0x0000, /* R6940 */
+ 0x0000, /* R6941 */
+ 0x0000, /* R6942 */
+ 0x0000, /* R6943 */
+ 0x0000, /* R6944 */
+ 0x0000, /* R6945 */
+ 0x0000, /* R6946 */
+ 0x0000, /* R6947 */
+ 0x0000, /* R6948 */
+ 0x0000, /* R6949 */
+ 0x0000, /* R6950 */
+ 0x0000, /* R6951 */
+ 0x0000, /* R6952 */
+ 0x0000, /* R6953 */
+ 0x0000, /* R6954 */
+ 0x0000, /* R6955 */
+ 0x0000, /* R6956 */
+ 0x0000, /* R6957 */
+ 0x0000, /* R6958 */
+ 0x0000, /* R6959 */
+ 0x0000, /* R6960 */
+ 0x0000, /* R6961 */
+ 0x0000, /* R6962 */
+ 0x0000, /* R6963 */
+ 0x0000, /* R6964 */
+ 0x0000, /* R6965 */
+ 0x0000, /* R6966 */
+ 0x0000, /* R6967 */
+ 0x0000, /* R6968 */
+ 0x0000, /* R6969 */
+ 0x0000, /* R6970 */
+ 0x0000, /* R6971 */
+ 0x0000, /* R6972 */
+ 0x0000, /* R6973 */
+ 0x0000, /* R6974 */
+ 0x0000, /* R6975 */
+ 0x0000, /* R6976 */
+ 0x0000, /* R6977 */
+ 0x0000, /* R6978 */
+ 0x0000, /* R6979 */
+ 0x0000, /* R6980 */
+ 0x0000, /* R6981 */
+ 0x0000, /* R6982 */
+ 0x0000, /* R6983 */
+ 0x0000, /* R6984 */
+ 0x0000, /* R6985 */
+ 0x0000, /* R6986 */
+ 0x0000, /* R6987 */
+ 0x0000, /* R6988 */
+ 0x0000, /* R6989 */
+ 0x0000, /* R6990 */
+ 0x0000, /* R6991 */
+ 0x0000, /* R6992 */
+ 0x0000, /* R6993 */
+ 0x0000, /* R6994 */
+ 0x0000, /* R6995 */
+ 0x0000, /* R6996 */
+ 0x0000, /* R6997 */
+ 0x0000, /* R6998 */
+ 0x0000, /* R6999 */
+ 0x0000, /* R7000 */
+ 0x0000, /* R7001 */
+ 0x0000, /* R7002 */
+ 0x0000, /* R7003 */
+ 0x0000, /* R7004 */
+ 0x0000, /* R7005 */
+ 0x0000, /* R7006 */
+ 0x0000, /* R7007 */
+ 0x0000, /* R7008 */
+ 0x0000, /* R7009 */
+ 0x0000, /* R7010 */
+ 0x0000, /* R7011 */
+ 0x0000, /* R7012 */
+ 0x0000, /* R7013 */
+ 0x0000, /* R7014 */
+ 0x0000, /* R7015 */
+ 0x0000, /* R7016 */
+ 0x0000, /* R7017 */
+ 0x0000, /* R7018 */
+ 0x0000, /* R7019 */
+ 0x0000, /* R7020 */
+ 0x0000, /* R7021 */
+ 0x0000, /* R7022 */
+ 0x0000, /* R7023 */
+ 0x0000, /* R7024 */
+ 0x0000, /* R7025 */
+ 0x0000, /* R7026 */
+ 0x0000, /* R7027 */
+ 0x0000, /* R7028 */
+ 0x0000, /* R7029 */
+ 0x0000, /* R7030 */
+ 0x0000, /* R7031 */
+ 0x0000, /* R7032 */
+ 0x0000, /* R7033 */
+ 0x0000, /* R7034 */
+ 0x0000, /* R7035 */
+ 0x0000, /* R7036 */
+ 0x0000, /* R7037 */
+ 0x0000, /* R7038 */
+ 0x0000, /* R7039 */
+ 0x0000, /* R7040 */
+ 0x0000, /* R7041 */
+ 0x0000, /* R7042 */
+ 0x0000, /* R7043 */
+ 0x0000, /* R7044 */
+ 0x0000, /* R7045 */
+ 0x0000, /* R7046 */
+ 0x0000, /* R7047 */
+ 0x0000, /* R7048 */
+ 0x0000, /* R7049 */
+ 0x0000, /* R7050 */
+ 0x0000, /* R7051 */
+ 0x0000, /* R7052 */
+ 0x0000, /* R7053 */
+ 0x0000, /* R7054 */
+ 0x0000, /* R7055 */
+ 0x0000, /* R7056 */
+ 0x0000, /* R7057 */
+ 0x0000, /* R7058 */
+ 0x0000, /* R7059 */
+ 0x0000, /* R7060 */
+ 0x0000, /* R7061 */
+ 0x0000, /* R7062 */
+ 0x0000, /* R7063 */
+ 0x0000, /* R7064 */
+ 0x0000, /* R7065 */
+ 0x0000, /* R7066 */
+ 0x0000, /* R7067 */
+ 0x0000, /* R7068 */
+ 0x0000, /* R7069 */
+ 0x0000, /* R7070 */
+ 0x0000, /* R7071 */
+ 0x0000, /* R7072 */
+ 0x0000, /* R7073 */
+ 0x0000, /* R7074 */
+ 0x0000, /* R7075 */
+ 0x0000, /* R7076 */
+ 0x0000, /* R7077 */
+ 0x0000, /* R7078 */
+ 0x0000, /* R7079 */
+ 0x0000, /* R7080 */
+ 0x0000, /* R7081 */
+ 0x0000, /* R7082 */
+ 0x0000, /* R7083 */
+ 0x0000, /* R7084 */
+ 0x0000, /* R7085 */
+ 0x0000, /* R7086 */
+ 0x0000, /* R7087 */
+ 0x0000, /* R7088 */
+ 0x0000, /* R7089 */
+ 0x0000, /* R7090 */
+ 0x0000, /* R7091 */
+ 0x0000, /* R7092 */
+ 0x0000, /* R7093 */
+ 0x0000, /* R7094 */
+ 0x0000, /* R7095 */
+ 0x0000, /* R7096 */
+ 0x0000, /* R7097 */
+ 0x0000, /* R7098 */
+ 0x0000, /* R7099 */
+ 0x0000, /* R7100 */
+ 0x0000, /* R7101 */
+ 0x0000, /* R7102 */
+ 0x0000, /* R7103 */
+ 0x0000, /* R7104 */
+ 0x0000, /* R7105 */
+ 0x0000, /* R7106 */
+ 0x0000, /* R7107 */
+ 0x0000, /* R7108 */
+ 0x0000, /* R7109 */
+ 0x0000, /* R7110 */
+ 0x0000, /* R7111 */
+ 0x0000, /* R7112 */
+ 0x0000, /* R7113 */
+ 0x0000, /* R7114 */
+ 0x0000, /* R7115 */
+ 0x0000, /* R7116 */
+ 0x0000, /* R7117 */
+ 0x0000, /* R7118 */
+ 0x0000, /* R7119 */
+ 0x0000, /* R7120 */
+ 0x0000, /* R7121 */
+ 0x0000, /* R7122 */
+ 0x0000, /* R7123 */
+ 0x0000, /* R7124 */
+ 0x0000, /* R7125 */
+ 0x0000, /* R7126 */
+ 0x0000, /* R7127 */
+ 0x0000, /* R7128 */
+ 0x0000, /* R7129 */
+ 0x0000, /* R7130 */
+ 0x0000, /* R7131 */
+ 0x0000, /* R7132 */
+ 0x0000, /* R7133 */
+ 0x0000, /* R7134 */
+ 0x0000, /* R7135 */
+ 0x0000, /* R7136 */
+ 0x0000, /* R7137 */
+ 0x0000, /* R7138 */
+ 0x0000, /* R7139 */
+ 0x0000, /* R7140 */
+ 0x0000, /* R7141 */
+ 0x0000, /* R7142 */
+ 0x0000, /* R7143 */
+ 0x0000, /* R7144 */
+ 0x0000, /* R7145 */
+ 0x0000, /* R7146 */
+ 0x0000, /* R7147 */
+ 0x0000, /* R7148 */
+ 0x0000, /* R7149 */
+ 0x0000, /* R7150 */
+ 0x0000, /* R7151 */
+ 0x0000, /* R7152 */
+ 0x0000, /* R7153 */
+ 0x0000, /* R7154 */
+ 0x0000, /* R7155 */
+ 0x0000, /* R7156 */
+ 0x0000, /* R7157 */
+ 0x0000, /* R7158 */
+ 0x0000, /* R7159 */
+ 0x0000, /* R7160 */
+ 0x0000, /* R7161 */
+ 0x0000, /* R7162 */
+ 0x0000, /* R7163 */
+ 0x0000, /* R7164 */
+ 0x0000, /* R7165 */
+ 0x0000, /* R7166 */
+ 0x0000, /* R7167 */
+ 0x0000, /* R7168 */
+ 0x0000, /* R7169 */
+ 0x0000, /* R7170 */
+ 0x0000, /* R7171 */
+ 0x0000, /* R7172 */
+ 0x0000, /* R7173 */
+ 0x0000, /* R7174 */
+ 0x0000, /* R7175 */
+ 0x0000, /* R7176 */
+ 0x0000, /* R7177 */
+ 0x0000, /* R7178 */
+ 0x0000, /* R7179 */
+ 0x0000, /* R7180 */
+ 0x0000, /* R7181 */
+ 0x0000, /* R7182 */
+ 0x0000, /* R7183 */
+ 0x0000, /* R7184 */
+ 0x0000, /* R7185 */
+ 0x0000, /* R7186 */
+ 0x0000, /* R7187 */
+ 0x0000, /* R7188 */
+ 0x0000, /* R7189 */
+ 0x0000, /* R7190 */
+ 0x0000, /* R7191 */
+ 0x0000, /* R7192 */
+ 0x0000, /* R7193 */
+ 0x0000, /* R7194 */
+ 0x0000, /* R7195 */
+ 0x0000, /* R7196 */
+ 0x0000, /* R7197 */
+ 0x0000, /* R7198 */
+ 0x0000, /* R7199 */
+ 0x0000, /* R7200 */
+ 0x0000, /* R7201 */
+ 0x0000, /* R7202 */
+ 0x0000, /* R7203 */
+ 0x0000, /* R7204 */
+ 0x0000, /* R7205 */
+ 0x0000, /* R7206 */
+ 0x0000, /* R7207 */
+ 0x0000, /* R7208 */
+ 0x0000, /* R7209 */
+ 0x0000, /* R7210 */
+ 0x0000, /* R7211 */
+ 0x0000, /* R7212 */
+ 0x0000, /* R7213 */
+ 0x0000, /* R7214 */
+ 0x0000, /* R7215 */
+ 0x0000, /* R7216 */
+ 0x0000, /* R7217 */
+ 0x0000, /* R7218 */
+ 0x0000, /* R7219 */
+ 0x0000, /* R7220 */
+ 0x0000, /* R7221 */
+ 0x0000, /* R7222 */
+ 0x0000, /* R7223 */
+ 0x0000, /* R7224 */
+ 0x0000, /* R7225 */
+ 0x0000, /* R7226 */
+ 0x0000, /* R7227 */
+ 0x0000, /* R7228 */
+ 0x0000, /* R7229 */
+ 0x0000, /* R7230 */
+ 0x0000, /* R7231 */
+ 0x0000, /* R7232 */
+ 0x0000, /* R7233 */
+ 0x0000, /* R7234 */
+ 0x0000, /* R7235 */
+ 0x0000, /* R7236 */
+ 0x0000, /* R7237 */
+ 0x0000, /* R7238 */
+ 0x0000, /* R7239 */
+ 0x0000, /* R7240 */
+ 0x0000, /* R7241 */
+ 0x0000, /* R7242 */
+ 0x0000, /* R7243 */
+ 0x0000, /* R7244 */
+ 0x0000, /* R7245 */
+ 0x0000, /* R7246 */
+ 0x0000, /* R7247 */
+ 0x0000, /* R7248 */
+ 0x0000, /* R7249 */
+ 0x0000, /* R7250 */
+ 0x0000, /* R7251 */
+ 0x0000, /* R7252 */
+ 0x0000, /* R7253 */
+ 0x0000, /* R7254 */
+ 0x0000, /* R7255 */
+ 0x0000, /* R7256 */
+ 0x0000, /* R7257 */
+ 0x0000, /* R7258 */
+ 0x0000, /* R7259 */
+ 0x0000, /* R7260 */
+ 0x0000, /* R7261 */
+ 0x0000, /* R7262 */
+ 0x0000, /* R7263 */
+ 0x0000, /* R7264 */
+ 0x0000, /* R7265 */
+ 0x0000, /* R7266 */
+ 0x0000, /* R7267 */
+ 0x0000, /* R7268 */
+ 0x0000, /* R7269 */
+ 0x0000, /* R7270 */
+ 0x0000, /* R7271 */
+ 0x0000, /* R7272 */
+ 0x0000, /* R7273 */
+ 0x0000, /* R7274 */
+ 0x0000, /* R7275 */
+ 0x0000, /* R7276 */
+ 0x0000, /* R7277 */
+ 0x0000, /* R7278 */
+ 0x0000, /* R7279 */
+ 0x0000, /* R7280 */
+ 0x0000, /* R7281 */
+ 0x0000, /* R7282 */
+ 0x0000, /* R7283 */
+ 0x0000, /* R7284 */
+ 0x0000, /* R7285 */
+ 0x0000, /* R7286 */
+ 0x0000, /* R7287 */
+ 0x0000, /* R7288 */
+ 0x0000, /* R7289 */
+ 0x0000, /* R7290 */
+ 0x0000, /* R7291 */
+ 0x0000, /* R7292 */
+ 0x0000, /* R7293 */
+ 0x0000, /* R7294 */
+ 0x0000, /* R7295 */
+ 0x0000, /* R7296 */
+ 0x0000, /* R7297 */
+ 0x0000, /* R7298 */
+ 0x0000, /* R7299 */
+ 0x0000, /* R7300 */
+ 0x0000, /* R7301 */
+ 0x0000, /* R7302 */
+ 0x0000, /* R7303 */
+ 0x0000, /* R7304 */
+ 0x0000, /* R7305 */
+ 0x0000, /* R7306 */
+ 0x0000, /* R7307 */
+ 0x0000, /* R7308 */
+ 0x0000, /* R7309 */
+ 0x0000, /* R7310 */
+ 0x0000, /* R7311 */
+ 0x0000, /* R7312 */
+ 0x0000, /* R7313 */
+ 0x0000, /* R7314 */
+ 0x0000, /* R7315 */
+ 0x0000, /* R7316 */
+ 0x0000, /* R7317 */
+ 0x0000, /* R7318 */
+ 0x0000, /* R7319 */
+ 0x0000, /* R7320 */
+ 0x0000, /* R7321 */
+ 0x0000, /* R7322 */
+ 0x0000, /* R7323 */
+ 0x0000, /* R7324 */
+ 0x0000, /* R7325 */
+ 0x0000, /* R7326 */
+ 0x0000, /* R7327 */
+ 0x0000, /* R7328 */
+ 0x0000, /* R7329 */
+ 0x0000, /* R7330 */
+ 0x0000, /* R7331 */
+ 0x0000, /* R7332 */
+ 0x0000, /* R7333 */
+ 0x0000, /* R7334 */
+ 0x0000, /* R7335 */
+ 0x0000, /* R7336 */
+ 0x0000, /* R7337 */
+ 0x0000, /* R7338 */
+ 0x0000, /* R7339 */
+ 0x0000, /* R7340 */
+ 0x0000, /* R7341 */
+ 0x0000, /* R7342 */
+ 0x0000, /* R7343 */
+ 0x0000, /* R7344 */
+ 0x0000, /* R7345 */
+ 0x0000, /* R7346 */
+ 0x0000, /* R7347 */
+ 0x0000, /* R7348 */
+ 0x0000, /* R7349 */
+ 0x0000, /* R7350 */
+ 0x0000, /* R7351 */
+ 0x0000, /* R7352 */
+ 0x0000, /* R7353 */
+ 0x0000, /* R7354 */
+ 0x0000, /* R7355 */
+ 0x0000, /* R7356 */
+ 0x0000, /* R7357 */
+ 0x0000, /* R7358 */
+ 0x0000, /* R7359 */
+ 0x0000, /* R7360 */
+ 0x0000, /* R7361 */
+ 0x0000, /* R7362 */
+ 0x0000, /* R7363 */
+ 0x0000, /* R7364 */
+ 0x0000, /* R7365 */
+ 0x0000, /* R7366 */
+ 0x0000, /* R7367 */
+ 0x0000, /* R7368 */
+ 0x0000, /* R7369 */
+ 0x0000, /* R7370 */
+ 0x0000, /* R7371 */
+ 0x0000, /* R7372 */
+ 0x0000, /* R7373 */
+ 0x0000, /* R7374 */
+ 0x0000, /* R7375 */
+ 0x0000, /* R7376 */
+ 0x0000, /* R7377 */
+ 0x0000, /* R7378 */
+ 0x0000, /* R7379 */
+ 0x0000, /* R7380 */
+ 0x0000, /* R7381 */
+ 0x0000, /* R7382 */
+ 0x0000, /* R7383 */
+ 0x0000, /* R7384 */
+ 0x0000, /* R7385 */
+ 0x0000, /* R7386 */
+ 0x0000, /* R7387 */
+ 0x0000, /* R7388 */
+ 0x0000, /* R7389 */
+ 0x0000, /* R7390 */
+ 0x0000, /* R7391 */
+ 0x0000, /* R7392 */
+ 0x0000, /* R7393 */
+ 0x0000, /* R7394 */
+ 0x0000, /* R7395 */
+ 0x0000, /* R7396 */
+ 0x0000, /* R7397 */
+ 0x0000, /* R7398 */
+ 0x0000, /* R7399 */
+ 0x0000, /* R7400 */
+ 0x0000, /* R7401 */
+ 0x0000, /* R7402 */
+ 0x0000, /* R7403 */
+ 0x0000, /* R7404 */
+ 0x0000, /* R7405 */
+ 0x0000, /* R7406 */
+ 0x0000, /* R7407 */
+ 0x0000, /* R7408 */
+ 0x0000, /* R7409 */
+ 0x0000, /* R7410 */
+ 0x0000, /* R7411 */
+ 0x0000, /* R7412 */
+ 0x0000, /* R7413 */
+ 0x0000, /* R7414 */
+ 0x0000, /* R7415 */
+ 0x0000, /* R7416 */
+ 0x0000, /* R7417 */
+ 0x0000, /* R7418 */
+ 0x0000, /* R7419 */
+ 0x0000, /* R7420 */
+ 0x0000, /* R7421 */
+ 0x0000, /* R7422 */
+ 0x0000, /* R7423 */
+ 0x0000, /* R7424 */
+ 0x0000, /* R7425 */
+ 0x0000, /* R7426 */
+ 0x0000, /* R7427 */
+ 0x0000, /* R7428 */
+ 0x0000, /* R7429 */
+ 0x0000, /* R7430 */
+ 0x0000, /* R7431 */
+ 0x0000, /* R7432 */
+ 0x0000, /* R7433 */
+ 0x0000, /* R7434 */
+ 0x0000, /* R7435 */
+ 0x0000, /* R7436 */
+ 0x0000, /* R7437 */
+ 0x0000, /* R7438 */
+ 0x0000, /* R7439 */
+ 0x0000, /* R7440 */
+ 0x0000, /* R7441 */
+ 0x0000, /* R7442 */
+ 0x0000, /* R7443 */
+ 0x0000, /* R7444 */
+ 0x0000, /* R7445 */
+ 0x0000, /* R7446 */
+ 0x0000, /* R7447 */
+ 0x0000, /* R7448 */
+ 0x0000, /* R7449 */
+ 0x0000, /* R7450 */
+ 0x0000, /* R7451 */
+ 0x0000, /* R7452 */
+ 0x0000, /* R7453 */
+ 0x0000, /* R7454 */
+ 0x0000, /* R7455 */
+ 0x0000, /* R7456 */
+ 0x0000, /* R7457 */
+ 0x0000, /* R7458 */
+ 0x0000, /* R7459 */
+ 0x0000, /* R7460 */
+ 0x0000, /* R7461 */
+ 0x0000, /* R7462 */
+ 0x0000, /* R7463 */
+ 0x0000, /* R7464 */
+ 0x0000, /* R7465 */
+ 0x0000, /* R7466 */
+ 0x0000, /* R7467 */
+ 0x0000, /* R7468 */
+ 0x0000, /* R7469 */
+ 0x0000, /* R7470 */
+ 0x0000, /* R7471 */
+ 0x0000, /* R7472 */
+ 0x0000, /* R7473 */
+ 0x0000, /* R7474 */
+ 0x0000, /* R7475 */
+ 0x0000, /* R7476 */
+ 0x0000, /* R7477 */
+ 0x0000, /* R7478 */
+ 0x0000, /* R7479 */
+ 0x0000, /* R7480 */
+ 0x0000, /* R7481 */
+ 0x0000, /* R7482 */
+ 0x0000, /* R7483 */
+ 0x0000, /* R7484 */
+ 0x0000, /* R7485 */
+ 0x0000, /* R7486 */
+ 0x0000, /* R7487 */
+ 0x0000, /* R7488 */
+ 0x0000, /* R7489 */
+ 0x0000, /* R7490 */
+ 0x0000, /* R7491 */
+ 0x0000, /* R7492 */
+ 0x0000, /* R7493 */
+ 0x0000, /* R7494 */
+ 0x0000, /* R7495 */
+ 0x0000, /* R7496 */
+ 0x0000, /* R7497 */
+ 0x0000, /* R7498 */
+ 0x0000, /* R7499 */
+ 0x0000, /* R7500 */
+ 0x0000, /* R7501 */
+ 0x0000, /* R7502 */
+ 0x0000, /* R7503 */
+ 0x0000, /* R7504 */
+ 0x0000, /* R7505 */
+ 0x0000, /* R7506 */
+ 0x0000, /* R7507 */
+ 0x0000, /* R7508 */
+ 0x0000, /* R7509 */
+ 0x0000, /* R7510 */
+ 0x0000, /* R7511 */
+ 0x0000, /* R7512 */
+ 0x0000, /* R7513 */
+ 0x0000, /* R7514 */
+ 0x0000, /* R7515 */
+ 0x0000, /* R7516 */
+ 0x0000, /* R7517 */
+ 0x0000, /* R7518 */
+ 0x0000, /* R7519 */
+ 0x0000, /* R7520 */
+ 0x0000, /* R7521 */
+ 0x0000, /* R7522 */
+ 0x0000, /* R7523 */
+ 0x0000, /* R7524 */
+ 0x0000, /* R7525 */
+ 0x0000, /* R7526 */
+ 0x0000, /* R7527 */
+ 0x0000, /* R7528 */
+ 0x0000, /* R7529 */
+ 0x0000, /* R7530 */
+ 0x0000, /* R7531 */
+ 0x0000, /* R7532 */
+ 0x0000, /* R7533 */
+ 0x0000, /* R7534 */
+ 0x0000, /* R7535 */
+ 0x0000, /* R7536 */
+ 0x0000, /* R7537 */
+ 0x0000, /* R7538 */
+ 0x0000, /* R7539 */
+ 0x0000, /* R7540 */
+ 0x0000, /* R7541 */
+ 0x0000, /* R7542 */
+ 0x0000, /* R7543 */
+ 0x0000, /* R7544 */
+ 0x0000, /* R7545 */
+ 0x0000, /* R7546 */
+ 0x0000, /* R7547 */
+ 0x0000, /* R7548 */
+ 0x0000, /* R7549 */
+ 0x0000, /* R7550 */
+ 0x0000, /* R7551 */
+ 0x0000, /* R7552 */
+ 0x0000, /* R7553 */
+ 0x0000, /* R7554 */
+ 0x0000, /* R7555 */
+ 0x0000, /* R7556 */
+ 0x0000, /* R7557 */
+ 0x0000, /* R7558 */
+ 0x0000, /* R7559 */
+ 0x0000, /* R7560 */
+ 0x0000, /* R7561 */
+ 0x0000, /* R7562 */
+ 0x0000, /* R7563 */
+ 0x0000, /* R7564 */
+ 0x0000, /* R7565 */
+ 0x0000, /* R7566 */
+ 0x0000, /* R7567 */
+ 0x0000, /* R7568 */
+ 0x0000, /* R7569 */
+ 0x0000, /* R7570 */
+ 0x0000, /* R7571 */
+ 0x0000, /* R7572 */
+ 0x0000, /* R7573 */
+ 0x0000, /* R7574 */
+ 0x0000, /* R7575 */
+ 0x0000, /* R7576 */
+ 0x0000, /* R7577 */
+ 0x0000, /* R7578 */
+ 0x0000, /* R7579 */
+ 0x0000, /* R7580 */
+ 0x0000, /* R7581 */
+ 0x0000, /* R7582 */
+ 0x0000, /* R7583 */
+ 0x0000, /* R7584 */
+ 0x0000, /* R7585 */
+ 0x0000, /* R7586 */
+ 0x0000, /* R7587 */
+ 0x0000, /* R7588 */
+ 0x0000, /* R7589 */
+ 0x0000, /* R7590 */
+ 0x0000, /* R7591 */
+ 0x0000, /* R7592 */
+ 0x0000, /* R7593 */
+ 0x0000, /* R7594 */
+ 0x0000, /* R7595 */
+ 0x0000, /* R7596 */
+ 0x0000, /* R7597 */
+ 0x0000, /* R7598 */
+ 0x0000, /* R7599 */
+ 0x0000, /* R7600 */
+ 0x0000, /* R7601 */
+ 0x0000, /* R7602 */
+ 0x0000, /* R7603 */
+ 0x0000, /* R7604 */
+ 0x0000, /* R7605 */
+ 0x0000, /* R7606 */
+ 0x0000, /* R7607 */
+ 0x0000, /* R7608 */
+ 0x0000, /* R7609 */
+ 0x0000, /* R7610 */
+ 0x0000, /* R7611 */
+ 0x0000, /* R7612 */
+ 0x0000, /* R7613 */
+ 0x0000, /* R7614 */
+ 0x0000, /* R7615 */
+ 0x0000, /* R7616 */
+ 0x0000, /* R7617 */
+ 0x0000, /* R7618 */
+ 0x0000, /* R7619 */
+ 0x0000, /* R7620 */
+ 0x0000, /* R7621 */
+ 0x0000, /* R7622 */
+ 0x0000, /* R7623 */
+ 0x0000, /* R7624 */
+ 0x0000, /* R7625 */
+ 0x0000, /* R7626 */
+ 0x0000, /* R7627 */
+ 0x0000, /* R7628 */
+ 0x0000, /* R7629 */
+ 0x0000, /* R7630 */
+ 0x0000, /* R7631 */
+ 0x0000, /* R7632 */
+ 0x0000, /* R7633 */
+ 0x0000, /* R7634 */
+ 0x0000, /* R7635 */
+ 0x0000, /* R7636 */
+ 0x0000, /* R7637 */
+ 0x0000, /* R7638 */
+ 0x0000, /* R7639 */
+ 0x0000, /* R7640 */
+ 0x0000, /* R7641 */
+ 0x0000, /* R7642 */
+ 0x0000, /* R7643 */
+ 0x0000, /* R7644 */
+ 0x0000, /* R7645 */
+ 0x0000, /* R7646 */
+ 0x0000, /* R7647 */
+ 0x0000, /* R7648 */
+ 0x0000, /* R7649 */
+ 0x0000, /* R7650 */
+ 0x0000, /* R7651 */
+ 0x0000, /* R7652 */
+ 0x0000, /* R7653 */
+ 0x0000, /* R7654 */
+ 0x0000, /* R7655 */
+ 0x0000, /* R7656 */
+ 0x0000, /* R7657 */
+ 0x0000, /* R7658 */
+ 0x0000, /* R7659 */
+ 0x0000, /* R7660 */
+ 0x0000, /* R7661 */
+ 0x0000, /* R7662 */
+ 0x0000, /* R7663 */
+ 0x0000, /* R7664 */
+ 0x0000, /* R7665 */
+ 0x0000, /* R7666 */
+ 0x0000, /* R7667 */
+ 0x0000, /* R7668 */
+ 0x0000, /* R7669 */
+ 0x0000, /* R7670 */
+ 0x0000, /* R7671 */
+ 0x0000, /* R7672 */
+ 0x0000, /* R7673 */
+ 0x0000, /* R7674 */
+ 0x0000, /* R7675 */
+ 0x0000, /* R7676 */
+ 0x0000, /* R7677 */
+ 0x0000, /* R7678 */
+ 0x0000, /* R7679 */
+ 0x0000, /* R7680 */
+ 0x0000, /* R7681 */
+ 0x0000, /* R7682 */
+ 0x0000, /* R7683 */
+ 0x0000, /* R7684 */
+ 0x0000, /* R7685 */
+ 0x0000, /* R7686 */
+ 0x0000, /* R7687 */
+ 0x0000, /* R7688 */
+ 0x0000, /* R7689 */
+ 0x0000, /* R7690 */
+ 0x0000, /* R7691 */
+ 0x0000, /* R7692 */
+ 0x0000, /* R7693 */
+ 0x0000, /* R7694 */
+ 0x0000, /* R7695 */
+ 0x0000, /* R7696 */
+ 0x0000, /* R7697 */
+ 0x0000, /* R7698 */
+ 0x0000, /* R7699 */
+ 0x0000, /* R7700 */
+ 0x0000, /* R7701 */
+ 0x0000, /* R7702 */
+ 0x0000, /* R7703 */
+ 0x0000, /* R7704 */
+ 0x0000, /* R7705 */
+ 0x0000, /* R7706 */
+ 0x0000, /* R7707 */
+ 0x0000, /* R7708 */
+ 0x0000, /* R7709 */
+ 0x0000, /* R7710 */
+ 0x0000, /* R7711 */
+ 0x0000, /* R7712 */
+ 0x0000, /* R7713 */
+ 0x0000, /* R7714 */
+ 0x0000, /* R7715 */
+ 0x0000, /* R7716 */
+ 0x0000, /* R7717 */
+ 0x0000, /* R7718 */
+ 0x0000, /* R7719 */
+ 0x0000, /* R7720 */
+ 0x0000, /* R7721 */
+ 0x0000, /* R7722 */
+ 0x0000, /* R7723 */
+ 0x0000, /* R7724 */
+ 0x0000, /* R7725 */
+ 0x0000, /* R7726 */
+ 0x0000, /* R7727 */
+ 0x0000, /* R7728 */
+ 0x0000, /* R7729 */
+ 0x0000, /* R7730 */
+ 0x0000, /* R7731 */
+ 0x0000, /* R7732 */
+ 0x0000, /* R7733 */
+ 0x0000, /* R7734 */
+ 0x0000, /* R7735 */
+ 0x0000, /* R7736 */
+ 0x0000, /* R7737 */
+ 0x0000, /* R7738 */
+ 0x0000, /* R7739 */
+ 0x0000, /* R7740 */
+ 0x0000, /* R7741 */
+ 0x0000, /* R7742 */
+ 0x0000, /* R7743 */
+ 0x0000, /* R7744 */
+ 0x0000, /* R7745 */
+ 0x0000, /* R7746 */
+ 0x0000, /* R7747 */
+ 0x0000, /* R7748 */
+ 0x0000, /* R7749 */
+ 0x0000, /* R7750 */
+ 0x0000, /* R7751 */
+ 0x0000, /* R7752 */
+ 0x0000, /* R7753 */
+ 0x0000, /* R7754 */
+ 0x0000, /* R7755 */
+ 0x0000, /* R7756 */
+ 0x0000, /* R7757 */
+ 0x0000, /* R7758 */
+ 0x0000, /* R7759 */
+ 0x0000, /* R7760 */
+ 0x0000, /* R7761 */
+ 0x0000, /* R7762 */
+ 0x0000, /* R7763 */
+ 0x0000, /* R7764 */
+ 0x0000, /* R7765 */
+ 0x0000, /* R7766 */
+ 0x0000, /* R7767 */
+ 0x0000, /* R7768 */
+ 0x0000, /* R7769 */
+ 0x0000, /* R7770 */
+ 0x0000, /* R7771 */
+ 0x0000, /* R7772 */
+ 0x0000, /* R7773 */
+ 0x0000, /* R7774 */
+ 0x0000, /* R7775 */
+ 0x0000, /* R7776 */
+ 0x0000, /* R7777 */
+ 0x0000, /* R7778 */
+ 0x0000, /* R7779 */
+ 0x0000, /* R7780 */
+ 0x0000, /* R7781 */
+ 0x0000, /* R7782 */
+ 0x0000, /* R7783 */
+ 0x0000, /* R7784 */
+ 0x0000, /* R7785 */
+ 0x0000, /* R7786 */
+ 0x0000, /* R7787 */
+ 0x0000, /* R7788 */
+ 0x0000, /* R7789 */
+ 0x0000, /* R7790 */
+ 0x0000, /* R7791 */
+ 0x0000, /* R7792 */
+ 0x0000, /* R7793 */
+ 0x0000, /* R7794 */
+ 0x0000, /* R7795 */
+ 0x0000, /* R7796 */
+ 0x0000, /* R7797 */
+ 0x0000, /* R7798 */
+ 0x0000, /* R7799 */
+ 0x0000, /* R7800 */
+ 0x0000, /* R7801 */
+ 0x0000, /* R7802 */
+ 0x0000, /* R7803 */
+ 0x0000, /* R7804 */
+ 0x0000, /* R7805 */
+ 0x0000, /* R7806 */
+ 0x0000, /* R7807 */
+ 0x0000, /* R7808 */
+ 0x0000, /* R7809 */
+ 0x0000, /* R7810 */
+ 0x0000, /* R7811 */
+ 0x0000, /* R7812 */
+ 0x0000, /* R7813 */
+ 0x0000, /* R7814 */
+ 0x0000, /* R7815 */
+ 0x0000, /* R7816 */
+ 0x0000, /* R7817 */
+ 0x0000, /* R7818 */
+ 0x0000, /* R7819 */
+ 0x0000, /* R7820 */
+ 0x0000, /* R7821 */
+ 0x0000, /* R7822 */
+ 0x0000, /* R7823 */
+ 0x0000, /* R7824 */
+ 0x0000, /* R7825 */
+ 0x0000, /* R7826 */
+ 0x0000, /* R7827 */
+ 0x0000, /* R7828 */
+ 0x0000, /* R7829 */
+ 0x0000, /* R7830 */
+ 0x0000, /* R7831 */
+ 0x0000, /* R7832 */
+ 0x0000, /* R7833 */
+ 0x0000, /* R7834 */
+ 0x0000, /* R7835 */
+ 0x0000, /* R7836 */
+ 0x0000, /* R7837 */
+ 0x0000, /* R7838 */
+ 0x0000, /* R7839 */
+ 0x0000, /* R7840 */
+ 0x0000, /* R7841 */
+ 0x0000, /* R7842 */
+ 0x0000, /* R7843 */
+ 0x0000, /* R7844 */
+ 0x0000, /* R7845 */
+ 0x0000, /* R7846 */
+ 0x0000, /* R7847 */
+ 0x0000, /* R7848 */
+ 0x0000, /* R7849 */
+ 0x0000, /* R7850 */
+ 0x0000, /* R7851 */
+ 0x0000, /* R7852 */
+ 0x0000, /* R7853 */
+ 0x0000, /* R7854 */
+ 0x0000, /* R7855 */
+ 0x0000, /* R7856 */
+ 0x0000, /* R7857 */
+ 0x0000, /* R7858 */
+ 0x0000, /* R7859 */
+ 0x0000, /* R7860 */
+ 0x0000, /* R7861 */
+ 0x0000, /* R7862 */
+ 0x0000, /* R7863 */
+ 0x0000, /* R7864 */
+ 0x0000, /* R7865 */
+ 0x0000, /* R7866 */
+ 0x0000, /* R7867 */
+ 0x0000, /* R7868 */
+ 0x0000, /* R7869 */
+ 0x0000, /* R7870 */
+ 0x0000, /* R7871 */
+ 0x0000, /* R7872 */
+ 0x0000, /* R7873 */
+ 0x0000, /* R7874 */
+ 0x0000, /* R7875 */
+ 0x0000, /* R7876 */
+ 0x0000, /* R7877 */
+ 0x0000, /* R7878 */
+ 0x0000, /* R7879 */
+ 0x0000, /* R7880 */
+ 0x0000, /* R7881 */
+ 0x0000, /* R7882 */
+ 0x0000, /* R7883 */
+ 0x0000, /* R7884 */
+ 0x0000, /* R7885 */
+ 0x0000, /* R7886 */
+ 0x0000, /* R7887 */
+ 0x0000, /* R7888 */
+ 0x0000, /* R7889 */
+ 0x0000, /* R7890 */
+ 0x0000, /* R7891 */
+ 0x0000, /* R7892 */
+ 0x0000, /* R7893 */
+ 0x0000, /* R7894 */
+ 0x0000, /* R7895 */
+ 0x0000, /* R7896 */
+ 0x0000, /* R7897 */
+ 0x0000, /* R7898 */
+ 0x0000, /* R7899 */
+ 0x0000, /* R7900 */
+ 0x0000, /* R7901 */
+ 0x0000, /* R7902 */
+ 0x0000, /* R7903 */
+ 0x0000, /* R7904 */
+ 0x0000, /* R7905 */
+ 0x0000, /* R7906 */
+ 0x0000, /* R7907 */
+ 0x0000, /* R7908 */
+ 0x0000, /* R7909 */
+ 0x0000, /* R7910 */
+ 0x0000, /* R7911 */
+ 0x0000, /* R7912 */
+ 0x0000, /* R7913 */
+ 0x0000, /* R7914 */
+ 0x0000, /* R7915 */
+ 0x0000, /* R7916 */
+ 0x0000, /* R7917 */
+ 0x0000, /* R7918 */
+ 0x0000, /* R7919 */
+ 0x0000, /* R7920 */
+ 0x0000, /* R7921 */
+ 0x0000, /* R7922 */
+ 0x0000, /* R7923 */
+ 0x0000, /* R7924 */
+ 0x0000, /* R7925 */
+ 0x0000, /* R7926 */
+ 0x0000, /* R7927 */
+ 0x0000, /* R7928 */
+ 0x0000, /* R7929 */
+ 0x0000, /* R7930 */
+ 0x0000, /* R7931 */
+ 0x0000, /* R7932 */
+ 0x0000, /* R7933 */
+ 0x0000, /* R7934 */
+ 0x0000, /* R7935 */
+ 0x0000, /* R7936 */
+ 0x0000, /* R7937 */
+ 0x0000, /* R7938 */
+ 0x0000, /* R7939 */
+ 0x0000, /* R7940 */
+ 0x0000, /* R7941 */
+ 0x0000, /* R7942 */
+ 0x0000, /* R7943 */
+ 0x0000, /* R7944 */
+ 0x0000, /* R7945 */
+ 0x0000, /* R7946 */
+ 0x0000, /* R7947 */
+ 0x0000, /* R7948 */
+ 0x0000, /* R7949 */
+ 0x0000, /* R7950 */
+ 0x0000, /* R7951 */
+ 0x0000, /* R7952 */
+ 0x0000, /* R7953 */
+ 0x0000, /* R7954 */
+ 0x0000, /* R7955 */
+ 0x0000, /* R7956 */
+ 0x0000, /* R7957 */
+ 0x0000, /* R7958 */
+ 0x0000, /* R7959 */
+ 0x0000, /* R7960 */
+ 0x0000, /* R7961 */
+ 0x0000, /* R7962 */
+ 0x0000, /* R7963 */
+ 0x0000, /* R7964 */
+ 0x0000, /* R7965 */
+ 0x0000, /* R7966 */
+ 0x0000, /* R7967 */
+ 0x0000, /* R7968 */
+ 0x0000, /* R7969 */
+ 0x0000, /* R7970 */
+ 0x0000, /* R7971 */
+ 0x0000, /* R7972 */
+ 0x0000, /* R7973 */
+ 0x0000, /* R7974 */
+ 0x0000, /* R7975 */
+ 0x0000, /* R7976 */
+ 0x0000, /* R7977 */
+ 0x0000, /* R7978 */
+ 0x0000, /* R7979 */
+ 0x0000, /* R7980 */
+ 0x0000, /* R7981 */
+ 0x0000, /* R7982 */
+ 0x0000, /* R7983 */
+ 0x0000, /* R7984 */
+ 0x0000, /* R7985 */
+ 0x0000, /* R7986 */
+ 0x0000, /* R7987 */
+ 0x0000, /* R7988 */
+ 0x0000, /* R7989 */
+ 0x0000, /* R7990 */
+ 0x0000, /* R7991 */
+ 0x0000, /* R7992 */
+ 0x0000, /* R7993 */
+ 0x0000, /* R7994 */
+ 0x0000, /* R7995 */
+ 0x0000, /* R7996 */
+ 0x0000, /* R7997 */
+ 0x0000, /* R7998 */
+ 0x0000, /* R7999 */
+ 0x0000, /* R8000 */
+ 0x0000, /* R8001 */
+ 0x0000, /* R8002 */
+ 0x0000, /* R8003 */
+ 0x0000, /* R8004 */
+ 0x0000, /* R8005 */
+ 0x0000, /* R8006 */
+ 0x0000, /* R8007 */
+ 0x0000, /* R8008 */
+ 0x0000, /* R8009 */
+ 0x0000, /* R8010 */
+ 0x0000, /* R8011 */
+ 0x0000, /* R8012 */
+ 0x0000, /* R8013 */
+ 0x0000, /* R8014 */
+ 0x0000, /* R8015 */
+ 0x0000, /* R8016 */
+ 0x0000, /* R8017 */
+ 0x0000, /* R8018 */
+ 0x0000, /* R8019 */
+ 0x0000, /* R8020 */
+ 0x0000, /* R8021 */
+ 0x0000, /* R8022 */
+ 0x0000, /* R8023 */
+ 0x0000, /* R8024 */
+ 0x0000, /* R8025 */
+ 0x0000, /* R8026 */
+ 0x0000, /* R8027 */
+ 0x0000, /* R8028 */
+ 0x0000, /* R8029 */
+ 0x0000, /* R8030 */
+ 0x0000, /* R8031 */
+ 0x0000, /* R8032 */
+ 0x0000, /* R8033 */
+ 0x0000, /* R8034 */
+ 0x0000, /* R8035 */
+ 0x0000, /* R8036 */
+ 0x0000, /* R8037 */
+ 0x0000, /* R8038 */
+ 0x0000, /* R8039 */
+ 0x0000, /* R8040 */
+ 0x0000, /* R8041 */
+ 0x0000, /* R8042 */
+ 0x0000, /* R8043 */
+ 0x0000, /* R8044 */
+ 0x0000, /* R8045 */
+ 0x0000, /* R8046 */
+ 0x0000, /* R8047 */
+ 0x0000, /* R8048 */
+ 0x0000, /* R8049 */
+ 0x0000, /* R8050 */
+ 0x0000, /* R8051 */
+ 0x0000, /* R8052 */
+ 0x0000, /* R8053 */
+ 0x0000, /* R8054 */
+ 0x0000, /* R8055 */
+ 0x0000, /* R8056 */
+ 0x0000, /* R8057 */
+ 0x0000, /* R8058 */
+ 0x0000, /* R8059 */
+ 0x0000, /* R8060 */
+ 0x0000, /* R8061 */
+ 0x0000, /* R8062 */
+ 0x0000, /* R8063 */
+ 0x0000, /* R8064 */
+ 0x0000, /* R8065 */
+ 0x0000, /* R8066 */
+ 0x0000, /* R8067 */
+ 0x0000, /* R8068 */
+ 0x0000, /* R8069 */
+ 0x0000, /* R8070 */
+ 0x0000, /* R8071 */
+ 0x0000, /* R8072 */
+ 0x0000, /* R8073 */
+ 0x0000, /* R8074 */
+ 0x0000, /* R8075 */
+ 0x0000, /* R8076 */
+ 0x0000, /* R8077 */
+ 0x0000, /* R8078 */
+ 0x0000, /* R8079 */
+ 0x0000, /* R8080 */
+ 0x0000, /* R8081 */
+ 0x0000, /* R8082 */
+ 0x0000, /* R8083 */
+ 0x0000, /* R8084 */
+ 0x0000, /* R8085 */
+ 0x0000, /* R8086 */
+ 0x0000, /* R8087 */
+ 0x0000, /* R8088 */
+ 0x0000, /* R8089 */
+ 0x0000, /* R8090 */
+ 0x0000, /* R8091 */
+ 0x0000, /* R8092 */
+ 0x0000, /* R8093 */
+ 0x0000, /* R8094 */
+ 0x0000, /* R8095 */
+ 0x0000, /* R8096 */
+ 0x0000, /* R8097 */
+ 0x0000, /* R8098 */
+ 0x0000, /* R8099 */
+ 0x0000, /* R8100 */
+ 0x0000, /* R8101 */
+ 0x0000, /* R8102 */
+ 0x0000, /* R8103 */
+ 0x0000, /* R8104 */
+ 0x0000, /* R8105 */
+ 0x0000, /* R8106 */
+ 0x0000, /* R8107 */
+ 0x0000, /* R8108 */
+ 0x0000, /* R8109 */
+ 0x0000, /* R8110 */
+ 0x0000, /* R8111 */
+ 0x0000, /* R8112 */
+ 0x0000, /* R8113 */
+ 0x0000, /* R8114 */
+ 0x0000, /* R8115 */
+ 0x0000, /* R8116 */
+ 0x0000, /* R8117 */
+ 0x0000, /* R8118 */
+ 0x0000, /* R8119 */
+ 0x0000, /* R8120 */
+ 0x0000, /* R8121 */
+ 0x0000, /* R8122 */
+ 0x0000, /* R8123 */
+ 0x0000, /* R8124 */
+ 0x0000, /* R8125 */
+ 0x0000, /* R8126 */
+ 0x0000, /* R8127 */
+ 0x0000, /* R8128 */
+ 0x0000, /* R8129 */
+ 0x0000, /* R8130 */
+ 0x0000, /* R8131 */
+ 0x0000, /* R8132 */
+ 0x0000, /* R8133 */
+ 0x0000, /* R8134 */
+ 0x0000, /* R8135 */
+ 0x0000, /* R8136 */
+ 0x0000, /* R8137 */
+ 0x0000, /* R8138 */
+ 0x0000, /* R8139 */
+ 0x0000, /* R8140 */
+ 0x0000, /* R8141 */
+ 0x0000, /* R8142 */
+ 0x0000, /* R8143 */
+ 0x0000, /* R8144 */
+ 0x0000, /* R8145 */
+ 0x0000, /* R8146 */
+ 0x0000, /* R8147 */
+ 0x0000, /* R8148 */
+ 0x0000, /* R8149 */
+ 0x0000, /* R8150 */
+ 0x0000, /* R8151 */
+ 0x0000, /* R8152 */
+ 0x0000, /* R8153 */
+ 0x0000, /* R8154 */
+ 0x0000, /* R8155 */
+ 0x0000, /* R8156 */
+ 0x0000, /* R8157 */
+ 0x0000, /* R8158 */
+ 0x0000, /* R8159 */
+ 0x0000, /* R8160 */
+ 0x0000, /* R8161 */
+ 0x0000, /* R8162 */
+ 0x0000, /* R8163 */
+ 0x0000, /* R8164 */
+ 0x0000, /* R8165 */
+ 0x0000, /* R8166 */
+ 0x0000, /* R8167 */
+ 0x0000, /* R8168 */
+ 0x0000, /* R8169 */
+ 0x0000, /* R8170 */
+ 0x0000, /* R8171 */
+ 0x0000, /* R8172 */
+ 0x0000, /* R8173 */
+ 0x0000, /* R8174 */
+ 0x0000, /* R8175 */
+ 0x0000, /* R8176 */
+ 0x0000, /* R8177 */
+ 0x0000, /* R8178 */
+ 0x0000, /* R8179 */
+ 0x0000, /* R8180 */
+ 0x0000, /* R8181 */
+ 0x0000, /* R8182 */
+ 0x0000, /* R8183 */
+ 0x0000, /* R8184 */
+ 0x0000, /* R8185 */
+ 0x0000, /* R8186 */
+ 0x0000, /* R8187 */
+ 0x0000, /* R8188 */
+ 0x0000, /* R8189 */
+ 0x0000, /* R8190 */
+ 0x0000, /* R8191 */
+ 0x0000, /* R8192 - DSP2 Instruction RAM 0 */
+ 0x0000, /* R8193 */
+ 0x0000, /* R8194 */
+ 0x0000, /* R8195 */
+ 0x0000, /* R8196 */
+ 0x0000, /* R8197 */
+ 0x0000, /* R8198 */
+ 0x0000, /* R8199 */
+ 0x0000, /* R8200 */
+ 0x0000, /* R8201 */
+ 0x0000, /* R8202 */
+ 0x0000, /* R8203 */
+ 0x0000, /* R8204 */
+ 0x0000, /* R8205 */
+ 0x0000, /* R8206 */
+ 0x0000, /* R8207 */
+ 0x0000, /* R8208 */
+ 0x0000, /* R8209 */
+ 0x0000, /* R8210 */
+ 0x0000, /* R8211 */
+ 0x0000, /* R8212 */
+ 0x0000, /* R8213 */
+ 0x0000, /* R8214 */
+ 0x0000, /* R8215 */
+ 0x0000, /* R8216 */
+ 0x0000, /* R8217 */
+ 0x0000, /* R8218 */
+ 0x0000, /* R8219 */
+ 0x0000, /* R8220 */
+ 0x0000, /* R8221 */
+ 0x0000, /* R8222 */
+ 0x0000, /* R8223 */
+ 0x0000, /* R8224 */
+ 0x0000, /* R8225 */
+ 0x0000, /* R8226 */
+ 0x0000, /* R8227 */
+ 0x0000, /* R8228 */
+ 0x0000, /* R8229 */
+ 0x0000, /* R8230 */
+ 0x0000, /* R8231 */
+ 0x0000, /* R8232 */
+ 0x0000, /* R8233 */
+ 0x0000, /* R8234 */
+ 0x0000, /* R8235 */
+ 0x0000, /* R8236 */
+ 0x0000, /* R8237 */
+ 0x0000, /* R8238 */
+ 0x0000, /* R8239 */
+ 0x0000, /* R8240 */
+ 0x0000, /* R8241 */
+ 0x0000, /* R8242 */
+ 0x0000, /* R8243 */
+ 0x0000, /* R8244 */
+ 0x0000, /* R8245 */
+ 0x0000, /* R8246 */
+ 0x0000, /* R8247 */
+ 0x0000, /* R8248 */
+ 0x0000, /* R8249 */
+ 0x0000, /* R8250 */
+ 0x0000, /* R8251 */
+ 0x0000, /* R8252 */
+ 0x0000, /* R8253 */
+ 0x0000, /* R8254 */
+ 0x0000, /* R8255 */
+ 0x0000, /* R8256 */
+ 0x0000, /* R8257 */
+ 0x0000, /* R8258 */
+ 0x0000, /* R8259 */
+ 0x0000, /* R8260 */
+ 0x0000, /* R8261 */
+ 0x0000, /* R8262 */
+ 0x0000, /* R8263 */
+ 0x0000, /* R8264 */
+ 0x0000, /* R8265 */
+ 0x0000, /* R8266 */
+ 0x0000, /* R8267 */
+ 0x0000, /* R8268 */
+ 0x0000, /* R8269 */
+ 0x0000, /* R8270 */
+ 0x0000, /* R8271 */
+ 0x0000, /* R8272 */
+ 0x0000, /* R8273 */
+ 0x0000, /* R8274 */
+ 0x0000, /* R8275 */
+ 0x0000, /* R8276 */
+ 0x0000, /* R8277 */
+ 0x0000, /* R8278 */
+ 0x0000, /* R8279 */
+ 0x0000, /* R8280 */
+ 0x0000, /* R8281 */
+ 0x0000, /* R8282 */
+ 0x0000, /* R8283 */
+ 0x0000, /* R8284 */
+ 0x0000, /* R8285 */
+ 0x0000, /* R8286 */
+ 0x0000, /* R8287 */
+ 0x0000, /* R8288 */
+ 0x0000, /* R8289 */
+ 0x0000, /* R8290 */
+ 0x0000, /* R8291 */
+ 0x0000, /* R8292 */
+ 0x0000, /* R8293 */
+ 0x0000, /* R8294 */
+ 0x0000, /* R8295 */
+ 0x0000, /* R8296 */
+ 0x0000, /* R8297 */
+ 0x0000, /* R8298 */
+ 0x0000, /* R8299 */
+ 0x0000, /* R8300 */
+ 0x0000, /* R8301 */
+ 0x0000, /* R8302 */
+ 0x0000, /* R8303 */
+ 0x0000, /* R8304 */
+ 0x0000, /* R8305 */
+ 0x0000, /* R8306 */
+ 0x0000, /* R8307 */
+ 0x0000, /* R8308 */
+ 0x0000, /* R8309 */
+ 0x0000, /* R8310 */
+ 0x0000, /* R8311 */
+ 0x0000, /* R8312 */
+ 0x0000, /* R8313 */
+ 0x0000, /* R8314 */
+ 0x0000, /* R8315 */
+ 0x0000, /* R8316 */
+ 0x0000, /* R8317 */
+ 0x0000, /* R8318 */
+ 0x0000, /* R8319 */
+ 0x0000, /* R8320 */
+ 0x0000, /* R8321 */
+ 0x0000, /* R8322 */
+ 0x0000, /* R8323 */
+ 0x0000, /* R8324 */
+ 0x0000, /* R8325 */
+ 0x0000, /* R8326 */
+ 0x0000, /* R8327 */
+ 0x0000, /* R8328 */
+ 0x0000, /* R8329 */
+ 0x0000, /* R8330 */
+ 0x0000, /* R8331 */
+ 0x0000, /* R8332 */
+ 0x0000, /* R8333 */
+ 0x0000, /* R8334 */
+ 0x0000, /* R8335 */
+ 0x0000, /* R8336 */
+ 0x0000, /* R8337 */
+ 0x0000, /* R8338 */
+ 0x0000, /* R8339 */
+ 0x0000, /* R8340 */
+ 0x0000, /* R8341 */
+ 0x0000, /* R8342 */
+ 0x0000, /* R8343 */
+ 0x0000, /* R8344 */
+ 0x0000, /* R8345 */
+ 0x0000, /* R8346 */
+ 0x0000, /* R8347 */
+ 0x0000, /* R8348 */
+ 0x0000, /* R8349 */
+ 0x0000, /* R8350 */
+ 0x0000, /* R8351 */
+ 0x0000, /* R8352 */
+ 0x0000, /* R8353 */
+ 0x0000, /* R8354 */
+ 0x0000, /* R8355 */
+ 0x0000, /* R8356 */
+ 0x0000, /* R8357 */
+ 0x0000, /* R8358 */
+ 0x0000, /* R8359 */
+ 0x0000, /* R8360 */
+ 0x0000, /* R8361 */
+ 0x0000, /* R8362 */
+ 0x0000, /* R8363 */
+ 0x0000, /* R8364 */
+ 0x0000, /* R8365 */
+ 0x0000, /* R8366 */
+ 0x0000, /* R8367 */
+ 0x0000, /* R8368 */
+ 0x0000, /* R8369 */
+ 0x0000, /* R8370 */
+ 0x0000, /* R8371 */
+ 0x0000, /* R8372 */
+ 0x0000, /* R8373 */
+ 0x0000, /* R8374 */
+ 0x0000, /* R8375 */
+ 0x0000, /* R8376 */
+ 0x0000, /* R8377 */
+ 0x0000, /* R8378 */
+ 0x0000, /* R8379 */
+ 0x0000, /* R8380 */
+ 0x0000, /* R8381 */
+ 0x0000, /* R8382 */
+ 0x0000, /* R8383 */
+ 0x0000, /* R8384 */
+ 0x0000, /* R8385 */
+ 0x0000, /* R8386 */
+ 0x0000, /* R8387 */
+ 0x0000, /* R8388 */
+ 0x0000, /* R8389 */
+ 0x0000, /* R8390 */
+ 0x0000, /* R8391 */
+ 0x0000, /* R8392 */
+ 0x0000, /* R8393 */
+ 0x0000, /* R8394 */
+ 0x0000, /* R8395 */
+ 0x0000, /* R8396 */
+ 0x0000, /* R8397 */
+ 0x0000, /* R8398 */
+ 0x0000, /* R8399 */
+ 0x0000, /* R8400 */
+ 0x0000, /* R8401 */
+ 0x0000, /* R8402 */
+ 0x0000, /* R8403 */
+ 0x0000, /* R8404 */
+ 0x0000, /* R8405 */
+ 0x0000, /* R8406 */
+ 0x0000, /* R8407 */
+ 0x0000, /* R8408 */
+ 0x0000, /* R8409 */
+ 0x0000, /* R8410 */
+ 0x0000, /* R8411 */
+ 0x0000, /* R8412 */
+ 0x0000, /* R8413 */
+ 0x0000, /* R8414 */
+ 0x0000, /* R8415 */
+ 0x0000, /* R8416 */
+ 0x0000, /* R8417 */
+ 0x0000, /* R8418 */
+ 0x0000, /* R8419 */
+ 0x0000, /* R8420 */
+ 0x0000, /* R8421 */
+ 0x0000, /* R8422 */
+ 0x0000, /* R8423 */
+ 0x0000, /* R8424 */
+ 0x0000, /* R8425 */
+ 0x0000, /* R8426 */
+ 0x0000, /* R8427 */
+ 0x0000, /* R8428 */
+ 0x0000, /* R8429 */
+ 0x0000, /* R8430 */
+ 0x0000, /* R8431 */
+ 0x0000, /* R8432 */
+ 0x0000, /* R8433 */
+ 0x0000, /* R8434 */
+ 0x0000, /* R8435 */
+ 0x0000, /* R8436 */
+ 0x0000, /* R8437 */
+ 0x0000, /* R8438 */
+ 0x0000, /* R8439 */
+ 0x0000, /* R8440 */
+ 0x0000, /* R8441 */
+ 0x0000, /* R8442 */
+ 0x0000, /* R8443 */
+ 0x0000, /* R8444 */
+ 0x0000, /* R8445 */
+ 0x0000, /* R8446 */
+ 0x0000, /* R8447 */
+ 0x0000, /* R8448 */
+ 0x0000, /* R8449 */
+ 0x0000, /* R8450 */
+ 0x0000, /* R8451 */
+ 0x0000, /* R8452 */
+ 0x0000, /* R8453 */
+ 0x0000, /* R8454 */
+ 0x0000, /* R8455 */
+ 0x0000, /* R8456 */
+ 0x0000, /* R8457 */
+ 0x0000, /* R8458 */
+ 0x0000, /* R8459 */
+ 0x0000, /* R8460 */
+ 0x0000, /* R8461 */
+ 0x0000, /* R8462 */
+ 0x0000, /* R8463 */
+ 0x0000, /* R8464 */
+ 0x0000, /* R8465 */
+ 0x0000, /* R8466 */
+ 0x0000, /* R8467 */
+ 0x0000, /* R8468 */
+ 0x0000, /* R8469 */
+ 0x0000, /* R8470 */
+ 0x0000, /* R8471 */
+ 0x0000, /* R8472 */
+ 0x0000, /* R8473 */
+ 0x0000, /* R8474 */
+ 0x0000, /* R8475 */
+ 0x0000, /* R8476 */
+ 0x0000, /* R8477 */
+ 0x0000, /* R8478 */
+ 0x0000, /* R8479 */
+ 0x0000, /* R8480 */
+ 0x0000, /* R8481 */
+ 0x0000, /* R8482 */
+ 0x0000, /* R8483 */
+ 0x0000, /* R8484 */
+ 0x0000, /* R8485 */
+ 0x0000, /* R8486 */
+ 0x0000, /* R8487 */
+ 0x0000, /* R8488 */
+ 0x0000, /* R8489 */
+ 0x0000, /* R8490 */
+ 0x0000, /* R8491 */
+ 0x0000, /* R8492 */
+ 0x0000, /* R8493 */
+ 0x0000, /* R8494 */
+ 0x0000, /* R8495 */
+ 0x0000, /* R8496 */
+ 0x0000, /* R8497 */
+ 0x0000, /* R8498 */
+ 0x0000, /* R8499 */
+ 0x0000, /* R8500 */
+ 0x0000, /* R8501 */
+ 0x0000, /* R8502 */
+ 0x0000, /* R8503 */
+ 0x0000, /* R8504 */
+ 0x0000, /* R8505 */
+ 0x0000, /* R8506 */
+ 0x0000, /* R8507 */
+ 0x0000, /* R8508 */
+ 0x0000, /* R8509 */
+ 0x0000, /* R8510 */
+ 0x0000, /* R8511 */
+ 0x0000, /* R8512 */
+ 0x0000, /* R8513 */
+ 0x0000, /* R8514 */
+ 0x0000, /* R8515 */
+ 0x0000, /* R8516 */
+ 0x0000, /* R8517 */
+ 0x0000, /* R8518 */
+ 0x0000, /* R8519 */
+ 0x0000, /* R8520 */
+ 0x0000, /* R8521 */
+ 0x0000, /* R8522 */
+ 0x0000, /* R8523 */
+ 0x0000, /* R8524 */
+ 0x0000, /* R8525 */
+ 0x0000, /* R8526 */
+ 0x0000, /* R8527 */
+ 0x0000, /* R8528 */
+ 0x0000, /* R8529 */
+ 0x0000, /* R8530 */
+ 0x0000, /* R8531 */
+ 0x0000, /* R8532 */
+ 0x0000, /* R8533 */
+ 0x0000, /* R8534 */
+ 0x0000, /* R8535 */
+ 0x0000, /* R8536 */
+ 0x0000, /* R8537 */
+ 0x0000, /* R8538 */
+ 0x0000, /* R8539 */
+ 0x0000, /* R8540 */
+ 0x0000, /* R8541 */
+ 0x0000, /* R8542 */
+ 0x0000, /* R8543 */
+ 0x0000, /* R8544 */
+ 0x0000, /* R8545 */
+ 0x0000, /* R8546 */
+ 0x0000, /* R8547 */
+ 0x0000, /* R8548 */
+ 0x0000, /* R8549 */
+ 0x0000, /* R8550 */
+ 0x0000, /* R8551 */
+ 0x0000, /* R8552 */
+ 0x0000, /* R8553 */
+ 0x0000, /* R8554 */
+ 0x0000, /* R8555 */
+ 0x0000, /* R8556 */
+ 0x0000, /* R8557 */
+ 0x0000, /* R8558 */
+ 0x0000, /* R8559 */
+ 0x0000, /* R8560 */
+ 0x0000, /* R8561 */
+ 0x0000, /* R8562 */
+ 0x0000, /* R8563 */
+ 0x0000, /* R8564 */
+ 0x0000, /* R8565 */
+ 0x0000, /* R8566 */
+ 0x0000, /* R8567 */
+ 0x0000, /* R8568 */
+ 0x0000, /* R8569 */
+ 0x0000, /* R8570 */
+ 0x0000, /* R8571 */
+ 0x0000, /* R8572 */
+ 0x0000, /* R8573 */
+ 0x0000, /* R8574 */
+ 0x0000, /* R8575 */
+ 0x0000, /* R8576 */
+ 0x0000, /* R8577 */
+ 0x0000, /* R8578 */
+ 0x0000, /* R8579 */
+ 0x0000, /* R8580 */
+ 0x0000, /* R8581 */
+ 0x0000, /* R8582 */
+ 0x0000, /* R8583 */
+ 0x0000, /* R8584 */
+ 0x0000, /* R8585 */
+ 0x0000, /* R8586 */
+ 0x0000, /* R8587 */
+ 0x0000, /* R8588 */
+ 0x0000, /* R8589 */
+ 0x0000, /* R8590 */
+ 0x0000, /* R8591 */
+ 0x0000, /* R8592 */
+ 0x0000, /* R8593 */
+ 0x0000, /* R8594 */
+ 0x0000, /* R8595 */
+ 0x0000, /* R8596 */
+ 0x0000, /* R8597 */
+ 0x0000, /* R8598 */
+ 0x0000, /* R8599 */
+ 0x0000, /* R8600 */
+ 0x0000, /* R8601 */
+ 0x0000, /* R8602 */
+ 0x0000, /* R8603 */
+ 0x0000, /* R8604 */
+ 0x0000, /* R8605 */
+ 0x0000, /* R8606 */
+ 0x0000, /* R8607 */
+ 0x0000, /* R8608 */
+ 0x0000, /* R8609 */
+ 0x0000, /* R8610 */
+ 0x0000, /* R8611 */
+ 0x0000, /* R8612 */
+ 0x0000, /* R8613 */
+ 0x0000, /* R8614 */
+ 0x0000, /* R8615 */
+ 0x0000, /* R8616 */
+ 0x0000, /* R8617 */
+ 0x0000, /* R8618 */
+ 0x0000, /* R8619 */
+ 0x0000, /* R8620 */
+ 0x0000, /* R8621 */
+ 0x0000, /* R8622 */
+ 0x0000, /* R8623 */
+ 0x0000, /* R8624 */
+ 0x0000, /* R8625 */
+ 0x0000, /* R8626 */
+ 0x0000, /* R8627 */
+ 0x0000, /* R8628 */
+ 0x0000, /* R8629 */
+ 0x0000, /* R8630 */
+ 0x0000, /* R8631 */
+ 0x0000, /* R8632 */
+ 0x0000, /* R8633 */
+ 0x0000, /* R8634 */
+ 0x0000, /* R8635 */
+ 0x0000, /* R8636 */
+ 0x0000, /* R8637 */
+ 0x0000, /* R8638 */
+ 0x0000, /* R8639 */
+ 0x0000, /* R8640 */
+ 0x0000, /* R8641 */
+ 0x0000, /* R8642 */
+ 0x0000, /* R8643 */
+ 0x0000, /* R8644 */
+ 0x0000, /* R8645 */
+ 0x0000, /* R8646 */
+ 0x0000, /* R8647 */
+ 0x0000, /* R8648 */
+ 0x0000, /* R8649 */
+ 0x0000, /* R8650 */
+ 0x0000, /* R8651 */
+ 0x0000, /* R8652 */
+ 0x0000, /* R8653 */
+ 0x0000, /* R8654 */
+ 0x0000, /* R8655 */
+ 0x0000, /* R8656 */
+ 0x0000, /* R8657 */
+ 0x0000, /* R8658 */
+ 0x0000, /* R8659 */
+ 0x0000, /* R8660 */
+ 0x0000, /* R8661 */
+ 0x0000, /* R8662 */
+ 0x0000, /* R8663 */
+ 0x0000, /* R8664 */
+ 0x0000, /* R8665 */
+ 0x0000, /* R8666 */
+ 0x0000, /* R8667 */
+ 0x0000, /* R8668 */
+ 0x0000, /* R8669 */
+ 0x0000, /* R8670 */
+ 0x0000, /* R8671 */
+ 0x0000, /* R8672 */
+ 0x0000, /* R8673 */
+ 0x0000, /* R8674 */
+ 0x0000, /* R8675 */
+ 0x0000, /* R8676 */
+ 0x0000, /* R8677 */
+ 0x0000, /* R8678 */
+ 0x0000, /* R8679 */
+ 0x0000, /* R8680 */
+ 0x0000, /* R8681 */
+ 0x0000, /* R8682 */
+ 0x0000, /* R8683 */
+ 0x0000, /* R8684 */
+ 0x0000, /* R8685 */
+ 0x0000, /* R8686 */
+ 0x0000, /* R8687 */
+ 0x0000, /* R8688 */
+ 0x0000, /* R8689 */
+ 0x0000, /* R8690 */
+ 0x0000, /* R8691 */
+ 0x0000, /* R8692 */
+ 0x0000, /* R8693 */
+ 0x0000, /* R8694 */
+ 0x0000, /* R8695 */
+ 0x0000, /* R8696 */
+ 0x0000, /* R8697 */
+ 0x0000, /* R8698 */
+ 0x0000, /* R8699 */
+ 0x0000, /* R8700 */
+ 0x0000, /* R8701 */
+ 0x0000, /* R8702 */
+ 0x0000, /* R8703 */
+ 0x0000, /* R8704 */
+ 0x0000, /* R8705 */
+ 0x0000, /* R8706 */
+ 0x0000, /* R8707 */
+ 0x0000, /* R8708 */
+ 0x0000, /* R8709 */
+ 0x0000, /* R8710 */
+ 0x0000, /* R8711 */
+ 0x0000, /* R8712 */
+ 0x0000, /* R8713 */
+ 0x0000, /* R8714 */
+ 0x0000, /* R8715 */
+ 0x0000, /* R8716 */
+ 0x0000, /* R8717 */
+ 0x0000, /* R8718 */
+ 0x0000, /* R8719 */
+ 0x0000, /* R8720 */
+ 0x0000, /* R8721 */
+ 0x0000, /* R8722 */
+ 0x0000, /* R8723 */
+ 0x0000, /* R8724 */
+ 0x0000, /* R8725 */
+ 0x0000, /* R8726 */
+ 0x0000, /* R8727 */
+ 0x0000, /* R8728 */
+ 0x0000, /* R8729 */
+ 0x0000, /* R8730 */
+ 0x0000, /* R8731 */
+ 0x0000, /* R8732 */
+ 0x0000, /* R8733 */
+ 0x0000, /* R8734 */
+ 0x0000, /* R8735 */
+ 0x0000, /* R8736 */
+ 0x0000, /* R8737 */
+ 0x0000, /* R8738 */
+ 0x0000, /* R8739 */
+ 0x0000, /* R8740 */
+ 0x0000, /* R8741 */
+ 0x0000, /* R8742 */
+ 0x0000, /* R8743 */
+ 0x0000, /* R8744 */
+ 0x0000, /* R8745 */
+ 0x0000, /* R8746 */
+ 0x0000, /* R8747 */
+ 0x0000, /* R8748 */
+ 0x0000, /* R8749 */
+ 0x0000, /* R8750 */
+ 0x0000, /* R8751 */
+ 0x0000, /* R8752 */
+ 0x0000, /* R8753 */
+ 0x0000, /* R8754 */
+ 0x0000, /* R8755 */
+ 0x0000, /* R8756 */
+ 0x0000, /* R8757 */
+ 0x0000, /* R8758 */
+ 0x0000, /* R8759 */
+ 0x0000, /* R8760 */
+ 0x0000, /* R8761 */
+ 0x0000, /* R8762 */
+ 0x0000, /* R8763 */
+ 0x0000, /* R8764 */
+ 0x0000, /* R8765 */
+ 0x0000, /* R8766 */
+ 0x0000, /* R8767 */
+ 0x0000, /* R8768 */
+ 0x0000, /* R8769 */
+ 0x0000, /* R8770 */
+ 0x0000, /* R8771 */
+ 0x0000, /* R8772 */
+ 0x0000, /* R8773 */
+ 0x0000, /* R8774 */
+ 0x0000, /* R8775 */
+ 0x0000, /* R8776 */
+ 0x0000, /* R8777 */
+ 0x0000, /* R8778 */
+ 0x0000, /* R8779 */
+ 0x0000, /* R8780 */
+ 0x0000, /* R8781 */
+ 0x0000, /* R8782 */
+ 0x0000, /* R8783 */
+ 0x0000, /* R8784 */
+ 0x0000, /* R8785 */
+ 0x0000, /* R8786 */
+ 0x0000, /* R8787 */
+ 0x0000, /* R8788 */
+ 0x0000, /* R8789 */
+ 0x0000, /* R8790 */
+ 0x0000, /* R8791 */
+ 0x0000, /* R8792 */
+ 0x0000, /* R8793 */
+ 0x0000, /* R8794 */
+ 0x0000, /* R8795 */
+ 0x0000, /* R8796 */
+ 0x0000, /* R8797 */
+ 0x0000, /* R8798 */
+ 0x0000, /* R8799 */
+ 0x0000, /* R8800 */
+ 0x0000, /* R8801 */
+ 0x0000, /* R8802 */
+ 0x0000, /* R8803 */
+ 0x0000, /* R8804 */
+ 0x0000, /* R8805 */
+ 0x0000, /* R8806 */
+ 0x0000, /* R8807 */
+ 0x0000, /* R8808 */
+ 0x0000, /* R8809 */
+ 0x0000, /* R8810 */
+ 0x0000, /* R8811 */
+ 0x0000, /* R8812 */
+ 0x0000, /* R8813 */
+ 0x0000, /* R8814 */
+ 0x0000, /* R8815 */
+ 0x0000, /* R8816 */
+ 0x0000, /* R8817 */
+ 0x0000, /* R8818 */
+ 0x0000, /* R8819 */
+ 0x0000, /* R8820 */
+ 0x0000, /* R8821 */
+ 0x0000, /* R8822 */
+ 0x0000, /* R8823 */
+ 0x0000, /* R8824 */
+ 0x0000, /* R8825 */
+ 0x0000, /* R8826 */
+ 0x0000, /* R8827 */
+ 0x0000, /* R8828 */
+ 0x0000, /* R8829 */
+ 0x0000, /* R8830 */
+ 0x0000, /* R8831 */
+ 0x0000, /* R8832 */
+ 0x0000, /* R8833 */
+ 0x0000, /* R8834 */
+ 0x0000, /* R8835 */
+ 0x0000, /* R8836 */
+ 0x0000, /* R8837 */
+ 0x0000, /* R8838 */
+ 0x0000, /* R8839 */
+ 0x0000, /* R8840 */
+ 0x0000, /* R8841 */
+ 0x0000, /* R8842 */
+ 0x0000, /* R8843 */
+ 0x0000, /* R8844 */
+ 0x0000, /* R8845 */
+ 0x0000, /* R8846 */
+ 0x0000, /* R8847 */
+ 0x0000, /* R8848 */
+ 0x0000, /* R8849 */
+ 0x0000, /* R8850 */
+ 0x0000, /* R8851 */
+ 0x0000, /* R8852 */
+ 0x0000, /* R8853 */
+ 0x0000, /* R8854 */
+ 0x0000, /* R8855 */
+ 0x0000, /* R8856 */
+ 0x0000, /* R8857 */
+ 0x0000, /* R8858 */
+ 0x0000, /* R8859 */
+ 0x0000, /* R8860 */
+ 0x0000, /* R8861 */
+ 0x0000, /* R8862 */
+ 0x0000, /* R8863 */
+ 0x0000, /* R8864 */
+ 0x0000, /* R8865 */
+ 0x0000, /* R8866 */
+ 0x0000, /* R8867 */
+ 0x0000, /* R8868 */
+ 0x0000, /* R8869 */
+ 0x0000, /* R8870 */
+ 0x0000, /* R8871 */
+ 0x0000, /* R8872 */
+ 0x0000, /* R8873 */
+ 0x0000, /* R8874 */
+ 0x0000, /* R8875 */
+ 0x0000, /* R8876 */
+ 0x0000, /* R8877 */
+ 0x0000, /* R8878 */
+ 0x0000, /* R8879 */
+ 0x0000, /* R8880 */
+ 0x0000, /* R8881 */
+ 0x0000, /* R8882 */
+ 0x0000, /* R8883 */
+ 0x0000, /* R8884 */
+ 0x0000, /* R8885 */
+ 0x0000, /* R8886 */
+ 0x0000, /* R8887 */
+ 0x0000, /* R8888 */
+ 0x0000, /* R8889 */
+ 0x0000, /* R8890 */
+ 0x0000, /* R8891 */
+ 0x0000, /* R8892 */
+ 0x0000, /* R8893 */
+ 0x0000, /* R8894 */
+ 0x0000, /* R8895 */
+ 0x0000, /* R8896 */
+ 0x0000, /* R8897 */
+ 0x0000, /* R8898 */
+ 0x0000, /* R8899 */
+ 0x0000, /* R8900 */
+ 0x0000, /* R8901 */
+ 0x0000, /* R8902 */
+ 0x0000, /* R8903 */
+ 0x0000, /* R8904 */
+ 0x0000, /* R8905 */
+ 0x0000, /* R8906 */
+ 0x0000, /* R8907 */
+ 0x0000, /* R8908 */
+ 0x0000, /* R8909 */
+ 0x0000, /* R8910 */
+ 0x0000, /* R8911 */
+ 0x0000, /* R8912 */
+ 0x0000, /* R8913 */
+ 0x0000, /* R8914 */
+ 0x0000, /* R8915 */
+ 0x0000, /* R8916 */
+ 0x0000, /* R8917 */
+ 0x0000, /* R8918 */
+ 0x0000, /* R8919 */
+ 0x0000, /* R8920 */
+ 0x0000, /* R8921 */
+ 0x0000, /* R8922 */
+ 0x0000, /* R8923 */
+ 0x0000, /* R8924 */
+ 0x0000, /* R8925 */
+ 0x0000, /* R8926 */
+ 0x0000, /* R8927 */
+ 0x0000, /* R8928 */
+ 0x0000, /* R8929 */
+ 0x0000, /* R8930 */
+ 0x0000, /* R8931 */
+ 0x0000, /* R8932 */
+ 0x0000, /* R8933 */
+ 0x0000, /* R8934 */
+ 0x0000, /* R8935 */
+ 0x0000, /* R8936 */
+ 0x0000, /* R8937 */
+ 0x0000, /* R8938 */
+ 0x0000, /* R8939 */
+ 0x0000, /* R8940 */
+ 0x0000, /* R8941 */
+ 0x0000, /* R8942 */
+ 0x0000, /* R8943 */
+ 0x0000, /* R8944 */
+ 0x0000, /* R8945 */
+ 0x0000, /* R8946 */
+ 0x0000, /* R8947 */
+ 0x0000, /* R8948 */
+ 0x0000, /* R8949 */
+ 0x0000, /* R8950 */
+ 0x0000, /* R8951 */
+ 0x0000, /* R8952 */
+ 0x0000, /* R8953 */
+ 0x0000, /* R8954 */
+ 0x0000, /* R8955 */
+ 0x0000, /* R8956 */
+ 0x0000, /* R8957 */
+ 0x0000, /* R8958 */
+ 0x0000, /* R8959 */
+ 0x0000, /* R8960 */
+ 0x0000, /* R8961 */
+ 0x0000, /* R8962 */
+ 0x0000, /* R8963 */
+ 0x0000, /* R8964 */
+ 0x0000, /* R8965 */
+ 0x0000, /* R8966 */
+ 0x0000, /* R8967 */
+ 0x0000, /* R8968 */
+ 0x0000, /* R8969 */
+ 0x0000, /* R8970 */
+ 0x0000, /* R8971 */
+ 0x0000, /* R8972 */
+ 0x0000, /* R8973 */
+ 0x0000, /* R8974 */
+ 0x0000, /* R8975 */
+ 0x0000, /* R8976 */
+ 0x0000, /* R8977 */
+ 0x0000, /* R8978 */
+ 0x0000, /* R8979 */
+ 0x0000, /* R8980 */
+ 0x0000, /* R8981 */
+ 0x0000, /* R8982 */
+ 0x0000, /* R8983 */
+ 0x0000, /* R8984 */
+ 0x0000, /* R8985 */
+ 0x0000, /* R8986 */
+ 0x0000, /* R8987 */
+ 0x0000, /* R8988 */
+ 0x0000, /* R8989 */
+ 0x0000, /* R8990 */
+ 0x0000, /* R8991 */
+ 0x0000, /* R8992 */
+ 0x0000, /* R8993 */
+ 0x0000, /* R8994 */
+ 0x0000, /* R8995 */
+ 0x0000, /* R8996 */
+ 0x0000, /* R8997 */
+ 0x0000, /* R8998 */
+ 0x0000, /* R8999 */
+ 0x0000, /* R9000 */
+ 0x0000, /* R9001 */
+ 0x0000, /* R9002 */
+ 0x0000, /* R9003 */
+ 0x0000, /* R9004 */
+ 0x0000, /* R9005 */
+ 0x0000, /* R9006 */
+ 0x0000, /* R9007 */
+ 0x0000, /* R9008 */
+ 0x0000, /* R9009 */
+ 0x0000, /* R9010 */
+ 0x0000, /* R9011 */
+ 0x0000, /* R9012 */
+ 0x0000, /* R9013 */
+ 0x0000, /* R9014 */
+ 0x0000, /* R9015 */
+ 0x0000, /* R9016 */
+ 0x0000, /* R9017 */
+ 0x0000, /* R9018 */
+ 0x0000, /* R9019 */
+ 0x0000, /* R9020 */
+ 0x0000, /* R9021 */
+ 0x0000, /* R9022 */
+ 0x0000, /* R9023 */
+ 0x0000, /* R9024 */
+ 0x0000, /* R9025 */
+ 0x0000, /* R9026 */
+ 0x0000, /* R9027 */
+ 0x0000, /* R9028 */
+ 0x0000, /* R9029 */
+ 0x0000, /* R9030 */
+ 0x0000, /* R9031 */
+ 0x0000, /* R9032 */
+ 0x0000, /* R9033 */
+ 0x0000, /* R9034 */
+ 0x0000, /* R9035 */
+ 0x0000, /* R9036 */
+ 0x0000, /* R9037 */
+ 0x0000, /* R9038 */
+ 0x0000, /* R9039 */
+ 0x0000, /* R9040 */
+ 0x0000, /* R9041 */
+ 0x0000, /* R9042 */
+ 0x0000, /* R9043 */
+ 0x0000, /* R9044 */
+ 0x0000, /* R9045 */
+ 0x0000, /* R9046 */
+ 0x0000, /* R9047 */
+ 0x0000, /* R9048 */
+ 0x0000, /* R9049 */
+ 0x0000, /* R9050 */
+ 0x0000, /* R9051 */
+ 0x0000, /* R9052 */
+ 0x0000, /* R9053 */
+ 0x0000, /* R9054 */
+ 0x0000, /* R9055 */
+ 0x0000, /* R9056 */
+ 0x0000, /* R9057 */
+ 0x0000, /* R9058 */
+ 0x0000, /* R9059 */
+ 0x0000, /* R9060 */
+ 0x0000, /* R9061 */
+ 0x0000, /* R9062 */
+ 0x0000, /* R9063 */
+ 0x0000, /* R9064 */
+ 0x0000, /* R9065 */
+ 0x0000, /* R9066 */
+ 0x0000, /* R9067 */
+ 0x0000, /* R9068 */
+ 0x0000, /* R9069 */
+ 0x0000, /* R9070 */
+ 0x0000, /* R9071 */
+ 0x0000, /* R9072 */
+ 0x0000, /* R9073 */
+ 0x0000, /* R9074 */
+ 0x0000, /* R9075 */
+ 0x0000, /* R9076 */
+ 0x0000, /* R9077 */
+ 0x0000, /* R9078 */
+ 0x0000, /* R9079 */
+ 0x0000, /* R9080 */
+ 0x0000, /* R9081 */
+ 0x0000, /* R9082 */
+ 0x0000, /* R9083 */
+ 0x0000, /* R9084 */
+ 0x0000, /* R9085 */
+ 0x0000, /* R9086 */
+ 0x0000, /* R9087 */
+ 0x0000, /* R9088 */
+ 0x0000, /* R9089 */
+ 0x0000, /* R9090 */
+ 0x0000, /* R9091 */
+ 0x0000, /* R9092 */
+ 0x0000, /* R9093 */
+ 0x0000, /* R9094 */
+ 0x0000, /* R9095 */
+ 0x0000, /* R9096 */
+ 0x0000, /* R9097 */
+ 0x0000, /* R9098 */
+ 0x0000, /* R9099 */
+ 0x0000, /* R9100 */
+ 0x0000, /* R9101 */
+ 0x0000, /* R9102 */
+ 0x0000, /* R9103 */
+ 0x0000, /* R9104 */
+ 0x0000, /* R9105 */
+ 0x0000, /* R9106 */
+ 0x0000, /* R9107 */
+ 0x0000, /* R9108 */
+ 0x0000, /* R9109 */
+ 0x0000, /* R9110 */
+ 0x0000, /* R9111 */
+ 0x0000, /* R9112 */
+ 0x0000, /* R9113 */
+ 0x0000, /* R9114 */
+ 0x0000, /* R9115 */
+ 0x0000, /* R9116 */
+ 0x0000, /* R9117 */
+ 0x0000, /* R9118 */
+ 0x0000, /* R9119 */
+ 0x0000, /* R9120 */
+ 0x0000, /* R9121 */
+ 0x0000, /* R9122 */
+ 0x0000, /* R9123 */
+ 0x0000, /* R9124 */
+ 0x0000, /* R9125 */
+ 0x0000, /* R9126 */
+ 0x0000, /* R9127 */
+ 0x0000, /* R9128 */
+ 0x0000, /* R9129 */
+ 0x0000, /* R9130 */
+ 0x0000, /* R9131 */
+ 0x0000, /* R9132 */
+ 0x0000, /* R9133 */
+ 0x0000, /* R9134 */
+ 0x0000, /* R9135 */
+ 0x0000, /* R9136 */
+ 0x0000, /* R9137 */
+ 0x0000, /* R9138 */
+ 0x0000, /* R9139 */
+ 0x0000, /* R9140 */
+ 0x0000, /* R9141 */
+ 0x0000, /* R9142 */
+ 0x0000, /* R9143 */
+ 0x0000, /* R9144 */
+ 0x0000, /* R9145 */
+ 0x0000, /* R9146 */
+ 0x0000, /* R9147 */
+ 0x0000, /* R9148 */
+ 0x0000, /* R9149 */
+ 0x0000, /* R9150 */
+ 0x0000, /* R9151 */
+ 0x0000, /* R9152 */
+ 0x0000, /* R9153 */
+ 0x0000, /* R9154 */
+ 0x0000, /* R9155 */
+ 0x0000, /* R9156 */
+ 0x0000, /* R9157 */
+ 0x0000, /* R9158 */
+ 0x0000, /* R9159 */
+ 0x0000, /* R9160 */
+ 0x0000, /* R9161 */
+ 0x0000, /* R9162 */
+ 0x0000, /* R9163 */
+ 0x0000, /* R9164 */
+ 0x0000, /* R9165 */
+ 0x0000, /* R9166 */
+ 0x0000, /* R9167 */
+ 0x0000, /* R9168 */
+ 0x0000, /* R9169 */
+ 0x0000, /* R9170 */
+ 0x0000, /* R9171 */
+ 0x0000, /* R9172 */
+ 0x0000, /* R9173 */
+ 0x0000, /* R9174 */
+ 0x0000, /* R9175 */
+ 0x0000, /* R9176 */
+ 0x0000, /* R9177 */
+ 0x0000, /* R9178 */
+ 0x0000, /* R9179 */
+ 0x0000, /* R9180 */
+ 0x0000, /* R9181 */
+ 0x0000, /* R9182 */
+ 0x0000, /* R9183 */
+ 0x0000, /* R9184 */
+ 0x0000, /* R9185 */
+ 0x0000, /* R9186 */
+ 0x0000, /* R9187 */
+ 0x0000, /* R9188 */
+ 0x0000, /* R9189 */
+ 0x0000, /* R9190 */
+ 0x0000, /* R9191 */
+ 0x0000, /* R9192 */
+ 0x0000, /* R9193 */
+ 0x0000, /* R9194 */
+ 0x0000, /* R9195 */
+ 0x0000, /* R9196 */
+ 0x0000, /* R9197 */
+ 0x0000, /* R9198 */
+ 0x0000, /* R9199 */
+ 0x0000, /* R9200 */
+ 0x0000, /* R9201 */
+ 0x0000, /* R9202 */
+ 0x0000, /* R9203 */
+ 0x0000, /* R9204 */
+ 0x0000, /* R9205 */
+ 0x0000, /* R9206 */
+ 0x0000, /* R9207 */
+ 0x0000, /* R9208 */
+ 0x0000, /* R9209 */
+ 0x0000, /* R9210 */
+ 0x0000, /* R9211 */
+ 0x0000, /* R9212 */
+ 0x0000, /* R9213 */
+ 0x0000, /* R9214 */
+ 0x0000, /* R9215 */
+ 0x0030, /* R9216 - DSP2 Address RAM 2 */
+ 0x0000, /* R9217 - DSP2 Address RAM 1 */
+ 0x0000, /* R9218 - DSP2 Address RAM 0 */
+ 0x0000, /* R9219 */
+ 0x0000, /* R9220 */
+ 0x0000, /* R9221 */
+ 0x0000, /* R9222 */
+ 0x0000, /* R9223 */
+ 0x0000, /* R9224 */
+ 0x0000, /* R9225 */
+ 0x0000, /* R9226 */
+ 0x0000, /* R9227 */
+ 0x0000, /* R9228 */
+ 0x0000, /* R9229 */
+ 0x0000, /* R9230 */
+ 0x0000, /* R9231 */
+ 0x0000, /* R9232 */
+ 0x0000, /* R9233 */
+ 0x0000, /* R9234 */
+ 0x0000, /* R9235 */
+ 0x0000, /* R9236 */
+ 0x0000, /* R9237 */
+ 0x0000, /* R9238 */
+ 0x0000, /* R9239 */
+ 0x0000, /* R9240 */
+ 0x0000, /* R9241 */
+ 0x0000, /* R9242 */
+ 0x0000, /* R9243 */
+ 0x0000, /* R9244 */
+ 0x0000, /* R9245 */
+ 0x0000, /* R9246 */
+ 0x0000, /* R9247 */
+ 0x0000, /* R9248 */
+ 0x0000, /* R9249 */
+ 0x0000, /* R9250 */
+ 0x0000, /* R9251 */
+ 0x0000, /* R9252 */
+ 0x0000, /* R9253 */
+ 0x0000, /* R9254 */
+ 0x0000, /* R9255 */
+ 0x0000, /* R9256 */
+ 0x0000, /* R9257 */
+ 0x0000, /* R9258 */
+ 0x0000, /* R9259 */
+ 0x0000, /* R9260 */
+ 0x0000, /* R9261 */
+ 0x0000, /* R9262 */
+ 0x0000, /* R9263 */
+ 0x0000, /* R9264 */
+ 0x0000, /* R9265 */
+ 0x0000, /* R9266 */
+ 0x0000, /* R9267 */
+ 0x0000, /* R9268 */
+ 0x0000, /* R9269 */
+ 0x0000, /* R9270 */
+ 0x0000, /* R9271 */
+ 0x0000, /* R9272 */
+ 0x0000, /* R9273 */
+ 0x0000, /* R9274 */
+ 0x0000, /* R9275 */
+ 0x0000, /* R9276 */
+ 0x0000, /* R9277 */
+ 0x0000, /* R9278 */
+ 0x0000, /* R9279 */
+ 0x0000, /* R9280 */
+ 0x0000, /* R9281 */
+ 0x0000, /* R9282 */
+ 0x0000, /* R9283 */
+ 0x0000, /* R9284 */
+ 0x0000, /* R9285 */
+ 0x0000, /* R9286 */
+ 0x0000, /* R9287 */
+ 0x0000, /* R9288 */
+ 0x0000, /* R9289 */
+ 0x0000, /* R9290 */
+ 0x0000, /* R9291 */
+ 0x0000, /* R9292 */
+ 0x0000, /* R9293 */
+ 0x0000, /* R9294 */
+ 0x0000, /* R9295 */
+ 0x0000, /* R9296 */
+ 0x0000, /* R9297 */
+ 0x0000, /* R9298 */
+ 0x0000, /* R9299 */
+ 0x0000, /* R9300 */
+ 0x0000, /* R9301 */
+ 0x0000, /* R9302 */
+ 0x0000, /* R9303 */
+ 0x0000, /* R9304 */
+ 0x0000, /* R9305 */
+ 0x0000, /* R9306 */
+ 0x0000, /* R9307 */
+ 0x0000, /* R9308 */
+ 0x0000, /* R9309 */
+ 0x0000, /* R9310 */
+ 0x0000, /* R9311 */
+ 0x0000, /* R9312 */
+ 0x0000, /* R9313 */
+ 0x0000, /* R9314 */
+ 0x0000, /* R9315 */
+ 0x0000, /* R9316 */
+ 0x0000, /* R9317 */
+ 0x0000, /* R9318 */
+ 0x0000, /* R9319 */
+ 0x0000, /* R9320 */
+ 0x0000, /* R9321 */
+ 0x0000, /* R9322 */
+ 0x0000, /* R9323 */
+ 0x0000, /* R9324 */
+ 0x0000, /* R9325 */
+ 0x0000, /* R9326 */
+ 0x0000, /* R9327 */
+ 0x0000, /* R9328 */
+ 0x0000, /* R9329 */
+ 0x0000, /* R9330 */
+ 0x0000, /* R9331 */
+ 0x0000, /* R9332 */
+ 0x0000, /* R9333 */
+ 0x0000, /* R9334 */
+ 0x0000, /* R9335 */
+ 0x0000, /* R9336 */
+ 0x0000, /* R9337 */
+ 0x0000, /* R9338 */
+ 0x0000, /* R9339 */
+ 0x0000, /* R9340 */
+ 0x0000, /* R9341 */
+ 0x0000, /* R9342 */
+ 0x0000, /* R9343 */
+ 0x0000, /* R9344 */
+ 0x0000, /* R9345 */
+ 0x0000, /* R9346 */
+ 0x0000, /* R9347 */
+ 0x0000, /* R9348 */
+ 0x0000, /* R9349 */
+ 0x0000, /* R9350 */
+ 0x0000, /* R9351 */
+ 0x0000, /* R9352 */
+ 0x0000, /* R9353 */
+ 0x0000, /* R9354 */
+ 0x0000, /* R9355 */
+ 0x0000, /* R9356 */
+ 0x0000, /* R9357 */
+ 0x0000, /* R9358 */
+ 0x0000, /* R9359 */
+ 0x0000, /* R9360 */
+ 0x0000, /* R9361 */
+ 0x0000, /* R9362 */
+ 0x0000, /* R9363 */
+ 0x0000, /* R9364 */
+ 0x0000, /* R9365 */
+ 0x0000, /* R9366 */
+ 0x0000, /* R9367 */
+ 0x0000, /* R9368 */
+ 0x0000, /* R9369 */
+ 0x0000, /* R9370 */
+ 0x0000, /* R9371 */
+ 0x0000, /* R9372 */
+ 0x0000, /* R9373 */
+ 0x0000, /* R9374 */
+ 0x0000, /* R9375 */
+ 0x0000, /* R9376 */
+ 0x0000, /* R9377 */
+ 0x0000, /* R9378 */
+ 0x0000, /* R9379 */
+ 0x0000, /* R9380 */
+ 0x0000, /* R9381 */
+ 0x0000, /* R9382 */
+ 0x0000, /* R9383 */
+ 0x0000, /* R9384 */
+ 0x0000, /* R9385 */
+ 0x0000, /* R9386 */
+ 0x0000, /* R9387 */
+ 0x0000, /* R9388 */
+ 0x0000, /* R9389 */
+ 0x0000, /* R9390 */
+ 0x0000, /* R9391 */
+ 0x0000, /* R9392 */
+ 0x0000, /* R9393 */
+ 0x0000, /* R9394 */
+ 0x0000, /* R9395 */
+ 0x0000, /* R9396 */
+ 0x0000, /* R9397 */
+ 0x0000, /* R9398 */
+ 0x0000, /* R9399 */
+ 0x0000, /* R9400 */
+ 0x0000, /* R9401 */
+ 0x0000, /* R9402 */
+ 0x0000, /* R9403 */
+ 0x0000, /* R9404 */
+ 0x0000, /* R9405 */
+ 0x0000, /* R9406 */
+ 0x0000, /* R9407 */
+ 0x0000, /* R9408 */
+ 0x0000, /* R9409 */
+ 0x0000, /* R9410 */
+ 0x0000, /* R9411 */
+ 0x0000, /* R9412 */
+ 0x0000, /* R9413 */
+ 0x0000, /* R9414 */
+ 0x0000, /* R9415 */
+ 0x0000, /* R9416 */
+ 0x0000, /* R9417 */
+ 0x0000, /* R9418 */
+ 0x0000, /* R9419 */
+ 0x0000, /* R9420 */
+ 0x0000, /* R9421 */
+ 0x0000, /* R9422 */
+ 0x0000, /* R9423 */
+ 0x0000, /* R9424 */
+ 0x0000, /* R9425 */
+ 0x0000, /* R9426 */
+ 0x0000, /* R9427 */
+ 0x0000, /* R9428 */
+ 0x0000, /* R9429 */
+ 0x0000, /* R9430 */
+ 0x0000, /* R9431 */
+ 0x0000, /* R9432 */
+ 0x0000, /* R9433 */
+ 0x0000, /* R9434 */
+ 0x0000, /* R9435 */
+ 0x0000, /* R9436 */
+ 0x0000, /* R9437 */
+ 0x0000, /* R9438 */
+ 0x0000, /* R9439 */
+ 0x0000, /* R9440 */
+ 0x0000, /* R9441 */
+ 0x0000, /* R9442 */
+ 0x0000, /* R9443 */
+ 0x0000, /* R9444 */
+ 0x0000, /* R9445 */
+ 0x0000, /* R9446 */
+ 0x0000, /* R9447 */
+ 0x0000, /* R9448 */
+ 0x0000, /* R9449 */
+ 0x0000, /* R9450 */
+ 0x0000, /* R9451 */
+ 0x0000, /* R9452 */
+ 0x0000, /* R9453 */
+ 0x0000, /* R9454 */
+ 0x0000, /* R9455 */
+ 0x0000, /* R9456 */
+ 0x0000, /* R9457 */
+ 0x0000, /* R9458 */
+ 0x0000, /* R9459 */
+ 0x0000, /* R9460 */
+ 0x0000, /* R9461 */
+ 0x0000, /* R9462 */
+ 0x0000, /* R9463 */
+ 0x0000, /* R9464 */
+ 0x0000, /* R9465 */
+ 0x0000, /* R9466 */
+ 0x0000, /* R9467 */
+ 0x0000, /* R9468 */
+ 0x0000, /* R9469 */
+ 0x0000, /* R9470 */
+ 0x0000, /* R9471 */
+ 0x0000, /* R9472 */
+ 0x0000, /* R9473 */
+ 0x0000, /* R9474 */
+ 0x0000, /* R9475 */
+ 0x0000, /* R9476 */
+ 0x0000, /* R9477 */
+ 0x0000, /* R9478 */
+ 0x0000, /* R9479 */
+ 0x0000, /* R9480 */
+ 0x0000, /* R9481 */
+ 0x0000, /* R9482 */
+ 0x0000, /* R9483 */
+ 0x0000, /* R9484 */
+ 0x0000, /* R9485 */
+ 0x0000, /* R9486 */
+ 0x0000, /* R9487 */
+ 0x0000, /* R9488 */
+ 0x0000, /* R9489 */
+ 0x0000, /* R9490 */
+ 0x0000, /* R9491 */
+ 0x0000, /* R9492 */
+ 0x0000, /* R9493 */
+ 0x0000, /* R9494 */
+ 0x0000, /* R9495 */
+ 0x0000, /* R9496 */
+ 0x0000, /* R9497 */
+ 0x0000, /* R9498 */
+ 0x0000, /* R9499 */
+ 0x0000, /* R9500 */
+ 0x0000, /* R9501 */
+ 0x0000, /* R9502 */
+ 0x0000, /* R9503 */
+ 0x0000, /* R9504 */
+ 0x0000, /* R9505 */
+ 0x0000, /* R9506 */
+ 0x0000, /* R9507 */
+ 0x0000, /* R9508 */
+ 0x0000, /* R9509 */
+ 0x0000, /* R9510 */
+ 0x0000, /* R9511 */
+ 0x0000, /* R9512 */
+ 0x0000, /* R9513 */
+ 0x0000, /* R9514 */
+ 0x0000, /* R9515 */
+ 0x0000, /* R9516 */
+ 0x0000, /* R9517 */
+ 0x0000, /* R9518 */
+ 0x0000, /* R9519 */
+ 0x0000, /* R9520 */
+ 0x0000, /* R9521 */
+ 0x0000, /* R9522 */
+ 0x0000, /* R9523 */
+ 0x0000, /* R9524 */
+ 0x0000, /* R9525 */
+ 0x0000, /* R9526 */
+ 0x0000, /* R9527 */
+ 0x0000, /* R9528 */
+ 0x0000, /* R9529 */
+ 0x0000, /* R9530 */
+ 0x0000, /* R9531 */
+ 0x0000, /* R9532 */
+ 0x0000, /* R9533 */
+ 0x0000, /* R9534 */
+ 0x0000, /* R9535 */
+ 0x0000, /* R9536 */
+ 0x0000, /* R9537 */
+ 0x0000, /* R9538 */
+ 0x0000, /* R9539 */
+ 0x0000, /* R9540 */
+ 0x0000, /* R9541 */
+ 0x0000, /* R9542 */
+ 0x0000, /* R9543 */
+ 0x0000, /* R9544 */
+ 0x0000, /* R9545 */
+ 0x0000, /* R9546 */
+ 0x0000, /* R9547 */
+ 0x0000, /* R9548 */
+ 0x0000, /* R9549 */
+ 0x0000, /* R9550 */
+ 0x0000, /* R9551 */
+ 0x0000, /* R9552 */
+ 0x0000, /* R9553 */
+ 0x0000, /* R9554 */
+ 0x0000, /* R9555 */
+ 0x0000, /* R9556 */
+ 0x0000, /* R9557 */
+ 0x0000, /* R9558 */
+ 0x0000, /* R9559 */
+ 0x0000, /* R9560 */
+ 0x0000, /* R9561 */
+ 0x0000, /* R9562 */
+ 0x0000, /* R9563 */
+ 0x0000, /* R9564 */
+ 0x0000, /* R9565 */
+ 0x0000, /* R9566 */
+ 0x0000, /* R9567 */
+ 0x0000, /* R9568 */
+ 0x0000, /* R9569 */
+ 0x0000, /* R9570 */
+ 0x0000, /* R9571 */
+ 0x0000, /* R9572 */
+ 0x0000, /* R9573 */
+ 0x0000, /* R9574 */
+ 0x0000, /* R9575 */
+ 0x0000, /* R9576 */
+ 0x0000, /* R9577 */
+ 0x0000, /* R9578 */
+ 0x0000, /* R9579 */
+ 0x0000, /* R9580 */
+ 0x0000, /* R9581 */
+ 0x0000, /* R9582 */
+ 0x0000, /* R9583 */
+ 0x0000, /* R9584 */
+ 0x0000, /* R9585 */
+ 0x0000, /* R9586 */
+ 0x0000, /* R9587 */
+ 0x0000, /* R9588 */
+ 0x0000, /* R9589 */
+ 0x0000, /* R9590 */
+ 0x0000, /* R9591 */
+ 0x0000, /* R9592 */
+ 0x0000, /* R9593 */
+ 0x0000, /* R9594 */
+ 0x0000, /* R9595 */
+ 0x0000, /* R9596 */
+ 0x0000, /* R9597 */
+ 0x0000, /* R9598 */
+ 0x0000, /* R9599 */
+ 0x0000, /* R9600 */
+ 0x0000, /* R9601 */
+ 0x0000, /* R9602 */
+ 0x0000, /* R9603 */
+ 0x0000, /* R9604 */
+ 0x0000, /* R9605 */
+ 0x0000, /* R9606 */
+ 0x0000, /* R9607 */
+ 0x0000, /* R9608 */
+ 0x0000, /* R9609 */
+ 0x0000, /* R9610 */
+ 0x0000, /* R9611 */
+ 0x0000, /* R9612 */
+ 0x0000, /* R9613 */
+ 0x0000, /* R9614 */
+ 0x0000, /* R9615 */
+ 0x0000, /* R9616 */
+ 0x0000, /* R9617 */
+ 0x0000, /* R9618 */
+ 0x0000, /* R9619 */
+ 0x0000, /* R9620 */
+ 0x0000, /* R9621 */
+ 0x0000, /* R9622 */
+ 0x0000, /* R9623 */
+ 0x0000, /* R9624 */
+ 0x0000, /* R9625 */
+ 0x0000, /* R9626 */
+ 0x0000, /* R9627 */
+ 0x0000, /* R9628 */
+ 0x0000, /* R9629 */
+ 0x0000, /* R9630 */
+ 0x0000, /* R9631 */
+ 0x0000, /* R9632 */
+ 0x0000, /* R9633 */
+ 0x0000, /* R9634 */
+ 0x0000, /* R9635 */
+ 0x0000, /* R9636 */
+ 0x0000, /* R9637 */
+ 0x0000, /* R9638 */
+ 0x0000, /* R9639 */
+ 0x0000, /* R9640 */
+ 0x0000, /* R9641 */
+ 0x0000, /* R9642 */
+ 0x0000, /* R9643 */
+ 0x0000, /* R9644 */
+ 0x0000, /* R9645 */
+ 0x0000, /* R9646 */
+ 0x0000, /* R9647 */
+ 0x0000, /* R9648 */
+ 0x0000, /* R9649 */
+ 0x0000, /* R9650 */
+ 0x0000, /* R9651 */
+ 0x0000, /* R9652 */
+ 0x0000, /* R9653 */
+ 0x0000, /* R9654 */
+ 0x0000, /* R9655 */
+ 0x0000, /* R9656 */
+ 0x0000, /* R9657 */
+ 0x0000, /* R9658 */
+ 0x0000, /* R9659 */
+ 0x0000, /* R9660 */
+ 0x0000, /* R9661 */
+ 0x0000, /* R9662 */
+ 0x0000, /* R9663 */
+ 0x0000, /* R9664 */
+ 0x0000, /* R9665 */
+ 0x0000, /* R9666 */
+ 0x0000, /* R9667 */
+ 0x0000, /* R9668 */
+ 0x0000, /* R9669 */
+ 0x0000, /* R9670 */
+ 0x0000, /* R9671 */
+ 0x0000, /* R9672 */
+ 0x0000, /* R9673 */
+ 0x0000, /* R9674 */
+ 0x0000, /* R9675 */
+ 0x0000, /* R9676 */
+ 0x0000, /* R9677 */
+ 0x0000, /* R9678 */
+ 0x0000, /* R9679 */
+ 0x0000, /* R9680 */
+ 0x0000, /* R9681 */
+ 0x0000, /* R9682 */
+ 0x0000, /* R9683 */
+ 0x0000, /* R9684 */
+ 0x0000, /* R9685 */
+ 0x0000, /* R9686 */
+ 0x0000, /* R9687 */
+ 0x0000, /* R9688 */
+ 0x0000, /* R9689 */
+ 0x0000, /* R9690 */
+ 0x0000, /* R9691 */
+ 0x0000, /* R9692 */
+ 0x0000, /* R9693 */
+ 0x0000, /* R9694 */
+ 0x0000, /* R9695 */
+ 0x0000, /* R9696 */
+ 0x0000, /* R9697 */
+ 0x0000, /* R9698 */
+ 0x0000, /* R9699 */
+ 0x0000, /* R9700 */
+ 0x0000, /* R9701 */
+ 0x0000, /* R9702 */
+ 0x0000, /* R9703 */
+ 0x0000, /* R9704 */
+ 0x0000, /* R9705 */
+ 0x0000, /* R9706 */
+ 0x0000, /* R9707 */
+ 0x0000, /* R9708 */
+ 0x0000, /* R9709 */
+ 0x0000, /* R9710 */
+ 0x0000, /* R9711 */
+ 0x0000, /* R9712 */
+ 0x0000, /* R9713 */
+ 0x0000, /* R9714 */
+ 0x0000, /* R9715 */
+ 0x0000, /* R9716 */
+ 0x0000, /* R9717 */
+ 0x0000, /* R9718 */
+ 0x0000, /* R9719 */
+ 0x0000, /* R9720 */
+ 0x0000, /* R9721 */
+ 0x0000, /* R9722 */
+ 0x0000, /* R9723 */
+ 0x0000, /* R9724 */
+ 0x0000, /* R9725 */
+ 0x0000, /* R9726 */
+ 0x0000, /* R9727 */
+ 0x0000, /* R9728 */
+ 0x0000, /* R9729 */
+ 0x0000, /* R9730 */
+ 0x0000, /* R9731 */
+ 0x0000, /* R9732 */
+ 0x0000, /* R9733 */
+ 0x0000, /* R9734 */
+ 0x0000, /* R9735 */
+ 0x0000, /* R9736 */
+ 0x0000, /* R9737 */
+ 0x0000, /* R9738 */
+ 0x0000, /* R9739 */
+ 0x0000, /* R9740 */
+ 0x0000, /* R9741 */
+ 0x0000, /* R9742 */
+ 0x0000, /* R9743 */
+ 0x0000, /* R9744 */
+ 0x0000, /* R9745 */
+ 0x0000, /* R9746 */
+ 0x0000, /* R9747 */
+ 0x0000, /* R9748 */
+ 0x0000, /* R9749 */
+ 0x0000, /* R9750 */
+ 0x0000, /* R9751 */
+ 0x0000, /* R9752 */
+ 0x0000, /* R9753 */
+ 0x0000, /* R9754 */
+ 0x0000, /* R9755 */
+ 0x0000, /* R9756 */
+ 0x0000, /* R9757 */
+ 0x0000, /* R9758 */
+ 0x0000, /* R9759 */
+ 0x0000, /* R9760 */
+ 0x0000, /* R9761 */
+ 0x0000, /* R9762 */
+ 0x0000, /* R9763 */
+ 0x0000, /* R9764 */
+ 0x0000, /* R9765 */
+ 0x0000, /* R9766 */
+ 0x0000, /* R9767 */
+ 0x0000, /* R9768 */
+ 0x0000, /* R9769 */
+ 0x0000, /* R9770 */
+ 0x0000, /* R9771 */
+ 0x0000, /* R9772 */
+ 0x0000, /* R9773 */
+ 0x0000, /* R9774 */
+ 0x0000, /* R9775 */
+ 0x0000, /* R9776 */
+ 0x0000, /* R9777 */
+ 0x0000, /* R9778 */
+ 0x0000, /* R9779 */
+ 0x0000, /* R9780 */
+ 0x0000, /* R9781 */
+ 0x0000, /* R9782 */
+ 0x0000, /* R9783 */
+ 0x0000, /* R9784 */
+ 0x0000, /* R9785 */
+ 0x0000, /* R9786 */
+ 0x0000, /* R9787 */
+ 0x0000, /* R9788 */
+ 0x0000, /* R9789 */
+ 0x0000, /* R9790 */
+ 0x0000, /* R9791 */
+ 0x0000, /* R9792 */
+ 0x0000, /* R9793 */
+ 0x0000, /* R9794 */
+ 0x0000, /* R9795 */
+ 0x0000, /* R9796 */
+ 0x0000, /* R9797 */
+ 0x0000, /* R9798 */
+ 0x0000, /* R9799 */
+ 0x0000, /* R9800 */
+ 0x0000, /* R9801 */
+ 0x0000, /* R9802 */
+ 0x0000, /* R9803 */
+ 0x0000, /* R9804 */
+ 0x0000, /* R9805 */
+ 0x0000, /* R9806 */
+ 0x0000, /* R9807 */
+ 0x0000, /* R9808 */
+ 0x0000, /* R9809 */
+ 0x0000, /* R9810 */
+ 0x0000, /* R9811 */
+ 0x0000, /* R9812 */
+ 0x0000, /* R9813 */
+ 0x0000, /* R9814 */
+ 0x0000, /* R9815 */
+ 0x0000, /* R9816 */
+ 0x0000, /* R9817 */
+ 0x0000, /* R9818 */
+ 0x0000, /* R9819 */
+ 0x0000, /* R9820 */
+ 0x0000, /* R9821 */
+ 0x0000, /* R9822 */
+ 0x0000, /* R9823 */
+ 0x0000, /* R9824 */
+ 0x0000, /* R9825 */
+ 0x0000, /* R9826 */
+ 0x0000, /* R9827 */
+ 0x0000, /* R9828 */
+ 0x0000, /* R9829 */
+ 0x0000, /* R9830 */
+ 0x0000, /* R9831 */
+ 0x0000, /* R9832 */
+ 0x0000, /* R9833 */
+ 0x0000, /* R9834 */
+ 0x0000, /* R9835 */
+ 0x0000, /* R9836 */
+ 0x0000, /* R9837 */
+ 0x0000, /* R9838 */
+ 0x0000, /* R9839 */
+ 0x0000, /* R9840 */
+ 0x0000, /* R9841 */
+ 0x0000, /* R9842 */
+ 0x0000, /* R9843 */
+ 0x0000, /* R9844 */
+ 0x0000, /* R9845 */
+ 0x0000, /* R9846 */
+ 0x0000, /* R9847 */
+ 0x0000, /* R9848 */
+ 0x0000, /* R9849 */
+ 0x0000, /* R9850 */
+ 0x0000, /* R9851 */
+ 0x0000, /* R9852 */
+ 0x0000, /* R9853 */
+ 0x0000, /* R9854 */
+ 0x0000, /* R9855 */
+ 0x0000, /* R9856 */
+ 0x0000, /* R9857 */
+ 0x0000, /* R9858 */
+ 0x0000, /* R9859 */
+ 0x0000, /* R9860 */
+ 0x0000, /* R9861 */
+ 0x0000, /* R9862 */
+ 0x0000, /* R9863 */
+ 0x0000, /* R9864 */
+ 0x0000, /* R9865 */
+ 0x0000, /* R9866 */
+ 0x0000, /* R9867 */
+ 0x0000, /* R9868 */
+ 0x0000, /* R9869 */
+ 0x0000, /* R9870 */
+ 0x0000, /* R9871 */
+ 0x0000, /* R9872 */
+ 0x0000, /* R9873 */
+ 0x0000, /* R9874 */
+ 0x0000, /* R9875 */
+ 0x0000, /* R9876 */
+ 0x0000, /* R9877 */
+ 0x0000, /* R9878 */
+ 0x0000, /* R9879 */
+ 0x0000, /* R9880 */
+ 0x0000, /* R9881 */
+ 0x0000, /* R9882 */
+ 0x0000, /* R9883 */
+ 0x0000, /* R9884 */
+ 0x0000, /* R9885 */
+ 0x0000, /* R9886 */
+ 0x0000, /* R9887 */
+ 0x0000, /* R9888 */
+ 0x0000, /* R9889 */
+ 0x0000, /* R9890 */
+ 0x0000, /* R9891 */
+ 0x0000, /* R9892 */
+ 0x0000, /* R9893 */
+ 0x0000, /* R9894 */
+ 0x0000, /* R9895 */
+ 0x0000, /* R9896 */
+ 0x0000, /* R9897 */
+ 0x0000, /* R9898 */
+ 0x0000, /* R9899 */
+ 0x0000, /* R9900 */
+ 0x0000, /* R9901 */
+ 0x0000, /* R9902 */
+ 0x0000, /* R9903 */
+ 0x0000, /* R9904 */
+ 0x0000, /* R9905 */
+ 0x0000, /* R9906 */
+ 0x0000, /* R9907 */
+ 0x0000, /* R9908 */
+ 0x0000, /* R9909 */
+ 0x0000, /* R9910 */
+ 0x0000, /* R9911 */
+ 0x0000, /* R9912 */
+ 0x0000, /* R9913 */
+ 0x0000, /* R9914 */
+ 0x0000, /* R9915 */
+ 0x0000, /* R9916 */
+ 0x0000, /* R9917 */
+ 0x0000, /* R9918 */
+ 0x0000, /* R9919 */
+ 0x0000, /* R9920 */
+ 0x0000, /* R9921 */
+ 0x0000, /* R9922 */
+ 0x0000, /* R9923 */
+ 0x0000, /* R9924 */
+ 0x0000, /* R9925 */
+ 0x0000, /* R9926 */
+ 0x0000, /* R9927 */
+ 0x0000, /* R9928 */
+ 0x0000, /* R9929 */
+ 0x0000, /* R9930 */
+ 0x0000, /* R9931 */
+ 0x0000, /* R9932 */
+ 0x0000, /* R9933 */
+ 0x0000, /* R9934 */
+ 0x0000, /* R9935 */
+ 0x0000, /* R9936 */
+ 0x0000, /* R9937 */
+ 0x0000, /* R9938 */
+ 0x0000, /* R9939 */
+ 0x0000, /* R9940 */
+ 0x0000, /* R9941 */
+ 0x0000, /* R9942 */
+ 0x0000, /* R9943 */
+ 0x0000, /* R9944 */
+ 0x0000, /* R9945 */
+ 0x0000, /* R9946 */
+ 0x0000, /* R9947 */
+ 0x0000, /* R9948 */
+ 0x0000, /* R9949 */
+ 0x0000, /* R9950 */
+ 0x0000, /* R9951 */
+ 0x0000, /* R9952 */
+ 0x0000, /* R9953 */
+ 0x0000, /* R9954 */
+ 0x0000, /* R9955 */
+ 0x0000, /* R9956 */
+ 0x0000, /* R9957 */
+ 0x0000, /* R9958 */
+ 0x0000, /* R9959 */
+ 0x0000, /* R9960 */
+ 0x0000, /* R9961 */
+ 0x0000, /* R9962 */
+ 0x0000, /* R9963 */
+ 0x0000, /* R9964 */
+ 0x0000, /* R9965 */
+ 0x0000, /* R9966 */
+ 0x0000, /* R9967 */
+ 0x0000, /* R9968 */
+ 0x0000, /* R9969 */
+ 0x0000, /* R9970 */
+ 0x0000, /* R9971 */
+ 0x0000, /* R9972 */
+ 0x0000, /* R9973 */
+ 0x0000, /* R9974 */
+ 0x0000, /* R9975 */
+ 0x0000, /* R9976 */
+ 0x0000, /* R9977 */
+ 0x0000, /* R9978 */
+ 0x0000, /* R9979 */
+ 0x0000, /* R9980 */
+ 0x0000, /* R9981 */
+ 0x0000, /* R9982 */
+ 0x0000, /* R9983 */
+ 0x0000, /* R9984 */
+ 0x0000, /* R9985 */
+ 0x0000, /* R9986 */
+ 0x0000, /* R9987 */
+ 0x0000, /* R9988 */
+ 0x0000, /* R9989 */
+ 0x0000, /* R9990 */
+ 0x0000, /* R9991 */
+ 0x0000, /* R9992 */
+ 0x0000, /* R9993 */
+ 0x0000, /* R9994 */
+ 0x0000, /* R9995 */
+ 0x0000, /* R9996 */
+ 0x0000, /* R9997 */
+ 0x0000, /* R9998 */
+ 0x0000, /* R9999 */
+ 0x0000, /* R10000 */
+ 0x0000, /* R10001 */
+ 0x0000, /* R10002 */
+ 0x0000, /* R10003 */
+ 0x0000, /* R10004 */
+ 0x0000, /* R10005 */
+ 0x0000, /* R10006 */
+ 0x0000, /* R10007 */
+ 0x0000, /* R10008 */
+ 0x0000, /* R10009 */
+ 0x0000, /* R10010 */
+ 0x0000, /* R10011 */
+ 0x0000, /* R10012 */
+ 0x0000, /* R10013 */
+ 0x0000, /* R10014 */
+ 0x0000, /* R10015 */
+ 0x0000, /* R10016 */
+ 0x0000, /* R10017 */
+ 0x0000, /* R10018 */
+ 0x0000, /* R10019 */
+ 0x0000, /* R10020 */
+ 0x0000, /* R10021 */
+ 0x0000, /* R10022 */
+ 0x0000, /* R10023 */
+ 0x0000, /* R10024 */
+ 0x0000, /* R10025 */
+ 0x0000, /* R10026 */
+ 0x0000, /* R10027 */
+ 0x0000, /* R10028 */
+ 0x0000, /* R10029 */
+ 0x0000, /* R10030 */
+ 0x0000, /* R10031 */
+ 0x0000, /* R10032 */
+ 0x0000, /* R10033 */
+ 0x0000, /* R10034 */
+ 0x0000, /* R10035 */
+ 0x0000, /* R10036 */
+ 0x0000, /* R10037 */
+ 0x0000, /* R10038 */
+ 0x0000, /* R10039 */
+ 0x0000, /* R10040 */
+ 0x0000, /* R10041 */
+ 0x0000, /* R10042 */
+ 0x0000, /* R10043 */
+ 0x0000, /* R10044 */
+ 0x0000, /* R10045 */
+ 0x0000, /* R10046 */
+ 0x0000, /* R10047 */
+ 0x0000, /* R10048 */
+ 0x0000, /* R10049 */
+ 0x0000, /* R10050 */
+ 0x0000, /* R10051 */
+ 0x0000, /* R10052 */
+ 0x0000, /* R10053 */
+ 0x0000, /* R10054 */
+ 0x0000, /* R10055 */
+ 0x0000, /* R10056 */
+ 0x0000, /* R10057 */
+ 0x0000, /* R10058 */
+ 0x0000, /* R10059 */
+ 0x0000, /* R10060 */
+ 0x0000, /* R10061 */
+ 0x0000, /* R10062 */
+ 0x0000, /* R10063 */
+ 0x0000, /* R10064 */
+ 0x0000, /* R10065 */
+ 0x0000, /* R10066 */
+ 0x0000, /* R10067 */
+ 0x0000, /* R10068 */
+ 0x0000, /* R10069 */
+ 0x0000, /* R10070 */
+ 0x0000, /* R10071 */
+ 0x0000, /* R10072 */
+ 0x0000, /* R10073 */
+ 0x0000, /* R10074 */
+ 0x0000, /* R10075 */
+ 0x0000, /* R10076 */
+ 0x0000, /* R10077 */
+ 0x0000, /* R10078 */
+ 0x0000, /* R10079 */
+ 0x0000, /* R10080 */
+ 0x0000, /* R10081 */
+ 0x0000, /* R10082 */
+ 0x0000, /* R10083 */
+ 0x0000, /* R10084 */
+ 0x0000, /* R10085 */
+ 0x0000, /* R10086 */
+ 0x0000, /* R10087 */
+ 0x0000, /* R10088 */
+ 0x0000, /* R10089 */
+ 0x0000, /* R10090 */
+ 0x0000, /* R10091 */
+ 0x0000, /* R10092 */
+ 0x0000, /* R10093 */
+ 0x0000, /* R10094 */
+ 0x0000, /* R10095 */
+ 0x0000, /* R10096 */
+ 0x0000, /* R10097 */
+ 0x0000, /* R10098 */
+ 0x0000, /* R10099 */
+ 0x0000, /* R10100 */
+ 0x0000, /* R10101 */
+ 0x0000, /* R10102 */
+ 0x0000, /* R10103 */
+ 0x0000, /* R10104 */
+ 0x0000, /* R10105 */
+ 0x0000, /* R10106 */
+ 0x0000, /* R10107 */
+ 0x0000, /* R10108 */
+ 0x0000, /* R10109 */
+ 0x0000, /* R10110 */
+ 0x0000, /* R10111 */
+ 0x0000, /* R10112 */
+ 0x0000, /* R10113 */
+ 0x0000, /* R10114 */
+ 0x0000, /* R10115 */
+ 0x0000, /* R10116 */
+ 0x0000, /* R10117 */
+ 0x0000, /* R10118 */
+ 0x0000, /* R10119 */
+ 0x0000, /* R10120 */
+ 0x0000, /* R10121 */
+ 0x0000, /* R10122 */
+ 0x0000, /* R10123 */
+ 0x0000, /* R10124 */
+ 0x0000, /* R10125 */
+ 0x0000, /* R10126 */
+ 0x0000, /* R10127 */
+ 0x0000, /* R10128 */
+ 0x0000, /* R10129 */
+ 0x0000, /* R10130 */
+ 0x0000, /* R10131 */
+ 0x0000, /* R10132 */
+ 0x0000, /* R10133 */
+ 0x0000, /* R10134 */
+ 0x0000, /* R10135 */
+ 0x0000, /* R10136 */
+ 0x0000, /* R10137 */
+ 0x0000, /* R10138 */
+ 0x0000, /* R10139 */
+ 0x0000, /* R10140 */
+ 0x0000, /* R10141 */
+ 0x0000, /* R10142 */
+ 0x0000, /* R10143 */
+ 0x0000, /* R10144 */
+ 0x0000, /* R10145 */
+ 0x0000, /* R10146 */
+ 0x0000, /* R10147 */
+ 0x0000, /* R10148 */
+ 0x0000, /* R10149 */
+ 0x0000, /* R10150 */
+ 0x0000, /* R10151 */
+ 0x0000, /* R10152 */
+ 0x0000, /* R10153 */
+ 0x0000, /* R10154 */
+ 0x0000, /* R10155 */
+ 0x0000, /* R10156 */
+ 0x0000, /* R10157 */
+ 0x0000, /* R10158 */
+ 0x0000, /* R10159 */
+ 0x0000, /* R10160 */
+ 0x0000, /* R10161 */
+ 0x0000, /* R10162 */
+ 0x0000, /* R10163 */
+ 0x0000, /* R10164 */
+ 0x0000, /* R10165 */
+ 0x0000, /* R10166 */
+ 0x0000, /* R10167 */
+ 0x0000, /* R10168 */
+ 0x0000, /* R10169 */
+ 0x0000, /* R10170 */
+ 0x0000, /* R10171 */
+ 0x0000, /* R10172 */
+ 0x0000, /* R10173 */
+ 0x0000, /* R10174 */
+ 0x0000, /* R10175 */
+ 0x0000, /* R10176 */
+ 0x0000, /* R10177 */
+ 0x0000, /* R10178 */
+ 0x0000, /* R10179 */
+ 0x0000, /* R10180 */
+ 0x0000, /* R10181 */
+ 0x0000, /* R10182 */
+ 0x0000, /* R10183 */
+ 0x0000, /* R10184 */
+ 0x0000, /* R10185 */
+ 0x0000, /* R10186 */
+ 0x0000, /* R10187 */
+ 0x0000, /* R10188 */
+ 0x0000, /* R10189 */
+ 0x0000, /* R10190 */
+ 0x0000, /* R10191 */
+ 0x0000, /* R10192 */
+ 0x0000, /* R10193 */
+ 0x0000, /* R10194 */
+ 0x0000, /* R10195 */
+ 0x0000, /* R10196 */
+ 0x0000, /* R10197 */
+ 0x0000, /* R10198 */
+ 0x0000, /* R10199 */
+ 0x0000, /* R10200 */
+ 0x0000, /* R10201 */
+ 0x0000, /* R10202 */
+ 0x0000, /* R10203 */
+ 0x0000, /* R10204 */
+ 0x0000, /* R10205 */
+ 0x0000, /* R10206 */
+ 0x0000, /* R10207 */
+ 0x0000, /* R10208 */
+ 0x0000, /* R10209 */
+ 0x0000, /* R10210 */
+ 0x0000, /* R10211 */
+ 0x0000, /* R10212 */
+ 0x0000, /* R10213 */
+ 0x0000, /* R10214 */
+ 0x0000, /* R10215 */
+ 0x0000, /* R10216 */
+ 0x0000, /* R10217 */
+ 0x0000, /* R10218 */
+ 0x0000, /* R10219 */
+ 0x0000, /* R10220 */
+ 0x0000, /* R10221 */
+ 0x0000, /* R10222 */
+ 0x0000, /* R10223 */
+ 0x0000, /* R10224 */
+ 0x0000, /* R10225 */
+ 0x0000, /* R10226 */
+ 0x0000, /* R10227 */
+ 0x0000, /* R10228 */
+ 0x0000, /* R10229 */
+ 0x0000, /* R10230 */
+ 0x0000, /* R10231 */
+ 0x0000, /* R10232 */
+ 0x0000, /* R10233 */
+ 0x0000, /* R10234 */
+ 0x0000, /* R10235 */
+ 0x0000, /* R10236 */
+ 0x0000, /* R10237 */
+ 0x0000, /* R10238 */
+ 0x0000, /* R10239 */
+ 0x0000, /* R10240 */
+ 0x0000, /* R10241 */
+ 0x0000, /* R10242 */
+ 0x0000, /* R10243 */
+ 0x0000, /* R10244 */
+ 0x0000, /* R10245 */
+ 0x0000, /* R10246 */
+ 0x0000, /* R10247 */
+ 0x0000, /* R10248 */
+ 0x0000, /* R10249 */
+ 0x0000, /* R10250 */
+ 0x0000, /* R10251 */
+ 0x0000, /* R10252 */
+ 0x0000, /* R10253 */
+ 0x0000, /* R10254 */
+ 0x0000, /* R10255 */
+ 0x0000, /* R10256 */
+ 0x0000, /* R10257 */
+ 0x0000, /* R10258 */
+ 0x0000, /* R10259 */
+ 0x0000, /* R10260 */
+ 0x0000, /* R10261 */
+ 0x0000, /* R10262 */
+ 0x0000, /* R10263 */
+ 0x0000, /* R10264 */
+ 0x0000, /* R10265 */
+ 0x0000, /* R10266 */
+ 0x0000, /* R10267 */
+ 0x0000, /* R10268 */
+ 0x0000, /* R10269 */
+ 0x0000, /* R10270 */
+ 0x0000, /* R10271 */
+ 0x0000, /* R10272 */
+ 0x0000, /* R10273 */
+ 0x0000, /* R10274 */
+ 0x0000, /* R10275 */
+ 0x0000, /* R10276 */
+ 0x0000, /* R10277 */
+ 0x0000, /* R10278 */
+ 0x0000, /* R10279 */
+ 0x0000, /* R10280 */
+ 0x0000, /* R10281 */
+ 0x0000, /* R10282 */
+ 0x0000, /* R10283 */
+ 0x0000, /* R10284 */
+ 0x0000, /* R10285 */
+ 0x0000, /* R10286 */
+ 0x0000, /* R10287 */
+ 0x0000, /* R10288 */
+ 0x0000, /* R10289 */
+ 0x0000, /* R10290 */
+ 0x0000, /* R10291 */
+ 0x0000, /* R10292 */
+ 0x0000, /* R10293 */
+ 0x0000, /* R10294 */
+ 0x0000, /* R10295 */
+ 0x0000, /* R10296 */
+ 0x0000, /* R10297 */
+ 0x0000, /* R10298 */
+ 0x0000, /* R10299 */
+ 0x0000, /* R10300 */
+ 0x0000, /* R10301 */
+ 0x0000, /* R10302 */
+ 0x0000, /* R10303 */
+ 0x0000, /* R10304 */
+ 0x0000, /* R10305 */
+ 0x0000, /* R10306 */
+ 0x0000, /* R10307 */
+ 0x0000, /* R10308 */
+ 0x0000, /* R10309 */
+ 0x0000, /* R10310 */
+ 0x0000, /* R10311 */
+ 0x0000, /* R10312 */
+ 0x0000, /* R10313 */
+ 0x0000, /* R10314 */
+ 0x0000, /* R10315 */
+ 0x0000, /* R10316 */
+ 0x0000, /* R10317 */
+ 0x0000, /* R10318 */
+ 0x0000, /* R10319 */
+ 0x0000, /* R10320 */
+ 0x0000, /* R10321 */
+ 0x0000, /* R10322 */
+ 0x0000, /* R10323 */
+ 0x0000, /* R10324 */
+ 0x0000, /* R10325 */
+ 0x0000, /* R10326 */
+ 0x0000, /* R10327 */
+ 0x0000, /* R10328 */
+ 0x0000, /* R10329 */
+ 0x0000, /* R10330 */
+ 0x0000, /* R10331 */
+ 0x0000, /* R10332 */
+ 0x0000, /* R10333 */
+ 0x0000, /* R10334 */
+ 0x0000, /* R10335 */
+ 0x0000, /* R10336 */
+ 0x0000, /* R10337 */
+ 0x0000, /* R10338 */
+ 0x0000, /* R10339 */
+ 0x0000, /* R10340 */
+ 0x0000, /* R10341 */
+ 0x0000, /* R10342 */
+ 0x0000, /* R10343 */
+ 0x0000, /* R10344 */
+ 0x0000, /* R10345 */
+ 0x0000, /* R10346 */
+ 0x0000, /* R10347 */
+ 0x0000, /* R10348 */
+ 0x0000, /* R10349 */
+ 0x0000, /* R10350 */
+ 0x0000, /* R10351 */
+ 0x0000, /* R10352 */
+ 0x0000, /* R10353 */
+ 0x0000, /* R10354 */
+ 0x0000, /* R10355 */
+ 0x0000, /* R10356 */
+ 0x0000, /* R10357 */
+ 0x0000, /* R10358 */
+ 0x0000, /* R10359 */
+ 0x0000, /* R10360 */
+ 0x0000, /* R10361 */
+ 0x0000, /* R10362 */
+ 0x0000, /* R10363 */
+ 0x0000, /* R10364 */
+ 0x0000, /* R10365 */
+ 0x0000, /* R10366 */
+ 0x0000, /* R10367 */
+ 0x0000, /* R10368 */
+ 0x0000, /* R10369 */
+ 0x0000, /* R10370 */
+ 0x0000, /* R10371 */
+ 0x0000, /* R10372 */
+ 0x0000, /* R10373 */
+ 0x0000, /* R10374 */
+ 0x0000, /* R10375 */
+ 0x0000, /* R10376 */
+ 0x0000, /* R10377 */
+ 0x0000, /* R10378 */
+ 0x0000, /* R10379 */
+ 0x0000, /* R10380 */
+ 0x0000, /* R10381 */
+ 0x0000, /* R10382 */
+ 0x0000, /* R10383 */
+ 0x0000, /* R10384 */
+ 0x0000, /* R10385 */
+ 0x0000, /* R10386 */
+ 0x0000, /* R10387 */
+ 0x0000, /* R10388 */
+ 0x0000, /* R10389 */
+ 0x0000, /* R10390 */
+ 0x0000, /* R10391 */
+ 0x0000, /* R10392 */
+ 0x0000, /* R10393 */
+ 0x0000, /* R10394 */
+ 0x0000, /* R10395 */
+ 0x0000, /* R10396 */
+ 0x0000, /* R10397 */
+ 0x0000, /* R10398 */
+ 0x0000, /* R10399 */
+ 0x0000, /* R10400 */
+ 0x0000, /* R10401 */
+ 0x0000, /* R10402 */
+ 0x0000, /* R10403 */
+ 0x0000, /* R10404 */
+ 0x0000, /* R10405 */
+ 0x0000, /* R10406 */
+ 0x0000, /* R10407 */
+ 0x0000, /* R10408 */
+ 0x0000, /* R10409 */
+ 0x0000, /* R10410 */
+ 0x0000, /* R10411 */
+ 0x0000, /* R10412 */
+ 0x0000, /* R10413 */
+ 0x0000, /* R10414 */
+ 0x0000, /* R10415 */
+ 0x0000, /* R10416 */
+ 0x0000, /* R10417 */
+ 0x0000, /* R10418 */
+ 0x0000, /* R10419 */
+ 0x0000, /* R10420 */
+ 0x0000, /* R10421 */
+ 0x0000, /* R10422 */
+ 0x0000, /* R10423 */
+ 0x0000, /* R10424 */
+ 0x0000, /* R10425 */
+ 0x0000, /* R10426 */
+ 0x0000, /* R10427 */
+ 0x0000, /* R10428 */
+ 0x0000, /* R10429 */
+ 0x0000, /* R10430 */
+ 0x0000, /* R10431 */
+ 0x0000, /* R10432 */
+ 0x0000, /* R10433 */
+ 0x0000, /* R10434 */
+ 0x0000, /* R10435 */
+ 0x0000, /* R10436 */
+ 0x0000, /* R10437 */
+ 0x0000, /* R10438 */
+ 0x0000, /* R10439 */
+ 0x0000, /* R10440 */
+ 0x0000, /* R10441 */
+ 0x0000, /* R10442 */
+ 0x0000, /* R10443 */
+ 0x0000, /* R10444 */
+ 0x0000, /* R10445 */
+ 0x0000, /* R10446 */
+ 0x0000, /* R10447 */
+ 0x0000, /* R10448 */
+ 0x0000, /* R10449 */
+ 0x0000, /* R10450 */
+ 0x0000, /* R10451 */
+ 0x0000, /* R10452 */
+ 0x0000, /* R10453 */
+ 0x0000, /* R10454 */
+ 0x0000, /* R10455 */
+ 0x0000, /* R10456 */
+ 0x0000, /* R10457 */
+ 0x0000, /* R10458 */
+ 0x0000, /* R10459 */
+ 0x0000, /* R10460 */
+ 0x0000, /* R10461 */
+ 0x0000, /* R10462 */
+ 0x0000, /* R10463 */
+ 0x0000, /* R10464 */
+ 0x0000, /* R10465 */
+ 0x0000, /* R10466 */
+ 0x0000, /* R10467 */
+ 0x0000, /* R10468 */
+ 0x0000, /* R10469 */
+ 0x0000, /* R10470 */
+ 0x0000, /* R10471 */
+ 0x0000, /* R10472 */
+ 0x0000, /* R10473 */
+ 0x0000, /* R10474 */
+ 0x0000, /* R10475 */
+ 0x0000, /* R10476 */
+ 0x0000, /* R10477 */
+ 0x0000, /* R10478 */
+ 0x0000, /* R10479 */
+ 0x0000, /* R10480 */
+ 0x0000, /* R10481 */
+ 0x0000, /* R10482 */
+ 0x0000, /* R10483 */
+ 0x0000, /* R10484 */
+ 0x0000, /* R10485 */
+ 0x0000, /* R10486 */
+ 0x0000, /* R10487 */
+ 0x0000, /* R10488 */
+ 0x0000, /* R10489 */
+ 0x0000, /* R10490 */
+ 0x0000, /* R10491 */
+ 0x0000, /* R10492 */
+ 0x0000, /* R10493 */
+ 0x0000, /* R10494 */
+ 0x0000, /* R10495 */
+ 0x0000, /* R10496 */
+ 0x0000, /* R10497 */
+ 0x0000, /* R10498 */
+ 0x0000, /* R10499 */
+ 0x0000, /* R10500 */
+ 0x0000, /* R10501 */
+ 0x0000, /* R10502 */
+ 0x0000, /* R10503 */
+ 0x0000, /* R10504 */
+ 0x0000, /* R10505 */
+ 0x0000, /* R10506 */
+ 0x0000, /* R10507 */
+ 0x0000, /* R10508 */
+ 0x0000, /* R10509 */
+ 0x0000, /* R10510 */
+ 0x0000, /* R10511 */
+ 0x0000, /* R10512 */
+ 0x0000, /* R10513 */
+ 0x0000, /* R10514 */
+ 0x0000, /* R10515 */
+ 0x0000, /* R10516 */
+ 0x0000, /* R10517 */
+ 0x0000, /* R10518 */
+ 0x0000, /* R10519 */
+ 0x0000, /* R10520 */
+ 0x0000, /* R10521 */
+ 0x0000, /* R10522 */
+ 0x0000, /* R10523 */
+ 0x0000, /* R10524 */
+ 0x0000, /* R10525 */
+ 0x0000, /* R10526 */
+ 0x0000, /* R10527 */
+ 0x0000, /* R10528 */
+ 0x0000, /* R10529 */
+ 0x0000, /* R10530 */
+ 0x0000, /* R10531 */
+ 0x0000, /* R10532 */
+ 0x0000, /* R10533 */
+ 0x0000, /* R10534 */
+ 0x0000, /* R10535 */
+ 0x0000, /* R10536 */
+ 0x0000, /* R10537 */
+ 0x0000, /* R10538 */
+ 0x0000, /* R10539 */
+ 0x0000, /* R10540 */
+ 0x0000, /* R10541 */
+ 0x0000, /* R10542 */
+ 0x0000, /* R10543 */
+ 0x0000, /* R10544 */
+ 0x0000, /* R10545 */
+ 0x0000, /* R10546 */
+ 0x0000, /* R10547 */
+ 0x0000, /* R10548 */
+ 0x0000, /* R10549 */
+ 0x0000, /* R10550 */
+ 0x0000, /* R10551 */
+ 0x0000, /* R10552 */
+ 0x0000, /* R10553 */
+ 0x0000, /* R10554 */
+ 0x0000, /* R10555 */
+ 0x0000, /* R10556 */
+ 0x0000, /* R10557 */
+ 0x0000, /* R10558 */
+ 0x0000, /* R10559 */
+ 0x0000, /* R10560 */
+ 0x0000, /* R10561 */
+ 0x0000, /* R10562 */
+ 0x0000, /* R10563 */
+ 0x0000, /* R10564 */
+ 0x0000, /* R10565 */
+ 0x0000, /* R10566 */
+ 0x0000, /* R10567 */
+ 0x0000, /* R10568 */
+ 0x0000, /* R10569 */
+ 0x0000, /* R10570 */
+ 0x0000, /* R10571 */
+ 0x0000, /* R10572 */
+ 0x0000, /* R10573 */
+ 0x0000, /* R10574 */
+ 0x0000, /* R10575 */
+ 0x0000, /* R10576 */
+ 0x0000, /* R10577 */
+ 0x0000, /* R10578 */
+ 0x0000, /* R10579 */
+ 0x0000, /* R10580 */
+ 0x0000, /* R10581 */
+ 0x0000, /* R10582 */
+ 0x0000, /* R10583 */
+ 0x0000, /* R10584 */
+ 0x0000, /* R10585 */
+ 0x0000, /* R10586 */
+ 0x0000, /* R10587 */
+ 0x0000, /* R10588 */
+ 0x0000, /* R10589 */
+ 0x0000, /* R10590 */
+ 0x0000, /* R10591 */
+ 0x0000, /* R10592 */
+ 0x0000, /* R10593 */
+ 0x0000, /* R10594 */
+ 0x0000, /* R10595 */
+ 0x0000, /* R10596 */
+ 0x0000, /* R10597 */
+ 0x0000, /* R10598 */
+ 0x0000, /* R10599 */
+ 0x0000, /* R10600 */
+ 0x0000, /* R10601 */
+ 0x0000, /* R10602 */
+ 0x0000, /* R10603 */
+ 0x0000, /* R10604 */
+ 0x0000, /* R10605 */
+ 0x0000, /* R10606 */
+ 0x0000, /* R10607 */
+ 0x0000, /* R10608 */
+ 0x0000, /* R10609 */
+ 0x0000, /* R10610 */
+ 0x0000, /* R10611 */
+ 0x0000, /* R10612 */
+ 0x0000, /* R10613 */
+ 0x0000, /* R10614 */
+ 0x0000, /* R10615 */
+ 0x0000, /* R10616 */
+ 0x0000, /* R10617 */
+ 0x0000, /* R10618 */
+ 0x0000, /* R10619 */
+ 0x0000, /* R10620 */
+ 0x0000, /* R10621 */
+ 0x0000, /* R10622 */
+ 0x0000, /* R10623 */
+ 0x0000, /* R10624 */
+ 0x0000, /* R10625 */
+ 0x0000, /* R10626 */
+ 0x0000, /* R10627 */
+ 0x0000, /* R10628 */
+ 0x0000, /* R10629 */
+ 0x0000, /* R10630 */
+ 0x0000, /* R10631 */
+ 0x0000, /* R10632 */
+ 0x0000, /* R10633 */
+ 0x0000, /* R10634 */
+ 0x0000, /* R10635 */
+ 0x0000, /* R10636 */
+ 0x0000, /* R10637 */
+ 0x0000, /* R10638 */
+ 0x0000, /* R10639 */
+ 0x0000, /* R10640 */
+ 0x0000, /* R10641 */
+ 0x0000, /* R10642 */
+ 0x0000, /* R10643 */
+ 0x0000, /* R10644 */
+ 0x0000, /* R10645 */
+ 0x0000, /* R10646 */
+ 0x0000, /* R10647 */
+ 0x0000, /* R10648 */
+ 0x0000, /* R10649 */
+ 0x0000, /* R10650 */
+ 0x0000, /* R10651 */
+ 0x0000, /* R10652 */
+ 0x0000, /* R10653 */
+ 0x0000, /* R10654 */
+ 0x0000, /* R10655 */
+ 0x0000, /* R10656 */
+ 0x0000, /* R10657 */
+ 0x0000, /* R10658 */
+ 0x0000, /* R10659 */
+ 0x0000, /* R10660 */
+ 0x0000, /* R10661 */
+ 0x0000, /* R10662 */
+ 0x0000, /* R10663 */
+ 0x0000, /* R10664 */
+ 0x0000, /* R10665 */
+ 0x0000, /* R10666 */
+ 0x0000, /* R10667 */
+ 0x0000, /* R10668 */
+ 0x0000, /* R10669 */
+ 0x0000, /* R10670 */
+ 0x0000, /* R10671 */
+ 0x0000, /* R10672 */
+ 0x0000, /* R10673 */
+ 0x0000, /* R10674 */
+ 0x0000, /* R10675 */
+ 0x0000, /* R10676 */
+ 0x0000, /* R10677 */
+ 0x0000, /* R10678 */
+ 0x0000, /* R10679 */
+ 0x0000, /* R10680 */
+ 0x0000, /* R10681 */
+ 0x0000, /* R10682 */
+ 0x0000, /* R10683 */
+ 0x0000, /* R10684 */
+ 0x0000, /* R10685 */
+ 0x0000, /* R10686 */
+ 0x0000, /* R10687 */
+ 0x0000, /* R10688 */
+ 0x0000, /* R10689 */
+ 0x0000, /* R10690 */
+ 0x0000, /* R10691 */
+ 0x0000, /* R10692 */
+ 0x0000, /* R10693 */
+ 0x0000, /* R10694 */
+ 0x0000, /* R10695 */
+ 0x0000, /* R10696 */
+ 0x0000, /* R10697 */
+ 0x0000, /* R10698 */
+ 0x0000, /* R10699 */
+ 0x0000, /* R10700 */
+ 0x0000, /* R10701 */
+ 0x0000, /* R10702 */
+ 0x0000, /* R10703 */
+ 0x0000, /* R10704 */
+ 0x0000, /* R10705 */
+ 0x0000, /* R10706 */
+ 0x0000, /* R10707 */
+ 0x0000, /* R10708 */
+ 0x0000, /* R10709 */
+ 0x0000, /* R10710 */
+ 0x0000, /* R10711 */
+ 0x0000, /* R10712 */
+ 0x0000, /* R10713 */
+ 0x0000, /* R10714 */
+ 0x0000, /* R10715 */
+ 0x0000, /* R10716 */
+ 0x0000, /* R10717 */
+ 0x0000, /* R10718 */
+ 0x0000, /* R10719 */
+ 0x0000, /* R10720 */
+ 0x0000, /* R10721 */
+ 0x0000, /* R10722 */
+ 0x0000, /* R10723 */
+ 0x0000, /* R10724 */
+ 0x0000, /* R10725 */
+ 0x0000, /* R10726 */
+ 0x0000, /* R10727 */
+ 0x0000, /* R10728 */
+ 0x0000, /* R10729 */
+ 0x0000, /* R10730 */
+ 0x0000, /* R10731 */
+ 0x0000, /* R10732 */
+ 0x0000, /* R10733 */
+ 0x0000, /* R10734 */
+ 0x0000, /* R10735 */
+ 0x0000, /* R10736 */
+ 0x0000, /* R10737 */
+ 0x0000, /* R10738 */
+ 0x0000, /* R10739 */
+ 0x0000, /* R10740 */
+ 0x0000, /* R10741 */
+ 0x0000, /* R10742 */
+ 0x0000, /* R10743 */
+ 0x0000, /* R10744 */
+ 0x0000, /* R10745 */
+ 0x0000, /* R10746 */
+ 0x0000, /* R10747 */
+ 0x0000, /* R10748 */
+ 0x0000, /* R10749 */
+ 0x0000, /* R10750 */
+ 0x0000, /* R10751 */
+ 0x0000, /* R10752 */
+ 0x0000, /* R10753 */
+ 0x0000, /* R10754 */
+ 0x0000, /* R10755 */
+ 0x0000, /* R10756 */
+ 0x0000, /* R10757 */
+ 0x0000, /* R10758 */
+ 0x0000, /* R10759 */
+ 0x0000, /* R10760 */
+ 0x0000, /* R10761 */
+ 0x0000, /* R10762 */
+ 0x0000, /* R10763 */
+ 0x0000, /* R10764 */
+ 0x0000, /* R10765 */
+ 0x0000, /* R10766 */
+ 0x0000, /* R10767 */
+ 0x0000, /* R10768 */
+ 0x0000, /* R10769 */
+ 0x0000, /* R10770 */
+ 0x0000, /* R10771 */
+ 0x0000, /* R10772 */
+ 0x0000, /* R10773 */
+ 0x0000, /* R10774 */
+ 0x0000, /* R10775 */
+ 0x0000, /* R10776 */
+ 0x0000, /* R10777 */
+ 0x0000, /* R10778 */
+ 0x0000, /* R10779 */
+ 0x0000, /* R10780 */
+ 0x0000, /* R10781 */
+ 0x0000, /* R10782 */
+ 0x0000, /* R10783 */
+ 0x0000, /* R10784 */
+ 0x0000, /* R10785 */
+ 0x0000, /* R10786 */
+ 0x0000, /* R10787 */
+ 0x0000, /* R10788 */
+ 0x0000, /* R10789 */
+ 0x0000, /* R10790 */
+ 0x0000, /* R10791 */
+ 0x0000, /* R10792 */
+ 0x0000, /* R10793 */
+ 0x0000, /* R10794 */
+ 0x0000, /* R10795 */
+ 0x0000, /* R10796 */
+ 0x0000, /* R10797 */
+ 0x0000, /* R10798 */
+ 0x0000, /* R10799 */
+ 0x0000, /* R10800 */
+ 0x0000, /* R10801 */
+ 0x0000, /* R10802 */
+ 0x0000, /* R10803 */
+ 0x0000, /* R10804 */
+ 0x0000, /* R10805 */
+ 0x0000, /* R10806 */
+ 0x0000, /* R10807 */
+ 0x0000, /* R10808 */
+ 0x0000, /* R10809 */
+ 0x0000, /* R10810 */
+ 0x0000, /* R10811 */
+ 0x0000, /* R10812 */
+ 0x0000, /* R10813 */
+ 0x0000, /* R10814 */
+ 0x0000, /* R10815 */
+ 0x0000, /* R10816 */
+ 0x0000, /* R10817 */
+ 0x0000, /* R10818 */
+ 0x0000, /* R10819 */
+ 0x0000, /* R10820 */
+ 0x0000, /* R10821 */
+ 0x0000, /* R10822 */
+ 0x0000, /* R10823 */
+ 0x0000, /* R10824 */
+ 0x0000, /* R10825 */
+ 0x0000, /* R10826 */
+ 0x0000, /* R10827 */
+ 0x0000, /* R10828 */
+ 0x0000, /* R10829 */
+ 0x0000, /* R10830 */
+ 0x0000, /* R10831 */
+ 0x0000, /* R10832 */
+ 0x0000, /* R10833 */
+ 0x0000, /* R10834 */
+ 0x0000, /* R10835 */
+ 0x0000, /* R10836 */
+ 0x0000, /* R10837 */
+ 0x0000, /* R10838 */
+ 0x0000, /* R10839 */
+ 0x0000, /* R10840 */
+ 0x0000, /* R10841 */
+ 0x0000, /* R10842 */
+ 0x0000, /* R10843 */
+ 0x0000, /* R10844 */
+ 0x0000, /* R10845 */
+ 0x0000, /* R10846 */
+ 0x0000, /* R10847 */
+ 0x0000, /* R10848 */
+ 0x0000, /* R10849 */
+ 0x0000, /* R10850 */
+ 0x0000, /* R10851 */
+ 0x0000, /* R10852 */
+ 0x0000, /* R10853 */
+ 0x0000, /* R10854 */
+ 0x0000, /* R10855 */
+ 0x0000, /* R10856 */
+ 0x0000, /* R10857 */
+ 0x0000, /* R10858 */
+ 0x0000, /* R10859 */
+ 0x0000, /* R10860 */
+ 0x0000, /* R10861 */
+ 0x0000, /* R10862 */
+ 0x0000, /* R10863 */
+ 0x0000, /* R10864 */
+ 0x0000, /* R10865 */
+ 0x0000, /* R10866 */
+ 0x0000, /* R10867 */
+ 0x0000, /* R10868 */
+ 0x0000, /* R10869 */
+ 0x0000, /* R10870 */
+ 0x0000, /* R10871 */
+ 0x0000, /* R10872 */
+ 0x0000, /* R10873 */
+ 0x0000, /* R10874 */
+ 0x0000, /* R10875 */
+ 0x0000, /* R10876 */
+ 0x0000, /* R10877 */
+ 0x0000, /* R10878 */
+ 0x0000, /* R10879 */
+ 0x0000, /* R10880 */
+ 0x0000, /* R10881 */
+ 0x0000, /* R10882 */
+ 0x0000, /* R10883 */
+ 0x0000, /* R10884 */
+ 0x0000, /* R10885 */
+ 0x0000, /* R10886 */
+ 0x0000, /* R10887 */
+ 0x0000, /* R10888 */
+ 0x0000, /* R10889 */
+ 0x0000, /* R10890 */
+ 0x0000, /* R10891 */
+ 0x0000, /* R10892 */
+ 0x0000, /* R10893 */
+ 0x0000, /* R10894 */
+ 0x0000, /* R10895 */
+ 0x0000, /* R10896 */
+ 0x0000, /* R10897 */
+ 0x0000, /* R10898 */
+ 0x0000, /* R10899 */
+ 0x0000, /* R10900 */
+ 0x0000, /* R10901 */
+ 0x0000, /* R10902 */
+ 0x0000, /* R10903 */
+ 0x0000, /* R10904 */
+ 0x0000, /* R10905 */
+ 0x0000, /* R10906 */
+ 0x0000, /* R10907 */
+ 0x0000, /* R10908 */
+ 0x0000, /* R10909 */
+ 0x0000, /* R10910 */
+ 0x0000, /* R10911 */
+ 0x0000, /* R10912 */
+ 0x0000, /* R10913 */
+ 0x0000, /* R10914 */
+ 0x0000, /* R10915 */
+ 0x0000, /* R10916 */
+ 0x0000, /* R10917 */
+ 0x0000, /* R10918 */
+ 0x0000, /* R10919 */
+ 0x0000, /* R10920 */
+ 0x0000, /* R10921 */
+ 0x0000, /* R10922 */
+ 0x0000, /* R10923 */
+ 0x0000, /* R10924 */
+ 0x0000, /* R10925 */
+ 0x0000, /* R10926 */
+ 0x0000, /* R10927 */
+ 0x0000, /* R10928 */
+ 0x0000, /* R10929 */
+ 0x0000, /* R10930 */
+ 0x0000, /* R10931 */
+ 0x0000, /* R10932 */
+ 0x0000, /* R10933 */
+ 0x0000, /* R10934 */
+ 0x0000, /* R10935 */
+ 0x0000, /* R10936 */
+ 0x0000, /* R10937 */
+ 0x0000, /* R10938 */
+ 0x0000, /* R10939 */
+ 0x0000, /* R10940 */
+ 0x0000, /* R10941 */
+ 0x0000, /* R10942 */
+ 0x0000, /* R10943 */
+ 0x0000, /* R10944 */
+ 0x0000, /* R10945 */
+ 0x0000, /* R10946 */
+ 0x0000, /* R10947 */
+ 0x0000, /* R10948 */
+ 0x0000, /* R10949 */
+ 0x0000, /* R10950 */
+ 0x0000, /* R10951 */
+ 0x0000, /* R10952 */
+ 0x0000, /* R10953 */
+ 0x0000, /* R10954 */
+ 0x0000, /* R10955 */
+ 0x0000, /* R10956 */
+ 0x0000, /* R10957 */
+ 0x0000, /* R10958 */
+ 0x0000, /* R10959 */
+ 0x0000, /* R10960 */
+ 0x0000, /* R10961 */
+ 0x0000, /* R10962 */
+ 0x0000, /* R10963 */
+ 0x0000, /* R10964 */
+ 0x0000, /* R10965 */
+ 0x0000, /* R10966 */
+ 0x0000, /* R10967 */
+ 0x0000, /* R10968 */
+ 0x0000, /* R10969 */
+ 0x0000, /* R10970 */
+ 0x0000, /* R10971 */
+ 0x0000, /* R10972 */
+ 0x0000, /* R10973 */
+ 0x0000, /* R10974 */
+ 0x0000, /* R10975 */
+ 0x0000, /* R10976 */
+ 0x0000, /* R10977 */
+ 0x0000, /* R10978 */
+ 0x0000, /* R10979 */
+ 0x0000, /* R10980 */
+ 0x0000, /* R10981 */
+ 0x0000, /* R10982 */
+ 0x0000, /* R10983 */
+ 0x0000, /* R10984 */
+ 0x0000, /* R10985 */
+ 0x0000, /* R10986 */
+ 0x0000, /* R10987 */
+ 0x0000, /* R10988 */
+ 0x0000, /* R10989 */
+ 0x0000, /* R10990 */
+ 0x0000, /* R10991 */
+ 0x0000, /* R10992 */
+ 0x0000, /* R10993 */
+ 0x0000, /* R10994 */
+ 0x0000, /* R10995 */
+ 0x0000, /* R10996 */
+ 0x0000, /* R10997 */
+ 0x0000, /* R10998 */
+ 0x0000, /* R10999 */
+ 0x0000, /* R11000 */
+ 0x0000, /* R11001 */
+ 0x0000, /* R11002 */
+ 0x0000, /* R11003 */
+ 0x0000, /* R11004 */
+ 0x0000, /* R11005 */
+ 0x0000, /* R11006 */
+ 0x0000, /* R11007 */
+ 0x0000, /* R11008 */
+ 0x0000, /* R11009 */
+ 0x0000, /* R11010 */
+ 0x0000, /* R11011 */
+ 0x0000, /* R11012 */
+ 0x0000, /* R11013 */
+ 0x0000, /* R11014 */
+ 0x0000, /* R11015 */
+ 0x0000, /* R11016 */
+ 0x0000, /* R11017 */
+ 0x0000, /* R11018 */
+ 0x0000, /* R11019 */
+ 0x0000, /* R11020 */
+ 0x0000, /* R11021 */
+ 0x0000, /* R11022 */
+ 0x0000, /* R11023 */
+ 0x0000, /* R11024 */
+ 0x0000, /* R11025 */
+ 0x0000, /* R11026 */
+ 0x0000, /* R11027 */
+ 0x0000, /* R11028 */
+ 0x0000, /* R11029 */
+ 0x0000, /* R11030 */
+ 0x0000, /* R11031 */
+ 0x0000, /* R11032 */
+ 0x0000, /* R11033 */
+ 0x0000, /* R11034 */
+ 0x0000, /* R11035 */
+ 0x0000, /* R11036 */
+ 0x0000, /* R11037 */
+ 0x0000, /* R11038 */
+ 0x0000, /* R11039 */
+ 0x0000, /* R11040 */
+ 0x0000, /* R11041 */
+ 0x0000, /* R11042 */
+ 0x0000, /* R11043 */
+ 0x0000, /* R11044 */
+ 0x0000, /* R11045 */
+ 0x0000, /* R11046 */
+ 0x0000, /* R11047 */
+ 0x0000, /* R11048 */
+ 0x0000, /* R11049 */
+ 0x0000, /* R11050 */
+ 0x0000, /* R11051 */
+ 0x0000, /* R11052 */
+ 0x0000, /* R11053 */
+ 0x0000, /* R11054 */
+ 0x0000, /* R11055 */
+ 0x0000, /* R11056 */
+ 0x0000, /* R11057 */
+ 0x0000, /* R11058 */
+ 0x0000, /* R11059 */
+ 0x0000, /* R11060 */
+ 0x0000, /* R11061 */
+ 0x0000, /* R11062 */
+ 0x0000, /* R11063 */
+ 0x0000, /* R11064 */
+ 0x0000, /* R11065 */
+ 0x0000, /* R11066 */
+ 0x0000, /* R11067 */
+ 0x0000, /* R11068 */
+ 0x0000, /* R11069 */
+ 0x0000, /* R11070 */
+ 0x0000, /* R11071 */
+ 0x0000, /* R11072 */
+ 0x0000, /* R11073 */
+ 0x0000, /* R11074 */
+ 0x0000, /* R11075 */
+ 0x0000, /* R11076 */
+ 0x0000, /* R11077 */
+ 0x0000, /* R11078 */
+ 0x0000, /* R11079 */
+ 0x0000, /* R11080 */
+ 0x0000, /* R11081 */
+ 0x0000, /* R11082 */
+ 0x0000, /* R11083 */
+ 0x0000, /* R11084 */
+ 0x0000, /* R11085 */
+ 0x0000, /* R11086 */
+ 0x0000, /* R11087 */
+ 0x0000, /* R11088 */
+ 0x0000, /* R11089 */
+ 0x0000, /* R11090 */
+ 0x0000, /* R11091 */
+ 0x0000, /* R11092 */
+ 0x0000, /* R11093 */
+ 0x0000, /* R11094 */
+ 0x0000, /* R11095 */
+ 0x0000, /* R11096 */
+ 0x0000, /* R11097 */
+ 0x0000, /* R11098 */
+ 0x0000, /* R11099 */
+ 0x0000, /* R11100 */
+ 0x0000, /* R11101 */
+ 0x0000, /* R11102 */
+ 0x0000, /* R11103 */
+ 0x0000, /* R11104 */
+ 0x0000, /* R11105 */
+ 0x0000, /* R11106 */
+ 0x0000, /* R11107 */
+ 0x0000, /* R11108 */
+ 0x0000, /* R11109 */
+ 0x0000, /* R11110 */
+ 0x0000, /* R11111 */
+ 0x0000, /* R11112 */
+ 0x0000, /* R11113 */
+ 0x0000, /* R11114 */
+ 0x0000, /* R11115 */
+ 0x0000, /* R11116 */
+ 0x0000, /* R11117 */
+ 0x0000, /* R11118 */
+ 0x0000, /* R11119 */
+ 0x0000, /* R11120 */
+ 0x0000, /* R11121 */
+ 0x0000, /* R11122 */
+ 0x0000, /* R11123 */
+ 0x0000, /* R11124 */
+ 0x0000, /* R11125 */
+ 0x0000, /* R11126 */
+ 0x0000, /* R11127 */
+ 0x0000, /* R11128 */
+ 0x0000, /* R11129 */
+ 0x0000, /* R11130 */
+ 0x0000, /* R11131 */
+ 0x0000, /* R11132 */
+ 0x0000, /* R11133 */
+ 0x0000, /* R11134 */
+ 0x0000, /* R11135 */
+ 0x0000, /* R11136 */
+ 0x0000, /* R11137 */
+ 0x0000, /* R11138 */
+ 0x0000, /* R11139 */
+ 0x0000, /* R11140 */
+ 0x0000, /* R11141 */
+ 0x0000, /* R11142 */
+ 0x0000, /* R11143 */
+ 0x0000, /* R11144 */
+ 0x0000, /* R11145 */
+ 0x0000, /* R11146 */
+ 0x0000, /* R11147 */
+ 0x0000, /* R11148 */
+ 0x0000, /* R11149 */
+ 0x0000, /* R11150 */
+ 0x0000, /* R11151 */
+ 0x0000, /* R11152 */
+ 0x0000, /* R11153 */
+ 0x0000, /* R11154 */
+ 0x0000, /* R11155 */
+ 0x0000, /* R11156 */
+ 0x0000, /* R11157 */
+ 0x0000, /* R11158 */
+ 0x0000, /* R11159 */
+ 0x0000, /* R11160 */
+ 0x0000, /* R11161 */
+ 0x0000, /* R11162 */
+ 0x0000, /* R11163 */
+ 0x0000, /* R11164 */
+ 0x0000, /* R11165 */
+ 0x0000, /* R11166 */
+ 0x0000, /* R11167 */
+ 0x0000, /* R11168 */
+ 0x0000, /* R11169 */
+ 0x0000, /* R11170 */
+ 0x0000, /* R11171 */
+ 0x0000, /* R11172 */
+ 0x0000, /* R11173 */
+ 0x0000, /* R11174 */
+ 0x0000, /* R11175 */
+ 0x0000, /* R11176 */
+ 0x0000, /* R11177 */
+ 0x0000, /* R11178 */
+ 0x0000, /* R11179 */
+ 0x0000, /* R11180 */
+ 0x0000, /* R11181 */
+ 0x0000, /* R11182 */
+ 0x0000, /* R11183 */
+ 0x0000, /* R11184 */
+ 0x0000, /* R11185 */
+ 0x0000, /* R11186 */
+ 0x0000, /* R11187 */
+ 0x0000, /* R11188 */
+ 0x0000, /* R11189 */
+ 0x0000, /* R11190 */
+ 0x0000, /* R11191 */
+ 0x0000, /* R11192 */
+ 0x0000, /* R11193 */
+ 0x0000, /* R11194 */
+ 0x0000, /* R11195 */
+ 0x0000, /* R11196 */
+ 0x0000, /* R11197 */
+ 0x0000, /* R11198 */
+ 0x0000, /* R11199 */
+ 0x0000, /* R11200 */
+ 0x0000, /* R11201 */
+ 0x0000, /* R11202 */
+ 0x0000, /* R11203 */
+ 0x0000, /* R11204 */
+ 0x0000, /* R11205 */
+ 0x0000, /* R11206 */
+ 0x0000, /* R11207 */
+ 0x0000, /* R11208 */
+ 0x0000, /* R11209 */
+ 0x0000, /* R11210 */
+ 0x0000, /* R11211 */
+ 0x0000, /* R11212 */
+ 0x0000, /* R11213 */
+ 0x0000, /* R11214 */
+ 0x0000, /* R11215 */
+ 0x0000, /* R11216 */
+ 0x0000, /* R11217 */
+ 0x0000, /* R11218 */
+ 0x0000, /* R11219 */
+ 0x0000, /* R11220 */
+ 0x0000, /* R11221 */
+ 0x0000, /* R11222 */
+ 0x0000, /* R11223 */
+ 0x0000, /* R11224 */
+ 0x0000, /* R11225 */
+ 0x0000, /* R11226 */
+ 0x0000, /* R11227 */
+ 0x0000, /* R11228 */
+ 0x0000, /* R11229 */
+ 0x0000, /* R11230 */
+ 0x0000, /* R11231 */
+ 0x0000, /* R11232 */
+ 0x0000, /* R11233 */
+ 0x0000, /* R11234 */
+ 0x0000, /* R11235 */
+ 0x0000, /* R11236 */
+ 0x0000, /* R11237 */
+ 0x0000, /* R11238 */
+ 0x0000, /* R11239 */
+ 0x0000, /* R11240 */
+ 0x0000, /* R11241 */
+ 0x0000, /* R11242 */
+ 0x0000, /* R11243 */
+ 0x0000, /* R11244 */
+ 0x0000, /* R11245 */
+ 0x0000, /* R11246 */
+ 0x0000, /* R11247 */
+ 0x0000, /* R11248 */
+ 0x0000, /* R11249 */
+ 0x0000, /* R11250 */
+ 0x0000, /* R11251 */
+ 0x0000, /* R11252 */
+ 0x0000, /* R11253 */
+ 0x0000, /* R11254 */
+ 0x0000, /* R11255 */
+ 0x0000, /* R11256 */
+ 0x0000, /* R11257 */
+ 0x0000, /* R11258 */
+ 0x0000, /* R11259 */
+ 0x0000, /* R11260 */
+ 0x0000, /* R11261 */
+ 0x0000, /* R11262 */
+ 0x0000, /* R11263 */
+ 0x0000, /* R11264 */
+ 0x0000, /* R11265 */
+ 0x0000, /* R11266 */
+ 0x0000, /* R11267 */
+ 0x0000, /* R11268 */
+ 0x0000, /* R11269 */
+ 0x0000, /* R11270 */
+ 0x0000, /* R11271 */
+ 0x0000, /* R11272 */
+ 0x0000, /* R11273 */
+ 0x0000, /* R11274 */
+ 0x0000, /* R11275 */
+ 0x0000, /* R11276 */
+ 0x0000, /* R11277 */
+ 0x0000, /* R11278 */
+ 0x0000, /* R11279 */
+ 0x0000, /* R11280 */
+ 0x0000, /* R11281 */
+ 0x0000, /* R11282 */
+ 0x0000, /* R11283 */
+ 0x0000, /* R11284 */
+ 0x0000, /* R11285 */
+ 0x0000, /* R11286 */
+ 0x0000, /* R11287 */
+ 0x0000, /* R11288 */
+ 0x0000, /* R11289 */
+ 0x0000, /* R11290 */
+ 0x0000, /* R11291 */
+ 0x0000, /* R11292 */
+ 0x0000, /* R11293 */
+ 0x0000, /* R11294 */
+ 0x0000, /* R11295 */
+ 0x0000, /* R11296 */
+ 0x0000, /* R11297 */
+ 0x0000, /* R11298 */
+ 0x0000, /* R11299 */
+ 0x0000, /* R11300 */
+ 0x0000, /* R11301 */
+ 0x0000, /* R11302 */
+ 0x0000, /* R11303 */
+ 0x0000, /* R11304 */
+ 0x0000, /* R11305 */
+ 0x0000, /* R11306 */
+ 0x0000, /* R11307 */
+ 0x0000, /* R11308 */
+ 0x0000, /* R11309 */
+ 0x0000, /* R11310 */
+ 0x0000, /* R11311 */
+ 0x0000, /* R11312 */
+ 0x0000, /* R11313 */
+ 0x0000, /* R11314 */
+ 0x0000, /* R11315 */
+ 0x0000, /* R11316 */
+ 0x0000, /* R11317 */
+ 0x0000, /* R11318 */
+ 0x0000, /* R11319 */
+ 0x0000, /* R11320 */
+ 0x0000, /* R11321 */
+ 0x0000, /* R11322 */
+ 0x0000, /* R11323 */
+ 0x0000, /* R11324 */
+ 0x0000, /* R11325 */
+ 0x0000, /* R11326 */
+ 0x0000, /* R11327 */
+ 0x0000, /* R11328 */
+ 0x0000, /* R11329 */
+ 0x0000, /* R11330 */
+ 0x0000, /* R11331 */
+ 0x0000, /* R11332 */
+ 0x0000, /* R11333 */
+ 0x0000, /* R11334 */
+ 0x0000, /* R11335 */
+ 0x0000, /* R11336 */
+ 0x0000, /* R11337 */
+ 0x0000, /* R11338 */
+ 0x0000, /* R11339 */
+ 0x0000, /* R11340 */
+ 0x0000, /* R11341 */
+ 0x0000, /* R11342 */
+ 0x0000, /* R11343 */
+ 0x0000, /* R11344 */
+ 0x0000, /* R11345 */
+ 0x0000, /* R11346 */
+ 0x0000, /* R11347 */
+ 0x0000, /* R11348 */
+ 0x0000, /* R11349 */
+ 0x0000, /* R11350 */
+ 0x0000, /* R11351 */
+ 0x0000, /* R11352 */
+ 0x0000, /* R11353 */
+ 0x0000, /* R11354 */
+ 0x0000, /* R11355 */
+ 0x0000, /* R11356 */
+ 0x0000, /* R11357 */
+ 0x0000, /* R11358 */
+ 0x0000, /* R11359 */
+ 0x0000, /* R11360 */
+ 0x0000, /* R11361 */
+ 0x0000, /* R11362 */
+ 0x0000, /* R11363 */
+ 0x0000, /* R11364 */
+ 0x0000, /* R11365 */
+ 0x0000, /* R11366 */
+ 0x0000, /* R11367 */
+ 0x0000, /* R11368 */
+ 0x0000, /* R11369 */
+ 0x0000, /* R11370 */
+ 0x0000, /* R11371 */
+ 0x0000, /* R11372 */
+ 0x0000, /* R11373 */
+ 0x0000, /* R11374 */
+ 0x0000, /* R11375 */
+ 0x0000, /* R11376 */
+ 0x0000, /* R11377 */
+ 0x0000, /* R11378 */
+ 0x0000, /* R11379 */
+ 0x0000, /* R11380 */
+ 0x0000, /* R11381 */
+ 0x0000, /* R11382 */
+ 0x0000, /* R11383 */
+ 0x0000, /* R11384 */
+ 0x0000, /* R11385 */
+ 0x0000, /* R11386 */
+ 0x0000, /* R11387 */
+ 0x0000, /* R11388 */
+ 0x0000, /* R11389 */
+ 0x0000, /* R11390 */
+ 0x0000, /* R11391 */
+ 0x0000, /* R11392 */
+ 0x0000, /* R11393 */
+ 0x0000, /* R11394 */
+ 0x0000, /* R11395 */
+ 0x0000, /* R11396 */
+ 0x0000, /* R11397 */
+ 0x0000, /* R11398 */
+ 0x0000, /* R11399 */
+ 0x0000, /* R11400 */
+ 0x0000, /* R11401 */
+ 0x0000, /* R11402 */
+ 0x0000, /* R11403 */
+ 0x0000, /* R11404 */
+ 0x0000, /* R11405 */
+ 0x0000, /* R11406 */
+ 0x0000, /* R11407 */
+ 0x0000, /* R11408 */
+ 0x0000, /* R11409 */
+ 0x0000, /* R11410 */
+ 0x0000, /* R11411 */
+ 0x0000, /* R11412 */
+ 0x0000, /* R11413 */
+ 0x0000, /* R11414 */
+ 0x0000, /* R11415 */
+ 0x0000, /* R11416 */
+ 0x0000, /* R11417 */
+ 0x0000, /* R11418 */
+ 0x0000, /* R11419 */
+ 0x0000, /* R11420 */
+ 0x0000, /* R11421 */
+ 0x0000, /* R11422 */
+ 0x0000, /* R11423 */
+ 0x0000, /* R11424 */
+ 0x0000, /* R11425 */
+ 0x0000, /* R11426 */
+ 0x0000, /* R11427 */
+ 0x0000, /* R11428 */
+ 0x0000, /* R11429 */
+ 0x0000, /* R11430 */
+ 0x0000, /* R11431 */
+ 0x0000, /* R11432 */
+ 0x0000, /* R11433 */
+ 0x0000, /* R11434 */
+ 0x0000, /* R11435 */
+ 0x0000, /* R11436 */
+ 0x0000, /* R11437 */
+ 0x0000, /* R11438 */
+ 0x0000, /* R11439 */
+ 0x0000, /* R11440 */
+ 0x0000, /* R11441 */
+ 0x0000, /* R11442 */
+ 0x0000, /* R11443 */
+ 0x0000, /* R11444 */
+ 0x0000, /* R11445 */
+ 0x0000, /* R11446 */
+ 0x0000, /* R11447 */
+ 0x0000, /* R11448 */
+ 0x0000, /* R11449 */
+ 0x0000, /* R11450 */
+ 0x0000, /* R11451 */
+ 0x0000, /* R11452 */
+ 0x0000, /* R11453 */
+ 0x0000, /* R11454 */
+ 0x0000, /* R11455 */
+ 0x0000, /* R11456 */
+ 0x0000, /* R11457 */
+ 0x0000, /* R11458 */
+ 0x0000, /* R11459 */
+ 0x0000, /* R11460 */
+ 0x0000, /* R11461 */
+ 0x0000, /* R11462 */
+ 0x0000, /* R11463 */
+ 0x0000, /* R11464 */
+ 0x0000, /* R11465 */
+ 0x0000, /* R11466 */
+ 0x0000, /* R11467 */
+ 0x0000, /* R11468 */
+ 0x0000, /* R11469 */
+ 0x0000, /* R11470 */
+ 0x0000, /* R11471 */
+ 0x0000, /* R11472 */
+ 0x0000, /* R11473 */
+ 0x0000, /* R11474 */
+ 0x0000, /* R11475 */
+ 0x0000, /* R11476 */
+ 0x0000, /* R11477 */
+ 0x0000, /* R11478 */
+ 0x0000, /* R11479 */
+ 0x0000, /* R11480 */
+ 0x0000, /* R11481 */
+ 0x0000, /* R11482 */
+ 0x0000, /* R11483 */
+ 0x0000, /* R11484 */
+ 0x0000, /* R11485 */
+ 0x0000, /* R11486 */
+ 0x0000, /* R11487 */
+ 0x0000, /* R11488 */
+ 0x0000, /* R11489 */
+ 0x0000, /* R11490 */
+ 0x0000, /* R11491 */
+ 0x0000, /* R11492 */
+ 0x0000, /* R11493 */
+ 0x0000, /* R11494 */
+ 0x0000, /* R11495 */
+ 0x0000, /* R11496 */
+ 0x0000, /* R11497 */
+ 0x0000, /* R11498 */
+ 0x0000, /* R11499 */
+ 0x0000, /* R11500 */
+ 0x0000, /* R11501 */
+ 0x0000, /* R11502 */
+ 0x0000, /* R11503 */
+ 0x0000, /* R11504 */
+ 0x0000, /* R11505 */
+ 0x0000, /* R11506 */
+ 0x0000, /* R11507 */
+ 0x0000, /* R11508 */
+ 0x0000, /* R11509 */
+ 0x0000, /* R11510 */
+ 0x0000, /* R11511 */
+ 0x0000, /* R11512 */
+ 0x0000, /* R11513 */
+ 0x0000, /* R11514 */
+ 0x0000, /* R11515 */
+ 0x0000, /* R11516 */
+ 0x0000, /* R11517 */
+ 0x0000, /* R11518 */
+ 0x0000, /* R11519 */
+ 0x0000, /* R11520 */
+ 0x0000, /* R11521 */
+ 0x0000, /* R11522 */
+ 0x0000, /* R11523 */
+ 0x0000, /* R11524 */
+ 0x0000, /* R11525 */
+ 0x0000, /* R11526 */
+ 0x0000, /* R11527 */
+ 0x0000, /* R11528 */
+ 0x0000, /* R11529 */
+ 0x0000, /* R11530 */
+ 0x0000, /* R11531 */
+ 0x0000, /* R11532 */
+ 0x0000, /* R11533 */
+ 0x0000, /* R11534 */
+ 0x0000, /* R11535 */
+ 0x0000, /* R11536 */
+ 0x0000, /* R11537 */
+ 0x0000, /* R11538 */
+ 0x0000, /* R11539 */
+ 0x0000, /* R11540 */
+ 0x0000, /* R11541 */
+ 0x0000, /* R11542 */
+ 0x0000, /* R11543 */
+ 0x0000, /* R11544 */
+ 0x0000, /* R11545 */
+ 0x0000, /* R11546 */
+ 0x0000, /* R11547 */
+ 0x0000, /* R11548 */
+ 0x0000, /* R11549 */
+ 0x0000, /* R11550 */
+ 0x0000, /* R11551 */
+ 0x0000, /* R11552 */
+ 0x0000, /* R11553 */
+ 0x0000, /* R11554 */
+ 0x0000, /* R11555 */
+ 0x0000, /* R11556 */
+ 0x0000, /* R11557 */
+ 0x0000, /* R11558 */
+ 0x0000, /* R11559 */
+ 0x0000, /* R11560 */
+ 0x0000, /* R11561 */
+ 0x0000, /* R11562 */
+ 0x0000, /* R11563 */
+ 0x0000, /* R11564 */
+ 0x0000, /* R11565 */
+ 0x0000, /* R11566 */
+ 0x0000, /* R11567 */
+ 0x0000, /* R11568 */
+ 0x0000, /* R11569 */
+ 0x0000, /* R11570 */
+ 0x0000, /* R11571 */
+ 0x0000, /* R11572 */
+ 0x0000, /* R11573 */
+ 0x0000, /* R11574 */
+ 0x0000, /* R11575 */
+ 0x0000, /* R11576 */
+ 0x0000, /* R11577 */
+ 0x0000, /* R11578 */
+ 0x0000, /* R11579 */
+ 0x0000, /* R11580 */
+ 0x0000, /* R11581 */
+ 0x0000, /* R11582 */
+ 0x0000, /* R11583 */
+ 0x0000, /* R11584 */
+ 0x0000, /* R11585 */
+ 0x0000, /* R11586 */
+ 0x0000, /* R11587 */
+ 0x0000, /* R11588 */
+ 0x0000, /* R11589 */
+ 0x0000, /* R11590 */
+ 0x0000, /* R11591 */
+ 0x0000, /* R11592 */
+ 0x0000, /* R11593 */
+ 0x0000, /* R11594 */
+ 0x0000, /* R11595 */
+ 0x0000, /* R11596 */
+ 0x0000, /* R11597 */
+ 0x0000, /* R11598 */
+ 0x0000, /* R11599 */
+ 0x0000, /* R11600 */
+ 0x0000, /* R11601 */
+ 0x0000, /* R11602 */
+ 0x0000, /* R11603 */
+ 0x0000, /* R11604 */
+ 0x0000, /* R11605 */
+ 0x0000, /* R11606 */
+ 0x0000, /* R11607 */
+ 0x0000, /* R11608 */
+ 0x0000, /* R11609 */
+ 0x0000, /* R11610 */
+ 0x0000, /* R11611 */
+ 0x0000, /* R11612 */
+ 0x0000, /* R11613 */
+ 0x0000, /* R11614 */
+ 0x0000, /* R11615 */
+ 0x0000, /* R11616 */
+ 0x0000, /* R11617 */
+ 0x0000, /* R11618 */
+ 0x0000, /* R11619 */
+ 0x0000, /* R11620 */
+ 0x0000, /* R11621 */
+ 0x0000, /* R11622 */
+ 0x0000, /* R11623 */
+ 0x0000, /* R11624 */
+ 0x0000, /* R11625 */
+ 0x0000, /* R11626 */
+ 0x0000, /* R11627 */
+ 0x0000, /* R11628 */
+ 0x0000, /* R11629 */
+ 0x0000, /* R11630 */
+ 0x0000, /* R11631 */
+ 0x0000, /* R11632 */
+ 0x0000, /* R11633 */
+ 0x0000, /* R11634 */
+ 0x0000, /* R11635 */
+ 0x0000, /* R11636 */
+ 0x0000, /* R11637 */
+ 0x0000, /* R11638 */
+ 0x0000, /* R11639 */
+ 0x0000, /* R11640 */
+ 0x0000, /* R11641 */
+ 0x0000, /* R11642 */
+ 0x0000, /* R11643 */
+ 0x0000, /* R11644 */
+ 0x0000, /* R11645 */
+ 0x0000, /* R11646 */
+ 0x0000, /* R11647 */
+ 0x0000, /* R11648 */
+ 0x0000, /* R11649 */
+ 0x0000, /* R11650 */
+ 0x0000, /* R11651 */
+ 0x0000, /* R11652 */
+ 0x0000, /* R11653 */
+ 0x0000, /* R11654 */
+ 0x0000, /* R11655 */
+ 0x0000, /* R11656 */
+ 0x0000, /* R11657 */
+ 0x0000, /* R11658 */
+ 0x0000, /* R11659 */
+ 0x0000, /* R11660 */
+ 0x0000, /* R11661 */
+ 0x0000, /* R11662 */
+ 0x0000, /* R11663 */
+ 0x0000, /* R11664 */
+ 0x0000, /* R11665 */
+ 0x0000, /* R11666 */
+ 0x0000, /* R11667 */
+ 0x0000, /* R11668 */
+ 0x0000, /* R11669 */
+ 0x0000, /* R11670 */
+ 0x0000, /* R11671 */
+ 0x0000, /* R11672 */
+ 0x0000, /* R11673 */
+ 0x0000, /* R11674 */
+ 0x0000, /* R11675 */
+ 0x0000, /* R11676 */
+ 0x0000, /* R11677 */
+ 0x0000, /* R11678 */
+ 0x0000, /* R11679 */
+ 0x0000, /* R11680 */
+ 0x0000, /* R11681 */
+ 0x0000, /* R11682 */
+ 0x0000, /* R11683 */
+ 0x0000, /* R11684 */
+ 0x0000, /* R11685 */
+ 0x0000, /* R11686 */
+ 0x0000, /* R11687 */
+ 0x0000, /* R11688 */
+ 0x0000, /* R11689 */
+ 0x0000, /* R11690 */
+ 0x0000, /* R11691 */
+ 0x0000, /* R11692 */
+ 0x0000, /* R11693 */
+ 0x0000, /* R11694 */
+ 0x0000, /* R11695 */
+ 0x0000, /* R11696 */
+ 0x0000, /* R11697 */
+ 0x0000, /* R11698 */
+ 0x0000, /* R11699 */
+ 0x0000, /* R11700 */
+ 0x0000, /* R11701 */
+ 0x0000, /* R11702 */
+ 0x0000, /* R11703 */
+ 0x0000, /* R11704 */
+ 0x0000, /* R11705 */
+ 0x0000, /* R11706 */
+ 0x0000, /* R11707 */
+ 0x0000, /* R11708 */
+ 0x0000, /* R11709 */
+ 0x0000, /* R11710 */
+ 0x0000, /* R11711 */
+ 0x0000, /* R11712 */
+ 0x0000, /* R11713 */
+ 0x0000, /* R11714 */
+ 0x0000, /* R11715 */
+ 0x0000, /* R11716 */
+ 0x0000, /* R11717 */
+ 0x0000, /* R11718 */
+ 0x0000, /* R11719 */
+ 0x0000, /* R11720 */
+ 0x0000, /* R11721 */
+ 0x0000, /* R11722 */
+ 0x0000, /* R11723 */
+ 0x0000, /* R11724 */
+ 0x0000, /* R11725 */
+ 0x0000, /* R11726 */
+ 0x0000, /* R11727 */
+ 0x0000, /* R11728 */
+ 0x0000, /* R11729 */
+ 0x0000, /* R11730 */
+ 0x0000, /* R11731 */
+ 0x0000, /* R11732 */
+ 0x0000, /* R11733 */
+ 0x0000, /* R11734 */
+ 0x0000, /* R11735 */
+ 0x0000, /* R11736 */
+ 0x0000, /* R11737 */
+ 0x0000, /* R11738 */
+ 0x0000, /* R11739 */
+ 0x0000, /* R11740 */
+ 0x0000, /* R11741 */
+ 0x0000, /* R11742 */
+ 0x0000, /* R11743 */
+ 0x0000, /* R11744 */
+ 0x0000, /* R11745 */
+ 0x0000, /* R11746 */
+ 0x0000, /* R11747 */
+ 0x0000, /* R11748 */
+ 0x0000, /* R11749 */
+ 0x0000, /* R11750 */
+ 0x0000, /* R11751 */
+ 0x0000, /* R11752 */
+ 0x0000, /* R11753 */
+ 0x0000, /* R11754 */
+ 0x0000, /* R11755 */
+ 0x0000, /* R11756 */
+ 0x0000, /* R11757 */
+ 0x0000, /* R11758 */
+ 0x0000, /* R11759 */
+ 0x0000, /* R11760 */
+ 0x0000, /* R11761 */
+ 0x0000, /* R11762 */
+ 0x0000, /* R11763 */
+ 0x0000, /* R11764 */
+ 0x0000, /* R11765 */
+ 0x0000, /* R11766 */
+ 0x0000, /* R11767 */
+ 0x0000, /* R11768 */
+ 0x0000, /* R11769 */
+ 0x0000, /* R11770 */
+ 0x0000, /* R11771 */
+ 0x0000, /* R11772 */
+ 0x0000, /* R11773 */
+ 0x0000, /* R11774 */
+ 0x0000, /* R11775 */
+ 0x0000, /* R11776 */
+ 0x0000, /* R11777 */
+ 0x0000, /* R11778 */
+ 0x0000, /* R11779 */
+ 0x0000, /* R11780 */
+ 0x0000, /* R11781 */
+ 0x0000, /* R11782 */
+ 0x0000, /* R11783 */
+ 0x0000, /* R11784 */
+ 0x0000, /* R11785 */
+ 0x0000, /* R11786 */
+ 0x0000, /* R11787 */
+ 0x0000, /* R11788 */
+ 0x0000, /* R11789 */
+ 0x0000, /* R11790 */
+ 0x0000, /* R11791 */
+ 0x0000, /* R11792 */
+ 0x0000, /* R11793 */
+ 0x0000, /* R11794 */
+ 0x0000, /* R11795 */
+ 0x0000, /* R11796 */
+ 0x0000, /* R11797 */
+ 0x0000, /* R11798 */
+ 0x0000, /* R11799 */
+ 0x0000, /* R11800 */
+ 0x0000, /* R11801 */
+ 0x0000, /* R11802 */
+ 0x0000, /* R11803 */
+ 0x0000, /* R11804 */
+ 0x0000, /* R11805 */
+ 0x0000, /* R11806 */
+ 0x0000, /* R11807 */
+ 0x0000, /* R11808 */
+ 0x0000, /* R11809 */
+ 0x0000, /* R11810 */
+ 0x0000, /* R11811 */
+ 0x0000, /* R11812 */
+ 0x0000, /* R11813 */
+ 0x0000, /* R11814 */
+ 0x0000, /* R11815 */
+ 0x0000, /* R11816 */
+ 0x0000, /* R11817 */
+ 0x0000, /* R11818 */
+ 0x0000, /* R11819 */
+ 0x0000, /* R11820 */
+ 0x0000, /* R11821 */
+ 0x0000, /* R11822 */
+ 0x0000, /* R11823 */
+ 0x0000, /* R11824 */
+ 0x0000, /* R11825 */
+ 0x0000, /* R11826 */
+ 0x0000, /* R11827 */
+ 0x0000, /* R11828 */
+ 0x0000, /* R11829 */
+ 0x0000, /* R11830 */
+ 0x0000, /* R11831 */
+ 0x0000, /* R11832 */
+ 0x0000, /* R11833 */
+ 0x0000, /* R11834 */
+ 0x0000, /* R11835 */
+ 0x0000, /* R11836 */
+ 0x0000, /* R11837 */
+ 0x0000, /* R11838 */
+ 0x0000, /* R11839 */
+ 0x0000, /* R11840 */
+ 0x0000, /* R11841 */
+ 0x0000, /* R11842 */
+ 0x0000, /* R11843 */
+ 0x0000, /* R11844 */
+ 0x0000, /* R11845 */
+ 0x0000, /* R11846 */
+ 0x0000, /* R11847 */
+ 0x0000, /* R11848 */
+ 0x0000, /* R11849 */
+ 0x0000, /* R11850 */
+ 0x0000, /* R11851 */
+ 0x0000, /* R11852 */
+ 0x0000, /* R11853 */
+ 0x0000, /* R11854 */
+ 0x0000, /* R11855 */
+ 0x0000, /* R11856 */
+ 0x0000, /* R11857 */
+ 0x0000, /* R11858 */
+ 0x0000, /* R11859 */
+ 0x0000, /* R11860 */
+ 0x0000, /* R11861 */
+ 0x0000, /* R11862 */
+ 0x0000, /* R11863 */
+ 0x0000, /* R11864 */
+ 0x0000, /* R11865 */
+ 0x0000, /* R11866 */
+ 0x0000, /* R11867 */
+ 0x0000, /* R11868 */
+ 0x0000, /* R11869 */
+ 0x0000, /* R11870 */
+ 0x0000, /* R11871 */
+ 0x0000, /* R11872 */
+ 0x0000, /* R11873 */
+ 0x0000, /* R11874 */
+ 0x0000, /* R11875 */
+ 0x0000, /* R11876 */
+ 0x0000, /* R11877 */
+ 0x0000, /* R11878 */
+ 0x0000, /* R11879 */
+ 0x0000, /* R11880 */
+ 0x0000, /* R11881 */
+ 0x0000, /* R11882 */
+ 0x0000, /* R11883 */
+ 0x0000, /* R11884 */
+ 0x0000, /* R11885 */
+ 0x0000, /* R11886 */
+ 0x0000, /* R11887 */
+ 0x0000, /* R11888 */
+ 0x0000, /* R11889 */
+ 0x0000, /* R11890 */
+ 0x0000, /* R11891 */
+ 0x0000, /* R11892 */
+ 0x0000, /* R11893 */
+ 0x0000, /* R11894 */
+ 0x0000, /* R11895 */
+ 0x0000, /* R11896 */
+ 0x0000, /* R11897 */
+ 0x0000, /* R11898 */
+ 0x0000, /* R11899 */
+ 0x0000, /* R11900 */
+ 0x0000, /* R11901 */
+ 0x0000, /* R11902 */
+ 0x0000, /* R11903 */
+ 0x0000, /* R11904 */
+ 0x0000, /* R11905 */
+ 0x0000, /* R11906 */
+ 0x0000, /* R11907 */
+ 0x0000, /* R11908 */
+ 0x0000, /* R11909 */
+ 0x0000, /* R11910 */
+ 0x0000, /* R11911 */
+ 0x0000, /* R11912 */
+ 0x0000, /* R11913 */
+ 0x0000, /* R11914 */
+ 0x0000, /* R11915 */
+ 0x0000, /* R11916 */
+ 0x0000, /* R11917 */
+ 0x0000, /* R11918 */
+ 0x0000, /* R11919 */
+ 0x0000, /* R11920 */
+ 0x0000, /* R11921 */
+ 0x0000, /* R11922 */
+ 0x0000, /* R11923 */
+ 0x0000, /* R11924 */
+ 0x0000, /* R11925 */
+ 0x0000, /* R11926 */
+ 0x0000, /* R11927 */
+ 0x0000, /* R11928 */
+ 0x0000, /* R11929 */
+ 0x0000, /* R11930 */
+ 0x0000, /* R11931 */
+ 0x0000, /* R11932 */
+ 0x0000, /* R11933 */
+ 0x0000, /* R11934 */
+ 0x0000, /* R11935 */
+ 0x0000, /* R11936 */
+ 0x0000, /* R11937 */
+ 0x0000, /* R11938 */
+ 0x0000, /* R11939 */
+ 0x0000, /* R11940 */
+ 0x0000, /* R11941 */
+ 0x0000, /* R11942 */
+ 0x0000, /* R11943 */
+ 0x0000, /* R11944 */
+ 0x0000, /* R11945 */
+ 0x0000, /* R11946 */
+ 0x0000, /* R11947 */
+ 0x0000, /* R11948 */
+ 0x0000, /* R11949 */
+ 0x0000, /* R11950 */
+ 0x0000, /* R11951 */
+ 0x0000, /* R11952 */
+ 0x0000, /* R11953 */
+ 0x0000, /* R11954 */
+ 0x0000, /* R11955 */
+ 0x0000, /* R11956 */
+ 0x0000, /* R11957 */
+ 0x0000, /* R11958 */
+ 0x0000, /* R11959 */
+ 0x0000, /* R11960 */
+ 0x0000, /* R11961 */
+ 0x0000, /* R11962 */
+ 0x0000, /* R11963 */
+ 0x0000, /* R11964 */
+ 0x0000, /* R11965 */
+ 0x0000, /* R11966 */
+ 0x0000, /* R11967 */
+ 0x0000, /* R11968 */
+ 0x0000, /* R11969 */
+ 0x0000, /* R11970 */
+ 0x0000, /* R11971 */
+ 0x0000, /* R11972 */
+ 0x0000, /* R11973 */
+ 0x0000, /* R11974 */
+ 0x0000, /* R11975 */
+ 0x0000, /* R11976 */
+ 0x0000, /* R11977 */
+ 0x0000, /* R11978 */
+ 0x0000, /* R11979 */
+ 0x0000, /* R11980 */
+ 0x0000, /* R11981 */
+ 0x0000, /* R11982 */
+ 0x0000, /* R11983 */
+ 0x0000, /* R11984 */
+ 0x0000, /* R11985 */
+ 0x0000, /* R11986 */
+ 0x0000, /* R11987 */
+ 0x0000, /* R11988 */
+ 0x0000, /* R11989 */
+ 0x0000, /* R11990 */
+ 0x0000, /* R11991 */
+ 0x0000, /* R11992 */
+ 0x0000, /* R11993 */
+ 0x0000, /* R11994 */
+ 0x0000, /* R11995 */
+ 0x0000, /* R11996 */
+ 0x0000, /* R11997 */
+ 0x0000, /* R11998 */
+ 0x0000, /* R11999 */
+ 0x0000, /* R12000 */
+ 0x0000, /* R12001 */
+ 0x0000, /* R12002 */
+ 0x0000, /* R12003 */
+ 0x0000, /* R12004 */
+ 0x0000, /* R12005 */
+ 0x0000, /* R12006 */
+ 0x0000, /* R12007 */
+ 0x0000, /* R12008 */
+ 0x0000, /* R12009 */
+ 0x0000, /* R12010 */
+ 0x0000, /* R12011 */
+ 0x0000, /* R12012 */
+ 0x0000, /* R12013 */
+ 0x0000, /* R12014 */
+ 0x0000, /* R12015 */
+ 0x0000, /* R12016 */
+ 0x0000, /* R12017 */
+ 0x0000, /* R12018 */
+ 0x0000, /* R12019 */
+ 0x0000, /* R12020 */
+ 0x0000, /* R12021 */
+ 0x0000, /* R12022 */
+ 0x0000, /* R12023 */
+ 0x0000, /* R12024 */
+ 0x0000, /* R12025 */
+ 0x0000, /* R12026 */
+ 0x0000, /* R12027 */
+ 0x0000, /* R12028 */
+ 0x0000, /* R12029 */
+ 0x0000, /* R12030 */
+ 0x0000, /* R12031 */
+ 0x0000, /* R12032 */
+ 0x0000, /* R12033 */
+ 0x0000, /* R12034 */
+ 0x0000, /* R12035 */
+ 0x0000, /* R12036 */
+ 0x0000, /* R12037 */
+ 0x0000, /* R12038 */
+ 0x0000, /* R12039 */
+ 0x0000, /* R12040 */
+ 0x0000, /* R12041 */
+ 0x0000, /* R12042 */
+ 0x0000, /* R12043 */
+ 0x0000, /* R12044 */
+ 0x0000, /* R12045 */
+ 0x0000, /* R12046 */
+ 0x0000, /* R12047 */
+ 0x0000, /* R12048 */
+ 0x0000, /* R12049 */
+ 0x0000, /* R12050 */
+ 0x0000, /* R12051 */
+ 0x0000, /* R12052 */
+ 0x0000, /* R12053 */
+ 0x0000, /* R12054 */
+ 0x0000, /* R12055 */
+ 0x0000, /* R12056 */
+ 0x0000, /* R12057 */
+ 0x0000, /* R12058 */
+ 0x0000, /* R12059 */
+ 0x0000, /* R12060 */
+ 0x0000, /* R12061 */
+ 0x0000, /* R12062 */
+ 0x0000, /* R12063 */
+ 0x0000, /* R12064 */
+ 0x0000, /* R12065 */
+ 0x0000, /* R12066 */
+ 0x0000, /* R12067 */
+ 0x0000, /* R12068 */
+ 0x0000, /* R12069 */
+ 0x0000, /* R12070 */
+ 0x0000, /* R12071 */
+ 0x0000, /* R12072 */
+ 0x0000, /* R12073 */
+ 0x0000, /* R12074 */
+ 0x0000, /* R12075 */
+ 0x0000, /* R12076 */
+ 0x0000, /* R12077 */
+ 0x0000, /* R12078 */
+ 0x0000, /* R12079 */
+ 0x0000, /* R12080 */
+ 0x0000, /* R12081 */
+ 0x0000, /* R12082 */
+ 0x0000, /* R12083 */
+ 0x0000, /* R12084 */
+ 0x0000, /* R12085 */
+ 0x0000, /* R12086 */
+ 0x0000, /* R12087 */
+ 0x0000, /* R12088 */
+ 0x0000, /* R12089 */
+ 0x0000, /* R12090 */
+ 0x0000, /* R12091 */
+ 0x0000, /* R12092 */
+ 0x0000, /* R12093 */
+ 0x0000, /* R12094 */
+ 0x0000, /* R12095 */
+ 0x0000, /* R12096 */
+ 0x0000, /* R12097 */
+ 0x0000, /* R12098 */
+ 0x0000, /* R12099 */
+ 0x0000, /* R12100 */
+ 0x0000, /* R12101 */
+ 0x0000, /* R12102 */
+ 0x0000, /* R12103 */
+ 0x0000, /* R12104 */
+ 0x0000, /* R12105 */
+ 0x0000, /* R12106 */
+ 0x0000, /* R12107 */
+ 0x0000, /* R12108 */
+ 0x0000, /* R12109 */
+ 0x0000, /* R12110 */
+ 0x0000, /* R12111 */
+ 0x0000, /* R12112 */
+ 0x0000, /* R12113 */
+ 0x0000, /* R12114 */
+ 0x0000, /* R12115 */
+ 0x0000, /* R12116 */
+ 0x0000, /* R12117 */
+ 0x0000, /* R12118 */
+ 0x0000, /* R12119 */
+ 0x0000, /* R12120 */
+ 0x0000, /* R12121 */
+ 0x0000, /* R12122 */
+ 0x0000, /* R12123 */
+ 0x0000, /* R12124 */
+ 0x0000, /* R12125 */
+ 0x0000, /* R12126 */
+ 0x0000, /* R12127 */
+ 0x0000, /* R12128 */
+ 0x0000, /* R12129 */
+ 0x0000, /* R12130 */
+ 0x0000, /* R12131 */
+ 0x0000, /* R12132 */
+ 0x0000, /* R12133 */
+ 0x0000, /* R12134 */
+ 0x0000, /* R12135 */
+ 0x0000, /* R12136 */
+ 0x0000, /* R12137 */
+ 0x0000, /* R12138 */
+ 0x0000, /* R12139 */
+ 0x0000, /* R12140 */
+ 0x0000, /* R12141 */
+ 0x0000, /* R12142 */
+ 0x0000, /* R12143 */
+ 0x0000, /* R12144 */
+ 0x0000, /* R12145 */
+ 0x0000, /* R12146 */
+ 0x0000, /* R12147 */
+ 0x0000, /* R12148 */
+ 0x0000, /* R12149 */
+ 0x0000, /* R12150 */
+ 0x0000, /* R12151 */
+ 0x0000, /* R12152 */
+ 0x0000, /* R12153 */
+ 0x0000, /* R12154 */
+ 0x0000, /* R12155 */
+ 0x0000, /* R12156 */
+ 0x0000, /* R12157 */
+ 0x0000, /* R12158 */
+ 0x0000, /* R12159 */
+ 0x0000, /* R12160 */
+ 0x0000, /* R12161 */
+ 0x0000, /* R12162 */
+ 0x0000, /* R12163 */
+ 0x0000, /* R12164 */
+ 0x0000, /* R12165 */
+ 0x0000, /* R12166 */
+ 0x0000, /* R12167 */
+ 0x0000, /* R12168 */
+ 0x0000, /* R12169 */
+ 0x0000, /* R12170 */
+ 0x0000, /* R12171 */
+ 0x0000, /* R12172 */
+ 0x0000, /* R12173 */
+ 0x0000, /* R12174 */
+ 0x0000, /* R12175 */
+ 0x0000, /* R12176 */
+ 0x0000, /* R12177 */
+ 0x0000, /* R12178 */
+ 0x0000, /* R12179 */
+ 0x0000, /* R12180 */
+ 0x0000, /* R12181 */
+ 0x0000, /* R12182 */
+ 0x0000, /* R12183 */
+ 0x0000, /* R12184 */
+ 0x0000, /* R12185 */
+ 0x0000, /* R12186 */
+ 0x0000, /* R12187 */
+ 0x0000, /* R12188 */
+ 0x0000, /* R12189 */
+ 0x0000, /* R12190 */
+ 0x0000, /* R12191 */
+ 0x0000, /* R12192 */
+ 0x0000, /* R12193 */
+ 0x0000, /* R12194 */
+ 0x0000, /* R12195 */
+ 0x0000, /* R12196 */
+ 0x0000, /* R12197 */
+ 0x0000, /* R12198 */
+ 0x0000, /* R12199 */
+ 0x0000, /* R12200 */
+ 0x0000, /* R12201 */
+ 0x0000, /* R12202 */
+ 0x0000, /* R12203 */
+ 0x0000, /* R12204 */
+ 0x0000, /* R12205 */
+ 0x0000, /* R12206 */
+ 0x0000, /* R12207 */
+ 0x0000, /* R12208 */
+ 0x0000, /* R12209 */
+ 0x0000, /* R12210 */
+ 0x0000, /* R12211 */
+ 0x0000, /* R12212 */
+ 0x0000, /* R12213 */
+ 0x0000, /* R12214 */
+ 0x0000, /* R12215 */
+ 0x0000, /* R12216 */
+ 0x0000, /* R12217 */
+ 0x0000, /* R12218 */
+ 0x0000, /* R12219 */
+ 0x0000, /* R12220 */
+ 0x0000, /* R12221 */
+ 0x0000, /* R12222 */
+ 0x0000, /* R12223 */
+ 0x0000, /* R12224 */
+ 0x0000, /* R12225 */
+ 0x0000, /* R12226 */
+ 0x0000, /* R12227 */
+ 0x0000, /* R12228 */
+ 0x0000, /* R12229 */
+ 0x0000, /* R12230 */
+ 0x0000, /* R12231 */
+ 0x0000, /* R12232 */
+ 0x0000, /* R12233 */
+ 0x0000, /* R12234 */
+ 0x0000, /* R12235 */
+ 0x0000, /* R12236 */
+ 0x0000, /* R12237 */
+ 0x0000, /* R12238 */
+ 0x0000, /* R12239 */
+ 0x0000, /* R12240 */
+ 0x0000, /* R12241 */
+ 0x0000, /* R12242 */
+ 0x0000, /* R12243 */
+ 0x0000, /* R12244 */
+ 0x0000, /* R12245 */
+ 0x0000, /* R12246 */
+ 0x0000, /* R12247 */
+ 0x0000, /* R12248 */
+ 0x0000, /* R12249 */
+ 0x0000, /* R12250 */
+ 0x0000, /* R12251 */
+ 0x0000, /* R12252 */
+ 0x0000, /* R12253 */
+ 0x0000, /* R12254 */
+ 0x0000, /* R12255 */
+ 0x0000, /* R12256 */
+ 0x0000, /* R12257 */
+ 0x0000, /* R12258 */
+ 0x0000, /* R12259 */
+ 0x0000, /* R12260 */
+ 0x0000, /* R12261 */
+ 0x0000, /* R12262 */
+ 0x0000, /* R12263 */
+ 0x0000, /* R12264 */
+ 0x0000, /* R12265 */
+ 0x0000, /* R12266 */
+ 0x0000, /* R12267 */
+ 0x0000, /* R12268 */
+ 0x0000, /* R12269 */
+ 0x0000, /* R12270 */
+ 0x0000, /* R12271 */
+ 0x0000, /* R12272 */
+ 0x0000, /* R12273 */
+ 0x0000, /* R12274 */
+ 0x0000, /* R12275 */
+ 0x0000, /* R12276 */
+ 0x0000, /* R12277 */
+ 0x0000, /* R12278 */
+ 0x0000, /* R12279 */
+ 0x0000, /* R12280 */
+ 0x0000, /* R12281 */
+ 0x0000, /* R12282 */
+ 0x0000, /* R12283 */
+ 0x0000, /* R12284 */
+ 0x0000, /* R12285 */
+ 0x0000, /* R12286 */
+ 0x0000, /* R12287 */
+ 0x0000, /* R12288 - DSP2 Data1 RAM 1 */
+ 0x0000, /* R12289 - DSP2 Data1 RAM 0 */
+ 0x0000, /* R12290 */
+ 0x0000, /* R12291 */
+ 0x0000, /* R12292 */
+ 0x0000, /* R12293 */
+ 0x0000, /* R12294 */
+ 0x0000, /* R12295 */
+ 0x0000, /* R12296 */
+ 0x0000, /* R12297 */
+ 0x0000, /* R12298 */
+ 0x0000, /* R12299 */
+ 0x0000, /* R12300 */
+ 0x0000, /* R12301 */
+ 0x0000, /* R12302 */
+ 0x0000, /* R12303 */
+ 0x0000, /* R12304 */
+ 0x0000, /* R12305 */
+ 0x0000, /* R12306 */
+ 0x0000, /* R12307 */
+ 0x0000, /* R12308 */
+ 0x0000, /* R12309 */
+ 0x0000, /* R12310 */
+ 0x0000, /* R12311 */
+ 0x0000, /* R12312 */
+ 0x0000, /* R12313 */
+ 0x0000, /* R12314 */
+ 0x0000, /* R12315 */
+ 0x0000, /* R12316 */
+ 0x0000, /* R12317 */
+ 0x0000, /* R12318 */
+ 0x0000, /* R12319 */
+ 0x0000, /* R12320 */
+ 0x0000, /* R12321 */
+ 0x0000, /* R12322 */
+ 0x0000, /* R12323 */
+ 0x0000, /* R12324 */
+ 0x0000, /* R12325 */
+ 0x0000, /* R12326 */
+ 0x0000, /* R12327 */
+ 0x0000, /* R12328 */
+ 0x0000, /* R12329 */
+ 0x0000, /* R12330 */
+ 0x0000, /* R12331 */
+ 0x0000, /* R12332 */
+ 0x0000, /* R12333 */
+ 0x0000, /* R12334 */
+ 0x0000, /* R12335 */
+ 0x0000, /* R12336 */
+ 0x0000, /* R12337 */
+ 0x0000, /* R12338 */
+ 0x0000, /* R12339 */
+ 0x0000, /* R12340 */
+ 0x0000, /* R12341 */
+ 0x0000, /* R12342 */
+ 0x0000, /* R12343 */
+ 0x0000, /* R12344 */
+ 0x0000, /* R12345 */
+ 0x0000, /* R12346 */
+ 0x0000, /* R12347 */
+ 0x0000, /* R12348 */
+ 0x0000, /* R12349 */
+ 0x0000, /* R12350 */
+ 0x0000, /* R12351 */
+ 0x0000, /* R12352 */
+ 0x0000, /* R12353 */
+ 0x0000, /* R12354 */
+ 0x0000, /* R12355 */
+ 0x0000, /* R12356 */
+ 0x0000, /* R12357 */
+ 0x0000, /* R12358 */
+ 0x0000, /* R12359 */
+ 0x0000, /* R12360 */
+ 0x0000, /* R12361 */
+ 0x0000, /* R12362 */
+ 0x0000, /* R12363 */
+ 0x0000, /* R12364 */
+ 0x0000, /* R12365 */
+ 0x0000, /* R12366 */
+ 0x0000, /* R12367 */
+ 0x0000, /* R12368 */
+ 0x0000, /* R12369 */
+ 0x0000, /* R12370 */
+ 0x0000, /* R12371 */
+ 0x0000, /* R12372 */
+ 0x0000, /* R12373 */
+ 0x0000, /* R12374 */
+ 0x0000, /* R12375 */
+ 0x0000, /* R12376 */
+ 0x0000, /* R12377 */
+ 0x0000, /* R12378 */
+ 0x0000, /* R12379 */
+ 0x0000, /* R12380 */
+ 0x0000, /* R12381 */
+ 0x0000, /* R12382 */
+ 0x0000, /* R12383 */
+ 0x0000, /* R12384 */
+ 0x0000, /* R12385 */
+ 0x0000, /* R12386 */
+ 0x0000, /* R12387 */
+ 0x0000, /* R12388 */
+ 0x0000, /* R12389 */
+ 0x0000, /* R12390 */
+ 0x0000, /* R12391 */
+ 0x0000, /* R12392 */
+ 0x0000, /* R12393 */
+ 0x0000, /* R12394 */
+ 0x0000, /* R12395 */
+ 0x0000, /* R12396 */
+ 0x0000, /* R12397 */
+ 0x0000, /* R12398 */
+ 0x0000, /* R12399 */
+ 0x0000, /* R12400 */
+ 0x0000, /* R12401 */
+ 0x0000, /* R12402 */
+ 0x0000, /* R12403 */
+ 0x0000, /* R12404 */
+ 0x0000, /* R12405 */
+ 0x0000, /* R12406 */
+ 0x0000, /* R12407 */
+ 0x0000, /* R12408 */
+ 0x0000, /* R12409 */
+ 0x0000, /* R12410 */
+ 0x0000, /* R12411 */
+ 0x0000, /* R12412 */
+ 0x0000, /* R12413 */
+ 0x0000, /* R12414 */
+ 0x0000, /* R12415 */
+ 0x0000, /* R12416 */
+ 0x0000, /* R12417 */
+ 0x0000, /* R12418 */
+ 0x0000, /* R12419 */
+ 0x0000, /* R12420 */
+ 0x0000, /* R12421 */
+ 0x0000, /* R12422 */
+ 0x0000, /* R12423 */
+ 0x0000, /* R12424 */
+ 0x0000, /* R12425 */
+ 0x0000, /* R12426 */
+ 0x0000, /* R12427 */
+ 0x0000, /* R12428 */
+ 0x0000, /* R12429 */
+ 0x0000, /* R12430 */
+ 0x0000, /* R12431 */
+ 0x0000, /* R12432 */
+ 0x0000, /* R12433 */
+ 0x0000, /* R12434 */
+ 0x0000, /* R12435 */
+ 0x0000, /* R12436 */
+ 0x0000, /* R12437 */
+ 0x0000, /* R12438 */
+ 0x0000, /* R12439 */
+ 0x0000, /* R12440 */
+ 0x0000, /* R12441 */
+ 0x0000, /* R12442 */
+ 0x0000, /* R12443 */
+ 0x0000, /* R12444 */
+ 0x0000, /* R12445 */
+ 0x0000, /* R12446 */
+ 0x0000, /* R12447 */
+ 0x0000, /* R12448 */
+ 0x0000, /* R12449 */
+ 0x0000, /* R12450 */
+ 0x0000, /* R12451 */
+ 0x0000, /* R12452 */
+ 0x0000, /* R12453 */
+ 0x0000, /* R12454 */
+ 0x0000, /* R12455 */
+ 0x0000, /* R12456 */
+ 0x0000, /* R12457 */
+ 0x0000, /* R12458 */
+ 0x0000, /* R12459 */
+ 0x0000, /* R12460 */
+ 0x0000, /* R12461 */
+ 0x0000, /* R12462 */
+ 0x0000, /* R12463 */
+ 0x0000, /* R12464 */
+ 0x0000, /* R12465 */
+ 0x0000, /* R12466 */
+ 0x0000, /* R12467 */
+ 0x0000, /* R12468 */
+ 0x0000, /* R12469 */
+ 0x0000, /* R12470 */
+ 0x0000, /* R12471 */
+ 0x0000, /* R12472 */
+ 0x0000, /* R12473 */
+ 0x0000, /* R12474 */
+ 0x0000, /* R12475 */
+ 0x0000, /* R12476 */
+ 0x0000, /* R12477 */
+ 0x0000, /* R12478 */
+ 0x0000, /* R12479 */
+ 0x0000, /* R12480 */
+ 0x0000, /* R12481 */
+ 0x0000, /* R12482 */
+ 0x0000, /* R12483 */
+ 0x0000, /* R12484 */
+ 0x0000, /* R12485 */
+ 0x0000, /* R12486 */
+ 0x0000, /* R12487 */
+ 0x0000, /* R12488 */
+ 0x0000, /* R12489 */
+ 0x0000, /* R12490 */
+ 0x0000, /* R12491 */
+ 0x0000, /* R12492 */
+ 0x0000, /* R12493 */
+ 0x0000, /* R12494 */
+ 0x0000, /* R12495 */
+ 0x0000, /* R12496 */
+ 0x0000, /* R12497 */
+ 0x0000, /* R12498 */
+ 0x0000, /* R12499 */
+ 0x0000, /* R12500 */
+ 0x0000, /* R12501 */
+ 0x0000, /* R12502 */
+ 0x0000, /* R12503 */
+ 0x0000, /* R12504 */
+ 0x0000, /* R12505 */
+ 0x0000, /* R12506 */
+ 0x0000, /* R12507 */
+ 0x0000, /* R12508 */
+ 0x0000, /* R12509 */
+ 0x0000, /* R12510 */
+ 0x0000, /* R12511 */
+ 0x0000, /* R12512 */
+ 0x0000, /* R12513 */
+ 0x0000, /* R12514 */
+ 0x0000, /* R12515 */
+ 0x0000, /* R12516 */
+ 0x0000, /* R12517 */
+ 0x0000, /* R12518 */
+ 0x0000, /* R12519 */
+ 0x0000, /* R12520 */
+ 0x0000, /* R12521 */
+ 0x0000, /* R12522 */
+ 0x0000, /* R12523 */
+ 0x0000, /* R12524 */
+ 0x0000, /* R12525 */
+ 0x0000, /* R12526 */
+ 0x0000, /* R12527 */
+ 0x0000, /* R12528 */
+ 0x0000, /* R12529 */
+ 0x0000, /* R12530 */
+ 0x0000, /* R12531 */
+ 0x0000, /* R12532 */
+ 0x0000, /* R12533 */
+ 0x0000, /* R12534 */
+ 0x0000, /* R12535 */
+ 0x0000, /* R12536 */
+ 0x0000, /* R12537 */
+ 0x0000, /* R12538 */
+ 0x0000, /* R12539 */
+ 0x0000, /* R12540 */
+ 0x0000, /* R12541 */
+ 0x0000, /* R12542 */
+ 0x0000, /* R12543 */
+ 0x0000, /* R12544 */
+ 0x0000, /* R12545 */
+ 0x0000, /* R12546 */
+ 0x0000, /* R12547 */
+ 0x0000, /* R12548 */
+ 0x0000, /* R12549 */
+ 0x0000, /* R12550 */
+ 0x0000, /* R12551 */
+ 0x0000, /* R12552 */
+ 0x0000, /* R12553 */
+ 0x0000, /* R12554 */
+ 0x0000, /* R12555 */
+ 0x0000, /* R12556 */
+ 0x0000, /* R12557 */
+ 0x0000, /* R12558 */
+ 0x0000, /* R12559 */
+ 0x0000, /* R12560 */
+ 0x0000, /* R12561 */
+ 0x0000, /* R12562 */
+ 0x0000, /* R12563 */
+ 0x0000, /* R12564 */
+ 0x0000, /* R12565 */
+ 0x0000, /* R12566 */
+ 0x0000, /* R12567 */
+ 0x0000, /* R12568 */
+ 0x0000, /* R12569 */
+ 0x0000, /* R12570 */
+ 0x0000, /* R12571 */
+ 0x0000, /* R12572 */
+ 0x0000, /* R12573 */
+ 0x0000, /* R12574 */
+ 0x0000, /* R12575 */
+ 0x0000, /* R12576 */
+ 0x0000, /* R12577 */
+ 0x0000, /* R12578 */
+ 0x0000, /* R12579 */
+ 0x0000, /* R12580 */
+ 0x0000, /* R12581 */
+ 0x0000, /* R12582 */
+ 0x0000, /* R12583 */
+ 0x0000, /* R12584 */
+ 0x0000, /* R12585 */
+ 0x0000, /* R12586 */
+ 0x0000, /* R12587 */
+ 0x0000, /* R12588 */
+ 0x0000, /* R12589 */
+ 0x0000, /* R12590 */
+ 0x0000, /* R12591 */
+ 0x0000, /* R12592 */
+ 0x0000, /* R12593 */
+ 0x0000, /* R12594 */
+ 0x0000, /* R12595 */
+ 0x0000, /* R12596 */
+ 0x0000, /* R12597 */
+ 0x0000, /* R12598 */
+ 0x0000, /* R12599 */
+ 0x0000, /* R12600 */
+ 0x0000, /* R12601 */
+ 0x0000, /* R12602 */
+ 0x0000, /* R12603 */
+ 0x0000, /* R12604 */
+ 0x0000, /* R12605 */
+ 0x0000, /* R12606 */
+ 0x0000, /* R12607 */
+ 0x0000, /* R12608 */
+ 0x0000, /* R12609 */
+ 0x0000, /* R12610 */
+ 0x0000, /* R12611 */
+ 0x0000, /* R12612 */
+ 0x0000, /* R12613 */
+ 0x0000, /* R12614 */
+ 0x0000, /* R12615 */
+ 0x0000, /* R12616 */
+ 0x0000, /* R12617 */
+ 0x0000, /* R12618 */
+ 0x0000, /* R12619 */
+ 0x0000, /* R12620 */
+ 0x0000, /* R12621 */
+ 0x0000, /* R12622 */
+ 0x0000, /* R12623 */
+ 0x0000, /* R12624 */
+ 0x0000, /* R12625 */
+ 0x0000, /* R12626 */
+ 0x0000, /* R12627 */
+ 0x0000, /* R12628 */
+ 0x0000, /* R12629 */
+ 0x0000, /* R12630 */
+ 0x0000, /* R12631 */
+ 0x0000, /* R12632 */
+ 0x0000, /* R12633 */
+ 0x0000, /* R12634 */
+ 0x0000, /* R12635 */
+ 0x0000, /* R12636 */
+ 0x0000, /* R12637 */
+ 0x0000, /* R12638 */
+ 0x0000, /* R12639 */
+ 0x0000, /* R12640 */
+ 0x0000, /* R12641 */
+ 0x0000, /* R12642 */
+ 0x0000, /* R12643 */
+ 0x0000, /* R12644 */
+ 0x0000, /* R12645 */
+ 0x0000, /* R12646 */
+ 0x0000, /* R12647 */
+ 0x0000, /* R12648 */
+ 0x0000, /* R12649 */
+ 0x0000, /* R12650 */
+ 0x0000, /* R12651 */
+ 0x0000, /* R12652 */
+ 0x0000, /* R12653 */
+ 0x0000, /* R12654 */
+ 0x0000, /* R12655 */
+ 0x0000, /* R12656 */
+ 0x0000, /* R12657 */
+ 0x0000, /* R12658 */
+ 0x0000, /* R12659 */
+ 0x0000, /* R12660 */
+ 0x0000, /* R12661 */
+ 0x0000, /* R12662 */
+ 0x0000, /* R12663 */
+ 0x0000, /* R12664 */
+ 0x0000, /* R12665 */
+ 0x0000, /* R12666 */
+ 0x0000, /* R12667 */
+ 0x0000, /* R12668 */
+ 0x0000, /* R12669 */
+ 0x0000, /* R12670 */
+ 0x0000, /* R12671 */
+ 0x0000, /* R12672 */
+ 0x0000, /* R12673 */
+ 0x0000, /* R12674 */
+ 0x0000, /* R12675 */
+ 0x0000, /* R12676 */
+ 0x0000, /* R12677 */
+ 0x0000, /* R12678 */
+ 0x0000, /* R12679 */
+ 0x0000, /* R12680 */
+ 0x0000, /* R12681 */
+ 0x0000, /* R12682 */
+ 0x0000, /* R12683 */
+ 0x0000, /* R12684 */
+ 0x0000, /* R12685 */
+ 0x0000, /* R12686 */
+ 0x0000, /* R12687 */
+ 0x0000, /* R12688 */
+ 0x0000, /* R12689 */
+ 0x0000, /* R12690 */
+ 0x0000, /* R12691 */
+ 0x0000, /* R12692 */
+ 0x0000, /* R12693 */
+ 0x0000, /* R12694 */
+ 0x0000, /* R12695 */
+ 0x0000, /* R12696 */
+ 0x0000, /* R12697 */
+ 0x0000, /* R12698 */
+ 0x0000, /* R12699 */
+ 0x0000, /* R12700 */
+ 0x0000, /* R12701 */
+ 0x0000, /* R12702 */
+ 0x0000, /* R12703 */
+ 0x0000, /* R12704 */
+ 0x0000, /* R12705 */
+ 0x0000, /* R12706 */
+ 0x0000, /* R12707 */
+ 0x0000, /* R12708 */
+ 0x0000, /* R12709 */
+ 0x0000, /* R12710 */
+ 0x0000, /* R12711 */
+ 0x0000, /* R12712 */
+ 0x0000, /* R12713 */
+ 0x0000, /* R12714 */
+ 0x0000, /* R12715 */
+ 0x0000, /* R12716 */
+ 0x0000, /* R12717 */
+ 0x0000, /* R12718 */
+ 0x0000, /* R12719 */
+ 0x0000, /* R12720 */
+ 0x0000, /* R12721 */
+ 0x0000, /* R12722 */
+ 0x0000, /* R12723 */
+ 0x0000, /* R12724 */
+ 0x0000, /* R12725 */
+ 0x0000, /* R12726 */
+ 0x0000, /* R12727 */
+ 0x0000, /* R12728 */
+ 0x0000, /* R12729 */
+ 0x0000, /* R12730 */
+ 0x0000, /* R12731 */
+ 0x0000, /* R12732 */
+ 0x0000, /* R12733 */
+ 0x0000, /* R12734 */
+ 0x0000, /* R12735 */
+ 0x0000, /* R12736 */
+ 0x0000, /* R12737 */
+ 0x0000, /* R12738 */
+ 0x0000, /* R12739 */
+ 0x0000, /* R12740 */
+ 0x0000, /* R12741 */
+ 0x0000, /* R12742 */
+ 0x0000, /* R12743 */
+ 0x0000, /* R12744 */
+ 0x0000, /* R12745 */
+ 0x0000, /* R12746 */
+ 0x0000, /* R12747 */
+ 0x0000, /* R12748 */
+ 0x0000, /* R12749 */
+ 0x0000, /* R12750 */
+ 0x0000, /* R12751 */
+ 0x0000, /* R12752 */
+ 0x0000, /* R12753 */
+ 0x0000, /* R12754 */
+ 0x0000, /* R12755 */
+ 0x0000, /* R12756 */
+ 0x0000, /* R12757 */
+ 0x0000, /* R12758 */
+ 0x0000, /* R12759 */
+ 0x0000, /* R12760 */
+ 0x0000, /* R12761 */
+ 0x0000, /* R12762 */
+ 0x0000, /* R12763 */
+ 0x0000, /* R12764 */
+ 0x0000, /* R12765 */
+ 0x0000, /* R12766 */
+ 0x0000, /* R12767 */
+ 0x0000, /* R12768 */
+ 0x0000, /* R12769 */
+ 0x0000, /* R12770 */
+ 0x0000, /* R12771 */
+ 0x0000, /* R12772 */
+ 0x0000, /* R12773 */
+ 0x0000, /* R12774 */
+ 0x0000, /* R12775 */
+ 0x0000, /* R12776 */
+ 0x0000, /* R12777 */
+ 0x0000, /* R12778 */
+ 0x0000, /* R12779 */
+ 0x0000, /* R12780 */
+ 0x0000, /* R12781 */
+ 0x0000, /* R12782 */
+ 0x0000, /* R12783 */
+ 0x0000, /* R12784 */
+ 0x0000, /* R12785 */
+ 0x0000, /* R12786 */
+ 0x0000, /* R12787 */
+ 0x0000, /* R12788 */
+ 0x0000, /* R12789 */
+ 0x0000, /* R12790 */
+ 0x0000, /* R12791 */
+ 0x0000, /* R12792 */
+ 0x0000, /* R12793 */
+ 0x0000, /* R12794 */
+ 0x0000, /* R12795 */
+ 0x0000, /* R12796 */
+ 0x0000, /* R12797 */
+ 0x0000, /* R12798 */
+ 0x0000, /* R12799 */
+ 0x0000, /* R12800 */
+ 0x0000, /* R12801 */
+ 0x0000, /* R12802 */
+ 0x0000, /* R12803 */
+ 0x0000, /* R12804 */
+ 0x0000, /* R12805 */
+ 0x0000, /* R12806 */
+ 0x0000, /* R12807 */
+ 0x0000, /* R12808 */
+ 0x0000, /* R12809 */
+ 0x0000, /* R12810 */
+ 0x0000, /* R12811 */
+ 0x0000, /* R12812 */
+ 0x0000, /* R12813 */
+ 0x0000, /* R12814 */
+ 0x0000, /* R12815 */
+ 0x0000, /* R12816 */
+ 0x0000, /* R12817 */
+ 0x0000, /* R12818 */
+ 0x0000, /* R12819 */
+ 0x0000, /* R12820 */
+ 0x0000, /* R12821 */
+ 0x0000, /* R12822 */
+ 0x0000, /* R12823 */
+ 0x0000, /* R12824 */
+ 0x0000, /* R12825 */
+ 0x0000, /* R12826 */
+ 0x0000, /* R12827 */
+ 0x0000, /* R12828 */
+ 0x0000, /* R12829 */
+ 0x0000, /* R12830 */
+ 0x0000, /* R12831 */
+ 0x0000, /* R12832 */
+ 0x0000, /* R12833 */
+ 0x0000, /* R12834 */
+ 0x0000, /* R12835 */
+ 0x0000, /* R12836 */
+ 0x0000, /* R12837 */
+ 0x0000, /* R12838 */
+ 0x0000, /* R12839 */
+ 0x0000, /* R12840 */
+ 0x0000, /* R12841 */
+ 0x0000, /* R12842 */
+ 0x0000, /* R12843 */
+ 0x0000, /* R12844 */
+ 0x0000, /* R12845 */
+ 0x0000, /* R12846 */
+ 0x0000, /* R12847 */
+ 0x0000, /* R12848 */
+ 0x0000, /* R12849 */
+ 0x0000, /* R12850 */
+ 0x0000, /* R12851 */
+ 0x0000, /* R12852 */
+ 0x0000, /* R12853 */
+ 0x0000, /* R12854 */
+ 0x0000, /* R12855 */
+ 0x0000, /* R12856 */
+ 0x0000, /* R12857 */
+ 0x0000, /* R12858 */
+ 0x0000, /* R12859 */
+ 0x0000, /* R12860 */
+ 0x0000, /* R12861 */
+ 0x0000, /* R12862 */
+ 0x0000, /* R12863 */
+ 0x0000, /* R12864 */
+ 0x0000, /* R12865 */
+ 0x0000, /* R12866 */
+ 0x0000, /* R12867 */
+ 0x0000, /* R12868 */
+ 0x0000, /* R12869 */
+ 0x0000, /* R12870 */
+ 0x0000, /* R12871 */
+ 0x0000, /* R12872 */
+ 0x0000, /* R12873 */
+ 0x0000, /* R12874 */
+ 0x0000, /* R12875 */
+ 0x0000, /* R12876 */
+ 0x0000, /* R12877 */
+ 0x0000, /* R12878 */
+ 0x0000, /* R12879 */
+ 0x0000, /* R12880 */
+ 0x0000, /* R12881 */
+ 0x0000, /* R12882 */
+ 0x0000, /* R12883 */
+ 0x0000, /* R12884 */
+ 0x0000, /* R12885 */
+ 0x0000, /* R12886 */
+ 0x0000, /* R12887 */
+ 0x0000, /* R12888 */
+ 0x0000, /* R12889 */
+ 0x0000, /* R12890 */
+ 0x0000, /* R12891 */
+ 0x0000, /* R12892 */
+ 0x0000, /* R12893 */
+ 0x0000, /* R12894 */
+ 0x0000, /* R12895 */
+ 0x0000, /* R12896 */
+ 0x0000, /* R12897 */
+ 0x0000, /* R12898 */
+ 0x0000, /* R12899 */
+ 0x0000, /* R12900 */
+ 0x0000, /* R12901 */
+ 0x0000, /* R12902 */
+ 0x0000, /* R12903 */
+ 0x0000, /* R12904 */
+ 0x0000, /* R12905 */
+ 0x0000, /* R12906 */
+ 0x0000, /* R12907 */
+ 0x0000, /* R12908 */
+ 0x0000, /* R12909 */
+ 0x0000, /* R12910 */
+ 0x0000, /* R12911 */
+ 0x0000, /* R12912 */
+ 0x0000, /* R12913 */
+ 0x0000, /* R12914 */
+ 0x0000, /* R12915 */
+ 0x0000, /* R12916 */
+ 0x0000, /* R12917 */
+ 0x0000, /* R12918 */
+ 0x0000, /* R12919 */
+ 0x0000, /* R12920 */
+ 0x0000, /* R12921 */
+ 0x0000, /* R12922 */
+ 0x0000, /* R12923 */
+ 0x0000, /* R12924 */
+ 0x0000, /* R12925 */
+ 0x0000, /* R12926 */
+ 0x0000, /* R12927 */
+ 0x0000, /* R12928 */
+ 0x0000, /* R12929 */
+ 0x0000, /* R12930 */
+ 0x0000, /* R12931 */
+ 0x0000, /* R12932 */
+ 0x0000, /* R12933 */
+ 0x0000, /* R12934 */
+ 0x0000, /* R12935 */
+ 0x0000, /* R12936 */
+ 0x0000, /* R12937 */
+ 0x0000, /* R12938 */
+ 0x0000, /* R12939 */
+ 0x0000, /* R12940 */
+ 0x0000, /* R12941 */
+ 0x0000, /* R12942 */
+ 0x0000, /* R12943 */
+ 0x0000, /* R12944 */
+ 0x0000, /* R12945 */
+ 0x0000, /* R12946 */
+ 0x0000, /* R12947 */
+ 0x0000, /* R12948 */
+ 0x0000, /* R12949 */
+ 0x0000, /* R12950 */
+ 0x0000, /* R12951 */
+ 0x0000, /* R12952 */
+ 0x0000, /* R12953 */
+ 0x0000, /* R12954 */
+ 0x0000, /* R12955 */
+ 0x0000, /* R12956 */
+ 0x0000, /* R12957 */
+ 0x0000, /* R12958 */
+ 0x0000, /* R12959 */
+ 0x0000, /* R12960 */
+ 0x0000, /* R12961 */
+ 0x0000, /* R12962 */
+ 0x0000, /* R12963 */
+ 0x0000, /* R12964 */
+ 0x0000, /* R12965 */
+ 0x0000, /* R12966 */
+ 0x0000, /* R12967 */
+ 0x0000, /* R12968 */
+ 0x0000, /* R12969 */
+ 0x0000, /* R12970 */
+ 0x0000, /* R12971 */
+ 0x0000, /* R12972 */
+ 0x0000, /* R12973 */
+ 0x0000, /* R12974 */
+ 0x0000, /* R12975 */
+ 0x0000, /* R12976 */
+ 0x0000, /* R12977 */
+ 0x0000, /* R12978 */
+ 0x0000, /* R12979 */
+ 0x0000, /* R12980 */
+ 0x0000, /* R12981 */
+ 0x0000, /* R12982 */
+ 0x0000, /* R12983 */
+ 0x0000, /* R12984 */
+ 0x0000, /* R12985 */
+ 0x0000, /* R12986 */
+ 0x0000, /* R12987 */
+ 0x0000, /* R12988 */
+ 0x0000, /* R12989 */
+ 0x0000, /* R12990 */
+ 0x0000, /* R12991 */
+ 0x0000, /* R12992 */
+ 0x0000, /* R12993 */
+ 0x0000, /* R12994 */
+ 0x0000, /* R12995 */
+ 0x0000, /* R12996 */
+ 0x0000, /* R12997 */
+ 0x0000, /* R12998 */
+ 0x0000, /* R12999 */
+ 0x0000, /* R13000 */
+ 0x0000, /* R13001 */
+ 0x0000, /* R13002 */
+ 0x0000, /* R13003 */
+ 0x0000, /* R13004 */
+ 0x0000, /* R13005 */
+ 0x0000, /* R13006 */
+ 0x0000, /* R13007 */
+ 0x0000, /* R13008 */
+ 0x0000, /* R13009 */
+ 0x0000, /* R13010 */
+ 0x0000, /* R13011 */
+ 0x0000, /* R13012 */
+ 0x0000, /* R13013 */
+ 0x0000, /* R13014 */
+ 0x0000, /* R13015 */
+ 0x0000, /* R13016 */
+ 0x0000, /* R13017 */
+ 0x0000, /* R13018 */
+ 0x0000, /* R13019 */
+ 0x0000, /* R13020 */
+ 0x0000, /* R13021 */
+ 0x0000, /* R13022 */
+ 0x0000, /* R13023 */
+ 0x0000, /* R13024 */
+ 0x0000, /* R13025 */
+ 0x0000, /* R13026 */
+ 0x0000, /* R13027 */
+ 0x0000, /* R13028 */
+ 0x0000, /* R13029 */
+ 0x0000, /* R13030 */
+ 0x0000, /* R13031 */
+ 0x0000, /* R13032 */
+ 0x0000, /* R13033 */
+ 0x0000, /* R13034 */
+ 0x0000, /* R13035 */
+ 0x0000, /* R13036 */
+ 0x0000, /* R13037 */
+ 0x0000, /* R13038 */
+ 0x0000, /* R13039 */
+ 0x0000, /* R13040 */
+ 0x0000, /* R13041 */
+ 0x0000, /* R13042 */
+ 0x0000, /* R13043 */
+ 0x0000, /* R13044 */
+ 0x0000, /* R13045 */
+ 0x0000, /* R13046 */
+ 0x0000, /* R13047 */
+ 0x0000, /* R13048 */
+ 0x0000, /* R13049 */
+ 0x0000, /* R13050 */
+ 0x0000, /* R13051 */
+ 0x0000, /* R13052 */
+ 0x0000, /* R13053 */
+ 0x0000, /* R13054 */
+ 0x0000, /* R13055 */
+ 0x0000, /* R13056 */
+ 0x0000, /* R13057 */
+ 0x0000, /* R13058 */
+ 0x0000, /* R13059 */
+ 0x0000, /* R13060 */
+ 0x0000, /* R13061 */
+ 0x0000, /* R13062 */
+ 0x0000, /* R13063 */
+ 0x0000, /* R13064 */
+ 0x0000, /* R13065 */
+ 0x0000, /* R13066 */
+ 0x0000, /* R13067 */
+ 0x0000, /* R13068 */
+ 0x0000, /* R13069 */
+ 0x0000, /* R13070 */
+ 0x0000, /* R13071 */
+ 0x0000, /* R13072 */
+ 0x0000, /* R13073 */
+ 0x0000, /* R13074 */
+ 0x0000, /* R13075 */
+ 0x0000, /* R13076 */
+ 0x0000, /* R13077 */
+ 0x0000, /* R13078 */
+ 0x0000, /* R13079 */
+ 0x0000, /* R13080 */
+ 0x0000, /* R13081 */
+ 0x0000, /* R13082 */
+ 0x0000, /* R13083 */
+ 0x0000, /* R13084 */
+ 0x0000, /* R13085 */
+ 0x0000, /* R13086 */
+ 0x0000, /* R13087 */
+ 0x0000, /* R13088 */
+ 0x0000, /* R13089 */
+ 0x0000, /* R13090 */
+ 0x0000, /* R13091 */
+ 0x0000, /* R13092 */
+ 0x0000, /* R13093 */
+ 0x0000, /* R13094 */
+ 0x0000, /* R13095 */
+ 0x0000, /* R13096 */
+ 0x0000, /* R13097 */
+ 0x0000, /* R13098 */
+ 0x0000, /* R13099 */
+ 0x0000, /* R13100 */
+ 0x0000, /* R13101 */
+ 0x0000, /* R13102 */
+ 0x0000, /* R13103 */
+ 0x0000, /* R13104 */
+ 0x0000, /* R13105 */
+ 0x0000, /* R13106 */
+ 0x0000, /* R13107 */
+ 0x0000, /* R13108 */
+ 0x0000, /* R13109 */
+ 0x0000, /* R13110 */
+ 0x0000, /* R13111 */
+ 0x0000, /* R13112 */
+ 0x0000, /* R13113 */
+ 0x0000, /* R13114 */
+ 0x0000, /* R13115 */
+ 0x0000, /* R13116 */
+ 0x0000, /* R13117 */
+ 0x0000, /* R13118 */
+ 0x0000, /* R13119 */
+ 0x0000, /* R13120 */
+ 0x0000, /* R13121 */
+ 0x0000, /* R13122 */
+ 0x0000, /* R13123 */
+ 0x0000, /* R13124 */
+ 0x0000, /* R13125 */
+ 0x0000, /* R13126 */
+ 0x0000, /* R13127 */
+ 0x0000, /* R13128 */
+ 0x0000, /* R13129 */
+ 0x0000, /* R13130 */
+ 0x0000, /* R13131 */
+ 0x0000, /* R13132 */
+ 0x0000, /* R13133 */
+ 0x0000, /* R13134 */
+ 0x0000, /* R13135 */
+ 0x0000, /* R13136 */
+ 0x0000, /* R13137 */
+ 0x0000, /* R13138 */
+ 0x0000, /* R13139 */
+ 0x0000, /* R13140 */
+ 0x0000, /* R13141 */
+ 0x0000, /* R13142 */
+ 0x0000, /* R13143 */
+ 0x0000, /* R13144 */
+ 0x0000, /* R13145 */
+ 0x0000, /* R13146 */
+ 0x0000, /* R13147 */
+ 0x0000, /* R13148 */
+ 0x0000, /* R13149 */
+ 0x0000, /* R13150 */
+ 0x0000, /* R13151 */
+ 0x0000, /* R13152 */
+ 0x0000, /* R13153 */
+ 0x0000, /* R13154 */
+ 0x0000, /* R13155 */
+ 0x0000, /* R13156 */
+ 0x0000, /* R13157 */
+ 0x0000, /* R13158 */
+ 0x0000, /* R13159 */
+ 0x0000, /* R13160 */
+ 0x0000, /* R13161 */
+ 0x0000, /* R13162 */
+ 0x0000, /* R13163 */
+ 0x0000, /* R13164 */
+ 0x0000, /* R13165 */
+ 0x0000, /* R13166 */
+ 0x0000, /* R13167 */
+ 0x0000, /* R13168 */
+ 0x0000, /* R13169 */
+ 0x0000, /* R13170 */
+ 0x0000, /* R13171 */
+ 0x0000, /* R13172 */
+ 0x0000, /* R13173 */
+ 0x0000, /* R13174 */
+ 0x0000, /* R13175 */
+ 0x0000, /* R13176 */
+ 0x0000, /* R13177 */
+ 0x0000, /* R13178 */
+ 0x0000, /* R13179 */
+ 0x0000, /* R13180 */
+ 0x0000, /* R13181 */
+ 0x0000, /* R13182 */
+ 0x0000, /* R13183 */
+ 0x0000, /* R13184 */
+ 0x0000, /* R13185 */
+ 0x0000, /* R13186 */
+ 0x0000, /* R13187 */
+ 0x0000, /* R13188 */
+ 0x0000, /* R13189 */
+ 0x0000, /* R13190 */
+ 0x0000, /* R13191 */
+ 0x0000, /* R13192 */
+ 0x0000, /* R13193 */
+ 0x0000, /* R13194 */
+ 0x0000, /* R13195 */
+ 0x0000, /* R13196 */
+ 0x0000, /* R13197 */
+ 0x0000, /* R13198 */
+ 0x0000, /* R13199 */
+ 0x0000, /* R13200 */
+ 0x0000, /* R13201 */
+ 0x0000, /* R13202 */
+ 0x0000, /* R13203 */
+ 0x0000, /* R13204 */
+ 0x0000, /* R13205 */
+ 0x0000, /* R13206 */
+ 0x0000, /* R13207 */
+ 0x0000, /* R13208 */
+ 0x0000, /* R13209 */
+ 0x0000, /* R13210 */
+ 0x0000, /* R13211 */
+ 0x0000, /* R13212 */
+ 0x0000, /* R13213 */
+ 0x0000, /* R13214 */
+ 0x0000, /* R13215 */
+ 0x0000, /* R13216 */
+ 0x0000, /* R13217 */
+ 0x0000, /* R13218 */
+ 0x0000, /* R13219 */
+ 0x0000, /* R13220 */
+ 0x0000, /* R13221 */
+ 0x0000, /* R13222 */
+ 0x0000, /* R13223 */
+ 0x0000, /* R13224 */
+ 0x0000, /* R13225 */
+ 0x0000, /* R13226 */
+ 0x0000, /* R13227 */
+ 0x0000, /* R13228 */
+ 0x0000, /* R13229 */
+ 0x0000, /* R13230 */
+ 0x0000, /* R13231 */
+ 0x0000, /* R13232 */
+ 0x0000, /* R13233 */
+ 0x0000, /* R13234 */
+ 0x0000, /* R13235 */
+ 0x0000, /* R13236 */
+ 0x0000, /* R13237 */
+ 0x0000, /* R13238 */
+ 0x0000, /* R13239 */
+ 0x0000, /* R13240 */
+ 0x0000, /* R13241 */
+ 0x0000, /* R13242 */
+ 0x0000, /* R13243 */
+ 0x0000, /* R13244 */
+ 0x0000, /* R13245 */
+ 0x0000, /* R13246 */
+ 0x0000, /* R13247 */
+ 0x0000, /* R13248 */
+ 0x0000, /* R13249 */
+ 0x0000, /* R13250 */
+ 0x0000, /* R13251 */
+ 0x0000, /* R13252 */
+ 0x0000, /* R13253 */
+ 0x0000, /* R13254 */
+ 0x0000, /* R13255 */
+ 0x0000, /* R13256 */
+ 0x0000, /* R13257 */
+ 0x0000, /* R13258 */
+ 0x0000, /* R13259 */
+ 0x0000, /* R13260 */
+ 0x0000, /* R13261 */
+ 0x0000, /* R13262 */
+ 0x0000, /* R13263 */
+ 0x0000, /* R13264 */
+ 0x0000, /* R13265 */
+ 0x0000, /* R13266 */
+ 0x0000, /* R13267 */
+ 0x0000, /* R13268 */
+ 0x0000, /* R13269 */
+ 0x0000, /* R13270 */
+ 0x0000, /* R13271 */
+ 0x0000, /* R13272 */
+ 0x0000, /* R13273 */
+ 0x0000, /* R13274 */
+ 0x0000, /* R13275 */
+ 0x0000, /* R13276 */
+ 0x0000, /* R13277 */
+ 0x0000, /* R13278 */
+ 0x0000, /* R13279 */
+ 0x0000, /* R13280 */
+ 0x0000, /* R13281 */
+ 0x0000, /* R13282 */
+ 0x0000, /* R13283 */
+ 0x0000, /* R13284 */
+ 0x0000, /* R13285 */
+ 0x0000, /* R13286 */
+ 0x0000, /* R13287 */
+ 0x0000, /* R13288 */
+ 0x0000, /* R13289 */
+ 0x0000, /* R13290 */
+ 0x0000, /* R13291 */
+ 0x0000, /* R13292 */
+ 0x0000, /* R13293 */
+ 0x0000, /* R13294 */
+ 0x0000, /* R13295 */
+ 0x0000, /* R13296 */
+ 0x0000, /* R13297 */
+ 0x0000, /* R13298 */
+ 0x0000, /* R13299 */
+ 0x0000, /* R13300 */
+ 0x0000, /* R13301 */
+ 0x0000, /* R13302 */
+ 0x0000, /* R13303 */
+ 0x0000, /* R13304 */
+ 0x0000, /* R13305 */
+ 0x0000, /* R13306 */
+ 0x0000, /* R13307 */
+ 0x0000, /* R13308 */
+ 0x0000, /* R13309 */
+ 0x0000, /* R13310 */
+ 0x0000, /* R13311 */
+ 0x0000, /* R13312 - DSP2 Data2 RAM 1 */
+ 0x0000, /* R13313 - DSP2 Data2 RAM 0 */
+ 0x0000, /* R13314 */
+ 0x0000, /* R13315 */
+ 0x0000, /* R13316 */
+ 0x0000, /* R13317 */
+ 0x0000, /* R13318 */
+ 0x0000, /* R13319 */
+ 0x0000, /* R13320 */
+ 0x0000, /* R13321 */
+ 0x0000, /* R13322 */
+ 0x0000, /* R13323 */
+ 0x0000, /* R13324 */
+ 0x0000, /* R13325 */
+ 0x0000, /* R13326 */
+ 0x0000, /* R13327 */
+ 0x0000, /* R13328 */
+ 0x0000, /* R13329 */
+ 0x0000, /* R13330 */
+ 0x0000, /* R13331 */
+ 0x0000, /* R13332 */
+ 0x0000, /* R13333 */
+ 0x0000, /* R13334 */
+ 0x0000, /* R13335 */
+ 0x0000, /* R13336 */
+ 0x0000, /* R13337 */
+ 0x0000, /* R13338 */
+ 0x0000, /* R13339 */
+ 0x0000, /* R13340 */
+ 0x0000, /* R13341 */
+ 0x0000, /* R13342 */
+ 0x0000, /* R13343 */
+ 0x0000, /* R13344 */
+ 0x0000, /* R13345 */
+ 0x0000, /* R13346 */
+ 0x0000, /* R13347 */
+ 0x0000, /* R13348 */
+ 0x0000, /* R13349 */
+ 0x0000, /* R13350 */
+ 0x0000, /* R13351 */
+ 0x0000, /* R13352 */
+ 0x0000, /* R13353 */
+ 0x0000, /* R13354 */
+ 0x0000, /* R13355 */
+ 0x0000, /* R13356 */
+ 0x0000, /* R13357 */
+ 0x0000, /* R13358 */
+ 0x0000, /* R13359 */
+ 0x0000, /* R13360 */
+ 0x0000, /* R13361 */
+ 0x0000, /* R13362 */
+ 0x0000, /* R13363 */
+ 0x0000, /* R13364 */
+ 0x0000, /* R13365 */
+ 0x0000, /* R13366 */
+ 0x0000, /* R13367 */
+ 0x0000, /* R13368 */
+ 0x0000, /* R13369 */
+ 0x0000, /* R13370 */
+ 0x0000, /* R13371 */
+ 0x0000, /* R13372 */
+ 0x0000, /* R13373 */
+ 0x0000, /* R13374 */
+ 0x0000, /* R13375 */
+ 0x0000, /* R13376 */
+ 0x0000, /* R13377 */
+ 0x0000, /* R13378 */
+ 0x0000, /* R13379 */
+ 0x0000, /* R13380 */
+ 0x0000, /* R13381 */
+ 0x0000, /* R13382 */
+ 0x0000, /* R13383 */
+ 0x0000, /* R13384 */
+ 0x0000, /* R13385 */
+ 0x0000, /* R13386 */
+ 0x0000, /* R13387 */
+ 0x0000, /* R13388 */
+ 0x0000, /* R13389 */
+ 0x0000, /* R13390 */
+ 0x0000, /* R13391 */
+ 0x0000, /* R13392 */
+ 0x0000, /* R13393 */
+ 0x0000, /* R13394 */
+ 0x0000, /* R13395 */
+ 0x0000, /* R13396 */
+ 0x0000, /* R13397 */
+ 0x0000, /* R13398 */
+ 0x0000, /* R13399 */
+ 0x0000, /* R13400 */
+ 0x0000, /* R13401 */
+ 0x0000, /* R13402 */
+ 0x0000, /* R13403 */
+ 0x0000, /* R13404 */
+ 0x0000, /* R13405 */
+ 0x0000, /* R13406 */
+ 0x0000, /* R13407 */
+ 0x0000, /* R13408 */
+ 0x0000, /* R13409 */
+ 0x0000, /* R13410 */
+ 0x0000, /* R13411 */
+ 0x0000, /* R13412 */
+ 0x0000, /* R13413 */
+ 0x0000, /* R13414 */
+ 0x0000, /* R13415 */
+ 0x0000, /* R13416 */
+ 0x0000, /* R13417 */
+ 0x0000, /* R13418 */
+ 0x0000, /* R13419 */
+ 0x0000, /* R13420 */
+ 0x0000, /* R13421 */
+ 0x0000, /* R13422 */
+ 0x0000, /* R13423 */
+ 0x0000, /* R13424 */
+ 0x0000, /* R13425 */
+ 0x0000, /* R13426 */
+ 0x0000, /* R13427 */
+ 0x0000, /* R13428 */
+ 0x0000, /* R13429 */
+ 0x0000, /* R13430 */
+ 0x0000, /* R13431 */
+ 0x0000, /* R13432 */
+ 0x0000, /* R13433 */
+ 0x0000, /* R13434 */
+ 0x0000, /* R13435 */
+ 0x0000, /* R13436 */
+ 0x0000, /* R13437 */
+ 0x0000, /* R13438 */
+ 0x0000, /* R13439 */
+ 0x0000, /* R13440 */
+ 0x0000, /* R13441 */
+ 0x0000, /* R13442 */
+ 0x0000, /* R13443 */
+ 0x0000, /* R13444 */
+ 0x0000, /* R13445 */
+ 0x0000, /* R13446 */
+ 0x0000, /* R13447 */
+ 0x0000, /* R13448 */
+ 0x0000, /* R13449 */
+ 0x0000, /* R13450 */
+ 0x0000, /* R13451 */
+ 0x0000, /* R13452 */
+ 0x0000, /* R13453 */
+ 0x0000, /* R13454 */
+ 0x0000, /* R13455 */
+ 0x0000, /* R13456 */
+ 0x0000, /* R13457 */
+ 0x0000, /* R13458 */
+ 0x0000, /* R13459 */
+ 0x0000, /* R13460 */
+ 0x0000, /* R13461 */
+ 0x0000, /* R13462 */
+ 0x0000, /* R13463 */
+ 0x0000, /* R13464 */
+ 0x0000, /* R13465 */
+ 0x0000, /* R13466 */
+ 0x0000, /* R13467 */
+ 0x0000, /* R13468 */
+ 0x0000, /* R13469 */
+ 0x0000, /* R13470 */
+ 0x0000, /* R13471 */
+ 0x0000, /* R13472 */
+ 0x0000, /* R13473 */
+ 0x0000, /* R13474 */
+ 0x0000, /* R13475 */
+ 0x0000, /* R13476 */
+ 0x0000, /* R13477 */
+ 0x0000, /* R13478 */
+ 0x0000, /* R13479 */
+ 0x0000, /* R13480 */
+ 0x0000, /* R13481 */
+ 0x0000, /* R13482 */
+ 0x0000, /* R13483 */
+ 0x0000, /* R13484 */
+ 0x0000, /* R13485 */
+ 0x0000, /* R13486 */
+ 0x0000, /* R13487 */
+ 0x0000, /* R13488 */
+ 0x0000, /* R13489 */
+ 0x0000, /* R13490 */
+ 0x0000, /* R13491 */
+ 0x0000, /* R13492 */
+ 0x0000, /* R13493 */
+ 0x0000, /* R13494 */
+ 0x0000, /* R13495 */
+ 0x0000, /* R13496 */
+ 0x0000, /* R13497 */
+ 0x0000, /* R13498 */
+ 0x0000, /* R13499 */
+ 0x0000, /* R13500 */
+ 0x0000, /* R13501 */
+ 0x0000, /* R13502 */
+ 0x0000, /* R13503 */
+ 0x0000, /* R13504 */
+ 0x0000, /* R13505 */
+ 0x0000, /* R13506 */
+ 0x0000, /* R13507 */
+ 0x0000, /* R13508 */
+ 0x0000, /* R13509 */
+ 0x0000, /* R13510 */
+ 0x0000, /* R13511 */
+ 0x0000, /* R13512 */
+ 0x0000, /* R13513 */
+ 0x0000, /* R13514 */
+ 0x0000, /* R13515 */
+ 0x0000, /* R13516 */
+ 0x0000, /* R13517 */
+ 0x0000, /* R13518 */
+ 0x0000, /* R13519 */
+ 0x0000, /* R13520 */
+ 0x0000, /* R13521 */
+ 0x0000, /* R13522 */
+ 0x0000, /* R13523 */
+ 0x0000, /* R13524 */
+ 0x0000, /* R13525 */
+ 0x0000, /* R13526 */
+ 0x0000, /* R13527 */
+ 0x0000, /* R13528 */
+ 0x0000, /* R13529 */
+ 0x0000, /* R13530 */
+ 0x0000, /* R13531 */
+ 0x0000, /* R13532 */
+ 0x0000, /* R13533 */
+ 0x0000, /* R13534 */
+ 0x0000, /* R13535 */
+ 0x0000, /* R13536 */
+ 0x0000, /* R13537 */
+ 0x0000, /* R13538 */
+ 0x0000, /* R13539 */
+ 0x0000, /* R13540 */
+ 0x0000, /* R13541 */
+ 0x0000, /* R13542 */
+ 0x0000, /* R13543 */
+ 0x0000, /* R13544 */
+ 0x0000, /* R13545 */
+ 0x0000, /* R13546 */
+ 0x0000, /* R13547 */
+ 0x0000, /* R13548 */
+ 0x0000, /* R13549 */
+ 0x0000, /* R13550 */
+ 0x0000, /* R13551 */
+ 0x0000, /* R13552 */
+ 0x0000, /* R13553 */
+ 0x0000, /* R13554 */
+ 0x0000, /* R13555 */
+ 0x0000, /* R13556 */
+ 0x0000, /* R13557 */
+ 0x0000, /* R13558 */
+ 0x0000, /* R13559 */
+ 0x0000, /* R13560 */
+ 0x0000, /* R13561 */
+ 0x0000, /* R13562 */
+ 0x0000, /* R13563 */
+ 0x0000, /* R13564 */
+ 0x0000, /* R13565 */
+ 0x0000, /* R13566 */
+ 0x0000, /* R13567 */
+ 0x0000, /* R13568 */
+ 0x0000, /* R13569 */
+ 0x0000, /* R13570 */
+ 0x0000, /* R13571 */
+ 0x0000, /* R13572 */
+ 0x0000, /* R13573 */
+ 0x0000, /* R13574 */
+ 0x0000, /* R13575 */
+ 0x0000, /* R13576 */
+ 0x0000, /* R13577 */
+ 0x0000, /* R13578 */
+ 0x0000, /* R13579 */
+ 0x0000, /* R13580 */
+ 0x0000, /* R13581 */
+ 0x0000, /* R13582 */
+ 0x0000, /* R13583 */
+ 0x0000, /* R13584 */
+ 0x0000, /* R13585 */
+ 0x0000, /* R13586 */
+ 0x0000, /* R13587 */
+ 0x0000, /* R13588 */
+ 0x0000, /* R13589 */
+ 0x0000, /* R13590 */
+ 0x0000, /* R13591 */
+ 0x0000, /* R13592 */
+ 0x0000, /* R13593 */
+ 0x0000, /* R13594 */
+ 0x0000, /* R13595 */
+ 0x0000, /* R13596 */
+ 0x0000, /* R13597 */
+ 0x0000, /* R13598 */
+ 0x0000, /* R13599 */
+ 0x0000, /* R13600 */
+ 0x0000, /* R13601 */
+ 0x0000, /* R13602 */
+ 0x0000, /* R13603 */
+ 0x0000, /* R13604 */
+ 0x0000, /* R13605 */
+ 0x0000, /* R13606 */
+ 0x0000, /* R13607 */
+ 0x0000, /* R13608 */
+ 0x0000, /* R13609 */
+ 0x0000, /* R13610 */
+ 0x0000, /* R13611 */
+ 0x0000, /* R13612 */
+ 0x0000, /* R13613 */
+ 0x0000, /* R13614 */
+ 0x0000, /* R13615 */
+ 0x0000, /* R13616 */
+ 0x0000, /* R13617 */
+ 0x0000, /* R13618 */
+ 0x0000, /* R13619 */
+ 0x0000, /* R13620 */
+ 0x0000, /* R13621 */
+ 0x0000, /* R13622 */
+ 0x0000, /* R13623 */
+ 0x0000, /* R13624 */
+ 0x0000, /* R13625 */
+ 0x0000, /* R13626 */
+ 0x0000, /* R13627 */
+ 0x0000, /* R13628 */
+ 0x0000, /* R13629 */
+ 0x0000, /* R13630 */
+ 0x0000, /* R13631 */
+ 0x0000, /* R13632 */
+ 0x0000, /* R13633 */
+ 0x0000, /* R13634 */
+ 0x0000, /* R13635 */
+ 0x0000, /* R13636 */
+ 0x0000, /* R13637 */
+ 0x0000, /* R13638 */
+ 0x0000, /* R13639 */
+ 0x0000, /* R13640 */
+ 0x0000, /* R13641 */
+ 0x0000, /* R13642 */
+ 0x0000, /* R13643 */
+ 0x0000, /* R13644 */
+ 0x0000, /* R13645 */
+ 0x0000, /* R13646 */
+ 0x0000, /* R13647 */
+ 0x0000, /* R13648 */
+ 0x0000, /* R13649 */
+ 0x0000, /* R13650 */
+ 0x0000, /* R13651 */
+ 0x0000, /* R13652 */
+ 0x0000, /* R13653 */
+ 0x0000, /* R13654 */
+ 0x0000, /* R13655 */
+ 0x0000, /* R13656 */
+ 0x0000, /* R13657 */
+ 0x0000, /* R13658 */
+ 0x0000, /* R13659 */
+ 0x0000, /* R13660 */
+ 0x0000, /* R13661 */
+ 0x0000, /* R13662 */
+ 0x0000, /* R13663 */
+ 0x0000, /* R13664 */
+ 0x0000, /* R13665 */
+ 0x0000, /* R13666 */
+ 0x0000, /* R13667 */
+ 0x0000, /* R13668 */
+ 0x0000, /* R13669 */
+ 0x0000, /* R13670 */
+ 0x0000, /* R13671 */
+ 0x0000, /* R13672 */
+ 0x0000, /* R13673 */
+ 0x0000, /* R13674 */
+ 0x0000, /* R13675 */
+ 0x0000, /* R13676 */
+ 0x0000, /* R13677 */
+ 0x0000, /* R13678 */
+ 0x0000, /* R13679 */
+ 0x0000, /* R13680 */
+ 0x0000, /* R13681 */
+ 0x0000, /* R13682 */
+ 0x0000, /* R13683 */
+ 0x0000, /* R13684 */
+ 0x0000, /* R13685 */
+ 0x0000, /* R13686 */
+ 0x0000, /* R13687 */
+ 0x0000, /* R13688 */
+ 0x0000, /* R13689 */
+ 0x0000, /* R13690 */
+ 0x0000, /* R13691 */
+ 0x0000, /* R13692 */
+ 0x0000, /* R13693 */
+ 0x0000, /* R13694 */
+ 0x0000, /* R13695 */
+ 0x0000, /* R13696 */
+ 0x0000, /* R13697 */
+ 0x0000, /* R13698 */
+ 0x0000, /* R13699 */
+ 0x0000, /* R13700 */
+ 0x0000, /* R13701 */
+ 0x0000, /* R13702 */
+ 0x0000, /* R13703 */
+ 0x0000, /* R13704 */
+ 0x0000, /* R13705 */
+ 0x0000, /* R13706 */
+ 0x0000, /* R13707 */
+ 0x0000, /* R13708 */
+ 0x0000, /* R13709 */
+ 0x0000, /* R13710 */
+ 0x0000, /* R13711 */
+ 0x0000, /* R13712 */
+ 0x0000, /* R13713 */
+ 0x0000, /* R13714 */
+ 0x0000, /* R13715 */
+ 0x0000, /* R13716 */
+ 0x0000, /* R13717 */
+ 0x0000, /* R13718 */
+ 0x0000, /* R13719 */
+ 0x0000, /* R13720 */
+ 0x0000, /* R13721 */
+ 0x0000, /* R13722 */
+ 0x0000, /* R13723 */
+ 0x0000, /* R13724 */
+ 0x0000, /* R13725 */
+ 0x0000, /* R13726 */
+ 0x0000, /* R13727 */
+ 0x0000, /* R13728 */
+ 0x0000, /* R13729 */
+ 0x0000, /* R13730 */
+ 0x0000, /* R13731 */
+ 0x0000, /* R13732 */
+ 0x0000, /* R13733 */
+ 0x0000, /* R13734 */
+ 0x0000, /* R13735 */
+ 0x0000, /* R13736 */
+ 0x0000, /* R13737 */
+ 0x0000, /* R13738 */
+ 0x0000, /* R13739 */
+ 0x0000, /* R13740 */
+ 0x0000, /* R13741 */
+ 0x0000, /* R13742 */
+ 0x0000, /* R13743 */
+ 0x0000, /* R13744 */
+ 0x0000, /* R13745 */
+ 0x0000, /* R13746 */
+ 0x0000, /* R13747 */
+ 0x0000, /* R13748 */
+ 0x0000, /* R13749 */
+ 0x0000, /* R13750 */
+ 0x0000, /* R13751 */
+ 0x0000, /* R13752 */
+ 0x0000, /* R13753 */
+ 0x0000, /* R13754 */
+ 0x0000, /* R13755 */
+ 0x0000, /* R13756 */
+ 0x0000, /* R13757 */
+ 0x0000, /* R13758 */
+ 0x0000, /* R13759 */
+ 0x0000, /* R13760 */
+ 0x0000, /* R13761 */
+ 0x0000, /* R13762 */
+ 0x0000, /* R13763 */
+ 0x0000, /* R13764 */
+ 0x0000, /* R13765 */
+ 0x0000, /* R13766 */
+ 0x0000, /* R13767 */
+ 0x0000, /* R13768 */
+ 0x0000, /* R13769 */
+ 0x0000, /* R13770 */
+ 0x0000, /* R13771 */
+ 0x0000, /* R13772 */
+ 0x0000, /* R13773 */
+ 0x0000, /* R13774 */
+ 0x0000, /* R13775 */
+ 0x0000, /* R13776 */
+ 0x0000, /* R13777 */
+ 0x0000, /* R13778 */
+ 0x0000, /* R13779 */
+ 0x0000, /* R13780 */
+ 0x0000, /* R13781 */
+ 0x0000, /* R13782 */
+ 0x0000, /* R13783 */
+ 0x0000, /* R13784 */
+ 0x0000, /* R13785 */
+ 0x0000, /* R13786 */
+ 0x0000, /* R13787 */
+ 0x0000, /* R13788 */
+ 0x0000, /* R13789 */
+ 0x0000, /* R13790 */
+ 0x0000, /* R13791 */
+ 0x0000, /* R13792 */
+ 0x0000, /* R13793 */
+ 0x0000, /* R13794 */
+ 0x0000, /* R13795 */
+ 0x0000, /* R13796 */
+ 0x0000, /* R13797 */
+ 0x0000, /* R13798 */
+ 0x0000, /* R13799 */
+ 0x0000, /* R13800 */
+ 0x0000, /* R13801 */
+ 0x0000, /* R13802 */
+ 0x0000, /* R13803 */
+ 0x0000, /* R13804 */
+ 0x0000, /* R13805 */
+ 0x0000, /* R13806 */
+ 0x0000, /* R13807 */
+ 0x0000, /* R13808 */
+ 0x0000, /* R13809 */
+ 0x0000, /* R13810 */
+ 0x0000, /* R13811 */
+ 0x0000, /* R13812 */
+ 0x0000, /* R13813 */
+ 0x0000, /* R13814 */
+ 0x0000, /* R13815 */
+ 0x0000, /* R13816 */
+ 0x0000, /* R13817 */
+ 0x0000, /* R13818 */
+ 0x0000, /* R13819 */
+ 0x0000, /* R13820 */
+ 0x0000, /* R13821 */
+ 0x0000, /* R13822 */
+ 0x0000, /* R13823 */
+ 0x0000, /* R13824 */
+ 0x0000, /* R13825 */
+ 0x0000, /* R13826 */
+ 0x0000, /* R13827 */
+ 0x0000, /* R13828 */
+ 0x0000, /* R13829 */
+ 0x0000, /* R13830 */
+ 0x0000, /* R13831 */
+ 0x0000, /* R13832 */
+ 0x0000, /* R13833 */
+ 0x0000, /* R13834 */
+ 0x0000, /* R13835 */
+ 0x0000, /* R13836 */
+ 0x0000, /* R13837 */
+ 0x0000, /* R13838 */
+ 0x0000, /* R13839 */
+ 0x0000, /* R13840 */
+ 0x0000, /* R13841 */
+ 0x0000, /* R13842 */
+ 0x0000, /* R13843 */
+ 0x0000, /* R13844 */
+ 0x0000, /* R13845 */
+ 0x0000, /* R13846 */
+ 0x0000, /* R13847 */
+ 0x0000, /* R13848 */
+ 0x0000, /* R13849 */
+ 0x0000, /* R13850 */
+ 0x0000, /* R13851 */
+ 0x0000, /* R13852 */
+ 0x0000, /* R13853 */
+ 0x0000, /* R13854 */
+ 0x0000, /* R13855 */
+ 0x0000, /* R13856 */
+ 0x0000, /* R13857 */
+ 0x0000, /* R13858 */
+ 0x0000, /* R13859 */
+ 0x0000, /* R13860 */
+ 0x0000, /* R13861 */
+ 0x0000, /* R13862 */
+ 0x0000, /* R13863 */
+ 0x0000, /* R13864 */
+ 0x0000, /* R13865 */
+ 0x0000, /* R13866 */
+ 0x0000, /* R13867 */
+ 0x0000, /* R13868 */
+ 0x0000, /* R13869 */
+ 0x0000, /* R13870 */
+ 0x0000, /* R13871 */
+ 0x0000, /* R13872 */
+ 0x0000, /* R13873 */
+ 0x0000, /* R13874 */
+ 0x0000, /* R13875 */
+ 0x0000, /* R13876 */
+ 0x0000, /* R13877 */
+ 0x0000, /* R13878 */
+ 0x0000, /* R13879 */
+ 0x0000, /* R13880 */
+ 0x0000, /* R13881 */
+ 0x0000, /* R13882 */
+ 0x0000, /* R13883 */
+ 0x0000, /* R13884 */
+ 0x0000, /* R13885 */
+ 0x0000, /* R13886 */
+ 0x0000, /* R13887 */
+ 0x0000, /* R13888 */
+ 0x0000, /* R13889 */
+ 0x0000, /* R13890 */
+ 0x0000, /* R13891 */
+ 0x0000, /* R13892 */
+ 0x0000, /* R13893 */
+ 0x0000, /* R13894 */
+ 0x0000, /* R13895 */
+ 0x0000, /* R13896 */
+ 0x0000, /* R13897 */
+ 0x0000, /* R13898 */
+ 0x0000, /* R13899 */
+ 0x0000, /* R13900 */
+ 0x0000, /* R13901 */
+ 0x0000, /* R13902 */
+ 0x0000, /* R13903 */
+ 0x0000, /* R13904 */
+ 0x0000, /* R13905 */
+ 0x0000, /* R13906 */
+ 0x0000, /* R13907 */
+ 0x0000, /* R13908 */
+ 0x0000, /* R13909 */
+ 0x0000, /* R13910 */
+ 0x0000, /* R13911 */
+ 0x0000, /* R13912 */
+ 0x0000, /* R13913 */
+ 0x0000, /* R13914 */
+ 0x0000, /* R13915 */
+ 0x0000, /* R13916 */
+ 0x0000, /* R13917 */
+ 0x0000, /* R13918 */
+ 0x0000, /* R13919 */
+ 0x0000, /* R13920 */
+ 0x0000, /* R13921 */
+ 0x0000, /* R13922 */
+ 0x0000, /* R13923 */
+ 0x0000, /* R13924 */
+ 0x0000, /* R13925 */
+ 0x0000, /* R13926 */
+ 0x0000, /* R13927 */
+ 0x0000, /* R13928 */
+ 0x0000, /* R13929 */
+ 0x0000, /* R13930 */
+ 0x0000, /* R13931 */
+ 0x0000, /* R13932 */
+ 0x0000, /* R13933 */
+ 0x0000, /* R13934 */
+ 0x0000, /* R13935 */
+ 0x0000, /* R13936 */
+ 0x0000, /* R13937 */
+ 0x0000, /* R13938 */
+ 0x0000, /* R13939 */
+ 0x0000, /* R13940 */
+ 0x0000, /* R13941 */
+ 0x0000, /* R13942 */
+ 0x0000, /* R13943 */
+ 0x0000, /* R13944 */
+ 0x0000, /* R13945 */
+ 0x0000, /* R13946 */
+ 0x0000, /* R13947 */
+ 0x0000, /* R13948 */
+ 0x0000, /* R13949 */
+ 0x0000, /* R13950 */
+ 0x0000, /* R13951 */
+ 0x0000, /* R13952 */
+ 0x0000, /* R13953 */
+ 0x0000, /* R13954 */
+ 0x0000, /* R13955 */
+ 0x0000, /* R13956 */
+ 0x0000, /* R13957 */
+ 0x0000, /* R13958 */
+ 0x0000, /* R13959 */
+ 0x0000, /* R13960 */
+ 0x0000, /* R13961 */
+ 0x0000, /* R13962 */
+ 0x0000, /* R13963 */
+ 0x0000, /* R13964 */
+ 0x0000, /* R13965 */
+ 0x0000, /* R13966 */
+ 0x0000, /* R13967 */
+ 0x0000, /* R13968 */
+ 0x0000, /* R13969 */
+ 0x0000, /* R13970 */
+ 0x0000, /* R13971 */
+ 0x0000, /* R13972 */
+ 0x0000, /* R13973 */
+ 0x0000, /* R13974 */
+ 0x0000, /* R13975 */
+ 0x0000, /* R13976 */
+ 0x0000, /* R13977 */
+ 0x0000, /* R13978 */
+ 0x0000, /* R13979 */
+ 0x0000, /* R13980 */
+ 0x0000, /* R13981 */
+ 0x0000, /* R13982 */
+ 0x0000, /* R13983 */
+ 0x0000, /* R13984 */
+ 0x0000, /* R13985 */
+ 0x0000, /* R13986 */
+ 0x0000, /* R13987 */
+ 0x0000, /* R13988 */
+ 0x0000, /* R13989 */
+ 0x0000, /* R13990 */
+ 0x0000, /* R13991 */
+ 0x0000, /* R13992 */
+ 0x0000, /* R13993 */
+ 0x0000, /* R13994 */
+ 0x0000, /* R13995 */
+ 0x0000, /* R13996 */
+ 0x0000, /* R13997 */
+ 0x0000, /* R13998 */
+ 0x0000, /* R13999 */
+ 0x0000, /* R14000 */
+ 0x0000, /* R14001 */
+ 0x0000, /* R14002 */
+ 0x0000, /* R14003 */
+ 0x0000, /* R14004 */
+ 0x0000, /* R14005 */
+ 0x0000, /* R14006 */
+ 0x0000, /* R14007 */
+ 0x0000, /* R14008 */
+ 0x0000, /* R14009 */
+ 0x0000, /* R14010 */
+ 0x0000, /* R14011 */
+ 0x0000, /* R14012 */
+ 0x0000, /* R14013 */
+ 0x0000, /* R14014 */
+ 0x0000, /* R14015 */
+ 0x0000, /* R14016 */
+ 0x0000, /* R14017 */
+ 0x0000, /* R14018 */
+ 0x0000, /* R14019 */
+ 0x0000, /* R14020 */
+ 0x0000, /* R14021 */
+ 0x0000, /* R14022 */
+ 0x0000, /* R14023 */
+ 0x0000, /* R14024 */
+ 0x0000, /* R14025 */
+ 0x0000, /* R14026 */
+ 0x0000, /* R14027 */
+ 0x0000, /* R14028 */
+ 0x0000, /* R14029 */
+ 0x0000, /* R14030 */
+ 0x0000, /* R14031 */
+ 0x0000, /* R14032 */
+ 0x0000, /* R14033 */
+ 0x0000, /* R14034 */
+ 0x0000, /* R14035 */
+ 0x0000, /* R14036 */
+ 0x0000, /* R14037 */
+ 0x0000, /* R14038 */
+ 0x0000, /* R14039 */
+ 0x0000, /* R14040 */
+ 0x0000, /* R14041 */
+ 0x0000, /* R14042 */
+ 0x0000, /* R14043 */
+ 0x0000, /* R14044 */
+ 0x0000, /* R14045 */
+ 0x0000, /* R14046 */
+ 0x0000, /* R14047 */
+ 0x0000, /* R14048 */
+ 0x0000, /* R14049 */
+ 0x0000, /* R14050 */
+ 0x0000, /* R14051 */
+ 0x0000, /* R14052 */
+ 0x0000, /* R14053 */
+ 0x0000, /* R14054 */
+ 0x0000, /* R14055 */
+ 0x0000, /* R14056 */
+ 0x0000, /* R14057 */
+ 0x0000, /* R14058 */
+ 0x0000, /* R14059 */
+ 0x0000, /* R14060 */
+ 0x0000, /* R14061 */
+ 0x0000, /* R14062 */
+ 0x0000, /* R14063 */
+ 0x0000, /* R14064 */
+ 0x0000, /* R14065 */
+ 0x0000, /* R14066 */
+ 0x0000, /* R14067 */
+ 0x0000, /* R14068 */
+ 0x0000, /* R14069 */
+ 0x0000, /* R14070 */
+ 0x0000, /* R14071 */
+ 0x0000, /* R14072 */
+ 0x0000, /* R14073 */
+ 0x0000, /* R14074 */
+ 0x0000, /* R14075 */
+ 0x0000, /* R14076 */
+ 0x0000, /* R14077 */
+ 0x0000, /* R14078 */
+ 0x0000, /* R14079 */
+ 0x0000, /* R14080 */
+ 0x0000, /* R14081 */
+ 0x0000, /* R14082 */
+ 0x0000, /* R14083 */
+ 0x0000, /* R14084 */
+ 0x0000, /* R14085 */
+ 0x0000, /* R14086 */
+ 0x0000, /* R14087 */
+ 0x0000, /* R14088 */
+ 0x0000, /* R14089 */
+ 0x0000, /* R14090 */
+ 0x0000, /* R14091 */
+ 0x0000, /* R14092 */
+ 0x0000, /* R14093 */
+ 0x0000, /* R14094 */
+ 0x0000, /* R14095 */
+ 0x0000, /* R14096 */
+ 0x0000, /* R14097 */
+ 0x0000, /* R14098 */
+ 0x0000, /* R14099 */
+ 0x0000, /* R14100 */
+ 0x0000, /* R14101 */
+ 0x0000, /* R14102 */
+ 0x0000, /* R14103 */
+ 0x0000, /* R14104 */
+ 0x0000, /* R14105 */
+ 0x0000, /* R14106 */
+ 0x0000, /* R14107 */
+ 0x0000, /* R14108 */
+ 0x0000, /* R14109 */
+ 0x0000, /* R14110 */
+ 0x0000, /* R14111 */
+ 0x0000, /* R14112 */
+ 0x0000, /* R14113 */
+ 0x0000, /* R14114 */
+ 0x0000, /* R14115 */
+ 0x0000, /* R14116 */
+ 0x0000, /* R14117 */
+ 0x0000, /* R14118 */
+ 0x0000, /* R14119 */
+ 0x0000, /* R14120 */
+ 0x0000, /* R14121 */
+ 0x0000, /* R14122 */
+ 0x0000, /* R14123 */
+ 0x0000, /* R14124 */
+ 0x0000, /* R14125 */
+ 0x0000, /* R14126 */
+ 0x0000, /* R14127 */
+ 0x0000, /* R14128 */
+ 0x0000, /* R14129 */
+ 0x0000, /* R14130 */
+ 0x0000, /* R14131 */
+ 0x0000, /* R14132 */
+ 0x0000, /* R14133 */
+ 0x0000, /* R14134 */
+ 0x0000, /* R14135 */
+ 0x0000, /* R14136 */
+ 0x0000, /* R14137 */
+ 0x0000, /* R14138 */
+ 0x0000, /* R14139 */
+ 0x0000, /* R14140 */
+ 0x0000, /* R14141 */
+ 0x0000, /* R14142 */
+ 0x0000, /* R14143 */
+ 0x0000, /* R14144 */
+ 0x0000, /* R14145 */
+ 0x0000, /* R14146 */
+ 0x0000, /* R14147 */
+ 0x0000, /* R14148 */
+ 0x0000, /* R14149 */
+ 0x0000, /* R14150 */
+ 0x0000, /* R14151 */
+ 0x0000, /* R14152 */
+ 0x0000, /* R14153 */
+ 0x0000, /* R14154 */
+ 0x0000, /* R14155 */
+ 0x0000, /* R14156 */
+ 0x0000, /* R14157 */
+ 0x0000, /* R14158 */
+ 0x0000, /* R14159 */
+ 0x0000, /* R14160 */
+ 0x0000, /* R14161 */
+ 0x0000, /* R14162 */
+ 0x0000, /* R14163 */
+ 0x0000, /* R14164 */
+ 0x0000, /* R14165 */
+ 0x0000, /* R14166 */
+ 0x0000, /* R14167 */
+ 0x0000, /* R14168 */
+ 0x0000, /* R14169 */
+ 0x0000, /* R14170 */
+ 0x0000, /* R14171 */
+ 0x0000, /* R14172 */
+ 0x0000, /* R14173 */
+ 0x0000, /* R14174 */
+ 0x0000, /* R14175 */
+ 0x0000, /* R14176 */
+ 0x0000, /* R14177 */
+ 0x0000, /* R14178 */
+ 0x0000, /* R14179 */
+ 0x0000, /* R14180 */
+ 0x0000, /* R14181 */
+ 0x0000, /* R14182 */
+ 0x0000, /* R14183 */
+ 0x0000, /* R14184 */
+ 0x0000, /* R14185 */
+ 0x0000, /* R14186 */
+ 0x0000, /* R14187 */
+ 0x0000, /* R14188 */
+ 0x0000, /* R14189 */
+ 0x0000, /* R14190 */
+ 0x0000, /* R14191 */
+ 0x0000, /* R14192 */
+ 0x0000, /* R14193 */
+ 0x0000, /* R14194 */
+ 0x0000, /* R14195 */
+ 0x0000, /* R14196 */
+ 0x0000, /* R14197 */
+ 0x0000, /* R14198 */
+ 0x0000, /* R14199 */
+ 0x0000, /* R14200 */
+ 0x0000, /* R14201 */
+ 0x0000, /* R14202 */
+ 0x0000, /* R14203 */
+ 0x0000, /* R14204 */
+ 0x0000, /* R14205 */
+ 0x0000, /* R14206 */
+ 0x0000, /* R14207 */
+ 0x0000, /* R14208 */
+ 0x0000, /* R14209 */
+ 0x0000, /* R14210 */
+ 0x0000, /* R14211 */
+ 0x0000, /* R14212 */
+ 0x0000, /* R14213 */
+ 0x0000, /* R14214 */
+ 0x0000, /* R14215 */
+ 0x0000, /* R14216 */
+ 0x0000, /* R14217 */
+ 0x0000, /* R14218 */
+ 0x0000, /* R14219 */
+ 0x0000, /* R14220 */
+ 0x0000, /* R14221 */
+ 0x0000, /* R14222 */
+ 0x0000, /* R14223 */
+ 0x0000, /* R14224 */
+ 0x0000, /* R14225 */
+ 0x0000, /* R14226 */
+ 0x0000, /* R14227 */
+ 0x0000, /* R14228 */
+ 0x0000, /* R14229 */
+ 0x0000, /* R14230 */
+ 0x0000, /* R14231 */
+ 0x0000, /* R14232 */
+ 0x0000, /* R14233 */
+ 0x0000, /* R14234 */
+ 0x0000, /* R14235 */
+ 0x0000, /* R14236 */
+ 0x0000, /* R14237 */
+ 0x0000, /* R14238 */
+ 0x0000, /* R14239 */
+ 0x0000, /* R14240 */
+ 0x0000, /* R14241 */
+ 0x0000, /* R14242 */
+ 0x0000, /* R14243 */
+ 0x0000, /* R14244 */
+ 0x0000, /* R14245 */
+ 0x0000, /* R14246 */
+ 0x0000, /* R14247 */
+ 0x0000, /* R14248 */
+ 0x0000, /* R14249 */
+ 0x0000, /* R14250 */
+ 0x0000, /* R14251 */
+ 0x0000, /* R14252 */
+ 0x0000, /* R14253 */
+ 0x0000, /* R14254 */
+ 0x0000, /* R14255 */
+ 0x0000, /* R14256 */
+ 0x0000, /* R14257 */
+ 0x0000, /* R14258 */
+ 0x0000, /* R14259 */
+ 0x0000, /* R14260 */
+ 0x0000, /* R14261 */
+ 0x0000, /* R14262 */
+ 0x0000, /* R14263 */
+ 0x0000, /* R14264 */
+ 0x0000, /* R14265 */
+ 0x0000, /* R14266 */
+ 0x0000, /* R14267 */
+ 0x0000, /* R14268 */
+ 0x0000, /* R14269 */
+ 0x0000, /* R14270 */
+ 0x0000, /* R14271 */
+ 0x0000, /* R14272 */
+ 0x0000, /* R14273 */
+ 0x0000, /* R14274 */
+ 0x0000, /* R14275 */
+ 0x0000, /* R14276 */
+ 0x0000, /* R14277 */
+ 0x0000, /* R14278 */
+ 0x0000, /* R14279 */
+ 0x0000, /* R14280 */
+ 0x0000, /* R14281 */
+ 0x0000, /* R14282 */
+ 0x0000, /* R14283 */
+ 0x0000, /* R14284 */
+ 0x0000, /* R14285 */
+ 0x0000, /* R14286 */
+ 0x0000, /* R14287 */
+ 0x0000, /* R14288 */
+ 0x0000, /* R14289 */
+ 0x0000, /* R14290 */
+ 0x0000, /* R14291 */
+ 0x0000, /* R14292 */
+ 0x0000, /* R14293 */
+ 0x0000, /* R14294 */
+ 0x0000, /* R14295 */
+ 0x0000, /* R14296 */
+ 0x0000, /* R14297 */
+ 0x0000, /* R14298 */
+ 0x0000, /* R14299 */
+ 0x0000, /* R14300 */
+ 0x0000, /* R14301 */
+ 0x0000, /* R14302 */
+ 0x0000, /* R14303 */
+ 0x0000, /* R14304 */
+ 0x0000, /* R14305 */
+ 0x0000, /* R14306 */
+ 0x0000, /* R14307 */
+ 0x0000, /* R14308 */
+ 0x0000, /* R14309 */
+ 0x0000, /* R14310 */
+ 0x0000, /* R14311 */
+ 0x0000, /* R14312 */
+ 0x0000, /* R14313 */
+ 0x0000, /* R14314 */
+ 0x0000, /* R14315 */
+ 0x0000, /* R14316 */
+ 0x0000, /* R14317 */
+ 0x0000, /* R14318 */
+ 0x0000, /* R14319 */
+ 0x0000, /* R14320 */
+ 0x0000, /* R14321 */
+ 0x0000, /* R14322 */
+ 0x0000, /* R14323 */
+ 0x0000, /* R14324 */
+ 0x0000, /* R14325 */
+ 0x0000, /* R14326 */
+ 0x0000, /* R14327 */
+ 0x0000, /* R14328 */
+ 0x0000, /* R14329 */
+ 0x0000, /* R14330 */
+ 0x0000, /* R14331 */
+ 0x0000, /* R14332 */
+ 0x0000, /* R14333 */
+ 0x0000, /* R14334 */
+ 0x0000, /* R14335 */
+ 0x0000, /* R14336 - DSP2 Data3 RAM 1 */
+ 0x0000, /* R14337 - DSP2 Data3 RAM 0 */
+ 0x0000, /* R14338 */
+ 0x0000, /* R14339 */
+ 0x0000, /* R14340 */
+ 0x0000, /* R14341 */
+ 0x0000, /* R14342 */
+ 0x0000, /* R14343 */
+ 0x0000, /* R14344 */
+ 0x0000, /* R14345 */
+ 0x0000, /* R14346 */
+ 0x0000, /* R14347 */
+ 0x0000, /* R14348 */
+ 0x0000, /* R14349 */
+ 0x0000, /* R14350 */
+ 0x0000, /* R14351 */
+ 0x0000, /* R14352 */
+ 0x0000, /* R14353 */
+ 0x0000, /* R14354 */
+ 0x0000, /* R14355 */
+ 0x0000, /* R14356 */
+ 0x0000, /* R14357 */
+ 0x0000, /* R14358 */
+ 0x0000, /* R14359 */
+ 0x0000, /* R14360 */
+ 0x0000, /* R14361 */
+ 0x0000, /* R14362 */
+ 0x0000, /* R14363 */
+ 0x0000, /* R14364 */
+ 0x0000, /* R14365 */
+ 0x0000, /* R14366 */
+ 0x0000, /* R14367 */
+ 0x0000, /* R14368 */
+ 0x0000, /* R14369 */
+ 0x0000, /* R14370 */
+ 0x0000, /* R14371 */
+ 0x0000, /* R14372 */
+ 0x0000, /* R14373 */
+ 0x0000, /* R14374 */
+ 0x0000, /* R14375 */
+ 0x0000, /* R14376 */
+ 0x0000, /* R14377 */
+ 0x0000, /* R14378 */
+ 0x0000, /* R14379 */
+ 0x0000, /* R14380 */
+ 0x0000, /* R14381 */
+ 0x0000, /* R14382 */
+ 0x0000, /* R14383 */
+ 0x0000, /* R14384 */
+ 0x0000, /* R14385 */
+ 0x0000, /* R14386 */
+ 0x0000, /* R14387 */
+ 0x0000, /* R14388 */
+ 0x0000, /* R14389 */
+ 0x0000, /* R14390 */
+ 0x0000, /* R14391 */
+ 0x0000, /* R14392 */
+ 0x0000, /* R14393 */
+ 0x0000, /* R14394 */
+ 0x0000, /* R14395 */
+ 0x0000, /* R14396 */
+ 0x0000, /* R14397 */
+ 0x0000, /* R14398 */
+ 0x0000, /* R14399 */
+ 0x0000, /* R14400 */
+ 0x0000, /* R14401 */
+ 0x0000, /* R14402 */
+ 0x0000, /* R14403 */
+ 0x0000, /* R14404 */
+ 0x0000, /* R14405 */
+ 0x0000, /* R14406 */
+ 0x0000, /* R14407 */
+ 0x0000, /* R14408 */
+ 0x0000, /* R14409 */
+ 0x0000, /* R14410 */
+ 0x0000, /* R14411 */
+ 0x0000, /* R14412 */
+ 0x0000, /* R14413 */
+ 0x0000, /* R14414 */
+ 0x0000, /* R14415 */
+ 0x0000, /* R14416 */
+ 0x0000, /* R14417 */
+ 0x0000, /* R14418 */
+ 0x0000, /* R14419 */
+ 0x0000, /* R14420 */
+ 0x0000, /* R14421 */
+ 0x0000, /* R14422 */
+ 0x0000, /* R14423 */
+ 0x0000, /* R14424 */
+ 0x0000, /* R14425 */
+ 0x0000, /* R14426 */
+ 0x0000, /* R14427 */
+ 0x0000, /* R14428 */
+ 0x0000, /* R14429 */
+ 0x0000, /* R14430 */
+ 0x0000, /* R14431 */
+ 0x0000, /* R14432 */
+ 0x0000, /* R14433 */
+ 0x0000, /* R14434 */
+ 0x0000, /* R14435 */
+ 0x0000, /* R14436 */
+ 0x0000, /* R14437 */
+ 0x0000, /* R14438 */
+ 0x0000, /* R14439 */
+ 0x0000, /* R14440 */
+ 0x0000, /* R14441 */
+ 0x0000, /* R14442 */
+ 0x0000, /* R14443 */
+ 0x0000, /* R14444 */
+ 0x0000, /* R14445 */
+ 0x0000, /* R14446 */
+ 0x0000, /* R14447 */
+ 0x0000, /* R14448 */
+ 0x0000, /* R14449 */
+ 0x0000, /* R14450 */
+ 0x0000, /* R14451 */
+ 0x0000, /* R14452 */
+ 0x0000, /* R14453 */
+ 0x0000, /* R14454 */
+ 0x0000, /* R14455 */
+ 0x0000, /* R14456 */
+ 0x0000, /* R14457 */
+ 0x0000, /* R14458 */
+ 0x0000, /* R14459 */
+ 0x0000, /* R14460 */
+ 0x0000, /* R14461 */
+ 0x0000, /* R14462 */
+ 0x0000, /* R14463 */
+ 0x0000, /* R14464 */
+ 0x0000, /* R14465 */
+ 0x0000, /* R14466 */
+ 0x0000, /* R14467 */
+ 0x0000, /* R14468 */
+ 0x0000, /* R14469 */
+ 0x0000, /* R14470 */
+ 0x0000, /* R14471 */
+ 0x0000, /* R14472 */
+ 0x0000, /* R14473 */
+ 0x0000, /* R14474 */
+ 0x0000, /* R14475 */
+ 0x0000, /* R14476 */
+ 0x0000, /* R14477 */
+ 0x0000, /* R14478 */
+ 0x0000, /* R14479 */
+ 0x0000, /* R14480 */
+ 0x0000, /* R14481 */
+ 0x0000, /* R14482 */
+ 0x0000, /* R14483 */
+ 0x0000, /* R14484 */
+ 0x0000, /* R14485 */
+ 0x0000, /* R14486 */
+ 0x0000, /* R14487 */
+ 0x0000, /* R14488 */
+ 0x0000, /* R14489 */
+ 0x0000, /* R14490 */
+ 0x0000, /* R14491 */
+ 0x0000, /* R14492 */
+ 0x0000, /* R14493 */
+ 0x0000, /* R14494 */
+ 0x0000, /* R14495 */
+ 0x0000, /* R14496 */
+ 0x0000, /* R14497 */
+ 0x0000, /* R14498 */
+ 0x0000, /* R14499 */
+ 0x0000, /* R14500 */
+ 0x0000, /* R14501 */
+ 0x0000, /* R14502 */
+ 0x0000, /* R14503 */
+ 0x0000, /* R14504 */
+ 0x0000, /* R14505 */
+ 0x0000, /* R14506 */
+ 0x0000, /* R14507 */
+ 0x0000, /* R14508 */
+ 0x0000, /* R14509 */
+ 0x0000, /* R14510 */
+ 0x0000, /* R14511 */
+ 0x0000, /* R14512 */
+ 0x0000, /* R14513 */
+ 0x0000, /* R14514 */
+ 0x0000, /* R14515 */
+ 0x0000, /* R14516 */
+ 0x0000, /* R14517 */
+ 0x0000, /* R14518 */
+ 0x0000, /* R14519 */
+ 0x0000, /* R14520 */
+ 0x0000, /* R14521 */
+ 0x0000, /* R14522 */
+ 0x0000, /* R14523 */
+ 0x0000, /* R14524 */
+ 0x0000, /* R14525 */
+ 0x0000, /* R14526 */
+ 0x0000, /* R14527 */
+ 0x0000, /* R14528 */
+ 0x0000, /* R14529 */
+ 0x0000, /* R14530 */
+ 0x0000, /* R14531 */
+ 0x0000, /* R14532 */
+ 0x0000, /* R14533 */
+ 0x0000, /* R14534 */
+ 0x0000, /* R14535 */
+ 0x0000, /* R14536 */
+ 0x0000, /* R14537 */
+ 0x0000, /* R14538 */
+ 0x0000, /* R14539 */
+ 0x0000, /* R14540 */
+ 0x0000, /* R14541 */
+ 0x0000, /* R14542 */
+ 0x0000, /* R14543 */
+ 0x0000, /* R14544 */
+ 0x0000, /* R14545 */
+ 0x0000, /* R14546 */
+ 0x0000, /* R14547 */
+ 0x0000, /* R14548 */
+ 0x0000, /* R14549 */
+ 0x0000, /* R14550 */
+ 0x0000, /* R14551 */
+ 0x0000, /* R14552 */
+ 0x0000, /* R14553 */
+ 0x0000, /* R14554 */
+ 0x0000, /* R14555 */
+ 0x0000, /* R14556 */
+ 0x0000, /* R14557 */
+ 0x0000, /* R14558 */
+ 0x0000, /* R14559 */
+ 0x0000, /* R14560 */
+ 0x0000, /* R14561 */
+ 0x0000, /* R14562 */
+ 0x0000, /* R14563 */
+ 0x0000, /* R14564 */
+ 0x0000, /* R14565 */
+ 0x0000, /* R14566 */
+ 0x0000, /* R14567 */
+ 0x0000, /* R14568 */
+ 0x0000, /* R14569 */
+ 0x0000, /* R14570 */
+ 0x0000, /* R14571 */
+ 0x0000, /* R14572 */
+ 0x0000, /* R14573 */
+ 0x0000, /* R14574 */
+ 0x0000, /* R14575 */
+ 0x0000, /* R14576 */
+ 0x0000, /* R14577 */
+ 0x0000, /* R14578 */
+ 0x0000, /* R14579 */
+ 0x0000, /* R14580 */
+ 0x0000, /* R14581 */
+ 0x0000, /* R14582 */
+ 0x0000, /* R14583 */
+ 0x0000, /* R14584 */
+ 0x0000, /* R14585 */
+ 0x0000, /* R14586 */
+ 0x0000, /* R14587 */
+ 0x0000, /* R14588 */
+ 0x0000, /* R14589 */
+ 0x0000, /* R14590 */
+ 0x0000, /* R14591 */
+ 0x0000, /* R14592 */
+ 0x0000, /* R14593 */
+ 0x0000, /* R14594 */
+ 0x0000, /* R14595 */
+ 0x0000, /* R14596 */
+ 0x0000, /* R14597 */
+ 0x0000, /* R14598 */
+ 0x0000, /* R14599 */
+ 0x0000, /* R14600 */
+ 0x0000, /* R14601 */
+ 0x0000, /* R14602 */
+ 0x0000, /* R14603 */
+ 0x0000, /* R14604 */
+ 0x0000, /* R14605 */
+ 0x0000, /* R14606 */
+ 0x0000, /* R14607 */
+ 0x0000, /* R14608 */
+ 0x0000, /* R14609 */
+ 0x0000, /* R14610 */
+ 0x0000, /* R14611 */
+ 0x0000, /* R14612 */
+ 0x0000, /* R14613 */
+ 0x0000, /* R14614 */
+ 0x0000, /* R14615 */
+ 0x0000, /* R14616 */
+ 0x0000, /* R14617 */
+ 0x0000, /* R14618 */
+ 0x0000, /* R14619 */
+ 0x0000, /* R14620 */
+ 0x0000, /* R14621 */
+ 0x0000, /* R14622 */
+ 0x0000, /* R14623 */
+ 0x0000, /* R14624 */
+ 0x0000, /* R14625 */
+ 0x0000, /* R14626 */
+ 0x0000, /* R14627 */
+ 0x0000, /* R14628 */
+ 0x0000, /* R14629 */
+ 0x0000, /* R14630 */
+ 0x0000, /* R14631 */
+ 0x0000, /* R14632 */
+ 0x0000, /* R14633 */
+ 0x0000, /* R14634 */
+ 0x0000, /* R14635 */
+ 0x0000, /* R14636 */
+ 0x0000, /* R14637 */
+ 0x0000, /* R14638 */
+ 0x0000, /* R14639 */
+ 0x0000, /* R14640 */
+ 0x0000, /* R14641 */
+ 0x0000, /* R14642 */
+ 0x0000, /* R14643 */
+ 0x0000, /* R14644 */
+ 0x0000, /* R14645 */
+ 0x0000, /* R14646 */
+ 0x0000, /* R14647 */
+ 0x0000, /* R14648 */
+ 0x0000, /* R14649 */
+ 0x0000, /* R14650 */
+ 0x0000, /* R14651 */
+ 0x0000, /* R14652 */
+ 0x0000, /* R14653 */
+ 0x0000, /* R14654 */
+ 0x0000, /* R14655 */
+ 0x0000, /* R14656 */
+ 0x0000, /* R14657 */
+ 0x0000, /* R14658 */
+ 0x0000, /* R14659 */
+ 0x0000, /* R14660 */
+ 0x0000, /* R14661 */
+ 0x0000, /* R14662 */
+ 0x0000, /* R14663 */
+ 0x0000, /* R14664 */
+ 0x0000, /* R14665 */
+ 0x0000, /* R14666 */
+ 0x0000, /* R14667 */
+ 0x0000, /* R14668 */
+ 0x0000, /* R14669 */
+ 0x0000, /* R14670 */
+ 0x0000, /* R14671 */
+ 0x0000, /* R14672 */
+ 0x0000, /* R14673 */
+ 0x0000, /* R14674 */
+ 0x0000, /* R14675 */
+ 0x0000, /* R14676 */
+ 0x0000, /* R14677 */
+ 0x0000, /* R14678 */
+ 0x0000, /* R14679 */
+ 0x0000, /* R14680 */
+ 0x0000, /* R14681 */
+ 0x0000, /* R14682 */
+ 0x0000, /* R14683 */
+ 0x0000, /* R14684 */
+ 0x0000, /* R14685 */
+ 0x0000, /* R14686 */
+ 0x0000, /* R14687 */
+ 0x0000, /* R14688 */
+ 0x0000, /* R14689 */
+ 0x0000, /* R14690 */
+ 0x0000, /* R14691 */
+ 0x0000, /* R14692 */
+ 0x0000, /* R14693 */
+ 0x0000, /* R14694 */
+ 0x0000, /* R14695 */
+ 0x0000, /* R14696 */
+ 0x0000, /* R14697 */
+ 0x0000, /* R14698 */
+ 0x0000, /* R14699 */
+ 0x0000, /* R14700 */
+ 0x0000, /* R14701 */
+ 0x0000, /* R14702 */
+ 0x0000, /* R14703 */
+ 0x0000, /* R14704 */
+ 0x0000, /* R14705 */
+ 0x0000, /* R14706 */
+ 0x0000, /* R14707 */
+ 0x0000, /* R14708 */
+ 0x0000, /* R14709 */
+ 0x0000, /* R14710 */
+ 0x0000, /* R14711 */
+ 0x0000, /* R14712 */
+ 0x0000, /* R14713 */
+ 0x0000, /* R14714 */
+ 0x0000, /* R14715 */
+ 0x0000, /* R14716 */
+ 0x0000, /* R14717 */
+ 0x0000, /* R14718 */
+ 0x0000, /* R14719 */
+ 0x0000, /* R14720 */
+ 0x0000, /* R14721 */
+ 0x0000, /* R14722 */
+ 0x0000, /* R14723 */
+ 0x0000, /* R14724 */
+ 0x0000, /* R14725 */
+ 0x0000, /* R14726 */
+ 0x0000, /* R14727 */
+ 0x0000, /* R14728 */
+ 0x0000, /* R14729 */
+ 0x0000, /* R14730 */
+ 0x0000, /* R14731 */
+ 0x0000, /* R14732 */
+ 0x0000, /* R14733 */
+ 0x0000, /* R14734 */
+ 0x0000, /* R14735 */
+ 0x0000, /* R14736 */
+ 0x0000, /* R14737 */
+ 0x0000, /* R14738 */
+ 0x0000, /* R14739 */
+ 0x0000, /* R14740 */
+ 0x0000, /* R14741 */
+ 0x0000, /* R14742 */
+ 0x0000, /* R14743 */
+ 0x0000, /* R14744 */
+ 0x0000, /* R14745 */
+ 0x0000, /* R14746 */
+ 0x0000, /* R14747 */
+ 0x0000, /* R14748 */
+ 0x0000, /* R14749 */
+ 0x0000, /* R14750 */
+ 0x0000, /* R14751 */
+ 0x0000, /* R14752 */
+ 0x0000, /* R14753 */
+ 0x0000, /* R14754 */
+ 0x0000, /* R14755 */
+ 0x0000, /* R14756 */
+ 0x0000, /* R14757 */
+ 0x0000, /* R14758 */
+ 0x0000, /* R14759 */
+ 0x0000, /* R14760 */
+ 0x0000, /* R14761 */
+ 0x0000, /* R14762 */
+ 0x0000, /* R14763 */
+ 0x0000, /* R14764 */
+ 0x0000, /* R14765 */
+ 0x0000, /* R14766 */
+ 0x0000, /* R14767 */
+ 0x0000, /* R14768 */
+ 0x0000, /* R14769 */
+ 0x0000, /* R14770 */
+ 0x0000, /* R14771 */
+ 0x0000, /* R14772 */
+ 0x0000, /* R14773 */
+ 0x0000, /* R14774 */
+ 0x0000, /* R14775 */
+ 0x0000, /* R14776 */
+ 0x0000, /* R14777 */
+ 0x0000, /* R14778 */
+ 0x0000, /* R14779 */
+ 0x0000, /* R14780 */
+ 0x0000, /* R14781 */
+ 0x0000, /* R14782 */
+ 0x0000, /* R14783 */
+ 0x0000, /* R14784 */
+ 0x0000, /* R14785 */
+ 0x0000, /* R14786 */
+ 0x0000, /* R14787 */
+ 0x0000, /* R14788 */
+ 0x0000, /* R14789 */
+ 0x0000, /* R14790 */
+ 0x0000, /* R14791 */
+ 0x0000, /* R14792 */
+ 0x0000, /* R14793 */
+ 0x0000, /* R14794 */
+ 0x0000, /* R14795 */
+ 0x0000, /* R14796 */
+ 0x0000, /* R14797 */
+ 0x0000, /* R14798 */
+ 0x0000, /* R14799 */
+ 0x0000, /* R14800 */
+ 0x0000, /* R14801 */
+ 0x0000, /* R14802 */
+ 0x0000, /* R14803 */
+ 0x0000, /* R14804 */
+ 0x0000, /* R14805 */
+ 0x0000, /* R14806 */
+ 0x0000, /* R14807 */
+ 0x0000, /* R14808 */
+ 0x0000, /* R14809 */
+ 0x0000, /* R14810 */
+ 0x0000, /* R14811 */
+ 0x0000, /* R14812 */
+ 0x0000, /* R14813 */
+ 0x0000, /* R14814 */
+ 0x0000, /* R14815 */
+ 0x0000, /* R14816 */
+ 0x0000, /* R14817 */
+ 0x0000, /* R14818 */
+ 0x0000, /* R14819 */
+ 0x0000, /* R14820 */
+ 0x0000, /* R14821 */
+ 0x0000, /* R14822 */
+ 0x0000, /* R14823 */
+ 0x0000, /* R14824 */
+ 0x0000, /* R14825 */
+ 0x0000, /* R14826 */
+ 0x0000, /* R14827 */
+ 0x0000, /* R14828 */
+ 0x0000, /* R14829 */
+ 0x0000, /* R14830 */
+ 0x0000, /* R14831 */
+ 0x0000, /* R14832 */
+ 0x0000, /* R14833 */
+ 0x0000, /* R14834 */
+ 0x0000, /* R14835 */
+ 0x0000, /* R14836 */
+ 0x0000, /* R14837 */
+ 0x0000, /* R14838 */
+ 0x0000, /* R14839 */
+ 0x0000, /* R14840 */
+ 0x0000, /* R14841 */
+ 0x0000, /* R14842 */
+ 0x0000, /* R14843 */
+ 0x0000, /* R14844 */
+ 0x0000, /* R14845 */
+ 0x0000, /* R14846 */
+ 0x0000, /* R14847 */
+ 0x0000, /* R14848 */
+ 0x0000, /* R14849 */
+ 0x0000, /* R14850 */
+ 0x0000, /* R14851 */
+ 0x0000, /* R14852 */
+ 0x0000, /* R14853 */
+ 0x0000, /* R14854 */
+ 0x0000, /* R14855 */
+ 0x0000, /* R14856 */
+ 0x0000, /* R14857 */
+ 0x0000, /* R14858 */
+ 0x0000, /* R14859 */
+ 0x0000, /* R14860 */
+ 0x0000, /* R14861 */
+ 0x0000, /* R14862 */
+ 0x0000, /* R14863 */
+ 0x0000, /* R14864 */
+ 0x0000, /* R14865 */
+ 0x0000, /* R14866 */
+ 0x0000, /* R14867 */
+ 0x0000, /* R14868 */
+ 0x0000, /* R14869 */
+ 0x0000, /* R14870 */
+ 0x0000, /* R14871 */
+ 0x0000, /* R14872 */
+ 0x0000, /* R14873 */
+ 0x0000, /* R14874 */
+ 0x0000, /* R14875 */
+ 0x0000, /* R14876 */
+ 0x0000, /* R14877 */
+ 0x0000, /* R14878 */
+ 0x0000, /* R14879 */
+ 0x0000, /* R14880 */
+ 0x0000, /* R14881 */
+ 0x0000, /* R14882 */
+ 0x0000, /* R14883 */
+ 0x0000, /* R14884 */
+ 0x0000, /* R14885 */
+ 0x0000, /* R14886 */
+ 0x0000, /* R14887 */
+ 0x0000, /* R14888 */
+ 0x0000, /* R14889 */
+ 0x0000, /* R14890 */
+ 0x0000, /* R14891 */
+ 0x0000, /* R14892 */
+ 0x0000, /* R14893 */
+ 0x0000, /* R14894 */
+ 0x0000, /* R14895 */
+ 0x0000, /* R14896 */
+ 0x0000, /* R14897 */
+ 0x0000, /* R14898 */
+ 0x0000, /* R14899 */
+ 0x0000, /* R14900 */
+ 0x0000, /* R14901 */
+ 0x0000, /* R14902 */
+ 0x0000, /* R14903 */
+ 0x0000, /* R14904 */
+ 0x0000, /* R14905 */
+ 0x0000, /* R14906 */
+ 0x0000, /* R14907 */
+ 0x0000, /* R14908 */
+ 0x0000, /* R14909 */
+ 0x0000, /* R14910 */
+ 0x0000, /* R14911 */
+ 0x0000, /* R14912 */
+ 0x0000, /* R14913 */
+ 0x0000, /* R14914 */
+ 0x0000, /* R14915 */
+ 0x0000, /* R14916 */
+ 0x0000, /* R14917 */
+ 0x0000, /* R14918 */
+ 0x0000, /* R14919 */
+ 0x0000, /* R14920 */
+ 0x0000, /* R14921 */
+ 0x0000, /* R14922 */
+ 0x0000, /* R14923 */
+ 0x0000, /* R14924 */
+ 0x0000, /* R14925 */
+ 0x0000, /* R14926 */
+ 0x0000, /* R14927 */
+ 0x0000, /* R14928 */
+ 0x0000, /* R14929 */
+ 0x0000, /* R14930 */
+ 0x0000, /* R14931 */
+ 0x0000, /* R14932 */
+ 0x0000, /* R14933 */
+ 0x0000, /* R14934 */
+ 0x0000, /* R14935 */
+ 0x0000, /* R14936 */
+ 0x0000, /* R14937 */
+ 0x0000, /* R14938 */
+ 0x0000, /* R14939 */
+ 0x0000, /* R14940 */
+ 0x0000, /* R14941 */
+ 0x0000, /* R14942 */
+ 0x0000, /* R14943 */
+ 0x0000, /* R14944 */
+ 0x0000, /* R14945 */
+ 0x0000, /* R14946 */
+ 0x0000, /* R14947 */
+ 0x0000, /* R14948 */
+ 0x0000, /* R14949 */
+ 0x0000, /* R14950 */
+ 0x0000, /* R14951 */
+ 0x0000, /* R14952 */
+ 0x0000, /* R14953 */
+ 0x0000, /* R14954 */
+ 0x0000, /* R14955 */
+ 0x0000, /* R14956 */
+ 0x0000, /* R14957 */
+ 0x0000, /* R14958 */
+ 0x0000, /* R14959 */
+ 0x0000, /* R14960 */
+ 0x0000, /* R14961 */
+ 0x0000, /* R14962 */
+ 0x0000, /* R14963 */
+ 0x0000, /* R14964 */
+ 0x0000, /* R14965 */
+ 0x0000, /* R14966 */
+ 0x0000, /* R14967 */
+ 0x0000, /* R14968 */
+ 0x0000, /* R14969 */
+ 0x0000, /* R14970 */
+ 0x0000, /* R14971 */
+ 0x0000, /* R14972 */
+ 0x0000, /* R14973 */
+ 0x0000, /* R14974 */
+ 0x0000, /* R14975 */
+ 0x0000, /* R14976 */
+ 0x0000, /* R14977 */
+ 0x0000, /* R14978 */
+ 0x0000, /* R14979 */
+ 0x0000, /* R14980 */
+ 0x0000, /* R14981 */
+ 0x0000, /* R14982 */
+ 0x0000, /* R14983 */
+ 0x0000, /* R14984 */
+ 0x0000, /* R14985 */
+ 0x0000, /* R14986 */
+ 0x0000, /* R14987 */
+ 0x0000, /* R14988 */
+ 0x0000, /* R14989 */
+ 0x0000, /* R14990 */
+ 0x0000, /* R14991 */
+ 0x0000, /* R14992 */
+ 0x0000, /* R14993 */
+ 0x0000, /* R14994 */
+ 0x0000, /* R14995 */
+ 0x0000, /* R14996 */
+ 0x0000, /* R14997 */
+ 0x0000, /* R14998 */
+ 0x0000, /* R14999 */
+ 0x0000, /* R15000 */
+ 0x0000, /* R15001 */
+ 0x0000, /* R15002 */
+ 0x0000, /* R15003 */
+ 0x0000, /* R15004 */
+ 0x0000, /* R15005 */
+ 0x0000, /* R15006 */
+ 0x0000, /* R15007 */
+ 0x0000, /* R15008 */
+ 0x0000, /* R15009 */
+ 0x0000, /* R15010 */
+ 0x0000, /* R15011 */
+ 0x0000, /* R15012 */
+ 0x0000, /* R15013 */
+ 0x0000, /* R15014 */
+ 0x0000, /* R15015 */
+ 0x0000, /* R15016 */
+ 0x0000, /* R15017 */
+ 0x0000, /* R15018 */
+ 0x0000, /* R15019 */
+ 0x0000, /* R15020 */
+ 0x0000, /* R15021 */
+ 0x0000, /* R15022 */
+ 0x0000, /* R15023 */
+ 0x0000, /* R15024 */
+ 0x0000, /* R15025 */
+ 0x0000, /* R15026 */
+ 0x0000, /* R15027 */
+ 0x0000, /* R15028 */
+ 0x0000, /* R15029 */
+ 0x0000, /* R15030 */
+ 0x0000, /* R15031 */
+ 0x0000, /* R15032 */
+ 0x0000, /* R15033 */
+ 0x0000, /* R15034 */
+ 0x0000, /* R15035 */
+ 0x0000, /* R15036 */
+ 0x0000, /* R15037 */
+ 0x0000, /* R15038 */
+ 0x0000, /* R15039 */
+ 0x0000, /* R15040 */
+ 0x0000, /* R15041 */
+ 0x0000, /* R15042 */
+ 0x0000, /* R15043 */
+ 0x0000, /* R15044 */
+ 0x0000, /* R15045 */
+ 0x0000, /* R15046 */
+ 0x0000, /* R15047 */
+ 0x0000, /* R15048 */
+ 0x0000, /* R15049 */
+ 0x0000, /* R15050 */
+ 0x0000, /* R15051 */
+ 0x0000, /* R15052 */
+ 0x0000, /* R15053 */
+ 0x0000, /* R15054 */
+ 0x0000, /* R15055 */
+ 0x0000, /* R15056 */
+ 0x0000, /* R15057 */
+ 0x0000, /* R15058 */
+ 0x0000, /* R15059 */
+ 0x0000, /* R15060 */
+ 0x0000, /* R15061 */
+ 0x0000, /* R15062 */
+ 0x0000, /* R15063 */
+ 0x0000, /* R15064 */
+ 0x0000, /* R15065 */
+ 0x0000, /* R15066 */
+ 0x0000, /* R15067 */
+ 0x0000, /* R15068 */
+ 0x0000, /* R15069 */
+ 0x0000, /* R15070 */
+ 0x0000, /* R15071 */
+ 0x0000, /* R15072 */
+ 0x0000, /* R15073 */
+ 0x0000, /* R15074 */
+ 0x0000, /* R15075 */
+ 0x0000, /* R15076 */
+ 0x0000, /* R15077 */
+ 0x0000, /* R15078 */
+ 0x0000, /* R15079 */
+ 0x0000, /* R15080 */
+ 0x0000, /* R15081 */
+ 0x0000, /* R15082 */
+ 0x0000, /* R15083 */
+ 0x0000, /* R15084 */
+ 0x0000, /* R15085 */
+ 0x0000, /* R15086 */
+ 0x0000, /* R15087 */
+ 0x0000, /* R15088 */
+ 0x0000, /* R15089 */
+ 0x0000, /* R15090 */
+ 0x0000, /* R15091 */
+ 0x0000, /* R15092 */
+ 0x0000, /* R15093 */
+ 0x0000, /* R15094 */
+ 0x0000, /* R15095 */
+ 0x0000, /* R15096 */
+ 0x0000, /* R15097 */
+ 0x0000, /* R15098 */
+ 0x0000, /* R15099 */
+ 0x0000, /* R15100 */
+ 0x0000, /* R15101 */
+ 0x0000, /* R15102 */
+ 0x0000, /* R15103 */
+ 0x0000, /* R15104 */
+ 0x0000, /* R15105 */
+ 0x0000, /* R15106 */
+ 0x0000, /* R15107 */
+ 0x0000, /* R15108 */
+ 0x0000, /* R15109 */
+ 0x0000, /* R15110 */
+ 0x0000, /* R15111 */
+ 0x0000, /* R15112 */
+ 0x0000, /* R15113 */
+ 0x0000, /* R15114 */
+ 0x0000, /* R15115 */
+ 0x0000, /* R15116 */
+ 0x0000, /* R15117 */
+ 0x0000, /* R15118 */
+ 0x0000, /* R15119 */
+ 0x0000, /* R15120 */
+ 0x0000, /* R15121 */
+ 0x0000, /* R15122 */
+ 0x0000, /* R15123 */
+ 0x0000, /* R15124 */
+ 0x0000, /* R15125 */
+ 0x0000, /* R15126 */
+ 0x0000, /* R15127 */
+ 0x0000, /* R15128 */
+ 0x0000, /* R15129 */
+ 0x0000, /* R15130 */
+ 0x0000, /* R15131 */
+ 0x0000, /* R15132 */
+ 0x0000, /* R15133 */
+ 0x0000, /* R15134 */
+ 0x0000, /* R15135 */
+ 0x0000, /* R15136 */
+ 0x0000, /* R15137 */
+ 0x0000, /* R15138 */
+ 0x0000, /* R15139 */
+ 0x0000, /* R15140 */
+ 0x0000, /* R15141 */
+ 0x0000, /* R15142 */
+ 0x0000, /* R15143 */
+ 0x0000, /* R15144 */
+ 0x0000, /* R15145 */
+ 0x0000, /* R15146 */
+ 0x0000, /* R15147 */
+ 0x0000, /* R15148 */
+ 0x0000, /* R15149 */
+ 0x0000, /* R15150 */
+ 0x0000, /* R15151 */
+ 0x0000, /* R15152 */
+ 0x0000, /* R15153 */
+ 0x0000, /* R15154 */
+ 0x0000, /* R15155 */
+ 0x0000, /* R15156 */
+ 0x0000, /* R15157 */
+ 0x0000, /* R15158 */
+ 0x0000, /* R15159 */
+ 0x0000, /* R15160 */
+ 0x0000, /* R15161 */
+ 0x0000, /* R15162 */
+ 0x0000, /* R15163 */
+ 0x0000, /* R15164 */
+ 0x0000, /* R15165 */
+ 0x0000, /* R15166 */
+ 0x0000, /* R15167 */
+ 0x0000, /* R15168 */
+ 0x0000, /* R15169 */
+ 0x0000, /* R15170 */
+ 0x0000, /* R15171 */
+ 0x0000, /* R15172 */
+ 0x0000, /* R15173 */
+ 0x0000, /* R15174 */
+ 0x0000, /* R15175 */
+ 0x0000, /* R15176 */
+ 0x0000, /* R15177 */
+ 0x0000, /* R15178 */
+ 0x0000, /* R15179 */
+ 0x0000, /* R15180 */
+ 0x0000, /* R15181 */
+ 0x0000, /* R15182 */
+ 0x0000, /* R15183 */
+ 0x0000, /* R15184 */
+ 0x0000, /* R15185 */
+ 0x0000, /* R15186 */
+ 0x0000, /* R15187 */
+ 0x0000, /* R15188 */
+ 0x0000, /* R15189 */
+ 0x0000, /* R15190 */
+ 0x0000, /* R15191 */
+ 0x0000, /* R15192 */
+ 0x0000, /* R15193 */
+ 0x0000, /* R15194 */
+ 0x0000, /* R15195 */
+ 0x0000, /* R15196 */
+ 0x0000, /* R15197 */
+ 0x0000, /* R15198 */
+ 0x0000, /* R15199 */
+ 0x0000, /* R15200 */
+ 0x0000, /* R15201 */
+ 0x0000, /* R15202 */
+ 0x0000, /* R15203 */
+ 0x0000, /* R15204 */
+ 0x0000, /* R15205 */
+ 0x0000, /* R15206 */
+ 0x0000, /* R15207 */
+ 0x0000, /* R15208 */
+ 0x0000, /* R15209 */
+ 0x0000, /* R15210 */
+ 0x0000, /* R15211 */
+ 0x0000, /* R15212 */
+ 0x0000, /* R15213 */
+ 0x0000, /* R15214 */
+ 0x0000, /* R15215 */
+ 0x0000, /* R15216 */
+ 0x0000, /* R15217 */
+ 0x0000, /* R15218 */
+ 0x0000, /* R15219 */
+ 0x0000, /* R15220 */
+ 0x0000, /* R15221 */
+ 0x0000, /* R15222 */
+ 0x0000, /* R15223 */
+ 0x0000, /* R15224 */
+ 0x0000, /* R15225 */
+ 0x0000, /* R15226 */
+ 0x0000, /* R15227 */
+ 0x0000, /* R15228 */
+ 0x0000, /* R15229 */
+ 0x0000, /* R15230 */
+ 0x0000, /* R15231 */
+ 0x0000, /* R15232 */
+ 0x0000, /* R15233 */
+ 0x0000, /* R15234 */
+ 0x0000, /* R15235 */
+ 0x0000, /* R15236 */
+ 0x0000, /* R15237 */
+ 0x0000, /* R15238 */
+ 0x0000, /* R15239 */
+ 0x0000, /* R15240 */
+ 0x0000, /* R15241 */
+ 0x0000, /* R15242 */
+ 0x0000, /* R15243 */
+ 0x0000, /* R15244 */
+ 0x0000, /* R15245 */
+ 0x0000, /* R15246 */
+ 0x0000, /* R15247 */
+ 0x0000, /* R15248 */
+ 0x0000, /* R15249 */
+ 0x0000, /* R15250 */
+ 0x0000, /* R15251 */
+ 0x0000, /* R15252 */
+ 0x0000, /* R15253 */
+ 0x0000, /* R15254 */
+ 0x0000, /* R15255 */
+ 0x0000, /* R15256 */
+ 0x0000, /* R15257 */
+ 0x0000, /* R15258 */
+ 0x0000, /* R15259 */
+ 0x0000, /* R15260 */
+ 0x0000, /* R15261 */
+ 0x0000, /* R15262 */
+ 0x0000, /* R15263 */
+ 0x0000, /* R15264 */
+ 0x0000, /* R15265 */
+ 0x0000, /* R15266 */
+ 0x0000, /* R15267 */
+ 0x0000, /* R15268 */
+ 0x0000, /* R15269 */
+ 0x0000, /* R15270 */
+ 0x0000, /* R15271 */
+ 0x0000, /* R15272 */
+ 0x0000, /* R15273 */
+ 0x0000, /* R15274 */
+ 0x0000, /* R15275 */
+ 0x0000, /* R15276 */
+ 0x0000, /* R15277 */
+ 0x0000, /* R15278 */
+ 0x0000, /* R15279 */
+ 0x0000, /* R15280 */
+ 0x0000, /* R15281 */
+ 0x0000, /* R15282 */
+ 0x0000, /* R15283 */
+ 0x0000, /* R15284 */
+ 0x0000, /* R15285 */
+ 0x0000, /* R15286 */
+ 0x0000, /* R15287 */
+ 0x0000, /* R15288 */
+ 0x0000, /* R15289 */
+ 0x0000, /* R15290 */
+ 0x0000, /* R15291 */
+ 0x0000, /* R15292 */
+ 0x0000, /* R15293 */
+ 0x0000, /* R15294 */
+ 0x0000, /* R15295 */
+ 0x0000, /* R15296 */
+ 0x0000, /* R15297 */
+ 0x0000, /* R15298 */
+ 0x0000, /* R15299 */
+ 0x0000, /* R15300 */
+ 0x0000, /* R15301 */
+ 0x0000, /* R15302 */
+ 0x0000, /* R15303 */
+ 0x0000, /* R15304 */
+ 0x0000, /* R15305 */
+ 0x0000, /* R15306 */
+ 0x0000, /* R15307 */
+ 0x0000, /* R15308 */
+ 0x0000, /* R15309 */
+ 0x0000, /* R15310 */
+ 0x0000, /* R15311 */
+ 0x0000, /* R15312 */
+ 0x0000, /* R15313 */
+ 0x0000, /* R15314 */
+ 0x0000, /* R15315 */
+ 0x0000, /* R15316 */
+ 0x0000, /* R15317 */
+ 0x0000, /* R15318 */
+ 0x0000, /* R15319 */
+ 0x0000, /* R15320 */
+ 0x0000, /* R15321 */
+ 0x0000, /* R15322 */
+ 0x0000, /* R15323 */
+ 0x0000, /* R15324 */
+ 0x0000, /* R15325 */
+ 0x0000, /* R15326 */
+ 0x0000, /* R15327 */
+ 0x0000, /* R15328 */
+ 0x0000, /* R15329 */
+ 0x0000, /* R15330 */
+ 0x0000, /* R15331 */
+ 0x0000, /* R15332 */
+ 0x0000, /* R15333 */
+ 0x0000, /* R15334 */
+ 0x0000, /* R15335 */
+ 0x0000, /* R15336 */
+ 0x0000, /* R15337 */
+ 0x0000, /* R15338 */
+ 0x0000, /* R15339 */
+ 0x0000, /* R15340 */
+ 0x0000, /* R15341 */
+ 0x0000, /* R15342 */
+ 0x0000, /* R15343 */
+ 0x0000, /* R15344 */
+ 0x0000, /* R15345 */
+ 0x0000, /* R15346 */
+ 0x0000, /* R15347 */
+ 0x0000, /* R15348 */
+ 0x0000, /* R15349 */
+ 0x0000, /* R15350 */
+ 0x0000, /* R15351 */
+ 0x0000, /* R15352 */
+ 0x0000, /* R15353 */
+ 0x0000, /* R15354 */
+ 0x0000, /* R15355 */
+ 0x0000, /* R15356 */
+ 0x0000, /* R15357 */
+ 0x0000, /* R15358 */
+ 0x0000, /* R15359 */
+ 0x000A, /* R15360 - DSP2 Coeff RAM 0 */
+ 0x0000, /* R15361 */
+ 0x0000, /* R15362 */
+ 0x0000, /* R15363 */
+ 0x0000, /* R15364 */
+ 0x0000, /* R15365 */
+ 0x0000, /* R15366 */
+ 0x0000, /* R15367 */
+ 0x0000, /* R15368 */
+ 0x0000, /* R15369 */
+ 0x0000, /* R15370 */
+ 0x0000, /* R15371 */
+ 0x0000, /* R15372 */
+ 0x0000, /* R15373 */
+ 0x0000, /* R15374 */
+ 0x0000, /* R15375 */
+ 0x0000, /* R15376 */
+ 0x0000, /* R15377 */
+ 0x0000, /* R15378 */
+ 0x0000, /* R15379 */
+ 0x0000, /* R15380 */
+ 0x0000, /* R15381 */
+ 0x0000, /* R15382 */
+ 0x0000, /* R15383 */
+ 0x0000, /* R15384 */
+ 0x0000, /* R15385 */
+ 0x0000, /* R15386 */
+ 0x0000, /* R15387 */
+ 0x0000, /* R15388 */
+ 0x0000, /* R15389 */
+ 0x0000, /* R15390 */
+ 0x0000, /* R15391 */
+ 0x0000, /* R15392 */
+ 0x0000, /* R15393 */
+ 0x0000, /* R15394 */
+ 0x0000, /* R15395 */
+ 0x0000, /* R15396 */
+ 0x0000, /* R15397 */
+ 0x0000, /* R15398 */
+ 0x0000, /* R15399 */
+ 0x0000, /* R15400 */
+ 0x0000, /* R15401 */
+ 0x0000, /* R15402 */
+ 0x0000, /* R15403 */
+ 0x0000, /* R15404 */
+ 0x0000, /* R15405 */
+ 0x0000, /* R15406 */
+ 0x0000, /* R15407 */
+ 0x0000, /* R15408 */
+ 0x0000, /* R15409 */
+ 0x0000, /* R15410 */
+ 0x0000, /* R15411 */
+ 0x0000, /* R15412 */
+ 0x0000, /* R15413 */
+ 0x0000, /* R15414 */
+ 0x0000, /* R15415 */
+ 0x0000, /* R15416 */
+ 0x0000, /* R15417 */
+ 0x0000, /* R15418 */
+ 0x0000, /* R15419 */
+ 0x0000, /* R15420 */
+ 0x0000, /* R15421 */
+ 0x0000, /* R15422 */
+ 0x0000, /* R15423 */
+ 0x0000, /* R15424 */
+ 0x0000, /* R15425 */
+ 0x0000, /* R15426 */
+ 0x0000, /* R15427 */
+ 0x0000, /* R15428 */
+ 0x0000, /* R15429 */
+ 0x0000, /* R15430 */
+ 0x0000, /* R15431 */
+ 0x0000, /* R15432 */
+ 0x0000, /* R15433 */
+ 0x0000, /* R15434 */
+ 0x0000, /* R15435 */
+ 0x0000, /* R15436 */
+ 0x0000, /* R15437 */
+ 0x0000, /* R15438 */
+ 0x0000, /* R15439 */
+ 0x0000, /* R15440 */
+ 0x0000, /* R15441 */
+ 0x0000, /* R15442 */
+ 0x0000, /* R15443 */
+ 0x0000, /* R15444 */
+ 0x0000, /* R15445 */
+ 0x0000, /* R15446 */
+ 0x0000, /* R15447 */
+ 0x0000, /* R15448 */
+ 0x0000, /* R15449 */
+ 0x0000, /* R15450 */
+ 0x0000, /* R15451 */
+ 0x0000, /* R15452 */
+ 0x0000, /* R15453 */
+ 0x0000, /* R15454 */
+ 0x0000, /* R15455 */
+ 0x0000, /* R15456 */
+ 0x0000, /* R15457 */
+ 0x0000, /* R15458 */
+ 0x0000, /* R15459 */
+ 0x0000, /* R15460 */
+ 0x0000, /* R15461 */
+ 0x0000, /* R15462 */
+ 0x0000, /* R15463 */
+ 0x0000, /* R15464 */
+ 0x0000, /* R15465 */
+ 0x0000, /* R15466 */
+ 0x0000, /* R15467 */
+ 0x0000, /* R15468 */
+ 0x0000, /* R15469 */
+ 0x0000, /* R15470 */
+ 0x0000, /* R15471 */
+ 0x0000, /* R15472 */
+ 0x0000, /* R15473 */
+ 0x0000, /* R15474 */
+ 0x0000, /* R15475 */
+ 0x0000, /* R15476 */
+ 0x0000, /* R15477 */
+ 0x0000, /* R15478 */
+ 0x0000, /* R15479 */
+ 0x0000, /* R15480 */
+ 0x0000, /* R15481 */
+ 0x0000, /* R15482 */
+ 0x0000, /* R15483 */
+ 0x0000, /* R15484 */
+ 0x0000, /* R15485 */
+ 0x0000, /* R15486 */
+ 0x0000, /* R15487 */
+ 0x0000, /* R15488 */
+ 0x0000, /* R15489 */
+ 0x0000, /* R15490 */
+ 0x0000, /* R15491 */
+ 0x0000, /* R15492 */
+ 0x0000, /* R15493 */
+ 0x0000, /* R15494 */
+ 0x0000, /* R15495 */
+ 0x0000, /* R15496 */
+ 0x0000, /* R15497 */
+ 0x0000, /* R15498 */
+ 0x0000, /* R15499 */
+ 0x0000, /* R15500 */
+ 0x0000, /* R15501 */
+ 0x0000, /* R15502 */
+ 0x0000, /* R15503 */
+ 0x0000, /* R15504 */
+ 0x0000, /* R15505 */
+ 0x0000, /* R15506 */
+ 0x0000, /* R15507 */
+ 0x0000, /* R15508 */
+ 0x0000, /* R15509 */
+ 0x0000, /* R15510 */
+ 0x0000, /* R15511 */
+ 0x0000, /* R15512 */
+ 0x0000, /* R15513 */
+ 0x0000, /* R15514 */
+ 0x0000, /* R15515 */
+ 0x0000, /* R15516 */
+ 0x0000, /* R15517 */
+ 0x0000, /* R15518 */
+ 0x0000, /* R15519 */
+ 0x0000, /* R15520 */
+ 0x0000, /* R15521 */
+ 0x0000, /* R15522 */
+ 0x0000, /* R15523 */
+ 0x0000, /* R15524 */
+ 0x0000, /* R15525 */
+ 0x0000, /* R15526 */
+ 0x0000, /* R15527 */
+ 0x0000, /* R15528 */
+ 0x0000, /* R15529 */
+ 0x0000, /* R15530 */
+ 0x0000, /* R15531 */
+ 0x0000, /* R15532 */
+ 0x0000, /* R15533 */
+ 0x0000, /* R15534 */
+ 0x0000, /* R15535 */
+ 0x0000, /* R15536 */
+ 0x0000, /* R15537 */
+ 0x0000, /* R15538 */
+ 0x0000, /* R15539 */
+ 0x0000, /* R15540 */
+ 0x0000, /* R15541 */
+ 0x0000, /* R15542 */
+ 0x0000, /* R15543 */
+ 0x0000, /* R15544 */
+ 0x0000, /* R15545 */
+ 0x0000, /* R15546 */
+ 0x0000, /* R15547 */
+ 0x0000, /* R15548 */
+ 0x0000, /* R15549 */
+ 0x0000, /* R15550 */
+ 0x0000, /* R15551 */
+ 0x0000, /* R15552 */
+ 0x0000, /* R15553 */
+ 0x0000, /* R15554 */
+ 0x0000, /* R15555 */
+ 0x0000, /* R15556 */
+ 0x0000, /* R15557 */
+ 0x0000, /* R15558 */
+ 0x0000, /* R15559 */
+ 0x0000, /* R15560 */
+ 0x0000, /* R15561 */
+ 0x0000, /* R15562 */
+ 0x0000, /* R15563 */
+ 0x0000, /* R15564 */
+ 0x0000, /* R15565 */
+ 0x0000, /* R15566 */
+ 0x0000, /* R15567 */
+ 0x0000, /* R15568 */
+ 0x0000, /* R15569 */
+ 0x0000, /* R15570 */
+ 0x0000, /* R15571 */
+ 0x0000, /* R15572 */
+ 0x0000, /* R15573 */
+ 0x0000, /* R15574 */
+ 0x0000, /* R15575 */
+ 0x0000, /* R15576 */
+ 0x0000, /* R15577 */
+ 0x0000, /* R15578 */
+ 0x0000, /* R15579 */
+ 0x0000, /* R15580 */
+ 0x0000, /* R15581 */
+ 0x0000, /* R15582 */
+ 0x0000, /* R15583 */
+ 0x0000, /* R15584 */
+ 0x0000, /* R15585 */
+ 0x0000, /* R15586 */
+ 0x0000, /* R15587 */
+ 0x0000, /* R15588 */
+ 0x0000, /* R15589 */
+ 0x0000, /* R15590 */
+ 0x0000, /* R15591 */
+ 0x0000, /* R15592 */
+ 0x0000, /* R15593 */
+ 0x0000, /* R15594 */
+ 0x0000, /* R15595 */
+ 0x0000, /* R15596 */
+ 0x0000, /* R15597 */
+ 0x0000, /* R15598 */
+ 0x0000, /* R15599 */
+ 0x0000, /* R15600 */
+ 0x0000, /* R15601 */
+ 0x0000, /* R15602 */
+ 0x0000, /* R15603 */
+ 0x0000, /* R15604 */
+ 0x0000, /* R15605 */
+ 0x0000, /* R15606 */
+ 0x0000, /* R15607 */
+ 0x0000, /* R15608 */
+ 0x0000, /* R15609 */
+ 0x0000, /* R15610 */
+ 0x0000, /* R15611 */
+ 0x0000, /* R15612 */
+ 0x0000, /* R15613 */
+ 0x0000, /* R15614 */
+ 0x0000, /* R15615 */
+ 0x0000, /* R15616 */
+ 0x0000, /* R15617 */
+ 0x0000, /* R15618 */
+ 0x0000, /* R15619 */
+ 0x0000, /* R15620 */
+ 0x0000, /* R15621 */
+ 0x0000, /* R15622 */
+ 0x0000, /* R15623 */
+ 0x0000, /* R15624 */
+ 0x0000, /* R15625 */
+ 0x0000, /* R15626 */
+ 0x0000, /* R15627 */
+ 0x0000, /* R15628 */
+ 0x0000, /* R15629 */
+ 0x0000, /* R15630 */
+ 0x0000, /* R15631 */
+ 0x0000, /* R15632 */
+ 0x0000, /* R15633 */
+ 0x0000, /* R15634 */
+ 0x0000, /* R15635 */
+ 0x0000, /* R15636 */
+ 0x0000, /* R15637 */
+ 0x0000, /* R15638 */
+ 0x0000, /* R15639 */
+ 0x0000, /* R15640 */
+ 0x0000, /* R15641 */
+ 0x0000, /* R15642 */
+ 0x0000, /* R15643 */
+ 0x0000, /* R15644 */
+ 0x0000, /* R15645 */
+ 0x0000, /* R15646 */
+ 0x0000, /* R15647 */
+ 0x0000, /* R15648 */
+ 0x0000, /* R15649 */
+ 0x0000, /* R15650 */
+ 0x0000, /* R15651 */
+ 0x0000, /* R15652 */
+ 0x0000, /* R15653 */
+ 0x0000, /* R15654 */
+ 0x0000, /* R15655 */
+ 0x0000, /* R15656 */
+ 0x0000, /* R15657 */
+ 0x0000, /* R15658 */
+ 0x0000, /* R15659 */
+ 0x0000, /* R15660 */
+ 0x0000, /* R15661 */
+ 0x0000, /* R15662 */
+ 0x0000, /* R15663 */
+ 0x0000, /* R15664 */
+ 0x0000, /* R15665 */
+ 0x0000, /* R15666 */
+ 0x0000, /* R15667 */
+ 0x0000, /* R15668 */
+ 0x0000, /* R15669 */
+ 0x0000, /* R15670 */
+ 0x0000, /* R15671 */
+ 0x0000, /* R15672 */
+ 0x0000, /* R15673 */
+ 0x0000, /* R15674 */
+ 0x0000, /* R15675 */
+ 0x0000, /* R15676 */
+ 0x0000, /* R15677 */
+ 0x0000, /* R15678 */
+ 0x0000, /* R15679 */
+ 0x0000, /* R15680 */
+ 0x0000, /* R15681 */
+ 0x0000, /* R15682 */
+ 0x0000, /* R15683 */
+ 0x0000, /* R15684 */
+ 0x0000, /* R15685 */
+ 0x0000, /* R15686 */
+ 0x0000, /* R15687 */
+ 0x0000, /* R15688 */
+ 0x0000, /* R15689 */
+ 0x0000, /* R15690 */
+ 0x0000, /* R15691 */
+ 0x0000, /* R15692 */
+ 0x0000, /* R15693 */
+ 0x0000, /* R15694 */
+ 0x0000, /* R15695 */
+ 0x0000, /* R15696 */
+ 0x0000, /* R15697 */
+ 0x0000, /* R15698 */
+ 0x0000, /* R15699 */
+ 0x0000, /* R15700 */
+ 0x0000, /* R15701 */
+ 0x0000, /* R15702 */
+ 0x0000, /* R15703 */
+ 0x0000, /* R15704 */
+ 0x0000, /* R15705 */
+ 0x0000, /* R15706 */
+ 0x0000, /* R15707 */
+ 0x0000, /* R15708 */
+ 0x0000, /* R15709 */
+ 0x0000, /* R15710 */
+ 0x0000, /* R15711 */
+ 0x0000, /* R15712 */
+ 0x0000, /* R15713 */
+ 0x0000, /* R15714 */
+ 0x0000, /* R15715 */
+ 0x0000, /* R15716 */
+ 0x0000, /* R15717 */
+ 0x0000, /* R15718 */
+ 0x0000, /* R15719 */
+ 0x0000, /* R15720 */
+ 0x0000, /* R15721 */
+ 0x0000, /* R15722 */
+ 0x0000, /* R15723 */
+ 0x0000, /* R15724 */
+ 0x0000, /* R15725 */
+ 0x0000, /* R15726 */
+ 0x0000, /* R15727 */
+ 0x0000, /* R15728 */
+ 0x0000, /* R15729 */
+ 0x0000, /* R15730 */
+ 0x0000, /* R15731 */
+ 0x0000, /* R15732 */
+ 0x0000, /* R15733 */
+ 0x0000, /* R15734 */
+ 0x0000, /* R15735 */
+ 0x0000, /* R15736 */
+ 0x0000, /* R15737 */
+ 0x0000, /* R15738 */
+ 0x0000, /* R15739 */
+ 0x0000, /* R15740 */
+ 0x0000, /* R15741 */
+ 0x0000, /* R15742 */
+ 0x0000, /* R15743 */
+ 0x0000, /* R15744 */
+ 0x0000, /* R15745 */
+ 0x0000, /* R15746 */
+ 0x0000, /* R15747 */
+ 0x0000, /* R15748 */
+ 0x0000, /* R15749 */
+ 0x0000, /* R15750 */
+ 0x0000, /* R15751 */
+ 0x0000, /* R15752 */
+ 0x0000, /* R15753 */
+ 0x0000, /* R15754 */
+ 0x0000, /* R15755 */
+ 0x0000, /* R15756 */
+ 0x0000, /* R15757 */
+ 0x0000, /* R15758 */
+ 0x0000, /* R15759 */
+ 0x0000, /* R15760 */
+ 0x0000, /* R15761 */
+ 0x0000, /* R15762 */
+ 0x0000, /* R15763 */
+ 0x0000, /* R15764 */
+ 0x0000, /* R15765 */
+ 0x0000, /* R15766 */
+ 0x0000, /* R15767 */
+ 0x0000, /* R15768 */
+ 0x0000, /* R15769 */
+ 0x0000, /* R15770 */
+ 0x0000, /* R15771 */
+ 0x0000, /* R15772 */
+ 0x0000, /* R15773 */
+ 0x0000, /* R15774 */
+ 0x0000, /* R15775 */
+ 0x0000, /* R15776 */
+ 0x0000, /* R15777 */
+ 0x0000, /* R15778 */
+ 0x0000, /* R15779 */
+ 0x0000, /* R15780 */
+ 0x0000, /* R15781 */
+ 0x0000, /* R15782 */
+ 0x0000, /* R15783 */
+ 0x0000, /* R15784 */
+ 0x0000, /* R15785 */
+ 0x0000, /* R15786 */
+ 0x0000, /* R15787 */
+ 0x0000, /* R15788 */
+ 0x0000, /* R15789 */
+ 0x0000, /* R15790 */
+ 0x0000, /* R15791 */
+ 0x0000, /* R15792 */
+ 0x0000, /* R15793 */
+ 0x0000, /* R15794 */
+ 0x0000, /* R15795 */
+ 0x0000, /* R15796 */
+ 0x0000, /* R15797 */
+ 0x0000, /* R15798 */
+ 0x0000, /* R15799 */
+ 0x0000, /* R15800 */
+ 0x0000, /* R15801 */
+ 0x0000, /* R15802 */
+ 0x0000, /* R15803 */
+ 0x0000, /* R15804 */
+ 0x0000, /* R15805 */
+ 0x0000, /* R15806 */
+ 0x0000, /* R15807 */
+ 0x0000, /* R15808 */
+ 0x0000, /* R15809 */
+ 0x0000, /* R15810 */
+ 0x0000, /* R15811 */
+ 0x0000, /* R15812 */
+ 0x0000, /* R15813 */
+ 0x0000, /* R15814 */
+ 0x0000, /* R15815 */
+ 0x0000, /* R15816 */
+ 0x0000, /* R15817 */
+ 0x0000, /* R15818 */
+ 0x0000, /* R15819 */
+ 0x0000, /* R15820 */
+ 0x0000, /* R15821 */
+ 0x0000, /* R15822 */
+ 0x0000, /* R15823 */
+ 0x0000, /* R15824 */
+ 0x0000, /* R15825 */
+ 0x0000, /* R15826 */
+ 0x0000, /* R15827 */
+ 0x0000, /* R15828 */
+ 0x0000, /* R15829 */
+ 0x0000, /* R15830 */
+ 0x0000, /* R15831 */
+ 0x0000, /* R15832 */
+ 0x0000, /* R15833 */
+ 0x0000, /* R15834 */
+ 0x0000, /* R15835 */
+ 0x0000, /* R15836 */
+ 0x0000, /* R15837 */
+ 0x0000, /* R15838 */
+ 0x0000, /* R15839 */
+ 0x0000, /* R15840 */
+ 0x0000, /* R15841 */
+ 0x0000, /* R15842 */
+ 0x0000, /* R15843 */
+ 0x0000, /* R15844 */
+ 0x0000, /* R15845 */
+ 0x0000, /* R15846 */
+ 0x0000, /* R15847 */
+ 0x0000, /* R15848 */
+ 0x0000, /* R15849 */
+ 0x0000, /* R15850 */
+ 0x0000, /* R15851 */
+ 0x0000, /* R15852 */
+ 0x0000, /* R15853 */
+ 0x0000, /* R15854 */
+ 0x0000, /* R15855 */
+ 0x0000, /* R15856 */
+ 0x0000, /* R15857 */
+ 0x0000, /* R15858 */
+ 0x0000, /* R15859 */
+ 0x0000, /* R15860 */
+ 0x0000, /* R15861 */
+ 0x0000, /* R15862 */
+ 0x0000, /* R15863 */
+ 0x0000, /* R15864 */
+ 0x0000, /* R15865 */
+ 0x0000, /* R15866 */
+ 0x0000, /* R15867 */
+ 0x0000, /* R15868 */
+ 0x0000, /* R15869 */
+ 0x0000, /* R15870 */
+ 0x0000, /* R15871 */
+ 0x0000, /* R15872 */
+ 0x0000, /* R15873 */
+ 0x0000, /* R15874 */
+ 0x0000, /* R15875 */
+ 0x0000, /* R15876 */
+ 0x0000, /* R15877 */
+ 0x0000, /* R15878 */
+ 0x0000, /* R15879 */
+ 0x0000, /* R15880 */
+ 0x0000, /* R15881 */
+ 0x0000, /* R15882 */
+ 0x0000, /* R15883 */
+ 0x0000, /* R15884 */
+ 0x0000, /* R15885 */
+ 0x0000, /* R15886 */
+ 0x0000, /* R15887 */
+ 0x0000, /* R15888 */
+ 0x0000, /* R15889 */
+ 0x0000, /* R15890 */
+ 0x0000, /* R15891 */
+ 0x0000, /* R15892 */
+ 0x0000, /* R15893 */
+ 0x0000, /* R15894 */
+ 0x0000, /* R15895 */
+ 0x0000, /* R15896 */
+ 0x0000, /* R15897 */
+ 0x0000, /* R15898 */
+ 0x0000, /* R15899 */
+ 0x0000, /* R15900 */
+ 0x0000, /* R15901 */
+ 0x0000, /* R15902 */
+ 0x0000, /* R15903 */
+ 0x0000, /* R15904 */
+ 0x0000, /* R15905 */
+ 0x0000, /* R15906 */
+ 0x0000, /* R15907 */
+ 0x0000, /* R15908 */
+ 0x0000, /* R15909 */
+ 0x0000, /* R15910 */
+ 0x0000, /* R15911 */
+ 0x0000, /* R15912 */
+ 0x0000, /* R15913 */
+ 0x0000, /* R15914 */
+ 0x0000, /* R15915 */
+ 0x0000, /* R15916 */
+ 0x0000, /* R15917 */
+ 0x0000, /* R15918 */
+ 0x0000, /* R15919 */
+ 0x0000, /* R15920 */
+ 0x0000, /* R15921 */
+ 0x0000, /* R15922 */
+ 0x0000, /* R15923 */
+ 0x0000, /* R15924 */
+ 0x0000, /* R15925 */
+ 0x0000, /* R15926 */
+ 0x0000, /* R15927 */
+ 0x0000, /* R15928 */
+ 0x0000, /* R15929 */
+ 0x0000, /* R15930 */
+ 0x0000, /* R15931 */
+ 0x0000, /* R15932 */
+ 0x0000, /* R15933 */
+ 0x0000, /* R15934 */
+ 0x0000, /* R15935 */
+ 0x0000, /* R15936 */
+ 0x0000, /* R15937 */
+ 0x0000, /* R15938 */
+ 0x0000, /* R15939 */
+ 0x0000, /* R15940 */
+ 0x0000, /* R15941 */
+ 0x0000, /* R15942 */
+ 0x0000, /* R15943 */
+ 0x0000, /* R15944 */
+ 0x0000, /* R15945 */
+ 0x0000, /* R15946 */
+ 0x0000, /* R15947 */
+ 0x0000, /* R15948 */
+ 0x0000, /* R15949 */
+ 0x0000, /* R15950 */
+ 0x0000, /* R15951 */
+ 0x0000, /* R15952 */
+ 0x0000, /* R15953 */
+ 0x0000, /* R15954 */
+ 0x0000, /* R15955 */
+ 0x0000, /* R15956 */
+ 0x0000, /* R15957 */
+ 0x0000, /* R15958 */
+ 0x0000, /* R15959 */
+ 0x0000, /* R15960 */
+ 0x0000, /* R15961 */
+ 0x0000, /* R15962 */
+ 0x0000, /* R15963 */
+ 0x0000, /* R15964 */
+ 0x0000, /* R15965 */
+ 0x0000, /* R15966 */
+ 0x0000, /* R15967 */
+ 0x0000, /* R15968 */
+ 0x0000, /* R15969 */
+ 0x0000, /* R15970 */
+ 0x0000, /* R15971 */
+ 0x0000, /* R15972 */
+ 0x0000, /* R15973 */
+ 0x0000, /* R15974 */
+ 0x0000, /* R15975 */
+ 0x0000, /* R15976 */
+ 0x0000, /* R15977 */
+ 0x0000, /* R15978 */
+ 0x0000, /* R15979 */
+ 0x0000, /* R15980 */
+ 0x0000, /* R15981 */
+ 0x0000, /* R15982 */
+ 0x0000, /* R15983 */
+ 0x0000, /* R15984 */
+ 0x0000, /* R15985 */
+ 0x0000, /* R15986 */
+ 0x0000, /* R15987 */
+ 0x0000, /* R15988 */
+ 0x0000, /* R15989 */
+ 0x0000, /* R15990 */
+ 0x0000, /* R15991 */
+ 0x0000, /* R15992 */
+ 0x0000, /* R15993 */
+ 0x0000, /* R15994 */
+ 0x0000, /* R15995 */
+ 0x0000, /* R15996 */
+ 0x0000, /* R15997 */
+ 0x0000, /* R15998 */
+ 0x0000, /* R15999 */
+ 0x0000, /* R16000 */
+ 0x0000, /* R16001 */
+ 0x0000, /* R16002 */
+ 0x0000, /* R16003 */
+ 0x0000, /* R16004 */
+ 0x0000, /* R16005 */
+ 0x0000, /* R16006 */
+ 0x0000, /* R16007 */
+ 0x0000, /* R16008 */
+ 0x0000, /* R16009 */
+ 0x0000, /* R16010 */
+ 0x0000, /* R16011 */
+ 0x0000, /* R16012 */
+ 0x0000, /* R16013 */
+ 0x0000, /* R16014 */
+ 0x0000, /* R16015 */
+ 0x0000, /* R16016 */
+ 0x0000, /* R16017 */
+ 0x0000, /* R16018 */
+ 0x0000, /* R16019 */
+ 0x0000, /* R16020 */
+ 0x0000, /* R16021 */
+ 0x0000, /* R16022 */
+ 0x0000, /* R16023 */
+ 0x0000, /* R16024 */
+ 0x0000, /* R16025 */
+ 0x0000, /* R16026 */
+ 0x0000, /* R16027 */
+ 0x0000, /* R16028 */
+ 0x0000, /* R16029 */
+ 0x0000, /* R16030 */
+ 0x0000, /* R16031 */
+ 0x0000, /* R16032 */
+ 0x0000, /* R16033 */
+ 0x0000, /* R16034 */
+ 0x0000, /* R16035 */
+ 0x0000, /* R16036 */
+ 0x0000, /* R16037 */
+ 0x0000, /* R16038 */
+ 0x0000, /* R16039 */
+ 0x0000, /* R16040 */
+ 0x0000, /* R16041 */
+ 0x0000, /* R16042 */
+ 0x0000, /* R16043 */
+ 0x0000, /* R16044 */
+ 0x0000, /* R16045 */
+ 0x0000, /* R16046 */
+ 0x0000, /* R16047 */
+ 0x0000, /* R16048 */
+ 0x0000, /* R16049 */
+ 0x0000, /* R16050 */
+ 0x0000, /* R16051 */
+ 0x0000, /* R16052 */
+ 0x0000, /* R16053 */
+ 0x0000, /* R16054 */
+ 0x0000, /* R16055 */
+ 0x0000, /* R16056 */
+ 0x0000, /* R16057 */
+ 0x0000, /* R16058 */
+ 0x0000, /* R16059 */
+ 0x0000, /* R16060 */
+ 0x0000, /* R16061 */
+ 0x0000, /* R16062 */
+ 0x0000, /* R16063 */
+ 0x0000, /* R16064 */
+ 0x0000, /* R16065 */
+ 0x0000, /* R16066 */
+ 0x0000, /* R16067 */
+ 0x0000, /* R16068 */
+ 0x0000, /* R16069 */
+ 0x0000, /* R16070 */
+ 0x0000, /* R16071 */
+ 0x0000, /* R16072 */
+ 0x0000, /* R16073 */
+ 0x0000, /* R16074 */
+ 0x0000, /* R16075 */
+ 0x0000, /* R16076 */
+ 0x0000, /* R16077 */
+ 0x0000, /* R16078 */
+ 0x0000, /* R16079 */
+ 0x0000, /* R16080 */
+ 0x0000, /* R16081 */
+ 0x0000, /* R16082 */
+ 0x0000, /* R16083 */
+ 0x0000, /* R16084 */
+ 0x0000, /* R16085 */
+ 0x0000, /* R16086 */
+ 0x0000, /* R16087 */
+ 0x0000, /* R16088 */
+ 0x0000, /* R16089 */
+ 0x0000, /* R16090 */
+ 0x0000, /* R16091 */
+ 0x0000, /* R16092 */
+ 0x0000, /* R16093 */
+ 0x0000, /* R16094 */
+ 0x0000, /* R16095 */
+ 0x0000, /* R16096 */
+ 0x0000, /* R16097 */
+ 0x0000, /* R16098 */
+ 0x0000, /* R16099 */
+ 0x0000, /* R16100 */
+ 0x0000, /* R16101 */
+ 0x0000, /* R16102 */
+ 0x0000, /* R16103 */
+ 0x0000, /* R16104 */
+ 0x0000, /* R16105 */
+ 0x0000, /* R16106 */
+ 0x0000, /* R16107 */
+ 0x0000, /* R16108 */
+ 0x0000, /* R16109 */
+ 0x0000, /* R16110 */
+ 0x0000, /* R16111 */
+ 0x0000, /* R16112 */
+ 0x0000, /* R16113 */
+ 0x0000, /* R16114 */
+ 0x0000, /* R16115 */
+ 0x0000, /* R16116 */
+ 0x0000, /* R16117 */
+ 0x0000, /* R16118 */
+ 0x0000, /* R16119 */
+ 0x0000, /* R16120 */
+ 0x0000, /* R16121 */
+ 0x0000, /* R16122 */
+ 0x0000, /* R16123 */
+ 0x0000, /* R16124 */
+ 0x0000, /* R16125 */
+ 0x0000, /* R16126 */
+ 0x0000, /* R16127 */
+ 0x0000, /* R16128 */
+ 0x0000, /* R16129 */
+ 0x0000, /* R16130 */
+ 0x0000, /* R16131 */
+ 0x0000, /* R16132 */
+ 0x0000, /* R16133 */
+ 0x0000, /* R16134 */
+ 0x0000, /* R16135 */
+ 0x0000, /* R16136 */
+ 0x0000, /* R16137 */
+ 0x0000, /* R16138 */
+ 0x0000, /* R16139 */
+ 0x0000, /* R16140 */
+ 0x0000, /* R16141 */
+ 0x0000, /* R16142 */
+ 0x0000, /* R16143 */
+ 0x0000, /* R16144 */
+ 0x0000, /* R16145 */
+ 0x0000, /* R16146 */
+ 0x0000, /* R16147 */
+ 0x0000, /* R16148 */
+ 0x0000, /* R16149 */
+ 0x0000, /* R16150 */
+ 0x0000, /* R16151 */
+ 0x0000, /* R16152 */
+ 0x0000, /* R16153 */
+ 0x0000, /* R16154 */
+ 0x0000, /* R16155 */
+ 0x0000, /* R16156 */
+ 0x0000, /* R16157 */
+ 0x0000, /* R16158 */
+ 0x0000, /* R16159 */
+ 0x0000, /* R16160 */
+ 0x0000, /* R16161 */
+ 0x0000, /* R16162 */
+ 0x0000, /* R16163 */
+ 0x0000, /* R16164 */
+ 0x0000, /* R16165 */
+ 0x0000, /* R16166 */
+ 0x0000, /* R16167 */
+ 0x0000, /* R16168 */
+ 0x0000, /* R16169 */
+ 0x0000, /* R16170 */
+ 0x0000, /* R16171 */
+ 0x0000, /* R16172 */
+ 0x0000, /* R16173 */
+ 0x0000, /* R16174 */
+ 0x0000, /* R16175 */
+ 0x0000, /* R16176 */
+ 0x0000, /* R16177 */
+ 0x0000, /* R16178 */
+ 0x0000, /* R16179 */
+ 0x0000, /* R16180 */
+ 0x0000, /* R16181 */
+ 0x0000, /* R16182 */
+ 0x0000, /* R16183 */
+ 0x0000, /* R16184 */
+ 0x0000, /* R16185 */
+ 0x0000, /* R16186 */
+ 0x0000, /* R16187 */
+ 0x0000, /* R16188 */
+ 0x0000, /* R16189 */
+ 0x0000, /* R16190 */
+ 0x0000, /* R16191 */
+ 0x0000, /* R16192 */
+ 0x0000, /* R16193 */
+ 0x0000, /* R16194 */
+ 0x0000, /* R16195 */
+ 0x0000, /* R16196 */
+ 0x0000, /* R16197 */
+ 0x0000, /* R16198 */
+ 0x0000, /* R16199 */
+ 0x0000, /* R16200 */
+ 0x0000, /* R16201 */
+ 0x0000, /* R16202 */
+ 0x0000, /* R16203 */
+ 0x0000, /* R16204 */
+ 0x0000, /* R16205 */
+ 0x0000, /* R16206 */
+ 0x0000, /* R16207 */
+ 0x0000, /* R16208 */
+ 0x0000, /* R16209 */
+ 0x0000, /* R16210 */
+ 0x0000, /* R16211 */
+ 0x0000, /* R16212 */
+ 0x0000, /* R16213 */
+ 0x0000, /* R16214 */
+ 0x0000, /* R16215 */
+ 0x0000, /* R16216 */
+ 0x0000, /* R16217 */
+ 0x0000, /* R16218 */
+ 0x0000, /* R16219 */
+ 0x0000, /* R16220 */
+ 0x0000, /* R16221 */
+ 0x0000, /* R16222 */
+ 0x0000, /* R16223 */
+ 0x0000, /* R16224 */
+ 0x0000, /* R16225 */
+ 0x0000, /* R16226 */
+ 0x0000, /* R16227 */
+ 0x0000, /* R16228 */
+ 0x0000, /* R16229 */
+ 0x0000, /* R16230 */
+ 0x0000, /* R16231 */
+ 0x0000, /* R16232 */
+ 0x0000, /* R16233 */
+ 0x0000, /* R16234 */
+ 0x0000, /* R16235 */
+ 0x0000, /* R16236 */
+ 0x0000, /* R16237 */
+ 0x0000, /* R16238 */
+ 0x0000, /* R16239 */
+ 0x0000, /* R16240 */
+ 0x0000, /* R16241 */
+ 0x0000, /* R16242 */
+ 0x0000, /* R16243 */
+ 0x0000, /* R16244 */
+ 0x0000, /* R16245 */
+ 0x0000, /* R16246 */
+ 0x0000, /* R16247 */
+ 0x0000, /* R16248 */
+ 0x0000, /* R16249 */
+ 0x0000, /* R16250 */
+ 0x0000, /* R16251 */
+ 0x0000, /* R16252 */
+ 0x0000, /* R16253 */
+ 0x0000, /* R16254 */
+ 0x0000, /* R16255 */
+ 0x0000, /* R16256 */
+ 0x0000, /* R16257 */
+ 0x0000, /* R16258 */
+ 0x0000, /* R16259 */
+ 0x0000, /* R16260 */
+ 0x0000, /* R16261 */
+ 0x0000, /* R16262 */
+ 0x0000, /* R16263 */
+ 0x0000, /* R16264 */
+ 0x0000, /* R16265 */
+ 0x0000, /* R16266 */
+ 0x0000, /* R16267 */
+ 0x0000, /* R16268 */
+ 0x0000, /* R16269 */
+ 0x0000, /* R16270 */
+ 0x0000, /* R16271 */
+ 0x0000, /* R16272 */
+ 0x0000, /* R16273 */
+ 0x0000, /* R16274 */
+ 0x0000, /* R16275 */
+ 0x0000, /* R16276 */
+ 0x0000, /* R16277 */
+ 0x0000, /* R16278 */
+ 0x0000, /* R16279 */
+ 0x0000, /* R16280 */
+ 0x0000, /* R16281 */
+ 0x0000, /* R16282 */
+ 0x0000, /* R16283 */
+ 0x0000, /* R16284 */
+ 0x0000, /* R16285 */
+ 0x0000, /* R16286 */
+ 0x0000, /* R16287 */
+ 0x0000, /* R16288 */
+ 0x0000, /* R16289 */
+ 0x0000, /* R16290 */
+ 0x0000, /* R16291 */
+ 0x0000, /* R16292 */
+ 0x0000, /* R16293 */
+ 0x0000, /* R16294 */
+ 0x0000, /* R16295 */
+ 0x0000, /* R16296 */
+ 0x0000, /* R16297 */
+ 0x0000, /* R16298 */
+ 0x0000, /* R16299 */
+ 0x0000, /* R16300 */
+ 0x0000, /* R16301 */
+ 0x0000, /* R16302 */
+ 0x0000, /* R16303 */
+ 0x0000, /* R16304 */
+ 0x0000, /* R16305 */
+ 0x0000, /* R16306 */
+ 0x0000, /* R16307 */
+ 0x0000, /* R16308 */
+ 0x0000, /* R16309 */
+ 0x0000, /* R16310 */
+ 0x0000, /* R16311 */
+ 0x0000, /* R16312 */
+ 0x0000, /* R16313 */
+ 0x0000, /* R16314 */
+ 0x0000, /* R16315 */
+ 0x0000, /* R16316 */
+ 0x0000, /* R16317 */
+ 0x0000, /* R16318 */
+ 0x0000, /* R16319 */
+ 0x0000, /* R16320 */
+ 0x0000, /* R16321 */
+ 0x0000, /* R16322 */
+ 0x0000, /* R16323 */
+ 0x0000, /* R16324 */
+ 0x0000, /* R16325 */
+ 0x0000, /* R16326 */
+ 0x0000, /* R16327 */
+ 0x0000, /* R16328 */
+ 0x0000, /* R16329 */
+ 0x0000, /* R16330 */
+ 0x0000, /* R16331 */
+ 0x0000, /* R16332 */
+ 0x0000, /* R16333 */
+ 0x0000, /* R16334 */
+ 0x0000, /* R16335 */
+ 0x0000, /* R16336 */
+ 0x0000, /* R16337 */
+ 0x0000, /* R16338 */
+ 0x0000, /* R16339 */
+ 0x0000, /* R16340 */
+ 0x0000, /* R16341 */
+ 0x0000, /* R16342 */
+ 0x0000, /* R16343 */
+ 0x0000, /* R16344 */
+ 0x0000, /* R16345 */
+ 0x0000, /* R16346 */
+ 0x0000, /* R16347 */
+ 0x0000, /* R16348 */
+ 0x0000, /* R16349 */
+ 0x0000, /* R16350 */
+ 0x0000, /* R16351 */
+ 0x0000, /* R16352 */
+ 0x0000, /* R16353 */
+ 0x0000, /* R16354 */
+ 0x0000, /* R16355 */
+ 0x0000, /* R16356 */
+ 0x0000, /* R16357 */
+ 0x0000, /* R16358 */
+ 0x0000, /* R16359 */
+ 0x0000, /* R16360 */
+ 0x0000, /* R16361 */
+ 0x0000, /* R16362 */
+ 0x0000, /* R16363 */
+ 0x0000, /* R16364 */
+ 0x0000, /* R16365 */
+ 0x0000, /* R16366 */
+ 0x0000, /* R16367 */
+ 0x0000, /* R16368 */
+ 0x0000, /* R16369 */
+ 0x0000, /* R16370 */
+ 0x0000, /* R16371 */
+ 0x0000, /* R16372 */
+ 0x0000, /* R16373 */
+ 0x0000, /* R16374 */
+ 0x0000, /* R16375 */
+ 0x0000, /* R16376 */
+ 0x0000, /* R16377 */
+ 0x0000, /* R16378 */
+ 0x0000, /* R16379 */
+ 0x0000, /* R16380 */
+ 0x0000, /* R16381 */
+ 0x0000, /* R16382 */
+ 0x0000, /* R16383 */
+ 0x0000, /* R16384 - RETUNEADC_SHARED_COEFF_1 */
+ 0x0000, /* R16385 - RETUNEADC_SHARED_COEFF_0 */
+ 0x0000, /* R16386 - RETUNEDAC_SHARED_COEFF_1 */
+ 0x0000, /* R16387 - RETUNEDAC_SHARED_COEFF_0 */
+ 0x0000, /* R16388 - SOUNDSTAGE_ENABLES_1 */
+ 0x0000, /* R16389 - SOUNDSTAGE_ENABLES_0 */
+ 0x0000, /* R16390 */
+ 0x0000, /* R16391 */
+ 0x0000, /* R16392 */
+ 0x0000, /* R16393 */
+ 0x0000, /* R16394 */
+ 0x0000, /* R16395 */
+ 0x0000, /* R16396 */
+ 0x0000, /* R16397 */
+ 0x0000, /* R16398 */
+ 0x0000, /* R16399 */
+ 0x0000, /* R16400 */
+ 0x0000, /* R16401 */
+ 0x0000, /* R16402 */
+ 0x0000, /* R16403 */
+ 0x0000, /* R16404 */
+ 0x0000, /* R16405 */
+ 0x0000, /* R16406 */
+ 0x0000, /* R16407 */
+ 0x0000, /* R16408 */
+ 0x0000, /* R16409 */
+ 0x0000, /* R16410 */
+ 0x0000, /* R16411 */
+ 0x0000, /* R16412 */
+ 0x0000, /* R16413 */
+ 0x0000, /* R16414 */
+ 0x0000, /* R16415 */
+ 0x0000, /* R16416 */
+ 0x0000, /* R16417 */
+ 0x0000, /* R16418 */
+ 0x0000, /* R16419 */
+ 0x0000, /* R16420 */
+ 0x0000, /* R16421 */
+ 0x0000, /* R16422 */
+ 0x0000, /* R16423 */
+ 0x0000, /* R16424 */
+ 0x0000, /* R16425 */
+ 0x0000, /* R16426 */
+ 0x0000, /* R16427 */
+ 0x0000, /* R16428 */
+ 0x0000, /* R16429 */
+ 0x0000, /* R16430 */
+ 0x0000, /* R16431 */
+ 0x0000, /* R16432 */
+ 0x0000, /* R16433 */
+ 0x0000, /* R16434 */
+ 0x0000, /* R16435 */
+ 0x0000, /* R16436 */
+ 0x0000, /* R16437 */
+ 0x0000, /* R16438 */
+ 0x0000, /* R16439 */
+ 0x0000, /* R16440 */
+ 0x0000, /* R16441 */
+ 0x0000, /* R16442 */
+ 0x0000, /* R16443 */
+ 0x0000, /* R16444 */
+ 0x0000, /* R16445 */
+ 0x0000, /* R16446 */
+ 0x0000, /* R16447 */
+ 0x0000, /* R16448 */
+ 0x0000, /* R16449 */
+ 0x0000, /* R16450 */
+ 0x0000, /* R16451 */
+ 0x0000, /* R16452 */
+ 0x0000, /* R16453 */
+ 0x0000, /* R16454 */
+ 0x0000, /* R16455 */
+ 0x0000, /* R16456 */
+ 0x0000, /* R16457 */
+ 0x0000, /* R16458 */
+ 0x0000, /* R16459 */
+ 0x0000, /* R16460 */
+ 0x0000, /* R16461 */
+ 0x0000, /* R16462 */
+ 0x0000, /* R16463 */
+ 0x0000, /* R16464 */
+ 0x0000, /* R16465 */
+ 0x0000, /* R16466 */
+ 0x0000, /* R16467 */
+ 0x0000, /* R16468 */
+ 0x0000, /* R16469 */
+ 0x0000, /* R16470 */
+ 0x0000, /* R16471 */
+ 0x0000, /* R16472 */
+ 0x0000, /* R16473 */
+ 0x0000, /* R16474 */
+ 0x0000, /* R16475 */
+ 0x0000, /* R16476 */
+ 0x0000, /* R16477 */
+ 0x0000, /* R16478 */
+ 0x0000, /* R16479 */
+ 0x0000, /* R16480 */
+ 0x0000, /* R16481 */
+ 0x0000, /* R16482 */
+ 0x0000, /* R16483 */
+ 0x0000, /* R16484 */
+ 0x0000, /* R16485 */
+ 0x0000, /* R16486 */
+ 0x0000, /* R16487 */
+ 0x0000, /* R16488 */
+ 0x0000, /* R16489 */
+ 0x0000, /* R16490 */
+ 0x0000, /* R16491 */
+ 0x0000, /* R16492 */
+ 0x0000, /* R16493 */
+ 0x0000, /* R16494 */
+ 0x0000, /* R16495 */
+ 0x0000, /* R16496 */
+ 0x0000, /* R16497 */
+ 0x0000, /* R16498 */
+ 0x0000, /* R16499 */
+ 0x0000, /* R16500 */
+ 0x0000, /* R16501 */
+ 0x0000, /* R16502 */
+ 0x0000, /* R16503 */
+ 0x0000, /* R16504 */
+ 0x0000, /* R16505 */
+ 0x0000, /* R16506 */
+ 0x0000, /* R16507 */
+ 0x0000, /* R16508 */
+ 0x0000, /* R16509 */
+ 0x0000, /* R16510 */
+ 0x0000, /* R16511 */
+ 0x0000, /* R16512 */
+ 0x0000, /* R16513 */
+ 0x0000, /* R16514 */
+ 0x0000, /* R16515 */
+ 0x0000, /* R16516 */
+ 0x0000, /* R16517 */
+ 0x0000, /* R16518 */
+ 0x0000, /* R16519 */
+ 0x0000, /* R16520 */
+ 0x0000, /* R16521 */
+ 0x0000, /* R16522 */
+ 0x0000, /* R16523 */
+ 0x0000, /* R16524 */
+ 0x0000, /* R16525 */
+ 0x0000, /* R16526 */
+ 0x0000, /* R16527 */
+ 0x0000, /* R16528 */
+ 0x0000, /* R16529 */
+ 0x0000, /* R16530 */
+ 0x0000, /* R16531 */
+ 0x0000, /* R16532 */
+ 0x0000, /* R16533 */
+ 0x0000, /* R16534 */
+ 0x0000, /* R16535 */
+ 0x0000, /* R16536 */
+ 0x0000, /* R16537 */
+ 0x0000, /* R16538 */
+ 0x0000, /* R16539 */
+ 0x0000, /* R16540 */
+ 0x0000, /* R16541 */
+ 0x0000, /* R16542 */
+ 0x0000, /* R16543 */
+ 0x0000, /* R16544 */
+ 0x0000, /* R16545 */
+ 0x0000, /* R16546 */
+ 0x0000, /* R16547 */
+ 0x0000, /* R16548 */
+ 0x0000, /* R16549 */
+ 0x0000, /* R16550 */
+ 0x0000, /* R16551 */
+ 0x0000, /* R16552 */
+ 0x0000, /* R16553 */
+ 0x0000, /* R16554 */
+ 0x0000, /* R16555 */
+ 0x0000, /* R16556 */
+ 0x0000, /* R16557 */
+ 0x0000, /* R16558 */
+ 0x0000, /* R16559 */
+ 0x0000, /* R16560 */
+ 0x0000, /* R16561 */
+ 0x0000, /* R16562 */
+ 0x0000, /* R16563 */
+ 0x0000, /* R16564 */
+ 0x0000, /* R16565 */
+ 0x0000, /* R16566 */
+ 0x0000, /* R16567 */
+ 0x0000, /* R16568 */
+ 0x0000, /* R16569 */
+ 0x0000, /* R16570 */
+ 0x0000, /* R16571 */
+ 0x0000, /* R16572 */
+ 0x0000, /* R16573 */
+ 0x0000, /* R16574 */
+ 0x0000, /* R16575 */
+ 0x0000, /* R16576 */
+ 0x0000, /* R16577 */
+ 0x0000, /* R16578 */
+ 0x0000, /* R16579 */
+ 0x0000, /* R16580 */
+ 0x0000, /* R16581 */
+ 0x0000, /* R16582 */
+ 0x0000, /* R16583 */
+ 0x0000, /* R16584 */
+ 0x0000, /* R16585 */
+ 0x0000, /* R16586 */
+ 0x0000, /* R16587 */
+ 0x0000, /* R16588 */
+ 0x0000, /* R16589 */
+ 0x0000, /* R16590 */
+ 0x0000, /* R16591 */
+ 0x0000, /* R16592 */
+ 0x0000, /* R16593 */
+ 0x0000, /* R16594 */
+ 0x0000, /* R16595 */
+ 0x0000, /* R16596 */
+ 0x0000, /* R16597 */
+ 0x0000, /* R16598 */
+ 0x0000, /* R16599 */
+ 0x0000, /* R16600 */
+ 0x0000, /* R16601 */
+ 0x0000, /* R16602 */
+ 0x0000, /* R16603 */
+ 0x0000, /* R16604 */
+ 0x0000, /* R16605 */
+ 0x0000, /* R16606 */
+ 0x0000, /* R16607 */
+ 0x0000, /* R16608 */
+ 0x0000, /* R16609 */
+ 0x0000, /* R16610 */
+ 0x0000, /* R16611 */
+ 0x0000, /* R16612 */
+ 0x0000, /* R16613 */
+ 0x0000, /* R16614 */
+ 0x0000, /* R16615 */
+ 0x0000, /* R16616 */
+ 0x0000, /* R16617 */
+ 0x0000, /* R16618 */
+ 0x0000, /* R16619 */
+ 0x0000, /* R16620 */
+ 0x0000, /* R16621 */
+ 0x0000, /* R16622 */
+ 0x0000, /* R16623 */
+ 0x0000, /* R16624 */
+ 0x0000, /* R16625 */
+ 0x0000, /* R16626 */
+ 0x0000, /* R16627 */
+ 0x0000, /* R16628 */
+ 0x0000, /* R16629 */
+ 0x0000, /* R16630 */
+ 0x0000, /* R16631 */
+ 0x0000, /* R16632 */
+ 0x0000, /* R16633 */
+ 0x0000, /* R16634 */
+ 0x0000, /* R16635 */
+ 0x0000, /* R16636 */
+ 0x0000, /* R16637 */
+ 0x0000, /* R16638 */
+ 0x0000, /* R16639 */
+ 0x0000, /* R16640 */
+ 0x0000, /* R16641 */
+ 0x0000, /* R16642 */
+ 0x0000, /* R16643 */
+ 0x0000, /* R16644 */
+ 0x0000, /* R16645 */
+ 0x0000, /* R16646 */
+ 0x0000, /* R16647 */
+ 0x0000, /* R16648 */
+ 0x0000, /* R16649 */
+ 0x0000, /* R16650 */
+ 0x0000, /* R16651 */
+ 0x0000, /* R16652 */
+ 0x0000, /* R16653 */
+ 0x0000, /* R16654 */
+ 0x0000, /* R16655 */
+ 0x0000, /* R16656 */
+ 0x0000, /* R16657 */
+ 0x0000, /* R16658 */
+ 0x0000, /* R16659 */
+ 0x0000, /* R16660 */
+ 0x0000, /* R16661 */
+ 0x0000, /* R16662 */
+ 0x0000, /* R16663 */
+ 0x0000, /* R16664 */
+ 0x0000, /* R16665 */
+ 0x0000, /* R16666 */
+ 0x0000, /* R16667 */
+ 0x0000, /* R16668 */
+ 0x0000, /* R16669 */
+ 0x0000, /* R16670 */
+ 0x0000, /* R16671 */
+ 0x0000, /* R16672 */
+ 0x0000, /* R16673 */
+ 0x0000, /* R16674 */
+ 0x0000, /* R16675 */
+ 0x0000, /* R16676 */
+ 0x0000, /* R16677 */
+ 0x0000, /* R16678 */
+ 0x0000, /* R16679 */
+ 0x0000, /* R16680 */
+ 0x0000, /* R16681 */
+ 0x0000, /* R16682 */
+ 0x0000, /* R16683 */
+ 0x0000, /* R16684 */
+ 0x0000, /* R16685 */
+ 0x0000, /* R16686 */
+ 0x0000, /* R16687 */
+ 0x0000, /* R16688 */
+ 0x0000, /* R16689 */
+ 0x0000, /* R16690 */
+ 0x0000, /* R16691 */
+ 0x0000, /* R16692 */
+ 0x0000, /* R16693 */
+ 0x0000, /* R16694 */
+ 0x0000, /* R16695 */
+ 0x0000, /* R16696 */
+ 0x0000, /* R16697 */
+ 0x0000, /* R16698 */
+ 0x0000, /* R16699 */
+ 0x0000, /* R16700 */
+ 0x0000, /* R16701 */
+ 0x0000, /* R16702 */
+ 0x0000, /* R16703 */
+ 0x0000, /* R16704 */
+ 0x0000, /* R16705 */
+ 0x0000, /* R16706 */
+ 0x0000, /* R16707 */
+ 0x0000, /* R16708 */
+ 0x0000, /* R16709 */
+ 0x0000, /* R16710 */
+ 0x0000, /* R16711 */
+ 0x0000, /* R16712 */
+ 0x0000, /* R16713 */
+ 0x0000, /* R16714 */
+ 0x0000, /* R16715 */
+ 0x0000, /* R16716 */
+ 0x0000, /* R16717 */
+ 0x0000, /* R16718 */
+ 0x0000, /* R16719 */
+ 0x0000, /* R16720 */
+ 0x0000, /* R16721 */
+ 0x0000, /* R16722 */
+ 0x0000, /* R16723 */
+ 0x0000, /* R16724 */
+ 0x0000, /* R16725 */
+ 0x0000, /* R16726 */
+ 0x0000, /* R16727 */
+ 0x0000, /* R16728 */
+ 0x0000, /* R16729 */
+ 0x0000, /* R16730 */
+ 0x0000, /* R16731 */
+ 0x0000, /* R16732 */
+ 0x0000, /* R16733 */
+ 0x0000, /* R16734 */
+ 0x0000, /* R16735 */
+ 0x0000, /* R16736 */
+ 0x0000, /* R16737 */
+ 0x0000, /* R16738 */
+ 0x0000, /* R16739 */
+ 0x0000, /* R16740 */
+ 0x0000, /* R16741 */
+ 0x0000, /* R16742 */
+ 0x0000, /* R16743 */
+ 0x0000, /* R16744 */
+ 0x0000, /* R16745 */
+ 0x0000, /* R16746 */
+ 0x0000, /* R16747 */
+ 0x0000, /* R16748 */
+ 0x0000, /* R16749 */
+ 0x0000, /* R16750 */
+ 0x0000, /* R16751 */
+ 0x0000, /* R16752 */
+ 0x0000, /* R16753 */
+ 0x0000, /* R16754 */
+ 0x0000, /* R16755 */
+ 0x0000, /* R16756 */
+ 0x0000, /* R16757 */
+ 0x0000, /* R16758 */
+ 0x0000, /* R16759 */
+ 0x0000, /* R16760 */
+ 0x0000, /* R16761 */
+ 0x0000, /* R16762 */
+ 0x0000, /* R16763 */
+ 0x0000, /* R16764 */
+ 0x0000, /* R16765 */
+ 0x0000, /* R16766 */
+ 0x0000, /* R16767 */
+ 0x0000, /* R16768 */
+ 0x0000, /* R16769 */
+ 0x0000, /* R16770 */
+ 0x0000, /* R16771 */
+ 0x0000, /* R16772 */
+ 0x0000, /* R16773 */
+ 0x0000, /* R16774 */
+ 0x0000, /* R16775 */
+ 0x0000, /* R16776 */
+ 0x0000, /* R16777 */
+ 0x0000, /* R16778 */
+ 0x0000, /* R16779 */
+ 0x0000, /* R16780 */
+ 0x0000, /* R16781 */
+ 0x0000, /* R16782 */
+ 0x0000, /* R16783 */
+ 0x0000, /* R16784 */
+ 0x0000, /* R16785 */
+ 0x0000, /* R16786 */
+ 0x0000, /* R16787 */
+ 0x0000, /* R16788 */
+ 0x0000, /* R16789 */
+ 0x0000, /* R16790 */
+ 0x0000, /* R16791 */
+ 0x0000, /* R16792 */
+ 0x0000, /* R16793 */
+ 0x0000, /* R16794 */
+ 0x0000, /* R16795 */
+ 0x0000, /* R16796 */
+ 0x0000, /* R16797 */
+ 0x0000, /* R16798 */
+ 0x0000, /* R16799 */
+ 0x0000, /* R16800 */
+ 0x0000, /* R16801 */
+ 0x0000, /* R16802 */
+ 0x0000, /* R16803 */
+ 0x0000, /* R16804 */
+ 0x0000, /* R16805 */
+ 0x0000, /* R16806 */
+ 0x0000, /* R16807 */
+ 0x0000, /* R16808 */
+ 0x0000, /* R16809 */
+ 0x0000, /* R16810 */
+ 0x0000, /* R16811 */
+ 0x0000, /* R16812 */
+ 0x0000, /* R16813 */
+ 0x0000, /* R16814 */
+ 0x0000, /* R16815 */
+ 0x0000, /* R16816 */
+ 0x0000, /* R16817 */
+ 0x0000, /* R16818 */
+ 0x0000, /* R16819 */
+ 0x0000, /* R16820 */
+ 0x0000, /* R16821 */
+ 0x0000, /* R16822 */
+ 0x0000, /* R16823 */
+ 0x0000, /* R16824 */
+ 0x0000, /* R16825 */
+ 0x0000, /* R16826 */
+ 0x0000, /* R16827 */
+ 0x0000, /* R16828 */
+ 0x0000, /* R16829 */
+ 0x0000, /* R16830 */
+ 0x0000, /* R16831 */
+ 0x0000, /* R16832 */
+ 0x0000, /* R16833 */
+ 0x0000, /* R16834 */
+ 0x0000, /* R16835 */
+ 0x0000, /* R16836 */
+ 0x0000, /* R16837 */
+ 0x0000, /* R16838 */
+ 0x0000, /* R16839 */
+ 0x0000, /* R16840 */
+ 0x0000, /* R16841 */
+ 0x0000, /* R16842 */
+ 0x0000, /* R16843 */
+ 0x0000, /* R16844 */
+ 0x0000, /* R16845 */
+ 0x0000, /* R16846 */
+ 0x0000, /* R16847 */
+ 0x0000, /* R16848 */
+ 0x0000, /* R16849 */
+ 0x0000, /* R16850 */
+ 0x0000, /* R16851 */
+ 0x0000, /* R16852 */
+ 0x0000, /* R16853 */
+ 0x0000, /* R16854 */
+ 0x0000, /* R16855 */
+ 0x0000, /* R16856 */
+ 0x0000, /* R16857 */
+ 0x0000, /* R16858 */
+ 0x0000, /* R16859 */
+ 0x0000, /* R16860 */
+ 0x0000, /* R16861 */
+ 0x0000, /* R16862 */
+ 0x0000, /* R16863 */
+ 0x0000, /* R16864 */
+ 0x0000, /* R16865 */
+ 0x0000, /* R16866 */
+ 0x0000, /* R16867 */
+ 0x0000, /* R16868 */
+ 0x0000, /* R16869 */
+ 0x0000, /* R16870 */
+ 0x0000, /* R16871 */
+ 0x0000, /* R16872 */
+ 0x0000, /* R16873 */
+ 0x0000, /* R16874 */
+ 0x0000, /* R16875 */
+ 0x0000, /* R16876 */
+ 0x0000, /* R16877 */
+ 0x0000, /* R16878 */
+ 0x0000, /* R16879 */
+ 0x0000, /* R16880 */
+ 0x0000, /* R16881 */
+ 0x0000, /* R16882 */
+ 0x0000, /* R16883 */
+ 0x0000, /* R16884 */
+ 0x0000, /* R16885 */
+ 0x0000, /* R16886 */
+ 0x0000, /* R16887 */
+ 0x0000, /* R16888 */
+ 0x0000, /* R16889 */
+ 0x0000, /* R16890 */
+ 0x0000, /* R16891 */
+ 0x0000, /* R16892 */
+ 0x0000, /* R16893 */
+ 0x0000, /* R16894 */
+ 0x0000, /* R16895 */
+ 0x0002, /* R16896 - HDBASS_AI_1 */
+ 0xBD12, /* R16897 - HDBASS_AI_0 */
+ 0x007C, /* R16898 - HDBASS_AR_1 */
+ 0x586C, /* R16899 - HDBASS_AR_0 */
+ 0x0053, /* R16900 - HDBASS_B_1 */
+ 0x8121, /* R16901 - HDBASS_B_0 */
+ 0x003F, /* R16902 - HDBASS_K_1 */
+ 0x8BD8, /* R16903 - HDBASS_K_0 */
+ 0x0032, /* R16904 - HDBASS_N1_1 */
+ 0xF52D, /* R16905 - HDBASS_N1_0 */
+ 0x0065, /* R16906 - HDBASS_N2_1 */
+ 0xAC8C, /* R16907 - HDBASS_N2_0 */
+ 0x006B, /* R16908 - HDBASS_N3_1 */
+ 0xE087, /* R16909 - HDBASS_N3_0 */
+ 0x0072, /* R16910 - HDBASS_N4_1 */
+ 0x1483, /* R16911 - HDBASS_N4_0 */
+ 0x0072, /* R16912 - HDBASS_N5_1 */
+ 0x1483, /* R16913 - HDBASS_N5_0 */
+ 0x0043, /* R16914 - HDBASS_X1_1 */
+ 0x3525, /* R16915 - HDBASS_X1_0 */
+ 0x0006, /* R16916 - HDBASS_X2_1 */
+ 0x6A4A, /* R16917 - HDBASS_X2_0 */
+ 0x0043, /* R16918 - HDBASS_X3_1 */
+ 0x6079, /* R16919 - HDBASS_X3_0 */
+ 0x0008, /* R16920 - HDBASS_ATK_1 */
+ 0x0000, /* R16921 - HDBASS_ATK_0 */
+ 0x0001, /* R16922 - HDBASS_DCY_1 */
+ 0x0000, /* R16923 - HDBASS_DCY_0 */
+ 0x0059, /* R16924 - HDBASS_PG_1 */
+ 0x999A, /* R16925 - HDBASS_PG_0 */
+ 0x0000, /* R16926 */
+ 0x0000, /* R16927 */
+ 0x0000, /* R16928 */
+ 0x0000, /* R16929 */
+ 0x0000, /* R16930 */
+ 0x0000, /* R16931 */
+ 0x0000, /* R16932 */
+ 0x0000, /* R16933 */
+ 0x0000, /* R16934 */
+ 0x0000, /* R16935 */
+ 0x0000, /* R16936 */
+ 0x0000, /* R16937 */
+ 0x0000, /* R16938 */
+ 0x0000, /* R16939 */
+ 0x0000, /* R16940 */
+ 0x0000, /* R16941 */
+ 0x0000, /* R16942 */
+ 0x0000, /* R16943 */
+ 0x0000, /* R16944 */
+ 0x0000, /* R16945 */
+ 0x0000, /* R16946 */
+ 0x0000, /* R16947 */
+ 0x0000, /* R16948 */
+ 0x0000, /* R16949 */
+ 0x0000, /* R16950 */
+ 0x0000, /* R16951 */
+ 0x0000, /* R16952 */
+ 0x0000, /* R16953 */
+ 0x0000, /* R16954 */
+ 0x0000, /* R16955 */
+ 0x0000, /* R16956 */
+ 0x0000, /* R16957 */
+ 0x0000, /* R16958 */
+ 0x0000, /* R16959 */
+ 0x0000, /* R16960 */
+ 0x0000, /* R16961 */
+ 0x0000, /* R16962 */
+ 0x0000, /* R16963 */
+ 0x0000, /* R16964 */
+ 0x0000, /* R16965 */
+ 0x0000, /* R16966 */
+ 0x0000, /* R16967 */
+ 0x0000, /* R16968 */
+ 0x0000, /* R16969 */
+ 0x0000, /* R16970 */
+ 0x0000, /* R16971 */
+ 0x0000, /* R16972 */
+ 0x0000, /* R16973 */
+ 0x0000, /* R16974 */
+ 0x0000, /* R16975 */
+ 0x0000, /* R16976 */
+ 0x0000, /* R16977 */
+ 0x0000, /* R16978 */
+ 0x0000, /* R16979 */
+ 0x0000, /* R16980 */
+ 0x0000, /* R16981 */
+ 0x0000, /* R16982 */
+ 0x0000, /* R16983 */
+ 0x0000, /* R16984 */
+ 0x0000, /* R16985 */
+ 0x0000, /* R16986 */
+ 0x0000, /* R16987 */
+ 0x0000, /* R16988 */
+ 0x0000, /* R16989 */
+ 0x0000, /* R16990 */
+ 0x0000, /* R16991 */
+ 0x0000, /* R16992 */
+ 0x0000, /* R16993 */
+ 0x0000, /* R16994 */
+ 0x0000, /* R16995 */
+ 0x0000, /* R16996 */
+ 0x0000, /* R16997 */
+ 0x0000, /* R16998 */
+ 0x0000, /* R16999 */
+ 0x0000, /* R17000 */
+ 0x0000, /* R17001 */
+ 0x0000, /* R17002 */
+ 0x0000, /* R17003 */
+ 0x0000, /* R17004 */
+ 0x0000, /* R17005 */
+ 0x0000, /* R17006 */
+ 0x0000, /* R17007 */
+ 0x0000, /* R17008 */
+ 0x0000, /* R17009 */
+ 0x0000, /* R17010 */
+ 0x0000, /* R17011 */
+ 0x0000, /* R17012 */
+ 0x0000, /* R17013 */
+ 0x0000, /* R17014 */
+ 0x0000, /* R17015 */
+ 0x0000, /* R17016 */
+ 0x0000, /* R17017 */
+ 0x0000, /* R17018 */
+ 0x0000, /* R17019 */
+ 0x0000, /* R17020 */
+ 0x0000, /* R17021 */
+ 0x0000, /* R17022 */
+ 0x0000, /* R17023 */
+ 0x0000, /* R17024 */
+ 0x0000, /* R17025 */
+ 0x0000, /* R17026 */
+ 0x0000, /* R17027 */
+ 0x0000, /* R17028 */
+ 0x0000, /* R17029 */
+ 0x0000, /* R17030 */
+ 0x0000, /* R17031 */
+ 0x0000, /* R17032 */
+ 0x0000, /* R17033 */
+ 0x0000, /* R17034 */
+ 0x0000, /* R17035 */
+ 0x0000, /* R17036 */
+ 0x0000, /* R17037 */
+ 0x0000, /* R17038 */
+ 0x0000, /* R17039 */
+ 0x0000, /* R17040 */
+ 0x0000, /* R17041 */
+ 0x0000, /* R17042 */
+ 0x0000, /* R17043 */
+ 0x0000, /* R17044 */
+ 0x0000, /* R17045 */
+ 0x0000, /* R17046 */
+ 0x0000, /* R17047 */
+ 0x0000, /* R17048 */
+ 0x0000, /* R17049 */
+ 0x0000, /* R17050 */
+ 0x0000, /* R17051 */
+ 0x0000, /* R17052 */
+ 0x0000, /* R17053 */
+ 0x0000, /* R17054 */
+ 0x0000, /* R17055 */
+ 0x0000, /* R17056 */
+ 0x0000, /* R17057 */
+ 0x0000, /* R17058 */
+ 0x0000, /* R17059 */
+ 0x0000, /* R17060 */
+ 0x0000, /* R17061 */
+ 0x0000, /* R17062 */
+ 0x0000, /* R17063 */
+ 0x0000, /* R17064 */
+ 0x0000, /* R17065 */
+ 0x0000, /* R17066 */
+ 0x0000, /* R17067 */
+ 0x0000, /* R17068 */
+ 0x0000, /* R17069 */
+ 0x0000, /* R17070 */
+ 0x0000, /* R17071 */
+ 0x0000, /* R17072 */
+ 0x0000, /* R17073 */
+ 0x0000, /* R17074 */
+ 0x0000, /* R17075 */
+ 0x0000, /* R17076 */
+ 0x0000, /* R17077 */
+ 0x0000, /* R17078 */
+ 0x0000, /* R17079 */
+ 0x0000, /* R17080 */
+ 0x0000, /* R17081 */
+ 0x0000, /* R17082 */
+ 0x0000, /* R17083 */
+ 0x0000, /* R17084 */
+ 0x0000, /* R17085 */
+ 0x0000, /* R17086 */
+ 0x0000, /* R17087 */
+ 0x0000, /* R17088 */
+ 0x0000, /* R17089 */
+ 0x0000, /* R17090 */
+ 0x0000, /* R17091 */
+ 0x0000, /* R17092 */
+ 0x0000, /* R17093 */
+ 0x0000, /* R17094 */
+ 0x0000, /* R17095 */
+ 0x0000, /* R17096 */
+ 0x0000, /* R17097 */
+ 0x0000, /* R17098 */
+ 0x0000, /* R17099 */
+ 0x0000, /* R17100 */
+ 0x0000, /* R17101 */
+ 0x0000, /* R17102 */
+ 0x0000, /* R17103 */
+ 0x0000, /* R17104 */
+ 0x0000, /* R17105 */
+ 0x0000, /* R17106 */
+ 0x0000, /* R17107 */
+ 0x0000, /* R17108 */
+ 0x0000, /* R17109 */
+ 0x0000, /* R17110 */
+ 0x0000, /* R17111 */
+ 0x0000, /* R17112 */
+ 0x0000, /* R17113 */
+ 0x0000, /* R17114 */
+ 0x0000, /* R17115 */
+ 0x0000, /* R17116 */
+ 0x0000, /* R17117 */
+ 0x0000, /* R17118 */
+ 0x0000, /* R17119 */
+ 0x0000, /* R17120 */
+ 0x0000, /* R17121 */
+ 0x0000, /* R17122 */
+ 0x0000, /* R17123 */
+ 0x0000, /* R17124 */
+ 0x0000, /* R17125 */
+ 0x0000, /* R17126 */
+ 0x0000, /* R17127 */
+ 0x0000, /* R17128 */
+ 0x0000, /* R17129 */
+ 0x0000, /* R17130 */
+ 0x0000, /* R17131 */
+ 0x0000, /* R17132 */
+ 0x0000, /* R17133 */
+ 0x0000, /* R17134 */
+ 0x0000, /* R17135 */
+ 0x0000, /* R17136 */
+ 0x0000, /* R17137 */
+ 0x0000, /* R17138 */
+ 0x0000, /* R17139 */
+ 0x0000, /* R17140 */
+ 0x0000, /* R17141 */
+ 0x0000, /* R17142 */
+ 0x0000, /* R17143 */
+ 0x0000, /* R17144 */
+ 0x0000, /* R17145 */
+ 0x0000, /* R17146 */
+ 0x0000, /* R17147 */
+ 0x0000, /* R17148 */
+ 0x0000, /* R17149 */
+ 0x0000, /* R17150 */
+ 0x0000, /* R17151 */
+ 0x0000, /* R17152 */
+ 0x0000, /* R17153 */
+ 0x0000, /* R17154 */
+ 0x0000, /* R17155 */
+ 0x0000, /* R17156 */
+ 0x0000, /* R17157 */
+ 0x0000, /* R17158 */
+ 0x0000, /* R17159 */
+ 0x0000, /* R17160 */
+ 0x0000, /* R17161 */
+ 0x0000, /* R17162 */
+ 0x0000, /* R17163 */
+ 0x0000, /* R17164 */
+ 0x0000, /* R17165 */
+ 0x0000, /* R17166 */
+ 0x0000, /* R17167 */
+ 0x0000, /* R17168 */
+ 0x0000, /* R17169 */
+ 0x0000, /* R17170 */
+ 0x0000, /* R17171 */
+ 0x0000, /* R17172 */
+ 0x0000, /* R17173 */
+ 0x0000, /* R17174 */
+ 0x0000, /* R17175 */
+ 0x0000, /* R17176 */
+ 0x0000, /* R17177 */
+ 0x0000, /* R17178 */
+ 0x0000, /* R17179 */
+ 0x0000, /* R17180 */
+ 0x0000, /* R17181 */
+ 0x0000, /* R17182 */
+ 0x0000, /* R17183 */
+ 0x0000, /* R17184 */
+ 0x0000, /* R17185 */
+ 0x0000, /* R17186 */
+ 0x0000, /* R17187 */
+ 0x0000, /* R17188 */
+ 0x0000, /* R17189 */
+ 0x0000, /* R17190 */
+ 0x0000, /* R17191 */
+ 0x0000, /* R17192 */
+ 0x0000, /* R17193 */
+ 0x0000, /* R17194 */
+ 0x0000, /* R17195 */
+ 0x0000, /* R17196 */
+ 0x0000, /* R17197 */
+ 0x0000, /* R17198 */
+ 0x0000, /* R17199 */
+ 0x0000, /* R17200 */
+ 0x0000, /* R17201 */
+ 0x0000, /* R17202 */
+ 0x0000, /* R17203 */
+ 0x0000, /* R17204 */
+ 0x0000, /* R17205 */
+ 0x0000, /* R17206 */
+ 0x0000, /* R17207 */
+ 0x0000, /* R17208 */
+ 0x0000, /* R17209 */
+ 0x0000, /* R17210 */
+ 0x0000, /* R17211 */
+ 0x0000, /* R17212 */
+ 0x0000, /* R17213 */
+ 0x0000, /* R17214 */
+ 0x0000, /* R17215 */
+ 0x0000, /* R17216 */
+ 0x0000, /* R17217 */
+ 0x0000, /* R17218 */
+ 0x0000, /* R17219 */
+ 0x0000, /* R17220 */
+ 0x0000, /* R17221 */
+ 0x0000, /* R17222 */
+ 0x0000, /* R17223 */
+ 0x0000, /* R17224 */
+ 0x0000, /* R17225 */
+ 0x0000, /* R17226 */
+ 0x0000, /* R17227 */
+ 0x0000, /* R17228 */
+ 0x0000, /* R17229 */
+ 0x0000, /* R17230 */
+ 0x0000, /* R17231 */
+ 0x0000, /* R17232 */
+ 0x0000, /* R17233 */
+ 0x0000, /* R17234 */
+ 0x0000, /* R17235 */
+ 0x0000, /* R17236 */
+ 0x0000, /* R17237 */
+ 0x0000, /* R17238 */
+ 0x0000, /* R17239 */
+ 0x0000, /* R17240 */
+ 0x0000, /* R17241 */
+ 0x0000, /* R17242 */
+ 0x0000, /* R17243 */
+ 0x0000, /* R17244 */
+ 0x0000, /* R17245 */
+ 0x0000, /* R17246 */
+ 0x0000, /* R17247 */
+ 0x0000, /* R17248 */
+ 0x0000, /* R17249 */
+ 0x0000, /* R17250 */
+ 0x0000, /* R17251 */
+ 0x0000, /* R17252 */
+ 0x0000, /* R17253 */
+ 0x0000, /* R17254 */
+ 0x0000, /* R17255 */
+ 0x0000, /* R17256 */
+ 0x0000, /* R17257 */
+ 0x0000, /* R17258 */
+ 0x0000, /* R17259 */
+ 0x0000, /* R17260 */
+ 0x0000, /* R17261 */
+ 0x0000, /* R17262 */
+ 0x0000, /* R17263 */
+ 0x0000, /* R17264 */
+ 0x0000, /* R17265 */
+ 0x0000, /* R17266 */
+ 0x0000, /* R17267 */
+ 0x0000, /* R17268 */
+ 0x0000, /* R17269 */
+ 0x0000, /* R17270 */
+ 0x0000, /* R17271 */
+ 0x0000, /* R17272 */
+ 0x0000, /* R17273 */
+ 0x0000, /* R17274 */
+ 0x0000, /* R17275 */
+ 0x0000, /* R17276 */
+ 0x0000, /* R17277 */
+ 0x0000, /* R17278 */
+ 0x0000, /* R17279 */
+ 0x0000, /* R17280 */
+ 0x0000, /* R17281 */
+ 0x0000, /* R17282 */
+ 0x0000, /* R17283 */
+ 0x0000, /* R17284 */
+ 0x0000, /* R17285 */
+ 0x0000, /* R17286 */
+ 0x0000, /* R17287 */
+ 0x0000, /* R17288 */
+ 0x0000, /* R17289 */
+ 0x0000, /* R17290 */
+ 0x0000, /* R17291 */
+ 0x0000, /* R17292 */
+ 0x0000, /* R17293 */
+ 0x0000, /* R17294 */
+ 0x0000, /* R17295 */
+ 0x0000, /* R17296 */
+ 0x0000, /* R17297 */
+ 0x0000, /* R17298 */
+ 0x0000, /* R17299 */
+ 0x0000, /* R17300 */
+ 0x0000, /* R17301 */
+ 0x0000, /* R17302 */
+ 0x0000, /* R17303 */
+ 0x0000, /* R17304 */
+ 0x0000, /* R17305 */
+ 0x0000, /* R17306 */
+ 0x0000, /* R17307 */
+ 0x0000, /* R17308 */
+ 0x0000, /* R17309 */
+ 0x0000, /* R17310 */
+ 0x0000, /* R17311 */
+ 0x0000, /* R17312 */
+ 0x0000, /* R17313 */
+ 0x0000, /* R17314 */
+ 0x0000, /* R17315 */
+ 0x0000, /* R17316 */
+ 0x0000, /* R17317 */
+ 0x0000, /* R17318 */
+ 0x0000, /* R17319 */
+ 0x0000, /* R17320 */
+ 0x0000, /* R17321 */
+ 0x0000, /* R17322 */
+ 0x0000, /* R17323 */
+ 0x0000, /* R17324 */
+ 0x0000, /* R17325 */
+ 0x0000, /* R17326 */
+ 0x0000, /* R17327 */
+ 0x0000, /* R17328 */
+ 0x0000, /* R17329 */
+ 0x0000, /* R17330 */
+ 0x0000, /* R17331 */
+ 0x0000, /* R17332 */
+ 0x0000, /* R17333 */
+ 0x0000, /* R17334 */
+ 0x0000, /* R17335 */
+ 0x0000, /* R17336 */
+ 0x0000, /* R17337 */
+ 0x0000, /* R17338 */
+ 0x0000, /* R17339 */
+ 0x0000, /* R17340 */
+ 0x0000, /* R17341 */
+ 0x0000, /* R17342 */
+ 0x0000, /* R17343 */
+ 0x0000, /* R17344 */
+ 0x0000, /* R17345 */
+ 0x0000, /* R17346 */
+ 0x0000, /* R17347 */
+ 0x0000, /* R17348 */
+ 0x0000, /* R17349 */
+ 0x0000, /* R17350 */
+ 0x0000, /* R17351 */
+ 0x0000, /* R17352 */
+ 0x0000, /* R17353 */
+ 0x0000, /* R17354 */
+ 0x0000, /* R17355 */
+ 0x0000, /* R17356 */
+ 0x0000, /* R17357 */
+ 0x0000, /* R17358 */
+ 0x0000, /* R17359 */
+ 0x0000, /* R17360 */
+ 0x0000, /* R17361 */
+ 0x0000, /* R17362 */
+ 0x0000, /* R17363 */
+ 0x0000, /* R17364 */
+ 0x0000, /* R17365 */
+ 0x0000, /* R17366 */
+ 0x0000, /* R17367 */
+ 0x0000, /* R17368 */
+ 0x0000, /* R17369 */
+ 0x0000, /* R17370 */
+ 0x0000, /* R17371 */
+ 0x0000, /* R17372 */
+ 0x0000, /* R17373 */
+ 0x0000, /* R17374 */
+ 0x0000, /* R17375 */
+ 0x0000, /* R17376 */
+ 0x0000, /* R17377 */
+ 0x0000, /* R17378 */
+ 0x0000, /* R17379 */
+ 0x0000, /* R17380 */
+ 0x0000, /* R17381 */
+ 0x0000, /* R17382 */
+ 0x0000, /* R17383 */
+ 0x0000, /* R17384 */
+ 0x0000, /* R17385 */
+ 0x0000, /* R17386 */
+ 0x0000, /* R17387 */
+ 0x0000, /* R17388 */
+ 0x0000, /* R17389 */
+ 0x0000, /* R17390 */
+ 0x0000, /* R17391 */
+ 0x0000, /* R17392 */
+ 0x0000, /* R17393 */
+ 0x0000, /* R17394 */
+ 0x0000, /* R17395 */
+ 0x0000, /* R17396 */
+ 0x0000, /* R17397 */
+ 0x0000, /* R17398 */
+ 0x0000, /* R17399 */
+ 0x0000, /* R17400 */
+ 0x0000, /* R17401 */
+ 0x0000, /* R17402 */
+ 0x0000, /* R17403 */
+ 0x0000, /* R17404 */
+ 0x0000, /* R17405 */
+ 0x0000, /* R17406 */
+ 0x0000, /* R17407 */
+ 0x0083, /* R17408 - HPF_C_1 */
+ 0x98AD, /* R17409 - HPF_C_0 */
+ 0x0000, /* R17410 */
+ 0x0000, /* R17411 */
+ 0x0000, /* R17412 */
+ 0x0000, /* R17413 */
+ 0x0000, /* R17414 */
+ 0x0000, /* R17415 */
+ 0x0000, /* R17416 */
+ 0x0000, /* R17417 */
+ 0x0000, /* R17418 */
+ 0x0000, /* R17419 */
+ 0x0000, /* R17420 */
+ 0x0000, /* R17421 */
+ 0x0000, /* R17422 */
+ 0x0000, /* R17423 */
+ 0x0000, /* R17424 */
+ 0x0000, /* R17425 */
+ 0x0000, /* R17426 */
+ 0x0000, /* R17427 */
+ 0x0000, /* R17428 */
+ 0x0000, /* R17429 */
+ 0x0000, /* R17430 */
+ 0x0000, /* R17431 */
+ 0x0000, /* R17432 */
+ 0x0000, /* R17433 */
+ 0x0000, /* R17434 */
+ 0x0000, /* R17435 */
+ 0x0000, /* R17436 */
+ 0x0000, /* R17437 */
+ 0x0000, /* R17438 */
+ 0x0000, /* R17439 */
+ 0x0000, /* R17440 */
+ 0x0000, /* R17441 */
+ 0x0000, /* R17442 */
+ 0x0000, /* R17443 */
+ 0x0000, /* R17444 */
+ 0x0000, /* R17445 */
+ 0x0000, /* R17446 */
+ 0x0000, /* R17447 */
+ 0x0000, /* R17448 */
+ 0x0000, /* R17449 */
+ 0x0000, /* R17450 */
+ 0x0000, /* R17451 */
+ 0x0000, /* R17452 */
+ 0x0000, /* R17453 */
+ 0x0000, /* R17454 */
+ 0x0000, /* R17455 */
+ 0x0000, /* R17456 */
+ 0x0000, /* R17457 */
+ 0x0000, /* R17458 */
+ 0x0000, /* R17459 */
+ 0x0000, /* R17460 */
+ 0x0000, /* R17461 */
+ 0x0000, /* R17462 */
+ 0x0000, /* R17463 */
+ 0x0000, /* R17464 */
+ 0x0000, /* R17465 */
+ 0x0000, /* R17466 */
+ 0x0000, /* R17467 */
+ 0x0000, /* R17468 */
+ 0x0000, /* R17469 */
+ 0x0000, /* R17470 */
+ 0x0000, /* R17471 */
+ 0x0000, /* R17472 */
+ 0x0000, /* R17473 */
+ 0x0000, /* R17474 */
+ 0x0000, /* R17475 */
+ 0x0000, /* R17476 */
+ 0x0000, /* R17477 */
+ 0x0000, /* R17478 */
+ 0x0000, /* R17479 */
+ 0x0000, /* R17480 */
+ 0x0000, /* R17481 */
+ 0x0000, /* R17482 */
+ 0x0000, /* R17483 */
+ 0x0000, /* R17484 */
+ 0x0000, /* R17485 */
+ 0x0000, /* R17486 */
+ 0x0000, /* R17487 */
+ 0x0000, /* R17488 */
+ 0x0000, /* R17489 */
+ 0x0000, /* R17490 */
+ 0x0000, /* R17491 */
+ 0x0000, /* R17492 */
+ 0x0000, /* R17493 */
+ 0x0000, /* R17494 */
+ 0x0000, /* R17495 */
+ 0x0000, /* R17496 */
+ 0x0000, /* R17497 */
+ 0x0000, /* R17498 */
+ 0x0000, /* R17499 */
+ 0x0000, /* R17500 */
+ 0x0000, /* R17501 */
+ 0x0000, /* R17502 */
+ 0x0000, /* R17503 */
+ 0x0000, /* R17504 */
+ 0x0000, /* R17505 */
+ 0x0000, /* R17506 */
+ 0x0000, /* R17507 */
+ 0x0000, /* R17508 */
+ 0x0000, /* R17509 */
+ 0x0000, /* R17510 */
+ 0x0000, /* R17511 */
+ 0x0000, /* R17512 */
+ 0x0000, /* R17513 */
+ 0x0000, /* R17514 */
+ 0x0000, /* R17515 */
+ 0x0000, /* R17516 */
+ 0x0000, /* R17517 */
+ 0x0000, /* R17518 */
+ 0x0000, /* R17519 */
+ 0x0000, /* R17520 */
+ 0x0000, /* R17521 */
+ 0x0000, /* R17522 */
+ 0x0000, /* R17523 */
+ 0x0000, /* R17524 */
+ 0x0000, /* R17525 */
+ 0x0000, /* R17526 */
+ 0x0000, /* R17527 */
+ 0x0000, /* R17528 */
+ 0x0000, /* R17529 */
+ 0x0000, /* R17530 */
+ 0x0000, /* R17531 */
+ 0x0000, /* R17532 */
+ 0x0000, /* R17533 */
+ 0x0000, /* R17534 */
+ 0x0000, /* R17535 */
+ 0x0000, /* R17536 */
+ 0x0000, /* R17537 */
+ 0x0000, /* R17538 */
+ 0x0000, /* R17539 */
+ 0x0000, /* R17540 */
+ 0x0000, /* R17541 */
+ 0x0000, /* R17542 */
+ 0x0000, /* R17543 */
+ 0x0000, /* R17544 */
+ 0x0000, /* R17545 */
+ 0x0000, /* R17546 */
+ 0x0000, /* R17547 */
+ 0x0000, /* R17548 */
+ 0x0000, /* R17549 */
+ 0x0000, /* R17550 */
+ 0x0000, /* R17551 */
+ 0x0000, /* R17552 */
+ 0x0000, /* R17553 */
+ 0x0000, /* R17554 */
+ 0x0000, /* R17555 */
+ 0x0000, /* R17556 */
+ 0x0000, /* R17557 */
+ 0x0000, /* R17558 */
+ 0x0000, /* R17559 */
+ 0x0000, /* R17560 */
+ 0x0000, /* R17561 */
+ 0x0000, /* R17562 */
+ 0x0000, /* R17563 */
+ 0x0000, /* R17564 */
+ 0x0000, /* R17565 */
+ 0x0000, /* R17566 */
+ 0x0000, /* R17567 */
+ 0x0000, /* R17568 */
+ 0x0000, /* R17569 */
+ 0x0000, /* R17570 */
+ 0x0000, /* R17571 */
+ 0x0000, /* R17572 */
+ 0x0000, /* R17573 */
+ 0x0000, /* R17574 */
+ 0x0000, /* R17575 */
+ 0x0000, /* R17576 */
+ 0x0000, /* R17577 */
+ 0x0000, /* R17578 */
+ 0x0000, /* R17579 */
+ 0x0000, /* R17580 */
+ 0x0000, /* R17581 */
+ 0x0000, /* R17582 */
+ 0x0000, /* R17583 */
+ 0x0000, /* R17584 */
+ 0x0000, /* R17585 */
+ 0x0000, /* R17586 */
+ 0x0000, /* R17587 */
+ 0x0000, /* R17588 */
+ 0x0000, /* R17589 */
+ 0x0000, /* R17590 */
+ 0x0000, /* R17591 */
+ 0x0000, /* R17592 */
+ 0x0000, /* R17593 */
+ 0x0000, /* R17594 */
+ 0x0000, /* R17595 */
+ 0x0000, /* R17596 */
+ 0x0000, /* R17597 */
+ 0x0000, /* R17598 */
+ 0x0000, /* R17599 */
+ 0x0000, /* R17600 */
+ 0x0000, /* R17601 */
+ 0x0000, /* R17602 */
+ 0x0000, /* R17603 */
+ 0x0000, /* R17604 */
+ 0x0000, /* R17605 */
+ 0x0000, /* R17606 */
+ 0x0000, /* R17607 */
+ 0x0000, /* R17608 */
+ 0x0000, /* R17609 */
+ 0x0000, /* R17610 */
+ 0x0000, /* R17611 */
+ 0x0000, /* R17612 */
+ 0x0000, /* R17613 */
+ 0x0000, /* R17614 */
+ 0x0000, /* R17615 */
+ 0x0000, /* R17616 */
+ 0x0000, /* R17617 */
+ 0x0000, /* R17618 */
+ 0x0000, /* R17619 */
+ 0x0000, /* R17620 */
+ 0x0000, /* R17621 */
+ 0x0000, /* R17622 */
+ 0x0000, /* R17623 */
+ 0x0000, /* R17624 */
+ 0x0000, /* R17625 */
+ 0x0000, /* R17626 */
+ 0x0000, /* R17627 */
+ 0x0000, /* R17628 */
+ 0x0000, /* R17629 */
+ 0x0000, /* R17630 */
+ 0x0000, /* R17631 */
+ 0x0000, /* R17632 */
+ 0x0000, /* R17633 */
+ 0x0000, /* R17634 */
+ 0x0000, /* R17635 */
+ 0x0000, /* R17636 */
+ 0x0000, /* R17637 */
+ 0x0000, /* R17638 */
+ 0x0000, /* R17639 */
+ 0x0000, /* R17640 */
+ 0x0000, /* R17641 */
+ 0x0000, /* R17642 */
+ 0x0000, /* R17643 */
+ 0x0000, /* R17644 */
+ 0x0000, /* R17645 */
+ 0x0000, /* R17646 */
+ 0x0000, /* R17647 */
+ 0x0000, /* R17648 */
+ 0x0000, /* R17649 */
+ 0x0000, /* R17650 */
+ 0x0000, /* R17651 */
+ 0x0000, /* R17652 */
+ 0x0000, /* R17653 */
+ 0x0000, /* R17654 */
+ 0x0000, /* R17655 */
+ 0x0000, /* R17656 */
+ 0x0000, /* R17657 */
+ 0x0000, /* R17658 */
+ 0x0000, /* R17659 */
+ 0x0000, /* R17660 */
+ 0x0000, /* R17661 */
+ 0x0000, /* R17662 */
+ 0x0000, /* R17663 */
+ 0x0000, /* R17664 */
+ 0x0000, /* R17665 */
+ 0x0000, /* R17666 */
+ 0x0000, /* R17667 */
+ 0x0000, /* R17668 */
+ 0x0000, /* R17669 */
+ 0x0000, /* R17670 */
+ 0x0000, /* R17671 */
+ 0x0000, /* R17672 */
+ 0x0000, /* R17673 */
+ 0x0000, /* R17674 */
+ 0x0000, /* R17675 */
+ 0x0000, /* R17676 */
+ 0x0000, /* R17677 */
+ 0x0000, /* R17678 */
+ 0x0000, /* R17679 */
+ 0x0000, /* R17680 */
+ 0x0000, /* R17681 */
+ 0x0000, /* R17682 */
+ 0x0000, /* R17683 */
+ 0x0000, /* R17684 */
+ 0x0000, /* R17685 */
+ 0x0000, /* R17686 */
+ 0x0000, /* R17687 */
+ 0x0000, /* R17688 */
+ 0x0000, /* R17689 */
+ 0x0000, /* R17690 */
+ 0x0000, /* R17691 */
+ 0x0000, /* R17692 */
+ 0x0000, /* R17693 */
+ 0x0000, /* R17694 */
+ 0x0000, /* R17695 */
+ 0x0000, /* R17696 */
+ 0x0000, /* R17697 */
+ 0x0000, /* R17698 */
+ 0x0000, /* R17699 */
+ 0x0000, /* R17700 */
+ 0x0000, /* R17701 */
+ 0x0000, /* R17702 */
+ 0x0000, /* R17703 */
+ 0x0000, /* R17704 */
+ 0x0000, /* R17705 */
+ 0x0000, /* R17706 */
+ 0x0000, /* R17707 */
+ 0x0000, /* R17708 */
+ 0x0000, /* R17709 */
+ 0x0000, /* R17710 */
+ 0x0000, /* R17711 */
+ 0x0000, /* R17712 */
+ 0x0000, /* R17713 */
+ 0x0000, /* R17714 */
+ 0x0000, /* R17715 */
+ 0x0000, /* R17716 */
+ 0x0000, /* R17717 */
+ 0x0000, /* R17718 */
+ 0x0000, /* R17719 */
+ 0x0000, /* R17720 */
+ 0x0000, /* R17721 */
+ 0x0000, /* R17722 */
+ 0x0000, /* R17723 */
+ 0x0000, /* R17724 */
+ 0x0000, /* R17725 */
+ 0x0000, /* R17726 */
+ 0x0000, /* R17727 */
+ 0x0000, /* R17728 */
+ 0x0000, /* R17729 */
+ 0x0000, /* R17730 */
+ 0x0000, /* R17731 */
+ 0x0000, /* R17732 */
+ 0x0000, /* R17733 */
+ 0x0000, /* R17734 */
+ 0x0000, /* R17735 */
+ 0x0000, /* R17736 */
+ 0x0000, /* R17737 */
+ 0x0000, /* R17738 */
+ 0x0000, /* R17739 */
+ 0x0000, /* R17740 */
+ 0x0000, /* R17741 */
+ 0x0000, /* R17742 */
+ 0x0000, /* R17743 */
+ 0x0000, /* R17744 */
+ 0x0000, /* R17745 */
+ 0x0000, /* R17746 */
+ 0x0000, /* R17747 */
+ 0x0000, /* R17748 */
+ 0x0000, /* R17749 */
+ 0x0000, /* R17750 */
+ 0x0000, /* R17751 */
+ 0x0000, /* R17752 */
+ 0x0000, /* R17753 */
+ 0x0000, /* R17754 */
+ 0x0000, /* R17755 */
+ 0x0000, /* R17756 */
+ 0x0000, /* R17757 */
+ 0x0000, /* R17758 */
+ 0x0000, /* R17759 */
+ 0x0000, /* R17760 */
+ 0x0000, /* R17761 */
+ 0x0000, /* R17762 */
+ 0x0000, /* R17763 */
+ 0x0000, /* R17764 */
+ 0x0000, /* R17765 */
+ 0x0000, /* R17766 */
+ 0x0000, /* R17767 */
+ 0x0000, /* R17768 */
+ 0x0000, /* R17769 */
+ 0x0000, /* R17770 */
+ 0x0000, /* R17771 */
+ 0x0000, /* R17772 */
+ 0x0000, /* R17773 */
+ 0x0000, /* R17774 */
+ 0x0000, /* R17775 */
+ 0x0000, /* R17776 */
+ 0x0000, /* R17777 */
+ 0x0000, /* R17778 */
+ 0x0000, /* R17779 */
+ 0x0000, /* R17780 */
+ 0x0000, /* R17781 */
+ 0x0000, /* R17782 */
+ 0x0000, /* R17783 */
+ 0x0000, /* R17784 */
+ 0x0000, /* R17785 */
+ 0x0000, /* R17786 */
+ 0x0000, /* R17787 */
+ 0x0000, /* R17788 */
+ 0x0000, /* R17789 */
+ 0x0000, /* R17790 */
+ 0x0000, /* R17791 */
+ 0x0000, /* R17792 */
+ 0x0000, /* R17793 */
+ 0x0000, /* R17794 */
+ 0x0000, /* R17795 */
+ 0x0000, /* R17796 */
+ 0x0000, /* R17797 */
+ 0x0000, /* R17798 */
+ 0x0000, /* R17799 */
+ 0x0000, /* R17800 */
+ 0x0000, /* R17801 */
+ 0x0000, /* R17802 */
+ 0x0000, /* R17803 */
+ 0x0000, /* R17804 */
+ 0x0000, /* R17805 */
+ 0x0000, /* R17806 */
+ 0x0000, /* R17807 */
+ 0x0000, /* R17808 */
+ 0x0000, /* R17809 */
+ 0x0000, /* R17810 */
+ 0x0000, /* R17811 */
+ 0x0000, /* R17812 */
+ 0x0000, /* R17813 */
+ 0x0000, /* R17814 */
+ 0x0000, /* R17815 */
+ 0x0000, /* R17816 */
+ 0x0000, /* R17817 */
+ 0x0000, /* R17818 */
+ 0x0000, /* R17819 */
+ 0x0000, /* R17820 */
+ 0x0000, /* R17821 */
+ 0x0000, /* R17822 */
+ 0x0000, /* R17823 */
+ 0x0000, /* R17824 */
+ 0x0000, /* R17825 */
+ 0x0000, /* R17826 */
+ 0x0000, /* R17827 */
+ 0x0000, /* R17828 */
+ 0x0000, /* R17829 */
+ 0x0000, /* R17830 */
+ 0x0000, /* R17831 */
+ 0x0000, /* R17832 */
+ 0x0000, /* R17833 */
+ 0x0000, /* R17834 */
+ 0x0000, /* R17835 */
+ 0x0000, /* R17836 */
+ 0x0000, /* R17837 */
+ 0x0000, /* R17838 */
+ 0x0000, /* R17839 */
+ 0x0000, /* R17840 */
+ 0x0000, /* R17841 */
+ 0x0000, /* R17842 */
+ 0x0000, /* R17843 */
+ 0x0000, /* R17844 */
+ 0x0000, /* R17845 */
+ 0x0000, /* R17846 */
+ 0x0000, /* R17847 */
+ 0x0000, /* R17848 */
+ 0x0000, /* R17849 */
+ 0x0000, /* R17850 */
+ 0x0000, /* R17851 */
+ 0x0000, /* R17852 */
+ 0x0000, /* R17853 */
+ 0x0000, /* R17854 */
+ 0x0000, /* R17855 */
+ 0x0000, /* R17856 */
+ 0x0000, /* R17857 */
+ 0x0000, /* R17858 */
+ 0x0000, /* R17859 */
+ 0x0000, /* R17860 */
+ 0x0000, /* R17861 */
+ 0x0000, /* R17862 */
+ 0x0000, /* R17863 */
+ 0x0000, /* R17864 */
+ 0x0000, /* R17865 */
+ 0x0000, /* R17866 */
+ 0x0000, /* R17867 */
+ 0x0000, /* R17868 */
+ 0x0000, /* R17869 */
+ 0x0000, /* R17870 */
+ 0x0000, /* R17871 */
+ 0x0000, /* R17872 */
+ 0x0000, /* R17873 */
+ 0x0000, /* R17874 */
+ 0x0000, /* R17875 */
+ 0x0000, /* R17876 */
+ 0x0000, /* R17877 */
+ 0x0000, /* R17878 */
+ 0x0000, /* R17879 */
+ 0x0000, /* R17880 */
+ 0x0000, /* R17881 */
+ 0x0000, /* R17882 */
+ 0x0000, /* R17883 */
+ 0x0000, /* R17884 */
+ 0x0000, /* R17885 */
+ 0x0000, /* R17886 */
+ 0x0000, /* R17887 */
+ 0x0000, /* R17888 */
+ 0x0000, /* R17889 */
+ 0x0000, /* R17890 */
+ 0x0000, /* R17891 */
+ 0x0000, /* R17892 */
+ 0x0000, /* R17893 */
+ 0x0000, /* R17894 */
+ 0x0000, /* R17895 */
+ 0x0000, /* R17896 */
+ 0x0000, /* R17897 */
+ 0x0000, /* R17898 */
+ 0x0000, /* R17899 */
+ 0x0000, /* R17900 */
+ 0x0000, /* R17901 */
+ 0x0000, /* R17902 */
+ 0x0000, /* R17903 */
+ 0x0000, /* R17904 */
+ 0x0000, /* R17905 */
+ 0x0000, /* R17906 */
+ 0x0000, /* R17907 */
+ 0x0000, /* R17908 */
+ 0x0000, /* R17909 */
+ 0x0000, /* R17910 */
+ 0x0000, /* R17911 */
+ 0x0000, /* R17912 */
+ 0x0000, /* R17913 */
+ 0x0000, /* R17914 */
+ 0x0000, /* R17915 */
+ 0x0000, /* R17916 */
+ 0x0000, /* R17917 */
+ 0x0000, /* R17918 */
+ 0x0000, /* R17919 */
+ 0x007F, /* R17920 - ADCL_RETUNE_C1_1 */
+ 0xFFFF, /* R17921 - ADCL_RETUNE_C1_0 */
+ 0x0000, /* R17922 - ADCL_RETUNE_C2_1 */
+ 0x0000, /* R17923 - ADCL_RETUNE_C2_0 */
+ 0x0000, /* R17924 - ADCL_RETUNE_C3_1 */
+ 0x0000, /* R17925 - ADCL_RETUNE_C3_0 */
+ 0x0000, /* R17926 - ADCL_RETUNE_C4_1 */
+ 0x0000, /* R17927 - ADCL_RETUNE_C4_0 */
+ 0x0000, /* R17928 - ADCL_RETUNE_C5_1 */
+ 0x0000, /* R17929 - ADCL_RETUNE_C5_0 */
+ 0x0000, /* R17930 - ADCL_RETUNE_C6_1 */
+ 0x0000, /* R17931 - ADCL_RETUNE_C6_0 */
+ 0x0000, /* R17932 - ADCL_RETUNE_C7_1 */
+ 0x0000, /* R17933 - ADCL_RETUNE_C7_0 */
+ 0x0000, /* R17934 - ADCL_RETUNE_C8_1 */
+ 0x0000, /* R17935 - ADCL_RETUNE_C8_0 */
+ 0x0000, /* R17936 - ADCL_RETUNE_C9_1 */
+ 0x0000, /* R17937 - ADCL_RETUNE_C9_0 */
+ 0x0000, /* R17938 - ADCL_RETUNE_C10_1 */
+ 0x0000, /* R17939 - ADCL_RETUNE_C10_0 */
+ 0x0000, /* R17940 - ADCL_RETUNE_C11_1 */
+ 0x0000, /* R17941 - ADCL_RETUNE_C11_0 */
+ 0x0000, /* R17942 - ADCL_RETUNE_C12_1 */
+ 0x0000, /* R17943 - ADCL_RETUNE_C12_0 */
+ 0x0000, /* R17944 - ADCL_RETUNE_C13_1 */
+ 0x0000, /* R17945 - ADCL_RETUNE_C13_0 */
+ 0x0000, /* R17946 - ADCL_RETUNE_C14_1 */
+ 0x0000, /* R17947 - ADCL_RETUNE_C14_0 */
+ 0x0000, /* R17948 - ADCL_RETUNE_C15_1 */
+ 0x0000, /* R17949 - ADCL_RETUNE_C15_0 */
+ 0x0000, /* R17950 - ADCL_RETUNE_C16_1 */
+ 0x0000, /* R17951 - ADCL_RETUNE_C16_0 */
+ 0x0000, /* R17952 - ADCL_RETUNE_C17_1 */
+ 0x0000, /* R17953 - ADCL_RETUNE_C17_0 */
+ 0x0000, /* R17954 - ADCL_RETUNE_C18_1 */
+ 0x0000, /* R17955 - ADCL_RETUNE_C18_0 */
+ 0x0000, /* R17956 - ADCL_RETUNE_C19_1 */
+ 0x0000, /* R17957 - ADCL_RETUNE_C19_0 */
+ 0x0000, /* R17958 - ADCL_RETUNE_C20_1 */
+ 0x0000, /* R17959 - ADCL_RETUNE_C20_0 */
+ 0x0000, /* R17960 - ADCL_RETUNE_C21_1 */
+ 0x0000, /* R17961 - ADCL_RETUNE_C21_0 */
+ 0x0000, /* R17962 - ADCL_RETUNE_C22_1 */
+ 0x0000, /* R17963 - ADCL_RETUNE_C22_0 */
+ 0x0000, /* R17964 - ADCL_RETUNE_C23_1 */
+ 0x0000, /* R17965 - ADCL_RETUNE_C23_0 */
+ 0x0000, /* R17966 - ADCL_RETUNE_C24_1 */
+ 0x0000, /* R17967 - ADCL_RETUNE_C24_0 */
+ 0x0000, /* R17968 - ADCL_RETUNE_C25_1 */
+ 0x0000, /* R17969 - ADCL_RETUNE_C25_0 */
+ 0x0000, /* R17970 - ADCL_RETUNE_C26_1 */
+ 0x0000, /* R17971 - ADCL_RETUNE_C26_0 */
+ 0x0000, /* R17972 - ADCL_RETUNE_C27_1 */
+ 0x0000, /* R17973 - ADCL_RETUNE_C27_0 */
+ 0x0000, /* R17974 - ADCL_RETUNE_C28_1 */
+ 0x0000, /* R17975 - ADCL_RETUNE_C28_0 */
+ 0x0000, /* R17976 - ADCL_RETUNE_C29_1 */
+ 0x0000, /* R17977 - ADCL_RETUNE_C29_0 */
+ 0x0000, /* R17978 - ADCL_RETUNE_C30_1 */
+ 0x0000, /* R17979 - ADCL_RETUNE_C30_0 */
+ 0x0000, /* R17980 - ADCL_RETUNE_C31_1 */
+ 0x0000, /* R17981 - ADCL_RETUNE_C31_0 */
+ 0x0000, /* R17982 - ADCL_RETUNE_C32_1 */
+ 0x0000, /* R17983 - ADCL_RETUNE_C32_0 */
+ 0x0000, /* R17984 */
+ 0x0000, /* R17985 */
+ 0x0000, /* R17986 */
+ 0x0000, /* R17987 */
+ 0x0000, /* R17988 */
+ 0x0000, /* R17989 */
+ 0x0000, /* R17990 */
+ 0x0000, /* R17991 */
+ 0x0000, /* R17992 */
+ 0x0000, /* R17993 */
+ 0x0000, /* R17994 */
+ 0x0000, /* R17995 */
+ 0x0000, /* R17996 */
+ 0x0000, /* R17997 */
+ 0x0000, /* R17998 */
+ 0x0000, /* R17999 */
+ 0x0000, /* R18000 */
+ 0x0000, /* R18001 */
+ 0x0000, /* R18002 */
+ 0x0000, /* R18003 */
+ 0x0000, /* R18004 */
+ 0x0000, /* R18005 */
+ 0x0000, /* R18006 */
+ 0x0000, /* R18007 */
+ 0x0000, /* R18008 */
+ 0x0000, /* R18009 */
+ 0x0000, /* R18010 */
+ 0x0000, /* R18011 */
+ 0x0000, /* R18012 */
+ 0x0000, /* R18013 */
+ 0x0000, /* R18014 */
+ 0x0000, /* R18015 */
+ 0x0000, /* R18016 */
+ 0x0000, /* R18017 */
+ 0x0000, /* R18018 */
+ 0x0000, /* R18019 */
+ 0x0000, /* R18020 */
+ 0x0000, /* R18021 */
+ 0x0000, /* R18022 */
+ 0x0000, /* R18023 */
+ 0x0000, /* R18024 */
+ 0x0000, /* R18025 */
+ 0x0000, /* R18026 */
+ 0x0000, /* R18027 */
+ 0x0000, /* R18028 */
+ 0x0000, /* R18029 */
+ 0x0000, /* R18030 */
+ 0x0000, /* R18031 */
+ 0x0000, /* R18032 */
+ 0x0000, /* R18033 */
+ 0x0000, /* R18034 */
+ 0x0000, /* R18035 */
+ 0x0000, /* R18036 */
+ 0x0000, /* R18037 */
+ 0x0000, /* R18038 */
+ 0x0000, /* R18039 */
+ 0x0000, /* R18040 */
+ 0x0000, /* R18041 */
+ 0x0000, /* R18042 */
+ 0x0000, /* R18043 */
+ 0x0000, /* R18044 */
+ 0x0000, /* R18045 */
+ 0x0000, /* R18046 */
+ 0x0000, /* R18047 */
+ 0x0000, /* R18048 */
+ 0x0000, /* R18049 */
+ 0x0000, /* R18050 */
+ 0x0000, /* R18051 */
+ 0x0000, /* R18052 */
+ 0x0000, /* R18053 */
+ 0x0000, /* R18054 */
+ 0x0000, /* R18055 */
+ 0x0000, /* R18056 */
+ 0x0000, /* R18057 */
+ 0x0000, /* R18058 */
+ 0x0000, /* R18059 */
+ 0x0000, /* R18060 */
+ 0x0000, /* R18061 */
+ 0x0000, /* R18062 */
+ 0x0000, /* R18063 */
+ 0x0000, /* R18064 */
+ 0x0000, /* R18065 */
+ 0x0000, /* R18066 */
+ 0x0000, /* R18067 */
+ 0x0000, /* R18068 */
+ 0x0000, /* R18069 */
+ 0x0000, /* R18070 */
+ 0x0000, /* R18071 */
+ 0x0000, /* R18072 */
+ 0x0000, /* R18073 */
+ 0x0000, /* R18074 */
+ 0x0000, /* R18075 */
+ 0x0000, /* R18076 */
+ 0x0000, /* R18077 */
+ 0x0000, /* R18078 */
+ 0x0000, /* R18079 */
+ 0x0000, /* R18080 */
+ 0x0000, /* R18081 */
+ 0x0000, /* R18082 */
+ 0x0000, /* R18083 */
+ 0x0000, /* R18084 */
+ 0x0000, /* R18085 */
+ 0x0000, /* R18086 */
+ 0x0000, /* R18087 */
+ 0x0000, /* R18088 */
+ 0x0000, /* R18089 */
+ 0x0000, /* R18090 */
+ 0x0000, /* R18091 */
+ 0x0000, /* R18092 */
+ 0x0000, /* R18093 */
+ 0x0000, /* R18094 */
+ 0x0000, /* R18095 */
+ 0x0000, /* R18096 */
+ 0x0000, /* R18097 */
+ 0x0000, /* R18098 */
+ 0x0000, /* R18099 */
+ 0x0000, /* R18100 */
+ 0x0000, /* R18101 */
+ 0x0000, /* R18102 */
+ 0x0000, /* R18103 */
+ 0x0000, /* R18104 */
+ 0x0000, /* R18105 */
+ 0x0000, /* R18106 */
+ 0x0000, /* R18107 */
+ 0x0000, /* R18108 */
+ 0x0000, /* R18109 */
+ 0x0000, /* R18110 */
+ 0x0000, /* R18111 */
+ 0x0000, /* R18112 */
+ 0x0000, /* R18113 */
+ 0x0000, /* R18114 */
+ 0x0000, /* R18115 */
+ 0x0000, /* R18116 */
+ 0x0000, /* R18117 */
+ 0x0000, /* R18118 */
+ 0x0000, /* R18119 */
+ 0x0000, /* R18120 */
+ 0x0000, /* R18121 */
+ 0x0000, /* R18122 */
+ 0x0000, /* R18123 */
+ 0x0000, /* R18124 */
+ 0x0000, /* R18125 */
+ 0x0000, /* R18126 */
+ 0x0000, /* R18127 */
+ 0x0000, /* R18128 */
+ 0x0000, /* R18129 */
+ 0x0000, /* R18130 */
+ 0x0000, /* R18131 */
+ 0x0000, /* R18132 */
+ 0x0000, /* R18133 */
+ 0x0000, /* R18134 */
+ 0x0000, /* R18135 */
+ 0x0000, /* R18136 */
+ 0x0000, /* R18137 */
+ 0x0000, /* R18138 */
+ 0x0000, /* R18139 */
+ 0x0000, /* R18140 */
+ 0x0000, /* R18141 */
+ 0x0000, /* R18142 */
+ 0x0000, /* R18143 */
+ 0x0000, /* R18144 */
+ 0x0000, /* R18145 */
+ 0x0000, /* R18146 */
+ 0x0000, /* R18147 */
+ 0x0000, /* R18148 */
+ 0x0000, /* R18149 */
+ 0x0000, /* R18150 */
+ 0x0000, /* R18151 */
+ 0x0000, /* R18152 */
+ 0x0000, /* R18153 */
+ 0x0000, /* R18154 */
+ 0x0000, /* R18155 */
+ 0x0000, /* R18156 */
+ 0x0000, /* R18157 */
+ 0x0000, /* R18158 */
+ 0x0000, /* R18159 */
+ 0x0000, /* R18160 */
+ 0x0000, /* R18161 */
+ 0x0000, /* R18162 */
+ 0x0000, /* R18163 */
+ 0x0000, /* R18164 */
+ 0x0000, /* R18165 */
+ 0x0000, /* R18166 */
+ 0x0000, /* R18167 */
+ 0x0000, /* R18168 */
+ 0x0000, /* R18169 */
+ 0x0000, /* R18170 */
+ 0x0000, /* R18171 */
+ 0x0000, /* R18172 */
+ 0x0000, /* R18173 */
+ 0x0000, /* R18174 */
+ 0x0000, /* R18175 */
+ 0x0000, /* R18176 */
+ 0x0000, /* R18177 */
+ 0x0000, /* R18178 */
+ 0x0000, /* R18179 */
+ 0x0000, /* R18180 */
+ 0x0000, /* R18181 */
+ 0x0000, /* R18182 */
+ 0x0000, /* R18183 */
+ 0x0000, /* R18184 */
+ 0x0000, /* R18185 */
+ 0x0000, /* R18186 */
+ 0x0000, /* R18187 */
+ 0x0000, /* R18188 */
+ 0x0000, /* R18189 */
+ 0x0000, /* R18190 */
+ 0x0000, /* R18191 */
+ 0x0000, /* R18192 */
+ 0x0000, /* R18193 */
+ 0x0000, /* R18194 */
+ 0x0000, /* R18195 */
+ 0x0000, /* R18196 */
+ 0x0000, /* R18197 */
+ 0x0000, /* R18198 */
+ 0x0000, /* R18199 */
+ 0x0000, /* R18200 */
+ 0x0000, /* R18201 */
+ 0x0000, /* R18202 */
+ 0x0000, /* R18203 */
+ 0x0000, /* R18204 */
+ 0x0000, /* R18205 */
+ 0x0000, /* R18206 */
+ 0x0000, /* R18207 */
+ 0x0000, /* R18208 */
+ 0x0000, /* R18209 */
+ 0x0000, /* R18210 */
+ 0x0000, /* R18211 */
+ 0x0000, /* R18212 */
+ 0x0000, /* R18213 */
+ 0x0000, /* R18214 */
+ 0x0000, /* R18215 */
+ 0x0000, /* R18216 */
+ 0x0000, /* R18217 */
+ 0x0000, /* R18218 */
+ 0x0000, /* R18219 */
+ 0x0000, /* R18220 */
+ 0x0000, /* R18221 */
+ 0x0000, /* R18222 */
+ 0x0000, /* R18223 */
+ 0x0000, /* R18224 */
+ 0x0000, /* R18225 */
+ 0x0000, /* R18226 */
+ 0x0000, /* R18227 */
+ 0x0000, /* R18228 */
+ 0x0000, /* R18229 */
+ 0x0000, /* R18230 */
+ 0x0000, /* R18231 */
+ 0x0000, /* R18232 */
+ 0x0000, /* R18233 */
+ 0x0000, /* R18234 */
+ 0x0000, /* R18235 */
+ 0x0000, /* R18236 */
+ 0x0000, /* R18237 */
+ 0x0000, /* R18238 */
+ 0x0000, /* R18239 */
+ 0x0000, /* R18240 */
+ 0x0000, /* R18241 */
+ 0x0000, /* R18242 */
+ 0x0000, /* R18243 */
+ 0x0000, /* R18244 */
+ 0x0000, /* R18245 */
+ 0x0000, /* R18246 */
+ 0x0000, /* R18247 */
+ 0x0000, /* R18248 */
+ 0x0000, /* R18249 */
+ 0x0000, /* R18250 */
+ 0x0000, /* R18251 */
+ 0x0000, /* R18252 */
+ 0x0000, /* R18253 */
+ 0x0000, /* R18254 */
+ 0x0000, /* R18255 */
+ 0x0000, /* R18256 */
+ 0x0000, /* R18257 */
+ 0x0000, /* R18258 */
+ 0x0000, /* R18259 */
+ 0x0000, /* R18260 */
+ 0x0000, /* R18261 */
+ 0x0000, /* R18262 */
+ 0x0000, /* R18263 */
+ 0x0000, /* R18264 */
+ 0x0000, /* R18265 */
+ 0x0000, /* R18266 */
+ 0x0000, /* R18267 */
+ 0x0000, /* R18268 */
+ 0x0000, /* R18269 */
+ 0x0000, /* R18270 */
+ 0x0000, /* R18271 */
+ 0x0000, /* R18272 */
+ 0x0000, /* R18273 */
+ 0x0000, /* R18274 */
+ 0x0000, /* R18275 */
+ 0x0000, /* R18276 */
+ 0x0000, /* R18277 */
+ 0x0000, /* R18278 */
+ 0x0000, /* R18279 */
+ 0x0000, /* R18280 */
+ 0x0000, /* R18281 */
+ 0x0000, /* R18282 */
+ 0x0000, /* R18283 */
+ 0x0000, /* R18284 */
+ 0x0000, /* R18285 */
+ 0x0000, /* R18286 */
+ 0x0000, /* R18287 */
+ 0x0000, /* R18288 */
+ 0x0000, /* R18289 */
+ 0x0000, /* R18290 */
+ 0x0000, /* R18291 */
+ 0x0000, /* R18292 */
+ 0x0000, /* R18293 */
+ 0x0000, /* R18294 */
+ 0x0000, /* R18295 */
+ 0x0000, /* R18296 */
+ 0x0000, /* R18297 */
+ 0x0000, /* R18298 */
+ 0x0000, /* R18299 */
+ 0x0000, /* R18300 */
+ 0x0000, /* R18301 */
+ 0x0000, /* R18302 */
+ 0x0000, /* R18303 */
+ 0x0000, /* R18304 */
+ 0x0000, /* R18305 */
+ 0x0000, /* R18306 */
+ 0x0000, /* R18307 */
+ 0x0000, /* R18308 */
+ 0x0000, /* R18309 */
+ 0x0000, /* R18310 */
+ 0x0000, /* R18311 */
+ 0x0000, /* R18312 */
+ 0x0000, /* R18313 */
+ 0x0000, /* R18314 */
+ 0x0000, /* R18315 */
+ 0x0000, /* R18316 */
+ 0x0000, /* R18317 */
+ 0x0000, /* R18318 */
+ 0x0000, /* R18319 */
+ 0x0000, /* R18320 */
+ 0x0000, /* R18321 */
+ 0x0000, /* R18322 */
+ 0x0000, /* R18323 */
+ 0x0000, /* R18324 */
+ 0x0000, /* R18325 */
+ 0x0000, /* R18326 */
+ 0x0000, /* R18327 */
+ 0x0000, /* R18328 */
+ 0x0000, /* R18329 */
+ 0x0000, /* R18330 */
+ 0x0000, /* R18331 */
+ 0x0000, /* R18332 */
+ 0x0000, /* R18333 */
+ 0x0000, /* R18334 */
+ 0x0000, /* R18335 */
+ 0x0000, /* R18336 */
+ 0x0000, /* R18337 */
+ 0x0000, /* R18338 */
+ 0x0000, /* R18339 */
+ 0x0000, /* R18340 */
+ 0x0000, /* R18341 */
+ 0x0000, /* R18342 */
+ 0x0000, /* R18343 */
+ 0x0000, /* R18344 */
+ 0x0000, /* R18345 */
+ 0x0000, /* R18346 */
+ 0x0000, /* R18347 */
+ 0x0000, /* R18348 */
+ 0x0000, /* R18349 */
+ 0x0000, /* R18350 */
+ 0x0000, /* R18351 */
+ 0x0000, /* R18352 */
+ 0x0000, /* R18353 */
+ 0x0000, /* R18354 */
+ 0x0000, /* R18355 */
+ 0x0000, /* R18356 */
+ 0x0000, /* R18357 */
+ 0x0000, /* R18358 */
+ 0x0000, /* R18359 */
+ 0x0000, /* R18360 */
+ 0x0000, /* R18361 */
+ 0x0000, /* R18362 */
+ 0x0000, /* R18363 */
+ 0x0000, /* R18364 */
+ 0x0000, /* R18365 */
+ 0x0000, /* R18366 */
+ 0x0000, /* R18367 */
+ 0x0000, /* R18368 */
+ 0x0000, /* R18369 */
+ 0x0000, /* R18370 */
+ 0x0000, /* R18371 */
+ 0x0000, /* R18372 */
+ 0x0000, /* R18373 */
+ 0x0000, /* R18374 */
+ 0x0000, /* R18375 */
+ 0x0000, /* R18376 */
+ 0x0000, /* R18377 */
+ 0x0000, /* R18378 */
+ 0x0000, /* R18379 */
+ 0x0000, /* R18380 */
+ 0x0000, /* R18381 */
+ 0x0000, /* R18382 */
+ 0x0000, /* R18383 */
+ 0x0000, /* R18384 */
+ 0x0000, /* R18385 */
+ 0x0000, /* R18386 */
+ 0x0000, /* R18387 */
+ 0x0000, /* R18388 */
+ 0x0000, /* R18389 */
+ 0x0000, /* R18390 */
+ 0x0000, /* R18391 */
+ 0x0000, /* R18392 */
+ 0x0000, /* R18393 */
+ 0x0000, /* R18394 */
+ 0x0000, /* R18395 */
+ 0x0000, /* R18396 */
+ 0x0000, /* R18397 */
+ 0x0000, /* R18398 */
+ 0x0000, /* R18399 */
+ 0x0000, /* R18400 */
+ 0x0000, /* R18401 */
+ 0x0000, /* R18402 */
+ 0x0000, /* R18403 */
+ 0x0000, /* R18404 */
+ 0x0000, /* R18405 */
+ 0x0000, /* R18406 */
+ 0x0000, /* R18407 */
+ 0x0000, /* R18408 */
+ 0x0000, /* R18409 */
+ 0x0000, /* R18410 */
+ 0x0000, /* R18411 */
+ 0x0000, /* R18412 */
+ 0x0000, /* R18413 */
+ 0x0000, /* R18414 */
+ 0x0000, /* R18415 */
+ 0x0000, /* R18416 */
+ 0x0000, /* R18417 */
+ 0x0000, /* R18418 */
+ 0x0000, /* R18419 */
+ 0x0000, /* R18420 */
+ 0x0000, /* R18421 */
+ 0x0000, /* R18422 */
+ 0x0000, /* R18423 */
+ 0x0000, /* R18424 */
+ 0x0000, /* R18425 */
+ 0x0000, /* R18426 */
+ 0x0000, /* R18427 */
+ 0x0000, /* R18428 */
+ 0x0000, /* R18429 */
+ 0x0000, /* R18430 */
+ 0x0000, /* R18431 */
+ 0x0020, /* R18432 - RETUNEADC_PG2_1 */
+ 0x0000, /* R18433 - RETUNEADC_PG2_0 */
+ 0x0040, /* R18434 - RETUNEADC_PG_1 */
+ 0x0000, /* R18435 - RETUNEADC_PG_0 */
+ 0x0000, /* R18436 */
+ 0x0000, /* R18437 */
+ 0x0000, /* R18438 */
+ 0x0000, /* R18439 */
+ 0x0000, /* R18440 */
+ 0x0000, /* R18441 */
+ 0x0000, /* R18442 */
+ 0x0000, /* R18443 */
+ 0x0000, /* R18444 */
+ 0x0000, /* R18445 */
+ 0x0000, /* R18446 */
+ 0x0000, /* R18447 */
+ 0x0000, /* R18448 */
+ 0x0000, /* R18449 */
+ 0x0000, /* R18450 */
+ 0x0000, /* R18451 */
+ 0x0000, /* R18452 */
+ 0x0000, /* R18453 */
+ 0x0000, /* R18454 */
+ 0x0000, /* R18455 */
+ 0x0000, /* R18456 */
+ 0x0000, /* R18457 */
+ 0x0000, /* R18458 */
+ 0x0000, /* R18459 */
+ 0x0000, /* R18460 */
+ 0x0000, /* R18461 */
+ 0x0000, /* R18462 */
+ 0x0000, /* R18463 */
+ 0x0000, /* R18464 */
+ 0x0000, /* R18465 */
+ 0x0000, /* R18466 */
+ 0x0000, /* R18467 */
+ 0x0000, /* R18468 */
+ 0x0000, /* R18469 */
+ 0x0000, /* R18470 */
+ 0x0000, /* R18471 */
+ 0x0000, /* R18472 */
+ 0x0000, /* R18473 */
+ 0x0000, /* R18474 */
+ 0x0000, /* R18475 */
+ 0x0000, /* R18476 */
+ 0x0000, /* R18477 */
+ 0x0000, /* R18478 */
+ 0x0000, /* R18479 */
+ 0x0000, /* R18480 */
+ 0x0000, /* R18481 */
+ 0x0000, /* R18482 */
+ 0x0000, /* R18483 */
+ 0x0000, /* R18484 */
+ 0x0000, /* R18485 */
+ 0x0000, /* R18486 */
+ 0x0000, /* R18487 */
+ 0x0000, /* R18488 */
+ 0x0000, /* R18489 */
+ 0x0000, /* R18490 */
+ 0x0000, /* R18491 */
+ 0x0000, /* R18492 */
+ 0x0000, /* R18493 */
+ 0x0000, /* R18494 */
+ 0x0000, /* R18495 */
+ 0x0000, /* R18496 */
+ 0x0000, /* R18497 */
+ 0x0000, /* R18498 */
+ 0x0000, /* R18499 */
+ 0x0000, /* R18500 */
+ 0x0000, /* R18501 */
+ 0x0000, /* R18502 */
+ 0x0000, /* R18503 */
+ 0x0000, /* R18504 */
+ 0x0000, /* R18505 */
+ 0x0000, /* R18506 */
+ 0x0000, /* R18507 */
+ 0x0000, /* R18508 */
+ 0x0000, /* R18509 */
+ 0x0000, /* R18510 */
+ 0x0000, /* R18511 */
+ 0x0000, /* R18512 */
+ 0x0000, /* R18513 */
+ 0x0000, /* R18514 */
+ 0x0000, /* R18515 */
+ 0x0000, /* R18516 */
+ 0x0000, /* R18517 */
+ 0x0000, /* R18518 */
+ 0x0000, /* R18519 */
+ 0x0000, /* R18520 */
+ 0x0000, /* R18521 */
+ 0x0000, /* R18522 */
+ 0x0000, /* R18523 */
+ 0x0000, /* R18524 */
+ 0x0000, /* R18525 */
+ 0x0000, /* R18526 */
+ 0x0000, /* R18527 */
+ 0x0000, /* R18528 */
+ 0x0000, /* R18529 */
+ 0x0000, /* R18530 */
+ 0x0000, /* R18531 */
+ 0x0000, /* R18532 */
+ 0x0000, /* R18533 */
+ 0x0000, /* R18534 */
+ 0x0000, /* R18535 */
+ 0x0000, /* R18536 */
+ 0x0000, /* R18537 */
+ 0x0000, /* R18538 */
+ 0x0000, /* R18539 */
+ 0x0000, /* R18540 */
+ 0x0000, /* R18541 */
+ 0x0000, /* R18542 */
+ 0x0000, /* R18543 */
+ 0x0000, /* R18544 */
+ 0x0000, /* R18545 */
+ 0x0000, /* R18546 */
+ 0x0000, /* R18547 */
+ 0x0000, /* R18548 */
+ 0x0000, /* R18549 */
+ 0x0000, /* R18550 */
+ 0x0000, /* R18551 */
+ 0x0000, /* R18552 */
+ 0x0000, /* R18553 */
+ 0x0000, /* R18554 */
+ 0x0000, /* R18555 */
+ 0x0000, /* R18556 */
+ 0x0000, /* R18557 */
+ 0x0000, /* R18558 */
+ 0x0000, /* R18559 */
+ 0x0000, /* R18560 */
+ 0x0000, /* R18561 */
+ 0x0000, /* R18562 */
+ 0x0000, /* R18563 */
+ 0x0000, /* R18564 */
+ 0x0000, /* R18565 */
+ 0x0000, /* R18566 */
+ 0x0000, /* R18567 */
+ 0x0000, /* R18568 */
+ 0x0000, /* R18569 */
+ 0x0000, /* R18570 */
+ 0x0000, /* R18571 */
+ 0x0000, /* R18572 */
+ 0x0000, /* R18573 */
+ 0x0000, /* R18574 */
+ 0x0000, /* R18575 */
+ 0x0000, /* R18576 */
+ 0x0000, /* R18577 */
+ 0x0000, /* R18578 */
+ 0x0000, /* R18579 */
+ 0x0000, /* R18580 */
+ 0x0000, /* R18581 */
+ 0x0000, /* R18582 */
+ 0x0000, /* R18583 */
+ 0x0000, /* R18584 */
+ 0x0000, /* R18585 */
+ 0x0000, /* R18586 */
+ 0x0000, /* R18587 */
+ 0x0000, /* R18588 */
+ 0x0000, /* R18589 */
+ 0x0000, /* R18590 */
+ 0x0000, /* R18591 */
+ 0x0000, /* R18592 */
+ 0x0000, /* R18593 */
+ 0x0000, /* R18594 */
+ 0x0000, /* R18595 */
+ 0x0000, /* R18596 */
+ 0x0000, /* R18597 */
+ 0x0000, /* R18598 */
+ 0x0000, /* R18599 */
+ 0x0000, /* R18600 */
+ 0x0000, /* R18601 */
+ 0x0000, /* R18602 */
+ 0x0000, /* R18603 */
+ 0x0000, /* R18604 */
+ 0x0000, /* R18605 */
+ 0x0000, /* R18606 */
+ 0x0000, /* R18607 */
+ 0x0000, /* R18608 */
+ 0x0000, /* R18609 */
+ 0x0000, /* R18610 */
+ 0x0000, /* R18611 */
+ 0x0000, /* R18612 */
+ 0x0000, /* R18613 */
+ 0x0000, /* R18614 */
+ 0x0000, /* R18615 */
+ 0x0000, /* R18616 */
+ 0x0000, /* R18617 */
+ 0x0000, /* R18618 */
+ 0x0000, /* R18619 */
+ 0x0000, /* R18620 */
+ 0x0000, /* R18621 */
+ 0x0000, /* R18622 */
+ 0x0000, /* R18623 */
+ 0x0000, /* R18624 */
+ 0x0000, /* R18625 */
+ 0x0000, /* R18626 */
+ 0x0000, /* R18627 */
+ 0x0000, /* R18628 */
+ 0x0000, /* R18629 */
+ 0x0000, /* R18630 */
+ 0x0000, /* R18631 */
+ 0x0000, /* R18632 */
+ 0x0000, /* R18633 */
+ 0x0000, /* R18634 */
+ 0x0000, /* R18635 */
+ 0x0000, /* R18636 */
+ 0x0000, /* R18637 */
+ 0x0000, /* R18638 */
+ 0x0000, /* R18639 */
+ 0x0000, /* R18640 */
+ 0x0000, /* R18641 */
+ 0x0000, /* R18642 */
+ 0x0000, /* R18643 */
+ 0x0000, /* R18644 */
+ 0x0000, /* R18645 */
+ 0x0000, /* R18646 */
+ 0x0000, /* R18647 */
+ 0x0000, /* R18648 */
+ 0x0000, /* R18649 */
+ 0x0000, /* R18650 */
+ 0x0000, /* R18651 */
+ 0x0000, /* R18652 */
+ 0x0000, /* R18653 */
+ 0x0000, /* R18654 */
+ 0x0000, /* R18655 */
+ 0x0000, /* R18656 */
+ 0x0000, /* R18657 */
+ 0x0000, /* R18658 */
+ 0x0000, /* R18659 */
+ 0x0000, /* R18660 */
+ 0x0000, /* R18661 */
+ 0x0000, /* R18662 */
+ 0x0000, /* R18663 */
+ 0x0000, /* R18664 */
+ 0x0000, /* R18665 */
+ 0x0000, /* R18666 */
+ 0x0000, /* R18667 */
+ 0x0000, /* R18668 */
+ 0x0000, /* R18669 */
+ 0x0000, /* R18670 */
+ 0x0000, /* R18671 */
+ 0x0000, /* R18672 */
+ 0x0000, /* R18673 */
+ 0x0000, /* R18674 */
+ 0x0000, /* R18675 */
+ 0x0000, /* R18676 */
+ 0x0000, /* R18677 */
+ 0x0000, /* R18678 */
+ 0x0000, /* R18679 */
+ 0x0000, /* R18680 */
+ 0x0000, /* R18681 */
+ 0x0000, /* R18682 */
+ 0x0000, /* R18683 */
+ 0x0000, /* R18684 */
+ 0x0000, /* R18685 */
+ 0x0000, /* R18686 */
+ 0x0000, /* R18687 */
+ 0x0000, /* R18688 */
+ 0x0000, /* R18689 */
+ 0x0000, /* R18690 */
+ 0x0000, /* R18691 */
+ 0x0000, /* R18692 */
+ 0x0000, /* R18693 */
+ 0x0000, /* R18694 */
+ 0x0000, /* R18695 */
+ 0x0000, /* R18696 */
+ 0x0000, /* R18697 */
+ 0x0000, /* R18698 */
+ 0x0000, /* R18699 */
+ 0x0000, /* R18700 */
+ 0x0000, /* R18701 */
+ 0x0000, /* R18702 */
+ 0x0000, /* R18703 */
+ 0x0000, /* R18704 */
+ 0x0000, /* R18705 */
+ 0x0000, /* R18706 */
+ 0x0000, /* R18707 */
+ 0x0000, /* R18708 */
+ 0x0000, /* R18709 */
+ 0x0000, /* R18710 */
+ 0x0000, /* R18711 */
+ 0x0000, /* R18712 */
+ 0x0000, /* R18713 */
+ 0x0000, /* R18714 */
+ 0x0000, /* R18715 */
+ 0x0000, /* R18716 */
+ 0x0000, /* R18717 */
+ 0x0000, /* R18718 */
+ 0x0000, /* R18719 */
+ 0x0000, /* R18720 */
+ 0x0000, /* R18721 */
+ 0x0000, /* R18722 */
+ 0x0000, /* R18723 */
+ 0x0000, /* R18724 */
+ 0x0000, /* R18725 */
+ 0x0000, /* R18726 */
+ 0x0000, /* R18727 */
+ 0x0000, /* R18728 */
+ 0x0000, /* R18729 */
+ 0x0000, /* R18730 */
+ 0x0000, /* R18731 */
+ 0x0000, /* R18732 */
+ 0x0000, /* R18733 */
+ 0x0000, /* R18734 */
+ 0x0000, /* R18735 */
+ 0x0000, /* R18736 */
+ 0x0000, /* R18737 */
+ 0x0000, /* R18738 */
+ 0x0000, /* R18739 */
+ 0x0000, /* R18740 */
+ 0x0000, /* R18741 */
+ 0x0000, /* R18742 */
+ 0x0000, /* R18743 */
+ 0x0000, /* R18744 */
+ 0x0000, /* R18745 */
+ 0x0000, /* R18746 */
+ 0x0000, /* R18747 */
+ 0x0000, /* R18748 */
+ 0x0000, /* R18749 */
+ 0x0000, /* R18750 */
+ 0x0000, /* R18751 */
+ 0x0000, /* R18752 */
+ 0x0000, /* R18753 */
+ 0x0000, /* R18754 */
+ 0x0000, /* R18755 */
+ 0x0000, /* R18756 */
+ 0x0000, /* R18757 */
+ 0x0000, /* R18758 */
+ 0x0000, /* R18759 */
+ 0x0000, /* R18760 */
+ 0x0000, /* R18761 */
+ 0x0000, /* R18762 */
+ 0x0000, /* R18763 */
+ 0x0000, /* R18764 */
+ 0x0000, /* R18765 */
+ 0x0000, /* R18766 */
+ 0x0000, /* R18767 */
+ 0x0000, /* R18768 */
+ 0x0000, /* R18769 */
+ 0x0000, /* R18770 */
+ 0x0000, /* R18771 */
+ 0x0000, /* R18772 */
+ 0x0000, /* R18773 */
+ 0x0000, /* R18774 */
+ 0x0000, /* R18775 */
+ 0x0000, /* R18776 */
+ 0x0000, /* R18777 */
+ 0x0000, /* R18778 */
+ 0x0000, /* R18779 */
+ 0x0000, /* R18780 */
+ 0x0000, /* R18781 */
+ 0x0000, /* R18782 */
+ 0x0000, /* R18783 */
+ 0x0000, /* R18784 */
+ 0x0000, /* R18785 */
+ 0x0000, /* R18786 */
+ 0x0000, /* R18787 */
+ 0x0000, /* R18788 */
+ 0x0000, /* R18789 */
+ 0x0000, /* R18790 */
+ 0x0000, /* R18791 */
+ 0x0000, /* R18792 */
+ 0x0000, /* R18793 */
+ 0x0000, /* R18794 */
+ 0x0000, /* R18795 */
+ 0x0000, /* R18796 */
+ 0x0000, /* R18797 */
+ 0x0000, /* R18798 */
+ 0x0000, /* R18799 */
+ 0x0000, /* R18800 */
+ 0x0000, /* R18801 */
+ 0x0000, /* R18802 */
+ 0x0000, /* R18803 */
+ 0x0000, /* R18804 */
+ 0x0000, /* R18805 */
+ 0x0000, /* R18806 */
+ 0x0000, /* R18807 */
+ 0x0000, /* R18808 */
+ 0x0000, /* R18809 */
+ 0x0000, /* R18810 */
+ 0x0000, /* R18811 */
+ 0x0000, /* R18812 */
+ 0x0000, /* R18813 */
+ 0x0000, /* R18814 */
+ 0x0000, /* R18815 */
+ 0x0000, /* R18816 */
+ 0x0000, /* R18817 */
+ 0x0000, /* R18818 */
+ 0x0000, /* R18819 */
+ 0x0000, /* R18820 */
+ 0x0000, /* R18821 */
+ 0x0000, /* R18822 */
+ 0x0000, /* R18823 */
+ 0x0000, /* R18824 */
+ 0x0000, /* R18825 */
+ 0x0000, /* R18826 */
+ 0x0000, /* R18827 */
+ 0x0000, /* R18828 */
+ 0x0000, /* R18829 */
+ 0x0000, /* R18830 */
+ 0x0000, /* R18831 */
+ 0x0000, /* R18832 */
+ 0x0000, /* R18833 */
+ 0x0000, /* R18834 */
+ 0x0000, /* R18835 */
+ 0x0000, /* R18836 */
+ 0x0000, /* R18837 */
+ 0x0000, /* R18838 */
+ 0x0000, /* R18839 */
+ 0x0000, /* R18840 */
+ 0x0000, /* R18841 */
+ 0x0000, /* R18842 */
+ 0x0000, /* R18843 */
+ 0x0000, /* R18844 */
+ 0x0000, /* R18845 */
+ 0x0000, /* R18846 */
+ 0x0000, /* R18847 */
+ 0x0000, /* R18848 */
+ 0x0000, /* R18849 */
+ 0x0000, /* R18850 */
+ 0x0000, /* R18851 */
+ 0x0000, /* R18852 */
+ 0x0000, /* R18853 */
+ 0x0000, /* R18854 */
+ 0x0000, /* R18855 */
+ 0x0000, /* R18856 */
+ 0x0000, /* R18857 */
+ 0x0000, /* R18858 */
+ 0x0000, /* R18859 */
+ 0x0000, /* R18860 */
+ 0x0000, /* R18861 */
+ 0x0000, /* R18862 */
+ 0x0000, /* R18863 */
+ 0x0000, /* R18864 */
+ 0x0000, /* R18865 */
+ 0x0000, /* R18866 */
+ 0x0000, /* R18867 */
+ 0x0000, /* R18868 */
+ 0x0000, /* R18869 */
+ 0x0000, /* R18870 */
+ 0x0000, /* R18871 */
+ 0x0000, /* R18872 */
+ 0x0000, /* R18873 */
+ 0x0000, /* R18874 */
+ 0x0000, /* R18875 */
+ 0x0000, /* R18876 */
+ 0x0000, /* R18877 */
+ 0x0000, /* R18878 */
+ 0x0000, /* R18879 */
+ 0x0000, /* R18880 */
+ 0x0000, /* R18881 */
+ 0x0000, /* R18882 */
+ 0x0000, /* R18883 */
+ 0x0000, /* R18884 */
+ 0x0000, /* R18885 */
+ 0x0000, /* R18886 */
+ 0x0000, /* R18887 */
+ 0x0000, /* R18888 */
+ 0x0000, /* R18889 */
+ 0x0000, /* R18890 */
+ 0x0000, /* R18891 */
+ 0x0000, /* R18892 */
+ 0x0000, /* R18893 */
+ 0x0000, /* R18894 */
+ 0x0000, /* R18895 */
+ 0x0000, /* R18896 */
+ 0x0000, /* R18897 */
+ 0x0000, /* R18898 */
+ 0x0000, /* R18899 */
+ 0x0000, /* R18900 */
+ 0x0000, /* R18901 */
+ 0x0000, /* R18902 */
+ 0x0000, /* R18903 */
+ 0x0000, /* R18904 */
+ 0x0000, /* R18905 */
+ 0x0000, /* R18906 */
+ 0x0000, /* R18907 */
+ 0x0000, /* R18908 */
+ 0x0000, /* R18909 */
+ 0x0000, /* R18910 */
+ 0x0000, /* R18911 */
+ 0x0000, /* R18912 */
+ 0x0000, /* R18913 */
+ 0x0000, /* R18914 */
+ 0x0000, /* R18915 */
+ 0x0000, /* R18916 */
+ 0x0000, /* R18917 */
+ 0x0000, /* R18918 */
+ 0x0000, /* R18919 */
+ 0x0000, /* R18920 */
+ 0x0000, /* R18921 */
+ 0x0000, /* R18922 */
+ 0x0000, /* R18923 */
+ 0x0000, /* R18924 */
+ 0x0000, /* R18925 */
+ 0x0000, /* R18926 */
+ 0x0000, /* R18927 */
+ 0x0000, /* R18928 */
+ 0x0000, /* R18929 */
+ 0x0000, /* R18930 */
+ 0x0000, /* R18931 */
+ 0x0000, /* R18932 */
+ 0x0000, /* R18933 */
+ 0x0000, /* R18934 */
+ 0x0000, /* R18935 */
+ 0x0000, /* R18936 */
+ 0x0000, /* R18937 */
+ 0x0000, /* R18938 */
+ 0x0000, /* R18939 */
+ 0x0000, /* R18940 */
+ 0x0000, /* R18941 */
+ 0x0000, /* R18942 */
+ 0x0000, /* R18943 */
+ 0x007F, /* R18944 - ADCR_RETUNE_C1_1 */
+ 0xFFFF, /* R18945 - ADCR_RETUNE_C1_0 */
+ 0x0000, /* R18946 - ADCR_RETUNE_C2_1 */
+ 0x0000, /* R18947 - ADCR_RETUNE_C2_0 */
+ 0x0000, /* R18948 - ADCR_RETUNE_C3_1 */
+ 0x0000, /* R18949 - ADCR_RETUNE_C3_0 */
+ 0x0000, /* R18950 - ADCR_RETUNE_C4_1 */
+ 0x0000, /* R18951 - ADCR_RETUNE_C4_0 */
+ 0x0000, /* R18952 - ADCR_RETUNE_C5_1 */
+ 0x0000, /* R18953 - ADCR_RETUNE_C5_0 */
+ 0x0000, /* R18954 - ADCR_RETUNE_C6_1 */
+ 0x0000, /* R18955 - ADCR_RETUNE_C6_0 */
+ 0x0000, /* R18956 - ADCR_RETUNE_C7_1 */
+ 0x0000, /* R18957 - ADCR_RETUNE_C7_0 */
+ 0x0000, /* R18958 - ADCR_RETUNE_C8_1 */
+ 0x0000, /* R18959 - ADCR_RETUNE_C8_0 */
+ 0x0000, /* R18960 - ADCR_RETUNE_C9_1 */
+ 0x0000, /* R18961 - ADCR_RETUNE_C9_0 */
+ 0x0000, /* R18962 - ADCR_RETUNE_C10_1 */
+ 0x0000, /* R18963 - ADCR_RETUNE_C10_0 */
+ 0x0000, /* R18964 - ADCR_RETUNE_C11_1 */
+ 0x0000, /* R18965 - ADCR_RETUNE_C11_0 */
+ 0x0000, /* R18966 - ADCR_RETUNE_C12_1 */
+ 0x0000, /* R18967 - ADCR_RETUNE_C12_0 */
+ 0x0000, /* R18968 - ADCR_RETUNE_C13_1 */
+ 0x0000, /* R18969 - ADCR_RETUNE_C13_0 */
+ 0x0000, /* R18970 - ADCR_RETUNE_C14_1 */
+ 0x0000, /* R18971 - ADCR_RETUNE_C14_0 */
+ 0x0000, /* R18972 - ADCR_RETUNE_C15_1 */
+ 0x0000, /* R18973 - ADCR_RETUNE_C15_0 */
+ 0x0000, /* R18974 - ADCR_RETUNE_C16_1 */
+ 0x0000, /* R18975 - ADCR_RETUNE_C16_0 */
+ 0x0000, /* R18976 - ADCR_RETUNE_C17_1 */
+ 0x0000, /* R18977 - ADCR_RETUNE_C17_0 */
+ 0x0000, /* R18978 - ADCR_RETUNE_C18_1 */
+ 0x0000, /* R18979 - ADCR_RETUNE_C18_0 */
+ 0x0000, /* R18980 - ADCR_RETUNE_C19_1 */
+ 0x0000, /* R18981 - ADCR_RETUNE_C19_0 */
+ 0x0000, /* R18982 - ADCR_RETUNE_C20_1 */
+ 0x0000, /* R18983 - ADCR_RETUNE_C20_0 */
+ 0x0000, /* R18984 - ADCR_RETUNE_C21_1 */
+ 0x0000, /* R18985 - ADCR_RETUNE_C21_0 */
+ 0x0000, /* R18986 - ADCR_RETUNE_C22_1 */
+ 0x0000, /* R18987 - ADCR_RETUNE_C22_0 */
+ 0x0000, /* R18988 - ADCR_RETUNE_C23_1 */
+ 0x0000, /* R18989 - ADCR_RETUNE_C23_0 */
+ 0x0000, /* R18990 - ADCR_RETUNE_C24_1 */
+ 0x0000, /* R18991 - ADCR_RETUNE_C24_0 */
+ 0x0000, /* R18992 - ADCR_RETUNE_C25_1 */
+ 0x0000, /* R18993 - ADCR_RETUNE_C25_0 */
+ 0x0000, /* R18994 - ADCR_RETUNE_C26_1 */
+ 0x0000, /* R18995 - ADCR_RETUNE_C26_0 */
+ 0x0000, /* R18996 - ADCR_RETUNE_C27_1 */
+ 0x0000, /* R18997 - ADCR_RETUNE_C27_0 */
+ 0x0000, /* R18998 - ADCR_RETUNE_C28_1 */
+ 0x0000, /* R18999 - ADCR_RETUNE_C28_0 */
+ 0x0000, /* R19000 - ADCR_RETUNE_C29_1 */
+ 0x0000, /* R19001 - ADCR_RETUNE_C29_0 */
+ 0x0000, /* R19002 - ADCR_RETUNE_C30_1 */
+ 0x0000, /* R19003 - ADCR_RETUNE_C30_0 */
+ 0x0000, /* R19004 - ADCR_RETUNE_C31_1 */
+ 0x0000, /* R19005 - ADCR_RETUNE_C31_0 */
+ 0x0000, /* R19006 - ADCR_RETUNE_C32_1 */
+ 0x0000, /* R19007 - ADCR_RETUNE_C32_0 */
+ 0x0000, /* R19008 */
+ 0x0000, /* R19009 */
+ 0x0000, /* R19010 */
+ 0x0000, /* R19011 */
+ 0x0000, /* R19012 */
+ 0x0000, /* R19013 */
+ 0x0000, /* R19014 */
+ 0x0000, /* R19015 */
+ 0x0000, /* R19016 */
+ 0x0000, /* R19017 */
+ 0x0000, /* R19018 */
+ 0x0000, /* R19019 */
+ 0x0000, /* R19020 */
+ 0x0000, /* R19021 */
+ 0x0000, /* R19022 */
+ 0x0000, /* R19023 */
+ 0x0000, /* R19024 */
+ 0x0000, /* R19025 */
+ 0x0000, /* R19026 */
+ 0x0000, /* R19027 */
+ 0x0000, /* R19028 */
+ 0x0000, /* R19029 */
+ 0x0000, /* R19030 */
+ 0x0000, /* R19031 */
+ 0x0000, /* R19032 */
+ 0x0000, /* R19033 */
+ 0x0000, /* R19034 */
+ 0x0000, /* R19035 */
+ 0x0000, /* R19036 */
+ 0x0000, /* R19037 */
+ 0x0000, /* R19038 */
+ 0x0000, /* R19039 */
+ 0x0000, /* R19040 */
+ 0x0000, /* R19041 */
+ 0x0000, /* R19042 */
+ 0x0000, /* R19043 */
+ 0x0000, /* R19044 */
+ 0x0000, /* R19045 */
+ 0x0000, /* R19046 */
+ 0x0000, /* R19047 */
+ 0x0000, /* R19048 */
+ 0x0000, /* R19049 */
+ 0x0000, /* R19050 */
+ 0x0000, /* R19051 */
+ 0x0000, /* R19052 */
+ 0x0000, /* R19053 */
+ 0x0000, /* R19054 */
+ 0x0000, /* R19055 */
+ 0x0000, /* R19056 */
+ 0x0000, /* R19057 */
+ 0x0000, /* R19058 */
+ 0x0000, /* R19059 */
+ 0x0000, /* R19060 */
+ 0x0000, /* R19061 */
+ 0x0000, /* R19062 */
+ 0x0000, /* R19063 */
+ 0x0000, /* R19064 */
+ 0x0000, /* R19065 */
+ 0x0000, /* R19066 */
+ 0x0000, /* R19067 */
+ 0x0000, /* R19068 */
+ 0x0000, /* R19069 */
+ 0x0000, /* R19070 */
+ 0x0000, /* R19071 */
+ 0x0000, /* R19072 */
+ 0x0000, /* R19073 */
+ 0x0000, /* R19074 */
+ 0x0000, /* R19075 */
+ 0x0000, /* R19076 */
+ 0x0000, /* R19077 */
+ 0x0000, /* R19078 */
+ 0x0000, /* R19079 */
+ 0x0000, /* R19080 */
+ 0x0000, /* R19081 */
+ 0x0000, /* R19082 */
+ 0x0000, /* R19083 */
+ 0x0000, /* R19084 */
+ 0x0000, /* R19085 */
+ 0x0000, /* R19086 */
+ 0x0000, /* R19087 */
+ 0x0000, /* R19088 */
+ 0x0000, /* R19089 */
+ 0x0000, /* R19090 */
+ 0x0000, /* R19091 */
+ 0x0000, /* R19092 */
+ 0x0000, /* R19093 */
+ 0x0000, /* R19094 */
+ 0x0000, /* R19095 */
+ 0x0000, /* R19096 */
+ 0x0000, /* R19097 */
+ 0x0000, /* R19098 */
+ 0x0000, /* R19099 */
+ 0x0000, /* R19100 */
+ 0x0000, /* R19101 */
+ 0x0000, /* R19102 */
+ 0x0000, /* R19103 */
+ 0x0000, /* R19104 */
+ 0x0000, /* R19105 */
+ 0x0000, /* R19106 */
+ 0x0000, /* R19107 */
+ 0x0000, /* R19108 */
+ 0x0000, /* R19109 */
+ 0x0000, /* R19110 */
+ 0x0000, /* R19111 */
+ 0x0000, /* R19112 */
+ 0x0000, /* R19113 */
+ 0x0000, /* R19114 */
+ 0x0000, /* R19115 */
+ 0x0000, /* R19116 */
+ 0x0000, /* R19117 */
+ 0x0000, /* R19118 */
+ 0x0000, /* R19119 */
+ 0x0000, /* R19120 */
+ 0x0000, /* R19121 */
+ 0x0000, /* R19122 */
+ 0x0000, /* R19123 */
+ 0x0000, /* R19124 */
+ 0x0000, /* R19125 */
+ 0x0000, /* R19126 */
+ 0x0000, /* R19127 */
+ 0x0000, /* R19128 */
+ 0x0000, /* R19129 */
+ 0x0000, /* R19130 */
+ 0x0000, /* R19131 */
+ 0x0000, /* R19132 */
+ 0x0000, /* R19133 */
+ 0x0000, /* R19134 */
+ 0x0000, /* R19135 */
+ 0x0000, /* R19136 */
+ 0x0000, /* R19137 */
+ 0x0000, /* R19138 */
+ 0x0000, /* R19139 */
+ 0x0000, /* R19140 */
+ 0x0000, /* R19141 */
+ 0x0000, /* R19142 */
+ 0x0000, /* R19143 */
+ 0x0000, /* R19144 */
+ 0x0000, /* R19145 */
+ 0x0000, /* R19146 */
+ 0x0000, /* R19147 */
+ 0x0000, /* R19148 */
+ 0x0000, /* R19149 */
+ 0x0000, /* R19150 */
+ 0x0000, /* R19151 */
+ 0x0000, /* R19152 */
+ 0x0000, /* R19153 */
+ 0x0000, /* R19154 */
+ 0x0000, /* R19155 */
+ 0x0000, /* R19156 */
+ 0x0000, /* R19157 */
+ 0x0000, /* R19158 */
+ 0x0000, /* R19159 */
+ 0x0000, /* R19160 */
+ 0x0000, /* R19161 */
+ 0x0000, /* R19162 */
+ 0x0000, /* R19163 */
+ 0x0000, /* R19164 */
+ 0x0000, /* R19165 */
+ 0x0000, /* R19166 */
+ 0x0000, /* R19167 */
+ 0x0000, /* R19168 */
+ 0x0000, /* R19169 */
+ 0x0000, /* R19170 */
+ 0x0000, /* R19171 */
+ 0x0000, /* R19172 */
+ 0x0000, /* R19173 */
+ 0x0000, /* R19174 */
+ 0x0000, /* R19175 */
+ 0x0000, /* R19176 */
+ 0x0000, /* R19177 */
+ 0x0000, /* R19178 */
+ 0x0000, /* R19179 */
+ 0x0000, /* R19180 */
+ 0x0000, /* R19181 */
+ 0x0000, /* R19182 */
+ 0x0000, /* R19183 */
+ 0x0000, /* R19184 */
+ 0x0000, /* R19185 */
+ 0x0000, /* R19186 */
+ 0x0000, /* R19187 */
+ 0x0000, /* R19188 */
+ 0x0000, /* R19189 */
+ 0x0000, /* R19190 */
+ 0x0000, /* R19191 */
+ 0x0000, /* R19192 */
+ 0x0000, /* R19193 */
+ 0x0000, /* R19194 */
+ 0x0000, /* R19195 */
+ 0x0000, /* R19196 */
+ 0x0000, /* R19197 */
+ 0x0000, /* R19198 */
+ 0x0000, /* R19199 */
+ 0x0000, /* R19200 */
+ 0x0000, /* R19201 */
+ 0x0000, /* R19202 */
+ 0x0000, /* R19203 */
+ 0x0000, /* R19204 */
+ 0x0000, /* R19205 */
+ 0x0000, /* R19206 */
+ 0x0000, /* R19207 */
+ 0x0000, /* R19208 */
+ 0x0000, /* R19209 */
+ 0x0000, /* R19210 */
+ 0x0000, /* R19211 */
+ 0x0000, /* R19212 */
+ 0x0000, /* R19213 */
+ 0x0000, /* R19214 */
+ 0x0000, /* R19215 */
+ 0x0000, /* R19216 */
+ 0x0000, /* R19217 */
+ 0x0000, /* R19218 */
+ 0x0000, /* R19219 */
+ 0x0000, /* R19220 */
+ 0x0000, /* R19221 */
+ 0x0000, /* R19222 */
+ 0x0000, /* R19223 */
+ 0x0000, /* R19224 */
+ 0x0000, /* R19225 */
+ 0x0000, /* R19226 */
+ 0x0000, /* R19227 */
+ 0x0000, /* R19228 */
+ 0x0000, /* R19229 */
+ 0x0000, /* R19230 */
+ 0x0000, /* R19231 */
+ 0x0000, /* R19232 */
+ 0x0000, /* R19233 */
+ 0x0000, /* R19234 */
+ 0x0000, /* R19235 */
+ 0x0000, /* R19236 */
+ 0x0000, /* R19237 */
+ 0x0000, /* R19238 */
+ 0x0000, /* R19239 */
+ 0x0000, /* R19240 */
+ 0x0000, /* R19241 */
+ 0x0000, /* R19242 */
+ 0x0000, /* R19243 */
+ 0x0000, /* R19244 */
+ 0x0000, /* R19245 */
+ 0x0000, /* R19246 */
+ 0x0000, /* R19247 */
+ 0x0000, /* R19248 */
+ 0x0000, /* R19249 */
+ 0x0000, /* R19250 */
+ 0x0000, /* R19251 */
+ 0x0000, /* R19252 */
+ 0x0000, /* R19253 */
+ 0x0000, /* R19254 */
+ 0x0000, /* R19255 */
+ 0x0000, /* R19256 */
+ 0x0000, /* R19257 */
+ 0x0000, /* R19258 */
+ 0x0000, /* R19259 */
+ 0x0000, /* R19260 */
+ 0x0000, /* R19261 */
+ 0x0000, /* R19262 */
+ 0x0000, /* R19263 */
+ 0x0000, /* R19264 */
+ 0x0000, /* R19265 */
+ 0x0000, /* R19266 */
+ 0x0000, /* R19267 */
+ 0x0000, /* R19268 */
+ 0x0000, /* R19269 */
+ 0x0000, /* R19270 */
+ 0x0000, /* R19271 */
+ 0x0000, /* R19272 */
+ 0x0000, /* R19273 */
+ 0x0000, /* R19274 */
+ 0x0000, /* R19275 */
+ 0x0000, /* R19276 */
+ 0x0000, /* R19277 */
+ 0x0000, /* R19278 */
+ 0x0000, /* R19279 */
+ 0x0000, /* R19280 */
+ 0x0000, /* R19281 */
+ 0x0000, /* R19282 */
+ 0x0000, /* R19283 */
+ 0x0000, /* R19284 */
+ 0x0000, /* R19285 */
+ 0x0000, /* R19286 */
+ 0x0000, /* R19287 */
+ 0x0000, /* R19288 */
+ 0x0000, /* R19289 */
+ 0x0000, /* R19290 */
+ 0x0000, /* R19291 */
+ 0x0000, /* R19292 */
+ 0x0000, /* R19293 */
+ 0x0000, /* R19294 */
+ 0x0000, /* R19295 */
+ 0x0000, /* R19296 */
+ 0x0000, /* R19297 */
+ 0x0000, /* R19298 */
+ 0x0000, /* R19299 */
+ 0x0000, /* R19300 */
+ 0x0000, /* R19301 */
+ 0x0000, /* R19302 */
+ 0x0000, /* R19303 */
+ 0x0000, /* R19304 */
+ 0x0000, /* R19305 */
+ 0x0000, /* R19306 */
+ 0x0000, /* R19307 */
+ 0x0000, /* R19308 */
+ 0x0000, /* R19309 */
+ 0x0000, /* R19310 */
+ 0x0000, /* R19311 */
+ 0x0000, /* R19312 */
+ 0x0000, /* R19313 */
+ 0x0000, /* R19314 */
+ 0x0000, /* R19315 */
+ 0x0000, /* R19316 */
+ 0x0000, /* R19317 */
+ 0x0000, /* R19318 */
+ 0x0000, /* R19319 */
+ 0x0000, /* R19320 */
+ 0x0000, /* R19321 */
+ 0x0000, /* R19322 */
+ 0x0000, /* R19323 */
+ 0x0000, /* R19324 */
+ 0x0000, /* R19325 */
+ 0x0000, /* R19326 */
+ 0x0000, /* R19327 */
+ 0x0000, /* R19328 */
+ 0x0000, /* R19329 */
+ 0x0000, /* R19330 */
+ 0x0000, /* R19331 */
+ 0x0000, /* R19332 */
+ 0x0000, /* R19333 */
+ 0x0000, /* R19334 */
+ 0x0000, /* R19335 */
+ 0x0000, /* R19336 */
+ 0x0000, /* R19337 */
+ 0x0000, /* R19338 */
+ 0x0000, /* R19339 */
+ 0x0000, /* R19340 */
+ 0x0000, /* R19341 */
+ 0x0000, /* R19342 */
+ 0x0000, /* R19343 */
+ 0x0000, /* R19344 */
+ 0x0000, /* R19345 */
+ 0x0000, /* R19346 */
+ 0x0000, /* R19347 */
+ 0x0000, /* R19348 */
+ 0x0000, /* R19349 */
+ 0x0000, /* R19350 */
+ 0x0000, /* R19351 */
+ 0x0000, /* R19352 */
+ 0x0000, /* R19353 */
+ 0x0000, /* R19354 */
+ 0x0000, /* R19355 */
+ 0x0000, /* R19356 */
+ 0x0000, /* R19357 */
+ 0x0000, /* R19358 */
+ 0x0000, /* R19359 */
+ 0x0000, /* R19360 */
+ 0x0000, /* R19361 */
+ 0x0000, /* R19362 */
+ 0x0000, /* R19363 */
+ 0x0000, /* R19364 */
+ 0x0000, /* R19365 */
+ 0x0000, /* R19366 */
+ 0x0000, /* R19367 */
+ 0x0000, /* R19368 */
+ 0x0000, /* R19369 */
+ 0x0000, /* R19370 */
+ 0x0000, /* R19371 */
+ 0x0000, /* R19372 */
+ 0x0000, /* R19373 */
+ 0x0000, /* R19374 */
+ 0x0000, /* R19375 */
+ 0x0000, /* R19376 */
+ 0x0000, /* R19377 */
+ 0x0000, /* R19378 */
+ 0x0000, /* R19379 */
+ 0x0000, /* R19380 */
+ 0x0000, /* R19381 */
+ 0x0000, /* R19382 */
+ 0x0000, /* R19383 */
+ 0x0000, /* R19384 */
+ 0x0000, /* R19385 */
+ 0x0000, /* R19386 */
+ 0x0000, /* R19387 */
+ 0x0000, /* R19388 */
+ 0x0000, /* R19389 */
+ 0x0000, /* R19390 */
+ 0x0000, /* R19391 */
+ 0x0000, /* R19392 */
+ 0x0000, /* R19393 */
+ 0x0000, /* R19394 */
+ 0x0000, /* R19395 */
+ 0x0000, /* R19396 */
+ 0x0000, /* R19397 */
+ 0x0000, /* R19398 */
+ 0x0000, /* R19399 */
+ 0x0000, /* R19400 */
+ 0x0000, /* R19401 */
+ 0x0000, /* R19402 */
+ 0x0000, /* R19403 */
+ 0x0000, /* R19404 */
+ 0x0000, /* R19405 */
+ 0x0000, /* R19406 */
+ 0x0000, /* R19407 */
+ 0x0000, /* R19408 */
+ 0x0000, /* R19409 */
+ 0x0000, /* R19410 */
+ 0x0000, /* R19411 */
+ 0x0000, /* R19412 */
+ 0x0000, /* R19413 */
+ 0x0000, /* R19414 */
+ 0x0000, /* R19415 */
+ 0x0000, /* R19416 */
+ 0x0000, /* R19417 */
+ 0x0000, /* R19418 */
+ 0x0000, /* R19419 */
+ 0x0000, /* R19420 */
+ 0x0000, /* R19421 */
+ 0x0000, /* R19422 */
+ 0x0000, /* R19423 */
+ 0x0000, /* R19424 */
+ 0x0000, /* R19425 */
+ 0x0000, /* R19426 */
+ 0x0000, /* R19427 */
+ 0x0000, /* R19428 */
+ 0x0000, /* R19429 */
+ 0x0000, /* R19430 */
+ 0x0000, /* R19431 */
+ 0x0000, /* R19432 */
+ 0x0000, /* R19433 */
+ 0x0000, /* R19434 */
+ 0x0000, /* R19435 */
+ 0x0000, /* R19436 */
+ 0x0000, /* R19437 */
+ 0x0000, /* R19438 */
+ 0x0000, /* R19439 */
+ 0x0000, /* R19440 */
+ 0x0000, /* R19441 */
+ 0x0000, /* R19442 */
+ 0x0000, /* R19443 */
+ 0x0000, /* R19444 */
+ 0x0000, /* R19445 */
+ 0x0000, /* R19446 */
+ 0x0000, /* R19447 */
+ 0x0000, /* R19448 */
+ 0x0000, /* R19449 */
+ 0x0000, /* R19450 */
+ 0x0000, /* R19451 */
+ 0x0000, /* R19452 */
+ 0x0000, /* R19453 */
+ 0x0000, /* R19454 */
+ 0x0000, /* R19455 */
+ 0x007F, /* R19456 - DACL_RETUNE_C1_1 */
+ 0xFFFF, /* R19457 - DACL_RETUNE_C1_0 */
+ 0x0000, /* R19458 - DACL_RETUNE_C2_1 */
+ 0x0000, /* R19459 - DACL_RETUNE_C2_0 */
+ 0x0000, /* R19460 - DACL_RETUNE_C3_1 */
+ 0x0000, /* R19461 - DACL_RETUNE_C3_0 */
+ 0x0000, /* R19462 - DACL_RETUNE_C4_1 */
+ 0x0000, /* R19463 - DACL_RETUNE_C4_0 */
+ 0x0000, /* R19464 - DACL_RETUNE_C5_1 */
+ 0x0000, /* R19465 - DACL_RETUNE_C5_0 */
+ 0x0000, /* R19466 - DACL_RETUNE_C6_1 */
+ 0x0000, /* R19467 - DACL_RETUNE_C6_0 */
+ 0x0000, /* R19468 - DACL_RETUNE_C7_1 */
+ 0x0000, /* R19469 - DACL_RETUNE_C7_0 */
+ 0x0000, /* R19470 - DACL_RETUNE_C8_1 */
+ 0x0000, /* R19471 - DACL_RETUNE_C8_0 */
+ 0x0000, /* R19472 - DACL_RETUNE_C9_1 */
+ 0x0000, /* R19473 - DACL_RETUNE_C9_0 */
+ 0x0000, /* R19474 - DACL_RETUNE_C10_1 */
+ 0x0000, /* R19475 - DACL_RETUNE_C10_0 */
+ 0x0000, /* R19476 - DACL_RETUNE_C11_1 */
+ 0x0000, /* R19477 - DACL_RETUNE_C11_0 */
+ 0x0000, /* R19478 - DACL_RETUNE_C12_1 */
+ 0x0000, /* R19479 - DACL_RETUNE_C12_0 */
+ 0x0000, /* R19480 - DACL_RETUNE_C13_1 */
+ 0x0000, /* R19481 - DACL_RETUNE_C13_0 */
+ 0x0000, /* R19482 - DACL_RETUNE_C14_1 */
+ 0x0000, /* R19483 - DACL_RETUNE_C14_0 */
+ 0x0000, /* R19484 - DACL_RETUNE_C15_1 */
+ 0x0000, /* R19485 - DACL_RETUNE_C15_0 */
+ 0x0000, /* R19486 - DACL_RETUNE_C16_1 */
+ 0x0000, /* R19487 - DACL_RETUNE_C16_0 */
+ 0x0000, /* R19488 - DACL_RETUNE_C17_1 */
+ 0x0000, /* R19489 - DACL_RETUNE_C17_0 */
+ 0x0000, /* R19490 - DACL_RETUNE_C18_1 */
+ 0x0000, /* R19491 - DACL_RETUNE_C18_0 */
+ 0x0000, /* R19492 - DACL_RETUNE_C19_1 */
+ 0x0000, /* R19493 - DACL_RETUNE_C19_0 */
+ 0x0000, /* R19494 - DACL_RETUNE_C20_1 */
+ 0x0000, /* R19495 - DACL_RETUNE_C20_0 */
+ 0x0000, /* R19496 - DACL_RETUNE_C21_1 */
+ 0x0000, /* R19497 - DACL_RETUNE_C21_0 */
+ 0x0000, /* R19498 - DACL_RETUNE_C22_1 */
+ 0x0000, /* R19499 - DACL_RETUNE_C22_0 */
+ 0x0000, /* R19500 - DACL_RETUNE_C23_1 */
+ 0x0000, /* R19501 - DACL_RETUNE_C23_0 */
+ 0x0000, /* R19502 - DACL_RETUNE_C24_1 */
+ 0x0000, /* R19503 - DACL_RETUNE_C24_0 */
+ 0x0000, /* R19504 - DACL_RETUNE_C25_1 */
+ 0x0000, /* R19505 - DACL_RETUNE_C25_0 */
+ 0x0000, /* R19506 - DACL_RETUNE_C26_1 */
+ 0x0000, /* R19507 - DACL_RETUNE_C26_0 */
+ 0x0000, /* R19508 - DACL_RETUNE_C27_1 */
+ 0x0000, /* R19509 - DACL_RETUNE_C27_0 */
+ 0x0000, /* R19510 - DACL_RETUNE_C28_1 */
+ 0x0000, /* R19511 - DACL_RETUNE_C28_0 */
+ 0x0000, /* R19512 - DACL_RETUNE_C29_1 */
+ 0x0000, /* R19513 - DACL_RETUNE_C29_0 */
+ 0x0000, /* R19514 - DACL_RETUNE_C30_1 */
+ 0x0000, /* R19515 - DACL_RETUNE_C30_0 */
+ 0x0000, /* R19516 - DACL_RETUNE_C31_1 */
+ 0x0000, /* R19517 - DACL_RETUNE_C31_0 */
+ 0x0000, /* R19518 - DACL_RETUNE_C32_1 */
+ 0x0000, /* R19519 - DACL_RETUNE_C32_0 */
+ 0x0000, /* R19520 */
+ 0x0000, /* R19521 */
+ 0x0000, /* R19522 */
+ 0x0000, /* R19523 */
+ 0x0000, /* R19524 */
+ 0x0000, /* R19525 */
+ 0x0000, /* R19526 */
+ 0x0000, /* R19527 */
+ 0x0000, /* R19528 */
+ 0x0000, /* R19529 */
+ 0x0000, /* R19530 */
+ 0x0000, /* R19531 */
+ 0x0000, /* R19532 */
+ 0x0000, /* R19533 */
+ 0x0000, /* R19534 */
+ 0x0000, /* R19535 */
+ 0x0000, /* R19536 */
+ 0x0000, /* R19537 */
+ 0x0000, /* R19538 */
+ 0x0000, /* R19539 */
+ 0x0000, /* R19540 */
+ 0x0000, /* R19541 */
+ 0x0000, /* R19542 */
+ 0x0000, /* R19543 */
+ 0x0000, /* R19544 */
+ 0x0000, /* R19545 */
+ 0x0000, /* R19546 */
+ 0x0000, /* R19547 */
+ 0x0000, /* R19548 */
+ 0x0000, /* R19549 */
+ 0x0000, /* R19550 */
+ 0x0000, /* R19551 */
+ 0x0000, /* R19552 */
+ 0x0000, /* R19553 */
+ 0x0000, /* R19554 */
+ 0x0000, /* R19555 */
+ 0x0000, /* R19556 */
+ 0x0000, /* R19557 */
+ 0x0000, /* R19558 */
+ 0x0000, /* R19559 */
+ 0x0000, /* R19560 */
+ 0x0000, /* R19561 */
+ 0x0000, /* R19562 */
+ 0x0000, /* R19563 */
+ 0x0000, /* R19564 */
+ 0x0000, /* R19565 */
+ 0x0000, /* R19566 */
+ 0x0000, /* R19567 */
+ 0x0000, /* R19568 */
+ 0x0000, /* R19569 */
+ 0x0000, /* R19570 */
+ 0x0000, /* R19571 */
+ 0x0000, /* R19572 */
+ 0x0000, /* R19573 */
+ 0x0000, /* R19574 */
+ 0x0000, /* R19575 */
+ 0x0000, /* R19576 */
+ 0x0000, /* R19577 */
+ 0x0000, /* R19578 */
+ 0x0000, /* R19579 */
+ 0x0000, /* R19580 */
+ 0x0000, /* R19581 */
+ 0x0000, /* R19582 */
+ 0x0000, /* R19583 */
+ 0x0000, /* R19584 */
+ 0x0000, /* R19585 */
+ 0x0000, /* R19586 */
+ 0x0000, /* R19587 */
+ 0x0000, /* R19588 */
+ 0x0000, /* R19589 */
+ 0x0000, /* R19590 */
+ 0x0000, /* R19591 */
+ 0x0000, /* R19592 */
+ 0x0000, /* R19593 */
+ 0x0000, /* R19594 */
+ 0x0000, /* R19595 */
+ 0x0000, /* R19596 */
+ 0x0000, /* R19597 */
+ 0x0000, /* R19598 */
+ 0x0000, /* R19599 */
+ 0x0000, /* R19600 */
+ 0x0000, /* R19601 */
+ 0x0000, /* R19602 */
+ 0x0000, /* R19603 */
+ 0x0000, /* R19604 */
+ 0x0000, /* R19605 */
+ 0x0000, /* R19606 */
+ 0x0000, /* R19607 */
+ 0x0000, /* R19608 */
+ 0x0000, /* R19609 */
+ 0x0000, /* R19610 */
+ 0x0000, /* R19611 */
+ 0x0000, /* R19612 */
+ 0x0000, /* R19613 */
+ 0x0000, /* R19614 */
+ 0x0000, /* R19615 */
+ 0x0000, /* R19616 */
+ 0x0000, /* R19617 */
+ 0x0000, /* R19618 */
+ 0x0000, /* R19619 */
+ 0x0000, /* R19620 */
+ 0x0000, /* R19621 */
+ 0x0000, /* R19622 */
+ 0x0000, /* R19623 */
+ 0x0000, /* R19624 */
+ 0x0000, /* R19625 */
+ 0x0000, /* R19626 */
+ 0x0000, /* R19627 */
+ 0x0000, /* R19628 */
+ 0x0000, /* R19629 */
+ 0x0000, /* R19630 */
+ 0x0000, /* R19631 */
+ 0x0000, /* R19632 */
+ 0x0000, /* R19633 */
+ 0x0000, /* R19634 */
+ 0x0000, /* R19635 */
+ 0x0000, /* R19636 */
+ 0x0000, /* R19637 */
+ 0x0000, /* R19638 */
+ 0x0000, /* R19639 */
+ 0x0000, /* R19640 */
+ 0x0000, /* R19641 */
+ 0x0000, /* R19642 */
+ 0x0000, /* R19643 */
+ 0x0000, /* R19644 */
+ 0x0000, /* R19645 */
+ 0x0000, /* R19646 */
+ 0x0000, /* R19647 */
+ 0x0000, /* R19648 */
+ 0x0000, /* R19649 */
+ 0x0000, /* R19650 */
+ 0x0000, /* R19651 */
+ 0x0000, /* R19652 */
+ 0x0000, /* R19653 */
+ 0x0000, /* R19654 */
+ 0x0000, /* R19655 */
+ 0x0000, /* R19656 */
+ 0x0000, /* R19657 */
+ 0x0000, /* R19658 */
+ 0x0000, /* R19659 */
+ 0x0000, /* R19660 */
+ 0x0000, /* R19661 */
+ 0x0000, /* R19662 */
+ 0x0000, /* R19663 */
+ 0x0000, /* R19664 */
+ 0x0000, /* R19665 */
+ 0x0000, /* R19666 */
+ 0x0000, /* R19667 */
+ 0x0000, /* R19668 */
+ 0x0000, /* R19669 */
+ 0x0000, /* R19670 */
+ 0x0000, /* R19671 */
+ 0x0000, /* R19672 */
+ 0x0000, /* R19673 */
+ 0x0000, /* R19674 */
+ 0x0000, /* R19675 */
+ 0x0000, /* R19676 */
+ 0x0000, /* R19677 */
+ 0x0000, /* R19678 */
+ 0x0000, /* R19679 */
+ 0x0000, /* R19680 */
+ 0x0000, /* R19681 */
+ 0x0000, /* R19682 */
+ 0x0000, /* R19683 */
+ 0x0000, /* R19684 */
+ 0x0000, /* R19685 */
+ 0x0000, /* R19686 */
+ 0x0000, /* R19687 */
+ 0x0000, /* R19688 */
+ 0x0000, /* R19689 */
+ 0x0000, /* R19690 */
+ 0x0000, /* R19691 */
+ 0x0000, /* R19692 */
+ 0x0000, /* R19693 */
+ 0x0000, /* R19694 */
+ 0x0000, /* R19695 */
+ 0x0000, /* R19696 */
+ 0x0000, /* R19697 */
+ 0x0000, /* R19698 */
+ 0x0000, /* R19699 */
+ 0x0000, /* R19700 */
+ 0x0000, /* R19701 */
+ 0x0000, /* R19702 */
+ 0x0000, /* R19703 */
+ 0x0000, /* R19704 */
+ 0x0000, /* R19705 */
+ 0x0000, /* R19706 */
+ 0x0000, /* R19707 */
+ 0x0000, /* R19708 */
+ 0x0000, /* R19709 */
+ 0x0000, /* R19710 */
+ 0x0000, /* R19711 */
+ 0x0000, /* R19712 */
+ 0x0000, /* R19713 */
+ 0x0000, /* R19714 */
+ 0x0000, /* R19715 */
+ 0x0000, /* R19716 */
+ 0x0000, /* R19717 */
+ 0x0000, /* R19718 */
+ 0x0000, /* R19719 */
+ 0x0000, /* R19720 */
+ 0x0000, /* R19721 */
+ 0x0000, /* R19722 */
+ 0x0000, /* R19723 */
+ 0x0000, /* R19724 */
+ 0x0000, /* R19725 */
+ 0x0000, /* R19726 */
+ 0x0000, /* R19727 */
+ 0x0000, /* R19728 */
+ 0x0000, /* R19729 */
+ 0x0000, /* R19730 */
+ 0x0000, /* R19731 */
+ 0x0000, /* R19732 */
+ 0x0000, /* R19733 */
+ 0x0000, /* R19734 */
+ 0x0000, /* R19735 */
+ 0x0000, /* R19736 */
+ 0x0000, /* R19737 */
+ 0x0000, /* R19738 */
+ 0x0000, /* R19739 */
+ 0x0000, /* R19740 */
+ 0x0000, /* R19741 */
+ 0x0000, /* R19742 */
+ 0x0000, /* R19743 */
+ 0x0000, /* R19744 */
+ 0x0000, /* R19745 */
+ 0x0000, /* R19746 */
+ 0x0000, /* R19747 */
+ 0x0000, /* R19748 */
+ 0x0000, /* R19749 */
+ 0x0000, /* R19750 */
+ 0x0000, /* R19751 */
+ 0x0000, /* R19752 */
+ 0x0000, /* R19753 */
+ 0x0000, /* R19754 */
+ 0x0000, /* R19755 */
+ 0x0000, /* R19756 */
+ 0x0000, /* R19757 */
+ 0x0000, /* R19758 */
+ 0x0000, /* R19759 */
+ 0x0000, /* R19760 */
+ 0x0000, /* R19761 */
+ 0x0000, /* R19762 */
+ 0x0000, /* R19763 */
+ 0x0000, /* R19764 */
+ 0x0000, /* R19765 */
+ 0x0000, /* R19766 */
+ 0x0000, /* R19767 */
+ 0x0000, /* R19768 */
+ 0x0000, /* R19769 */
+ 0x0000, /* R19770 */
+ 0x0000, /* R19771 */
+ 0x0000, /* R19772 */
+ 0x0000, /* R19773 */
+ 0x0000, /* R19774 */
+ 0x0000, /* R19775 */
+ 0x0000, /* R19776 */
+ 0x0000, /* R19777 */
+ 0x0000, /* R19778 */
+ 0x0000, /* R19779 */
+ 0x0000, /* R19780 */
+ 0x0000, /* R19781 */
+ 0x0000, /* R19782 */
+ 0x0000, /* R19783 */
+ 0x0000, /* R19784 */
+ 0x0000, /* R19785 */
+ 0x0000, /* R19786 */
+ 0x0000, /* R19787 */
+ 0x0000, /* R19788 */
+ 0x0000, /* R19789 */
+ 0x0000, /* R19790 */
+ 0x0000, /* R19791 */
+ 0x0000, /* R19792 */
+ 0x0000, /* R19793 */
+ 0x0000, /* R19794 */
+ 0x0000, /* R19795 */
+ 0x0000, /* R19796 */
+ 0x0000, /* R19797 */
+ 0x0000, /* R19798 */
+ 0x0000, /* R19799 */
+ 0x0000, /* R19800 */
+ 0x0000, /* R19801 */
+ 0x0000, /* R19802 */
+ 0x0000, /* R19803 */
+ 0x0000, /* R19804 */
+ 0x0000, /* R19805 */
+ 0x0000, /* R19806 */
+ 0x0000, /* R19807 */
+ 0x0000, /* R19808 */
+ 0x0000, /* R19809 */
+ 0x0000, /* R19810 */
+ 0x0000, /* R19811 */
+ 0x0000, /* R19812 */
+ 0x0000, /* R19813 */
+ 0x0000, /* R19814 */
+ 0x0000, /* R19815 */
+ 0x0000, /* R19816 */
+ 0x0000, /* R19817 */
+ 0x0000, /* R19818 */
+ 0x0000, /* R19819 */
+ 0x0000, /* R19820 */
+ 0x0000, /* R19821 */
+ 0x0000, /* R19822 */
+ 0x0000, /* R19823 */
+ 0x0000, /* R19824 */
+ 0x0000, /* R19825 */
+ 0x0000, /* R19826 */
+ 0x0000, /* R19827 */
+ 0x0000, /* R19828 */
+ 0x0000, /* R19829 */
+ 0x0000, /* R19830 */
+ 0x0000, /* R19831 */
+ 0x0000, /* R19832 */
+ 0x0000, /* R19833 */
+ 0x0000, /* R19834 */
+ 0x0000, /* R19835 */
+ 0x0000, /* R19836 */
+ 0x0000, /* R19837 */
+ 0x0000, /* R19838 */
+ 0x0000, /* R19839 */
+ 0x0000, /* R19840 */
+ 0x0000, /* R19841 */
+ 0x0000, /* R19842 */
+ 0x0000, /* R19843 */
+ 0x0000, /* R19844 */
+ 0x0000, /* R19845 */
+ 0x0000, /* R19846 */
+ 0x0000, /* R19847 */
+ 0x0000, /* R19848 */
+ 0x0000, /* R19849 */
+ 0x0000, /* R19850 */
+ 0x0000, /* R19851 */
+ 0x0000, /* R19852 */
+ 0x0000, /* R19853 */
+ 0x0000, /* R19854 */
+ 0x0000, /* R19855 */
+ 0x0000, /* R19856 */
+ 0x0000, /* R19857 */
+ 0x0000, /* R19858 */
+ 0x0000, /* R19859 */
+ 0x0000, /* R19860 */
+ 0x0000, /* R19861 */
+ 0x0000, /* R19862 */
+ 0x0000, /* R19863 */
+ 0x0000, /* R19864 */
+ 0x0000, /* R19865 */
+ 0x0000, /* R19866 */
+ 0x0000, /* R19867 */
+ 0x0000, /* R19868 */
+ 0x0000, /* R19869 */
+ 0x0000, /* R19870 */
+ 0x0000, /* R19871 */
+ 0x0000, /* R19872 */
+ 0x0000, /* R19873 */
+ 0x0000, /* R19874 */
+ 0x0000, /* R19875 */
+ 0x0000, /* R19876 */
+ 0x0000, /* R19877 */
+ 0x0000, /* R19878 */
+ 0x0000, /* R19879 */
+ 0x0000, /* R19880 */
+ 0x0000, /* R19881 */
+ 0x0000, /* R19882 */
+ 0x0000, /* R19883 */
+ 0x0000, /* R19884 */
+ 0x0000, /* R19885 */
+ 0x0000, /* R19886 */
+ 0x0000, /* R19887 */
+ 0x0000, /* R19888 */
+ 0x0000, /* R19889 */
+ 0x0000, /* R19890 */
+ 0x0000, /* R19891 */
+ 0x0000, /* R19892 */
+ 0x0000, /* R19893 */
+ 0x0000, /* R19894 */
+ 0x0000, /* R19895 */
+ 0x0000, /* R19896 */
+ 0x0000, /* R19897 */
+ 0x0000, /* R19898 */
+ 0x0000, /* R19899 */
+ 0x0000, /* R19900 */
+ 0x0000, /* R19901 */
+ 0x0000, /* R19902 */
+ 0x0000, /* R19903 */
+ 0x0000, /* R19904 */
+ 0x0000, /* R19905 */
+ 0x0000, /* R19906 */
+ 0x0000, /* R19907 */
+ 0x0000, /* R19908 */
+ 0x0000, /* R19909 */
+ 0x0000, /* R19910 */
+ 0x0000, /* R19911 */
+ 0x0000, /* R19912 */
+ 0x0000, /* R19913 */
+ 0x0000, /* R19914 */
+ 0x0000, /* R19915 */
+ 0x0000, /* R19916 */
+ 0x0000, /* R19917 */
+ 0x0000, /* R19918 */
+ 0x0000, /* R19919 */
+ 0x0000, /* R19920 */
+ 0x0000, /* R19921 */
+ 0x0000, /* R19922 */
+ 0x0000, /* R19923 */
+ 0x0000, /* R19924 */
+ 0x0000, /* R19925 */
+ 0x0000, /* R19926 */
+ 0x0000, /* R19927 */
+ 0x0000, /* R19928 */
+ 0x0000, /* R19929 */
+ 0x0000, /* R19930 */
+ 0x0000, /* R19931 */
+ 0x0000, /* R19932 */
+ 0x0000, /* R19933 */
+ 0x0000, /* R19934 */
+ 0x0000, /* R19935 */
+ 0x0000, /* R19936 */
+ 0x0000, /* R19937 */
+ 0x0000, /* R19938 */
+ 0x0000, /* R19939 */
+ 0x0000, /* R19940 */
+ 0x0000, /* R19941 */
+ 0x0000, /* R19942 */
+ 0x0000, /* R19943 */
+ 0x0000, /* R19944 */
+ 0x0000, /* R19945 */
+ 0x0000, /* R19946 */
+ 0x0000, /* R19947 */
+ 0x0000, /* R19948 */
+ 0x0000, /* R19949 */
+ 0x0000, /* R19950 */
+ 0x0000, /* R19951 */
+ 0x0000, /* R19952 */
+ 0x0000, /* R19953 */
+ 0x0000, /* R19954 */
+ 0x0000, /* R19955 */
+ 0x0000, /* R19956 */
+ 0x0000, /* R19957 */
+ 0x0000, /* R19958 */
+ 0x0000, /* R19959 */
+ 0x0000, /* R19960 */
+ 0x0000, /* R19961 */
+ 0x0000, /* R19962 */
+ 0x0000, /* R19963 */
+ 0x0000, /* R19964 */
+ 0x0000, /* R19965 */
+ 0x0000, /* R19966 */
+ 0x0000, /* R19967 */
+ 0x0020, /* R19968 - RETUNEDAC_PG2_1 */
+ 0x0000, /* R19969 - RETUNEDAC_PG2_0 */
+ 0x0040, /* R19970 - RETUNEDAC_PG_1 */
+ 0x0000, /* R19971 - RETUNEDAC_PG_0 */
+ 0x0000, /* R19972 */
+ 0x0000, /* R19973 */
+ 0x0000, /* R19974 */
+ 0x0000, /* R19975 */
+ 0x0000, /* R19976 */
+ 0x0000, /* R19977 */
+ 0x0000, /* R19978 */
+ 0x0000, /* R19979 */
+ 0x0000, /* R19980 */
+ 0x0000, /* R19981 */
+ 0x0000, /* R19982 */
+ 0x0000, /* R19983 */
+ 0x0000, /* R19984 */
+ 0x0000, /* R19985 */
+ 0x0000, /* R19986 */
+ 0x0000, /* R19987 */
+ 0x0000, /* R19988 */
+ 0x0000, /* R19989 */
+ 0x0000, /* R19990 */
+ 0x0000, /* R19991 */
+ 0x0000, /* R19992 */
+ 0x0000, /* R19993 */
+ 0x0000, /* R19994 */
+ 0x0000, /* R19995 */
+ 0x0000, /* R19996 */
+ 0x0000, /* R19997 */
+ 0x0000, /* R19998 */
+ 0x0000, /* R19999 */
+ 0x0000, /* R20000 */
+ 0x0000, /* R20001 */
+ 0x0000, /* R20002 */
+ 0x0000, /* R20003 */
+ 0x0000, /* R20004 */
+ 0x0000, /* R20005 */
+ 0x0000, /* R20006 */
+ 0x0000, /* R20007 */
+ 0x0000, /* R20008 */
+ 0x0000, /* R20009 */
+ 0x0000, /* R20010 */
+ 0x0000, /* R20011 */
+ 0x0000, /* R20012 */
+ 0x0000, /* R20013 */
+ 0x0000, /* R20014 */
+ 0x0000, /* R20015 */
+ 0x0000, /* R20016 */
+ 0x0000, /* R20017 */
+ 0x0000, /* R20018 */
+ 0x0000, /* R20019 */
+ 0x0000, /* R20020 */
+ 0x0000, /* R20021 */
+ 0x0000, /* R20022 */
+ 0x0000, /* R20023 */
+ 0x0000, /* R20024 */
+ 0x0000, /* R20025 */
+ 0x0000, /* R20026 */
+ 0x0000, /* R20027 */
+ 0x0000, /* R20028 */
+ 0x0000, /* R20029 */
+ 0x0000, /* R20030 */
+ 0x0000, /* R20031 */
+ 0x0000, /* R20032 */
+ 0x0000, /* R20033 */
+ 0x0000, /* R20034 */
+ 0x0000, /* R20035 */
+ 0x0000, /* R20036 */
+ 0x0000, /* R20037 */
+ 0x0000, /* R20038 */
+ 0x0000, /* R20039 */
+ 0x0000, /* R20040 */
+ 0x0000, /* R20041 */
+ 0x0000, /* R20042 */
+ 0x0000, /* R20043 */
+ 0x0000, /* R20044 */
+ 0x0000, /* R20045 */
+ 0x0000, /* R20046 */
+ 0x0000, /* R20047 */
+ 0x0000, /* R20048 */
+ 0x0000, /* R20049 */
+ 0x0000, /* R20050 */
+ 0x0000, /* R20051 */
+ 0x0000, /* R20052 */
+ 0x0000, /* R20053 */
+ 0x0000, /* R20054 */
+ 0x0000, /* R20055 */
+ 0x0000, /* R20056 */
+ 0x0000, /* R20057 */
+ 0x0000, /* R20058 */
+ 0x0000, /* R20059 */
+ 0x0000, /* R20060 */
+ 0x0000, /* R20061 */
+ 0x0000, /* R20062 */
+ 0x0000, /* R20063 */
+ 0x0000, /* R20064 */
+ 0x0000, /* R20065 */
+ 0x0000, /* R20066 */
+ 0x0000, /* R20067 */
+ 0x0000, /* R20068 */
+ 0x0000, /* R20069 */
+ 0x0000, /* R20070 */
+ 0x0000, /* R20071 */
+ 0x0000, /* R20072 */
+ 0x0000, /* R20073 */
+ 0x0000, /* R20074 */
+ 0x0000, /* R20075 */
+ 0x0000, /* R20076 */
+ 0x0000, /* R20077 */
+ 0x0000, /* R20078 */
+ 0x0000, /* R20079 */
+ 0x0000, /* R20080 */
+ 0x0000, /* R20081 */
+ 0x0000, /* R20082 */
+ 0x0000, /* R20083 */
+ 0x0000, /* R20084 */
+ 0x0000, /* R20085 */
+ 0x0000, /* R20086 */
+ 0x0000, /* R20087 */
+ 0x0000, /* R20088 */
+ 0x0000, /* R20089 */
+ 0x0000, /* R20090 */
+ 0x0000, /* R20091 */
+ 0x0000, /* R20092 */
+ 0x0000, /* R20093 */
+ 0x0000, /* R20094 */
+ 0x0000, /* R20095 */
+ 0x0000, /* R20096 */
+ 0x0000, /* R20097 */
+ 0x0000, /* R20098 */
+ 0x0000, /* R20099 */
+ 0x0000, /* R20100 */
+ 0x0000, /* R20101 */
+ 0x0000, /* R20102 */
+ 0x0000, /* R20103 */
+ 0x0000, /* R20104 */
+ 0x0000, /* R20105 */
+ 0x0000, /* R20106 */
+ 0x0000, /* R20107 */
+ 0x0000, /* R20108 */
+ 0x0000, /* R20109 */
+ 0x0000, /* R20110 */
+ 0x0000, /* R20111 */
+ 0x0000, /* R20112 */
+ 0x0000, /* R20113 */
+ 0x0000, /* R20114 */
+ 0x0000, /* R20115 */
+ 0x0000, /* R20116 */
+ 0x0000, /* R20117 */
+ 0x0000, /* R20118 */
+ 0x0000, /* R20119 */
+ 0x0000, /* R20120 */
+ 0x0000, /* R20121 */
+ 0x0000, /* R20122 */
+ 0x0000, /* R20123 */
+ 0x0000, /* R20124 */
+ 0x0000, /* R20125 */
+ 0x0000, /* R20126 */
+ 0x0000, /* R20127 */
+ 0x0000, /* R20128 */
+ 0x0000, /* R20129 */
+ 0x0000, /* R20130 */
+ 0x0000, /* R20131 */
+ 0x0000, /* R20132 */
+ 0x0000, /* R20133 */
+ 0x0000, /* R20134 */
+ 0x0000, /* R20135 */
+ 0x0000, /* R20136 */
+ 0x0000, /* R20137 */
+ 0x0000, /* R20138 */
+ 0x0000, /* R20139 */
+ 0x0000, /* R20140 */
+ 0x0000, /* R20141 */
+ 0x0000, /* R20142 */
+ 0x0000, /* R20143 */
+ 0x0000, /* R20144 */
+ 0x0000, /* R20145 */
+ 0x0000, /* R20146 */
+ 0x0000, /* R20147 */
+ 0x0000, /* R20148 */
+ 0x0000, /* R20149 */
+ 0x0000, /* R20150 */
+ 0x0000, /* R20151 */
+ 0x0000, /* R20152 */
+ 0x0000, /* R20153 */
+ 0x0000, /* R20154 */
+ 0x0000, /* R20155 */
+ 0x0000, /* R20156 */
+ 0x0000, /* R20157 */
+ 0x0000, /* R20158 */
+ 0x0000, /* R20159 */
+ 0x0000, /* R20160 */
+ 0x0000, /* R20161 */
+ 0x0000, /* R20162 */
+ 0x0000, /* R20163 */
+ 0x0000, /* R20164 */
+ 0x0000, /* R20165 */
+ 0x0000, /* R20166 */
+ 0x0000, /* R20167 */
+ 0x0000, /* R20168 */
+ 0x0000, /* R20169 */
+ 0x0000, /* R20170 */
+ 0x0000, /* R20171 */
+ 0x0000, /* R20172 */
+ 0x0000, /* R20173 */
+ 0x0000, /* R20174 */
+ 0x0000, /* R20175 */
+ 0x0000, /* R20176 */
+ 0x0000, /* R20177 */
+ 0x0000, /* R20178 */
+ 0x0000, /* R20179 */
+ 0x0000, /* R20180 */
+ 0x0000, /* R20181 */
+ 0x0000, /* R20182 */
+ 0x0000, /* R20183 */
+ 0x0000, /* R20184 */
+ 0x0000, /* R20185 */
+ 0x0000, /* R20186 */
+ 0x0000, /* R20187 */
+ 0x0000, /* R20188 */
+ 0x0000, /* R20189 */
+ 0x0000, /* R20190 */
+ 0x0000, /* R20191 */
+ 0x0000, /* R20192 */
+ 0x0000, /* R20193 */
+ 0x0000, /* R20194 */
+ 0x0000, /* R20195 */
+ 0x0000, /* R20196 */
+ 0x0000, /* R20197 */
+ 0x0000, /* R20198 */
+ 0x0000, /* R20199 */
+ 0x0000, /* R20200 */
+ 0x0000, /* R20201 */
+ 0x0000, /* R20202 */
+ 0x0000, /* R20203 */
+ 0x0000, /* R20204 */
+ 0x0000, /* R20205 */
+ 0x0000, /* R20206 */
+ 0x0000, /* R20207 */
+ 0x0000, /* R20208 */
+ 0x0000, /* R20209 */
+ 0x0000, /* R20210 */
+ 0x0000, /* R20211 */
+ 0x0000, /* R20212 */
+ 0x0000, /* R20213 */
+ 0x0000, /* R20214 */
+ 0x0000, /* R20215 */
+ 0x0000, /* R20216 */
+ 0x0000, /* R20217 */
+ 0x0000, /* R20218 */
+ 0x0000, /* R20219 */
+ 0x0000, /* R20220 */
+ 0x0000, /* R20221 */
+ 0x0000, /* R20222 */
+ 0x0000, /* R20223 */
+ 0x0000, /* R20224 */
+ 0x0000, /* R20225 */
+ 0x0000, /* R20226 */
+ 0x0000, /* R20227 */
+ 0x0000, /* R20228 */
+ 0x0000, /* R20229 */
+ 0x0000, /* R20230 */
+ 0x0000, /* R20231 */
+ 0x0000, /* R20232 */
+ 0x0000, /* R20233 */
+ 0x0000, /* R20234 */
+ 0x0000, /* R20235 */
+ 0x0000, /* R20236 */
+ 0x0000, /* R20237 */
+ 0x0000, /* R20238 */
+ 0x0000, /* R20239 */
+ 0x0000, /* R20240 */
+ 0x0000, /* R20241 */
+ 0x0000, /* R20242 */
+ 0x0000, /* R20243 */
+ 0x0000, /* R20244 */
+ 0x0000, /* R20245 */
+ 0x0000, /* R20246 */
+ 0x0000, /* R20247 */
+ 0x0000, /* R20248 */
+ 0x0000, /* R20249 */
+ 0x0000, /* R20250 */
+ 0x0000, /* R20251 */
+ 0x0000, /* R20252 */
+ 0x0000, /* R20253 */
+ 0x0000, /* R20254 */
+ 0x0000, /* R20255 */
+ 0x0000, /* R20256 */
+ 0x0000, /* R20257 */
+ 0x0000, /* R20258 */
+ 0x0000, /* R20259 */
+ 0x0000, /* R20260 */
+ 0x0000, /* R20261 */
+ 0x0000, /* R20262 */
+ 0x0000, /* R20263 */
+ 0x0000, /* R20264 */
+ 0x0000, /* R20265 */
+ 0x0000, /* R20266 */
+ 0x0000, /* R20267 */
+ 0x0000, /* R20268 */
+ 0x0000, /* R20269 */
+ 0x0000, /* R20270 */
+ 0x0000, /* R20271 */
+ 0x0000, /* R20272 */
+ 0x0000, /* R20273 */
+ 0x0000, /* R20274 */
+ 0x0000, /* R20275 */
+ 0x0000, /* R20276 */
+ 0x0000, /* R20277 */
+ 0x0000, /* R20278 */
+ 0x0000, /* R20279 */
+ 0x0000, /* R20280 */
+ 0x0000, /* R20281 */
+ 0x0000, /* R20282 */
+ 0x0000, /* R20283 */
+ 0x0000, /* R20284 */
+ 0x0000, /* R20285 */
+ 0x0000, /* R20286 */
+ 0x0000, /* R20287 */
+ 0x0000, /* R20288 */
+ 0x0000, /* R20289 */
+ 0x0000, /* R20290 */
+ 0x0000, /* R20291 */
+ 0x0000, /* R20292 */
+ 0x0000, /* R20293 */
+ 0x0000, /* R20294 */
+ 0x0000, /* R20295 */
+ 0x0000, /* R20296 */
+ 0x0000, /* R20297 */
+ 0x0000, /* R20298 */
+ 0x0000, /* R20299 */
+ 0x0000, /* R20300 */
+ 0x0000, /* R20301 */
+ 0x0000, /* R20302 */
+ 0x0000, /* R20303 */
+ 0x0000, /* R20304 */
+ 0x0000, /* R20305 */
+ 0x0000, /* R20306 */
+ 0x0000, /* R20307 */
+ 0x0000, /* R20308 */
+ 0x0000, /* R20309 */
+ 0x0000, /* R20310 */
+ 0x0000, /* R20311 */
+ 0x0000, /* R20312 */
+ 0x0000, /* R20313 */
+ 0x0000, /* R20314 */
+ 0x0000, /* R20315 */
+ 0x0000, /* R20316 */
+ 0x0000, /* R20317 */
+ 0x0000, /* R20318 */
+ 0x0000, /* R20319 */
+ 0x0000, /* R20320 */
+ 0x0000, /* R20321 */
+ 0x0000, /* R20322 */
+ 0x0000, /* R20323 */
+ 0x0000, /* R20324 */
+ 0x0000, /* R20325 */
+ 0x0000, /* R20326 */
+ 0x0000, /* R20327 */
+ 0x0000, /* R20328 */
+ 0x0000, /* R20329 */
+ 0x0000, /* R20330 */
+ 0x0000, /* R20331 */
+ 0x0000, /* R20332 */
+ 0x0000, /* R20333 */
+ 0x0000, /* R20334 */
+ 0x0000, /* R20335 */
+ 0x0000, /* R20336 */
+ 0x0000, /* R20337 */
+ 0x0000, /* R20338 */
+ 0x0000, /* R20339 */
+ 0x0000, /* R20340 */
+ 0x0000, /* R20341 */
+ 0x0000, /* R20342 */
+ 0x0000, /* R20343 */
+ 0x0000, /* R20344 */
+ 0x0000, /* R20345 */
+ 0x0000, /* R20346 */
+ 0x0000, /* R20347 */
+ 0x0000, /* R20348 */
+ 0x0000, /* R20349 */
+ 0x0000, /* R20350 */
+ 0x0000, /* R20351 */
+ 0x0000, /* R20352 */
+ 0x0000, /* R20353 */
+ 0x0000, /* R20354 */
+ 0x0000, /* R20355 */
+ 0x0000, /* R20356 */
+ 0x0000, /* R20357 */
+ 0x0000, /* R20358 */
+ 0x0000, /* R20359 */
+ 0x0000, /* R20360 */
+ 0x0000, /* R20361 */
+ 0x0000, /* R20362 */
+ 0x0000, /* R20363 */
+ 0x0000, /* R20364 */
+ 0x0000, /* R20365 */
+ 0x0000, /* R20366 */
+ 0x0000, /* R20367 */
+ 0x0000, /* R20368 */
+ 0x0000, /* R20369 */
+ 0x0000, /* R20370 */
+ 0x0000, /* R20371 */
+ 0x0000, /* R20372 */
+ 0x0000, /* R20373 */
+ 0x0000, /* R20374 */
+ 0x0000, /* R20375 */
+ 0x0000, /* R20376 */
+ 0x0000, /* R20377 */
+ 0x0000, /* R20378 */
+ 0x0000, /* R20379 */
+ 0x0000, /* R20380 */
+ 0x0000, /* R20381 */
+ 0x0000, /* R20382 */
+ 0x0000, /* R20383 */
+ 0x0000, /* R20384 */
+ 0x0000, /* R20385 */
+ 0x0000, /* R20386 */
+ 0x0000, /* R20387 */
+ 0x0000, /* R20388 */
+ 0x0000, /* R20389 */
+ 0x0000, /* R20390 */
+ 0x0000, /* R20391 */
+ 0x0000, /* R20392 */
+ 0x0000, /* R20393 */
+ 0x0000, /* R20394 */
+ 0x0000, /* R20395 */
+ 0x0000, /* R20396 */
+ 0x0000, /* R20397 */
+ 0x0000, /* R20398 */
+ 0x0000, /* R20399 */
+ 0x0000, /* R20400 */
+ 0x0000, /* R20401 */
+ 0x0000, /* R20402 */
+ 0x0000, /* R20403 */
+ 0x0000, /* R20404 */
+ 0x0000, /* R20405 */
+ 0x0000, /* R20406 */
+ 0x0000, /* R20407 */
+ 0x0000, /* R20408 */
+ 0x0000, /* R20409 */
+ 0x0000, /* R20410 */
+ 0x0000, /* R20411 */
+ 0x0000, /* R20412 */
+ 0x0000, /* R20413 */
+ 0x0000, /* R20414 */
+ 0x0000, /* R20415 */
+ 0x0000, /* R20416 */
+ 0x0000, /* R20417 */
+ 0x0000, /* R20418 */
+ 0x0000, /* R20419 */
+ 0x0000, /* R20420 */
+ 0x0000, /* R20421 */
+ 0x0000, /* R20422 */
+ 0x0000, /* R20423 */
+ 0x0000, /* R20424 */
+ 0x0000, /* R20425 */
+ 0x0000, /* R20426 */
+ 0x0000, /* R20427 */
+ 0x0000, /* R20428 */
+ 0x0000, /* R20429 */
+ 0x0000, /* R20430 */
+ 0x0000, /* R20431 */
+ 0x0000, /* R20432 */
+ 0x0000, /* R20433 */
+ 0x0000, /* R20434 */
+ 0x0000, /* R20435 */
+ 0x0000, /* R20436 */
+ 0x0000, /* R20437 */
+ 0x0000, /* R20438 */
+ 0x0000, /* R20439 */
+ 0x0000, /* R20440 */
+ 0x0000, /* R20441 */
+ 0x0000, /* R20442 */
+ 0x0000, /* R20443 */
+ 0x0000, /* R20444 */
+ 0x0000, /* R20445 */
+ 0x0000, /* R20446 */
+ 0x0000, /* R20447 */
+ 0x0000, /* R20448 */
+ 0x0000, /* R20449 */
+ 0x0000, /* R20450 */
+ 0x0000, /* R20451 */
+ 0x0000, /* R20452 */
+ 0x0000, /* R20453 */
+ 0x0000, /* R20454 */
+ 0x0000, /* R20455 */
+ 0x0000, /* R20456 */
+ 0x0000, /* R20457 */
+ 0x0000, /* R20458 */
+ 0x0000, /* R20459 */
+ 0x0000, /* R20460 */
+ 0x0000, /* R20461 */
+ 0x0000, /* R20462 */
+ 0x0000, /* R20463 */
+ 0x0000, /* R20464 */
+ 0x0000, /* R20465 */
+ 0x0000, /* R20466 */
+ 0x0000, /* R20467 */
+ 0x0000, /* R20468 */
+ 0x0000, /* R20469 */
+ 0x0000, /* R20470 */
+ 0x0000, /* R20471 */
+ 0x0000, /* R20472 */
+ 0x0000, /* R20473 */
+ 0x0000, /* R20474 */
+ 0x0000, /* R20475 */
+ 0x0000, /* R20476 */
+ 0x0000, /* R20477 */
+ 0x0000, /* R20478 */
+ 0x0000, /* R20479 */
+ 0x007F, /* R20480 - DACR_RETUNE_C1_1 */
+ 0xFFFF, /* R20481 - DACR_RETUNE_C1_0 */
+ 0x0000, /* R20482 - DACR_RETUNE_C2_1 */
+ 0x0000, /* R20483 - DACR_RETUNE_C2_0 */
+ 0x0000, /* R20484 - DACR_RETUNE_C3_1 */
+ 0x0000, /* R20485 - DACR_RETUNE_C3_0 */
+ 0x0000, /* R20486 - DACR_RETUNE_C4_1 */
+ 0x0000, /* R20487 - DACR_RETUNE_C4_0 */
+ 0x0000, /* R20488 - DACR_RETUNE_C5_1 */
+ 0x0000, /* R20489 - DACR_RETUNE_C5_0 */
+ 0x0000, /* R20490 - DACR_RETUNE_C6_1 */
+ 0x0000, /* R20491 - DACR_RETUNE_C6_0 */
+ 0x0000, /* R20492 - DACR_RETUNE_C7_1 */
+ 0x0000, /* R20493 - DACR_RETUNE_C7_0 */
+ 0x0000, /* R20494 - DACR_RETUNE_C8_1 */
+ 0x0000, /* R20495 - DACR_RETUNE_C8_0 */
+ 0x0000, /* R20496 - DACR_RETUNE_C9_1 */
+ 0x0000, /* R20497 - DACR_RETUNE_C9_0 */
+ 0x0000, /* R20498 - DACR_RETUNE_C10_1 */
+ 0x0000, /* R20499 - DACR_RETUNE_C10_0 */
+ 0x0000, /* R20500 - DACR_RETUNE_C11_1 */
+ 0x0000, /* R20501 - DACR_RETUNE_C11_0 */
+ 0x0000, /* R20502 - DACR_RETUNE_C12_1 */
+ 0x0000, /* R20503 - DACR_RETUNE_C12_0 */
+ 0x0000, /* R20504 - DACR_RETUNE_C13_1 */
+ 0x0000, /* R20505 - DACR_RETUNE_C13_0 */
+ 0x0000, /* R20506 - DACR_RETUNE_C14_1 */
+ 0x0000, /* R20507 - DACR_RETUNE_C14_0 */
+ 0x0000, /* R20508 - DACR_RETUNE_C15_1 */
+ 0x0000, /* R20509 - DACR_RETUNE_C15_0 */
+ 0x0000, /* R20510 - DACR_RETUNE_C16_1 */
+ 0x0000, /* R20511 - DACR_RETUNE_C16_0 */
+ 0x0000, /* R20512 - DACR_RETUNE_C17_1 */
+ 0x0000, /* R20513 - DACR_RETUNE_C17_0 */
+ 0x0000, /* R20514 - DACR_RETUNE_C18_1 */
+ 0x0000, /* R20515 - DACR_RETUNE_C18_0 */
+ 0x0000, /* R20516 - DACR_RETUNE_C19_1 */
+ 0x0000, /* R20517 - DACR_RETUNE_C19_0 */
+ 0x0000, /* R20518 - DACR_RETUNE_C20_1 */
+ 0x0000, /* R20519 - DACR_RETUNE_C20_0 */
+ 0x0000, /* R20520 - DACR_RETUNE_C21_1 */
+ 0x0000, /* R20521 - DACR_RETUNE_C21_0 */
+ 0x0000, /* R20522 - DACR_RETUNE_C22_1 */
+ 0x0000, /* R20523 - DACR_RETUNE_C22_0 */
+ 0x0000, /* R20524 - DACR_RETUNE_C23_1 */
+ 0x0000, /* R20525 - DACR_RETUNE_C23_0 */
+ 0x0000, /* R20526 - DACR_RETUNE_C24_1 */
+ 0x0000, /* R20527 - DACR_RETUNE_C24_0 */
+ 0x0000, /* R20528 - DACR_RETUNE_C25_1 */
+ 0x0000, /* R20529 - DACR_RETUNE_C25_0 */
+ 0x0000, /* R20530 - DACR_RETUNE_C26_1 */
+ 0x0000, /* R20531 - DACR_RETUNE_C26_0 */
+ 0x0000, /* R20532 - DACR_RETUNE_C27_1 */
+ 0x0000, /* R20533 - DACR_RETUNE_C27_0 */
+ 0x0000, /* R20534 - DACR_RETUNE_C28_1 */
+ 0x0000, /* R20535 - DACR_RETUNE_C28_0 */
+ 0x0000, /* R20536 - DACR_RETUNE_C29_1 */
+ 0x0000, /* R20537 - DACR_RETUNE_C29_0 */
+ 0x0000, /* R20538 - DACR_RETUNE_C30_1 */
+ 0x0000, /* R20539 - DACR_RETUNE_C30_0 */
+ 0x0000, /* R20540 - DACR_RETUNE_C31_1 */
+ 0x0000, /* R20541 - DACR_RETUNE_C31_0 */
+ 0x0000, /* R20542 - DACR_RETUNE_C32_1 */
+ 0x0000, /* R20543 - DACR_RETUNE_C32_0 */
+ 0x0000, /* R20544 */
+ 0x0000, /* R20545 */
+ 0x0000, /* R20546 */
+ 0x0000, /* R20547 */
+ 0x0000, /* R20548 */
+ 0x0000, /* R20549 */
+ 0x0000, /* R20550 */
+ 0x0000, /* R20551 */
+ 0x0000, /* R20552 */
+ 0x0000, /* R20553 */
+ 0x0000, /* R20554 */
+ 0x0000, /* R20555 */
+ 0x0000, /* R20556 */
+ 0x0000, /* R20557 */
+ 0x0000, /* R20558 */
+ 0x0000, /* R20559 */
+ 0x0000, /* R20560 */
+ 0x0000, /* R20561 */
+ 0x0000, /* R20562 */
+ 0x0000, /* R20563 */
+ 0x0000, /* R20564 */
+ 0x0000, /* R20565 */
+ 0x0000, /* R20566 */
+ 0x0000, /* R20567 */
+ 0x0000, /* R20568 */
+ 0x0000, /* R20569 */
+ 0x0000, /* R20570 */
+ 0x0000, /* R20571 */
+ 0x0000, /* R20572 */
+ 0x0000, /* R20573 */
+ 0x0000, /* R20574 */
+ 0x0000, /* R20575 */
+ 0x0000, /* R20576 */
+ 0x0000, /* R20577 */
+ 0x0000, /* R20578 */
+ 0x0000, /* R20579 */
+ 0x0000, /* R20580 */
+ 0x0000, /* R20581 */
+ 0x0000, /* R20582 */
+ 0x0000, /* R20583 */
+ 0x0000, /* R20584 */
+ 0x0000, /* R20585 */
+ 0x0000, /* R20586 */
+ 0x0000, /* R20587 */
+ 0x0000, /* R20588 */
+ 0x0000, /* R20589 */
+ 0x0000, /* R20590 */
+ 0x0000, /* R20591 */
+ 0x0000, /* R20592 */
+ 0x0000, /* R20593 */
+ 0x0000, /* R20594 */
+ 0x0000, /* R20595 */
+ 0x0000, /* R20596 */
+ 0x0000, /* R20597 */
+ 0x0000, /* R20598 */
+ 0x0000, /* R20599 */
+ 0x0000, /* R20600 */
+ 0x0000, /* R20601 */
+ 0x0000, /* R20602 */
+ 0x0000, /* R20603 */
+ 0x0000, /* R20604 */
+ 0x0000, /* R20605 */
+ 0x0000, /* R20606 */
+ 0x0000, /* R20607 */
+ 0x0000, /* R20608 */
+ 0x0000, /* R20609 */
+ 0x0000, /* R20610 */
+ 0x0000, /* R20611 */
+ 0x0000, /* R20612 */
+ 0x0000, /* R20613 */
+ 0x0000, /* R20614 */
+ 0x0000, /* R20615 */
+ 0x0000, /* R20616 */
+ 0x0000, /* R20617 */
+ 0x0000, /* R20618 */
+ 0x0000, /* R20619 */
+ 0x0000, /* R20620 */
+ 0x0000, /* R20621 */
+ 0x0000, /* R20622 */
+ 0x0000, /* R20623 */
+ 0x0000, /* R20624 */
+ 0x0000, /* R20625 */
+ 0x0000, /* R20626 */
+ 0x0000, /* R20627 */
+ 0x0000, /* R20628 */
+ 0x0000, /* R20629 */
+ 0x0000, /* R20630 */
+ 0x0000, /* R20631 */
+ 0x0000, /* R20632 */
+ 0x0000, /* R20633 */
+ 0x0000, /* R20634 */
+ 0x0000, /* R20635 */
+ 0x0000, /* R20636 */
+ 0x0000, /* R20637 */
+ 0x0000, /* R20638 */
+ 0x0000, /* R20639 */
+ 0x0000, /* R20640 */
+ 0x0000, /* R20641 */
+ 0x0000, /* R20642 */
+ 0x0000, /* R20643 */
+ 0x0000, /* R20644 */
+ 0x0000, /* R20645 */
+ 0x0000, /* R20646 */
+ 0x0000, /* R20647 */
+ 0x0000, /* R20648 */
+ 0x0000, /* R20649 */
+ 0x0000, /* R20650 */
+ 0x0000, /* R20651 */
+ 0x0000, /* R20652 */
+ 0x0000, /* R20653 */
+ 0x0000, /* R20654 */
+ 0x0000, /* R20655 */
+ 0x0000, /* R20656 */
+ 0x0000, /* R20657 */
+ 0x0000, /* R20658 */
+ 0x0000, /* R20659 */
+ 0x0000, /* R20660 */
+ 0x0000, /* R20661 */
+ 0x0000, /* R20662 */
+ 0x0000, /* R20663 */
+ 0x0000, /* R20664 */
+ 0x0000, /* R20665 */
+ 0x0000, /* R20666 */
+ 0x0000, /* R20667 */
+ 0x0000, /* R20668 */
+ 0x0000, /* R20669 */
+ 0x0000, /* R20670 */
+ 0x0000, /* R20671 */
+ 0x0000, /* R20672 */
+ 0x0000, /* R20673 */
+ 0x0000, /* R20674 */
+ 0x0000, /* R20675 */
+ 0x0000, /* R20676 */
+ 0x0000, /* R20677 */
+ 0x0000, /* R20678 */
+ 0x0000, /* R20679 */
+ 0x0000, /* R20680 */
+ 0x0000, /* R20681 */
+ 0x0000, /* R20682 */
+ 0x0000, /* R20683 */
+ 0x0000, /* R20684 */
+ 0x0000, /* R20685 */
+ 0x0000, /* R20686 */
+ 0x0000, /* R20687 */
+ 0x0000, /* R20688 */
+ 0x0000, /* R20689 */
+ 0x0000, /* R20690 */
+ 0x0000, /* R20691 */
+ 0x0000, /* R20692 */
+ 0x0000, /* R20693 */
+ 0x0000, /* R20694 */
+ 0x0000, /* R20695 */
+ 0x0000, /* R20696 */
+ 0x0000, /* R20697 */
+ 0x0000, /* R20698 */
+ 0x0000, /* R20699 */
+ 0x0000, /* R20700 */
+ 0x0000, /* R20701 */
+ 0x0000, /* R20702 */
+ 0x0000, /* R20703 */
+ 0x0000, /* R20704 */
+ 0x0000, /* R20705 */
+ 0x0000, /* R20706 */
+ 0x0000, /* R20707 */
+ 0x0000, /* R20708 */
+ 0x0000, /* R20709 */
+ 0x0000, /* R20710 */
+ 0x0000, /* R20711 */
+ 0x0000, /* R20712 */
+ 0x0000, /* R20713 */
+ 0x0000, /* R20714 */
+ 0x0000, /* R20715 */
+ 0x0000, /* R20716 */
+ 0x0000, /* R20717 */
+ 0x0000, /* R20718 */
+ 0x0000, /* R20719 */
+ 0x0000, /* R20720 */
+ 0x0000, /* R20721 */
+ 0x0000, /* R20722 */
+ 0x0000, /* R20723 */
+ 0x0000, /* R20724 */
+ 0x0000, /* R20725 */
+ 0x0000, /* R20726 */
+ 0x0000, /* R20727 */
+ 0x0000, /* R20728 */
+ 0x0000, /* R20729 */
+ 0x0000, /* R20730 */
+ 0x0000, /* R20731 */
+ 0x0000, /* R20732 */
+ 0x0000, /* R20733 */
+ 0x0000, /* R20734 */
+ 0x0000, /* R20735 */
+ 0x0000, /* R20736 */
+ 0x0000, /* R20737 */
+ 0x0000, /* R20738 */
+ 0x0000, /* R20739 */
+ 0x0000, /* R20740 */
+ 0x0000, /* R20741 */
+ 0x0000, /* R20742 */
+ 0x0000, /* R20743 */
+ 0x0000, /* R20744 */
+ 0x0000, /* R20745 */
+ 0x0000, /* R20746 */
+ 0x0000, /* R20747 */
+ 0x0000, /* R20748 */
+ 0x0000, /* R20749 */
+ 0x0000, /* R20750 */
+ 0x0000, /* R20751 */
+ 0x0000, /* R20752 */
+ 0x0000, /* R20753 */
+ 0x0000, /* R20754 */
+ 0x0000, /* R20755 */
+ 0x0000, /* R20756 */
+ 0x0000, /* R20757 */
+ 0x0000, /* R20758 */
+ 0x0000, /* R20759 */
+ 0x0000, /* R20760 */
+ 0x0000, /* R20761 */
+ 0x0000, /* R20762 */
+ 0x0000, /* R20763 */
+ 0x0000, /* R20764 */
+ 0x0000, /* R20765 */
+ 0x0000, /* R20766 */
+ 0x0000, /* R20767 */
+ 0x0000, /* R20768 */
+ 0x0000, /* R20769 */
+ 0x0000, /* R20770 */
+ 0x0000, /* R20771 */
+ 0x0000, /* R20772 */
+ 0x0000, /* R20773 */
+ 0x0000, /* R20774 */
+ 0x0000, /* R20775 */
+ 0x0000, /* R20776 */
+ 0x0000, /* R20777 */
+ 0x0000, /* R20778 */
+ 0x0000, /* R20779 */
+ 0x0000, /* R20780 */
+ 0x0000, /* R20781 */
+ 0x0000, /* R20782 */
+ 0x0000, /* R20783 */
+ 0x0000, /* R20784 */
+ 0x0000, /* R20785 */
+ 0x0000, /* R20786 */
+ 0x0000, /* R20787 */
+ 0x0000, /* R20788 */
+ 0x0000, /* R20789 */
+ 0x0000, /* R20790 */
+ 0x0000, /* R20791 */
+ 0x0000, /* R20792 */
+ 0x0000, /* R20793 */
+ 0x0000, /* R20794 */
+ 0x0000, /* R20795 */
+ 0x0000, /* R20796 */
+ 0x0000, /* R20797 */
+ 0x0000, /* R20798 */
+ 0x0000, /* R20799 */
+ 0x0000, /* R20800 */
+ 0x0000, /* R20801 */
+ 0x0000, /* R20802 */
+ 0x0000, /* R20803 */
+ 0x0000, /* R20804 */
+ 0x0000, /* R20805 */
+ 0x0000, /* R20806 */
+ 0x0000, /* R20807 */
+ 0x0000, /* R20808 */
+ 0x0000, /* R20809 */
+ 0x0000, /* R20810 */
+ 0x0000, /* R20811 */
+ 0x0000, /* R20812 */
+ 0x0000, /* R20813 */
+ 0x0000, /* R20814 */
+ 0x0000, /* R20815 */
+ 0x0000, /* R20816 */
+ 0x0000, /* R20817 */
+ 0x0000, /* R20818 */
+ 0x0000, /* R20819 */
+ 0x0000, /* R20820 */
+ 0x0000, /* R20821 */
+ 0x0000, /* R20822 */
+ 0x0000, /* R20823 */
+ 0x0000, /* R20824 */
+ 0x0000, /* R20825 */
+ 0x0000, /* R20826 */
+ 0x0000, /* R20827 */
+ 0x0000, /* R20828 */
+ 0x0000, /* R20829 */
+ 0x0000, /* R20830 */
+ 0x0000, /* R20831 */
+ 0x0000, /* R20832 */
+ 0x0000, /* R20833 */
+ 0x0000, /* R20834 */
+ 0x0000, /* R20835 */
+ 0x0000, /* R20836 */
+ 0x0000, /* R20837 */
+ 0x0000, /* R20838 */
+ 0x0000, /* R20839 */
+ 0x0000, /* R20840 */
+ 0x0000, /* R20841 */
+ 0x0000, /* R20842 */
+ 0x0000, /* R20843 */
+ 0x0000, /* R20844 */
+ 0x0000, /* R20845 */
+ 0x0000, /* R20846 */
+ 0x0000, /* R20847 */
+ 0x0000, /* R20848 */
+ 0x0000, /* R20849 */
+ 0x0000, /* R20850 */
+ 0x0000, /* R20851 */
+ 0x0000, /* R20852 */
+ 0x0000, /* R20853 */
+ 0x0000, /* R20854 */
+ 0x0000, /* R20855 */
+ 0x0000, /* R20856 */
+ 0x0000, /* R20857 */
+ 0x0000, /* R20858 */
+ 0x0000, /* R20859 */
+ 0x0000, /* R20860 */
+ 0x0000, /* R20861 */
+ 0x0000, /* R20862 */
+ 0x0000, /* R20863 */
+ 0x0000, /* R20864 */
+ 0x0000, /* R20865 */
+ 0x0000, /* R20866 */
+ 0x0000, /* R20867 */
+ 0x0000, /* R20868 */
+ 0x0000, /* R20869 */
+ 0x0000, /* R20870 */
+ 0x0000, /* R20871 */
+ 0x0000, /* R20872 */
+ 0x0000, /* R20873 */
+ 0x0000, /* R20874 */
+ 0x0000, /* R20875 */
+ 0x0000, /* R20876 */
+ 0x0000, /* R20877 */
+ 0x0000, /* R20878 */
+ 0x0000, /* R20879 */
+ 0x0000, /* R20880 */
+ 0x0000, /* R20881 */
+ 0x0000, /* R20882 */
+ 0x0000, /* R20883 */
+ 0x0000, /* R20884 */
+ 0x0000, /* R20885 */
+ 0x0000, /* R20886 */
+ 0x0000, /* R20887 */
+ 0x0000, /* R20888 */
+ 0x0000, /* R20889 */
+ 0x0000, /* R20890 */
+ 0x0000, /* R20891 */
+ 0x0000, /* R20892 */
+ 0x0000, /* R20893 */
+ 0x0000, /* R20894 */
+ 0x0000, /* R20895 */
+ 0x0000, /* R20896 */
+ 0x0000, /* R20897 */
+ 0x0000, /* R20898 */
+ 0x0000, /* R20899 */
+ 0x0000, /* R20900 */
+ 0x0000, /* R20901 */
+ 0x0000, /* R20902 */
+ 0x0000, /* R20903 */
+ 0x0000, /* R20904 */
+ 0x0000, /* R20905 */
+ 0x0000, /* R20906 */
+ 0x0000, /* R20907 */
+ 0x0000, /* R20908 */
+ 0x0000, /* R20909 */
+ 0x0000, /* R20910 */
+ 0x0000, /* R20911 */
+ 0x0000, /* R20912 */
+ 0x0000, /* R20913 */
+ 0x0000, /* R20914 */
+ 0x0000, /* R20915 */
+ 0x0000, /* R20916 */
+ 0x0000, /* R20917 */
+ 0x0000, /* R20918 */
+ 0x0000, /* R20919 */
+ 0x0000, /* R20920 */
+ 0x0000, /* R20921 */
+ 0x0000, /* R20922 */
+ 0x0000, /* R20923 */
+ 0x0000, /* R20924 */
+ 0x0000, /* R20925 */
+ 0x0000, /* R20926 */
+ 0x0000, /* R20927 */
+ 0x0000, /* R20928 */
+ 0x0000, /* R20929 */
+ 0x0000, /* R20930 */
+ 0x0000, /* R20931 */
+ 0x0000, /* R20932 */
+ 0x0000, /* R20933 */
+ 0x0000, /* R20934 */
+ 0x0000, /* R20935 */
+ 0x0000, /* R20936 */
+ 0x0000, /* R20937 */
+ 0x0000, /* R20938 */
+ 0x0000, /* R20939 */
+ 0x0000, /* R20940 */
+ 0x0000, /* R20941 */
+ 0x0000, /* R20942 */
+ 0x0000, /* R20943 */
+ 0x0000, /* R20944 */
+ 0x0000, /* R20945 */
+ 0x0000, /* R20946 */
+ 0x0000, /* R20947 */
+ 0x0000, /* R20948 */
+ 0x0000, /* R20949 */
+ 0x0000, /* R20950 */
+ 0x0000, /* R20951 */
+ 0x0000, /* R20952 */
+ 0x0000, /* R20953 */
+ 0x0000, /* R20954 */
+ 0x0000, /* R20955 */
+ 0x0000, /* R20956 */
+ 0x0000, /* R20957 */
+ 0x0000, /* R20958 */
+ 0x0000, /* R20959 */
+ 0x0000, /* R20960 */
+ 0x0000, /* R20961 */
+ 0x0000, /* R20962 */
+ 0x0000, /* R20963 */
+ 0x0000, /* R20964 */
+ 0x0000, /* R20965 */
+ 0x0000, /* R20966 */
+ 0x0000, /* R20967 */
+ 0x0000, /* R20968 */
+ 0x0000, /* R20969 */
+ 0x0000, /* R20970 */
+ 0x0000, /* R20971 */
+ 0x0000, /* R20972 */
+ 0x0000, /* R20973 */
+ 0x0000, /* R20974 */
+ 0x0000, /* R20975 */
+ 0x0000, /* R20976 */
+ 0x0000, /* R20977 */
+ 0x0000, /* R20978 */
+ 0x0000, /* R20979 */
+ 0x0000, /* R20980 */
+ 0x0000, /* R20981 */
+ 0x0000, /* R20982 */
+ 0x0000, /* R20983 */
+ 0x0000, /* R20984 */
+ 0x0000, /* R20985 */
+ 0x0000, /* R20986 */
+ 0x0000, /* R20987 */
+ 0x0000, /* R20988 */
+ 0x0000, /* R20989 */
+ 0x0000, /* R20990 */
+ 0x0000, /* R20991 */
+ 0x008C, /* R20992 - VSS_XHD2_1 */
+ 0x0200, /* R20993 - VSS_XHD2_0 */
+ 0x0035, /* R20994 - VSS_XHD3_1 */
+ 0x0700, /* R20995 - VSS_XHD3_0 */
+ 0x003A, /* R20996 - VSS_XHN1_1 */
+ 0x4100, /* R20997 - VSS_XHN1_0 */
+ 0x008B, /* R20998 - VSS_XHN2_1 */
+ 0x7D00, /* R20999 - VSS_XHN2_0 */
+ 0x003A, /* R21000 - VSS_XHN3_1 */
+ 0x4100, /* R21001 - VSS_XHN3_0 */
+ 0x008C, /* R21002 - VSS_XLA_1 */
+ 0xFEE8, /* R21003 - VSS_XLA_0 */
+ 0x0078, /* R21004 - VSS_XLB_1 */
+ 0x0000, /* R21005 - VSS_XLB_0 */
+ 0x003F, /* R21006 - VSS_XLG_1 */
+ 0xB260, /* R21007 - VSS_XLG_0 */
+ 0x002D, /* R21008 - VSS_PG2_1 */
+ 0x1818, /* R21009 - VSS_PG2_0 */
+ 0x0020, /* R21010 - VSS_PG_1 */
+ 0x0000, /* R21011 - VSS_PG_0 */
+ 0x00F1, /* R21012 - VSS_XTD1_1 */
+ 0x8340, /* R21013 - VSS_XTD1_0 */
+ 0x00FB, /* R21014 - VSS_XTD2_1 */
+ 0x8300, /* R21015 - VSS_XTD2_0 */
+ 0x00EE, /* R21016 - VSS_XTD3_1 */
+ 0xAEC0, /* R21017 - VSS_XTD3_0 */
+ 0x00FB, /* R21018 - VSS_XTD4_1 */
+ 0xAC40, /* R21019 - VSS_XTD4_0 */
+ 0x00F1, /* R21020 - VSS_XTD5_1 */
+ 0x7F80, /* R21021 - VSS_XTD5_0 */
+ 0x00F4, /* R21022 - VSS_XTD6_1 */
+ 0x3B40, /* R21023 - VSS_XTD6_0 */
+ 0x00F5, /* R21024 - VSS_XTD7_1 */
+ 0xFB00, /* R21025 - VSS_XTD7_0 */
+ 0x00EA, /* R21026 - VSS_XTD8_1 */
+ 0x10C0, /* R21027 - VSS_XTD8_0 */
+ 0x00FC, /* R21028 - VSS_XTD9_1 */
+ 0xC580, /* R21029 - VSS_XTD9_0 */
+ 0x00E2, /* R21030 - VSS_XTD10_1 */
+ 0x75C0, /* R21031 - VSS_XTD10_0 */
+ 0x0004, /* R21032 - VSS_XTD11_1 */
+ 0xB480, /* R21033 - VSS_XTD11_0 */
+ 0x00D4, /* R21034 - VSS_XTD12_1 */
+ 0xF980, /* R21035 - VSS_XTD12_0 */
+ 0x0004, /* R21036 - VSS_XTD13_1 */
+ 0x9140, /* R21037 - VSS_XTD13_0 */
+ 0x00D8, /* R21038 - VSS_XTD14_1 */
+ 0xA480, /* R21039 - VSS_XTD14_0 */
+ 0x0002, /* R21040 - VSS_XTD15_1 */
+ 0x3DC0, /* R21041 - VSS_XTD15_0 */
+ 0x00CF, /* R21042 - VSS_XTD16_1 */
+ 0x7A80, /* R21043 - VSS_XTD16_0 */
+ 0x00DC, /* R21044 - VSS_XTD17_1 */
+ 0x0600, /* R21045 - VSS_XTD17_0 */
+ 0x00F2, /* R21046 - VSS_XTD18_1 */
+ 0xDAC0, /* R21047 - VSS_XTD18_0 */
+ 0x00BA, /* R21048 - VSS_XTD19_1 */
+ 0xF340, /* R21049 - VSS_XTD19_0 */
+ 0x000A, /* R21050 - VSS_XTD20_1 */
+ 0x7940, /* R21051 - VSS_XTD20_0 */
+ 0x001C, /* R21052 - VSS_XTD21_1 */
+ 0x0680, /* R21053 - VSS_XTD21_0 */
+ 0x00FD, /* R21054 - VSS_XTD22_1 */
+ 0x2D00, /* R21055 - VSS_XTD22_0 */
+ 0x001C, /* R21056 - VSS_XTD23_1 */
+ 0xE840, /* R21057 - VSS_XTD23_0 */
+ 0x000D, /* R21058 - VSS_XTD24_1 */
+ 0xDC40, /* R21059 - VSS_XTD24_0 */
+ 0x00FC, /* R21060 - VSS_XTD25_1 */
+ 0x9D00, /* R21061 - VSS_XTD25_0 */
+ 0x0009, /* R21062 - VSS_XTD26_1 */
+ 0x5580, /* R21063 - VSS_XTD26_0 */
+ 0x00FE, /* R21064 - VSS_XTD27_1 */
+ 0x7E80, /* R21065 - VSS_XTD27_0 */
+ 0x000E, /* R21066 - VSS_XTD28_1 */
+ 0xAB40, /* R21067 - VSS_XTD28_0 */
+ 0x00F9, /* R21068 - VSS_XTD29_1 */
+ 0x9880, /* R21069 - VSS_XTD29_0 */
+ 0x0009, /* R21070 - VSS_XTD30_1 */
+ 0x87C0, /* R21071 - VSS_XTD30_0 */
+ 0x00FD, /* R21072 - VSS_XTD31_1 */
+ 0x2C40, /* R21073 - VSS_XTD31_0 */
+ 0x0009, /* R21074 - VSS_XTD32_1 */
+ 0x4800, /* R21075 - VSS_XTD32_0 */
+ 0x0003, /* R21076 - VSS_XTS1_1 */
+ 0x5F40, /* R21077 - VSS_XTS1_0 */
+ 0x0000, /* R21078 - VSS_XTS2_1 */
+ 0x8700, /* R21079 - VSS_XTS2_0 */
+ 0x00FA, /* R21080 - VSS_XTS3_1 */
+ 0xE4C0, /* R21081 - VSS_XTS3_0 */
+ 0x0000, /* R21082 - VSS_XTS4_1 */
+ 0x0B40, /* R21083 - VSS_XTS4_0 */
+ 0x0004, /* R21084 - VSS_XTS5_1 */
+ 0xE180, /* R21085 - VSS_XTS5_0 */
+ 0x0001, /* R21086 - VSS_XTS6_1 */
+ 0x1F40, /* R21087 - VSS_XTS6_0 */
+ 0x00F8, /* R21088 - VSS_XTS7_1 */
+ 0xB000, /* R21089 - VSS_XTS7_0 */
+ 0x00FB, /* R21090 - VSS_XTS8_1 */
+ 0xCBC0, /* R21091 - VSS_XTS8_0 */
+ 0x0004, /* R21092 - VSS_XTS9_1 */
+ 0xF380, /* R21093 - VSS_XTS9_0 */
+ 0x0007, /* R21094 - VSS_XTS10_1 */
+ 0xDF40, /* R21095 - VSS_XTS10_0 */
+ 0x00FF, /* R21096 - VSS_XTS11_1 */
+ 0x0700, /* R21097 - VSS_XTS11_0 */
+ 0x00EF, /* R21098 - VSS_XTS12_1 */
+ 0xD700, /* R21099 - VSS_XTS12_0 */
+ 0x00FB, /* R21100 - VSS_XTS13_1 */
+ 0xAF40, /* R21101 - VSS_XTS13_0 */
+ 0x0010, /* R21102 - VSS_XTS14_1 */
+ 0x8A80, /* R21103 - VSS_XTS14_0 */
+ 0x0011, /* R21104 - VSS_XTS15_1 */
+ 0x07C0, /* R21105 - VSS_XTS15_0 */
+ 0x00E0, /* R21106 - VSS_XTS16_1 */
+ 0x0800, /* R21107 - VSS_XTS16_0 */
+ 0x00D2, /* R21108 - VSS_XTS17_1 */
+ 0x7600, /* R21109 - VSS_XTS17_0 */
+ 0x0020, /* R21110 - VSS_XTS18_1 */
+ 0xCF40, /* R21111 - VSS_XTS18_0 */
+ 0x0030, /* R21112 - VSS_XTS19_1 */
+ 0x2340, /* R21113 - VSS_XTS19_0 */
+ 0x00FD, /* R21114 - VSS_XTS20_1 */
+ 0x69C0, /* R21115 - VSS_XTS20_0 */
+ 0x0028, /* R21116 - VSS_XTS21_1 */
+ 0x3500, /* R21117 - VSS_XTS21_0 */
+ 0x0006, /* R21118 - VSS_XTS22_1 */
+ 0x3300, /* R21119 - VSS_XTS22_0 */
+ 0x00D9, /* R21120 - VSS_XTS23_1 */
+ 0xF6C0, /* R21121 - VSS_XTS23_0 */
+ 0x00F3, /* R21122 - VSS_XTS24_1 */
+ 0x3340, /* R21123 - VSS_XTS24_0 */
+ 0x000F, /* R21124 - VSS_XTS25_1 */
+ 0x4200, /* R21125 - VSS_XTS25_0 */
+ 0x0004, /* R21126 - VSS_XTS26_1 */
+ 0x0C80, /* R21127 - VSS_XTS26_0 */
+ 0x00FB, /* R21128 - VSS_XTS27_1 */
+ 0x3F80, /* R21129 - VSS_XTS27_0 */
+ 0x00F7, /* R21130 - VSS_XTS28_1 */
+ 0x57C0, /* R21131 - VSS_XTS28_0 */
+ 0x0003, /* R21132 - VSS_XTS29_1 */
+ 0x5400, /* R21133 - VSS_XTS29_0 */
+ 0x0000, /* R21134 - VSS_XTS30_1 */
+ 0xC6C0, /* R21135 - VSS_XTS30_0 */
+ 0x0003, /* R21136 - VSS_XTS31_1 */
+ 0x12C0, /* R21137 - VSS_XTS31_0 */
+ 0x00FD, /* R21138 - VSS_XTS32_1 */
+ 0x8580, /* R21139 - VSS_XTS32_0 */
+};
+
+const struct wm8962_reg_access wm8962_reg_access[WM8962_MAX_REGISTER + 1] = {
+ { 0x00FF, 0x01FF, 0x0000 }, /* R0 - Left Input volume */
+ { 0xFEFF, 0x01FF, 0xFFFF }, /* R1 - Right Input volume */
+ { 0x00FF, 0x01FF, 0x0000 }, /* R2 - HPOUTL volume */
+ { 0x00FF, 0x01FF, 0x0000 }, /* R3 - HPOUTR volume */
+ { 0x07FE, 0x07FE, 0xFFFF }, /* R4 - Clocking1 */
+ { 0x007F, 0x007F, 0x0000 }, /* R5 - ADC & DAC Control 1 */
+ { 0x37ED, 0x37ED, 0x0000 }, /* R6 - ADC & DAC Control 2 */
+ { 0x1FFF, 0x1FFF, 0x0000 }, /* R7 - Audio Interface 0 */
+ { 0x0FEF, 0x0FEF, 0xFFFF }, /* R8 - Clocking2 */
+ { 0x0B9F, 0x039F, 0x0000 }, /* R9 - Audio Interface 1 */
+ { 0x00FF, 0x01FF, 0x0000 }, /* R10 - Left DAC volume */
+ { 0x00FF, 0x01FF, 0x0000 }, /* R11 - Right DAC volume */
+ { 0x0000, 0x0000, 0x0000 }, /* R12 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13 */
+ { 0x07FF, 0x07FF, 0x0000 }, /* R14 - Audio Interface 2 */
+ { 0xFFFF, 0xFFFF, 0xFFFF }, /* R15 - Software Reset */
+ { 0x0000, 0x0000, 0x0000 }, /* R16 */
+ { 0x07FF, 0x07FF, 0x0000 }, /* R17 - ALC1 */
+ { 0xF8FF, 0x00FF, 0xFFFF }, /* R18 - ALC2 */
+ { 0x1DFF, 0x1DFF, 0x0000 }, /* R19 - ALC3 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20 - Noise Gate */
+ { 0x00FF, 0x01FF, 0x0000 }, /* R21 - Left ADC volume */
+ { 0x00FF, 0x01FF, 0x0000 }, /* R22 - Right ADC volume */
+ { 0x0161, 0x0161, 0x0000 }, /* R23 - Additional control(1) */
+ { 0x0008, 0x0008, 0x0000 }, /* R24 - Additional control(2) */
+ { 0x07FE, 0x07FE, 0x0000 }, /* R25 - Pwr Mgmt (1) */
+ { 0x01FB, 0x01FB, 0x0000 }, /* R26 - Pwr Mgmt (2) */
+ { 0x0017, 0x0017, 0x0000 }, /* R27 - Additional Control (3) */
+ { 0x001C, 0x001C, 0x0000 }, /* R28 - Anti-pop */
+ { 0x0000, 0x0000, 0x0000 }, /* R29 */
+ { 0xFFFE, 0xFFFE, 0x0000 }, /* R30 - Clocking 3 */
+ { 0x000F, 0x000F, 0x0000 }, /* R31 - Input mixer control (1) */
+ { 0x01FF, 0x01FF, 0x0000 }, /* R32 - Left input mixer volume */
+ { 0x01FF, 0x01FF, 0x0000 }, /* R33 - Right input mixer volume */
+ { 0x003F, 0x003F, 0x0000 }, /* R34 - Input mixer control (2) */
+ { 0x003F, 0x003F, 0x0000 }, /* R35 - Input bias control */
+ { 0x0000, 0x0000, 0x0000 }, /* R36 */
+ { 0x001F, 0x001F, 0x0000 }, /* R37 - Left input PGA control */
+ { 0x001F, 0x001F, 0x0000 }, /* R38 - Right input PGA control */
+ { 0x0000, 0x0000, 0x0000 }, /* R39 */
+ { 0x00FF, 0x01FF, 0x0000 }, /* R40 - SPKOUTL volume */
+ { 0x00FF, 0x01FF, 0x0000 }, /* R41 - SPKOUTR volume */
+ { 0x0000, 0x0000, 0x0000 }, /* R42 */
+ { 0x0000, 0x0000, 0x0000 }, /* R43 */
+ { 0x0000, 0x0000, 0x0000 }, /* R44 */
+ { 0x0000, 0x0000, 0x0000 }, /* R45 */
+ { 0x0000, 0x0000, 0x0000 }, /* R46 */
+ { 0x000F, 0x0000, 0x0000 }, /* R47 - Thermal Shutdown Status */
+ { 0x7EC7, 0x7E07, 0x0000 }, /* R48 - Additional Control (4) */
+ { 0x00D3, 0x00D7, 0xFFFF }, /* R49 - Class D Control 1 */
+ { 0x0000, 0x0000, 0x0000 }, /* R50 */
+ { 0x0047, 0x0047, 0x0000 }, /* R51 - Class D Control 2 */
+ { 0x0000, 0x0000, 0x0000 }, /* R52 */
+ { 0x0000, 0x0000, 0x0000 }, /* R53 */
+ { 0x0000, 0x0000, 0x0000 }, /* R54 */
+ { 0x0000, 0x0000, 0x0000 }, /* R55 */
+ { 0x001E, 0x001E, 0x0000 }, /* R56 - Clocking 4 */
+ { 0x02FC, 0x02FC, 0x0000 }, /* R57 - DAC DSP Mixing (1) */
+ { 0x00FC, 0x00FC, 0x0000 }, /* R58 - DAC DSP Mixing (2) */
+ { 0x0000, 0x0000, 0x0000 }, /* R59 */
+ { 0x00CC, 0x00CC, 0x0000 }, /* R60 - DC Servo 0 */
+ { 0x00DD, 0x00DD, 0x0000 }, /* R61 - DC Servo 1 */
+ { 0x0000, 0x0000, 0x0000 }, /* R62 */
+ { 0x0000, 0x0000, 0x0000 }, /* R63 */
+ { 0x3F80, 0x3F80, 0x0000 }, /* R64 - DC Servo 4 */
+ { 0x0000, 0x0000, 0x0000 }, /* R65 */
+ { 0x0780, 0x0000, 0xFFFF }, /* R66 - DC Servo 6 */
+ { 0x0000, 0x0000, 0x0000 }, /* R67 */
+ { 0x0007, 0x0007, 0x0000 }, /* R68 - Analogue PGA Bias */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R69 - Analogue HP 0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R70 */
+ { 0x01FF, 0x01FF, 0x0000 }, /* R71 - Analogue HP 2 */
+ { 0x0001, 0x0001, 0x0000 }, /* R72 - Charge Pump 1 */
+ { 0x0000, 0x0000, 0x0000 }, /* R73 */
+ { 0x0000, 0x0000, 0x0000 }, /* R74 */
+ { 0x0000, 0x0000, 0x0000 }, /* R75 */
+ { 0x0000, 0x0000, 0x0000 }, /* R76 */
+ { 0x0000, 0x0000, 0x0000 }, /* R77 */
+ { 0x0000, 0x0000, 0x0000 }, /* R78 */
+ { 0x0000, 0x0000, 0x0000 }, /* R79 */
+ { 0x0000, 0x0000, 0x0000 }, /* R80 */
+ { 0x0000, 0x0000, 0x0000 }, /* R81 */
+ { 0x0001, 0x0001, 0x0000 }, /* R82 - Charge Pump B */
+ { 0x0000, 0x0000, 0x0000 }, /* R83 */
+ { 0x0000, 0x0000, 0x0000 }, /* R84 */
+ { 0x0000, 0x0000, 0x0000 }, /* R85 */
+ { 0x0000, 0x0000, 0x0000 }, /* R86 */
+ { 0x00A0, 0x00A0, 0x0000 }, /* R87 - Write Sequencer Control 1 */
+ { 0x0000, 0x0000, 0x0000 }, /* R88 */
+ { 0x0000, 0x0000, 0x0000 }, /* R89 */
+ { 0x007F, 0x01FF, 0x0000 }, /* R90 - Write Sequencer Control 2 */
+ { 0x0000, 0x0000, 0x0000 }, /* R91 */
+ { 0x0000, 0x0000, 0x0000 }, /* R92 */
+ { 0x03F9, 0x0000, 0x0000 }, /* R93 - Write Sequencer Control 3 */
+ { 0x0070, 0x0070, 0x0000 }, /* R94 - Control Interface */
+ { 0x0000, 0x0000, 0x0000 }, /* R95 */
+ { 0x0000, 0x0000, 0x0000 }, /* R96 */
+ { 0x0000, 0x0000, 0x0000 }, /* R97 */
+ { 0x0000, 0x0000, 0x0000 }, /* R98 */
+ { 0x000F, 0x000F, 0x0000 }, /* R99 - Mixer Enables */
+ { 0x00BF, 0x00BF, 0x0000 }, /* R100 - Headphone Mixer (1) */
+ { 0x00BF, 0x00BF, 0x0000 }, /* R101 - Headphone Mixer (2) */
+ { 0x01FF, 0x01FF, 0x0000 }, /* R102 - Headphone Mixer (3) */
+ { 0x01FF, 0x01FF, 0x0000 }, /* R103 - Headphone Mixer (4) */
+ { 0x0000, 0x0000, 0x0000 }, /* R104 */
+ { 0x00BF, 0x00BF, 0x0000 }, /* R105 - Speaker Mixer (1) */
+ { 0x00BF, 0x00BF, 0x0000 }, /* R106 - Speaker Mixer (2) */
+ { 0x01FF, 0x01FF, 0x0000 }, /* R107 - Speaker Mixer (3) */
+ { 0x01FF, 0x01FF, 0x0000 }, /* R108 - Speaker Mixer (4) */
+ { 0x00F0, 0x00F0, 0x0000 }, /* R109 - Speaker Mixer (5) */
+ { 0x00F7, 0x00F7, 0x0000 }, /* R110 - Beep Generator (1) */
+ { 0x0000, 0x0000, 0x0000 }, /* R111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R114 */
+ { 0x001F, 0x001F, 0x0000 }, /* R115 - Oscillator Trim (3) */
+ { 0x001F, 0x001F, 0x0000 }, /* R116 - Oscillator Trim (4) */
+ { 0x0000, 0x0000, 0x0000 }, /* R117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R118 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R119 - Oscillator Trim (7) */
+ { 0x0000, 0x0000, 0x0000 }, /* R120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R123 */
+ { 0x0079, 0x0079, 0x0000 }, /* R124 - Analogue Clocking1 */
+ { 0x00DF, 0x00DF, 0x0000 }, /* R125 - Analogue Clocking2 */
+ { 0x000D, 0x000D, 0x0000 }, /* R126 - Analogue Clocking3 */
+ { 0x0000, 0xFFFF, 0x0000 }, /* R127 - PLL Software Reset */
+ { 0x0000, 0x0000, 0x0000 }, /* R128 */
+ { 0x00B0, 0x00B0, 0x0000 }, /* R129 - PLL2 */
+ { 0x0000, 0x0000, 0x0000 }, /* R130 */
+ { 0x0003, 0x0003, 0x0000 }, /* R131 - PLL 4 */
+ { 0x0000, 0x0000, 0x0000 }, /* R132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R135 */
+ { 0x005F, 0x005F, 0x0000 }, /* R136 - PLL 9 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R137 - PLL 10 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R138 - PLL 11 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R139 - PLL 12 */
+ { 0x005F, 0x005F, 0x0000 }, /* R140 - PLL 13 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R141 - PLL 14 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R142 - PLL 15 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R143 - PLL 16 */
+ { 0x0000, 0x0000, 0x0000 }, /* R144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R154 */
+ { 0x0067, 0x0067, 0x0000 }, /* R155 - FLL Control (1) */
+ { 0x01FB, 0x01FB, 0x0000 }, /* R156 - FLL Control (2) */
+ { 0x0007, 0x0007, 0x0000 }, /* R157 - FLL Control (3) */
+ { 0x0000, 0x0000, 0x0000 }, /* R158 */
+ { 0x007F, 0x007F, 0x0000 }, /* R159 - FLL Control (5) */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R160 - FLL Control (6) */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R161 - FLL Control (7) */
+ { 0x03FF, 0x03FF, 0x0000 }, /* R162 - FLL Control (8) */
+ { 0x0000, 0x0000, 0x0000 }, /* R163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R251 */
+ { 0x0005, 0x0005, 0x0000 }, /* R252 - General test 1 */
+ { 0x0000, 0x0000, 0x0000 }, /* R253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R255 */
+ { 0x000F, 0x000F, 0x0000 }, /* R256 - DF1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R257 - DF2 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R258 - DF3 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R259 - DF4 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R260 - DF5 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R261 - DF6 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R262 - DF7 */
+ { 0x0000, 0x0000, 0x0000 }, /* R263 */
+ { 0x0003, 0x0003, 0x0000 }, /* R264 - LHPF1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R265 - LHPF2 */
+ { 0x0000, 0x0000, 0x0000 }, /* R266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R267 */
+ { 0x0077, 0x0077, 0x0000 }, /* R268 - THREED1 */
+ { 0xFFFC, 0xFFFC, 0x0000 }, /* R269 - THREED2 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R270 - THREED3 */
+ { 0xFFFC, 0xFFFC, 0x0000 }, /* R271 - THREED4 */
+ { 0x0000, 0x0000, 0x0000 }, /* R272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R275 */
+ { 0x7FFF, 0x7FFF, 0x0000 }, /* R276 - DRC 1 */
+ { 0x1FFF, 0x1FFF, 0x0000 }, /* R277 - DRC 2 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R278 - DRC 3 */
+ { 0x07FF, 0x07FF, 0x0000 }, /* R279 - DRC 4 */
+ { 0x03FF, 0x03FF, 0x0000 }, /* R280 - DRC 5 */
+ { 0x0000, 0x0000, 0x0000 }, /* R281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R284 */
+ { 0x0003, 0x0003, 0x0000 }, /* R285 - Tloopback */
+ { 0x0000, 0x0000, 0x0000 }, /* R286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R334 */
+ { 0x0007, 0x0007, 0x0000 }, /* R335 - EQ1 */
+ { 0xFFFE, 0xFFFE, 0x0000 }, /* R336 - EQ2 */
+ { 0xFFC0, 0xFFC0, 0x0000 }, /* R337 - EQ3 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R338 - EQ4 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R339 - EQ5 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R340 - EQ6 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R341 - EQ7 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R342 - EQ8 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R343 - EQ9 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R344 - EQ10 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R345 - EQ11 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R346 - EQ12 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R347 - EQ13 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R348 - EQ14 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R349 - EQ15 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R350 - EQ16 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R351 - EQ17 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R352 - EQ18 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R353 - EQ19 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R354 - EQ20 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R355 - EQ21 */
+ { 0xFFFE, 0xFFFE, 0x0000 }, /* R356 - EQ22 */
+ { 0xFFC0, 0xFFC0, 0x0000 }, /* R357 - EQ23 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R358 - EQ24 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R359 - EQ25 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R360 - EQ26 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R361 - EQ27 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R362 - EQ28 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R363 - EQ29 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R364 - EQ30 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R365 - EQ31 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R366 - EQ32 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R367 - EQ33 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R368 - EQ34 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R369 - EQ35 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R370 - EQ36 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R371 - EQ37 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R372 - EQ38 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R373 - EQ39 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R374 - EQ40 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R375 - EQ41 */
+ { 0x0000, 0x0000, 0x0000 }, /* R376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R512 */
+ { 0x045F, 0x045F, 0x0000 }, /* R513 - GPIO 2 */
+ { 0x045F, 0x045F, 0x0000 }, /* R514 - GPIO 3 */
+ { 0x0000, 0x0000, 0x0000 }, /* R515 */
+ { 0xE75F, 0xE75F, 0x0000 }, /* R516 - GPIO 5 */
+ { 0xE75F, 0xE75F, 0x0000 }, /* R517 - GPIO 6 */
+ { 0x0000, 0x0000, 0x0000 }, /* R518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R559 */
+ { 0x0030, 0x0030, 0xFFFF }, /* R560 - Interrupt Status 1 */
+ { 0xFFED, 0xFFED, 0xFFFF }, /* R561 - Interrupt Status 2 */
+ { 0x0000, 0x0000, 0x0000 }, /* R562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R567 */
+ { 0x0030, 0x0030, 0x0000 }, /* R568 - Interrupt Status 1 Mask */
+ { 0xFFED, 0xFFED, 0x0000 }, /* R569 - Interrupt Status 2 Mask */
+ { 0x0000, 0x0000, 0x0000 }, /* R570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R575 */
+ { 0x0001, 0x0001, 0x0000 }, /* R576 - Interrupt Control */
+ { 0x0000, 0x0000, 0x0000 }, /* R577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R583 */
+ { 0x002D, 0x002D, 0x0000 }, /* R584 - IRQ Debounce */
+ { 0x0000, 0x0000, 0x0000 }, /* R585 */
+ { 0xC000, 0xC000, 0x0000 }, /* R586 - MICINT Source Pol */
+ { 0x0000, 0x0000, 0x0000 }, /* R587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R767 */
+ { 0x0001, 0x0001, 0x0000 }, /* R768 - DSP2 Power Management */
+ { 0x0000, 0x0000, 0x0000 }, /* R769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1036 */
+ { 0x0000, 0x003F, 0x0000 }, /* R1037 - DSP2_ExecControl */
+ { 0x0000, 0x0000, 0x0000 }, /* R1038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R1999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R2999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R3999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4095 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4096 - Write Sequencer 0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4097 - Write Sequencer 1 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4098 - Write Sequencer 2 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4099 - Write Sequencer 3 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4100 - Write Sequencer 4 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4101 - Write Sequencer 5 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4102 - Write Sequencer 6 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4103 - Write Sequencer 7 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4104 - Write Sequencer 8 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4105 - Write Sequencer 9 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4106 - Write Sequencer 10 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4107 - Write Sequencer 11 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4108 - Write Sequencer 12 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4109 - Write Sequencer 13 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4110 - Write Sequencer 14 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4111 - Write Sequencer 15 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4112 - Write Sequencer 16 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4113 - Write Sequencer 17 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4114 - Write Sequencer 18 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4115 - Write Sequencer 19 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4116 - Write Sequencer 20 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4117 - Write Sequencer 21 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4118 - Write Sequencer 22 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4119 - Write Sequencer 23 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4120 - Write Sequencer 24 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4121 - Write Sequencer 25 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4122 - Write Sequencer 26 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4123 - Write Sequencer 27 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4124 - Write Sequencer 28 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4125 - Write Sequencer 29 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4126 - Write Sequencer 30 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4127 - Write Sequencer 31 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4128 - Write Sequencer 32 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4129 - Write Sequencer 33 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4130 - Write Sequencer 34 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4131 - Write Sequencer 35 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4132 - Write Sequencer 36 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4133 - Write Sequencer 37 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4134 - Write Sequencer 38 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4135 - Write Sequencer 39 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4136 - Write Sequencer 40 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4137 - Write Sequencer 41 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4138 - Write Sequencer 42 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4139 - Write Sequencer 43 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4140 - Write Sequencer 44 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4141 - Write Sequencer 45 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4142 - Write Sequencer 46 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4143 - Write Sequencer 47 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4144 - Write Sequencer 48 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4145 - Write Sequencer 49 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4146 - Write Sequencer 50 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4147 - Write Sequencer 51 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4148 - Write Sequencer 52 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4149 - Write Sequencer 53 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4150 - Write Sequencer 54 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4151 - Write Sequencer 55 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4152 - Write Sequencer 56 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4153 - Write Sequencer 57 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4154 - Write Sequencer 58 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4155 - Write Sequencer 59 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4156 - Write Sequencer 60 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4157 - Write Sequencer 61 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4158 - Write Sequencer 62 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4159 - Write Sequencer 63 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4160 - Write Sequencer 64 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4161 - Write Sequencer 65 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4162 - Write Sequencer 66 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4163 - Write Sequencer 67 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4164 - Write Sequencer 68 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4165 - Write Sequencer 69 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4166 - Write Sequencer 70 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4167 - Write Sequencer 71 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4168 - Write Sequencer 72 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4169 - Write Sequencer 73 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4170 - Write Sequencer 74 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4171 - Write Sequencer 75 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4172 - Write Sequencer 76 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4173 - Write Sequencer 77 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4174 - Write Sequencer 78 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4175 - Write Sequencer 79 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4176 - Write Sequencer 80 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4177 - Write Sequencer 81 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4178 - Write Sequencer 82 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4179 - Write Sequencer 83 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4180 - Write Sequencer 84 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4181 - Write Sequencer 85 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4182 - Write Sequencer 86 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4183 - Write Sequencer 87 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4184 - Write Sequencer 88 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4185 - Write Sequencer 89 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4186 - Write Sequencer 90 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4187 - Write Sequencer 91 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4188 - Write Sequencer 92 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4189 - Write Sequencer 93 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4190 - Write Sequencer 94 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4191 - Write Sequencer 95 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4192 - Write Sequencer 96 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4193 - Write Sequencer 97 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4194 - Write Sequencer 98 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4195 - Write Sequencer 99 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4196 - Write Sequencer 100 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4197 - Write Sequencer 101 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4198 - Write Sequencer 102 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4199 - Write Sequencer 103 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4200 - Write Sequencer 104 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4201 - Write Sequencer 105 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4202 - Write Sequencer 106 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4203 - Write Sequencer 107 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4204 - Write Sequencer 108 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4205 - Write Sequencer 109 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4206 - Write Sequencer 110 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4207 - Write Sequencer 111 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4208 - Write Sequencer 112 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4209 - Write Sequencer 113 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4210 - Write Sequencer 114 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4211 - Write Sequencer 115 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4212 - Write Sequencer 116 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4213 - Write Sequencer 117 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4214 - Write Sequencer 118 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4215 - Write Sequencer 119 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4216 - Write Sequencer 120 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4217 - Write Sequencer 121 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4218 - Write Sequencer 122 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4219 - Write Sequencer 123 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4220 - Write Sequencer 124 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4221 - Write Sequencer 125 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4222 - Write Sequencer 126 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4223 - Write Sequencer 127 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4224 - Write Sequencer 128 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4225 - Write Sequencer 129 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4226 - Write Sequencer 130 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4227 - Write Sequencer 131 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4228 - Write Sequencer 132 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4229 - Write Sequencer 133 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4230 - Write Sequencer 134 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4231 - Write Sequencer 135 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4232 - Write Sequencer 136 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4233 - Write Sequencer 137 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4234 - Write Sequencer 138 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4235 - Write Sequencer 139 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4236 - Write Sequencer 140 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4237 - Write Sequencer 141 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4238 - Write Sequencer 142 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4239 - Write Sequencer 143 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4240 - Write Sequencer 144 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4241 - Write Sequencer 145 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4242 - Write Sequencer 146 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4243 - Write Sequencer 147 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4244 - Write Sequencer 148 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4245 - Write Sequencer 149 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4246 - Write Sequencer 150 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4247 - Write Sequencer 151 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4248 - Write Sequencer 152 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4249 - Write Sequencer 153 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4250 - Write Sequencer 154 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4251 - Write Sequencer 155 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4252 - Write Sequencer 156 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4253 - Write Sequencer 157 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4254 - Write Sequencer 158 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4255 - Write Sequencer 159 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4256 - Write Sequencer 160 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4257 - Write Sequencer 161 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4258 - Write Sequencer 162 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4259 - Write Sequencer 163 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4260 - Write Sequencer 164 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4261 - Write Sequencer 165 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4262 - Write Sequencer 166 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4263 - Write Sequencer 167 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4264 - Write Sequencer 168 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4265 - Write Sequencer 169 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4266 - Write Sequencer 170 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4267 - Write Sequencer 171 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4268 - Write Sequencer 172 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4269 - Write Sequencer 173 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4270 - Write Sequencer 174 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4271 - Write Sequencer 175 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4272 - Write Sequencer 176 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4273 - Write Sequencer 177 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4274 - Write Sequencer 178 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4275 - Write Sequencer 179 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4276 - Write Sequencer 180 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4277 - Write Sequencer 181 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4278 - Write Sequencer 182 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4279 - Write Sequencer 183 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4280 - Write Sequencer 184 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4281 - Write Sequencer 185 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4282 - Write Sequencer 186 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4283 - Write Sequencer 187 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4284 - Write Sequencer 188 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4285 - Write Sequencer 189 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4286 - Write Sequencer 190 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4287 - Write Sequencer 191 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4288 - Write Sequencer 192 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4289 - Write Sequencer 193 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4290 - Write Sequencer 194 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4291 - Write Sequencer 195 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4292 - Write Sequencer 196 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4293 - Write Sequencer 197 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4294 - Write Sequencer 198 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4295 - Write Sequencer 199 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4296 - Write Sequencer 200 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4297 - Write Sequencer 201 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4298 - Write Sequencer 202 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4299 - Write Sequencer 203 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4300 - Write Sequencer 204 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4301 - Write Sequencer 205 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4302 - Write Sequencer 206 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4303 - Write Sequencer 207 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4304 - Write Sequencer 208 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4305 - Write Sequencer 209 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4306 - Write Sequencer 210 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4307 - Write Sequencer 211 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4308 - Write Sequencer 212 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4309 - Write Sequencer 213 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4310 - Write Sequencer 214 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4311 - Write Sequencer 215 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4312 - Write Sequencer 216 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4313 - Write Sequencer 217 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4314 - Write Sequencer 218 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4315 - Write Sequencer 219 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4316 - Write Sequencer 220 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4317 - Write Sequencer 221 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4318 - Write Sequencer 222 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4319 - Write Sequencer 223 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4320 - Write Sequencer 224 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4321 - Write Sequencer 225 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4322 - Write Sequencer 226 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4323 - Write Sequencer 227 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4324 - Write Sequencer 228 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4325 - Write Sequencer 229 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4326 - Write Sequencer 230 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4327 - Write Sequencer 231 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4328 - Write Sequencer 232 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4329 - Write Sequencer 233 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4330 - Write Sequencer 234 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4331 - Write Sequencer 235 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4332 - Write Sequencer 236 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4333 - Write Sequencer 237 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4334 - Write Sequencer 238 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4335 - Write Sequencer 239 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4336 - Write Sequencer 240 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4337 - Write Sequencer 241 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4338 - Write Sequencer 242 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4339 - Write Sequencer 243 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4340 - Write Sequencer 244 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4341 - Write Sequencer 245 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4342 - Write Sequencer 246 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4343 - Write Sequencer 247 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4344 - Write Sequencer 248 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4345 - Write Sequencer 249 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4346 - Write Sequencer 250 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4347 - Write Sequencer 251 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4348 - Write Sequencer 252 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4349 - Write Sequencer 253 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4350 - Write Sequencer 254 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4351 - Write Sequencer 255 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4352 - Write Sequencer 256 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4353 - Write Sequencer 257 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4354 - Write Sequencer 258 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4355 - Write Sequencer 259 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4356 - Write Sequencer 260 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4357 - Write Sequencer 261 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4358 - Write Sequencer 262 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4359 - Write Sequencer 263 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4360 - Write Sequencer 264 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4361 - Write Sequencer 265 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4362 - Write Sequencer 266 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4363 - Write Sequencer 267 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4364 - Write Sequencer 268 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4365 - Write Sequencer 269 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4366 - Write Sequencer 270 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4367 - Write Sequencer 271 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4368 - Write Sequencer 272 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4369 - Write Sequencer 273 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4370 - Write Sequencer 274 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4371 - Write Sequencer 275 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4372 - Write Sequencer 276 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4373 - Write Sequencer 277 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4374 - Write Sequencer 278 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4375 - Write Sequencer 279 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4376 - Write Sequencer 280 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4377 - Write Sequencer 281 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4378 - Write Sequencer 282 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4379 - Write Sequencer 283 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4380 - Write Sequencer 284 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4381 - Write Sequencer 285 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4382 - Write Sequencer 286 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4383 - Write Sequencer 287 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4384 - Write Sequencer 288 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4385 - Write Sequencer 289 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4386 - Write Sequencer 290 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4387 - Write Sequencer 291 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4388 - Write Sequencer 292 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4389 - Write Sequencer 293 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4390 - Write Sequencer 294 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4391 - Write Sequencer 295 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4392 - Write Sequencer 296 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4393 - Write Sequencer 297 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4394 - Write Sequencer 298 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4395 - Write Sequencer 299 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4396 - Write Sequencer 300 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4397 - Write Sequencer 301 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4398 - Write Sequencer 302 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4399 - Write Sequencer 303 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4400 - Write Sequencer 304 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4401 - Write Sequencer 305 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4402 - Write Sequencer 306 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4403 - Write Sequencer 307 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4404 - Write Sequencer 308 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4405 - Write Sequencer 309 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4406 - Write Sequencer 310 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4407 - Write Sequencer 311 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4408 - Write Sequencer 312 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4409 - Write Sequencer 313 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4410 - Write Sequencer 314 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4411 - Write Sequencer 315 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4412 - Write Sequencer 316 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4413 - Write Sequencer 317 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4414 - Write Sequencer 318 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4415 - Write Sequencer 319 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4416 - Write Sequencer 320 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4417 - Write Sequencer 321 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4418 - Write Sequencer 322 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4419 - Write Sequencer 323 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4420 - Write Sequencer 324 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4421 - Write Sequencer 325 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4422 - Write Sequencer 326 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4423 - Write Sequencer 327 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4424 - Write Sequencer 328 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4425 - Write Sequencer 329 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4426 - Write Sequencer 330 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4427 - Write Sequencer 331 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4428 - Write Sequencer 332 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4429 - Write Sequencer 333 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4430 - Write Sequencer 334 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4431 - Write Sequencer 335 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4432 - Write Sequencer 336 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4433 - Write Sequencer 337 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4434 - Write Sequencer 338 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4435 - Write Sequencer 339 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4436 - Write Sequencer 340 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4437 - Write Sequencer 341 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4438 - Write Sequencer 342 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4439 - Write Sequencer 343 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4440 - Write Sequencer 344 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4441 - Write Sequencer 345 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4442 - Write Sequencer 346 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4443 - Write Sequencer 347 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4444 - Write Sequencer 348 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4445 - Write Sequencer 349 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4446 - Write Sequencer 350 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4447 - Write Sequencer 351 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4448 - Write Sequencer 352 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4449 - Write Sequencer 353 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4450 - Write Sequencer 354 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4451 - Write Sequencer 355 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4452 - Write Sequencer 356 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4453 - Write Sequencer 357 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4454 - Write Sequencer 358 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4455 - Write Sequencer 359 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4456 - Write Sequencer 360 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4457 - Write Sequencer 361 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4458 - Write Sequencer 362 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4459 - Write Sequencer 363 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4460 - Write Sequencer 364 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4461 - Write Sequencer 365 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4462 - Write Sequencer 366 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4463 - Write Sequencer 367 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4464 - Write Sequencer 368 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4465 - Write Sequencer 369 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4466 - Write Sequencer 370 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4467 - Write Sequencer 371 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4468 - Write Sequencer 372 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4469 - Write Sequencer 373 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4470 - Write Sequencer 374 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4471 - Write Sequencer 375 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4472 - Write Sequencer 376 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4473 - Write Sequencer 377 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4474 - Write Sequencer 378 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4475 - Write Sequencer 379 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4476 - Write Sequencer 380 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4477 - Write Sequencer 381 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4478 - Write Sequencer 382 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4479 - Write Sequencer 383 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4480 - Write Sequencer 384 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4481 - Write Sequencer 385 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4482 - Write Sequencer 386 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4483 - Write Sequencer 387 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4484 - Write Sequencer 388 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4485 - Write Sequencer 389 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4486 - Write Sequencer 390 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4487 - Write Sequencer 391 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4488 - Write Sequencer 392 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4489 - Write Sequencer 393 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4490 - Write Sequencer 394 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4491 - Write Sequencer 395 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4492 - Write Sequencer 396 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4493 - Write Sequencer 397 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4494 - Write Sequencer 398 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4495 - Write Sequencer 399 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4496 - Write Sequencer 400 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4497 - Write Sequencer 401 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4498 - Write Sequencer 402 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4499 - Write Sequencer 403 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4500 - Write Sequencer 404 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4501 - Write Sequencer 405 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4502 - Write Sequencer 406 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4503 - Write Sequencer 407 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4504 - Write Sequencer 408 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4505 - Write Sequencer 409 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4506 - Write Sequencer 410 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4507 - Write Sequencer 411 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4508 - Write Sequencer 412 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4509 - Write Sequencer 413 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4510 - Write Sequencer 414 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4511 - Write Sequencer 415 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4512 - Write Sequencer 416 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4513 - Write Sequencer 417 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4514 - Write Sequencer 418 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4515 - Write Sequencer 419 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4516 - Write Sequencer 420 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4517 - Write Sequencer 421 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4518 - Write Sequencer 422 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4519 - Write Sequencer 423 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4520 - Write Sequencer 424 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4521 - Write Sequencer 425 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4522 - Write Sequencer 426 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4523 - Write Sequencer 427 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4524 - Write Sequencer 428 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4525 - Write Sequencer 429 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4526 - Write Sequencer 430 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4527 - Write Sequencer 431 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4528 - Write Sequencer 432 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4529 - Write Sequencer 433 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4530 - Write Sequencer 434 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4531 - Write Sequencer 435 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4532 - Write Sequencer 436 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4533 - Write Sequencer 437 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4534 - Write Sequencer 438 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4535 - Write Sequencer 439 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4536 - Write Sequencer 440 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4537 - Write Sequencer 441 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4538 - Write Sequencer 442 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4539 - Write Sequencer 443 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4540 - Write Sequencer 444 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4541 - Write Sequencer 445 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4542 - Write Sequencer 446 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4543 - Write Sequencer 447 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4544 - Write Sequencer 448 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4545 - Write Sequencer 449 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4546 - Write Sequencer 450 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4547 - Write Sequencer 451 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4548 - Write Sequencer 452 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4549 - Write Sequencer 453 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4550 - Write Sequencer 454 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4551 - Write Sequencer 455 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4552 - Write Sequencer 456 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4553 - Write Sequencer 457 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4554 - Write Sequencer 458 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4555 - Write Sequencer 459 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4556 - Write Sequencer 460 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4557 - Write Sequencer 461 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4558 - Write Sequencer 462 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4559 - Write Sequencer 463 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4560 - Write Sequencer 464 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4561 - Write Sequencer 465 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4562 - Write Sequencer 466 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4563 - Write Sequencer 467 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4564 - Write Sequencer 468 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4565 - Write Sequencer 469 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4566 - Write Sequencer 470 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4567 - Write Sequencer 471 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4568 - Write Sequencer 472 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4569 - Write Sequencer 473 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4570 - Write Sequencer 474 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4571 - Write Sequencer 475 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4572 - Write Sequencer 476 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4573 - Write Sequencer 477 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4574 - Write Sequencer 478 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4575 - Write Sequencer 479 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4576 - Write Sequencer 480 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4577 - Write Sequencer 481 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4578 - Write Sequencer 482 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4579 - Write Sequencer 483 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4580 - Write Sequencer 484 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4581 - Write Sequencer 485 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4582 - Write Sequencer 486 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4583 - Write Sequencer 487 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4584 - Write Sequencer 488 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4585 - Write Sequencer 489 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4586 - Write Sequencer 490 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4587 - Write Sequencer 491 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4588 - Write Sequencer 492 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4589 - Write Sequencer 493 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4590 - Write Sequencer 494 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4591 - Write Sequencer 495 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4592 - Write Sequencer 496 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4593 - Write Sequencer 497 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4594 - Write Sequencer 498 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4595 - Write Sequencer 499 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4596 - Write Sequencer 500 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4597 - Write Sequencer 501 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4598 - Write Sequencer 502 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4599 - Write Sequencer 503 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4600 - Write Sequencer 504 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4601 - Write Sequencer 505 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4602 - Write Sequencer 506 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4603 - Write Sequencer 507 */
+ { 0x3FFF, 0x3FFF, 0x0000 }, /* R4604 - Write Sequencer 508 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R4605 - Write Sequencer 509 */
+ { 0x070F, 0x070F, 0x0000 }, /* R4606 - Write Sequencer 510 */
+ { 0x010F, 0x010F, 0x0000 }, /* R4607 - Write Sequencer 511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R4999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R5999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R6999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R7999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8191 */
+ { 0x03FF, 0x03FF, 0x0000 }, /* R8192 - DSP2 Instruction RAM 0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R8999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9215 */
+ { 0x003F, 0x003F, 0x0000 }, /* R9216 - DSP2 Address RAM 2 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R9217 - DSP2 Address RAM 1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R9218 - DSP2 Address RAM 0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R9999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R10999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R11999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12287 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R12288 - DSP2 Data1 RAM 1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R12289 - DSP2 Data1 RAM 0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R12999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13311 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R13312 - DSP2 Data2 RAM 1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R13313 - DSP2 Data2 RAM 0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R13999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14335 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R14336 - DSP2 Data3 RAM 1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R14337 - DSP2 Data3 RAM 0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R14999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15359 */
+ { 0x07FF, 0x07FF, 0x0000 }, /* R15360 - DSP2 Coeff RAM 0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R15999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16383 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16384 - RETUNEADC_SHARED_COEFF_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16385 - RETUNEADC_SHARED_COEFF_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16386 - RETUNEDAC_SHARED_COEFF_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16387 - RETUNEDAC_SHARED_COEFF_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16388 - SOUNDSTAGE_ENABLES_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16389 - SOUNDSTAGE_ENABLES_0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16895 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16896 - HDBASS_AI_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16897 - HDBASS_AI_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16898 - HDBASS_AR_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16899 - HDBASS_AR_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16900 - HDBASS_B_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16901 - HDBASS_B_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16902 - HDBASS_K_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16903 - HDBASS_K_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16904 - HDBASS_N1_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16905 - HDBASS_N1_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16906 - HDBASS_N2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16907 - HDBASS_N2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16908 - HDBASS_N3_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16909 - HDBASS_N3_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16910 - HDBASS_N4_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16911 - HDBASS_N4_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16912 - HDBASS_N5_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16913 - HDBASS_N5_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16914 - HDBASS_X1_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16915 - HDBASS_X1_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16916 - HDBASS_X2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16917 - HDBASS_X2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16918 - HDBASS_X3_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16919 - HDBASS_X3_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16920 - HDBASS_ATK_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16921 - HDBASS_ATK_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16922 - HDBASS_DCY_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16923 - HDBASS_DCY_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R16924 - HDBASS_PG_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R16925 - HDBASS_PG_0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R16999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17407 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17408 - HPF_C_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17409 - HPF_C_0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17919 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17920 - ADCL_RETUNE_C1_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17921 - ADCL_RETUNE_C1_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17922 - ADCL_RETUNE_C2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17923 - ADCL_RETUNE_C2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17924 - ADCL_RETUNE_C3_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17925 - ADCL_RETUNE_C3_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17926 - ADCL_RETUNE_C4_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17927 - ADCL_RETUNE_C4_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17928 - ADCL_RETUNE_C5_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17929 - ADCL_RETUNE_C5_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17930 - ADCL_RETUNE_C6_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17931 - ADCL_RETUNE_C6_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17932 - ADCL_RETUNE_C7_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17933 - ADCL_RETUNE_C7_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17934 - ADCL_RETUNE_C8_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17935 - ADCL_RETUNE_C8_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17936 - ADCL_RETUNE_C9_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17937 - ADCL_RETUNE_C9_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17938 - ADCL_RETUNE_C10_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17939 - ADCL_RETUNE_C10_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17940 - ADCL_RETUNE_C11_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17941 - ADCL_RETUNE_C11_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17942 - ADCL_RETUNE_C12_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17943 - ADCL_RETUNE_C12_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17944 - ADCL_RETUNE_C13_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17945 - ADCL_RETUNE_C13_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17946 - ADCL_RETUNE_C14_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17947 - ADCL_RETUNE_C14_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17948 - ADCL_RETUNE_C15_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17949 - ADCL_RETUNE_C15_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17950 - ADCL_RETUNE_C16_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17951 - ADCL_RETUNE_C16_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17952 - ADCL_RETUNE_C17_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17953 - ADCL_RETUNE_C17_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17954 - ADCL_RETUNE_C18_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17955 - ADCL_RETUNE_C18_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17956 - ADCL_RETUNE_C19_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17957 - ADCL_RETUNE_C19_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17958 - ADCL_RETUNE_C20_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17959 - ADCL_RETUNE_C20_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17960 - ADCL_RETUNE_C21_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17961 - ADCL_RETUNE_C21_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17962 - ADCL_RETUNE_C22_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17963 - ADCL_RETUNE_C22_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17964 - ADCL_RETUNE_C23_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17965 - ADCL_RETUNE_C23_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17966 - ADCL_RETUNE_C24_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17967 - ADCL_RETUNE_C24_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17968 - ADCL_RETUNE_C25_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17969 - ADCL_RETUNE_C25_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17970 - ADCL_RETUNE_C26_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17971 - ADCL_RETUNE_C26_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17972 - ADCL_RETUNE_C27_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17973 - ADCL_RETUNE_C27_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17974 - ADCL_RETUNE_C28_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17975 - ADCL_RETUNE_C28_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17976 - ADCL_RETUNE_C29_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17977 - ADCL_RETUNE_C29_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17978 - ADCL_RETUNE_C30_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17979 - ADCL_RETUNE_C30_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17980 - ADCL_RETUNE_C31_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17981 - ADCL_RETUNE_C31_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R17982 - ADCL_RETUNE_C32_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R17983 - ADCL_RETUNE_C32_0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R17999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18431 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18432 - RETUNEADC_PG2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18433 - RETUNEADC_PG2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18434 - RETUNEADC_PG_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18435 - RETUNEADC_PG_0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18479 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18480 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18481 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18482 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18483 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18484 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18485 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18486 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18487 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18488 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18489 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18490 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18491 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18492 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18493 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18494 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18495 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18496 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18497 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18498 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18499 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18500 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18501 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18502 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18503 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18504 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18505 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18506 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18507 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18508 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18509 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18510 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18511 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18512 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18513 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18514 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18515 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18516 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18517 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18518 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18519 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R18943 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18944 - ADCR_RETUNE_C1_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18945 - ADCR_RETUNE_C1_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18946 - ADCR_RETUNE_C2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18947 - ADCR_RETUNE_C2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18948 - ADCR_RETUNE_C3_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18949 - ADCR_RETUNE_C3_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18950 - ADCR_RETUNE_C4_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18951 - ADCR_RETUNE_C4_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18952 - ADCR_RETUNE_C5_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18953 - ADCR_RETUNE_C5_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18954 - ADCR_RETUNE_C6_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18955 - ADCR_RETUNE_C6_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18956 - ADCR_RETUNE_C7_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18957 - ADCR_RETUNE_C7_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18958 - ADCR_RETUNE_C8_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18959 - ADCR_RETUNE_C8_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18960 - ADCR_RETUNE_C9_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18961 - ADCR_RETUNE_C9_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18962 - ADCR_RETUNE_C10_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18963 - ADCR_RETUNE_C10_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18964 - ADCR_RETUNE_C11_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18965 - ADCR_RETUNE_C11_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18966 - ADCR_RETUNE_C12_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18967 - ADCR_RETUNE_C12_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18968 - ADCR_RETUNE_C13_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18969 - ADCR_RETUNE_C13_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18970 - ADCR_RETUNE_C14_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18971 - ADCR_RETUNE_C14_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18972 - ADCR_RETUNE_C15_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18973 - ADCR_RETUNE_C15_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18974 - ADCR_RETUNE_C16_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18975 - ADCR_RETUNE_C16_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18976 - ADCR_RETUNE_C17_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18977 - ADCR_RETUNE_C17_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18978 - ADCR_RETUNE_C18_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18979 - ADCR_RETUNE_C18_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18980 - ADCR_RETUNE_C19_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18981 - ADCR_RETUNE_C19_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18982 - ADCR_RETUNE_C20_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18983 - ADCR_RETUNE_C20_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18984 - ADCR_RETUNE_C21_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18985 - ADCR_RETUNE_C21_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18986 - ADCR_RETUNE_C22_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18987 - ADCR_RETUNE_C22_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18988 - ADCR_RETUNE_C23_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18989 - ADCR_RETUNE_C23_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18990 - ADCR_RETUNE_C24_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18991 - ADCR_RETUNE_C24_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18992 - ADCR_RETUNE_C25_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18993 - ADCR_RETUNE_C25_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18994 - ADCR_RETUNE_C26_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18995 - ADCR_RETUNE_C26_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18996 - ADCR_RETUNE_C27_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18997 - ADCR_RETUNE_C27_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R18998 - ADCR_RETUNE_C28_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R18999 - ADCR_RETUNE_C28_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19000 - ADCR_RETUNE_C29_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19001 - ADCR_RETUNE_C29_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19002 - ADCR_RETUNE_C30_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19003 - ADCR_RETUNE_C30_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19004 - ADCR_RETUNE_C31_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19005 - ADCR_RETUNE_C31_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19006 - ADCR_RETUNE_C32_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19007 - ADCR_RETUNE_C32_0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19455 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19456 - DACL_RETUNE_C1_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19457 - DACL_RETUNE_C1_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19458 - DACL_RETUNE_C2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19459 - DACL_RETUNE_C2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19460 - DACL_RETUNE_C3_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19461 - DACL_RETUNE_C3_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19462 - DACL_RETUNE_C4_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19463 - DACL_RETUNE_C4_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19464 - DACL_RETUNE_C5_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19465 - DACL_RETUNE_C5_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19466 - DACL_RETUNE_C6_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19467 - DACL_RETUNE_C6_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19468 - DACL_RETUNE_C7_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19469 - DACL_RETUNE_C7_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19470 - DACL_RETUNE_C8_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19471 - DACL_RETUNE_C8_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19472 - DACL_RETUNE_C9_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19473 - DACL_RETUNE_C9_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19474 - DACL_RETUNE_C10_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19475 - DACL_RETUNE_C10_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19476 - DACL_RETUNE_C11_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19477 - DACL_RETUNE_C11_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19478 - DACL_RETUNE_C12_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19479 - DACL_RETUNE_C12_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19480 - DACL_RETUNE_C13_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19481 - DACL_RETUNE_C13_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19482 - DACL_RETUNE_C14_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19483 - DACL_RETUNE_C14_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19484 - DACL_RETUNE_C15_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19485 - DACL_RETUNE_C15_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19486 - DACL_RETUNE_C16_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19487 - DACL_RETUNE_C16_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19488 - DACL_RETUNE_C17_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19489 - DACL_RETUNE_C17_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19490 - DACL_RETUNE_C18_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19491 - DACL_RETUNE_C18_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19492 - DACL_RETUNE_C19_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19493 - DACL_RETUNE_C19_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19494 - DACL_RETUNE_C20_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19495 - DACL_RETUNE_C20_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19496 - DACL_RETUNE_C21_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19497 - DACL_RETUNE_C21_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19498 - DACL_RETUNE_C22_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19499 - DACL_RETUNE_C22_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19500 - DACL_RETUNE_C23_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19501 - DACL_RETUNE_C23_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19502 - DACL_RETUNE_C24_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19503 - DACL_RETUNE_C24_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19504 - DACL_RETUNE_C25_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19505 - DACL_RETUNE_C25_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19506 - DACL_RETUNE_C26_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19507 - DACL_RETUNE_C26_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19508 - DACL_RETUNE_C27_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19509 - DACL_RETUNE_C27_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19510 - DACL_RETUNE_C28_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19511 - DACL_RETUNE_C28_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19512 - DACL_RETUNE_C29_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19513 - DACL_RETUNE_C29_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19514 - DACL_RETUNE_C30_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19515 - DACL_RETUNE_C30_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19516 - DACL_RETUNE_C31_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19517 - DACL_RETUNE_C31_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19518 - DACL_RETUNE_C32_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19519 - DACL_RETUNE_C32_0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19520 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19521 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19522 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19523 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19524 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19525 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19526 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19527 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19528 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19529 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19530 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19531 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19532 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19533 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19534 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19535 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19536 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19537 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19538 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19539 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19540 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19541 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19542 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19543 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19967 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19968 - RETUNEDAC_PG2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19969 - RETUNEDAC_PG2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R19970 - RETUNEDAC_PG_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R19971 - RETUNEDAC_PG_0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19991 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19992 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19993 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19994 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19995 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19996 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19997 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19998 */
+ { 0x0000, 0x0000, 0x0000 }, /* R19999 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20000 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20001 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20002 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20003 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20004 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20005 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20006 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20007 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20008 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20009 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20010 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20011 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20012 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20013 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20014 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20015 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20016 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20017 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20018 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20019 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20020 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20021 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20022 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20023 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20024 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20025 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20026 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20027 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20028 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20029 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20030 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20031 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20032 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20033 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20034 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20035 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20036 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20037 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20038 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20039 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20040 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20041 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20042 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20043 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20044 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20045 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20046 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20047 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20048 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20049 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20050 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20051 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20052 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20053 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20054 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20055 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20056 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20057 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20058 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20059 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20060 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20061 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20062 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20063 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20064 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20065 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20066 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20067 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20068 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20069 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20070 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20071 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20072 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20073 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20074 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20075 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20076 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20077 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20078 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20079 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20080 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20081 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20082 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20083 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20084 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20085 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20086 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20087 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20088 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20089 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20090 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20091 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20092 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20093 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20094 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20095 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20096 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20097 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20098 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20099 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20100 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20101 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20102 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20103 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20104 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20105 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20106 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20107 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20108 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20109 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20110 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20111 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20112 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20113 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20114 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20115 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20116 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20117 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20118 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20119 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20120 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20121 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20122 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20123 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20124 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20125 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20126 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20127 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20128 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20129 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20130 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20131 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20132 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20133 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20134 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20135 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20136 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20137 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20138 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20139 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20140 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20141 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20142 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20143 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20144 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20145 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20146 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20147 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20148 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20149 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20150 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20151 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20152 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20153 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20154 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20155 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20156 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20157 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20158 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20159 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20160 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20161 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20162 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20163 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20164 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20165 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20166 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20167 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20168 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20169 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20170 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20171 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20172 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20173 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20174 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20175 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20176 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20177 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20178 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20179 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20180 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20181 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20182 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20183 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20184 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20185 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20186 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20187 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20188 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20189 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20190 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20191 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20192 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20193 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20194 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20195 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20196 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20197 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20198 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20199 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20200 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20201 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20202 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20203 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20204 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20205 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20206 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20207 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20208 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20209 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20210 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20211 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20212 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20213 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20214 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20215 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20216 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20217 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20218 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20219 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20220 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20221 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20222 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20223 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20224 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20225 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20226 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20227 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20228 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20229 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20230 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20231 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20232 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20233 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20234 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20235 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20236 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20237 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20238 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20239 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20240 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20241 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20242 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20243 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20244 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20245 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20246 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20247 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20248 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20249 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20250 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20251 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20252 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20253 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20254 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20255 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20256 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20257 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20258 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20259 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20260 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20261 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20262 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20263 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20264 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20265 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20266 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20267 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20268 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20269 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20270 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20271 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20272 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20273 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20274 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20275 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20276 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20277 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20278 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20279 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20280 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20281 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20282 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20283 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20284 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20285 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20286 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20287 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20288 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20289 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20290 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20291 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20292 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20293 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20294 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20295 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20296 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20297 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20298 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20299 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20300 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20301 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20302 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20303 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20304 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20305 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20306 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20307 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20308 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20309 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20310 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20311 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20312 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20313 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20314 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20315 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20316 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20317 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20318 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20319 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20320 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20321 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20322 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20323 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20324 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20325 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20326 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20327 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20328 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20329 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20330 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20331 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20332 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20333 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20334 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20335 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20336 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20337 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20338 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20339 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20340 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20341 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20342 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20343 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20344 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20345 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20346 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20347 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20348 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20349 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20350 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20351 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20352 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20353 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20354 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20355 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20356 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20357 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20358 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20359 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20360 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20361 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20362 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20363 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20364 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20365 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20366 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20367 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20368 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20369 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20370 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20371 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20372 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20373 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20374 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20375 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20376 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20377 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20378 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20379 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20380 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20381 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20382 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20383 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20384 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20385 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20386 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20387 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20388 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20389 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20390 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20391 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20392 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20393 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20394 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20395 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20396 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20397 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20398 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20399 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20400 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20401 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20402 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20403 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20404 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20405 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20406 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20407 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20408 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20409 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20410 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20411 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20412 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20413 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20414 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20415 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20416 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20417 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20418 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20419 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20420 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20421 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20422 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20423 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20424 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20425 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20426 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20427 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20428 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20429 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20430 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20431 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20432 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20433 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20434 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20435 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20436 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20437 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20438 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20439 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20440 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20441 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20442 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20443 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20444 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20445 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20446 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20447 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20448 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20449 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20450 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20451 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20452 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20453 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20454 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20455 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20456 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20457 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20458 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20459 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20460 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20461 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20462 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20463 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20464 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20465 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20466 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20467 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20468 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20469 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20470 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20471 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20472 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20473 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20474 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20475 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20476 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20477 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20478 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20479 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20480 - DACR_RETUNE_C1_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20481 - DACR_RETUNE_C1_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20482 - DACR_RETUNE_C2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20483 - DACR_RETUNE_C2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20484 - DACR_RETUNE_C3_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20485 - DACR_RETUNE_C3_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20486 - DACR_RETUNE_C4_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20487 - DACR_RETUNE_C4_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20488 - DACR_RETUNE_C5_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20489 - DACR_RETUNE_C5_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20490 - DACR_RETUNE_C6_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20491 - DACR_RETUNE_C6_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20492 - DACR_RETUNE_C7_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20493 - DACR_RETUNE_C7_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20494 - DACR_RETUNE_C8_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20495 - DACR_RETUNE_C8_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20496 - DACR_RETUNE_C9_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20497 - DACR_RETUNE_C9_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20498 - DACR_RETUNE_C10_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20499 - DACR_RETUNE_C10_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20500 - DACR_RETUNE_C11_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20501 - DACR_RETUNE_C11_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20502 - DACR_RETUNE_C12_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20503 - DACR_RETUNE_C12_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20504 - DACR_RETUNE_C13_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20505 - DACR_RETUNE_C13_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20506 - DACR_RETUNE_C14_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20507 - DACR_RETUNE_C14_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20508 - DACR_RETUNE_C15_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20509 - DACR_RETUNE_C15_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20510 - DACR_RETUNE_C16_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20511 - DACR_RETUNE_C16_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20512 - DACR_RETUNE_C17_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20513 - DACR_RETUNE_C17_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20514 - DACR_RETUNE_C18_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20515 - DACR_RETUNE_C18_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20516 - DACR_RETUNE_C19_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20517 - DACR_RETUNE_C19_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20518 - DACR_RETUNE_C20_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20519 - DACR_RETUNE_C20_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20520 - DACR_RETUNE_C21_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20521 - DACR_RETUNE_C21_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20522 - DACR_RETUNE_C22_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20523 - DACR_RETUNE_C22_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20524 - DACR_RETUNE_C23_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20525 - DACR_RETUNE_C23_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20526 - DACR_RETUNE_C24_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20527 - DACR_RETUNE_C24_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20528 - DACR_RETUNE_C25_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20529 - DACR_RETUNE_C25_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20530 - DACR_RETUNE_C26_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20531 - DACR_RETUNE_C26_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20532 - DACR_RETUNE_C27_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20533 - DACR_RETUNE_C27_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20534 - DACR_RETUNE_C28_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20535 - DACR_RETUNE_C28_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20536 - DACR_RETUNE_C29_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20537 - DACR_RETUNE_C29_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20538 - DACR_RETUNE_C30_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20539 - DACR_RETUNE_C30_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20540 - DACR_RETUNE_C31_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20541 - DACR_RETUNE_C31_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20542 - DACR_RETUNE_C32_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20543 - DACR_RETUNE_C32_0 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20544 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20545 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20546 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20547 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20548 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20549 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20550 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20551 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20552 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20553 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20554 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20555 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20556 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20557 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20558 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20559 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20560 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20561 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20562 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20563 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20564 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20565 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20566 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20567 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20568 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20569 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20570 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20571 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20572 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20573 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20574 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20575 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20576 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20577 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20578 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20579 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20580 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20581 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20582 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20583 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20584 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20585 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20586 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20587 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20588 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20589 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20590 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20591 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20592 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20593 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20594 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20595 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20596 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20597 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20598 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20599 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20600 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20601 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20602 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20603 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20604 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20605 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20606 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20607 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20608 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20609 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20610 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20611 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20612 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20613 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20614 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20615 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20616 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20617 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20618 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20619 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20620 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20621 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20622 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20623 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20624 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20625 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20626 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20627 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20628 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20629 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20630 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20631 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20632 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20633 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20634 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20635 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20636 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20637 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20638 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20639 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20640 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20641 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20642 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20643 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20644 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20645 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20646 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20647 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20648 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20649 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20650 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20651 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20652 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20653 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20654 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20655 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20656 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20657 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20658 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20659 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20660 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20661 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20662 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20663 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20664 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20665 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20666 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20667 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20668 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20669 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20670 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20671 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20672 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20673 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20674 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20675 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20676 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20677 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20678 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20679 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20680 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20681 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20682 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20683 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20684 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20685 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20686 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20687 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20688 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20689 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20690 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20691 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20692 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20693 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20694 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20695 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20696 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20697 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20698 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20699 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20700 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20701 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20702 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20703 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20704 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20705 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20706 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20707 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20708 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20709 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20710 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20711 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20712 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20713 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20714 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20715 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20716 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20717 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20718 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20719 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20720 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20721 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20722 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20723 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20724 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20725 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20726 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20727 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20728 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20729 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20730 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20731 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20732 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20733 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20734 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20735 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20736 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20737 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20738 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20739 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20740 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20741 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20742 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20743 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20744 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20745 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20746 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20747 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20748 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20749 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20750 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20751 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20752 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20753 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20754 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20755 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20756 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20757 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20758 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20759 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20760 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20761 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20762 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20763 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20764 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20765 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20766 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20767 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20768 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20769 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20770 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20771 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20772 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20773 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20774 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20775 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20776 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20777 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20778 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20779 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20780 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20781 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20782 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20783 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20784 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20785 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20786 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20787 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20788 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20789 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20790 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20791 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20792 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20793 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20794 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20795 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20796 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20797 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20798 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20799 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20800 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20801 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20802 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20803 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20804 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20805 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20806 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20807 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20808 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20809 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20810 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20811 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20812 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20813 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20814 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20815 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20816 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20817 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20818 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20819 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20820 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20821 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20822 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20823 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20824 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20825 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20826 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20827 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20828 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20829 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20830 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20831 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20832 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20833 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20834 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20835 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20836 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20837 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20838 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20839 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20840 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20841 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20842 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20843 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20844 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20845 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20846 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20847 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20848 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20849 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20850 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20851 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20852 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20853 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20854 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20855 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20856 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20857 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20858 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20859 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20860 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20861 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20862 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20863 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20864 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20865 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20866 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20867 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20868 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20869 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20870 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20871 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20872 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20873 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20874 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20875 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20876 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20877 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20878 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20879 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20880 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20881 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20882 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20883 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20884 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20885 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20886 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20887 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20888 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20889 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20890 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20891 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20892 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20893 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20894 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20895 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20896 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20897 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20898 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20899 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20900 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20901 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20902 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20903 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20904 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20905 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20906 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20907 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20908 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20909 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20910 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20911 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20912 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20913 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20914 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20915 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20916 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20917 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20918 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20919 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20920 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20921 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20922 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20923 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20924 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20925 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20926 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20927 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20928 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20929 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20930 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20931 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20932 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20933 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20934 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20935 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20936 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20937 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20938 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20939 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20940 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20941 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20942 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20943 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20944 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20945 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20946 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20947 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20948 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20949 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20950 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20951 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20952 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20953 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20954 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20955 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20956 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20957 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20958 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20959 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20960 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20961 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20962 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20963 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20964 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20965 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20966 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20967 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20968 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20969 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20970 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20971 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20972 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20973 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20974 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20975 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20976 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20977 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20978 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20979 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20980 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20981 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20982 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20983 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20984 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20985 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20986 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20987 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20988 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20989 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20990 */
+ { 0x0000, 0x0000, 0x0000 }, /* R20991 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20992 - VSS_XHD2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20993 - VSS_XHD2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20994 - VSS_XHD3_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20995 - VSS_XHD3_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20996 - VSS_XHN1_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20997 - VSS_XHN1_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R20998 - VSS_XHN2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R20999 - VSS_XHN2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21000 - VSS_XHN3_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21001 - VSS_XHN3_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21002 - VSS_XLA_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21003 - VSS_XLA_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21004 - VSS_XLB_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21005 - VSS_XLB_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21006 - VSS_XLG_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21007 - VSS_XLG_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21008 - VSS_PG2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21009 - VSS_PG2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21010 - VSS_PG_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21011 - VSS_PG_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21012 - VSS_XTD1_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21013 - VSS_XTD1_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21014 - VSS_XTD2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21015 - VSS_XTD2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21016 - VSS_XTD3_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21017 - VSS_XTD3_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21018 - VSS_XTD4_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21019 - VSS_XTD4_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21020 - VSS_XTD5_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21021 - VSS_XTD5_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21022 - VSS_XTD6_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21023 - VSS_XTD6_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21024 - VSS_XTD7_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21025 - VSS_XTD7_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21026 - VSS_XTD8_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21027 - VSS_XTD8_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21028 - VSS_XTD9_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21029 - VSS_XTD9_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21030 - VSS_XTD10_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21031 - VSS_XTD10_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21032 - VSS_XTD11_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21033 - VSS_XTD11_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21034 - VSS_XTD12_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21035 - VSS_XTD12_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21036 - VSS_XTD13_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21037 - VSS_XTD13_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21038 - VSS_XTD14_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21039 - VSS_XTD14_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21040 - VSS_XTD15_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21041 - VSS_XTD15_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21042 - VSS_XTD16_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21043 - VSS_XTD16_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21044 - VSS_XTD17_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21045 - VSS_XTD17_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21046 - VSS_XTD18_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21047 - VSS_XTD18_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21048 - VSS_XTD19_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21049 - VSS_XTD19_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21050 - VSS_XTD20_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21051 - VSS_XTD20_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21052 - VSS_XTD21_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21053 - VSS_XTD21_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21054 - VSS_XTD22_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21055 - VSS_XTD22_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21056 - VSS_XTD23_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21057 - VSS_XTD23_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21058 - VSS_XTD24_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21059 - VSS_XTD24_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21060 - VSS_XTD25_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21061 - VSS_XTD25_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21062 - VSS_XTD26_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21063 - VSS_XTD26_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21064 - VSS_XTD27_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21065 - VSS_XTD27_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21066 - VSS_XTD28_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21067 - VSS_XTD28_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21068 - VSS_XTD29_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21069 - VSS_XTD29_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21070 - VSS_XTD30_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21071 - VSS_XTD30_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21072 - VSS_XTD31_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21073 - VSS_XTD31_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21074 - VSS_XTD32_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21075 - VSS_XTD32_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21076 - VSS_XTS1_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21077 - VSS_XTS1_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21078 - VSS_XTS2_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21079 - VSS_XTS2_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21080 - VSS_XTS3_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21081 - VSS_XTS3_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21082 - VSS_XTS4_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21083 - VSS_XTS4_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21084 - VSS_XTS5_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21085 - VSS_XTS5_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21086 - VSS_XTS6_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21087 - VSS_XTS6_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21088 - VSS_XTS7_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21089 - VSS_XTS7_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21090 - VSS_XTS8_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21091 - VSS_XTS8_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21092 - VSS_XTS9_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21093 - VSS_XTS9_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21094 - VSS_XTS10_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21095 - VSS_XTS10_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21096 - VSS_XTS11_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21097 - VSS_XTS11_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21098 - VSS_XTS12_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21099 - VSS_XTS12_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21100 - VSS_XTS13_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21101 - VSS_XTS13_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21102 - VSS_XTS14_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21103 - VSS_XTS14_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21104 - VSS_XTS15_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21105 - VSS_XTS15_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21106 - VSS_XTS16_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21107 - VSS_XTS16_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21108 - VSS_XTS17_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21109 - VSS_XTS17_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21110 - VSS_XTS18_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21111 - VSS_XTS18_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21112 - VSS_XTS19_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21113 - VSS_XTS19_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21114 - VSS_XTS20_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21115 - VSS_XTS20_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21116 - VSS_XTS21_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21117 - VSS_XTS21_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21118 - VSS_XTS22_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21119 - VSS_XTS22_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21120 - VSS_XTS23_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21121 - VSS_XTS23_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21122 - VSS_XTS24_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21123 - VSS_XTS24_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21124 - VSS_XTS25_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21125 - VSS_XTS25_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21126 - VSS_XTS26_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21127 - VSS_XTS26_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21128 - VSS_XTS27_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21129 - VSS_XTS27_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21130 - VSS_XTS28_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21131 - VSS_XTS28_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21132 - VSS_XTS29_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21133 - VSS_XTS29_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21134 - VSS_XTS30_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21135 - VSS_XTS30_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21136 - VSS_XTS31_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21137 - VSS_XTS31_0 */
+ { 0x00FF, 0x00FF, 0x0000 }, /* R21138 - VSS_XTS32_1 */
+ { 0xFFFF, 0xFFFF, 0x0000 }, /* R21139 - VSS_XTS32_0 */
+};
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c
new file mode 100644
index 000000000000..58ba2d3ca533
--- /dev/null
+++ b/sound/soc/codecs/wm8962.c
@@ -0,0 +1,1859 @@
+/*
+ * wm8962.c -- WM8962 ALSA SoC Audio driver
+ *
+ * Copyright 2010 Wolfson Microelectronics plc
+ *
+ * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/pm.h>
+#include <linux/gcd.h>
+#include <linux/i2c.h>
+#include <linux/input.h>
+#include <linux/platform_device.h>
+#include <linux/regulator/consumer.h>
+#include <linux/slab.h>
+#include <linux/workqueue.h>
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include <sound/soc-dapm.h>
+#include <sound/initval.h>
+#include <sound/tlv.h>
+#include <sound/wm8962.h>
+
+#include "wm8962.h"
+
+#define WM8962_NUM_SUPPLIES 8
+static const char *wm8962_supply_names[WM8962_NUM_SUPPLIES] = {
+ "DCVDD",
+ "DBVDD",
+ "AVDD",
+ "CPVDD",
+ "MICVDD",
+ "PLLVDD",
+ "SPKVDD1",
+ "SPKVDD2",
+};
+
+/* codec private data */
+struct wm8962_priv {
+ struct snd_soc_codec *codec;
+
+ u16 reg_cache[WM8962_MAX_REGISTER + 1];
+
+ int sysclk;
+ int sysclk_rate;
+
+ int bclk; /* Desired BCLK */
+ int lrclk;
+
+ int fll_src;
+ int fll_fref;
+ int fll_fout;
+
+ struct regulator_bulk_data supplies[WM8962_NUM_SUPPLIES];
+ struct notifier_block disable_nb[WM8962_NUM_SUPPLIES];
+
+#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
+ struct input_dev *beep;
+ struct work_struct beep_work;
+ int beep_rate;
+#endif
+};
+
+/* We can't use the same notifier block for more than one supply and
+ * there's no way I can see to get from a callback to the caller
+ * except container_of().
+ */
+#define WM8962_REGULATOR_EVENT(n) \
+static int wm8962_regulator_event_##n(struct notifier_block *nb, \
+ unsigned long event, void *data) \
+{ \
+ struct wm8962_priv *wm8962 = container_of(nb, struct wm8962_priv, \
+ disable_nb[n]); \
+ if (event & REGULATOR_EVENT_DISABLE) { \
+ wm8962->codec->cache_sync = 1; \
+ } \
+ return 0; \
+}
+
+WM8962_REGULATOR_EVENT(0)
+WM8962_REGULATOR_EVENT(1)
+WM8962_REGULATOR_EVENT(2)
+WM8962_REGULATOR_EVENT(3)
+WM8962_REGULATOR_EVENT(4)
+WM8962_REGULATOR_EVENT(5)
+WM8962_REGULATOR_EVENT(6)
+WM8962_REGULATOR_EVENT(7)
+
+static int wm8962_volatile_register(unsigned int reg)
+{
+ if (wm8962_reg_access[reg].vol)
+ return 1;
+ else
+ return 0;
+}
+
+static int wm8962_readable_register(unsigned int reg)
+{
+ if (wm8962_reg_access[reg].read)
+ return 1;
+ else
+ return 0;
+}
+
+static int wm8962_reset(struct snd_soc_codec *codec)
+{
+ return snd_soc_write(codec, WM8962_SOFTWARE_RESET, 0);
+}
+
+static const DECLARE_TLV_DB_SCALE(inpga_tlv, -2325, 75, 0);
+static const DECLARE_TLV_DB_SCALE(mixin_tlv, -1500, 300, 0);
+static const unsigned int mixinpga_tlv[] = {
+ TLV_DB_RANGE_HEAD(7),
+ 0, 1, TLV_DB_SCALE_ITEM(0, 600, 0),
+ 2, 2, TLV_DB_SCALE_ITEM(1300, 1300, 0),
+ 3, 4, TLV_DB_SCALE_ITEM(1800, 200, 0),
+ 5, 5, TLV_DB_SCALE_ITEM(2400, 0, 0),
+ 6, 7, TLV_DB_SCALE_ITEM(2700, 300, 0),
+};
+static const DECLARE_TLV_DB_SCALE(beep_tlv, -9600, 600, 1);
+static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1);
+static const DECLARE_TLV_DB_SCALE(st_tlv, -3600, 300, 0);
+static const DECLARE_TLV_DB_SCALE(inmix_tlv, -600, 600, 0);
+static const DECLARE_TLV_DB_SCALE(bypass_tlv, -1500, 300, 0);
+static const DECLARE_TLV_DB_SCALE(out_tlv, -12100, 100, 1);
+static const DECLARE_TLV_DB_SCALE(hp_tlv, -700, 100, 0);
+static const unsigned int classd_tlv[] = {
+ TLV_DB_RANGE_HEAD(7),
+ 0, 6, TLV_DB_SCALE_ITEM(0, 150, 0),
+ 7, 7, TLV_DB_SCALE_ITEM(1200, 0, 0),
+};
+
+/* The VU bits for the headphones are in a different register to the mute
+ * bits and only take effect on the PGA if it is actually powered.
+ */
+static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ u16 *reg_cache = wm8962->reg_cache;
+ int ret;
+
+ /* Apply the update (if any) */
+ ret = snd_soc_put_volsw(kcontrol, ucontrol);
+ if (ret == 0)
+ return 0;
+
+ /* If the left PGA is enabled hit that VU bit... */
+ if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_HPOUTL_PGA_ENA)
+ return snd_soc_write(codec, WM8962_HPOUTL_VOLUME,
+ reg_cache[WM8962_HPOUTL_VOLUME]);
+
+ /* ...otherwise the right. The VU is stereo. */
+ if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_HPOUTR_PGA_ENA)
+ return snd_soc_write(codec, WM8962_HPOUTR_VOLUME,
+ reg_cache[WM8962_HPOUTR_VOLUME]);
+
+ return 0;
+}
+
+/* The VU bits for the speakers are in a different register to the mute
+ * bits and only take effect on the PGA if it is actually powered.
+ */
+static int wm8962_put_spk_sw(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ u16 *reg_cache = wm8962->reg_cache;
+ int ret;
+
+ /* Apply the update (if any) */
+ ret = snd_soc_put_volsw(kcontrol, ucontrol);
+ if (ret == 0)
+ return 0;
+
+ /* If the left PGA is enabled hit that VU bit... */
+ if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_SPKOUTL_PGA_ENA)
+ return snd_soc_write(codec, WM8962_SPKOUTL_VOLUME,
+ reg_cache[WM8962_SPKOUTL_VOLUME]);
+
+ /* ...otherwise the right. The VU is stereo. */
+ if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_SPKOUTR_PGA_ENA)
+ return snd_soc_write(codec, WM8962_SPKOUTR_VOLUME,
+ reg_cache[WM8962_SPKOUTR_VOLUME]);
+
+ return 0;
+}
+
+static const struct snd_kcontrol_new wm8962_snd_controls[] = {
+SOC_DOUBLE("Input Mixer Switch", WM8962_INPUT_MIXER_CONTROL_1, 3, 2, 1, 1),
+
+SOC_SINGLE_TLV("MIXINL IN2L Volume", WM8962_LEFT_INPUT_MIXER_VOLUME, 6, 7, 0,
+ mixin_tlv),
+SOC_SINGLE_TLV("MIXINL PGA Volume", WM8962_LEFT_INPUT_MIXER_VOLUME, 3, 7, 0,
+ mixinpga_tlv),
+SOC_SINGLE_TLV("MIXINL IN3L Volume", WM8962_LEFT_INPUT_MIXER_VOLUME, 0, 7, 0,
+ mixin_tlv),
+
+SOC_SINGLE_TLV("MIXINR IN2R Volume", WM8962_RIGHT_INPUT_MIXER_VOLUME, 6, 7, 0,
+ mixin_tlv),
+SOC_SINGLE_TLV("MIXINR PGA Volume", WM8962_RIGHT_INPUT_MIXER_VOLUME, 3, 7, 0,
+ mixinpga_tlv),
+SOC_SINGLE_TLV("MIXINR IN3R Volume", WM8962_RIGHT_INPUT_MIXER_VOLUME, 0, 7, 0,
+ mixin_tlv),
+
+SOC_DOUBLE_R_TLV("Digital Capture Volume", WM8962_LEFT_ADC_VOLUME,
+ WM8962_RIGHT_ADC_VOLUME, 1, 127, 0, digital_tlv),
+SOC_DOUBLE_R_TLV("Capture Volume", WM8962_LEFT_INPUT_VOLUME,
+ WM8962_RIGHT_INPUT_VOLUME, 0, 63, 0, inpga_tlv),
+SOC_DOUBLE_R("Capture Switch", WM8962_LEFT_INPUT_VOLUME,
+ WM8962_RIGHT_INPUT_VOLUME, 7, 1, 1),
+SOC_DOUBLE_R("Capture ZC Switch", WM8962_LEFT_INPUT_VOLUME,
+ WM8962_RIGHT_INPUT_VOLUME, 6, 1, 1),
+
+SOC_DOUBLE_R_TLV("Sidetone Volume", WM8962_DAC_DSP_MIXING_1,
+ WM8962_DAC_DSP_MIXING_2, 4, 12, 0, st_tlv),
+
+SOC_DOUBLE_R_TLV("Digital Playback Volume", WM8962_LEFT_DAC_VOLUME,
+ WM8962_RIGHT_DAC_VOLUME, 1, 127, 0, digital_tlv),
+SOC_SINGLE("DAC High Performance Switch", WM8962_ADC_DAC_CONTROL_2, 0, 1, 0),
+
+SOC_SINGLE("ADC High Performance Switch", WM8962_ADDITIONAL_CONTROL_1,
+ 5, 1, 0),
+
+SOC_SINGLE_TLV("Beep Volume", WM8962_BEEP_GENERATOR_1, 4, 15, 0, beep_tlv),
+
+SOC_DOUBLE_R_TLV("Headphone Volume", WM8962_HPOUTL_VOLUME,
+ WM8962_HPOUTR_VOLUME, 0, 127, 0, out_tlv),
+SOC_DOUBLE_EXT("Headphone Switch", WM8962_PWR_MGMT_2, 1, 0, 1, 1,
+ snd_soc_get_volsw, wm8962_put_hp_sw),
+SOC_DOUBLE_R("Headphone ZC Switch", WM8962_HPOUTL_VOLUME, WM8962_HPOUTR_VOLUME,
+ 7, 1, 0),
+SOC_DOUBLE_TLV("Headphone Aux Volume", WM8962_ANALOGUE_HP_2, 3, 6, 7, 0,
+ hp_tlv),
+
+SOC_DOUBLE_R("Headphone Mixer Switch", WM8962_HEADPHONE_MIXER_3,
+ WM8962_HEADPHONE_MIXER_4, 8, 1, 1),
+
+SOC_SINGLE_TLV("HPMIXL IN4L Volume", WM8962_HEADPHONE_MIXER_3,
+ 3, 7, 0, bypass_tlv),
+SOC_SINGLE_TLV("HPMIXL IN4R Volume", WM8962_HEADPHONE_MIXER_3,
+ 0, 7, 0, bypass_tlv),
+SOC_SINGLE_TLV("HPMIXL MIXINL Volume", WM8962_HEADPHONE_MIXER_3,
+ 7, 1, 1, inmix_tlv),
+SOC_SINGLE_TLV("HPMIXL MIXINR Volume", WM8962_HEADPHONE_MIXER_3,
+ 6, 1, 1, inmix_tlv),
+
+SOC_SINGLE_TLV("HPMIXR IN4L Volume", WM8962_HEADPHONE_MIXER_4,
+ 3, 7, 0, bypass_tlv),
+SOC_SINGLE_TLV("HPMIXR IN4R Volume", WM8962_HEADPHONE_MIXER_4,
+ 0, 7, 0, bypass_tlv),
+SOC_SINGLE_TLV("HPMIXR MIXINL Volume", WM8962_HEADPHONE_MIXER_4,
+ 7, 1, 1, inmix_tlv),
+SOC_SINGLE_TLV("HPMIXR MIXINR Volume", WM8962_HEADPHONE_MIXER_4,
+ 6, 1, 1, inmix_tlv),
+
+SOC_SINGLE_TLV("Speaker Boost Volume", WM8962_CLASS_D_CONTROL_2, 0, 7, 0,
+ classd_tlv),
+};
+
+static const struct snd_kcontrol_new wm8962_spk_mono_controls[] = {
+SOC_SINGLE_TLV("Speaker Volume", WM8962_SPKOUTL_VOLUME, 0, 127, 0, out_tlv),
+SOC_SINGLE_EXT("Speaker Switch", WM8962_CLASS_D_CONTROL_1, 1, 1, 1,
+ snd_soc_get_volsw, wm8962_put_spk_sw),
+SOC_SINGLE("Speaker ZC Switch", WM8962_SPKOUTL_VOLUME, 7, 1, 0),
+
+SOC_SINGLE("Speaker Mixer Switch", WM8962_SPEAKER_MIXER_3, 8, 1, 1),
+SOC_SINGLE_TLV("Speaker Mixer IN4L Volume", WM8962_SPEAKER_MIXER_3,
+ 3, 7, 0, bypass_tlv),
+SOC_SINGLE_TLV("Speaker Mixer IN4R Volume", WM8962_SPEAKER_MIXER_3,
+ 0, 7, 0, bypass_tlv),
+SOC_SINGLE_TLV("Speaker Mixer MIXINL Volume", WM8962_SPEAKER_MIXER_3,
+ 7, 1, 1, inmix_tlv),
+SOC_SINGLE_TLV("Speaker Mixer MIXINR Volume", WM8962_SPEAKER_MIXER_3,
+ 6, 1, 1, inmix_tlv),
+SOC_SINGLE_TLV("Speaker Mixer DACL Volume", WM8962_SPEAKER_MIXER_5,
+ 7, 1, 0, inmix_tlv),
+SOC_SINGLE_TLV("Speaker Mixer DACR Volume", WM8962_SPEAKER_MIXER_5,
+ 6, 1, 0, inmix_tlv),
+};
+
+static const struct snd_kcontrol_new wm8962_spk_stereo_controls[] = {
+SOC_DOUBLE_R_TLV("Speaker Volume", WM8962_SPKOUTL_VOLUME,
+ WM8962_SPKOUTR_VOLUME, 0, 127, 0, out_tlv),
+SOC_DOUBLE_EXT("Speaker Switch", WM8962_CLASS_D_CONTROL_1, 1, 0, 1, 1,
+ snd_soc_get_volsw, wm8962_put_spk_sw),
+SOC_DOUBLE_R("Speaker ZC Switch", WM8962_SPKOUTL_VOLUME, WM8962_SPKOUTR_VOLUME,
+ 7, 1, 0),
+
+SOC_DOUBLE_R("Speaker Mixer Switch", WM8962_SPEAKER_MIXER_3,
+ WM8962_SPEAKER_MIXER_4, 8, 1, 1),
+
+SOC_SINGLE_TLV("SPKOUTL Mixer IN4L Volume", WM8962_SPEAKER_MIXER_3,
+ 3, 7, 0, bypass_tlv),
+SOC_SINGLE_TLV("SPKOUTL Mixer IN4R Volume", WM8962_SPEAKER_MIXER_3,
+ 0, 7, 0, bypass_tlv),
+SOC_SINGLE_TLV("SPKOUTL Mixer MIXINL Volume", WM8962_SPEAKER_MIXER_3,
+ 7, 1, 1, inmix_tlv),
+SOC_SINGLE_TLV("SPKOUTL Mixer MIXINR Volume", WM8962_SPEAKER_MIXER_3,
+ 6, 1, 1, inmix_tlv),
+SOC_SINGLE_TLV("SPKOUTL Mixer DACL Volume", WM8962_SPEAKER_MIXER_5,
+ 7, 1, 0, inmix_tlv),
+SOC_SINGLE_TLV("SPKOUTL Mixer DACR Volume", WM8962_SPEAKER_MIXER_5,
+ 6, 1, 0, inmix_tlv),
+
+SOC_SINGLE_TLV("SPKOUTR Mixer IN4L Volume", WM8962_SPEAKER_MIXER_4,
+ 3, 7, 0, bypass_tlv),
+SOC_SINGLE_TLV("SPKOUTR Mixer IN4R Volume", WM8962_SPEAKER_MIXER_4,
+ 0, 7, 0, bypass_tlv),
+SOC_SINGLE_TLV("SPKOUTR Mixer MIXINL Volume", WM8962_SPEAKER_MIXER_4,
+ 7, 1, 1, inmix_tlv),
+SOC_SINGLE_TLV("SPKOUTR Mixer MIXINR Volume", WM8962_SPEAKER_MIXER_4,
+ 6, 1, 1, inmix_tlv),
+SOC_SINGLE_TLV("SPKOUTR Mixer DACL Volume", WM8962_SPEAKER_MIXER_5,
+ 5, 1, 0, inmix_tlv),
+SOC_SINGLE_TLV("SPKOUTR Mixer DACR Volume", WM8962_SPEAKER_MIXER_5,
+ 4, 1, 0, inmix_tlv),
+};
+
+static int sysclk_event(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol, int event)
+{
+ struct snd_soc_codec *codec = w->codec;
+ int src;
+ int fll;
+
+ src = snd_soc_read(codec, WM8962_CLOCKING2) & WM8962_SYSCLK_SRC_MASK;
+
+ switch (src) {
+ case 0: /* MCLK */
+ fll = 0;
+ break;
+ case 0x200: /* FLL */
+ fll = 1;
+ break;
+ default:
+ dev_err(codec->dev, "Unknown SYSCLK source %x\n", src);
+ return -EINVAL;
+ }
+
+ switch (event) {
+ case SND_SOC_DAPM_PRE_PMU:
+ if (fll)
+ snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
+ WM8962_FLL_ENA, WM8962_FLL_ENA);
+ break;
+
+ case SND_SOC_DAPM_POST_PMD:
+ if (fll)
+ snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
+ WM8962_FLL_ENA, 0);
+ break;
+
+ default:
+ BUG();
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int cp_event(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol, int event)
+{
+ switch (event) {
+ case SND_SOC_DAPM_POST_PMU:
+ msleep(5);
+ break;
+
+ default:
+ BUG();
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int hp_event(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol, int event)
+{
+ struct snd_soc_codec *codec = w->codec;
+ int timeout;
+ int reg;
+ int expected = (WM8962_DCS_STARTUP_DONE_HP1L |
+ WM8962_DCS_STARTUP_DONE_HP1R);
+
+ switch (event) {
+ case SND_SOC_DAPM_POST_PMU:
+ snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0,
+ WM8962_HP1L_ENA | WM8962_HP1R_ENA,
+ WM8962_HP1L_ENA | WM8962_HP1R_ENA);
+ udelay(20);
+
+ snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0,
+ WM8962_HP1L_ENA_DLY | WM8962_HP1R_ENA_DLY,
+ WM8962_HP1L_ENA_DLY | WM8962_HP1R_ENA_DLY);
+
+ /* Start the DC servo */
+ snd_soc_update_bits(codec, WM8962_DC_SERVO_1,
+ WM8962_HP1L_DCS_ENA | WM8962_HP1R_DCS_ENA |
+ WM8962_HP1L_DCS_STARTUP |
+ WM8962_HP1R_DCS_STARTUP,
+ WM8962_HP1L_DCS_ENA | WM8962_HP1R_DCS_ENA |
+ WM8962_HP1L_DCS_STARTUP |
+ WM8962_HP1R_DCS_STARTUP);
+
+ /* Wait for it to complete, should be well under 100ms */
+ timeout = 0;
+ do {
+ msleep(1);
+ reg = snd_soc_read(codec, WM8962_DC_SERVO_6);
+ if (reg < 0) {
+ dev_err(codec->dev,
+ "Failed to read DCS status: %d\n",
+ reg);
+ continue;
+ }
+ dev_dbg(codec->dev, "DCS status: %x\n", reg);
+ } while (++timeout < 200 && (reg & expected) != expected);
+
+ if ((reg & expected) != expected)
+ dev_err(codec->dev, "DC servo timed out\n");
+ else
+ dev_dbg(codec->dev, "DC servo complete after %dms\n",
+ timeout);
+
+ snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0,
+ WM8962_HP1L_ENA_OUTP |
+ WM8962_HP1R_ENA_OUTP,
+ WM8962_HP1L_ENA_OUTP |
+ WM8962_HP1R_ENA_OUTP);
+ udelay(20);
+
+ snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0,
+ WM8962_HP1L_RMV_SHORT |
+ WM8962_HP1R_RMV_SHORT,
+ WM8962_HP1L_RMV_SHORT |
+ WM8962_HP1R_RMV_SHORT);
+ break;
+
+ case SND_SOC_DAPM_PRE_PMD:
+ snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0,
+ WM8962_HP1L_RMV_SHORT |
+ WM8962_HP1R_RMV_SHORT, 0);
+
+ udelay(20);
+
+ snd_soc_update_bits(codec, WM8962_DC_SERVO_1,
+ WM8962_HP1L_DCS_ENA | WM8962_HP1R_DCS_ENA |
+ WM8962_HP1L_DCS_STARTUP |
+ WM8962_HP1R_DCS_STARTUP,
+ 0);
+
+ snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0,
+ WM8962_HP1L_ENA | WM8962_HP1R_ENA |
+ WM8962_HP1L_ENA_DLY | WM8962_HP1R_ENA_DLY |
+ WM8962_HP1L_ENA_OUTP |
+ WM8962_HP1R_ENA_OUTP, 0);
+
+ break;
+
+ default:
+ BUG();
+ return -EINVAL;
+
+ }
+
+ return 0;
+}
+
+/* VU bits for the output PGAs only take effect while the PGA is powered */
+static int out_pga_event(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol, int event)
+{
+ struct snd_soc_codec *codec = w->codec;
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ u16 *reg_cache = wm8962->reg_cache;
+ int reg;
+
+ switch (w->shift) {
+ case WM8962_HPOUTR_PGA_ENA_SHIFT:
+ reg = WM8962_HPOUTR_VOLUME;
+ break;
+ case WM8962_HPOUTL_PGA_ENA_SHIFT:
+ reg = WM8962_HPOUTL_VOLUME;
+ break;
+ case WM8962_SPKOUTR_PGA_ENA_SHIFT:
+ reg = WM8962_SPKOUTR_VOLUME;
+ break;
+ case WM8962_SPKOUTL_PGA_ENA_SHIFT:
+ reg = WM8962_SPKOUTL_VOLUME;
+ break;
+ default:
+ BUG();
+ return -EINVAL;
+ }
+
+ switch (event) {
+ case SND_SOC_DAPM_POST_PMU:
+ return snd_soc_write(codec, reg, reg_cache[reg]);
+ default:
+ BUG();
+ return -EINVAL;
+ }
+}
+
+static const char *st_text[] = { "None", "Right", "Left" };
+
+static const struct soc_enum str_enum =
+ SOC_ENUM_SINGLE(WM8962_DAC_DSP_MIXING_1, 2, 3, st_text);
+
+static const struct snd_kcontrol_new str_mux =
+ SOC_DAPM_ENUM("Right Sidetone", str_enum);
+
+static const struct soc_enum stl_enum =
+ SOC_ENUM_SINGLE(WM8962_DAC_DSP_MIXING_2, 2, 3, st_text);
+
+static const struct snd_kcontrol_new stl_mux =
+ SOC_DAPM_ENUM("Left Sidetone", stl_enum);
+
+static const char *outmux_text[] = { "DAC", "Mixer" };
+
+static const struct soc_enum spkoutr_enum =
+ SOC_ENUM_SINGLE(WM8962_SPEAKER_MIXER_2, 7, 2, outmux_text);
+
+static const struct snd_kcontrol_new spkoutr_mux =
+ SOC_DAPM_ENUM("SPKOUTR Mux", spkoutr_enum);
+
+static const struct soc_enum spkoutl_enum =
+ SOC_ENUM_SINGLE(WM8962_SPEAKER_MIXER_1, 7, 2, outmux_text);
+
+static const struct snd_kcontrol_new spkoutl_mux =
+ SOC_DAPM_ENUM("SPKOUTL Mux", spkoutl_enum);
+
+static const struct soc_enum hpoutr_enum =
+ SOC_ENUM_SINGLE(WM8962_HEADPHONE_MIXER_2, 7, 2, outmux_text);
+
+static const struct snd_kcontrol_new hpoutr_mux =
+ SOC_DAPM_ENUM("HPOUTR Mux", hpoutr_enum);
+
+static const struct soc_enum hpoutl_enum =
+ SOC_ENUM_SINGLE(WM8962_HEADPHONE_MIXER_1, 7, 2, outmux_text);
+
+static const struct snd_kcontrol_new hpoutl_mux =
+ SOC_DAPM_ENUM("HPOUTL Mux", hpoutl_enum);
+
+static const struct snd_kcontrol_new inpgal[] = {
+SOC_DAPM_SINGLE("IN1L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 3, 1, 0),
+SOC_DAPM_SINGLE("IN2L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 2, 1, 0),
+SOC_DAPM_SINGLE("IN3L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 1, 1, 0),
+SOC_DAPM_SINGLE("IN4L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 0, 1, 0),
+};
+
+static const struct snd_kcontrol_new inpgar[] = {
+SOC_DAPM_SINGLE("IN1R Switch", WM8962_RIGHT_INPUT_PGA_CONTROL, 3, 1, 0),
+SOC_DAPM_SINGLE("IN2R Switch", WM8962_RIGHT_INPUT_PGA_CONTROL, 2, 1, 0),
+SOC_DAPM_SINGLE("IN3R Switch", WM8962_RIGHT_INPUT_PGA_CONTROL, 1, 1, 0),
+SOC_DAPM_SINGLE("IN4R Switch", WM8962_RIGHT_INPUT_PGA_CONTROL, 0, 1, 0),
+};
+
+static const struct snd_kcontrol_new mixinl[] = {
+SOC_DAPM_SINGLE("IN2L Switch", WM8962_INPUT_MIXER_CONTROL_2, 5, 1, 0),
+SOC_DAPM_SINGLE("IN3L Switch", WM8962_INPUT_MIXER_CONTROL_2, 4, 1, 0),
+SOC_DAPM_SINGLE("PGA Switch", WM8962_INPUT_MIXER_CONTROL_2, 3, 1, 0),
+};
+
+static const struct snd_kcontrol_new mixinr[] = {
+SOC_DAPM_SINGLE("IN2R Switch", WM8962_INPUT_MIXER_CONTROL_2, 2, 1, 0),
+SOC_DAPM_SINGLE("IN3R Switch", WM8962_INPUT_MIXER_CONTROL_2, 1, 1, 0),
+SOC_DAPM_SINGLE("PGA Switch", WM8962_INPUT_MIXER_CONTROL_2, 0, 1, 0),
+};
+
+static const struct snd_kcontrol_new hpmixl[] = {
+SOC_DAPM_SINGLE("DACL Switch", WM8962_HEADPHONE_MIXER_1, 5, 1, 0),
+SOC_DAPM_SINGLE("DACR Switch", WM8962_HEADPHONE_MIXER_1, 4, 1, 0),
+SOC_DAPM_SINGLE("MIXINL Switch", WM8962_HEADPHONE_MIXER_1, 3, 1, 0),
+SOC_DAPM_SINGLE("MIXINR Switch", WM8962_HEADPHONE_MIXER_1, 2, 1, 0),
+SOC_DAPM_SINGLE("IN4L Switch", WM8962_HEADPHONE_MIXER_1, 1, 1, 0),
+SOC_DAPM_SINGLE("IN4R Switch", WM8962_HEADPHONE_MIXER_1, 0, 1, 0),
+};
+
+static const struct snd_kcontrol_new hpmixr[] = {
+SOC_DAPM_SINGLE("DACL Switch", WM8962_HEADPHONE_MIXER_2, 5, 1, 0),
+SOC_DAPM_SINGLE("DACR Switch", WM8962_HEADPHONE_MIXER_2, 4, 1, 0),
+SOC_DAPM_SINGLE("MIXINL Switch", WM8962_HEADPHONE_MIXER_2, 3, 1, 0),
+SOC_DAPM_SINGLE("MIXINR Switch", WM8962_HEADPHONE_MIXER_2, 2, 1, 0),
+SOC_DAPM_SINGLE("IN4L Switch", WM8962_HEADPHONE_MIXER_2, 1, 1, 0),
+SOC_DAPM_SINGLE("IN4R Switch", WM8962_HEADPHONE_MIXER_2, 0, 1, 0),
+};
+
+static const struct snd_kcontrol_new spkmixl[] = {
+SOC_DAPM_SINGLE("DACL Switch", WM8962_SPEAKER_MIXER_1, 5, 1, 0),
+SOC_DAPM_SINGLE("DACR Switch", WM8962_SPEAKER_MIXER_1, 4, 1, 0),
+SOC_DAPM_SINGLE("MIXINL Switch", WM8962_SPEAKER_MIXER_1, 3, 1, 0),
+SOC_DAPM_SINGLE("MIXINR Switch", WM8962_SPEAKER_MIXER_1, 2, 1, 0),
+SOC_DAPM_SINGLE("IN4L Switch", WM8962_SPEAKER_MIXER_1, 1, 1, 0),
+SOC_DAPM_SINGLE("IN4R Switch", WM8962_SPEAKER_MIXER_1, 0, 1, 0),
+};
+
+static const struct snd_kcontrol_new spkmixr[] = {
+SOC_DAPM_SINGLE("DACL Switch", WM8962_SPEAKER_MIXER_2, 5, 1, 0),
+SOC_DAPM_SINGLE("DACR Switch", WM8962_SPEAKER_MIXER_2, 4, 1, 0),
+SOC_DAPM_SINGLE("MIXINL Switch", WM8962_SPEAKER_MIXER_2, 3, 1, 0),
+SOC_DAPM_SINGLE("MIXINR Switch", WM8962_SPEAKER_MIXER_2, 2, 1, 0),
+SOC_DAPM_SINGLE("IN4L Switch", WM8962_SPEAKER_MIXER_2, 1, 1, 0),
+SOC_DAPM_SINGLE("IN4R Switch", WM8962_SPEAKER_MIXER_2, 0, 1, 0),
+};
+
+static const struct snd_soc_dapm_widget wm8962_dapm_widgets[] = {
+SND_SOC_DAPM_INPUT("IN1L"),
+SND_SOC_DAPM_INPUT("IN1R"),
+SND_SOC_DAPM_INPUT("IN2L"),
+SND_SOC_DAPM_INPUT("IN2R"),
+SND_SOC_DAPM_INPUT("IN3L"),
+SND_SOC_DAPM_INPUT("IN3R"),
+SND_SOC_DAPM_INPUT("IN4L"),
+SND_SOC_DAPM_INPUT("IN4R"),
+SND_SOC_DAPM_INPUT("Beep"),
+
+SND_SOC_DAPM_SUPPLY("Class G", WM8962_CHARGE_PUMP_B, 0, 1, NULL, 0),
+SND_SOC_DAPM_SUPPLY("SYSCLK", WM8962_CLOCKING2, 5, 0, sysclk_event,
+ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+SND_SOC_DAPM_SUPPLY("Charge Pump", WM8962_CHARGE_PUMP_1, 0, 0, cp_event,
+ SND_SOC_DAPM_POST_PMU),
+SND_SOC_DAPM_SUPPLY("TOCLK", WM8962_ADDITIONAL_CONTROL_1, 0, 0, NULL, 0),
+
+SND_SOC_DAPM_MIXER("INPGAL", WM8962_LEFT_INPUT_PGA_CONTROL, 4, 0,
+ inpgal, ARRAY_SIZE(inpgal)),
+SND_SOC_DAPM_MIXER("INPGAR", WM8962_RIGHT_INPUT_PGA_CONTROL, 4, 0,
+ inpgar, ARRAY_SIZE(inpgar)),
+SND_SOC_DAPM_MIXER("MIXINL", WM8962_PWR_MGMT_1, 5, 0,
+ mixinl, ARRAY_SIZE(mixinl)),
+SND_SOC_DAPM_MIXER("MIXINR", WM8962_PWR_MGMT_1, 4, 0,
+ mixinr, ARRAY_SIZE(mixinr)),
+
+SND_SOC_DAPM_ADC("ADCL", "Capture", WM8962_PWR_MGMT_1, 3, 0),
+SND_SOC_DAPM_ADC("ADCR", "Capture", WM8962_PWR_MGMT_1, 2, 0),
+
+SND_SOC_DAPM_MUX("STL", SND_SOC_NOPM, 0, 0, &stl_mux),
+SND_SOC_DAPM_MUX("STR", SND_SOC_NOPM, 0, 0, &str_mux),
+
+SND_SOC_DAPM_DAC("DACL", "Playback", WM8962_PWR_MGMT_2, 8, 0),
+SND_SOC_DAPM_DAC("DACR", "Playback", WM8962_PWR_MGMT_2, 7, 0),
+
+SND_SOC_DAPM_PGA("Left Bypass", SND_SOC_NOPM, 0, 0, NULL, 0),
+SND_SOC_DAPM_PGA("Right Bypass", SND_SOC_NOPM, 0, 0, NULL, 0),
+
+SND_SOC_DAPM_MIXER("HPMIXL", WM8962_MIXER_ENABLES, 3, 0,
+ hpmixl, ARRAY_SIZE(hpmixl)),
+SND_SOC_DAPM_MIXER("HPMIXR", WM8962_MIXER_ENABLES, 2, 0,
+ hpmixr, ARRAY_SIZE(hpmixr)),
+
+SND_SOC_DAPM_MUX_E("HPOUTL PGA", WM8962_PWR_MGMT_2, 6, 0, &hpoutl_mux,
+ out_pga_event, SND_SOC_DAPM_POST_PMU),
+SND_SOC_DAPM_MUX_E("HPOUTR PGA", WM8962_PWR_MGMT_2, 5, 0, &hpoutr_mux,
+ out_pga_event, SND_SOC_DAPM_POST_PMU),
+
+SND_SOC_DAPM_PGA_E("HPOUT", SND_SOC_NOPM, 0, 0, NULL, 0, hp_event,
+ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+
+SND_SOC_DAPM_OUTPUT("HPOUTL"),
+SND_SOC_DAPM_OUTPUT("HPOUTR"),
+};
+
+static const struct snd_soc_dapm_widget wm8962_dapm_spk_mono_widgets[] = {
+SND_SOC_DAPM_MIXER("Speaker Mixer", WM8962_MIXER_ENABLES, 1, 0,
+ spkmixl, ARRAY_SIZE(spkmixl)),
+SND_SOC_DAPM_MUX_E("Speaker PGA", WM8962_PWR_MGMT_2, 4, 0, &spkoutl_mux,
+ out_pga_event, SND_SOC_DAPM_POST_PMU),
+SND_SOC_DAPM_PGA("Speaker Output", WM8962_CLASS_D_CONTROL_1, 7, 0, NULL, 0),
+SND_SOC_DAPM_OUTPUT("SPKOUT"),
+};
+
+static const struct snd_soc_dapm_widget wm8962_dapm_spk_stereo_widgets[] = {
+SND_SOC_DAPM_MIXER("SPKOUTL Mixer", WM8962_MIXER_ENABLES, 1, 0,
+ spkmixl, ARRAY_SIZE(spkmixl)),
+SND_SOC_DAPM_MIXER("SPKOUTR Mixer", WM8962_MIXER_ENABLES, 0, 0,
+ spkmixr, ARRAY_SIZE(spkmixr)),
+
+SND_SOC_DAPM_MUX_E("SPKOUTL PGA", WM8962_PWR_MGMT_2, 4, 0, &spkoutl_mux,
+ out_pga_event, SND_SOC_DAPM_POST_PMU),
+SND_SOC_DAPM_MUX_E("SPKOUTR PGA", WM8962_PWR_MGMT_2, 3, 0, &spkoutr_mux,
+ out_pga_event, SND_SOC_DAPM_POST_PMU),
+
+SND_SOC_DAPM_PGA("SPKOUTR Output", WM8962_CLASS_D_CONTROL_1, 7, 0, NULL, 0),
+SND_SOC_DAPM_PGA("SPKOUTL Output", WM8962_CLASS_D_CONTROL_1, 6, 0, NULL, 0),
+
+SND_SOC_DAPM_OUTPUT("SPKOUTL"),
+SND_SOC_DAPM_OUTPUT("SPKOUTR"),
+};
+
+static const struct snd_soc_dapm_route wm8962_intercon[] = {
+ { "INPGAL", "IN1L Switch", "IN1L" },
+ { "INPGAL", "IN2L Switch", "IN2L" },
+ { "INPGAL", "IN3L Switch", "IN3L" },
+ { "INPGAL", "IN4L Switch", "IN4L" },
+
+ { "INPGAR", "IN1R Switch", "IN1R" },
+ { "INPGAR", "IN2R Switch", "IN2R" },
+ { "INPGAR", "IN3R Switch", "IN3R" },
+ { "INPGAR", "IN4R Switch", "IN4R" },
+
+ { "MIXINL", "IN2L Switch", "IN2L" },
+ { "MIXINL", "IN3L Switch", "IN3L" },
+ { "MIXINL", "PGA Switch", "INPGAL" },
+
+ { "MIXINR", "IN2R Switch", "IN2R" },
+ { "MIXINR", "IN3R Switch", "IN3R" },
+ { "MIXINR", "PGA Switch", "INPGAR" },
+
+ { "ADCL", NULL, "SYSCLK" },
+ { "ADCL", NULL, "TOCLK" },
+ { "ADCL", NULL, "MIXINL" },
+
+ { "ADCR", NULL, "SYSCLK" },
+ { "ADCR", NULL, "TOCLK" },
+ { "ADCR", NULL, "MIXINR" },
+
+ { "STL", "Left", "ADCL" },
+ { "STL", "Right", "ADCR" },
+
+ { "STR", "Left", "ADCL" },
+ { "STR", "Right", "ADCR" },
+
+ { "DACL", NULL, "SYSCLK" },
+ { "DACL", NULL, "TOCLK" },
+ { "DACL", NULL, "Beep" },
+ { "DACL", NULL, "STL" },
+
+ { "DACR", NULL, "SYSCLK" },
+ { "DACR", NULL, "TOCLK" },
+ { "DACR", NULL, "Beep" },
+ { "DACR", NULL, "STR" },
+
+ { "HPMIXL", "IN4L Switch", "IN4L" },
+ { "HPMIXL", "IN4R Switch", "IN4R" },
+ { "HPMIXL", "DACL Switch", "DACL" },
+ { "HPMIXL", "DACR Switch", "DACR" },
+ { "HPMIXL", "MIXINL Switch", "MIXINL" },
+ { "HPMIXL", "MIXINR Switch", "MIXINR" },
+
+ { "HPMIXR", "IN4L Switch", "IN4L" },
+ { "HPMIXR", "IN4R Switch", "IN4R" },
+ { "HPMIXR", "DACL Switch", "DACL" },
+ { "HPMIXR", "DACR Switch", "DACR" },
+ { "HPMIXR", "MIXINL Switch", "MIXINL" },
+ { "HPMIXR", "MIXINR Switch", "MIXINR" },
+
+ { "Left Bypass", NULL, "HPMIXL" },
+ { "Left Bypass", NULL, "Class G" },
+
+ { "Right Bypass", NULL, "HPMIXR" },
+ { "Right Bypass", NULL, "Class G" },
+
+ { "HPOUTL PGA", "Mixer", "Left Bypass" },
+ { "HPOUTL PGA", "DAC", "DACL" },
+
+ { "HPOUTR PGA", "Mixer", "Right Bypass" },
+ { "HPOUTR PGA", "DAC", "DACR" },
+
+ { "HPOUT", NULL, "HPOUTL PGA" },
+ { "HPOUT", NULL, "HPOUTR PGA" },
+ { "HPOUT", NULL, "Charge Pump" },
+ { "HPOUT", NULL, "SYSCLK" },
+ { "HPOUT", NULL, "TOCLK" },
+
+ { "HPOUTL", NULL, "HPOUT" },
+ { "HPOUTR", NULL, "HPOUT" },
+};
+
+static const struct snd_soc_dapm_route wm8962_spk_mono_intercon[] = {
+ { "Speaker Mixer", "IN4L Switch", "IN4L" },
+ { "Speaker Mixer", "IN4R Switch", "IN4R" },
+ { "Speaker Mixer", "DACL Switch", "DACL" },
+ { "Speaker Mixer", "DACR Switch", "DACR" },
+ { "Speaker Mixer", "MIXINL Switch", "MIXINL" },
+ { "Speaker Mixer", "MIXINR Switch", "MIXINR" },
+
+ { "Speaker PGA", "Mixer", "Speaker Mixer" },
+ { "Speaker PGA", "DAC", "DACL" },
+
+ { "Speaker Output", NULL, "Speaker PGA" },
+ { "Speaker Output", NULL, "SYSCLK" },
+ { "Speaker Output", NULL, "TOCLK" },
+
+ { "SPKOUT", NULL, "Speaker Output" },
+};
+
+static const struct snd_soc_dapm_route wm8962_spk_stereo_intercon[] = {
+ { "SPKOUTL Mixer", "IN4L Switch", "IN4L" },
+ { "SPKOUTL Mixer", "IN4R Switch", "IN4R" },
+ { "SPKOUTL Mixer", "DACL Switch", "DACL" },
+ { "SPKOUTL Mixer", "DACR Switch", "DACR" },
+ { "SPKOUTL Mixer", "MIXINL Switch", "MIXINL" },
+ { "SPKOUTL Mixer", "MIXINR Switch", "MIXINR" },
+
+ { "SPKOUTR Mixer", "IN4L Switch", "IN4L" },
+ { "SPKOUTR Mixer", "IN4R Switch", "IN4R" },
+ { "SPKOUTR Mixer", "DACL Switch", "DACL" },
+ { "SPKOUTR Mixer", "DACR Switch", "DACR" },
+ { "SPKOUTR Mixer", "MIXINL Switch", "MIXINL" },
+ { "SPKOUTR Mixer", "MIXINR Switch", "MIXINR" },
+
+ { "SPKOUTL PGA", "Mixer", "SPKOUTL Mixer" },
+ { "SPKOUTL PGA", "DAC", "DACL" },
+
+ { "SPKOUTR PGA", "Mixer", "SPKOUTR Mixer" },
+ { "SPKOUTR PGA", "DAC", "DACR" },
+
+ { "SPKOUTL Output", NULL, "SPKOUTL PGA" },
+ { "SPKOUTL Output", NULL, "SYSCLK" },
+ { "SPKOUTL Output", NULL, "TOCLK" },
+
+ { "SPKOUTR Output", NULL, "SPKOUTR PGA" },
+ { "SPKOUTR Output", NULL, "SYSCLK" },
+ { "SPKOUTR Output", NULL, "TOCLK" },
+
+ { "SPKOUTL", NULL, "SPKOUTL Output" },
+ { "SPKOUTR", NULL, "SPKOUTR Output" },
+};
+
+static int wm8962_add_widgets(struct snd_soc_codec *codec)
+{
+ struct wm8962_pdata *pdata = dev_get_platdata(codec->dev);
+
+ snd_soc_add_controls(codec, wm8962_snd_controls,
+ ARRAY_SIZE(wm8962_snd_controls));
+ if (pdata && pdata->spk_mono)
+ snd_soc_add_controls(codec, wm8962_spk_mono_controls,
+ ARRAY_SIZE(wm8962_spk_mono_controls));
+ else
+ snd_soc_add_controls(codec, wm8962_spk_stereo_controls,
+ ARRAY_SIZE(wm8962_spk_stereo_controls));
+
+
+ snd_soc_dapm_new_controls(codec, wm8962_dapm_widgets,
+ ARRAY_SIZE(wm8962_dapm_widgets));
+ if (pdata && pdata->spk_mono)
+ snd_soc_dapm_new_controls(codec, wm8962_dapm_spk_mono_widgets,
+ ARRAY_SIZE(wm8962_dapm_spk_mono_widgets));
+ else
+ snd_soc_dapm_new_controls(codec, wm8962_dapm_spk_stereo_widgets,
+ ARRAY_SIZE(wm8962_dapm_spk_stereo_widgets));
+
+ snd_soc_dapm_add_routes(codec, wm8962_intercon,
+ ARRAY_SIZE(wm8962_intercon));
+ if (pdata && pdata->spk_mono)
+ snd_soc_dapm_add_routes(codec, wm8962_spk_mono_intercon,
+ ARRAY_SIZE(wm8962_spk_mono_intercon));
+ else
+ snd_soc_dapm_add_routes(codec, wm8962_spk_stereo_intercon,
+ ARRAY_SIZE(wm8962_spk_stereo_intercon));
+
+
+ snd_soc_dapm_disable_pin(codec, "Beep");
+
+ return 0;
+}
+
+static void wm8962_sync_cache(struct snd_soc_codec *codec)
+{
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ int i;
+
+ if (!codec->cache_sync)
+ return;
+
+ dev_dbg(codec->dev, "Syncing cache\n");
+
+ codec->cache_only = 0;
+
+ /* Sync back cached values if they're different from the
+ * hardware default.
+ */
+ for (i = 1; i < ARRAY_SIZE(wm8962->reg_cache); i++) {
+ if (i == WM8962_SOFTWARE_RESET)
+ continue;
+ if (wm8962->reg_cache[i] == wm8962_reg[i])
+ continue;
+
+ snd_soc_write(codec, i, wm8962->reg_cache[i]);
+ }
+
+ codec->cache_sync = 0;
+}
+
+/* -1 for reserved values */
+static const int bclk_divs[] = {
+ 1, -1, 2, 3, 4, -1, 6, 8, -1, 12, 16, 24, -1, 32, 32, 32
+};
+
+static void wm8962_configure_bclk(struct snd_soc_codec *codec)
+{
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ int dspclk, i;
+ int clocking2 = 0;
+ int aif2 = 0;
+
+ /* If the CODEC is powered on we can configure BCLK */
+ if (codec->bias_level != SND_SOC_BIAS_OFF) {
+ dev_dbg(codec->dev, "Bias is off, can't configure BCLK\n");
+ return;
+ }
+
+ if (!wm8962->bclk) {
+ dev_dbg(codec->dev, "No BCLK rate configured\n");
+ return;
+ }
+
+ dspclk = snd_soc_read(codec, WM8962_CLOCKING1);
+ if (dspclk < 0) {
+ dev_err(codec->dev, "Failed to read DSPCLK: %d\n", dspclk);
+ return;
+ }
+
+ dspclk = (dspclk & WM8962_DSPCLK_DIV_MASK) >> WM8962_DSPCLK_DIV_SHIFT;
+ switch (dspclk) {
+ case 0:
+ dspclk = wm8962->sysclk_rate;
+ break;
+ case 1:
+ dspclk = wm8962->sysclk_rate / 2;
+ break;
+ case 2:
+ dspclk = wm8962->sysclk_rate / 4;
+ break;
+ default:
+ dev_warn(codec->dev, "Unknown DSPCLK divisor read back\n");
+ dspclk = wm8962->sysclk;
+ }
+
+ dev_dbg(codec->dev, "DSPCLK is %dHz, BCLK %d\n", dspclk, wm8962->bclk);
+
+ /* We're expecting an exact match */
+ for (i = 0; i < ARRAY_SIZE(bclk_divs); i++) {
+ if (bclk_divs[i] < 0)
+ continue;
+
+ if (dspclk / bclk_divs[i] == wm8962->bclk) {
+ dev_dbg(codec->dev, "Selected BCLK_DIV %d for %dHz\n",
+ bclk_divs[i], wm8962->bclk);
+ clocking2 |= i;
+ break;
+ }
+ }
+ if (i == ARRAY_SIZE(bclk_divs)) {
+ dev_err(codec->dev, "Unsupported BCLK ratio %d\n",
+ dspclk / wm8962->bclk);
+ return;
+ }
+
+ aif2 |= wm8962->bclk / wm8962->lrclk;
+ dev_dbg(codec->dev, "Selected LRCLK divisor %d for %dHz\n",
+ wm8962->bclk / wm8962->lrclk, wm8962->lrclk);
+
+ snd_soc_update_bits(codec, WM8962_CLOCKING2,
+ WM8962_BCLK_DIV_MASK, clocking2);
+ snd_soc_update_bits(codec, WM8962_AUDIO_INTERFACE_2,
+ WM8962_AIF_RATE_MASK, aif2);
+}
+
+static int wm8962_set_bias_level(struct snd_soc_codec *codec,
+ enum snd_soc_bias_level level)
+{
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ int ret;
+
+ if (level == codec->bias_level)
+ return 0;
+
+ switch (level) {
+ case SND_SOC_BIAS_ON:
+ break;
+
+ case SND_SOC_BIAS_PREPARE:
+ /* VMID 2*50k */
+ snd_soc_update_bits(codec, WM8962_PWR_MGMT_1,
+ WM8962_VMID_SEL_MASK, 0x80);
+ break;
+
+ case SND_SOC_BIAS_STANDBY:
+ if (codec->bias_level == SND_SOC_BIAS_OFF) {
+ ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies),
+ wm8962->supplies);
+ if (ret != 0) {
+ dev_err(codec->dev,
+ "Failed to enable supplies: %d\n",
+ ret);
+ return ret;
+ }
+
+ wm8962_sync_cache(codec);
+
+ snd_soc_update_bits(codec, WM8962_ANTI_POP,
+ WM8962_STARTUP_BIAS_ENA |
+ WM8962_VMID_BUF_ENA,
+ WM8962_STARTUP_BIAS_ENA |
+ WM8962_VMID_BUF_ENA);
+
+ /* Bias enable at 2*50k for ramp */
+ snd_soc_update_bits(codec, WM8962_PWR_MGMT_1,
+ WM8962_VMID_SEL_MASK |
+ WM8962_BIAS_ENA,
+ WM8962_BIAS_ENA | 0x180);
+
+ msleep(5);
+
+ snd_soc_update_bits(codec, WM8962_CLOCKING2,
+ WM8962_CLKREG_OVD,
+ WM8962_CLKREG_OVD);
+
+ wm8962_configure_bclk(codec);
+ }
+
+ /* VMID 2*250k */
+ snd_soc_update_bits(codec, WM8962_PWR_MGMT_1,
+ WM8962_VMID_SEL_MASK, 0x100);
+ break;
+
+ case SND_SOC_BIAS_OFF:
+ snd_soc_update_bits(codec, WM8962_PWR_MGMT_1,
+ WM8962_VMID_SEL_MASK | WM8962_BIAS_ENA, 0);
+
+ snd_soc_update_bits(codec, WM8962_ANTI_POP,
+ WM8962_STARTUP_BIAS_ENA |
+ WM8962_VMID_BUF_ENA, 0);
+
+ regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies),
+ wm8962->supplies);
+ break;
+ }
+ codec->bias_level = level;
+ return 0;
+}
+
+static const struct {
+ int rate;
+ int reg;
+} sr_vals[] = {
+ { 48000, 0 },
+ { 44100, 0 },
+ { 32000, 1 },
+ { 22050, 2 },
+ { 24000, 2 },
+ { 16000, 3 },
+ { 11025, 4 },
+ { 12000, 4 },
+ { 8000, 5 },
+ { 88200, 6 },
+ { 96000, 6 },
+};
+
+static const int sysclk_rates[] = {
+ 64, 128, 192, 256, 384, 512, 768, 1024, 1408, 1536,
+};
+
+static int wm8962_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params,
+ struct snd_soc_dai *dai)
+{
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_codec *codec = rtd->codec;
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ int rate = params_rate(params);
+ int i;
+ int aif0 = 0;
+ int adctl3 = 0;
+ int clocking4 = 0;
+
+ wm8962->bclk = snd_soc_params_to_bclk(params);
+ wm8962->lrclk = params_rate(params);
+
+ for (i = 0; i < ARRAY_SIZE(sr_vals); i++) {
+ if (sr_vals[i].rate == rate) {
+ adctl3 |= sr_vals[i].reg;
+ break;
+ }
+ }
+ if (i == ARRAY_SIZE(sr_vals)) {
+ dev_err(codec->dev, "Unsupported rate %dHz\n", rate);
+ return -EINVAL;
+ }
+
+ if (rate % 8000 == 0)
+ adctl3 |= WM8962_SAMPLE_RATE_INT_MODE;
+
+ for (i = 0; i < ARRAY_SIZE(sysclk_rates); i++) {
+ if (sysclk_rates[i] == wm8962->sysclk_rate / rate) {
+ clocking4 |= i << WM8962_SYSCLK_RATE_SHIFT;
+ break;
+ }
+ }
+ if (i == ARRAY_SIZE(sysclk_rates)) {
+ dev_err(codec->dev, "Unsupported sysclk ratio %d\n",
+ wm8962->sysclk_rate / rate);
+ return -EINVAL;
+ }
+
+ switch (params_format(params)) {
+ case SNDRV_PCM_FORMAT_S16_LE:
+ break;
+ case SNDRV_PCM_FORMAT_S20_3LE:
+ aif0 |= 0x40;
+ break;
+ case SNDRV_PCM_FORMAT_S24_LE:
+ aif0 |= 0x80;
+ break;
+ case SNDRV_PCM_FORMAT_S32_LE:
+ aif0 |= 0xc0;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ snd_soc_update_bits(codec, WM8962_AUDIO_INTERFACE_0,
+ WM8962_WL_MASK, aif0);
+ snd_soc_update_bits(codec, WM8962_ADDITIONAL_CONTROL_3,
+ WM8962_SAMPLE_RATE_INT_MODE |
+ WM8962_SAMPLE_RATE_MASK, adctl3);
+ snd_soc_update_bits(codec, WM8962_CLOCKING_4,
+ WM8962_SYSCLK_RATE_MASK, clocking4);
+
+ wm8962_configure_bclk(codec);
+
+ return 0;
+}
+
+static int wm8962_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id,
+ unsigned int freq, int dir)
+{
+ struct snd_soc_codec *codec = dai->codec;
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ int src;
+
+ switch (clk_id) {
+ case WM8962_SYSCLK_MCLK:
+ wm8962->sysclk = WM8962_SYSCLK_MCLK;
+ src = 0;
+ break;
+ case WM8962_SYSCLK_FLL:
+ wm8962->sysclk = WM8962_SYSCLK_FLL;
+ src = 1 << WM8962_SYSCLK_SRC_SHIFT;
+ WARN_ON(freq != wm8962->fll_fout);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ snd_soc_update_bits(codec, WM8962_CLOCKING2, WM8962_SYSCLK_SRC_MASK,
+ src);
+
+ wm8962->sysclk_rate = freq;
+
+ return 0;
+}
+
+static int wm8962_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
+{
+ struct snd_soc_codec *codec = dai->codec;
+ int aif0 = 0;
+
+ switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
+ case SND_SOC_DAIFMT_DSP_A:
+ aif0 |= WM8962_LRCLK_INV;
+ case SND_SOC_DAIFMT_DSP_B:
+ aif0 |= 3;
+
+ switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
+ case SND_SOC_DAIFMT_NB_NF:
+ case SND_SOC_DAIFMT_IB_NF:
+ break;
+ default:
+ return -EINVAL;
+ }
+ break;
+
+ case SND_SOC_DAIFMT_RIGHT_J:
+ break;
+ case SND_SOC_DAIFMT_LEFT_J:
+ aif0 |= 1;
+ break;
+ case SND_SOC_DAIFMT_I2S:
+ aif0 |= 2;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
+ case SND_SOC_DAIFMT_NB_NF:
+ break;
+ case SND_SOC_DAIFMT_IB_NF:
+ aif0 |= WM8962_BCLK_INV;
+ break;
+ case SND_SOC_DAIFMT_NB_IF:
+ aif0 |= WM8962_LRCLK_INV;
+ break;
+ case SND_SOC_DAIFMT_IB_IF:
+ aif0 |= WM8962_BCLK_INV | WM8962_LRCLK_INV;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
+ case SND_SOC_DAIFMT_CBM_CFM:
+ aif0 |= WM8962_MSTR;
+ break;
+ case SND_SOC_DAIFMT_CBS_CFS:
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ snd_soc_update_bits(codec, WM8962_AUDIO_INTERFACE_0,
+ WM8962_FMT_MASK | WM8962_BCLK_INV | WM8962_MSTR |
+ WM8962_LRCLK_INV, aif0);
+
+ return 0;
+}
+
+struct _fll_div {
+ u16 fll_fratio;
+ u16 fll_outdiv;
+ u16 fll_refclk_div;
+ u16 n;
+ u16 theta;
+ u16 lambda;
+};
+
+/* The size in bits of the FLL divide multiplied by 10
+ * to allow rounding later */
+#define FIXED_FLL_SIZE ((1 << 16) * 10)
+
+static struct {
+ unsigned int min;
+ unsigned int max;
+ u16 fll_fratio;
+ int ratio;
+} fll_fratios[] = {
+ { 0, 64000, 4, 16 },
+ { 64000, 128000, 3, 8 },
+ { 128000, 256000, 2, 4 },
+ { 256000, 1000000, 1, 2 },
+ { 1000000, 13500000, 0, 1 },
+};
+
+static int fll_factors(struct _fll_div *fll_div, unsigned int Fref,
+ unsigned int Fout)
+{
+ unsigned int target;
+ unsigned int div;
+ unsigned int fratio, gcd_fll;
+ int i;
+
+ /* Fref must be <=13.5MHz */
+ div = 1;
+ fll_div->fll_refclk_div = 0;
+ while ((Fref / div) > 13500000) {
+ div *= 2;
+ fll_div->fll_refclk_div++;
+
+ if (div > 4) {
+ pr_err("Can't scale %dMHz input down to <=13.5MHz\n",
+ Fref);
+ return -EINVAL;
+ }
+ }
+
+ pr_debug("FLL Fref=%u Fout=%u\n", Fref, Fout);
+
+ /* Apply the division for our remaining calculations */
+ Fref /= div;
+
+ /* Fvco should be 90-100MHz; don't check the upper bound */
+ div = 2;
+ while (Fout * div < 90000000) {
+ div++;
+ if (div > 64) {
+ pr_err("Unable to find FLL_OUTDIV for Fout=%uHz\n",
+ Fout);
+ return -EINVAL;
+ }
+ }
+ target = Fout * div;
+ fll_div->fll_outdiv = div - 1;
+
+ pr_debug("FLL Fvco=%dHz\n", target);
+
+ /* Find an appropraite FLL_FRATIO and factor it out of the target */
+ for (i = 0; i < ARRAY_SIZE(fll_fratios); i++) {
+ if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) {
+ fll_div->fll_fratio = fll_fratios[i].fll_fratio;
+ fratio = fll_fratios[i].ratio;
+ break;
+ }
+ }
+ if (i == ARRAY_SIZE(fll_fratios)) {
+ pr_err("Unable to find FLL_FRATIO for Fref=%uHz\n", Fref);
+ return -EINVAL;
+ }
+
+ fll_div->n = target / (fratio * Fref);
+
+ if (target % Fref == 0) {
+ fll_div->theta = 0;
+ fll_div->lambda = 0;
+ } else {
+ gcd_fll = gcd(target, fratio * Fref);
+
+ fll_div->theta = (target - (fll_div->n * fratio * Fref))
+ / gcd_fll;
+ fll_div->lambda = (fratio * Fref) / gcd_fll;
+ }
+
+ pr_debug("FLL N=%x THETA=%x LAMBDA=%x\n",
+ fll_div->n, fll_div->theta, fll_div->lambda);
+ pr_debug("FLL_FRATIO=%x FLL_OUTDIV=%x FLL_REFCLK_DIV=%x\n",
+ fll_div->fll_fratio, fll_div->fll_outdiv,
+ fll_div->fll_refclk_div);
+
+ return 0;
+}
+
+static int wm8962_set_fll(struct snd_soc_dai *dai, int fll_id, int source,
+ unsigned int Fref, unsigned int Fout)
+{
+ struct snd_soc_codec *codec = dai->codec;
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ struct _fll_div fll_div;
+ int ret;
+ int fll1 = snd_soc_read(codec, WM8962_FLL_CONTROL_1);
+
+ /* Any change? */
+ if (source == wm8962->fll_src && Fref == wm8962->fll_fref &&
+ Fout == wm8962->fll_fout)
+ return 0;
+
+ if (Fout == 0) {
+ dev_dbg(codec->dev, "FLL disabled\n");
+
+ wm8962->fll_fref = 0;
+ wm8962->fll_fout = 0;
+
+ snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
+ WM8962_FLL_ENA, 0);
+
+ return 0;
+ }
+
+ ret = fll_factors(&fll_div, Fref, Fout);
+ if (ret != 0)
+ return ret;
+
+ switch (fll_id) {
+ case WM8962_FLL_MCLK:
+ case WM8962_FLL_BCLK:
+ case WM8962_FLL_OSC:
+ fll1 |= (fll_id - 1) << WM8962_FLL_REFCLK_SRC_SHIFT;
+ break;
+ case WM8962_FLL_INT:
+ snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
+ WM8962_FLL_OSC_ENA, WM8962_FLL_OSC_ENA);
+ snd_soc_update_bits(codec, WM8962_FLL_CONTROL_5,
+ WM8962_FLL_FRC_NCO, WM8962_FLL_FRC_NCO);
+ break;
+ default:
+ dev_err(codec->dev, "Unknown FLL source %d\n", ret);
+ return -EINVAL;
+ }
+
+ if (fll_div.theta || fll_div.lambda)
+ fll1 |= WM8962_FLL_FRAC;
+
+ /* Stop the FLL while we reconfigure */
+ snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, WM8962_FLL_ENA, 0);
+
+ snd_soc_update_bits(codec, WM8962_FLL_CONTROL_2,
+ WM8962_FLL_OUTDIV_MASK |
+ WM8962_FLL_REFCLK_DIV_MASK,
+ (fll_div.fll_outdiv << WM8962_FLL_OUTDIV_SHIFT) |
+ (fll_div.fll_refclk_div));
+
+ snd_soc_update_bits(codec, WM8962_FLL_CONTROL_3,
+ WM8962_FLL_FRATIO_MASK, fll_div.fll_fratio);
+
+ snd_soc_write(codec, WM8962_FLL_CONTROL_6, fll_div.theta);
+ snd_soc_write(codec, WM8962_FLL_CONTROL_7, fll_div.lambda);
+ snd_soc_write(codec, WM8962_FLL_CONTROL_8, fll_div.n);
+
+ snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
+ WM8962_FLL_FRAC | WM8962_FLL_REFCLK_SRC_MASK |
+ WM8962_FLL_ENA, fll1);
+
+ dev_dbg(codec->dev, "FLL configured for %dHz->%dHz\n", Fref, Fout);
+
+ wm8962->fll_fref = Fref;
+ wm8962->fll_fout = Fout;
+ wm8962->fll_src = source;
+
+ return 0;
+}
+
+static int wm8962_mute(struct snd_soc_dai *dai, int mute)
+{
+ struct snd_soc_codec *codec = dai->codec;
+ int val;
+
+ if (mute)
+ val = WM8962_DAC_MUTE;
+ else
+ val = 0;
+
+ return snd_soc_update_bits(codec, WM8962_ADC_DAC_CONTROL_1,
+ WM8962_DAC_MUTE, val);
+}
+
+#define WM8962_RATES SNDRV_PCM_RATE_8000_96000
+
+#define WM8962_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
+ SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
+
+static struct snd_soc_dai_ops wm8962_dai_ops = {
+ .hw_params = wm8962_hw_params,
+ .set_sysclk = wm8962_set_dai_sysclk,
+ .set_fmt = wm8962_set_dai_fmt,
+ .set_pll = wm8962_set_fll,
+ .digital_mute = wm8962_mute,
+};
+
+static struct snd_soc_dai_driver wm8962_dai = {
+ .name = "wm8962",
+ .playback = {
+ .stream_name = "Playback",
+ .channels_min = 2,
+ .channels_max = 2,
+ .rates = WM8962_RATES,
+ .formats = WM8962_FORMATS,
+ },
+ .capture = {
+ .stream_name = "Capture",
+ .channels_min = 2,
+ .channels_max = 2,
+ .rates = WM8962_RATES,
+ .formats = WM8962_FORMATS,
+ },
+ .ops = &wm8962_dai_ops,
+ .symmetric_rates = 1,
+};
+
+#ifdef CONFIG_PM
+static int wm8962_resume(struct snd_soc_codec *codec)
+{
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ u16 *reg_cache = codec->reg_cache;
+ int i;
+
+ /* Restore the registers */
+ for (i = 1; i < ARRAY_SIZE(wm8962->reg_cache); i++) {
+ switch (i) {
+ case WM8962_SOFTWARE_RESET:
+ continue;
+ default:
+ break;
+ }
+
+ if (reg_cache[i] != wm8962_reg[i])
+ snd_soc_write(codec, i, reg_cache[i]);
+ }
+
+ return 0;
+}
+#else
+#define wm8962_resume NULL
+#endif
+
+#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
+static int beep_rates[] = {
+ 500, 1000, 2000, 4000,
+};
+
+static void wm8962_beep_work(struct work_struct *work)
+{
+ struct wm8962_priv *wm8962 =
+ container_of(work, struct wm8962_priv, beep_work);
+ struct snd_soc_codec *codec = wm8962->codec;
+ int i;
+ int reg = 0;
+ int best = 0;
+
+ if (wm8962->beep_rate) {
+ for (i = 0; i < ARRAY_SIZE(beep_rates); i++) {
+ if (abs(wm8962->beep_rate - beep_rates[i]) <
+ abs(wm8962->beep_rate - beep_rates[best]))
+ best = i;
+ }
+
+ dev_dbg(codec->dev, "Set beep rate %dHz for requested %dHz\n",
+ beep_rates[best], wm8962->beep_rate);
+
+ reg = WM8962_BEEP_ENA | (best << WM8962_BEEP_RATE_SHIFT);
+
+ snd_soc_dapm_enable_pin(codec, "Beep");
+ } else {
+ dev_dbg(codec->dev, "Disabling beep\n");
+ snd_soc_dapm_disable_pin(codec, "Beep");
+ }
+
+ snd_soc_update_bits(codec, WM8962_BEEP_GENERATOR_1,
+ WM8962_BEEP_ENA | WM8962_BEEP_RATE_MASK, reg);
+
+ snd_soc_dapm_sync(codec);
+}
+
+/* For usability define a way of injecting beep events for the device -
+ * many systems will not have a keyboard.
+ */
+static int wm8962_beep_event(struct input_dev *dev, unsigned int type,
+ unsigned int code, int hz)
+{
+ struct snd_soc_codec *codec = input_get_drvdata(dev);
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+
+ dev_dbg(codec->dev, "Beep event %x %x\n", code, hz);
+
+ switch (code) {
+ case SND_BELL:
+ if (hz)
+ hz = 1000;
+ case SND_TONE:
+ break;
+ default:
+ return -1;
+ }
+
+ /* Kick the beep from a workqueue */
+ wm8962->beep_rate = hz;
+ schedule_work(&wm8962->beep_work);
+ return 0;
+}
+
+static ssize_t wm8962_beep_set(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct wm8962_priv *wm8962 = dev_get_drvdata(dev);
+ long int time;
+
+ strict_strtol(buf, 10, &time);
+
+ input_event(wm8962->beep, EV_SND, SND_TONE, time);
+
+ return count;
+}
+
+static DEVICE_ATTR(beep, 0200, NULL, wm8962_beep_set);
+
+static void wm8962_init_beep(struct snd_soc_codec *codec)
+{
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ int ret;
+
+ wm8962->beep = input_allocate_device();
+ if (!wm8962->beep) {
+ dev_err(codec->dev, "Failed to allocate beep device\n");
+ return;
+ }
+
+ INIT_WORK(&wm8962->beep_work, wm8962_beep_work);
+ wm8962->beep_rate = 0;
+
+ wm8962->beep->name = "WM8962 Beep Generator";
+ wm8962->beep->phys = dev_name(codec->dev);
+ wm8962->beep->id.bustype = BUS_I2C;
+
+ wm8962->beep->evbit[0] = BIT_MASK(EV_SND);
+ wm8962->beep->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE);
+ wm8962->beep->event = wm8962_beep_event;
+ wm8962->beep->dev.parent = codec->dev;
+ input_set_drvdata(wm8962->beep, codec);
+
+ ret = input_register_device(wm8962->beep);
+ if (ret != 0) {
+ input_free_device(wm8962->beep);
+ wm8962->beep = NULL;
+ dev_err(codec->dev, "Failed to register beep device\n");
+ }
+
+ ret = device_create_file(codec->dev, &dev_attr_beep);
+ if (ret != 0) {
+ dev_err(codec->dev, "Failed to create keyclick file: %d\n",
+ ret);
+ }
+}
+
+static void wm8962_free_beep(struct snd_soc_codec *codec)
+{
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+
+ device_remove_file(codec->dev, &dev_attr_beep);
+ input_unregister_device(wm8962->beep);
+ cancel_work_sync(&wm8962->beep_work);
+ wm8962->beep = NULL;
+
+ snd_soc_update_bits(codec, WM8962_BEEP_GENERATOR_1, WM8962_BEEP_ENA,0);
+}
+#else
+static void wm8962_init_beep(struct snd_soc_codec *codec)
+{
+}
+
+static void wm8962_free_beep(struct snd_soc_codec *codec)
+{
+}
+#endif
+
+static int wm8962_probe(struct snd_soc_codec *codec)
+{
+ int ret;
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ struct wm8962_pdata *pdata = dev_get_platdata(codec->dev);
+ int i;
+
+ wm8962->codec = codec;
+
+ codec->cache_sync = 1;
+ codec->idle_bias_off = 1;
+
+ ret = snd_soc_codec_set_cache_io(codec, 16, 16, SND_SOC_I2C);
+ if (ret != 0) {
+ dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
+ goto err;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++)
+ wm8962->supplies[i].supply = wm8962_supply_names[i];
+
+ ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8962->supplies),
+ wm8962->supplies);
+ if (ret != 0) {
+ dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
+ goto err;
+ }
+
+ wm8962->disable_nb[0].notifier_call = wm8962_regulator_event_0;
+ wm8962->disable_nb[1].notifier_call = wm8962_regulator_event_1;
+ wm8962->disable_nb[2].notifier_call = wm8962_regulator_event_2;
+ wm8962->disable_nb[3].notifier_call = wm8962_regulator_event_3;
+ wm8962->disable_nb[4].notifier_call = wm8962_regulator_event_4;
+ wm8962->disable_nb[5].notifier_call = wm8962_regulator_event_5;
+ wm8962->disable_nb[6].notifier_call = wm8962_regulator_event_6;
+ wm8962->disable_nb[7].notifier_call = wm8962_regulator_event_7;
+
+ /* This should really be moved into the regulator core */
+ for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) {
+ ret = regulator_register_notifier(wm8962->supplies[i].consumer,
+ &wm8962->disable_nb[i]);
+ if (ret != 0) {
+ dev_err(codec->dev,
+ "Failed to register regulator notifier: %d\n",
+ ret);
+ }
+ }
+
+ ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies),
+ wm8962->supplies);
+ if (ret != 0) {
+ dev_err(codec->dev, "Failed to enable supplies: %d\n", ret);
+ goto err_get;
+ }
+
+ ret = snd_soc_read(codec, WM8962_SOFTWARE_RESET);
+ if (ret < 0) {
+ dev_err(codec->dev, "Failed to read ID register\n");
+ goto err_enable;
+ }
+ if (ret != wm8962_reg[WM8962_SOFTWARE_RESET]) {
+ dev_err(codec->dev, "Device is not a WM8962, ID %x != %x\n",
+ ret, wm8962_reg[WM8962_SOFTWARE_RESET]);
+ ret = -EINVAL;
+ goto err_enable;
+ }
+
+ ret = snd_soc_read(codec, WM8962_RIGHT_INPUT_VOLUME);
+ if (ret < 0) {
+ dev_err(codec->dev, "Failed to read device revision: %d\n",
+ ret);
+ goto err_enable;
+ }
+
+ dev_info(codec->dev, "customer id %x revision %c\n",
+ (ret & WM8962_CUST_ID_MASK) >> WM8962_CUST_ID_SHIFT,
+ ((ret & WM8962_CHIP_REV_MASK) >> WM8962_CHIP_REV_SHIFT)
+ + 'A');
+
+ ret = wm8962_reset(codec);
+ if (ret < 0) {
+ dev_err(codec->dev, "Failed to issue reset\n");
+ goto err_enable;
+ }
+
+ /* SYSCLK defaults to on; make sure it is off so we can safely
+ * write to registers if the device is declocked.
+ */
+ snd_soc_update_bits(codec, WM8962_CLOCKING2, WM8962_SYSCLK_ENA, 0);
+
+ regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
+
+ if (pdata) {
+ /* Apply static configuration for GPIOs */
+ for (i = 0; i < ARRAY_SIZE(pdata->gpio_init); i++)
+ if (pdata->gpio_init[i])
+ snd_soc_write(codec, 0x200 + i,
+ pdata->gpio_init[i] & 0xffff);
+
+ /* Put the speakers into mono mode? */
+ if (pdata->spk_mono)
+ wm8962->reg_cache[WM8962_CLASS_D_CONTROL_2]
+ |= WM8962_SPK_MONO;
+ }
+
+ /* Latch volume update bits */
+ wm8962->reg_cache[WM8962_LEFT_INPUT_VOLUME] |= WM8962_IN_VU;
+ wm8962->reg_cache[WM8962_RIGHT_INPUT_VOLUME] |= WM8962_IN_VU;
+ wm8962->reg_cache[WM8962_LEFT_ADC_VOLUME] |= WM8962_ADC_VU;
+ wm8962->reg_cache[WM8962_RIGHT_ADC_VOLUME] |= WM8962_ADC_VU;
+ wm8962->reg_cache[WM8962_LEFT_DAC_VOLUME] |= WM8962_DAC_VU;
+ wm8962->reg_cache[WM8962_RIGHT_DAC_VOLUME] |= WM8962_DAC_VU;
+ wm8962->reg_cache[WM8962_SPKOUTL_VOLUME] |= WM8962_SPKOUT_VU;
+ wm8962->reg_cache[WM8962_SPKOUTR_VOLUME] |= WM8962_SPKOUT_VU;
+ wm8962->reg_cache[WM8962_HPOUTL_VOLUME] |= WM8962_HPOUT_VU;
+ wm8962->reg_cache[WM8962_HPOUTR_VOLUME] |= WM8962_HPOUT_VU;
+
+ snd_soc_add_controls(codec, wm8962_snd_controls,
+ ARRAY_SIZE(wm8962_snd_controls));
+ wm8962_add_widgets(codec);
+
+ wm8962_init_beep(codec);
+
+ return 0;
+
+err_enable:
+ regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
+err_get:
+ regulator_bulk_free(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
+err:
+ kfree(wm8962);
+ return ret;
+}
+
+static int wm8962_remove(struct snd_soc_codec *codec)
+{
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+ int i;
+
+ wm8962_free_beep(codec);
+ for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++)
+ regulator_unregister_notifier(wm8962->supplies[i].consumer,
+ &wm8962->disable_nb[i]);
+ regulator_bulk_free(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
+
+ return 0;
+}
+
+static struct snd_soc_codec_driver soc_codec_dev_wm8962 = {
+ .probe = wm8962_probe,
+ .remove = wm8962_remove,
+ .resume = wm8962_resume,
+ .set_bias_level = wm8962_set_bias_level,
+ .reg_cache_size = WM8962_MAX_REGISTER,
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8962_reg,
+ .volatile_register = wm8962_volatile_register,
+ .readable_register = wm8962_readable_register,
+};
+
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static __devinit int wm8962_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
+{
+ struct wm8962_priv *wm8962;
+ int ret;
+
+ wm8962 = kzalloc(sizeof(struct wm8962_priv), GFP_KERNEL);
+ if (wm8962 == NULL)
+ return -ENOMEM;
+
+ i2c_set_clientdata(i2c, wm8962);
+
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8962, &wm8962_dai, 1);
+ if (ret < 0)
+ kfree(wm8962);
+
+ return ret;
+}
+
+static __devexit int wm8962_i2c_remove(struct i2c_client *client)
+{
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
+ return 0;
+}
+
+static const struct i2c_device_id wm8962_i2c_id[] = {
+ { "wm8962", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, wm8962_i2c_id);
+
+static struct i2c_driver wm8962_i2c_driver = {
+ .driver = {
+ .name = "WM8962",
+ .owner = THIS_MODULE,
+ },
+ .probe = wm8962_i2c_probe,
+ .remove = __devexit_p(wm8962_i2c_remove),
+ .id_table = wm8962_i2c_id,
+};
+#endif
+
+static int __init wm8962_modinit(void)
+{
+ int ret;
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+ ret = i2c_add_driver(&wm8962_i2c_driver);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register WM8962 I2C driver: %d\n",
+ ret);
+ }
+#endif
+ return 0;
+}
+module_init(wm8962_modinit);
+
+static void __exit wm8962_exit(void)
+{
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+ i2c_del_driver(&wm8962_i2c_driver);
+#endif
+}
+module_exit(wm8962_exit);
+
+MODULE_DESCRIPTION("ASoC WM8962 driver");
+MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
+MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/wm8962.h b/sound/soc/codecs/wm8962.h
new file mode 100644
index 000000000000..6145399acb16
--- /dev/null
+++ b/sound/soc/codecs/wm8962.h
@@ -0,0 +1,3787 @@
+/*
+ * wm8962.h -- WM8962 ASoC driver
+ *
+ * Copyright 2010 Wolfson Microelectronics, plc
+ *
+ * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef _WM8962_H
+#define _WM8962_H
+
+#include <asm/types.h>
+
+#define WM8962_SYSCLK_MCLK 1
+#define WM8962_SYSCLK_FLL 2
+#define WM8962_SYSCLK_PLL3 3
+
+#define WM8962_FLL 1
+
+#define WM8962_FLL_MCLK 1
+#define WM8962_FLL_BCLK 2
+#define WM8962_FLL_OSC 3
+#define WM8962_FLL_INT 4
+
+/*
+ * Register values.
+ */
+#define WM8962_LEFT_INPUT_VOLUME 0x00
+#define WM8962_RIGHT_INPUT_VOLUME 0x01
+#define WM8962_HPOUTL_VOLUME 0x02
+#define WM8962_HPOUTR_VOLUME 0x03
+#define WM8962_CLOCKING1 0x04
+#define WM8962_ADC_DAC_CONTROL_1 0x05
+#define WM8962_ADC_DAC_CONTROL_2 0x06
+#define WM8962_AUDIO_INTERFACE_0 0x07
+#define WM8962_CLOCKING2 0x08
+#define WM8962_AUDIO_INTERFACE_1 0x09
+#define WM8962_LEFT_DAC_VOLUME 0x0A
+#define WM8962_RIGHT_DAC_VOLUME 0x0B
+#define WM8962_AUDIO_INTERFACE_2 0x0E
+#define WM8962_SOFTWARE_RESET 0x0F
+#define WM8962_ALC1 0x11
+#define WM8962_ALC2 0x12
+#define WM8962_ALC3 0x13
+#define WM8962_NOISE_GATE 0x14
+#define WM8962_LEFT_ADC_VOLUME 0x15
+#define WM8962_RIGHT_ADC_VOLUME 0x16
+#define WM8962_ADDITIONAL_CONTROL_1 0x17
+#define WM8962_ADDITIONAL_CONTROL_2 0x18
+#define WM8962_PWR_MGMT_1 0x19
+#define WM8962_PWR_MGMT_2 0x1A
+#define WM8962_ADDITIONAL_CONTROL_3 0x1B
+#define WM8962_ANTI_POP 0x1C
+#define WM8962_CLOCKING_3 0x1E
+#define WM8962_INPUT_MIXER_CONTROL_1 0x1F
+#define WM8962_LEFT_INPUT_MIXER_VOLUME 0x20
+#define WM8962_RIGHT_INPUT_MIXER_VOLUME 0x21
+#define WM8962_INPUT_MIXER_CONTROL_2 0x22
+#define WM8962_INPUT_BIAS_CONTROL 0x23
+#define WM8962_LEFT_INPUT_PGA_CONTROL 0x25
+#define WM8962_RIGHT_INPUT_PGA_CONTROL 0x26
+#define WM8962_SPKOUTL_VOLUME 0x28
+#define WM8962_SPKOUTR_VOLUME 0x29
+#define WM8962_THERMAL_SHUTDOWN_STATUS 0x2F
+#define WM8962_ADDITIONAL_CONTROL_4 0x30
+#define WM8962_CLASS_D_CONTROL_1 0x31
+#define WM8962_CLASS_D_CONTROL_2 0x33
+#define WM8962_CLOCKING_4 0x38
+#define WM8962_DAC_DSP_MIXING_1 0x39
+#define WM8962_DAC_DSP_MIXING_2 0x3A
+#define WM8962_DC_SERVO_0 0x3C
+#define WM8962_DC_SERVO_1 0x3D
+#define WM8962_DC_SERVO_4 0x40
+#define WM8962_DC_SERVO_6 0x42
+#define WM8962_ANALOGUE_PGA_BIAS 0x44
+#define WM8962_ANALOGUE_HP_0 0x45
+#define WM8962_ANALOGUE_HP_2 0x47
+#define WM8962_CHARGE_PUMP_1 0x48
+#define WM8962_CHARGE_PUMP_B 0x52
+#define WM8962_WRITE_SEQUENCER_CONTROL_1 0x57
+#define WM8962_WRITE_SEQUENCER_CONTROL_2 0x5A
+#define WM8962_WRITE_SEQUENCER_CONTROL_3 0x5D
+#define WM8962_CONTROL_INTERFACE 0x5E
+#define WM8962_MIXER_ENABLES 0x63
+#define WM8962_HEADPHONE_MIXER_1 0x64
+#define WM8962_HEADPHONE_MIXER_2 0x65
+#define WM8962_HEADPHONE_MIXER_3 0x66
+#define WM8962_HEADPHONE_MIXER_4 0x67
+#define WM8962_SPEAKER_MIXER_1 0x69
+#define WM8962_SPEAKER_MIXER_2 0x6A
+#define WM8962_SPEAKER_MIXER_3 0x6B
+#define WM8962_SPEAKER_MIXER_4 0x6C
+#define WM8962_SPEAKER_MIXER_5 0x6D
+#define WM8962_BEEP_GENERATOR_1 0x6E
+#define WM8962_OSCILLATOR_TRIM_3 0x73
+#define WM8962_OSCILLATOR_TRIM_4 0x74
+#define WM8962_OSCILLATOR_TRIM_7 0x77
+#define WM8962_ANALOGUE_CLOCKING1 0x7C
+#define WM8962_ANALOGUE_CLOCKING2 0x7D
+#define WM8962_ANALOGUE_CLOCKING3 0x7E
+#define WM8962_PLL_SOFTWARE_RESET 0x7F
+#define WM8962_PLL2 0x81
+#define WM8962_PLL_4 0x83
+#define WM8962_PLL_9 0x88
+#define WM8962_PLL_10 0x89
+#define WM8962_PLL_11 0x8A
+#define WM8962_PLL_12 0x8B
+#define WM8962_PLL_13 0x8C
+#define WM8962_PLL_14 0x8D
+#define WM8962_PLL_15 0x8E
+#define WM8962_PLL_16 0x8F
+#define WM8962_FLL_CONTROL_1 0x9B
+#define WM8962_FLL_CONTROL_2 0x9C
+#define WM8962_FLL_CONTROL_3 0x9D
+#define WM8962_FLL_CONTROL_5 0x9F
+#define WM8962_FLL_CONTROL_6 0xA0
+#define WM8962_FLL_CONTROL_7 0xA1
+#define WM8962_FLL_CONTROL_8 0xA2
+#define WM8962_GENERAL_TEST_1 0xFC
+#define WM8962_DF1 0x100
+#define WM8962_DF2 0x101
+#define WM8962_DF3 0x102
+#define WM8962_DF4 0x103
+#define WM8962_DF5 0x104
+#define WM8962_DF6 0x105
+#define WM8962_DF7 0x106
+#define WM8962_LHPF1 0x108
+#define WM8962_LHPF2 0x109
+#define WM8962_THREED1 0x10C
+#define WM8962_THREED2 0x10D
+#define WM8962_THREED3 0x10E
+#define WM8962_THREED4 0x10F
+#define WM8962_DRC_1 0x114
+#define WM8962_DRC_2 0x115
+#define WM8962_DRC_3 0x116
+#define WM8962_DRC_4 0x117
+#define WM8962_DRC_5 0x118
+#define WM8962_TLOOPBACK 0x11D
+#define WM8962_EQ1 0x14F
+#define WM8962_EQ2 0x150
+#define WM8962_EQ3 0x151
+#define WM8962_EQ4 0x152
+#define WM8962_EQ5 0x153
+#define WM8962_EQ6 0x154
+#define WM8962_EQ7 0x155
+#define WM8962_EQ8 0x156
+#define WM8962_EQ9 0x157
+#define WM8962_EQ10 0x158
+#define WM8962_EQ11 0x159
+#define WM8962_EQ12 0x15A
+#define WM8962_EQ13 0x15B
+#define WM8962_EQ14 0x15C
+#define WM8962_EQ15 0x15D
+#define WM8962_EQ16 0x15E
+#define WM8962_EQ17 0x15F
+#define WM8962_EQ18 0x160
+#define WM8962_EQ19 0x161
+#define WM8962_EQ20 0x162
+#define WM8962_EQ21 0x163
+#define WM8962_EQ22 0x164
+#define WM8962_EQ23 0x165
+#define WM8962_EQ24 0x166
+#define WM8962_EQ25 0x167
+#define WM8962_EQ26 0x168
+#define WM8962_EQ27 0x169
+#define WM8962_EQ28 0x16A
+#define WM8962_EQ29 0x16B
+#define WM8962_EQ30 0x16C
+#define WM8962_EQ31 0x16D
+#define WM8962_EQ32 0x16E
+#define WM8962_EQ33 0x16F
+#define WM8962_EQ34 0x170
+#define WM8962_EQ35 0x171
+#define WM8962_EQ36 0x172
+#define WM8962_EQ37 0x173
+#define WM8962_EQ38 0x174
+#define WM8962_EQ39 0x175
+#define WM8962_EQ40 0x176
+#define WM8962_EQ41 0x177
+#define WM8962_GPIO_2 0x201
+#define WM8962_GPIO_3 0x202
+#define WM8962_GPIO_5 0x204
+#define WM8962_GPIO_6 0x205
+#define WM8962_INTERRUPT_STATUS_1 0x230
+#define WM8962_INTERRUPT_STATUS_2 0x231
+#define WM8962_INTERRUPT_STATUS_1_MASK 0x238
+#define WM8962_INTERRUPT_STATUS_2_MASK 0x239
+#define WM8962_INTERRUPT_CONTROL 0x240
+#define WM8962_IRQ_DEBOUNCE 0x248
+#define WM8962_MICINT_SOURCE_POL 0x24A
+#define WM8962_DSP2_POWER_MANAGEMENT 0x300
+#define WM8962_DSP2_EXECCONTROL 0x40D
+#define WM8962_WRITE_SEQUENCER_0 0x1000
+#define WM8962_WRITE_SEQUENCER_1 0x1001
+#define WM8962_WRITE_SEQUENCER_2 0x1002
+#define WM8962_WRITE_SEQUENCER_3 0x1003
+#define WM8962_WRITE_SEQUENCER_4 0x1004
+#define WM8962_WRITE_SEQUENCER_5 0x1005
+#define WM8962_WRITE_SEQUENCER_6 0x1006
+#define WM8962_WRITE_SEQUENCER_7 0x1007
+#define WM8962_WRITE_SEQUENCER_8 0x1008
+#define WM8962_WRITE_SEQUENCER_9 0x1009
+#define WM8962_WRITE_SEQUENCER_10 0x100A
+#define WM8962_WRITE_SEQUENCER_11 0x100B
+#define WM8962_WRITE_SEQUENCER_12 0x100C
+#define WM8962_WRITE_SEQUENCER_13 0x100D
+#define WM8962_WRITE_SEQUENCER_14 0x100E
+#define WM8962_WRITE_SEQUENCER_15 0x100F
+#define WM8962_WRITE_SEQUENCER_16 0x1010
+#define WM8962_WRITE_SEQUENCER_17 0x1011
+#define WM8962_WRITE_SEQUENCER_18 0x1012
+#define WM8962_WRITE_SEQUENCER_19 0x1013
+#define WM8962_WRITE_SEQUENCER_20 0x1014
+#define WM8962_WRITE_SEQUENCER_21 0x1015
+#define WM8962_WRITE_SEQUENCER_22 0x1016
+#define WM8962_WRITE_SEQUENCER_23 0x1017
+#define WM8962_WRITE_SEQUENCER_24 0x1018
+#define WM8962_WRITE_SEQUENCER_25 0x1019
+#define WM8962_WRITE_SEQUENCER_26 0x101A
+#define WM8962_WRITE_SEQUENCER_27 0x101B
+#define WM8962_WRITE_SEQUENCER_28 0x101C
+#define WM8962_WRITE_SEQUENCER_29 0x101D
+#define WM8962_WRITE_SEQUENCER_30 0x101E
+#define WM8962_WRITE_SEQUENCER_31 0x101F
+#define WM8962_WRITE_SEQUENCER_32 0x1020
+#define WM8962_WRITE_SEQUENCER_33 0x1021
+#define WM8962_WRITE_SEQUENCER_34 0x1022
+#define WM8962_WRITE_SEQUENCER_35 0x1023
+#define WM8962_WRITE_SEQUENCER_36 0x1024
+#define WM8962_WRITE_SEQUENCER_37 0x1025
+#define WM8962_WRITE_SEQUENCER_38 0x1026
+#define WM8962_WRITE_SEQUENCER_39 0x1027
+#define WM8962_WRITE_SEQUENCER_40 0x1028
+#define WM8962_WRITE_SEQUENCER_41 0x1029
+#define WM8962_WRITE_SEQUENCER_42 0x102A
+#define WM8962_WRITE_SEQUENCER_43 0x102B
+#define WM8962_WRITE_SEQUENCER_44 0x102C
+#define WM8962_WRITE_SEQUENCER_45 0x102D
+#define WM8962_WRITE_SEQUENCER_46 0x102E
+#define WM8962_WRITE_SEQUENCER_47 0x102F
+#define WM8962_WRITE_SEQUENCER_48 0x1030
+#define WM8962_WRITE_SEQUENCER_49 0x1031
+#define WM8962_WRITE_SEQUENCER_50 0x1032
+#define WM8962_WRITE_SEQUENCER_51 0x1033
+#define WM8962_WRITE_SEQUENCER_52 0x1034
+#define WM8962_WRITE_SEQUENCER_53 0x1035
+#define WM8962_WRITE_SEQUENCER_54 0x1036
+#define WM8962_WRITE_SEQUENCER_55 0x1037
+#define WM8962_WRITE_SEQUENCER_56 0x1038
+#define WM8962_WRITE_SEQUENCER_57 0x1039
+#define WM8962_WRITE_SEQUENCER_58 0x103A
+#define WM8962_WRITE_SEQUENCER_59 0x103B
+#define WM8962_WRITE_SEQUENCER_60 0x103C
+#define WM8962_WRITE_SEQUENCER_61 0x103D
+#define WM8962_WRITE_SEQUENCER_62 0x103E
+#define WM8962_WRITE_SEQUENCER_63 0x103F
+#define WM8962_WRITE_SEQUENCER_64 0x1040
+#define WM8962_WRITE_SEQUENCER_65 0x1041
+#define WM8962_WRITE_SEQUENCER_66 0x1042
+#define WM8962_WRITE_SEQUENCER_67 0x1043
+#define WM8962_WRITE_SEQUENCER_68 0x1044
+#define WM8962_WRITE_SEQUENCER_69 0x1045
+#define WM8962_WRITE_SEQUENCER_70 0x1046
+#define WM8962_WRITE_SEQUENCER_71 0x1047
+#define WM8962_WRITE_SEQUENCER_72 0x1048
+#define WM8962_WRITE_SEQUENCER_73 0x1049
+#define WM8962_WRITE_SEQUENCER_74 0x104A
+#define WM8962_WRITE_SEQUENCER_75 0x104B
+#define WM8962_WRITE_SEQUENCER_76 0x104C
+#define WM8962_WRITE_SEQUENCER_77 0x104D
+#define WM8962_WRITE_SEQUENCER_78 0x104E
+#define WM8962_WRITE_SEQUENCER_79 0x104F
+#define WM8962_WRITE_SEQUENCER_80 0x1050
+#define WM8962_WRITE_SEQUENCER_81 0x1051
+#define WM8962_WRITE_SEQUENCER_82 0x1052
+#define WM8962_WRITE_SEQUENCER_83 0x1053
+#define WM8962_WRITE_SEQUENCER_84 0x1054
+#define WM8962_WRITE_SEQUENCER_85 0x1055
+#define WM8962_WRITE_SEQUENCER_86 0x1056
+#define WM8962_WRITE_SEQUENCER_87 0x1057
+#define WM8962_WRITE_SEQUENCER_88 0x1058
+#define WM8962_WRITE_SEQUENCER_89 0x1059
+#define WM8962_WRITE_SEQUENCER_90 0x105A
+#define WM8962_WRITE_SEQUENCER_91 0x105B
+#define WM8962_WRITE_SEQUENCER_92 0x105C
+#define WM8962_WRITE_SEQUENCER_93 0x105D
+#define WM8962_WRITE_SEQUENCER_94 0x105E
+#define WM8962_WRITE_SEQUENCER_95 0x105F
+#define WM8962_WRITE_SEQUENCER_96 0x1060
+#define WM8962_WRITE_SEQUENCER_97 0x1061
+#define WM8962_WRITE_SEQUENCER_98 0x1062
+#define WM8962_WRITE_SEQUENCER_99 0x1063
+#define WM8962_WRITE_SEQUENCER_100 0x1064
+#define WM8962_WRITE_SEQUENCER_101 0x1065
+#define WM8962_WRITE_SEQUENCER_102 0x1066
+#define WM8962_WRITE_SEQUENCER_103 0x1067
+#define WM8962_WRITE_SEQUENCER_104 0x1068
+#define WM8962_WRITE_SEQUENCER_105 0x1069
+#define WM8962_WRITE_SEQUENCER_106 0x106A
+#define WM8962_WRITE_SEQUENCER_107 0x106B
+#define WM8962_WRITE_SEQUENCER_108 0x106C
+#define WM8962_WRITE_SEQUENCER_109 0x106D
+#define WM8962_WRITE_SEQUENCER_110 0x106E
+#define WM8962_WRITE_SEQUENCER_111 0x106F
+#define WM8962_WRITE_SEQUENCER_112 0x1070
+#define WM8962_WRITE_SEQUENCER_113 0x1071
+#define WM8962_WRITE_SEQUENCER_114 0x1072
+#define WM8962_WRITE_SEQUENCER_115 0x1073
+#define WM8962_WRITE_SEQUENCER_116 0x1074
+#define WM8962_WRITE_SEQUENCER_117 0x1075
+#define WM8962_WRITE_SEQUENCER_118 0x1076
+#define WM8962_WRITE_SEQUENCER_119 0x1077
+#define WM8962_WRITE_SEQUENCER_120 0x1078
+#define WM8962_WRITE_SEQUENCER_121 0x1079
+#define WM8962_WRITE_SEQUENCER_122 0x107A
+#define WM8962_WRITE_SEQUENCER_123 0x107B
+#define WM8962_WRITE_SEQUENCER_124 0x107C
+#define WM8962_WRITE_SEQUENCER_125 0x107D
+#define WM8962_WRITE_SEQUENCER_126 0x107E
+#define WM8962_WRITE_SEQUENCER_127 0x107F
+#define WM8962_WRITE_SEQUENCER_128 0x1080
+#define WM8962_WRITE_SEQUENCER_129 0x1081
+#define WM8962_WRITE_SEQUENCER_130 0x1082
+#define WM8962_WRITE_SEQUENCER_131 0x1083
+#define WM8962_WRITE_SEQUENCER_132 0x1084
+#define WM8962_WRITE_SEQUENCER_133 0x1085
+#define WM8962_WRITE_SEQUENCER_134 0x1086
+#define WM8962_WRITE_SEQUENCER_135 0x1087
+#define WM8962_WRITE_SEQUENCER_136 0x1088
+#define WM8962_WRITE_SEQUENCER_137 0x1089
+#define WM8962_WRITE_SEQUENCER_138 0x108A
+#define WM8962_WRITE_SEQUENCER_139 0x108B
+#define WM8962_WRITE_SEQUENCER_140 0x108C
+#define WM8962_WRITE_SEQUENCER_141 0x108D
+#define WM8962_WRITE_SEQUENCER_142 0x108E
+#define WM8962_WRITE_SEQUENCER_143 0x108F
+#define WM8962_WRITE_SEQUENCER_144 0x1090
+#define WM8962_WRITE_SEQUENCER_145 0x1091
+#define WM8962_WRITE_SEQUENCER_146 0x1092
+#define WM8962_WRITE_SEQUENCER_147 0x1093
+#define WM8962_WRITE_SEQUENCER_148 0x1094
+#define WM8962_WRITE_SEQUENCER_149 0x1095
+#define WM8962_WRITE_SEQUENCER_150 0x1096
+#define WM8962_WRITE_SEQUENCER_151 0x1097
+#define WM8962_WRITE_SEQUENCER_152 0x1098
+#define WM8962_WRITE_SEQUENCER_153 0x1099
+#define WM8962_WRITE_SEQUENCER_154 0x109A
+#define WM8962_WRITE_SEQUENCER_155 0x109B
+#define WM8962_WRITE_SEQUENCER_156 0x109C
+#define WM8962_WRITE_SEQUENCER_157 0x109D
+#define WM8962_WRITE_SEQUENCER_158 0x109E
+#define WM8962_WRITE_SEQUENCER_159 0x109F
+#define WM8962_WRITE_SEQUENCER_160 0x10A0
+#define WM8962_WRITE_SEQUENCER_161 0x10A1
+#define WM8962_WRITE_SEQUENCER_162 0x10A2
+#define WM8962_WRITE_SEQUENCER_163 0x10A3
+#define WM8962_WRITE_SEQUENCER_164 0x10A4
+#define WM8962_WRITE_SEQUENCER_165 0x10A5
+#define WM8962_WRITE_SEQUENCER_166 0x10A6
+#define WM8962_WRITE_SEQUENCER_167 0x10A7
+#define WM8962_WRITE_SEQUENCER_168 0x10A8
+#define WM8962_WRITE_SEQUENCER_169 0x10A9
+#define WM8962_WRITE_SEQUENCER_170 0x10AA
+#define WM8962_WRITE_SEQUENCER_171 0x10AB
+#define WM8962_WRITE_SEQUENCER_172 0x10AC
+#define WM8962_WRITE_SEQUENCER_173 0x10AD
+#define WM8962_WRITE_SEQUENCER_174 0x10AE
+#define WM8962_WRITE_SEQUENCER_175 0x10AF
+#define WM8962_WRITE_SEQUENCER_176 0x10B0
+#define WM8962_WRITE_SEQUENCER_177 0x10B1
+#define WM8962_WRITE_SEQUENCER_178 0x10B2
+#define WM8962_WRITE_SEQUENCER_179 0x10B3
+#define WM8962_WRITE_SEQUENCER_180 0x10B4
+#define WM8962_WRITE_SEQUENCER_181 0x10B5
+#define WM8962_WRITE_SEQUENCER_182 0x10B6
+#define WM8962_WRITE_SEQUENCER_183 0x10B7
+#define WM8962_WRITE_SEQUENCER_184 0x10B8
+#define WM8962_WRITE_SEQUENCER_185 0x10B9
+#define WM8962_WRITE_SEQUENCER_186 0x10BA
+#define WM8962_WRITE_SEQUENCER_187 0x10BB
+#define WM8962_WRITE_SEQUENCER_188 0x10BC
+#define WM8962_WRITE_SEQUENCER_189 0x10BD
+#define WM8962_WRITE_SEQUENCER_190 0x10BE
+#define WM8962_WRITE_SEQUENCER_191 0x10BF
+#define WM8962_WRITE_SEQUENCER_192 0x10C0
+#define WM8962_WRITE_SEQUENCER_193 0x10C1
+#define WM8962_WRITE_SEQUENCER_194 0x10C2
+#define WM8962_WRITE_SEQUENCER_195 0x10C3
+#define WM8962_WRITE_SEQUENCER_196 0x10C4
+#define WM8962_WRITE_SEQUENCER_197 0x10C5
+#define WM8962_WRITE_SEQUENCER_198 0x10C6
+#define WM8962_WRITE_SEQUENCER_199 0x10C7
+#define WM8962_WRITE_SEQUENCER_200 0x10C8
+#define WM8962_WRITE_SEQUENCER_201 0x10C9
+#define WM8962_WRITE_SEQUENCER_202 0x10CA
+#define WM8962_WRITE_SEQUENCER_203 0x10CB
+#define WM8962_WRITE_SEQUENCER_204 0x10CC
+#define WM8962_WRITE_SEQUENCER_205 0x10CD
+#define WM8962_WRITE_SEQUENCER_206 0x10CE
+#define WM8962_WRITE_SEQUENCER_207 0x10CF
+#define WM8962_WRITE_SEQUENCER_208 0x10D0
+#define WM8962_WRITE_SEQUENCER_209 0x10D1
+#define WM8962_WRITE_SEQUENCER_210 0x10D2
+#define WM8962_WRITE_SEQUENCER_211 0x10D3
+#define WM8962_WRITE_SEQUENCER_212 0x10D4
+#define WM8962_WRITE_SEQUENCER_213 0x10D5
+#define WM8962_WRITE_SEQUENCER_214 0x10D6
+#define WM8962_WRITE_SEQUENCER_215 0x10D7
+#define WM8962_WRITE_SEQUENCER_216 0x10D8
+#define WM8962_WRITE_SEQUENCER_217 0x10D9
+#define WM8962_WRITE_SEQUENCER_218 0x10DA
+#define WM8962_WRITE_SEQUENCER_219 0x10DB
+#define WM8962_WRITE_SEQUENCER_220 0x10DC
+#define WM8962_WRITE_SEQUENCER_221 0x10DD
+#define WM8962_WRITE_SEQUENCER_222 0x10DE
+#define WM8962_WRITE_SEQUENCER_223 0x10DF
+#define WM8962_WRITE_SEQUENCER_224 0x10E0
+#define WM8962_WRITE_SEQUENCER_225 0x10E1
+#define WM8962_WRITE_SEQUENCER_226 0x10E2
+#define WM8962_WRITE_SEQUENCER_227 0x10E3
+#define WM8962_WRITE_SEQUENCER_228 0x10E4
+#define WM8962_WRITE_SEQUENCER_229 0x10E5
+#define WM8962_WRITE_SEQUENCER_230 0x10E6
+#define WM8962_WRITE_SEQUENCER_231 0x10E7
+#define WM8962_WRITE_SEQUENCER_232 0x10E8
+#define WM8962_WRITE_SEQUENCER_233 0x10E9
+#define WM8962_WRITE_SEQUENCER_234 0x10EA
+#define WM8962_WRITE_SEQUENCER_235 0x10EB
+#define WM8962_WRITE_SEQUENCER_236 0x10EC
+#define WM8962_WRITE_SEQUENCER_237 0x10ED
+#define WM8962_WRITE_SEQUENCER_238 0x10EE
+#define WM8962_WRITE_SEQUENCER_239 0x10EF
+#define WM8962_WRITE_SEQUENCER_240 0x10F0
+#define WM8962_WRITE_SEQUENCER_241 0x10F1
+#define WM8962_WRITE_SEQUENCER_242 0x10F2
+#define WM8962_WRITE_SEQUENCER_243 0x10F3
+#define WM8962_WRITE_SEQUENCER_244 0x10F4
+#define WM8962_WRITE_SEQUENCER_245 0x10F5
+#define WM8962_WRITE_SEQUENCER_246 0x10F6
+#define WM8962_WRITE_SEQUENCER_247 0x10F7
+#define WM8962_WRITE_SEQUENCER_248 0x10F8
+#define WM8962_WRITE_SEQUENCER_249 0x10F9
+#define WM8962_WRITE_SEQUENCER_250 0x10FA
+#define WM8962_WRITE_SEQUENCER_251 0x10FB
+#define WM8962_WRITE_SEQUENCER_252 0x10FC
+#define WM8962_WRITE_SEQUENCER_253 0x10FD
+#define WM8962_WRITE_SEQUENCER_254 0x10FE
+#define WM8962_WRITE_SEQUENCER_255 0x10FF
+#define WM8962_WRITE_SEQUENCER_256 0x1100
+#define WM8962_WRITE_SEQUENCER_257 0x1101
+#define WM8962_WRITE_SEQUENCER_258 0x1102
+#define WM8962_WRITE_SEQUENCER_259 0x1103
+#define WM8962_WRITE_SEQUENCER_260 0x1104
+#define WM8962_WRITE_SEQUENCER_261 0x1105
+#define WM8962_WRITE_SEQUENCER_262 0x1106
+#define WM8962_WRITE_SEQUENCER_263 0x1107
+#define WM8962_WRITE_SEQUENCER_264 0x1108
+#define WM8962_WRITE_SEQUENCER_265 0x1109
+#define WM8962_WRITE_SEQUENCER_266 0x110A
+#define WM8962_WRITE_SEQUENCER_267 0x110B
+#define WM8962_WRITE_SEQUENCER_268 0x110C
+#define WM8962_WRITE_SEQUENCER_269 0x110D
+#define WM8962_WRITE_SEQUENCER_270 0x110E
+#define WM8962_WRITE_SEQUENCER_271 0x110F
+#define WM8962_WRITE_SEQUENCER_272 0x1110
+#define WM8962_WRITE_SEQUENCER_273 0x1111
+#define WM8962_WRITE_SEQUENCER_274 0x1112
+#define WM8962_WRITE_SEQUENCER_275 0x1113
+#define WM8962_WRITE_SEQUENCER_276 0x1114
+#define WM8962_WRITE_SEQUENCER_277 0x1115
+#define WM8962_WRITE_SEQUENCER_278 0x1116
+#define WM8962_WRITE_SEQUENCER_279 0x1117
+#define WM8962_WRITE_SEQUENCER_280 0x1118
+#define WM8962_WRITE_SEQUENCER_281 0x1119
+#define WM8962_WRITE_SEQUENCER_282 0x111A
+#define WM8962_WRITE_SEQUENCER_283 0x111B
+#define WM8962_WRITE_SEQUENCER_284 0x111C
+#define WM8962_WRITE_SEQUENCER_285 0x111D
+#define WM8962_WRITE_SEQUENCER_286 0x111E
+#define WM8962_WRITE_SEQUENCER_287 0x111F
+#define WM8962_WRITE_SEQUENCER_288 0x1120
+#define WM8962_WRITE_SEQUENCER_289 0x1121
+#define WM8962_WRITE_SEQUENCER_290 0x1122
+#define WM8962_WRITE_SEQUENCER_291 0x1123
+#define WM8962_WRITE_SEQUENCER_292 0x1124
+#define WM8962_WRITE_SEQUENCER_293 0x1125
+#define WM8962_WRITE_SEQUENCER_294 0x1126
+#define WM8962_WRITE_SEQUENCER_295 0x1127
+#define WM8962_WRITE_SEQUENCER_296 0x1128
+#define WM8962_WRITE_SEQUENCER_297 0x1129
+#define WM8962_WRITE_SEQUENCER_298 0x112A
+#define WM8962_WRITE_SEQUENCER_299 0x112B
+#define WM8962_WRITE_SEQUENCER_300 0x112C
+#define WM8962_WRITE_SEQUENCER_301 0x112D
+#define WM8962_WRITE_SEQUENCER_302 0x112E
+#define WM8962_WRITE_SEQUENCER_303 0x112F
+#define WM8962_WRITE_SEQUENCER_304 0x1130
+#define WM8962_WRITE_SEQUENCER_305 0x1131
+#define WM8962_WRITE_SEQUENCER_306 0x1132
+#define WM8962_WRITE_SEQUENCER_307 0x1133
+#define WM8962_WRITE_SEQUENCER_308 0x1134
+#define WM8962_WRITE_SEQUENCER_309 0x1135
+#define WM8962_WRITE_SEQUENCER_310 0x1136
+#define WM8962_WRITE_SEQUENCER_311 0x1137
+#define WM8962_WRITE_SEQUENCER_312 0x1138
+#define WM8962_WRITE_SEQUENCER_313 0x1139
+#define WM8962_WRITE_SEQUENCER_314 0x113A
+#define WM8962_WRITE_SEQUENCER_315 0x113B
+#define WM8962_WRITE_SEQUENCER_316 0x113C
+#define WM8962_WRITE_SEQUENCER_317 0x113D
+#define WM8962_WRITE_SEQUENCER_318 0x113E
+#define WM8962_WRITE_SEQUENCER_319 0x113F
+#define WM8962_WRITE_SEQUENCER_320 0x1140
+#define WM8962_WRITE_SEQUENCER_321 0x1141
+#define WM8962_WRITE_SEQUENCER_322 0x1142
+#define WM8962_WRITE_SEQUENCER_323 0x1143
+#define WM8962_WRITE_SEQUENCER_324 0x1144
+#define WM8962_WRITE_SEQUENCER_325 0x1145
+#define WM8962_WRITE_SEQUENCER_326 0x1146
+#define WM8962_WRITE_SEQUENCER_327 0x1147
+#define WM8962_WRITE_SEQUENCER_328 0x1148
+#define WM8962_WRITE_SEQUENCER_329 0x1149
+#define WM8962_WRITE_SEQUENCER_330 0x114A
+#define WM8962_WRITE_SEQUENCER_331 0x114B
+#define WM8962_WRITE_SEQUENCER_332 0x114C
+#define WM8962_WRITE_SEQUENCER_333 0x114D
+#define WM8962_WRITE_SEQUENCER_334 0x114E
+#define WM8962_WRITE_SEQUENCER_335 0x114F
+#define WM8962_WRITE_SEQUENCER_336 0x1150
+#define WM8962_WRITE_SEQUENCER_337 0x1151
+#define WM8962_WRITE_SEQUENCER_338 0x1152
+#define WM8962_WRITE_SEQUENCER_339 0x1153
+#define WM8962_WRITE_SEQUENCER_340 0x1154
+#define WM8962_WRITE_SEQUENCER_341 0x1155
+#define WM8962_WRITE_SEQUENCER_342 0x1156
+#define WM8962_WRITE_SEQUENCER_343 0x1157
+#define WM8962_WRITE_SEQUENCER_344 0x1158
+#define WM8962_WRITE_SEQUENCER_345 0x1159
+#define WM8962_WRITE_SEQUENCER_346 0x115A
+#define WM8962_WRITE_SEQUENCER_347 0x115B
+#define WM8962_WRITE_SEQUENCER_348 0x115C
+#define WM8962_WRITE_SEQUENCER_349 0x115D
+#define WM8962_WRITE_SEQUENCER_350 0x115E
+#define WM8962_WRITE_SEQUENCER_351 0x115F
+#define WM8962_WRITE_SEQUENCER_352 0x1160
+#define WM8962_WRITE_SEQUENCER_353 0x1161
+#define WM8962_WRITE_SEQUENCER_354 0x1162
+#define WM8962_WRITE_SEQUENCER_355 0x1163
+#define WM8962_WRITE_SEQUENCER_356 0x1164
+#define WM8962_WRITE_SEQUENCER_357 0x1165
+#define WM8962_WRITE_SEQUENCER_358 0x1166
+#define WM8962_WRITE_SEQUENCER_359 0x1167
+#define WM8962_WRITE_SEQUENCER_360 0x1168
+#define WM8962_WRITE_SEQUENCER_361 0x1169
+#define WM8962_WRITE_SEQUENCER_362 0x116A
+#define WM8962_WRITE_SEQUENCER_363 0x116B
+#define WM8962_WRITE_SEQUENCER_364 0x116C
+#define WM8962_WRITE_SEQUENCER_365 0x116D
+#define WM8962_WRITE_SEQUENCER_366 0x116E
+#define WM8962_WRITE_SEQUENCER_367 0x116F
+#define WM8962_WRITE_SEQUENCER_368 0x1170
+#define WM8962_WRITE_SEQUENCER_369 0x1171
+#define WM8962_WRITE_SEQUENCER_370 0x1172
+#define WM8962_WRITE_SEQUENCER_371 0x1173
+#define WM8962_WRITE_SEQUENCER_372 0x1174
+#define WM8962_WRITE_SEQUENCER_373 0x1175
+#define WM8962_WRITE_SEQUENCER_374 0x1176
+#define WM8962_WRITE_SEQUENCER_375 0x1177
+#define WM8962_WRITE_SEQUENCER_376 0x1178
+#define WM8962_WRITE_SEQUENCER_377 0x1179
+#define WM8962_WRITE_SEQUENCER_378 0x117A
+#define WM8962_WRITE_SEQUENCER_379 0x117B
+#define WM8962_WRITE_SEQUENCER_380 0x117C
+#define WM8962_WRITE_SEQUENCER_381 0x117D
+#define WM8962_WRITE_SEQUENCER_382 0x117E
+#define WM8962_WRITE_SEQUENCER_383 0x117F
+#define WM8962_WRITE_SEQUENCER_384 0x1180
+#define WM8962_WRITE_SEQUENCER_385 0x1181
+#define WM8962_WRITE_SEQUENCER_386 0x1182
+#define WM8962_WRITE_SEQUENCER_387 0x1183
+#define WM8962_WRITE_SEQUENCER_388 0x1184
+#define WM8962_WRITE_SEQUENCER_389 0x1185
+#define WM8962_WRITE_SEQUENCER_390 0x1186
+#define WM8962_WRITE_SEQUENCER_391 0x1187
+#define WM8962_WRITE_SEQUENCER_392 0x1188
+#define WM8962_WRITE_SEQUENCER_393 0x1189
+#define WM8962_WRITE_SEQUENCER_394 0x118A
+#define WM8962_WRITE_SEQUENCER_395 0x118B
+#define WM8962_WRITE_SEQUENCER_396 0x118C
+#define WM8962_WRITE_SEQUENCER_397 0x118D
+#define WM8962_WRITE_SEQUENCER_398 0x118E
+#define WM8962_WRITE_SEQUENCER_399 0x118F
+#define WM8962_WRITE_SEQUENCER_400 0x1190
+#define WM8962_WRITE_SEQUENCER_401 0x1191
+#define WM8962_WRITE_SEQUENCER_402 0x1192
+#define WM8962_WRITE_SEQUENCER_403 0x1193
+#define WM8962_WRITE_SEQUENCER_404 0x1194
+#define WM8962_WRITE_SEQUENCER_405 0x1195
+#define WM8962_WRITE_SEQUENCER_406 0x1196
+#define WM8962_WRITE_SEQUENCER_407 0x1197
+#define WM8962_WRITE_SEQUENCER_408 0x1198
+#define WM8962_WRITE_SEQUENCER_409 0x1199
+#define WM8962_WRITE_SEQUENCER_410 0x119A
+#define WM8962_WRITE_SEQUENCER_411 0x119B
+#define WM8962_WRITE_SEQUENCER_412 0x119C
+#define WM8962_WRITE_SEQUENCER_413 0x119D
+#define WM8962_WRITE_SEQUENCER_414 0x119E
+#define WM8962_WRITE_SEQUENCER_415 0x119F
+#define WM8962_WRITE_SEQUENCER_416 0x11A0
+#define WM8962_WRITE_SEQUENCER_417 0x11A1
+#define WM8962_WRITE_SEQUENCER_418 0x11A2
+#define WM8962_WRITE_SEQUENCER_419 0x11A3
+#define WM8962_WRITE_SEQUENCER_420 0x11A4
+#define WM8962_WRITE_SEQUENCER_421 0x11A5
+#define WM8962_WRITE_SEQUENCER_422 0x11A6
+#define WM8962_WRITE_SEQUENCER_423 0x11A7
+#define WM8962_WRITE_SEQUENCER_424 0x11A8
+#define WM8962_WRITE_SEQUENCER_425 0x11A9
+#define WM8962_WRITE_SEQUENCER_426 0x11AA
+#define WM8962_WRITE_SEQUENCER_427 0x11AB
+#define WM8962_WRITE_SEQUENCER_428 0x11AC
+#define WM8962_WRITE_SEQUENCER_429 0x11AD
+#define WM8962_WRITE_SEQUENCER_430 0x11AE
+#define WM8962_WRITE_SEQUENCER_431 0x11AF
+#define WM8962_WRITE_SEQUENCER_432 0x11B0
+#define WM8962_WRITE_SEQUENCER_433 0x11B1
+#define WM8962_WRITE_SEQUENCER_434 0x11B2
+#define WM8962_WRITE_SEQUENCER_435 0x11B3
+#define WM8962_WRITE_SEQUENCER_436 0x11B4
+#define WM8962_WRITE_SEQUENCER_437 0x11B5
+#define WM8962_WRITE_SEQUENCER_438 0x11B6
+#define WM8962_WRITE_SEQUENCER_439 0x11B7
+#define WM8962_WRITE_SEQUENCER_440 0x11B8
+#define WM8962_WRITE_SEQUENCER_441 0x11B9
+#define WM8962_WRITE_SEQUENCER_442 0x11BA
+#define WM8962_WRITE_SEQUENCER_443 0x11BB
+#define WM8962_WRITE_SEQUENCER_444 0x11BC
+#define WM8962_WRITE_SEQUENCER_445 0x11BD
+#define WM8962_WRITE_SEQUENCER_446 0x11BE
+#define WM8962_WRITE_SEQUENCER_447 0x11BF
+#define WM8962_WRITE_SEQUENCER_448 0x11C0
+#define WM8962_WRITE_SEQUENCER_449 0x11C1
+#define WM8962_WRITE_SEQUENCER_450 0x11C2
+#define WM8962_WRITE_SEQUENCER_451 0x11C3
+#define WM8962_WRITE_SEQUENCER_452 0x11C4
+#define WM8962_WRITE_SEQUENCER_453 0x11C5
+#define WM8962_WRITE_SEQUENCER_454 0x11C6
+#define WM8962_WRITE_SEQUENCER_455 0x11C7
+#define WM8962_WRITE_SEQUENCER_456 0x11C8
+#define WM8962_WRITE_SEQUENCER_457 0x11C9
+#define WM8962_WRITE_SEQUENCER_458 0x11CA
+#define WM8962_WRITE_SEQUENCER_459 0x11CB
+#define WM8962_WRITE_SEQUENCER_460 0x11CC
+#define WM8962_WRITE_SEQUENCER_461 0x11CD
+#define WM8962_WRITE_SEQUENCER_462 0x11CE
+#define WM8962_WRITE_SEQUENCER_463 0x11CF
+#define WM8962_WRITE_SEQUENCER_464 0x11D0
+#define WM8962_WRITE_SEQUENCER_465 0x11D1
+#define WM8962_WRITE_SEQUENCER_466 0x11D2
+#define WM8962_WRITE_SEQUENCER_467 0x11D3
+#define WM8962_WRITE_SEQUENCER_468 0x11D4
+#define WM8962_WRITE_SEQUENCER_469 0x11D5
+#define WM8962_WRITE_SEQUENCER_470 0x11D6
+#define WM8962_WRITE_SEQUENCER_471 0x11D7
+#define WM8962_WRITE_SEQUENCER_472 0x11D8
+#define WM8962_WRITE_SEQUENCER_473 0x11D9
+#define WM8962_WRITE_SEQUENCER_474 0x11DA
+#define WM8962_WRITE_SEQUENCER_475 0x11DB
+#define WM8962_WRITE_SEQUENCER_476 0x11DC
+#define WM8962_WRITE_SEQUENCER_477 0x11DD
+#define WM8962_WRITE_SEQUENCER_478 0x11DE
+#define WM8962_WRITE_SEQUENCER_479 0x11DF
+#define WM8962_WRITE_SEQUENCER_480 0x11E0
+#define WM8962_WRITE_SEQUENCER_481 0x11E1
+#define WM8962_WRITE_SEQUENCER_482 0x11E2
+#define WM8962_WRITE_SEQUENCER_483 0x11E3
+#define WM8962_WRITE_SEQUENCER_484 0x11E4
+#define WM8962_WRITE_SEQUENCER_485 0x11E5
+#define WM8962_WRITE_SEQUENCER_486 0x11E6
+#define WM8962_WRITE_SEQUENCER_487 0x11E7
+#define WM8962_WRITE_SEQUENCER_488 0x11E8
+#define WM8962_WRITE_SEQUENCER_489 0x11E9
+#define WM8962_WRITE_SEQUENCER_490 0x11EA
+#define WM8962_WRITE_SEQUENCER_491 0x11EB
+#define WM8962_WRITE_SEQUENCER_492 0x11EC
+#define WM8962_WRITE_SEQUENCER_493 0x11ED
+#define WM8962_WRITE_SEQUENCER_494 0x11EE
+#define WM8962_WRITE_SEQUENCER_495 0x11EF
+#define WM8962_WRITE_SEQUENCER_496 0x11F0
+#define WM8962_WRITE_SEQUENCER_497 0x11F1
+#define WM8962_WRITE_SEQUENCER_498 0x11F2
+#define WM8962_WRITE_SEQUENCER_499 0x11F3
+#define WM8962_WRITE_SEQUENCER_500 0x11F4
+#define WM8962_WRITE_SEQUENCER_501 0x11F5
+#define WM8962_WRITE_SEQUENCER_502 0x11F6
+#define WM8962_WRITE_SEQUENCER_503 0x11F7
+#define WM8962_WRITE_SEQUENCER_504 0x11F8
+#define WM8962_WRITE_SEQUENCER_505 0x11F9
+#define WM8962_WRITE_SEQUENCER_506 0x11FA
+#define WM8962_WRITE_SEQUENCER_507 0x11FB
+#define WM8962_WRITE_SEQUENCER_508 0x11FC
+#define WM8962_WRITE_SEQUENCER_509 0x11FD
+#define WM8962_WRITE_SEQUENCER_510 0x11FE
+#define WM8962_WRITE_SEQUENCER_511 0x11FF
+#define WM8962_DSP2_INSTRUCTION_RAM_0 0x2000
+#define WM8962_DSP2_ADDRESS_RAM_2 0x2400
+#define WM8962_DSP2_ADDRESS_RAM_1 0x2401
+#define WM8962_DSP2_ADDRESS_RAM_0 0x2402
+#define WM8962_DSP2_DATA1_RAM_1 0x3000
+#define WM8962_DSP2_DATA1_RAM_0 0x3001
+#define WM8962_DSP2_DATA2_RAM_1 0x3400
+#define WM8962_DSP2_DATA2_RAM_0 0x3401
+#define WM8962_DSP2_DATA3_RAM_1 0x3800
+#define WM8962_DSP2_DATA3_RAM_0 0x3801
+#define WM8962_DSP2_COEFF_RAM_0 0x3C00
+#define WM8962_RETUNEADC_SHARED_COEFF_1 0x4000
+#define WM8962_RETUNEADC_SHARED_COEFF_0 0x4001
+#define WM8962_RETUNEDAC_SHARED_COEFF_1 0x4002
+#define WM8962_RETUNEDAC_SHARED_COEFF_0 0x4003
+#define WM8962_SOUNDSTAGE_ENABLES_1 0x4004
+#define WM8962_SOUNDSTAGE_ENABLES_0 0x4005
+#define WM8962_HDBASS_AI_1 0x4200
+#define WM8962_HDBASS_AI_0 0x4201
+#define WM8962_HDBASS_AR_1 0x4202
+#define WM8962_HDBASS_AR_0 0x4203
+#define WM8962_HDBASS_B_1 0x4204
+#define WM8962_HDBASS_B_0 0x4205
+#define WM8962_HDBASS_K_1 0x4206
+#define WM8962_HDBASS_K_0 0x4207
+#define WM8962_HDBASS_N1_1 0x4208
+#define WM8962_HDBASS_N1_0 0x4209
+#define WM8962_HDBASS_N2_1 0x420A
+#define WM8962_HDBASS_N2_0 0x420B
+#define WM8962_HDBASS_N3_1 0x420C
+#define WM8962_HDBASS_N3_0 0x420D
+#define WM8962_HDBASS_N4_1 0x420E
+#define WM8962_HDBASS_N4_0 0x420F
+#define WM8962_HDBASS_N5_1 0x4210
+#define WM8962_HDBASS_N5_0 0x4211
+#define WM8962_HDBASS_X1_1 0x4212
+#define WM8962_HDBASS_X1_0 0x4213
+#define WM8962_HDBASS_X2_1 0x4214
+#define WM8962_HDBASS_X2_0 0x4215
+#define WM8962_HDBASS_X3_1 0x4216
+#define WM8962_HDBASS_X3_0 0x4217
+#define WM8962_HDBASS_ATK_1 0x4218
+#define WM8962_HDBASS_ATK_0 0x4219
+#define WM8962_HDBASS_DCY_1 0x421A
+#define WM8962_HDBASS_DCY_0 0x421B
+#define WM8962_HDBASS_PG_1 0x421C
+#define WM8962_HDBASS_PG_0 0x421D
+#define WM8962_HPF_C_1 0x4400
+#define WM8962_HPF_C_0 0x4401
+#define WM8962_ADCL_RETUNE_C1_1 0x4600
+#define WM8962_ADCL_RETUNE_C1_0 0x4601
+#define WM8962_ADCL_RETUNE_C2_1 0x4602
+#define WM8962_ADCL_RETUNE_C2_0 0x4603
+#define WM8962_ADCL_RETUNE_C3_1 0x4604
+#define WM8962_ADCL_RETUNE_C3_0 0x4605
+#define WM8962_ADCL_RETUNE_C4_1 0x4606
+#define WM8962_ADCL_RETUNE_C4_0 0x4607
+#define WM8962_ADCL_RETUNE_C5_1 0x4608
+#define WM8962_ADCL_RETUNE_C5_0 0x4609
+#define WM8962_ADCL_RETUNE_C6_1 0x460A
+#define WM8962_ADCL_RETUNE_C6_0 0x460B
+#define WM8962_ADCL_RETUNE_C7_1 0x460C
+#define WM8962_ADCL_RETUNE_C7_0 0x460D
+#define WM8962_ADCL_RETUNE_C8_1 0x460E
+#define WM8962_ADCL_RETUNE_C8_0 0x460F
+#define WM8962_ADCL_RETUNE_C9_1 0x4610
+#define WM8962_ADCL_RETUNE_C9_0 0x4611
+#define WM8962_ADCL_RETUNE_C10_1 0x4612
+#define WM8962_ADCL_RETUNE_C10_0 0x4613
+#define WM8962_ADCL_RETUNE_C11_1 0x4614
+#define WM8962_ADCL_RETUNE_C11_0 0x4615
+#define WM8962_ADCL_RETUNE_C12_1 0x4616
+#define WM8962_ADCL_RETUNE_C12_0 0x4617
+#define WM8962_ADCL_RETUNE_C13_1 0x4618
+#define WM8962_ADCL_RETUNE_C13_0 0x4619
+#define WM8962_ADCL_RETUNE_C14_1 0x461A
+#define WM8962_ADCL_RETUNE_C14_0 0x461B
+#define WM8962_ADCL_RETUNE_C15_1 0x461C
+#define WM8962_ADCL_RETUNE_C15_0 0x461D
+#define WM8962_ADCL_RETUNE_C16_1 0x461E
+#define WM8962_ADCL_RETUNE_C16_0 0x461F
+#define WM8962_ADCL_RETUNE_C17_1 0x4620
+#define WM8962_ADCL_RETUNE_C17_0 0x4621
+#define WM8962_ADCL_RETUNE_C18_1 0x4622
+#define WM8962_ADCL_RETUNE_C18_0 0x4623
+#define WM8962_ADCL_RETUNE_C19_1 0x4624
+#define WM8962_ADCL_RETUNE_C19_0 0x4625
+#define WM8962_ADCL_RETUNE_C20_1 0x4626
+#define WM8962_ADCL_RETUNE_C20_0 0x4627
+#define WM8962_ADCL_RETUNE_C21_1 0x4628
+#define WM8962_ADCL_RETUNE_C21_0 0x4629
+#define WM8962_ADCL_RETUNE_C22_1 0x462A
+#define WM8962_ADCL_RETUNE_C22_0 0x462B
+#define WM8962_ADCL_RETUNE_C23_1 0x462C
+#define WM8962_ADCL_RETUNE_C23_0 0x462D
+#define WM8962_ADCL_RETUNE_C24_1 0x462E
+#define WM8962_ADCL_RETUNE_C24_0 0x462F
+#define WM8962_ADCL_RETUNE_C25_1 0x4630
+#define WM8962_ADCL_RETUNE_C25_0 0x4631
+#define WM8962_ADCL_RETUNE_C26_1 0x4632
+#define WM8962_ADCL_RETUNE_C26_0 0x4633
+#define WM8962_ADCL_RETUNE_C27_1 0x4634
+#define WM8962_ADCL_RETUNE_C27_0 0x4635
+#define WM8962_ADCL_RETUNE_C28_1 0x4636
+#define WM8962_ADCL_RETUNE_C28_0 0x4637
+#define WM8962_ADCL_RETUNE_C29_1 0x4638
+#define WM8962_ADCL_RETUNE_C29_0 0x4639
+#define WM8962_ADCL_RETUNE_C30_1 0x463A
+#define WM8962_ADCL_RETUNE_C30_0 0x463B
+#define WM8962_ADCL_RETUNE_C31_1 0x463C
+#define WM8962_ADCL_RETUNE_C31_0 0x463D
+#define WM8962_ADCL_RETUNE_C32_1 0x463E
+#define WM8962_ADCL_RETUNE_C32_0 0x463F
+#define WM8962_RETUNEADC_PG2_1 0x4800
+#define WM8962_RETUNEADC_PG2_0 0x4801
+#define WM8962_RETUNEADC_PG_1 0x4802
+#define WM8962_RETUNEADC_PG_0 0x4803
+#define WM8962_ADCR_RETUNE_C1_1 0x4A00
+#define WM8962_ADCR_RETUNE_C1_0 0x4A01
+#define WM8962_ADCR_RETUNE_C2_1 0x4A02
+#define WM8962_ADCR_RETUNE_C2_0 0x4A03
+#define WM8962_ADCR_RETUNE_C3_1 0x4A04
+#define WM8962_ADCR_RETUNE_C3_0 0x4A05
+#define WM8962_ADCR_RETUNE_C4_1 0x4A06
+#define WM8962_ADCR_RETUNE_C4_0 0x4A07
+#define WM8962_ADCR_RETUNE_C5_1 0x4A08
+#define WM8962_ADCR_RETUNE_C5_0 0x4A09
+#define WM8962_ADCR_RETUNE_C6_1 0x4A0A
+#define WM8962_ADCR_RETUNE_C6_0 0x4A0B
+#define WM8962_ADCR_RETUNE_C7_1 0x4A0C
+#define WM8962_ADCR_RETUNE_C7_0 0x4A0D
+#define WM8962_ADCR_RETUNE_C8_1 0x4A0E
+#define WM8962_ADCR_RETUNE_C8_0 0x4A0F
+#define WM8962_ADCR_RETUNE_C9_1 0x4A10
+#define WM8962_ADCR_RETUNE_C9_0 0x4A11
+#define WM8962_ADCR_RETUNE_C10_1 0x4A12
+#define WM8962_ADCR_RETUNE_C10_0 0x4A13
+#define WM8962_ADCR_RETUNE_C11_1 0x4A14
+#define WM8962_ADCR_RETUNE_C11_0 0x4A15
+#define WM8962_ADCR_RETUNE_C12_1 0x4A16
+#define WM8962_ADCR_RETUNE_C12_0 0x4A17
+#define WM8962_ADCR_RETUNE_C13_1 0x4A18
+#define WM8962_ADCR_RETUNE_C13_0 0x4A19
+#define WM8962_ADCR_RETUNE_C14_1 0x4A1A
+#define WM8962_ADCR_RETUNE_C14_0 0x4A1B
+#define WM8962_ADCR_RETUNE_C15_1 0x4A1C
+#define WM8962_ADCR_RETUNE_C15_0 0x4A1D
+#define WM8962_ADCR_RETUNE_C16_1 0x4A1E
+#define WM8962_ADCR_RETUNE_C16_0 0x4A1F
+#define WM8962_ADCR_RETUNE_C17_1 0x4A20
+#define WM8962_ADCR_RETUNE_C17_0 0x4A21
+#define WM8962_ADCR_RETUNE_C18_1 0x4A22
+#define WM8962_ADCR_RETUNE_C18_0 0x4A23
+#define WM8962_ADCR_RETUNE_C19_1 0x4A24
+#define WM8962_ADCR_RETUNE_C19_0 0x4A25
+#define WM8962_ADCR_RETUNE_C20_1 0x4A26
+#define WM8962_ADCR_RETUNE_C20_0 0x4A27
+#define WM8962_ADCR_RETUNE_C21_1 0x4A28
+#define WM8962_ADCR_RETUNE_C21_0 0x4A29
+#define WM8962_ADCR_RETUNE_C22_1 0x4A2A
+#define WM8962_ADCR_RETUNE_C22_0 0x4A2B
+#define WM8962_ADCR_RETUNE_C23_1 0x4A2C
+#define WM8962_ADCR_RETUNE_C23_0 0x4A2D
+#define WM8962_ADCR_RETUNE_C24_1 0x4A2E
+#define WM8962_ADCR_RETUNE_C24_0 0x4A2F
+#define WM8962_ADCR_RETUNE_C25_1 0x4A30
+#define WM8962_ADCR_RETUNE_C25_0 0x4A31
+#define WM8962_ADCR_RETUNE_C26_1 0x4A32
+#define WM8962_ADCR_RETUNE_C26_0 0x4A33
+#define WM8962_ADCR_RETUNE_C27_1 0x4A34
+#define WM8962_ADCR_RETUNE_C27_0 0x4A35
+#define WM8962_ADCR_RETUNE_C28_1 0x4A36
+#define WM8962_ADCR_RETUNE_C28_0 0x4A37
+#define WM8962_ADCR_RETUNE_C29_1 0x4A38
+#define WM8962_ADCR_RETUNE_C29_0 0x4A39
+#define WM8962_ADCR_RETUNE_C30_1 0x4A3A
+#define WM8962_ADCR_RETUNE_C30_0 0x4A3B
+#define WM8962_ADCR_RETUNE_C31_1 0x4A3C
+#define WM8962_ADCR_RETUNE_C31_0 0x4A3D
+#define WM8962_ADCR_RETUNE_C32_1 0x4A3E
+#define WM8962_ADCR_RETUNE_C32_0 0x4A3F
+#define WM8962_DACL_RETUNE_C1_1 0x4C00
+#define WM8962_DACL_RETUNE_C1_0 0x4C01
+#define WM8962_DACL_RETUNE_C2_1 0x4C02
+#define WM8962_DACL_RETUNE_C2_0 0x4C03
+#define WM8962_DACL_RETUNE_C3_1 0x4C04
+#define WM8962_DACL_RETUNE_C3_0 0x4C05
+#define WM8962_DACL_RETUNE_C4_1 0x4C06
+#define WM8962_DACL_RETUNE_C4_0 0x4C07
+#define WM8962_DACL_RETUNE_C5_1 0x4C08
+#define WM8962_DACL_RETUNE_C5_0 0x4C09
+#define WM8962_DACL_RETUNE_C6_1 0x4C0A
+#define WM8962_DACL_RETUNE_C6_0 0x4C0B
+#define WM8962_DACL_RETUNE_C7_1 0x4C0C
+#define WM8962_DACL_RETUNE_C7_0 0x4C0D
+#define WM8962_DACL_RETUNE_C8_1 0x4C0E
+#define WM8962_DACL_RETUNE_C8_0 0x4C0F
+#define WM8962_DACL_RETUNE_C9_1 0x4C10
+#define WM8962_DACL_RETUNE_C9_0 0x4C11
+#define WM8962_DACL_RETUNE_C10_1 0x4C12
+#define WM8962_DACL_RETUNE_C10_0 0x4C13
+#define WM8962_DACL_RETUNE_C11_1 0x4C14
+#define WM8962_DACL_RETUNE_C11_0 0x4C15
+#define WM8962_DACL_RETUNE_C12_1 0x4C16
+#define WM8962_DACL_RETUNE_C12_0 0x4C17
+#define WM8962_DACL_RETUNE_C13_1 0x4C18
+#define WM8962_DACL_RETUNE_C13_0 0x4C19
+#define WM8962_DACL_RETUNE_C14_1 0x4C1A
+#define WM8962_DACL_RETUNE_C14_0 0x4C1B
+#define WM8962_DACL_RETUNE_C15_1 0x4C1C
+#define WM8962_DACL_RETUNE_C15_0 0x4C1D
+#define WM8962_DACL_RETUNE_C16_1 0x4C1E
+#define WM8962_DACL_RETUNE_C16_0 0x4C1F
+#define WM8962_DACL_RETUNE_C17_1 0x4C20
+#define WM8962_DACL_RETUNE_C17_0 0x4C21
+#define WM8962_DACL_RETUNE_C18_1 0x4C22
+#define WM8962_DACL_RETUNE_C18_0 0x4C23
+#define WM8962_DACL_RETUNE_C19_1 0x4C24
+#define WM8962_DACL_RETUNE_C19_0 0x4C25
+#define WM8962_DACL_RETUNE_C20_1 0x4C26
+#define WM8962_DACL_RETUNE_C20_0 0x4C27
+#define WM8962_DACL_RETUNE_C21_1 0x4C28
+#define WM8962_DACL_RETUNE_C21_0 0x4C29
+#define WM8962_DACL_RETUNE_C22_1 0x4C2A
+#define WM8962_DACL_RETUNE_C22_0 0x4C2B
+#define WM8962_DACL_RETUNE_C23_1 0x4C2C
+#define WM8962_DACL_RETUNE_C23_0 0x4C2D
+#define WM8962_DACL_RETUNE_C24_1 0x4C2E
+#define WM8962_DACL_RETUNE_C24_0 0x4C2F
+#define WM8962_DACL_RETUNE_C25_1 0x4C30
+#define WM8962_DACL_RETUNE_C25_0 0x4C31
+#define WM8962_DACL_RETUNE_C26_1 0x4C32
+#define WM8962_DACL_RETUNE_C26_0 0x4C33
+#define WM8962_DACL_RETUNE_C27_1 0x4C34
+#define WM8962_DACL_RETUNE_C27_0 0x4C35
+#define WM8962_DACL_RETUNE_C28_1 0x4C36
+#define WM8962_DACL_RETUNE_C28_0 0x4C37
+#define WM8962_DACL_RETUNE_C29_1 0x4C38
+#define WM8962_DACL_RETUNE_C29_0 0x4C39
+#define WM8962_DACL_RETUNE_C30_1 0x4C3A
+#define WM8962_DACL_RETUNE_C30_0 0x4C3B
+#define WM8962_DACL_RETUNE_C31_1 0x4C3C
+#define WM8962_DACL_RETUNE_C31_0 0x4C3D
+#define WM8962_DACL_RETUNE_C32_1 0x4C3E
+#define WM8962_DACL_RETUNE_C32_0 0x4C3F
+#define WM8962_RETUNEDAC_PG2_1 0x4E00
+#define WM8962_RETUNEDAC_PG2_0 0x4E01
+#define WM8962_RETUNEDAC_PG_1 0x4E02
+#define WM8962_RETUNEDAC_PG_0 0x4E03
+#define WM8962_DACR_RETUNE_C1_1 0x5000
+#define WM8962_DACR_RETUNE_C1_0 0x5001
+#define WM8962_DACR_RETUNE_C2_1 0x5002
+#define WM8962_DACR_RETUNE_C2_0 0x5003
+#define WM8962_DACR_RETUNE_C3_1 0x5004
+#define WM8962_DACR_RETUNE_C3_0 0x5005
+#define WM8962_DACR_RETUNE_C4_1 0x5006
+#define WM8962_DACR_RETUNE_C4_0 0x5007
+#define WM8962_DACR_RETUNE_C5_1 0x5008
+#define WM8962_DACR_RETUNE_C5_0 0x5009
+#define WM8962_DACR_RETUNE_C6_1 0x500A
+#define WM8962_DACR_RETUNE_C6_0 0x500B
+#define WM8962_DACR_RETUNE_C7_1 0x500C
+#define WM8962_DACR_RETUNE_C7_0 0x500D
+#define WM8962_DACR_RETUNE_C8_1 0x500E
+#define WM8962_DACR_RETUNE_C8_0 0x500F
+#define WM8962_DACR_RETUNE_C9_1 0x5010
+#define WM8962_DACR_RETUNE_C9_0 0x5011
+#define WM8962_DACR_RETUNE_C10_1 0x5012
+#define WM8962_DACR_RETUNE_C10_0 0x5013
+#define WM8962_DACR_RETUNE_C11_1 0x5014
+#define WM8962_DACR_RETUNE_C11_0 0x5015
+#define WM8962_DACR_RETUNE_C12_1 0x5016
+#define WM8962_DACR_RETUNE_C12_0 0x5017
+#define WM8962_DACR_RETUNE_C13_1 0x5018
+#define WM8962_DACR_RETUNE_C13_0 0x5019
+#define WM8962_DACR_RETUNE_C14_1 0x501A
+#define WM8962_DACR_RETUNE_C14_0 0x501B
+#define WM8962_DACR_RETUNE_C15_1 0x501C
+#define WM8962_DACR_RETUNE_C15_0 0x501D
+#define WM8962_DACR_RETUNE_C16_1 0x501E
+#define WM8962_DACR_RETUNE_C16_0 0x501F
+#define WM8962_DACR_RETUNE_C17_1 0x5020
+#define WM8962_DACR_RETUNE_C17_0 0x5021
+#define WM8962_DACR_RETUNE_C18_1 0x5022
+#define WM8962_DACR_RETUNE_C18_0 0x5023
+#define WM8962_DACR_RETUNE_C19_1 0x5024
+#define WM8962_DACR_RETUNE_C19_0 0x5025
+#define WM8962_DACR_RETUNE_C20_1 0x5026
+#define WM8962_DACR_RETUNE_C20_0 0x5027
+#define WM8962_DACR_RETUNE_C21_1 0x5028
+#define WM8962_DACR_RETUNE_C21_0 0x5029
+#define WM8962_DACR_RETUNE_C22_1 0x502A
+#define WM8962_DACR_RETUNE_C22_0 0x502B
+#define WM8962_DACR_RETUNE_C23_1 0x502C
+#define WM8962_DACR_RETUNE_C23_0 0x502D
+#define WM8962_DACR_RETUNE_C24_1 0x502E
+#define WM8962_DACR_RETUNE_C24_0 0x502F
+#define WM8962_DACR_RETUNE_C25_1 0x5030
+#define WM8962_DACR_RETUNE_C25_0 0x5031
+#define WM8962_DACR_RETUNE_C26_1 0x5032
+#define WM8962_DACR_RETUNE_C26_0 0x5033
+#define WM8962_DACR_RETUNE_C27_1 0x5034
+#define WM8962_DACR_RETUNE_C27_0 0x5035
+#define WM8962_DACR_RETUNE_C28_1 0x5036
+#define WM8962_DACR_RETUNE_C28_0 0x5037
+#define WM8962_DACR_RETUNE_C29_1 0x5038
+#define WM8962_DACR_RETUNE_C29_0 0x5039
+#define WM8962_DACR_RETUNE_C30_1 0x503A
+#define WM8962_DACR_RETUNE_C30_0 0x503B
+#define WM8962_DACR_RETUNE_C31_1 0x503C
+#define WM8962_DACR_RETUNE_C31_0 0x503D
+#define WM8962_DACR_RETUNE_C32_1 0x503E
+#define WM8962_DACR_RETUNE_C32_0 0x503F
+#define WM8962_VSS_XHD2_1 0x5200
+#define WM8962_VSS_XHD2_0 0x5201
+#define WM8962_VSS_XHD3_1 0x5202
+#define WM8962_VSS_XHD3_0 0x5203
+#define WM8962_VSS_XHN1_1 0x5204
+#define WM8962_VSS_XHN1_0 0x5205
+#define WM8962_VSS_XHN2_1 0x5206
+#define WM8962_VSS_XHN2_0 0x5207
+#define WM8962_VSS_XHN3_1 0x5208
+#define WM8962_VSS_XHN3_0 0x5209
+#define WM8962_VSS_XLA_1 0x520A
+#define WM8962_VSS_XLA_0 0x520B
+#define WM8962_VSS_XLB_1 0x520C
+#define WM8962_VSS_XLB_0 0x520D
+#define WM8962_VSS_XLG_1 0x520E
+#define WM8962_VSS_XLG_0 0x520F
+#define WM8962_VSS_PG2_1 0x5210
+#define WM8962_VSS_PG2_0 0x5211
+#define WM8962_VSS_PG_1 0x5212
+#define WM8962_VSS_PG_0 0x5213
+#define WM8962_VSS_XTD1_1 0x5214
+#define WM8962_VSS_XTD1_0 0x5215
+#define WM8962_VSS_XTD2_1 0x5216
+#define WM8962_VSS_XTD2_0 0x5217
+#define WM8962_VSS_XTD3_1 0x5218
+#define WM8962_VSS_XTD3_0 0x5219
+#define WM8962_VSS_XTD4_1 0x521A
+#define WM8962_VSS_XTD4_0 0x521B
+#define WM8962_VSS_XTD5_1 0x521C
+#define WM8962_VSS_XTD5_0 0x521D
+#define WM8962_VSS_XTD6_1 0x521E
+#define WM8962_VSS_XTD6_0 0x521F
+#define WM8962_VSS_XTD7_1 0x5220
+#define WM8962_VSS_XTD7_0 0x5221
+#define WM8962_VSS_XTD8_1 0x5222
+#define WM8962_VSS_XTD8_0 0x5223
+#define WM8962_VSS_XTD9_1 0x5224
+#define WM8962_VSS_XTD9_0 0x5225
+#define WM8962_VSS_XTD10_1 0x5226
+#define WM8962_VSS_XTD10_0 0x5227
+#define WM8962_VSS_XTD11_1 0x5228
+#define WM8962_VSS_XTD11_0 0x5229
+#define WM8962_VSS_XTD12_1 0x522A
+#define WM8962_VSS_XTD12_0 0x522B
+#define WM8962_VSS_XTD13_1 0x522C
+#define WM8962_VSS_XTD13_0 0x522D
+#define WM8962_VSS_XTD14_1 0x522E
+#define WM8962_VSS_XTD14_0 0x522F
+#define WM8962_VSS_XTD15_1 0x5230
+#define WM8962_VSS_XTD15_0 0x5231
+#define WM8962_VSS_XTD16_1 0x5232
+#define WM8962_VSS_XTD16_0 0x5233
+#define WM8962_VSS_XTD17_1 0x5234
+#define WM8962_VSS_XTD17_0 0x5235
+#define WM8962_VSS_XTD18_1 0x5236
+#define WM8962_VSS_XTD18_0 0x5237
+#define WM8962_VSS_XTD19_1 0x5238
+#define WM8962_VSS_XTD19_0 0x5239
+#define WM8962_VSS_XTD20_1 0x523A
+#define WM8962_VSS_XTD20_0 0x523B
+#define WM8962_VSS_XTD21_1 0x523C
+#define WM8962_VSS_XTD21_0 0x523D
+#define WM8962_VSS_XTD22_1 0x523E
+#define WM8962_VSS_XTD22_0 0x523F
+#define WM8962_VSS_XTD23_1 0x5240
+#define WM8962_VSS_XTD23_0 0x5241
+#define WM8962_VSS_XTD24_1 0x5242
+#define WM8962_VSS_XTD24_0 0x5243
+#define WM8962_VSS_XTD25_1 0x5244
+#define WM8962_VSS_XTD25_0 0x5245
+#define WM8962_VSS_XTD26_1 0x5246
+#define WM8962_VSS_XTD26_0 0x5247
+#define WM8962_VSS_XTD27_1 0x5248
+#define WM8962_VSS_XTD27_0 0x5249
+#define WM8962_VSS_XTD28_1 0x524A
+#define WM8962_VSS_XTD28_0 0x524B
+#define WM8962_VSS_XTD29_1 0x524C
+#define WM8962_VSS_XTD29_0 0x524D
+#define WM8962_VSS_XTD30_1 0x524E
+#define WM8962_VSS_XTD30_0 0x524F
+#define WM8962_VSS_XTD31_1 0x5250
+#define WM8962_VSS_XTD31_0 0x5251
+#define WM8962_VSS_XTD32_1 0x5252
+#define WM8962_VSS_XTD32_0 0x5253
+#define WM8962_VSS_XTS1_1 0x5254
+#define WM8962_VSS_XTS1_0 0x5255
+#define WM8962_VSS_XTS2_1 0x5256
+#define WM8962_VSS_XTS2_0 0x5257
+#define WM8962_VSS_XTS3_1 0x5258
+#define WM8962_VSS_XTS3_0 0x5259
+#define WM8962_VSS_XTS4_1 0x525A
+#define WM8962_VSS_XTS4_0 0x525B
+#define WM8962_VSS_XTS5_1 0x525C
+#define WM8962_VSS_XTS5_0 0x525D
+#define WM8962_VSS_XTS6_1 0x525E
+#define WM8962_VSS_XTS6_0 0x525F
+#define WM8962_VSS_XTS7_1 0x5260
+#define WM8962_VSS_XTS7_0 0x5261
+#define WM8962_VSS_XTS8_1 0x5262
+#define WM8962_VSS_XTS8_0 0x5263
+#define WM8962_VSS_XTS9_1 0x5264
+#define WM8962_VSS_XTS9_0 0x5265
+#define WM8962_VSS_XTS10_1 0x5266
+#define WM8962_VSS_XTS10_0 0x5267
+#define WM8962_VSS_XTS11_1 0x5268
+#define WM8962_VSS_XTS11_0 0x5269
+#define WM8962_VSS_XTS12_1 0x526A
+#define WM8962_VSS_XTS12_0 0x526B
+#define WM8962_VSS_XTS13_1 0x526C
+#define WM8962_VSS_XTS13_0 0x526D
+#define WM8962_VSS_XTS14_1 0x526E
+#define WM8962_VSS_XTS14_0 0x526F
+#define WM8962_VSS_XTS15_1 0x5270
+#define WM8962_VSS_XTS15_0 0x5271
+#define WM8962_VSS_XTS16_1 0x5272
+#define WM8962_VSS_XTS16_0 0x5273
+#define WM8962_VSS_XTS17_1 0x5274
+#define WM8962_VSS_XTS17_0 0x5275
+#define WM8962_VSS_XTS18_1 0x5276
+#define WM8962_VSS_XTS18_0 0x5277
+#define WM8962_VSS_XTS19_1 0x5278
+#define WM8962_VSS_XTS19_0 0x5279
+#define WM8962_VSS_XTS20_1 0x527A
+#define WM8962_VSS_XTS20_0 0x527B
+#define WM8962_VSS_XTS21_1 0x527C
+#define WM8962_VSS_XTS21_0 0x527D
+#define WM8962_VSS_XTS22_1 0x527E
+#define WM8962_VSS_XTS22_0 0x527F
+#define WM8962_VSS_XTS23_1 0x5280
+#define WM8962_VSS_XTS23_0 0x5281
+#define WM8962_VSS_XTS24_1 0x5282
+#define WM8962_VSS_XTS24_0 0x5283
+#define WM8962_VSS_XTS25_1 0x5284
+#define WM8962_VSS_XTS25_0 0x5285
+#define WM8962_VSS_XTS26_1 0x5286
+#define WM8962_VSS_XTS26_0 0x5287
+#define WM8962_VSS_XTS27_1 0x5288
+#define WM8962_VSS_XTS27_0 0x5289
+#define WM8962_VSS_XTS28_1 0x528A
+#define WM8962_VSS_XTS28_0 0x528B
+#define WM8962_VSS_XTS29_1 0x528C
+#define WM8962_VSS_XTS29_0 0x528D
+#define WM8962_VSS_XTS30_1 0x528E
+#define WM8962_VSS_XTS30_0 0x528F
+#define WM8962_VSS_XTS31_1 0x5290
+#define WM8962_VSS_XTS31_0 0x5291
+#define WM8962_VSS_XTS32_1 0x5292
+#define WM8962_VSS_XTS32_0 0x5293
+
+#define WM8962_REGISTER_COUNT 1138
+#define WM8962_MAX_REGISTER 0x5293
+
+/*
+ * Field Definitions.
+ */
+
+/*
+ * R0 (0x00) - Left Input volume
+ */
+#define WM8962_IN_VU 0x0100 /* IN_VU */
+#define WM8962_IN_VU_MASK 0x0100 /* IN_VU */
+#define WM8962_IN_VU_SHIFT 8 /* IN_VU */
+#define WM8962_IN_VU_WIDTH 1 /* IN_VU */
+#define WM8962_INPGAL_MUTE 0x0080 /* INPGAL_MUTE */
+#define WM8962_INPGAL_MUTE_MASK 0x0080 /* INPGAL_MUTE */
+#define WM8962_INPGAL_MUTE_SHIFT 7 /* INPGAL_MUTE */
+#define WM8962_INPGAL_MUTE_WIDTH 1 /* INPGAL_MUTE */
+#define WM8962_INL_ZC 0x0040 /* INL_ZC */
+#define WM8962_INL_ZC_MASK 0x0040 /* INL_ZC */
+#define WM8962_INL_ZC_SHIFT 6 /* INL_ZC */
+#define WM8962_INL_ZC_WIDTH 1 /* INL_ZC */
+#define WM8962_INL_VOL_MASK 0x003F /* INL_VOL - [5:0] */
+#define WM8962_INL_VOL_SHIFT 0 /* INL_VOL - [5:0] */
+#define WM8962_INL_VOL_WIDTH 6 /* INL_VOL - [5:0] */
+
+/*
+ * R1 (0x01) - Right Input volume
+ */
+#define WM8962_CUST_ID_MASK 0xF000 /* CUST_ID - [15:12] */
+#define WM8962_CUST_ID_SHIFT 12 /* CUST_ID - [15:12] */
+#define WM8962_CUST_ID_WIDTH 4 /* CUST_ID - [15:12] */
+#define WM8962_CHIP_REV_MASK 0x0E00 /* CHIP_REV - [11:9] */
+#define WM8962_CHIP_REV_SHIFT 9 /* CHIP_REV - [11:9] */
+#define WM8962_CHIP_REV_WIDTH 3 /* CHIP_REV - [11:9] */
+#define WM8962_IN_VU 0x0100 /* IN_VU */
+#define WM8962_IN_VU_MASK 0x0100 /* IN_VU */
+#define WM8962_IN_VU_SHIFT 8 /* IN_VU */
+#define WM8962_IN_VU_WIDTH 1 /* IN_VU */
+#define WM8962_INPGAR_MUTE 0x0080 /* INPGAR_MUTE */
+#define WM8962_INPGAR_MUTE_MASK 0x0080 /* INPGAR_MUTE */
+#define WM8962_INPGAR_MUTE_SHIFT 7 /* INPGAR_MUTE */
+#define WM8962_INPGAR_MUTE_WIDTH 1 /* INPGAR_MUTE */
+#define WM8962_INR_ZC 0x0040 /* INR_ZC */
+#define WM8962_INR_ZC_MASK 0x0040 /* INR_ZC */
+#define WM8962_INR_ZC_SHIFT 6 /* INR_ZC */
+#define WM8962_INR_ZC_WIDTH 1 /* INR_ZC */
+#define WM8962_INR_VOL_MASK 0x003F /* INR_VOL - [5:0] */
+#define WM8962_INR_VOL_SHIFT 0 /* INR_VOL - [5:0] */
+#define WM8962_INR_VOL_WIDTH 6 /* INR_VOL - [5:0] */
+
+/*
+ * R2 (0x02) - HPOUTL volume
+ */
+#define WM8962_HPOUT_VU 0x0100 /* HPOUT_VU */
+#define WM8962_HPOUT_VU_MASK 0x0100 /* HPOUT_VU */
+#define WM8962_HPOUT_VU_SHIFT 8 /* HPOUT_VU */
+#define WM8962_HPOUT_VU_WIDTH 1 /* HPOUT_VU */
+#define WM8962_HPOUTL_ZC 0x0080 /* HPOUTL_ZC */
+#define WM8962_HPOUTL_ZC_MASK 0x0080 /* HPOUTL_ZC */
+#define WM8962_HPOUTL_ZC_SHIFT 7 /* HPOUTL_ZC */
+#define WM8962_HPOUTL_ZC_WIDTH 1 /* HPOUTL_ZC */
+#define WM8962_HPOUTL_VOL_MASK 0x007F /* HPOUTL_VOL - [6:0] */
+#define WM8962_HPOUTL_VOL_SHIFT 0 /* HPOUTL_VOL - [6:0] */
+#define WM8962_HPOUTL_VOL_WIDTH 7 /* HPOUTL_VOL - [6:0] */
+
+/*
+ * R3 (0x03) - HPOUTR volume
+ */
+#define WM8962_HPOUT_VU 0x0100 /* HPOUT_VU */
+#define WM8962_HPOUT_VU_MASK 0x0100 /* HPOUT_VU */
+#define WM8962_HPOUT_VU_SHIFT 8 /* HPOUT_VU */
+#define WM8962_HPOUT_VU_WIDTH 1 /* HPOUT_VU */
+#define WM8962_HPOUTR_ZC 0x0080 /* HPOUTR_ZC */
+#define WM8962_HPOUTR_ZC_MASK 0x0080 /* HPOUTR_ZC */
+#define WM8962_HPOUTR_ZC_SHIFT 7 /* HPOUTR_ZC */
+#define WM8962_HPOUTR_ZC_WIDTH 1 /* HPOUTR_ZC */
+#define WM8962_HPOUTR_VOL_MASK 0x007F /* HPOUTR_VOL - [6:0] */
+#define WM8962_HPOUTR_VOL_SHIFT 0 /* HPOUTR_VOL - [6:0] */
+#define WM8962_HPOUTR_VOL_WIDTH 7 /* HPOUTR_VOL - [6:0] */
+
+/*
+ * R4 (0x04) - Clocking1
+ */
+#define WM8962_DSPCLK_DIV_MASK 0x0600 /* DSPCLK_DIV - [10:9] */
+#define WM8962_DSPCLK_DIV_SHIFT 9 /* DSPCLK_DIV - [10:9] */
+#define WM8962_DSPCLK_DIV_WIDTH 2 /* DSPCLK_DIV - [10:9] */
+#define WM8962_ADCSYS_CLK_DIV_MASK 0x01C0 /* ADCSYS_CLK_DIV - [8:6] */
+#define WM8962_ADCSYS_CLK_DIV_SHIFT 6 /* ADCSYS_CLK_DIV - [8:6] */
+#define WM8962_ADCSYS_CLK_DIV_WIDTH 3 /* ADCSYS_CLK_DIV - [8:6] */
+#define WM8962_DACSYS_CLK_DIV_MASK 0x0038 /* DACSYS_CLK_DIV - [5:3] */
+#define WM8962_DACSYS_CLK_DIV_SHIFT 3 /* DACSYS_CLK_DIV - [5:3] */
+#define WM8962_DACSYS_CLK_DIV_WIDTH 3 /* DACSYS_CLK_DIV - [5:3] */
+#define WM8962_MCLKDIV_MASK 0x0006 /* MCLKDIV - [2:1] */
+#define WM8962_MCLKDIV_SHIFT 1 /* MCLKDIV - [2:1] */
+#define WM8962_MCLKDIV_WIDTH 2 /* MCLKDIV - [2:1] */
+
+/*
+ * R5 (0x05) - ADC & DAC Control 1
+ */
+#define WM8962_ADCR_DAT_INV 0x0040 /* ADCR_DAT_INV */
+#define WM8962_ADCR_DAT_INV_MASK 0x0040 /* ADCR_DAT_INV */
+#define WM8962_ADCR_DAT_INV_SHIFT 6 /* ADCR_DAT_INV */
+#define WM8962_ADCR_DAT_INV_WIDTH 1 /* ADCR_DAT_INV */
+#define WM8962_ADCL_DAT_INV 0x0020 /* ADCL_DAT_INV */
+#define WM8962_ADCL_DAT_INV_MASK 0x0020 /* ADCL_DAT_INV */
+#define WM8962_ADCL_DAT_INV_SHIFT 5 /* ADCL_DAT_INV */
+#define WM8962_ADCL_DAT_INV_WIDTH 1 /* ADCL_DAT_INV */
+#define WM8962_DAC_MUTE_RAMP 0x0010 /* DAC_MUTE_RAMP */
+#define WM8962_DAC_MUTE_RAMP_MASK 0x0010 /* DAC_MUTE_RAMP */
+#define WM8962_DAC_MUTE_RAMP_SHIFT 4 /* DAC_MUTE_RAMP */
+#define WM8962_DAC_MUTE_RAMP_WIDTH 1 /* DAC_MUTE_RAMP */
+#define WM8962_DAC_MUTE 0x0008 /* DAC_MUTE */
+#define WM8962_DAC_MUTE_MASK 0x0008 /* DAC_MUTE */
+#define WM8962_DAC_MUTE_SHIFT 3 /* DAC_MUTE */
+#define WM8962_DAC_MUTE_WIDTH 1 /* DAC_MUTE */
+#define WM8962_DAC_DEEMP_MASK 0x0006 /* DAC_DEEMP - [2:1] */
+#define WM8962_DAC_DEEMP_SHIFT 1 /* DAC_DEEMP - [2:1] */
+#define WM8962_DAC_DEEMP_WIDTH 2 /* DAC_DEEMP - [2:1] */
+#define WM8962_ADC_HPF_DIS 0x0001 /* ADC_HPF_DIS */
+#define WM8962_ADC_HPF_DIS_MASK 0x0001 /* ADC_HPF_DIS */
+#define WM8962_ADC_HPF_DIS_SHIFT 0 /* ADC_HPF_DIS */
+#define WM8962_ADC_HPF_DIS_WIDTH 1 /* ADC_HPF_DIS */
+
+/*
+ * R6 (0x06) - ADC & DAC Control 2
+ */
+#define WM8962_ADC_HPF_SR_MASK 0x3000 /* ADC_HPF_SR - [13:12] */
+#define WM8962_ADC_HPF_SR_SHIFT 12 /* ADC_HPF_SR - [13:12] */
+#define WM8962_ADC_HPF_SR_WIDTH 2 /* ADC_HPF_SR - [13:12] */
+#define WM8962_ADC_HPF_MODE 0x0400 /* ADC_HPF_MODE */
+#define WM8962_ADC_HPF_MODE_MASK 0x0400 /* ADC_HPF_MODE */
+#define WM8962_ADC_HPF_MODE_SHIFT 10 /* ADC_HPF_MODE */
+#define WM8962_ADC_HPF_MODE_WIDTH 1 /* ADC_HPF_MODE */
+#define WM8962_ADC_HPF_CUT_MASK 0x0380 /* ADC_HPF_CUT - [9:7] */
+#define WM8962_ADC_HPF_CUT_SHIFT 7 /* ADC_HPF_CUT - [9:7] */
+#define WM8962_ADC_HPF_CUT_WIDTH 3 /* ADC_HPF_CUT - [9:7] */
+#define WM8962_DACR_DAT_INV 0x0040 /* DACR_DAT_INV */
+#define WM8962_DACR_DAT_INV_MASK 0x0040 /* DACR_DAT_INV */
+#define WM8962_DACR_DAT_INV_SHIFT 6 /* DACR_DAT_INV */
+#define WM8962_DACR_DAT_INV_WIDTH 1 /* DACR_DAT_INV */
+#define WM8962_DACL_DAT_INV 0x0020 /* DACL_DAT_INV */
+#define WM8962_DACL_DAT_INV_MASK 0x0020 /* DACL_DAT_INV */
+#define WM8962_DACL_DAT_INV_SHIFT 5 /* DACL_DAT_INV */
+#define WM8962_DACL_DAT_INV_WIDTH 1 /* DACL_DAT_INV */
+#define WM8962_DAC_UNMUTE_RAMP 0x0008 /* DAC_UNMUTE_RAMP */
+#define WM8962_DAC_UNMUTE_RAMP_MASK 0x0008 /* DAC_UNMUTE_RAMP */
+#define WM8962_DAC_UNMUTE_RAMP_SHIFT 3 /* DAC_UNMUTE_RAMP */
+#define WM8962_DAC_UNMUTE_RAMP_WIDTH 1 /* DAC_UNMUTE_RAMP */
+#define WM8962_DAC_MUTERATE 0x0004 /* DAC_MUTERATE */
+#define WM8962_DAC_MUTERATE_MASK 0x0004 /* DAC_MUTERATE */
+#define WM8962_DAC_MUTERATE_SHIFT 2 /* DAC_MUTERATE */
+#define WM8962_DAC_MUTERATE_WIDTH 1 /* DAC_MUTERATE */
+#define WM8962_DAC_HP 0x0001 /* DAC_HP */
+#define WM8962_DAC_HP_MASK 0x0001 /* DAC_HP */
+#define WM8962_DAC_HP_SHIFT 0 /* DAC_HP */
+#define WM8962_DAC_HP_WIDTH 1 /* DAC_HP */
+
+/*
+ * R7 (0x07) - Audio Interface 0
+ */
+#define WM8962_AIFDAC_TDM_MODE 0x1000 /* AIFDAC_TDM_MODE */
+#define WM8962_AIFDAC_TDM_MODE_MASK 0x1000 /* AIFDAC_TDM_MODE */
+#define WM8962_AIFDAC_TDM_MODE_SHIFT 12 /* AIFDAC_TDM_MODE */
+#define WM8962_AIFDAC_TDM_MODE_WIDTH 1 /* AIFDAC_TDM_MODE */
+#define WM8962_AIFDAC_TDM_SLOT 0x0800 /* AIFDAC_TDM_SLOT */
+#define WM8962_AIFDAC_TDM_SLOT_MASK 0x0800 /* AIFDAC_TDM_SLOT */
+#define WM8962_AIFDAC_TDM_SLOT_SHIFT 11 /* AIFDAC_TDM_SLOT */
+#define WM8962_AIFDAC_TDM_SLOT_WIDTH 1 /* AIFDAC_TDM_SLOT */
+#define WM8962_AIFADC_TDM_MODE 0x0400 /* AIFADC_TDM_MODE */
+#define WM8962_AIFADC_TDM_MODE_MASK 0x0400 /* AIFADC_TDM_MODE */
+#define WM8962_AIFADC_TDM_MODE_SHIFT 10 /* AIFADC_TDM_MODE */
+#define WM8962_AIFADC_TDM_MODE_WIDTH 1 /* AIFADC_TDM_MODE */
+#define WM8962_AIFADC_TDM_SLOT 0x0200 /* AIFADC_TDM_SLOT */
+#define WM8962_AIFADC_TDM_SLOT_MASK 0x0200 /* AIFADC_TDM_SLOT */
+#define WM8962_AIFADC_TDM_SLOT_SHIFT 9 /* AIFADC_TDM_SLOT */
+#define WM8962_AIFADC_TDM_SLOT_WIDTH 1 /* AIFADC_TDM_SLOT */
+#define WM8962_ADC_LRSWAP 0x0100 /* ADC_LRSWAP */
+#define WM8962_ADC_LRSWAP_MASK 0x0100 /* ADC_LRSWAP */
+#define WM8962_ADC_LRSWAP_SHIFT 8 /* ADC_LRSWAP */
+#define WM8962_ADC_LRSWAP_WIDTH 1 /* ADC_LRSWAP */
+#define WM8962_BCLK_INV 0x0080 /* BCLK_INV */
+#define WM8962_BCLK_INV_MASK 0x0080 /* BCLK_INV */
+#define WM8962_BCLK_INV_SHIFT 7 /* BCLK_INV */
+#define WM8962_BCLK_INV_WIDTH 1 /* BCLK_INV */
+#define WM8962_MSTR 0x0040 /* MSTR */
+#define WM8962_MSTR_MASK 0x0040 /* MSTR */
+#define WM8962_MSTR_SHIFT 6 /* MSTR */
+#define WM8962_MSTR_WIDTH 1 /* MSTR */
+#define WM8962_DAC_LRSWAP 0x0020 /* DAC_LRSWAP */
+#define WM8962_DAC_LRSWAP_MASK 0x0020 /* DAC_LRSWAP */
+#define WM8962_DAC_LRSWAP_SHIFT 5 /* DAC_LRSWAP */
+#define WM8962_DAC_LRSWAP_WIDTH 1 /* DAC_LRSWAP */
+#define WM8962_LRCLK_INV 0x0010 /* LRCLK_INV */
+#define WM8962_LRCLK_INV_MASK 0x0010 /* LRCLK_INV */
+#define WM8962_LRCLK_INV_SHIFT 4 /* LRCLK_INV */
+#define WM8962_LRCLK_INV_WIDTH 1 /* LRCLK_INV */
+#define WM8962_WL_MASK 0x000C /* WL - [3:2] */
+#define WM8962_WL_SHIFT 2 /* WL - [3:2] */
+#define WM8962_WL_WIDTH 2 /* WL - [3:2] */
+#define WM8962_FMT_MASK 0x0003 /* FMT - [1:0] */
+#define WM8962_FMT_SHIFT 0 /* FMT - [1:0] */
+#define WM8962_FMT_WIDTH 2 /* FMT - [1:0] */
+
+/*
+ * R8 (0x08) - Clocking2
+ */
+#define WM8962_CLKREG_OVD 0x0800 /* CLKREG_OVD */
+#define WM8962_CLKREG_OVD_MASK 0x0800 /* CLKREG_OVD */
+#define WM8962_CLKREG_OVD_SHIFT 11 /* CLKREG_OVD */
+#define WM8962_CLKREG_OVD_WIDTH 1 /* CLKREG_OVD */
+#define WM8962_SYSCLK_SRC_MASK 0x0600 /* SYSCLK_SRC - [10:9] */
+#define WM8962_SYSCLK_SRC_SHIFT 9 /* SYSCLK_SRC - [10:9] */
+#define WM8962_SYSCLK_SRC_WIDTH 2 /* SYSCLK_SRC - [10:9] */
+#define WM8962_CLASSD_CLK_DIV_MASK 0x01C0 /* CLASSD_CLK_DIV - [8:6] */
+#define WM8962_CLASSD_CLK_DIV_SHIFT 6 /* CLASSD_CLK_DIV - [8:6] */
+#define WM8962_CLASSD_CLK_DIV_WIDTH 3 /* CLASSD_CLK_DIV - [8:6] */
+#define WM8962_SYSCLK_ENA 0x0020 /* SYSCLK_ENA */
+#define WM8962_SYSCLK_ENA_MASK 0x0020 /* SYSCLK_ENA */
+#define WM8962_SYSCLK_ENA_SHIFT 5 /* SYSCLK_ENA */
+#define WM8962_SYSCLK_ENA_WIDTH 1 /* SYSCLK_ENA */
+#define WM8962_BCLK_DIV_MASK 0x000F /* BCLK_DIV - [3:0] */
+#define WM8962_BCLK_DIV_SHIFT 0 /* BCLK_DIV - [3:0] */
+#define WM8962_BCLK_DIV_WIDTH 4 /* BCLK_DIV - [3:0] */
+
+/*
+ * R9 (0x09) - Audio Interface 1
+ */
+#define WM8962_AUTOMUTE_STS 0x0800 /* AUTOMUTE_STS */
+#define WM8962_AUTOMUTE_STS_MASK 0x0800 /* AUTOMUTE_STS */
+#define WM8962_AUTOMUTE_STS_SHIFT 11 /* AUTOMUTE_STS */
+#define WM8962_AUTOMUTE_STS_WIDTH 1 /* AUTOMUTE_STS */
+#define WM8962_DAC_AUTOMUTE_SAMPLES_MASK 0x0300 /* DAC_AUTOMUTE_SAMPLES - [9:8] */
+#define WM8962_DAC_AUTOMUTE_SAMPLES_SHIFT 8 /* DAC_AUTOMUTE_SAMPLES - [9:8] */
+#define WM8962_DAC_AUTOMUTE_SAMPLES_WIDTH 2 /* DAC_AUTOMUTE_SAMPLES - [9:8] */
+#define WM8962_DAC_AUTOMUTE 0x0080 /* DAC_AUTOMUTE */
+#define WM8962_DAC_AUTOMUTE_MASK 0x0080 /* DAC_AUTOMUTE */
+#define WM8962_DAC_AUTOMUTE_SHIFT 7 /* DAC_AUTOMUTE */
+#define WM8962_DAC_AUTOMUTE_WIDTH 1 /* DAC_AUTOMUTE */
+#define WM8962_DAC_COMP 0x0010 /* DAC_COMP */
+#define WM8962_DAC_COMP_MASK 0x0010 /* DAC_COMP */
+#define WM8962_DAC_COMP_SHIFT 4 /* DAC_COMP */
+#define WM8962_DAC_COMP_WIDTH 1 /* DAC_COMP */
+#define WM8962_DAC_COMPMODE 0x0008 /* DAC_COMPMODE */
+#define WM8962_DAC_COMPMODE_MASK 0x0008 /* DAC_COMPMODE */
+#define WM8962_DAC_COMPMODE_SHIFT 3 /* DAC_COMPMODE */
+#define WM8962_DAC_COMPMODE_WIDTH 1 /* DAC_COMPMODE */
+#define WM8962_ADC_COMP 0x0004 /* ADC_COMP */
+#define WM8962_ADC_COMP_MASK 0x0004 /* ADC_COMP */
+#define WM8962_ADC_COMP_SHIFT 2 /* ADC_COMP */
+#define WM8962_ADC_COMP_WIDTH 1 /* ADC_COMP */
+#define WM8962_ADC_COMPMODE 0x0002 /* ADC_COMPMODE */
+#define WM8962_ADC_COMPMODE_MASK 0x0002 /* ADC_COMPMODE */
+#define WM8962_ADC_COMPMODE_SHIFT 1 /* ADC_COMPMODE */
+#define WM8962_ADC_COMPMODE_WIDTH 1 /* ADC_COMPMODE */
+#define WM8962_LOOPBACK 0x0001 /* LOOPBACK */
+#define WM8962_LOOPBACK_MASK 0x0001 /* LOOPBACK */
+#define WM8962_LOOPBACK_SHIFT 0 /* LOOPBACK */
+#define WM8962_LOOPBACK_WIDTH 1 /* LOOPBACK */
+
+/*
+ * R10 (0x0A) - Left DAC volume
+ */
+#define WM8962_DAC_VU 0x0100 /* DAC_VU */
+#define WM8962_DAC_VU_MASK 0x0100 /* DAC_VU */
+#define WM8962_DAC_VU_SHIFT 8 /* DAC_VU */
+#define WM8962_DAC_VU_WIDTH 1 /* DAC_VU */
+#define WM8962_DACL_VOL_MASK 0x00FF /* DACL_VOL - [7:0] */
+#define WM8962_DACL_VOL_SHIFT 0 /* DACL_VOL - [7:0] */
+#define WM8962_DACL_VOL_WIDTH 8 /* DACL_VOL - [7:0] */
+
+/*
+ * R11 (0x0B) - Right DAC volume
+ */
+#define WM8962_DAC_VU 0x0100 /* DAC_VU */
+#define WM8962_DAC_VU_MASK 0x0100 /* DAC_VU */
+#define WM8962_DAC_VU_SHIFT 8 /* DAC_VU */
+#define WM8962_DAC_VU_WIDTH 1 /* DAC_VU */
+#define WM8962_DACR_VOL_MASK 0x00FF /* DACR_VOL - [7:0] */
+#define WM8962_DACR_VOL_SHIFT 0 /* DACR_VOL - [7:0] */
+#define WM8962_DACR_VOL_WIDTH 8 /* DACR_VOL - [7:0] */
+
+/*
+ * R14 (0x0E) - Audio Interface 2
+ */
+#define WM8962_AIF_RATE_MASK 0x07FF /* AIF_RATE - [10:0] */
+#define WM8962_AIF_RATE_SHIFT 0 /* AIF_RATE - [10:0] */
+#define WM8962_AIF_RATE_WIDTH 11 /* AIF_RATE - [10:0] */
+
+/*
+ * R15 (0x0F) - Software Reset
+ */
+#define WM8962_SW_RESET_MASK 0xFFFF /* SW_RESET - [15:0] */
+#define WM8962_SW_RESET_SHIFT 0 /* SW_RESET - [15:0] */
+#define WM8962_SW_RESET_WIDTH 16 /* SW_RESET - [15:0] */
+
+/*
+ * R17 (0x11) - ALC1
+ */
+#define WM8962_ALC_INACTIVE_ENA 0x0400 /* ALC_INACTIVE_ENA */
+#define WM8962_ALC_INACTIVE_ENA_MASK 0x0400 /* ALC_INACTIVE_ENA */
+#define WM8962_ALC_INACTIVE_ENA_SHIFT 10 /* ALC_INACTIVE_ENA */
+#define WM8962_ALC_INACTIVE_ENA_WIDTH 1 /* ALC_INACTIVE_ENA */
+#define WM8962_ALC_LVL_MODE 0x0200 /* ALC_LVL_MODE */
+#define WM8962_ALC_LVL_MODE_MASK 0x0200 /* ALC_LVL_MODE */
+#define WM8962_ALC_LVL_MODE_SHIFT 9 /* ALC_LVL_MODE */
+#define WM8962_ALC_LVL_MODE_WIDTH 1 /* ALC_LVL_MODE */
+#define WM8962_ALCL_ENA 0x0100 /* ALCL_ENA */
+#define WM8962_ALCL_ENA_MASK 0x0100 /* ALCL_ENA */
+#define WM8962_ALCL_ENA_SHIFT 8 /* ALCL_ENA */
+#define WM8962_ALCL_ENA_WIDTH 1 /* ALCL_ENA */
+#define WM8962_ALCR_ENA 0x0080 /* ALCR_ENA */
+#define WM8962_ALCR_ENA_MASK 0x0080 /* ALCR_ENA */
+#define WM8962_ALCR_ENA_SHIFT 7 /* ALCR_ENA */
+#define WM8962_ALCR_ENA_WIDTH 1 /* ALCR_ENA */
+#define WM8962_ALC_MAXGAIN_MASK 0x0070 /* ALC_MAXGAIN - [6:4] */
+#define WM8962_ALC_MAXGAIN_SHIFT 4 /* ALC_MAXGAIN - [6:4] */
+#define WM8962_ALC_MAXGAIN_WIDTH 3 /* ALC_MAXGAIN - [6:4] */
+#define WM8962_ALC_LVL_MASK 0x000F /* ALC_LVL - [3:0] */
+#define WM8962_ALC_LVL_SHIFT 0 /* ALC_LVL - [3:0] */
+#define WM8962_ALC_LVL_WIDTH 4 /* ALC_LVL - [3:0] */
+
+/*
+ * R18 (0x12) - ALC2
+ */
+#define WM8962_ALC_LOCK_STS 0x8000 /* ALC_LOCK_STS */
+#define WM8962_ALC_LOCK_STS_MASK 0x8000 /* ALC_LOCK_STS */
+#define WM8962_ALC_LOCK_STS_SHIFT 15 /* ALC_LOCK_STS */
+#define WM8962_ALC_LOCK_STS_WIDTH 1 /* ALC_LOCK_STS */
+#define WM8962_ALC_THRESH_STS 0x4000 /* ALC_THRESH_STS */
+#define WM8962_ALC_THRESH_STS_MASK 0x4000 /* ALC_THRESH_STS */
+#define WM8962_ALC_THRESH_STS_SHIFT 14 /* ALC_THRESH_STS */
+#define WM8962_ALC_THRESH_STS_WIDTH 1 /* ALC_THRESH_STS */
+#define WM8962_ALC_SAT_STS 0x2000 /* ALC_SAT_STS */
+#define WM8962_ALC_SAT_STS_MASK 0x2000 /* ALC_SAT_STS */
+#define WM8962_ALC_SAT_STS_SHIFT 13 /* ALC_SAT_STS */
+#define WM8962_ALC_SAT_STS_WIDTH 1 /* ALC_SAT_STS */
+#define WM8962_ALC_PKOVR_STS 0x1000 /* ALC_PKOVR_STS */
+#define WM8962_ALC_PKOVR_STS_MASK 0x1000 /* ALC_PKOVR_STS */
+#define WM8962_ALC_PKOVR_STS_SHIFT 12 /* ALC_PKOVR_STS */
+#define WM8962_ALC_PKOVR_STS_WIDTH 1 /* ALC_PKOVR_STS */
+#define WM8962_ALC_NGATE_STS 0x0800 /* ALC_NGATE_STS */
+#define WM8962_ALC_NGATE_STS_MASK 0x0800 /* ALC_NGATE_STS */
+#define WM8962_ALC_NGATE_STS_SHIFT 11 /* ALC_NGATE_STS */
+#define WM8962_ALC_NGATE_STS_WIDTH 1 /* ALC_NGATE_STS */
+#define WM8962_ALC_ZC 0x0080 /* ALC_ZC */
+#define WM8962_ALC_ZC_MASK 0x0080 /* ALC_ZC */
+#define WM8962_ALC_ZC_SHIFT 7 /* ALC_ZC */
+#define WM8962_ALC_ZC_WIDTH 1 /* ALC_ZC */
+#define WM8962_ALC_MINGAIN_MASK 0x0070 /* ALC_MINGAIN - [6:4] */
+#define WM8962_ALC_MINGAIN_SHIFT 4 /* ALC_MINGAIN - [6:4] */
+#define WM8962_ALC_MINGAIN_WIDTH 3 /* ALC_MINGAIN - [6:4] */
+#define WM8962_ALC_HLD_MASK 0x000F /* ALC_HLD - [3:0] */
+#define WM8962_ALC_HLD_SHIFT 0 /* ALC_HLD - [3:0] */
+#define WM8962_ALC_HLD_WIDTH 4 /* ALC_HLD - [3:0] */
+
+/*
+ * R19 (0x13) - ALC3
+ */
+#define WM8962_ALC_NGATE_GAIN_MASK 0x1C00 /* ALC_NGATE_GAIN - [12:10] */
+#define WM8962_ALC_NGATE_GAIN_SHIFT 10 /* ALC_NGATE_GAIN - [12:10] */
+#define WM8962_ALC_NGATE_GAIN_WIDTH 3 /* ALC_NGATE_GAIN - [12:10] */
+#define WM8962_ALC_MODE 0x0100 /* ALC_MODE */
+#define WM8962_ALC_MODE_MASK 0x0100 /* ALC_MODE */
+#define WM8962_ALC_MODE_SHIFT 8 /* ALC_MODE */
+#define WM8962_ALC_MODE_WIDTH 1 /* ALC_MODE */
+#define WM8962_ALC_DCY_MASK 0x00F0 /* ALC_DCY - [7:4] */
+#define WM8962_ALC_DCY_SHIFT 4 /* ALC_DCY - [7:4] */
+#define WM8962_ALC_DCY_WIDTH 4 /* ALC_DCY - [7:4] */
+#define WM8962_ALC_ATK_MASK 0x000F /* ALC_ATK - [3:0] */
+#define WM8962_ALC_ATK_SHIFT 0 /* ALC_ATK - [3:0] */
+#define WM8962_ALC_ATK_WIDTH 4 /* ALC_ATK - [3:0] */
+
+/*
+ * R20 (0x14) - Noise Gate
+ */
+#define WM8962_ALC_NGATE_DCY_MASK 0xF000 /* ALC_NGATE_DCY - [15:12] */
+#define WM8962_ALC_NGATE_DCY_SHIFT 12 /* ALC_NGATE_DCY - [15:12] */
+#define WM8962_ALC_NGATE_DCY_WIDTH 4 /* ALC_NGATE_DCY - [15:12] */
+#define WM8962_ALC_NGATE_ATK_MASK 0x0F00 /* ALC_NGATE_ATK - [11:8] */
+#define WM8962_ALC_NGATE_ATK_SHIFT 8 /* ALC_NGATE_ATK - [11:8] */
+#define WM8962_ALC_NGATE_ATK_WIDTH 4 /* ALC_NGATE_ATK - [11:8] */
+#define WM8962_ALC_NGATE_THR_MASK 0x00F8 /* ALC_NGATE_THR - [7:3] */
+#define WM8962_ALC_NGATE_THR_SHIFT 3 /* ALC_NGATE_THR - [7:3] */
+#define WM8962_ALC_NGATE_THR_WIDTH 5 /* ALC_NGATE_THR - [7:3] */
+#define WM8962_ALC_NGATE_MODE_MASK 0x0006 /* ALC_NGATE_MODE - [2:1] */
+#define WM8962_ALC_NGATE_MODE_SHIFT 1 /* ALC_NGATE_MODE - [2:1] */
+#define WM8962_ALC_NGATE_MODE_WIDTH 2 /* ALC_NGATE_MODE - [2:1] */
+#define WM8962_ALC_NGATE_ENA 0x0001 /* ALC_NGATE_ENA */
+#define WM8962_ALC_NGATE_ENA_MASK 0x0001 /* ALC_NGATE_ENA */
+#define WM8962_ALC_NGATE_ENA_SHIFT 0 /* ALC_NGATE_ENA */
+#define WM8962_ALC_NGATE_ENA_WIDTH 1 /* ALC_NGATE_ENA */
+
+/*
+ * R21 (0x15) - Left ADC volume
+ */
+#define WM8962_ADC_VU 0x0100 /* ADC_VU */
+#define WM8962_ADC_VU_MASK 0x0100 /* ADC_VU */
+#define WM8962_ADC_VU_SHIFT 8 /* ADC_VU */
+#define WM8962_ADC_VU_WIDTH 1 /* ADC_VU */
+#define WM8962_ADCL_VOL_MASK 0x00FF /* ADCL_VOL - [7:0] */
+#define WM8962_ADCL_VOL_SHIFT 0 /* ADCL_VOL - [7:0] */
+#define WM8962_ADCL_VOL_WIDTH 8 /* ADCL_VOL - [7:0] */
+
+/*
+ * R22 (0x16) - Right ADC volume
+ */
+#define WM8962_ADC_VU 0x0100 /* ADC_VU */
+#define WM8962_ADC_VU_MASK 0x0100 /* ADC_VU */
+#define WM8962_ADC_VU_SHIFT 8 /* ADC_VU */
+#define WM8962_ADC_VU_WIDTH 1 /* ADC_VU */
+#define WM8962_ADCR_VOL_MASK 0x00FF /* ADCR_VOL - [7:0] */
+#define WM8962_ADCR_VOL_SHIFT 0 /* ADCR_VOL - [7:0] */
+#define WM8962_ADCR_VOL_WIDTH 8 /* ADCR_VOL - [7:0] */
+
+/*
+ * R23 (0x17) - Additional control(1)
+ */
+#define WM8962_THERR_ACT 0x0100 /* THERR_ACT */
+#define WM8962_THERR_ACT_MASK 0x0100 /* THERR_ACT */
+#define WM8962_THERR_ACT_SHIFT 8 /* THERR_ACT */
+#define WM8962_THERR_ACT_WIDTH 1 /* THERR_ACT */
+#define WM8962_ADC_BIAS 0x0040 /* ADC_BIAS */
+#define WM8962_ADC_BIAS_MASK 0x0040 /* ADC_BIAS */
+#define WM8962_ADC_BIAS_SHIFT 6 /* ADC_BIAS */
+#define WM8962_ADC_BIAS_WIDTH 1 /* ADC_BIAS */
+#define WM8962_ADC_HP 0x0020 /* ADC_HP */
+#define WM8962_ADC_HP_MASK 0x0020 /* ADC_HP */
+#define WM8962_ADC_HP_SHIFT 5 /* ADC_HP */
+#define WM8962_ADC_HP_WIDTH 1 /* ADC_HP */
+#define WM8962_TOCLK_ENA 0x0001 /* TOCLK_ENA */
+#define WM8962_TOCLK_ENA_MASK 0x0001 /* TOCLK_ENA */
+#define WM8962_TOCLK_ENA_SHIFT 0 /* TOCLK_ENA */
+#define WM8962_TOCLK_ENA_WIDTH 1 /* TOCLK_ENA */
+
+/*
+ * R24 (0x18) - Additional control(2)
+ */
+#define WM8962_AIF_TRI 0x0008 /* AIF_TRI */
+#define WM8962_AIF_TRI_MASK 0x0008 /* AIF_TRI */
+#define WM8962_AIF_TRI_SHIFT 3 /* AIF_TRI */
+#define WM8962_AIF_TRI_WIDTH 1 /* AIF_TRI */
+
+/*
+ * R25 (0x19) - Pwr Mgmt (1)
+ */
+#define WM8962_DMIC_ENA 0x0400 /* DMIC_ENA */
+#define WM8962_DMIC_ENA_MASK 0x0400 /* DMIC_ENA */
+#define WM8962_DMIC_ENA_SHIFT 10 /* DMIC_ENA */
+#define WM8962_DMIC_ENA_WIDTH 1 /* DMIC_ENA */
+#define WM8962_OPCLK_ENA 0x0200 /* OPCLK_ENA */
+#define WM8962_OPCLK_ENA_MASK 0x0200 /* OPCLK_ENA */
+#define WM8962_OPCLK_ENA_SHIFT 9 /* OPCLK_ENA */
+#define WM8962_OPCLK_ENA_WIDTH 1 /* OPCLK_ENA */
+#define WM8962_VMID_SEL_MASK 0x0180 /* VMID_SEL - [8:7] */
+#define WM8962_VMID_SEL_SHIFT 7 /* VMID_SEL - [8:7] */
+#define WM8962_VMID_SEL_WIDTH 2 /* VMID_SEL - [8:7] */
+#define WM8962_BIAS_ENA 0x0040 /* BIAS_ENA */
+#define WM8962_BIAS_ENA_MASK 0x0040 /* BIAS_ENA */
+#define WM8962_BIAS_ENA_SHIFT 6 /* BIAS_ENA */
+#define WM8962_BIAS_ENA_WIDTH 1 /* BIAS_ENA */
+#define WM8962_INL_ENA 0x0020 /* INL_ENA */
+#define WM8962_INL_ENA_MASK 0x0020 /* INL_ENA */
+#define WM8962_INL_ENA_SHIFT 5 /* INL_ENA */
+#define WM8962_INL_ENA_WIDTH 1 /* INL_ENA */
+#define WM8962_INR_ENA 0x0010 /* INR_ENA */
+#define WM8962_INR_ENA_MASK 0x0010 /* INR_ENA */
+#define WM8962_INR_ENA_SHIFT 4 /* INR_ENA */
+#define WM8962_INR_ENA_WIDTH 1 /* INR_ENA */
+#define WM8962_ADCL_ENA 0x0008 /* ADCL_ENA */
+#define WM8962_ADCL_ENA_MASK 0x0008 /* ADCL_ENA */
+#define WM8962_ADCL_ENA_SHIFT 3 /* ADCL_ENA */
+#define WM8962_ADCL_ENA_WIDTH 1 /* ADCL_ENA */
+#define WM8962_ADCR_ENA 0x0004 /* ADCR_ENA */
+#define WM8962_ADCR_ENA_MASK 0x0004 /* ADCR_ENA */
+#define WM8962_ADCR_ENA_SHIFT 2 /* ADCR_ENA */
+#define WM8962_ADCR_ENA_WIDTH 1 /* ADCR_ENA */
+#define WM8962_MICBIAS_ENA 0x0002 /* MICBIAS_ENA */
+#define WM8962_MICBIAS_ENA_MASK 0x0002 /* MICBIAS_ENA */
+#define WM8962_MICBIAS_ENA_SHIFT 1 /* MICBIAS_ENA */
+#define WM8962_MICBIAS_ENA_WIDTH 1 /* MICBIAS_ENA */
+
+/*
+ * R26 (0x1A) - Pwr Mgmt (2)
+ */
+#define WM8962_DACL_ENA 0x0100 /* DACL_ENA */
+#define WM8962_DACL_ENA_MASK 0x0100 /* DACL_ENA */
+#define WM8962_DACL_ENA_SHIFT 8 /* DACL_ENA */
+#define WM8962_DACL_ENA_WIDTH 1 /* DACL_ENA */
+#define WM8962_DACR_ENA 0x0080 /* DACR_ENA */
+#define WM8962_DACR_ENA_MASK 0x0080 /* DACR_ENA */
+#define WM8962_DACR_ENA_SHIFT 7 /* DACR_ENA */
+#define WM8962_DACR_ENA_WIDTH 1 /* DACR_ENA */
+#define WM8962_HPOUTL_PGA_ENA 0x0040 /* HPOUTL_PGA_ENA */
+#define WM8962_HPOUTL_PGA_ENA_MASK 0x0040 /* HPOUTL_PGA_ENA */
+#define WM8962_HPOUTL_PGA_ENA_SHIFT 6 /* HPOUTL_PGA_ENA */
+#define WM8962_HPOUTL_PGA_ENA_WIDTH 1 /* HPOUTL_PGA_ENA */
+#define WM8962_HPOUTR_PGA_ENA 0x0020 /* HPOUTR_PGA_ENA */
+#define WM8962_HPOUTR_PGA_ENA_MASK 0x0020 /* HPOUTR_PGA_ENA */
+#define WM8962_HPOUTR_PGA_ENA_SHIFT 5 /* HPOUTR_PGA_ENA */
+#define WM8962_HPOUTR_PGA_ENA_WIDTH 1 /* HPOUTR_PGA_ENA */
+#define WM8962_SPKOUTL_PGA_ENA 0x0010 /* SPKOUTL_PGA_ENA */
+#define WM8962_SPKOUTL_PGA_ENA_MASK 0x0010 /* SPKOUTL_PGA_ENA */
+#define WM8962_SPKOUTL_PGA_ENA_SHIFT 4 /* SPKOUTL_PGA_ENA */
+#define WM8962_SPKOUTL_PGA_ENA_WIDTH 1 /* SPKOUTL_PGA_ENA */
+#define WM8962_SPKOUTR_PGA_ENA 0x0008 /* SPKOUTR_PGA_ENA */
+#define WM8962_SPKOUTR_PGA_ENA_MASK 0x0008 /* SPKOUTR_PGA_ENA */
+#define WM8962_SPKOUTR_PGA_ENA_SHIFT 3 /* SPKOUTR_PGA_ENA */
+#define WM8962_SPKOUTR_PGA_ENA_WIDTH 1 /* SPKOUTR_PGA_ENA */
+#define WM8962_HPOUTL_PGA_MUTE 0x0002 /* HPOUTL_PGA_MUTE */
+#define WM8962_HPOUTL_PGA_MUTE_MASK 0x0002 /* HPOUTL_PGA_MUTE */
+#define WM8962_HPOUTL_PGA_MUTE_SHIFT 1 /* HPOUTL_PGA_MUTE */
+#define WM8962_HPOUTL_PGA_MUTE_WIDTH 1 /* HPOUTL_PGA_MUTE */
+#define WM8962_HPOUTR_PGA_MUTE 0x0001 /* HPOUTR_PGA_MUTE */
+#define WM8962_HPOUTR_PGA_MUTE_MASK 0x0001 /* HPOUTR_PGA_MUTE */
+#define WM8962_HPOUTR_PGA_MUTE_SHIFT 0 /* HPOUTR_PGA_MUTE */
+#define WM8962_HPOUTR_PGA_MUTE_WIDTH 1 /* HPOUTR_PGA_MUTE */
+
+/*
+ * R27 (0x1B) - Additional Control (3)
+ */
+#define WM8962_SAMPLE_RATE_INT_MODE 0x0010 /* SAMPLE_RATE_INT_MODE */
+#define WM8962_SAMPLE_RATE_INT_MODE_MASK 0x0010 /* SAMPLE_RATE_INT_MODE */
+#define WM8962_SAMPLE_RATE_INT_MODE_SHIFT 4 /* SAMPLE_RATE_INT_MODE */
+#define WM8962_SAMPLE_RATE_INT_MODE_WIDTH 1 /* SAMPLE_RATE_INT_MODE */
+#define WM8962_SAMPLE_RATE_MASK 0x0007 /* SAMPLE_RATE - [2:0] */
+#define WM8962_SAMPLE_RATE_SHIFT 0 /* SAMPLE_RATE - [2:0] */
+#define WM8962_SAMPLE_RATE_WIDTH 3 /* SAMPLE_RATE - [2:0] */
+
+/*
+ * R28 (0x1C) - Anti-pop
+ */
+#define WM8962_STARTUP_BIAS_ENA 0x0010 /* STARTUP_BIAS_ENA */
+#define WM8962_STARTUP_BIAS_ENA_MASK 0x0010 /* STARTUP_BIAS_ENA */
+#define WM8962_STARTUP_BIAS_ENA_SHIFT 4 /* STARTUP_BIAS_ENA */
+#define WM8962_STARTUP_BIAS_ENA_WIDTH 1 /* STARTUP_BIAS_ENA */
+#define WM8962_VMID_BUF_ENA 0x0008 /* VMID_BUF_ENA */
+#define WM8962_VMID_BUF_ENA_MASK 0x0008 /* VMID_BUF_ENA */
+#define WM8962_VMID_BUF_ENA_SHIFT 3 /* VMID_BUF_ENA */
+#define WM8962_VMID_BUF_ENA_WIDTH 1 /* VMID_BUF_ENA */
+#define WM8962_VMID_RAMP 0x0004 /* VMID_RAMP */
+#define WM8962_VMID_RAMP_MASK 0x0004 /* VMID_RAMP */
+#define WM8962_VMID_RAMP_SHIFT 2 /* VMID_RAMP */
+#define WM8962_VMID_RAMP_WIDTH 1 /* VMID_RAMP */
+
+/*
+ * R30 (0x1E) - Clocking 3
+ */
+#define WM8962_DBCLK_DIV_MASK 0xE000 /* DBCLK_DIV - [15:13] */
+#define WM8962_DBCLK_DIV_SHIFT 13 /* DBCLK_DIV - [15:13] */
+#define WM8962_DBCLK_DIV_WIDTH 3 /* DBCLK_DIV - [15:13] */
+#define WM8962_OPCLK_DIV_MASK 0x1C00 /* OPCLK_DIV - [12:10] */
+#define WM8962_OPCLK_DIV_SHIFT 10 /* OPCLK_DIV - [12:10] */
+#define WM8962_OPCLK_DIV_WIDTH 3 /* OPCLK_DIV - [12:10] */
+#define WM8962_TOCLK_DIV_MASK 0x0380 /* TOCLK_DIV - [9:7] */
+#define WM8962_TOCLK_DIV_SHIFT 7 /* TOCLK_DIV - [9:7] */
+#define WM8962_TOCLK_DIV_WIDTH 3 /* TOCLK_DIV - [9:7] */
+#define WM8962_F256KCLK_DIV_MASK 0x007E /* F256KCLK_DIV - [6:1] */
+#define WM8962_F256KCLK_DIV_SHIFT 1 /* F256KCLK_DIV - [6:1] */
+#define WM8962_F256KCLK_DIV_WIDTH 6 /* F256KCLK_DIV - [6:1] */
+
+/*
+ * R31 (0x1F) - Input mixer control (1)
+ */
+#define WM8962_MIXINL_MUTE 0x0008 /* MIXINL_MUTE */
+#define WM8962_MIXINL_MUTE_MASK 0x0008 /* MIXINL_MUTE */
+#define WM8962_MIXINL_MUTE_SHIFT 3 /* MIXINL_MUTE */
+#define WM8962_MIXINL_MUTE_WIDTH 1 /* MIXINL_MUTE */
+#define WM8962_MIXINR_MUTE 0x0004 /* MIXINR_MUTE */
+#define WM8962_MIXINR_MUTE_MASK 0x0004 /* MIXINR_MUTE */
+#define WM8962_MIXINR_MUTE_SHIFT 2 /* MIXINR_MUTE */
+#define WM8962_MIXINR_MUTE_WIDTH 1 /* MIXINR_MUTE */
+#define WM8962_MIXINL_ENA 0x0002 /* MIXINL_ENA */
+#define WM8962_MIXINL_ENA_MASK 0x0002 /* MIXINL_ENA */
+#define WM8962_MIXINL_ENA_SHIFT 1 /* MIXINL_ENA */
+#define WM8962_MIXINL_ENA_WIDTH 1 /* MIXINL_ENA */
+#define WM8962_MIXINR_ENA 0x0001 /* MIXINR_ENA */
+#define WM8962_MIXINR_ENA_MASK 0x0001 /* MIXINR_ENA */
+#define WM8962_MIXINR_ENA_SHIFT 0 /* MIXINR_ENA */
+#define WM8962_MIXINR_ENA_WIDTH 1 /* MIXINR_ENA */
+
+/*
+ * R32 (0x20) - Left input mixer volume
+ */
+#define WM8962_IN2L_MIXINL_VOL_MASK 0x01C0 /* IN2L_MIXINL_VOL - [8:6] */
+#define WM8962_IN2L_MIXINL_VOL_SHIFT 6 /* IN2L_MIXINL_VOL - [8:6] */
+#define WM8962_IN2L_MIXINL_VOL_WIDTH 3 /* IN2L_MIXINL_VOL - [8:6] */
+#define WM8962_INPGAL_MIXINL_VOL_MASK 0x0038 /* INPGAL_MIXINL_VOL - [5:3] */
+#define WM8962_INPGAL_MIXINL_VOL_SHIFT 3 /* INPGAL_MIXINL_VOL - [5:3] */
+#define WM8962_INPGAL_MIXINL_VOL_WIDTH 3 /* INPGAL_MIXINL_VOL - [5:3] */
+#define WM8962_IN3L_MIXINL_VOL_MASK 0x0007 /* IN3L_MIXINL_VOL - [2:0] */
+#define WM8962_IN3L_MIXINL_VOL_SHIFT 0 /* IN3L_MIXINL_VOL - [2:0] */
+#define WM8962_IN3L_MIXINL_VOL_WIDTH 3 /* IN3L_MIXINL_VOL - [2:0] */
+
+/*
+ * R33 (0x21) - Right input mixer volume
+ */
+#define WM8962_IN2R_MIXINR_VOL_MASK 0x01C0 /* IN2R_MIXINR_VOL - [8:6] */
+#define WM8962_IN2R_MIXINR_VOL_SHIFT 6 /* IN2R_MIXINR_VOL - [8:6] */
+#define WM8962_IN2R_MIXINR_VOL_WIDTH 3 /* IN2R_MIXINR_VOL - [8:6] */
+#define WM8962_INPGAR_MIXINR_VOL_MASK 0x0038 /* INPGAR_MIXINR_VOL - [5:3] */
+#define WM8962_INPGAR_MIXINR_VOL_SHIFT 3 /* INPGAR_MIXINR_VOL - [5:3] */
+#define WM8962_INPGAR_MIXINR_VOL_WIDTH 3 /* INPGAR_MIXINR_VOL - [5:3] */
+#define WM8962_IN3R_MIXINR_VOL_MASK 0x0007 /* IN3R_MIXINR_VOL - [2:0] */
+#define WM8962_IN3R_MIXINR_VOL_SHIFT 0 /* IN3R_MIXINR_VOL - [2:0] */
+#define WM8962_IN3R_MIXINR_VOL_WIDTH 3 /* IN3R_MIXINR_VOL - [2:0] */
+
+/*
+ * R34 (0x22) - Input mixer control (2)
+ */
+#define WM8962_IN2L_TO_MIXINL 0x0020 /* IN2L_TO_MIXINL */
+#define WM8962_IN2L_TO_MIXINL_MASK 0x0020 /* IN2L_TO_MIXINL */
+#define WM8962_IN2L_TO_MIXINL_SHIFT 5 /* IN2L_TO_MIXINL */
+#define WM8962_IN2L_TO_MIXINL_WIDTH 1 /* IN2L_TO_MIXINL */
+#define WM8962_IN3L_TO_MIXINL 0x0010 /* IN3L_TO_MIXINL */
+#define WM8962_IN3L_TO_MIXINL_MASK 0x0010 /* IN3L_TO_MIXINL */
+#define WM8962_IN3L_TO_MIXINL_SHIFT 4 /* IN3L_TO_MIXINL */
+#define WM8962_IN3L_TO_MIXINL_WIDTH 1 /* IN3L_TO_MIXINL */
+#define WM8962_INPGAL_TO_MIXINL 0x0008 /* INPGAL_TO_MIXINL */
+#define WM8962_INPGAL_TO_MIXINL_MASK 0x0008 /* INPGAL_TO_MIXINL */
+#define WM8962_INPGAL_TO_MIXINL_SHIFT 3 /* INPGAL_TO_MIXINL */
+#define WM8962_INPGAL_TO_MIXINL_WIDTH 1 /* INPGAL_TO_MIXINL */
+#define WM8962_IN2R_TO_MIXINR 0x0004 /* IN2R_TO_MIXINR */
+#define WM8962_IN2R_TO_MIXINR_MASK 0x0004 /* IN2R_TO_MIXINR */
+#define WM8962_IN2R_TO_MIXINR_SHIFT 2 /* IN2R_TO_MIXINR */
+#define WM8962_IN2R_TO_MIXINR_WIDTH 1 /* IN2R_TO_MIXINR */
+#define WM8962_IN3R_TO_MIXINR 0x0002 /* IN3R_TO_MIXINR */
+#define WM8962_IN3R_TO_MIXINR_MASK 0x0002 /* IN3R_TO_MIXINR */
+#define WM8962_IN3R_TO_MIXINR_SHIFT 1 /* IN3R_TO_MIXINR */
+#define WM8962_IN3R_TO_MIXINR_WIDTH 1 /* IN3R_TO_MIXINR */
+#define WM8962_INPGAR_TO_MIXINR 0x0001 /* INPGAR_TO_MIXINR */
+#define WM8962_INPGAR_TO_MIXINR_MASK 0x0001 /* INPGAR_TO_MIXINR */
+#define WM8962_INPGAR_TO_MIXINR_SHIFT 0 /* INPGAR_TO_MIXINR */
+#define WM8962_INPGAR_TO_MIXINR_WIDTH 1 /* INPGAR_TO_MIXINR */
+
+/*
+ * R35 (0x23) - Input bias control
+ */
+#define WM8962_MIXIN_BIAS_MASK 0x0038 /* MIXIN_BIAS - [5:3] */
+#define WM8962_MIXIN_BIAS_SHIFT 3 /* MIXIN_BIAS - [5:3] */
+#define WM8962_MIXIN_BIAS_WIDTH 3 /* MIXIN_BIAS - [5:3] */
+#define WM8962_INPGA_BIAS_MASK 0x0007 /* INPGA_BIAS - [2:0] */
+#define WM8962_INPGA_BIAS_SHIFT 0 /* INPGA_BIAS - [2:0] */
+#define WM8962_INPGA_BIAS_WIDTH 3 /* INPGA_BIAS - [2:0] */
+
+/*
+ * R37 (0x25) - Left input PGA control
+ */
+#define WM8962_INPGAL_ENA 0x0010 /* INPGAL_ENA */
+#define WM8962_INPGAL_ENA_MASK 0x0010 /* INPGAL_ENA */
+#define WM8962_INPGAL_ENA_SHIFT 4 /* INPGAL_ENA */
+#define WM8962_INPGAL_ENA_WIDTH 1 /* INPGAL_ENA */
+#define WM8962_IN1L_TO_INPGAL 0x0008 /* IN1L_TO_INPGAL */
+#define WM8962_IN1L_TO_INPGAL_MASK 0x0008 /* IN1L_TO_INPGAL */
+#define WM8962_IN1L_TO_INPGAL_SHIFT 3 /* IN1L_TO_INPGAL */
+#define WM8962_IN1L_TO_INPGAL_WIDTH 1 /* IN1L_TO_INPGAL */
+#define WM8962_IN2L_TO_INPGAL 0x0004 /* IN2L_TO_INPGAL */
+#define WM8962_IN2L_TO_INPGAL_MASK 0x0004 /* IN2L_TO_INPGAL */
+#define WM8962_IN2L_TO_INPGAL_SHIFT 2 /* IN2L_TO_INPGAL */
+#define WM8962_IN2L_TO_INPGAL_WIDTH 1 /* IN2L_TO_INPGAL */
+#define WM8962_IN3L_TO_INPGAL 0x0002 /* IN3L_TO_INPGAL */
+#define WM8962_IN3L_TO_INPGAL_MASK 0x0002 /* IN3L_TO_INPGAL */
+#define WM8962_IN3L_TO_INPGAL_SHIFT 1 /* IN3L_TO_INPGAL */
+#define WM8962_IN3L_TO_INPGAL_WIDTH 1 /* IN3L_TO_INPGAL */
+#define WM8962_IN4L_TO_INPGAL 0x0001 /* IN4L_TO_INPGAL */
+#define WM8962_IN4L_TO_INPGAL_MASK 0x0001 /* IN4L_TO_INPGAL */
+#define WM8962_IN4L_TO_INPGAL_SHIFT 0 /* IN4L_TO_INPGAL */
+#define WM8962_IN4L_TO_INPGAL_WIDTH 1 /* IN4L_TO_INPGAL */
+
+/*
+ * R38 (0x26) - Right input PGA control
+ */
+#define WM8962_INPGAR_ENA 0x0010 /* INPGAR_ENA */
+#define WM8962_INPGAR_ENA_MASK 0x0010 /* INPGAR_ENA */
+#define WM8962_INPGAR_ENA_SHIFT 4 /* INPGAR_ENA */
+#define WM8962_INPGAR_ENA_WIDTH 1 /* INPGAR_ENA */
+#define WM8962_IN1R_TO_INPGAR 0x0008 /* IN1R_TO_INPGAR */
+#define WM8962_IN1R_TO_INPGAR_MASK 0x0008 /* IN1R_TO_INPGAR */
+#define WM8962_IN1R_TO_INPGAR_SHIFT 3 /* IN1R_TO_INPGAR */
+#define WM8962_IN1R_TO_INPGAR_WIDTH 1 /* IN1R_TO_INPGAR */
+#define WM8962_IN2R_TO_INPGAR 0x0004 /* IN2R_TO_INPGAR */
+#define WM8962_IN2R_TO_INPGAR_MASK 0x0004 /* IN2R_TO_INPGAR */
+#define WM8962_IN2R_TO_INPGAR_SHIFT 2 /* IN2R_TO_INPGAR */
+#define WM8962_IN2R_TO_INPGAR_WIDTH 1 /* IN2R_TO_INPGAR */
+#define WM8962_IN3R_TO_INPGAR 0x0002 /* IN3R_TO_INPGAR */
+#define WM8962_IN3R_TO_INPGAR_MASK 0x0002 /* IN3R_TO_INPGAR */
+#define WM8962_IN3R_TO_INPGAR_SHIFT 1 /* IN3R_TO_INPGAR */
+#define WM8962_IN3R_TO_INPGAR_WIDTH 1 /* IN3R_TO_INPGAR */
+#define WM8962_IN4R_TO_INPGAR 0x0001 /* IN4R_TO_INPGAR */
+#define WM8962_IN4R_TO_INPGAR_MASK 0x0001 /* IN4R_TO_INPGAR */
+#define WM8962_IN4R_TO_INPGAR_SHIFT 0 /* IN4R_TO_INPGAR */
+#define WM8962_IN4R_TO_INPGAR_WIDTH 1 /* IN4R_TO_INPGAR */
+
+/*
+ * R40 (0x28) - SPKOUTL volume
+ */
+#define WM8962_SPKOUT_VU 0x0100 /* SPKOUT_VU */
+#define WM8962_SPKOUT_VU_MASK 0x0100 /* SPKOUT_VU */
+#define WM8962_SPKOUT_VU_SHIFT 8 /* SPKOUT_VU */
+#define WM8962_SPKOUT_VU_WIDTH 1 /* SPKOUT_VU */
+#define WM8962_SPKOUTL_ZC 0x0080 /* SPKOUTL_ZC */
+#define WM8962_SPKOUTL_ZC_MASK 0x0080 /* SPKOUTL_ZC */
+#define WM8962_SPKOUTL_ZC_SHIFT 7 /* SPKOUTL_ZC */
+#define WM8962_SPKOUTL_ZC_WIDTH 1 /* SPKOUTL_ZC */
+#define WM8962_SPKOUTL_VOL_MASK 0x007F /* SPKOUTL_VOL - [6:0] */
+#define WM8962_SPKOUTL_VOL_SHIFT 0 /* SPKOUTL_VOL - [6:0] */
+#define WM8962_SPKOUTL_VOL_WIDTH 7 /* SPKOUTL_VOL - [6:0] */
+
+/*
+ * R41 (0x29) - SPKOUTR volume
+ */
+#define WM8962_SPKOUTR_ZC 0x0080 /* SPKOUTR_ZC */
+#define WM8962_SPKOUTR_ZC_MASK 0x0080 /* SPKOUTR_ZC */
+#define WM8962_SPKOUTR_ZC_SHIFT 7 /* SPKOUTR_ZC */
+#define WM8962_SPKOUTR_ZC_WIDTH 1 /* SPKOUTR_ZC */
+#define WM8962_SPKOUTR_VOL_MASK 0x007F /* SPKOUTR_VOL - [6:0] */
+#define WM8962_SPKOUTR_VOL_SHIFT 0 /* SPKOUTR_VOL - [6:0] */
+#define WM8962_SPKOUTR_VOL_WIDTH 7 /* SPKOUTR_VOL - [6:0] */
+
+/*
+ * R47 (0x2F) - Thermal Shutdown Status
+ */
+#define WM8962_TEMP_ERR_HP 0x0008 /* TEMP_ERR_HP */
+#define WM8962_TEMP_ERR_HP_MASK 0x0008 /* TEMP_ERR_HP */
+#define WM8962_TEMP_ERR_HP_SHIFT 3 /* TEMP_ERR_HP */
+#define WM8962_TEMP_ERR_HP_WIDTH 1 /* TEMP_ERR_HP */
+#define WM8962_TEMP_WARN_HP 0x0004 /* TEMP_WARN_HP */
+#define WM8962_TEMP_WARN_HP_MASK 0x0004 /* TEMP_WARN_HP */
+#define WM8962_TEMP_WARN_HP_SHIFT 2 /* TEMP_WARN_HP */
+#define WM8962_TEMP_WARN_HP_WIDTH 1 /* TEMP_WARN_HP */
+#define WM8962_TEMP_ERR_SPK 0x0002 /* TEMP_ERR_SPK */
+#define WM8962_TEMP_ERR_SPK_MASK 0x0002 /* TEMP_ERR_SPK */
+#define WM8962_TEMP_ERR_SPK_SHIFT 1 /* TEMP_ERR_SPK */
+#define WM8962_TEMP_ERR_SPK_WIDTH 1 /* TEMP_ERR_SPK */
+#define WM8962_TEMP_WARN_SPK 0x0001 /* TEMP_WARN_SPK */
+#define WM8962_TEMP_WARN_SPK_MASK 0x0001 /* TEMP_WARN_SPK */
+#define WM8962_TEMP_WARN_SPK_SHIFT 0 /* TEMP_WARN_SPK */
+#define WM8962_TEMP_WARN_SPK_WIDTH 1 /* TEMP_WARN_SPK */
+
+/*
+ * R48 (0x30) - Additional Control (4)
+ */
+#define WM8962_MICDET_THR_MASK 0x7000 /* MICDET_THR - [14:12] */
+#define WM8962_MICDET_THR_SHIFT 12 /* MICDET_THR - [14:12] */
+#define WM8962_MICDET_THR_WIDTH 3 /* MICDET_THR - [14:12] */
+#define WM8962_MICSHORT_THR_MASK 0x0C00 /* MICSHORT_THR - [11:10] */
+#define WM8962_MICSHORT_THR_SHIFT 10 /* MICSHORT_THR - [11:10] */
+#define WM8962_MICSHORT_THR_WIDTH 2 /* MICSHORT_THR - [11:10] */
+#define WM8962_MICDET_ENA 0x0200 /* MICDET_ENA */
+#define WM8962_MICDET_ENA_MASK 0x0200 /* MICDET_ENA */
+#define WM8962_MICDET_ENA_SHIFT 9 /* MICDET_ENA */
+#define WM8962_MICDET_ENA_WIDTH 1 /* MICDET_ENA */
+#define WM8962_MICDET_STS 0x0080 /* MICDET_STS */
+#define WM8962_MICDET_STS_MASK 0x0080 /* MICDET_STS */
+#define WM8962_MICDET_STS_SHIFT 7 /* MICDET_STS */
+#define WM8962_MICDET_STS_WIDTH 1 /* MICDET_STS */
+#define WM8962_MICSHORT_STS 0x0040 /* MICSHORT_STS */
+#define WM8962_MICSHORT_STS_MASK 0x0040 /* MICSHORT_STS */
+#define WM8962_MICSHORT_STS_SHIFT 6 /* MICSHORT_STS */
+#define WM8962_MICSHORT_STS_WIDTH 1 /* MICSHORT_STS */
+#define WM8962_TEMP_ENA_HP 0x0004 /* TEMP_ENA_HP */
+#define WM8962_TEMP_ENA_HP_MASK 0x0004 /* TEMP_ENA_HP */
+#define WM8962_TEMP_ENA_HP_SHIFT 2 /* TEMP_ENA_HP */
+#define WM8962_TEMP_ENA_HP_WIDTH 1 /* TEMP_ENA_HP */
+#define WM8962_TEMP_ENA_SPK 0x0002 /* TEMP_ENA_SPK */
+#define WM8962_TEMP_ENA_SPK_MASK 0x0002 /* TEMP_ENA_SPK */
+#define WM8962_TEMP_ENA_SPK_SHIFT 1 /* TEMP_ENA_SPK */
+#define WM8962_TEMP_ENA_SPK_WIDTH 1 /* TEMP_ENA_SPK */
+#define WM8962_MICBIAS_LVL 0x0001 /* MICBIAS_LVL */
+#define WM8962_MICBIAS_LVL_MASK 0x0001 /* MICBIAS_LVL */
+#define WM8962_MICBIAS_LVL_SHIFT 0 /* MICBIAS_LVL */
+#define WM8962_MICBIAS_LVL_WIDTH 1 /* MICBIAS_LVL */
+
+/*
+ * R49 (0x31) - Class D Control 1
+ */
+#define WM8962_SPKOUTR_ENA 0x0080 /* SPKOUTR_ENA */
+#define WM8962_SPKOUTR_ENA_MASK 0x0080 /* SPKOUTR_ENA */
+#define WM8962_SPKOUTR_ENA_SHIFT 7 /* SPKOUTR_ENA */
+#define WM8962_SPKOUTR_ENA_WIDTH 1 /* SPKOUTR_ENA */
+#define WM8962_SPKOUTL_ENA 0x0040 /* SPKOUTL_ENA */
+#define WM8962_SPKOUTL_ENA_MASK 0x0040 /* SPKOUTL_ENA */
+#define WM8962_SPKOUTL_ENA_SHIFT 6 /* SPKOUTL_ENA */
+#define WM8962_SPKOUTL_ENA_WIDTH 1 /* SPKOUTL_ENA */
+#define WM8962_SPKOUTL_PGA_MUTE 0x0002 /* SPKOUTL_PGA_MUTE */
+#define WM8962_SPKOUTL_PGA_MUTE_MASK 0x0002 /* SPKOUTL_PGA_MUTE */
+#define WM8962_SPKOUTL_PGA_MUTE_SHIFT 1 /* SPKOUTL_PGA_MUTE */
+#define WM8962_SPKOUTL_PGA_MUTE_WIDTH 1 /* SPKOUTL_PGA_MUTE */
+#define WM8962_SPKOUTR_PGA_MUTE 0x0001 /* SPKOUTR_PGA_MUTE */
+#define WM8962_SPKOUTR_PGA_MUTE_MASK 0x0001 /* SPKOUTR_PGA_MUTE */
+#define WM8962_SPKOUTR_PGA_MUTE_SHIFT 0 /* SPKOUTR_PGA_MUTE */
+#define WM8962_SPKOUTR_PGA_MUTE_WIDTH 1 /* SPKOUTR_PGA_MUTE */
+
+/*
+ * R51 (0x33) - Class D Control 2
+ */
+#define WM8962_SPK_MONO 0x0040 /* SPK_MONO */
+#define WM8962_SPK_MONO_MASK 0x0040 /* SPK_MONO */
+#define WM8962_SPK_MONO_SHIFT 6 /* SPK_MONO */
+#define WM8962_SPK_MONO_WIDTH 1 /* SPK_MONO */
+#define WM8962_CLASSD_VOL_MASK 0x0007 /* CLASSD_VOL - [2:0] */
+#define WM8962_CLASSD_VOL_SHIFT 0 /* CLASSD_VOL - [2:0] */
+#define WM8962_CLASSD_VOL_WIDTH 3 /* CLASSD_VOL - [2:0] */
+
+/*
+ * R56 (0x38) - Clocking 4
+ */
+#define WM8962_SYSCLK_RATE_MASK 0x001E /* SYSCLK_RATE - [4:1] */
+#define WM8962_SYSCLK_RATE_SHIFT 1 /* SYSCLK_RATE - [4:1] */
+#define WM8962_SYSCLK_RATE_WIDTH 4 /* SYSCLK_RATE - [4:1] */
+
+/*
+ * R57 (0x39) - DAC DSP Mixing (1)
+ */
+#define WM8962_DAC_MONOMIX 0x0200 /* DAC_MONOMIX */
+#define WM8962_DAC_MONOMIX_MASK 0x0200 /* DAC_MONOMIX */
+#define WM8962_DAC_MONOMIX_SHIFT 9 /* DAC_MONOMIX */
+#define WM8962_DAC_MONOMIX_WIDTH 1 /* DAC_MONOMIX */
+#define WM8962_ADCR_DAC_SVOL_MASK 0x00F0 /* ADCR_DAC_SVOL - [7:4] */
+#define WM8962_ADCR_DAC_SVOL_SHIFT 4 /* ADCR_DAC_SVOL - [7:4] */
+#define WM8962_ADCR_DAC_SVOL_WIDTH 4 /* ADCR_DAC_SVOL - [7:4] */
+#define WM8962_ADC_TO_DACR_MASK 0x000C /* ADC_TO_DACR - [3:2] */
+#define WM8962_ADC_TO_DACR_SHIFT 2 /* ADC_TO_DACR - [3:2] */
+#define WM8962_ADC_TO_DACR_WIDTH 2 /* ADC_TO_DACR - [3:2] */
+
+/*
+ * R58 (0x3A) - DAC DSP Mixing (2)
+ */
+#define WM8962_ADCL_DAC_SVOL_MASK 0x00F0 /* ADCL_DAC_SVOL - [7:4] */
+#define WM8962_ADCL_DAC_SVOL_SHIFT 4 /* ADCL_DAC_SVOL - [7:4] */
+#define WM8962_ADCL_DAC_SVOL_WIDTH 4 /* ADCL_DAC_SVOL - [7:4] */
+#define WM8962_ADC_TO_DACL_MASK 0x000C /* ADC_TO_DACL - [3:2] */
+#define WM8962_ADC_TO_DACL_SHIFT 2 /* ADC_TO_DACL - [3:2] */
+#define WM8962_ADC_TO_DACL_WIDTH 2 /* ADC_TO_DACL - [3:2] */
+
+/*
+ * R60 (0x3C) - DC Servo 0
+ */
+#define WM8962_INL_DCS_ENA 0x0080 /* INL_DCS_ENA */
+#define WM8962_INL_DCS_ENA_MASK 0x0080 /* INL_DCS_ENA */
+#define WM8962_INL_DCS_ENA_SHIFT 7 /* INL_DCS_ENA */
+#define WM8962_INL_DCS_ENA_WIDTH 1 /* INL_DCS_ENA */
+#define WM8962_INL_DCS_STARTUP 0x0040 /* INL_DCS_STARTUP */
+#define WM8962_INL_DCS_STARTUP_MASK 0x0040 /* INL_DCS_STARTUP */
+#define WM8962_INL_DCS_STARTUP_SHIFT 6 /* INL_DCS_STARTUP */
+#define WM8962_INL_DCS_STARTUP_WIDTH 1 /* INL_DCS_STARTUP */
+#define WM8962_INR_DCS_ENA 0x0008 /* INR_DCS_ENA */
+#define WM8962_INR_DCS_ENA_MASK 0x0008 /* INR_DCS_ENA */
+#define WM8962_INR_DCS_ENA_SHIFT 3 /* INR_DCS_ENA */
+#define WM8962_INR_DCS_ENA_WIDTH 1 /* INR_DCS_ENA */
+#define WM8962_INR_DCS_STARTUP 0x0004 /* INR_DCS_STARTUP */
+#define WM8962_INR_DCS_STARTUP_MASK 0x0004 /* INR_DCS_STARTUP */
+#define WM8962_INR_DCS_STARTUP_SHIFT 2 /* INR_DCS_STARTUP */
+#define WM8962_INR_DCS_STARTUP_WIDTH 1 /* INR_DCS_STARTUP */
+
+/*
+ * R61 (0x3D) - DC Servo 1
+ */
+#define WM8962_HP1L_DCS_ENA 0x0080 /* HP1L_DCS_ENA */
+#define WM8962_HP1L_DCS_ENA_MASK 0x0080 /* HP1L_DCS_ENA */
+#define WM8962_HP1L_DCS_ENA_SHIFT 7 /* HP1L_DCS_ENA */
+#define WM8962_HP1L_DCS_ENA_WIDTH 1 /* HP1L_DCS_ENA */
+#define WM8962_HP1L_DCS_STARTUP 0x0040 /* HP1L_DCS_STARTUP */
+#define WM8962_HP1L_DCS_STARTUP_MASK 0x0040 /* HP1L_DCS_STARTUP */
+#define WM8962_HP1L_DCS_STARTUP_SHIFT 6 /* HP1L_DCS_STARTUP */
+#define WM8962_HP1L_DCS_STARTUP_WIDTH 1 /* HP1L_DCS_STARTUP */
+#define WM8962_HP1L_DCS_SYNC 0x0010 /* HP1L_DCS_SYNC */
+#define WM8962_HP1L_DCS_SYNC_MASK 0x0010 /* HP1L_DCS_SYNC */
+#define WM8962_HP1L_DCS_SYNC_SHIFT 4 /* HP1L_DCS_SYNC */
+#define WM8962_HP1L_DCS_SYNC_WIDTH 1 /* HP1L_DCS_SYNC */
+#define WM8962_HP1R_DCS_ENA 0x0008 /* HP1R_DCS_ENA */
+#define WM8962_HP1R_DCS_ENA_MASK 0x0008 /* HP1R_DCS_ENA */
+#define WM8962_HP1R_DCS_ENA_SHIFT 3 /* HP1R_DCS_ENA */
+#define WM8962_HP1R_DCS_ENA_WIDTH 1 /* HP1R_DCS_ENA */
+#define WM8962_HP1R_DCS_STARTUP 0x0004 /* HP1R_DCS_STARTUP */
+#define WM8962_HP1R_DCS_STARTUP_MASK 0x0004 /* HP1R_DCS_STARTUP */
+#define WM8962_HP1R_DCS_STARTUP_SHIFT 2 /* HP1R_DCS_STARTUP */
+#define WM8962_HP1R_DCS_STARTUP_WIDTH 1 /* HP1R_DCS_STARTUP */
+#define WM8962_HP1R_DCS_SYNC 0x0001 /* HP1R_DCS_SYNC */
+#define WM8962_HP1R_DCS_SYNC_MASK 0x0001 /* HP1R_DCS_SYNC */
+#define WM8962_HP1R_DCS_SYNC_SHIFT 0 /* HP1R_DCS_SYNC */
+#define WM8962_HP1R_DCS_SYNC_WIDTH 1 /* HP1R_DCS_SYNC */
+
+/*
+ * R64 (0x40) - DC Servo 4
+ */
+#define WM8962_HP1_DCS_SYNC_STEPS_MASK 0x3F80 /* HP1_DCS_SYNC_STEPS - [13:7] */
+#define WM8962_HP1_DCS_SYNC_STEPS_SHIFT 7 /* HP1_DCS_SYNC_STEPS - [13:7] */
+#define WM8962_HP1_DCS_SYNC_STEPS_WIDTH 7 /* HP1_DCS_SYNC_STEPS - [13:7] */
+
+/*
+ * R66 (0x42) - DC Servo 6
+ */
+#define WM8962_DCS_STARTUP_DONE_INL 0x0400 /* DCS_STARTUP_DONE_INL */
+#define WM8962_DCS_STARTUP_DONE_INL_MASK 0x0400 /* DCS_STARTUP_DONE_INL */
+#define WM8962_DCS_STARTUP_DONE_INL_SHIFT 10 /* DCS_STARTUP_DONE_INL */
+#define WM8962_DCS_STARTUP_DONE_INL_WIDTH 1 /* DCS_STARTUP_DONE_INL */
+#define WM8962_DCS_STARTUP_DONE_INR 0x0200 /* DCS_STARTUP_DONE_INR */
+#define WM8962_DCS_STARTUP_DONE_INR_MASK 0x0200 /* DCS_STARTUP_DONE_INR */
+#define WM8962_DCS_STARTUP_DONE_INR_SHIFT 9 /* DCS_STARTUP_DONE_INR */
+#define WM8962_DCS_STARTUP_DONE_INR_WIDTH 1 /* DCS_STARTUP_DONE_INR */
+#define WM8962_DCS_STARTUP_DONE_HP1L 0x0100 /* DCS_STARTUP_DONE_HP1L */
+#define WM8962_DCS_STARTUP_DONE_HP1L_MASK 0x0100 /* DCS_STARTUP_DONE_HP1L */
+#define WM8962_DCS_STARTUP_DONE_HP1L_SHIFT 8 /* DCS_STARTUP_DONE_HP1L */
+#define WM8962_DCS_STARTUP_DONE_HP1L_WIDTH 1 /* DCS_STARTUP_DONE_HP1L */
+#define WM8962_DCS_STARTUP_DONE_HP1R 0x0080 /* DCS_STARTUP_DONE_HP1R */
+#define WM8962_DCS_STARTUP_DONE_HP1R_MASK 0x0080 /* DCS_STARTUP_DONE_HP1R */
+#define WM8962_DCS_STARTUP_DONE_HP1R_SHIFT 7 /* DCS_STARTUP_DONE_HP1R */
+#define WM8962_DCS_STARTUP_DONE_HP1R_WIDTH 1 /* DCS_STARTUP_DONE_HP1R */
+
+/*
+ * R68 (0x44) - Analogue PGA Bias
+ */
+#define WM8962_HP_PGAS_BIAS_MASK 0x0007 /* HP_PGAS_BIAS - [2:0] */
+#define WM8962_HP_PGAS_BIAS_SHIFT 0 /* HP_PGAS_BIAS - [2:0] */
+#define WM8962_HP_PGAS_BIAS_WIDTH 3 /* HP_PGAS_BIAS - [2:0] */
+
+/*
+ * R69 (0x45) - Analogue HP 0
+ */
+#define WM8962_HP1L_RMV_SHORT 0x0080 /* HP1L_RMV_SHORT */
+#define WM8962_HP1L_RMV_SHORT_MASK 0x0080 /* HP1L_RMV_SHORT */
+#define WM8962_HP1L_RMV_SHORT_SHIFT 7 /* HP1L_RMV_SHORT */
+#define WM8962_HP1L_RMV_SHORT_WIDTH 1 /* HP1L_RMV_SHORT */
+#define WM8962_HP1L_ENA_OUTP 0x0040 /* HP1L_ENA_OUTP */
+#define WM8962_HP1L_ENA_OUTP_MASK 0x0040 /* HP1L_ENA_OUTP */
+#define WM8962_HP1L_ENA_OUTP_SHIFT 6 /* HP1L_ENA_OUTP */
+#define WM8962_HP1L_ENA_OUTP_WIDTH 1 /* HP1L_ENA_OUTP */
+#define WM8962_HP1L_ENA_DLY 0x0020 /* HP1L_ENA_DLY */
+#define WM8962_HP1L_ENA_DLY_MASK 0x0020 /* HP1L_ENA_DLY */
+#define WM8962_HP1L_ENA_DLY_SHIFT 5 /* HP1L_ENA_DLY */
+#define WM8962_HP1L_ENA_DLY_WIDTH 1 /* HP1L_ENA_DLY */
+#define WM8962_HP1L_ENA 0x0010 /* HP1L_ENA */
+#define WM8962_HP1L_ENA_MASK 0x0010 /* HP1L_ENA */
+#define WM8962_HP1L_ENA_SHIFT 4 /* HP1L_ENA */
+#define WM8962_HP1L_ENA_WIDTH 1 /* HP1L_ENA */
+#define WM8962_HP1R_RMV_SHORT 0x0008 /* HP1R_RMV_SHORT */
+#define WM8962_HP1R_RMV_SHORT_MASK 0x0008 /* HP1R_RMV_SHORT */
+#define WM8962_HP1R_RMV_SHORT_SHIFT 3 /* HP1R_RMV_SHORT */
+#define WM8962_HP1R_RMV_SHORT_WIDTH 1 /* HP1R_RMV_SHORT */
+#define WM8962_HP1R_ENA_OUTP 0x0004 /* HP1R_ENA_OUTP */
+#define WM8962_HP1R_ENA_OUTP_MASK 0x0004 /* HP1R_ENA_OUTP */
+#define WM8962_HP1R_ENA_OUTP_SHIFT 2 /* HP1R_ENA_OUTP */
+#define WM8962_HP1R_ENA_OUTP_WIDTH 1 /* HP1R_ENA_OUTP */
+#define WM8962_HP1R_ENA_DLY 0x0002 /* HP1R_ENA_DLY */
+#define WM8962_HP1R_ENA_DLY_MASK 0x0002 /* HP1R_ENA_DLY */
+#define WM8962_HP1R_ENA_DLY_SHIFT 1 /* HP1R_ENA_DLY */
+#define WM8962_HP1R_ENA_DLY_WIDTH 1 /* HP1R_ENA_DLY */
+#define WM8962_HP1R_ENA 0x0001 /* HP1R_ENA */
+#define WM8962_HP1R_ENA_MASK 0x0001 /* HP1R_ENA */
+#define WM8962_HP1R_ENA_SHIFT 0 /* HP1R_ENA */
+#define WM8962_HP1R_ENA_WIDTH 1 /* HP1R_ENA */
+
+/*
+ * R71 (0x47) - Analogue HP 2
+ */
+#define WM8962_HP1L_VOL_MASK 0x01C0 /* HP1L_VOL - [8:6] */
+#define WM8962_HP1L_VOL_SHIFT 6 /* HP1L_VOL - [8:6] */
+#define WM8962_HP1L_VOL_WIDTH 3 /* HP1L_VOL - [8:6] */
+#define WM8962_HP1R_VOL_MASK 0x0038 /* HP1R_VOL - [5:3] */
+#define WM8962_HP1R_VOL_SHIFT 3 /* HP1R_VOL - [5:3] */
+#define WM8962_HP1R_VOL_WIDTH 3 /* HP1R_VOL - [5:3] */
+#define WM8962_HP_BIAS_BOOST_MASK 0x0007 /* HP_BIAS_BOOST - [2:0] */
+#define WM8962_HP_BIAS_BOOST_SHIFT 0 /* HP_BIAS_BOOST - [2:0] */
+#define WM8962_HP_BIAS_BOOST_WIDTH 3 /* HP_BIAS_BOOST - [2:0] */
+
+/*
+ * R72 (0x48) - Charge Pump 1
+ */
+#define WM8962_CP_ENA 0x0001 /* CP_ENA */
+#define WM8962_CP_ENA_MASK 0x0001 /* CP_ENA */
+#define WM8962_CP_ENA_SHIFT 0 /* CP_ENA */
+#define WM8962_CP_ENA_WIDTH 1 /* CP_ENA */
+
+/*
+ * R82 (0x52) - Charge Pump B
+ */
+#define WM8962_CP_DYN_PWR 0x0001 /* CP_DYN_PWR */
+#define WM8962_CP_DYN_PWR_MASK 0x0001 /* CP_DYN_PWR */
+#define WM8962_CP_DYN_PWR_SHIFT 0 /* CP_DYN_PWR */
+#define WM8962_CP_DYN_PWR_WIDTH 1 /* CP_DYN_PWR */
+
+/*
+ * R87 (0x57) - Write Sequencer Control 1
+ */
+#define WM8962_WSEQ_AUTOSEQ_ENA 0x0080 /* WSEQ_AUTOSEQ_ENA */
+#define WM8962_WSEQ_AUTOSEQ_ENA_MASK 0x0080 /* WSEQ_AUTOSEQ_ENA */
+#define WM8962_WSEQ_AUTOSEQ_ENA_SHIFT 7 /* WSEQ_AUTOSEQ_ENA */
+#define WM8962_WSEQ_AUTOSEQ_ENA_WIDTH 1 /* WSEQ_AUTOSEQ_ENA */
+#define WM8962_WSEQ_ENA 0x0020 /* WSEQ_ENA */
+#define WM8962_WSEQ_ENA_MASK 0x0020 /* WSEQ_ENA */
+#define WM8962_WSEQ_ENA_SHIFT 5 /* WSEQ_ENA */
+#define WM8962_WSEQ_ENA_WIDTH 1 /* WSEQ_ENA */
+
+/*
+ * R90 (0x5A) - Write Sequencer Control 2
+ */
+#define WM8962_WSEQ_ABORT 0x0100 /* WSEQ_ABORT */
+#define WM8962_WSEQ_ABORT_MASK 0x0100 /* WSEQ_ABORT */
+#define WM8962_WSEQ_ABORT_SHIFT 8 /* WSEQ_ABORT */
+#define WM8962_WSEQ_ABORT_WIDTH 1 /* WSEQ_ABORT */
+#define WM8962_WSEQ_START 0x0080 /* WSEQ_START */
+#define WM8962_WSEQ_START_MASK 0x0080 /* WSEQ_START */
+#define WM8962_WSEQ_START_SHIFT 7 /* WSEQ_START */
+#define WM8962_WSEQ_START_WIDTH 1 /* WSEQ_START */
+#define WM8962_WSEQ_START_INDEX_MASK 0x007F /* WSEQ_START_INDEX - [6:0] */
+#define WM8962_WSEQ_START_INDEX_SHIFT 0 /* WSEQ_START_INDEX - [6:0] */
+#define WM8962_WSEQ_START_INDEX_WIDTH 7 /* WSEQ_START_INDEX - [6:0] */
+
+/*
+ * R93 (0x5D) - Write Sequencer Control 3
+ */
+#define WM8962_WSEQ_CURRENT_INDEX_MASK 0x03F8 /* WSEQ_CURRENT_INDEX - [9:3] */
+#define WM8962_WSEQ_CURRENT_INDEX_SHIFT 3 /* WSEQ_CURRENT_INDEX - [9:3] */
+#define WM8962_WSEQ_CURRENT_INDEX_WIDTH 7 /* WSEQ_CURRENT_INDEX - [9:3] */
+#define WM8962_WSEQ_BUSY 0x0001 /* WSEQ_BUSY */
+#define WM8962_WSEQ_BUSY_MASK 0x0001 /* WSEQ_BUSY */
+#define WM8962_WSEQ_BUSY_SHIFT 0 /* WSEQ_BUSY */
+#define WM8962_WSEQ_BUSY_WIDTH 1 /* WSEQ_BUSY */
+
+/*
+ * R94 (0x5E) - Control Interface
+ */
+#define WM8962_SPI_CONTRD 0x0040 /* SPI_CONTRD */
+#define WM8962_SPI_CONTRD_MASK 0x0040 /* SPI_CONTRD */
+#define WM8962_SPI_CONTRD_SHIFT 6 /* SPI_CONTRD */
+#define WM8962_SPI_CONTRD_WIDTH 1 /* SPI_CONTRD */
+#define WM8962_SPI_4WIRE 0x0020 /* SPI_4WIRE */
+#define WM8962_SPI_4WIRE_MASK 0x0020 /* SPI_4WIRE */
+#define WM8962_SPI_4WIRE_SHIFT 5 /* SPI_4WIRE */
+#define WM8962_SPI_4WIRE_WIDTH 1 /* SPI_4WIRE */
+#define WM8962_SPI_CFG 0x0010 /* SPI_CFG */
+#define WM8962_SPI_CFG_MASK 0x0010 /* SPI_CFG */
+#define WM8962_SPI_CFG_SHIFT 4 /* SPI_CFG */
+#define WM8962_SPI_CFG_WIDTH 1 /* SPI_CFG */
+
+/*
+ * R99 (0x63) - Mixer Enables
+ */
+#define WM8962_HPMIXL_ENA 0x0008 /* HPMIXL_ENA */
+#define WM8962_HPMIXL_ENA_MASK 0x0008 /* HPMIXL_ENA */
+#define WM8962_HPMIXL_ENA_SHIFT 3 /* HPMIXL_ENA */
+#define WM8962_HPMIXL_ENA_WIDTH 1 /* HPMIXL_ENA */
+#define WM8962_HPMIXR_ENA 0x0004 /* HPMIXR_ENA */
+#define WM8962_HPMIXR_ENA_MASK 0x0004 /* HPMIXR_ENA */
+#define WM8962_HPMIXR_ENA_SHIFT 2 /* HPMIXR_ENA */
+#define WM8962_HPMIXR_ENA_WIDTH 1 /* HPMIXR_ENA */
+#define WM8962_SPKMIXL_ENA 0x0002 /* SPKMIXL_ENA */
+#define WM8962_SPKMIXL_ENA_MASK 0x0002 /* SPKMIXL_ENA */
+#define WM8962_SPKMIXL_ENA_SHIFT 1 /* SPKMIXL_ENA */
+#define WM8962_SPKMIXL_ENA_WIDTH 1 /* SPKMIXL_ENA */
+#define WM8962_SPKMIXR_ENA 0x0001 /* SPKMIXR_ENA */
+#define WM8962_SPKMIXR_ENA_MASK 0x0001 /* SPKMIXR_ENA */
+#define WM8962_SPKMIXR_ENA_SHIFT 0 /* SPKMIXR_ENA */
+#define WM8962_SPKMIXR_ENA_WIDTH 1 /* SPKMIXR_ENA */
+
+/*
+ * R100 (0x64) - Headphone Mixer (1)
+ */
+#define WM8962_HPMIXL_TO_HPOUTL_PGA 0x0080 /* HPMIXL_TO_HPOUTL_PGA */
+#define WM8962_HPMIXL_TO_HPOUTL_PGA_MASK 0x0080 /* HPMIXL_TO_HPOUTL_PGA */
+#define WM8962_HPMIXL_TO_HPOUTL_PGA_SHIFT 7 /* HPMIXL_TO_HPOUTL_PGA */
+#define WM8962_HPMIXL_TO_HPOUTL_PGA_WIDTH 1 /* HPMIXL_TO_HPOUTL_PGA */
+#define WM8962_DACL_TO_HPMIXL 0x0020 /* DACL_TO_HPMIXL */
+#define WM8962_DACL_TO_HPMIXL_MASK 0x0020 /* DACL_TO_HPMIXL */
+#define WM8962_DACL_TO_HPMIXL_SHIFT 5 /* DACL_TO_HPMIXL */
+#define WM8962_DACL_TO_HPMIXL_WIDTH 1 /* DACL_TO_HPMIXL */
+#define WM8962_DACR_TO_HPMIXL 0x0010 /* DACR_TO_HPMIXL */
+#define WM8962_DACR_TO_HPMIXL_MASK 0x0010 /* DACR_TO_HPMIXL */
+#define WM8962_DACR_TO_HPMIXL_SHIFT 4 /* DACR_TO_HPMIXL */
+#define WM8962_DACR_TO_HPMIXL_WIDTH 1 /* DACR_TO_HPMIXL */
+#define WM8962_MIXINL_TO_HPMIXL 0x0008 /* MIXINL_TO_HPMIXL */
+#define WM8962_MIXINL_TO_HPMIXL_MASK 0x0008 /* MIXINL_TO_HPMIXL */
+#define WM8962_MIXINL_TO_HPMIXL_SHIFT 3 /* MIXINL_TO_HPMIXL */
+#define WM8962_MIXINL_TO_HPMIXL_WIDTH 1 /* MIXINL_TO_HPMIXL */
+#define WM8962_MIXINR_TO_HPMIXL 0x0004 /* MIXINR_TO_HPMIXL */
+#define WM8962_MIXINR_TO_HPMIXL_MASK 0x0004 /* MIXINR_TO_HPMIXL */
+#define WM8962_MIXINR_TO_HPMIXL_SHIFT 2 /* MIXINR_TO_HPMIXL */
+#define WM8962_MIXINR_TO_HPMIXL_WIDTH 1 /* MIXINR_TO_HPMIXL */
+#define WM8962_IN4L_TO_HPMIXL 0x0002 /* IN4L_TO_HPMIXL */
+#define WM8962_IN4L_TO_HPMIXL_MASK 0x0002 /* IN4L_TO_HPMIXL */
+#define WM8962_IN4L_TO_HPMIXL_SHIFT 1 /* IN4L_TO_HPMIXL */
+#define WM8962_IN4L_TO_HPMIXL_WIDTH 1 /* IN4L_TO_HPMIXL */
+#define WM8962_IN4R_TO_HPMIXL 0x0001 /* IN4R_TO_HPMIXL */
+#define WM8962_IN4R_TO_HPMIXL_MASK 0x0001 /* IN4R_TO_HPMIXL */
+#define WM8962_IN4R_TO_HPMIXL_SHIFT 0 /* IN4R_TO_HPMIXL */
+#define WM8962_IN4R_TO_HPMIXL_WIDTH 1 /* IN4R_TO_HPMIXL */
+
+/*
+ * R101 (0x65) - Headphone Mixer (2)
+ */
+#define WM8962_HPMIXR_TO_HPOUTR_PGA 0x0080 /* HPMIXR_TO_HPOUTR_PGA */
+#define WM8962_HPMIXR_TO_HPOUTR_PGA_MASK 0x0080 /* HPMIXR_TO_HPOUTR_PGA */
+#define WM8962_HPMIXR_TO_HPOUTR_PGA_SHIFT 7 /* HPMIXR_TO_HPOUTR_PGA */
+#define WM8962_HPMIXR_TO_HPOUTR_PGA_WIDTH 1 /* HPMIXR_TO_HPOUTR_PGA */
+#define WM8962_DACL_TO_HPMIXR 0x0020 /* DACL_TO_HPMIXR */
+#define WM8962_DACL_TO_HPMIXR_MASK 0x0020 /* DACL_TO_HPMIXR */
+#define WM8962_DACL_TO_HPMIXR_SHIFT 5 /* DACL_TO_HPMIXR */
+#define WM8962_DACL_TO_HPMIXR_WIDTH 1 /* DACL_TO_HPMIXR */
+#define WM8962_DACR_TO_HPMIXR 0x0010 /* DACR_TO_HPMIXR */
+#define WM8962_DACR_TO_HPMIXR_MASK 0x0010 /* DACR_TO_HPMIXR */
+#define WM8962_DACR_TO_HPMIXR_SHIFT 4 /* DACR_TO_HPMIXR */
+#define WM8962_DACR_TO_HPMIXR_WIDTH 1 /* DACR_TO_HPMIXR */
+#define WM8962_MIXINL_TO_HPMIXR 0x0008 /* MIXINL_TO_HPMIXR */
+#define WM8962_MIXINL_TO_HPMIXR_MASK 0x0008 /* MIXINL_TO_HPMIXR */
+#define WM8962_MIXINL_TO_HPMIXR_SHIFT 3 /* MIXINL_TO_HPMIXR */
+#define WM8962_MIXINL_TO_HPMIXR_WIDTH 1 /* MIXINL_TO_HPMIXR */
+#define WM8962_MIXINR_TO_HPMIXR 0x0004 /* MIXINR_TO_HPMIXR */
+#define WM8962_MIXINR_TO_HPMIXR_MASK 0x0004 /* MIXINR_TO_HPMIXR */
+#define WM8962_MIXINR_TO_HPMIXR_SHIFT 2 /* MIXINR_TO_HPMIXR */
+#define WM8962_MIXINR_TO_HPMIXR_WIDTH 1 /* MIXINR_TO_HPMIXR */
+#define WM8962_IN4L_TO_HPMIXR 0x0002 /* IN4L_TO_HPMIXR */
+#define WM8962_IN4L_TO_HPMIXR_MASK 0x0002 /* IN4L_TO_HPMIXR */
+#define WM8962_IN4L_TO_HPMIXR_SHIFT 1 /* IN4L_TO_HPMIXR */
+#define WM8962_IN4L_TO_HPMIXR_WIDTH 1 /* IN4L_TO_HPMIXR */
+#define WM8962_IN4R_TO_HPMIXR 0x0001 /* IN4R_TO_HPMIXR */
+#define WM8962_IN4R_TO_HPMIXR_MASK 0x0001 /* IN4R_TO_HPMIXR */
+#define WM8962_IN4R_TO_HPMIXR_SHIFT 0 /* IN4R_TO_HPMIXR */
+#define WM8962_IN4R_TO_HPMIXR_WIDTH 1 /* IN4R_TO_HPMIXR */
+
+/*
+ * R102 (0x66) - Headphone Mixer (3)
+ */
+#define WM8962_HPMIXL_MUTE 0x0100 /* HPMIXL_MUTE */
+#define WM8962_HPMIXL_MUTE_MASK 0x0100 /* HPMIXL_MUTE */
+#define WM8962_HPMIXL_MUTE_SHIFT 8 /* HPMIXL_MUTE */
+#define WM8962_HPMIXL_MUTE_WIDTH 1 /* HPMIXL_MUTE */
+#define WM8962_MIXINL_HPMIXL_VOL 0x0080 /* MIXINL_HPMIXL_VOL */
+#define WM8962_MIXINL_HPMIXL_VOL_MASK 0x0080 /* MIXINL_HPMIXL_VOL */
+#define WM8962_MIXINL_HPMIXL_VOL_SHIFT 7 /* MIXINL_HPMIXL_VOL */
+#define WM8962_MIXINL_HPMIXL_VOL_WIDTH 1 /* MIXINL_HPMIXL_VOL */
+#define WM8962_MIXINR_HPMIXL_VOL 0x0040 /* MIXINR_HPMIXL_VOL */
+#define WM8962_MIXINR_HPMIXL_VOL_MASK 0x0040 /* MIXINR_HPMIXL_VOL */
+#define WM8962_MIXINR_HPMIXL_VOL_SHIFT 6 /* MIXINR_HPMIXL_VOL */
+#define WM8962_MIXINR_HPMIXL_VOL_WIDTH 1 /* MIXINR_HPMIXL_VOL */
+#define WM8962_IN4L_HPMIXL_VOL_MASK 0x0038 /* IN4L_HPMIXL_VOL - [5:3] */
+#define WM8962_IN4L_HPMIXL_VOL_SHIFT 3 /* IN4L_HPMIXL_VOL - [5:3] */
+#define WM8962_IN4L_HPMIXL_VOL_WIDTH 3 /* IN4L_HPMIXL_VOL - [5:3] */
+#define WM8962_IN4R_HPMIXL_VOL_MASK 0x0007 /* IN4R_HPMIXL_VOL - [2:0] */
+#define WM8962_IN4R_HPMIXL_VOL_SHIFT 0 /* IN4R_HPMIXL_VOL - [2:0] */
+#define WM8962_IN4R_HPMIXL_VOL_WIDTH 3 /* IN4R_HPMIXL_VOL - [2:0] */
+
+/*
+ * R103 (0x67) - Headphone Mixer (4)
+ */
+#define WM8962_HPMIXR_MUTE 0x0100 /* HPMIXR_MUTE */
+#define WM8962_HPMIXR_MUTE_MASK 0x0100 /* HPMIXR_MUTE */
+#define WM8962_HPMIXR_MUTE_SHIFT 8 /* HPMIXR_MUTE */
+#define WM8962_HPMIXR_MUTE_WIDTH 1 /* HPMIXR_MUTE */
+#define WM8962_MIXINL_HPMIXR_VOL 0x0080 /* MIXINL_HPMIXR_VOL */
+#define WM8962_MIXINL_HPMIXR_VOL_MASK 0x0080 /* MIXINL_HPMIXR_VOL */
+#define WM8962_MIXINL_HPMIXR_VOL_SHIFT 7 /* MIXINL_HPMIXR_VOL */
+#define WM8962_MIXINL_HPMIXR_VOL_WIDTH 1 /* MIXINL_HPMIXR_VOL */
+#define WM8962_MIXINR_HPMIXR_VOL 0x0040 /* MIXINR_HPMIXR_VOL */
+#define WM8962_MIXINR_HPMIXR_VOL_MASK 0x0040 /* MIXINR_HPMIXR_VOL */
+#define WM8962_MIXINR_HPMIXR_VOL_SHIFT 6 /* MIXINR_HPMIXR_VOL */
+#define WM8962_MIXINR_HPMIXR_VOL_WIDTH 1 /* MIXINR_HPMIXR_VOL */
+#define WM8962_IN4L_HPMIXR_VOL_MASK 0x0038 /* IN4L_HPMIXR_VOL - [5:3] */
+#define WM8962_IN4L_HPMIXR_VOL_SHIFT 3 /* IN4L_HPMIXR_VOL - [5:3] */
+#define WM8962_IN4L_HPMIXR_VOL_WIDTH 3 /* IN4L_HPMIXR_VOL - [5:3] */
+#define WM8962_IN4R_HPMIXR_VOL_MASK 0x0007 /* IN4R_HPMIXR_VOL - [2:0] */
+#define WM8962_IN4R_HPMIXR_VOL_SHIFT 0 /* IN4R_HPMIXR_VOL - [2:0] */
+#define WM8962_IN4R_HPMIXR_VOL_WIDTH 3 /* IN4R_HPMIXR_VOL - [2:0] */
+
+/*
+ * R105 (0x69) - Speaker Mixer (1)
+ */
+#define WM8962_SPKMIXL_TO_SPKOUTL_PGA 0x0080 /* SPKMIXL_TO_SPKOUTL_PGA */
+#define WM8962_SPKMIXL_TO_SPKOUTL_PGA_MASK 0x0080 /* SPKMIXL_TO_SPKOUTL_PGA */
+#define WM8962_SPKMIXL_TO_SPKOUTL_PGA_SHIFT 7 /* SPKMIXL_TO_SPKOUTL_PGA */
+#define WM8962_SPKMIXL_TO_SPKOUTL_PGA_WIDTH 1 /* SPKMIXL_TO_SPKOUTL_PGA */
+#define WM8962_DACL_TO_SPKMIXL 0x0020 /* DACL_TO_SPKMIXL */
+#define WM8962_DACL_TO_SPKMIXL_MASK 0x0020 /* DACL_TO_SPKMIXL */
+#define WM8962_DACL_TO_SPKMIXL_SHIFT 5 /* DACL_TO_SPKMIXL */
+#define WM8962_DACL_TO_SPKMIXL_WIDTH 1 /* DACL_TO_SPKMIXL */
+#define WM8962_DACR_TO_SPKMIXL 0x0010 /* DACR_TO_SPKMIXL */
+#define WM8962_DACR_TO_SPKMIXL_MASK 0x0010 /* DACR_TO_SPKMIXL */
+#define WM8962_DACR_TO_SPKMIXL_SHIFT 4 /* DACR_TO_SPKMIXL */
+#define WM8962_DACR_TO_SPKMIXL_WIDTH 1 /* DACR_TO_SPKMIXL */
+#define WM8962_MIXINL_TO_SPKMIXL 0x0008 /* MIXINL_TO_SPKMIXL */
+#define WM8962_MIXINL_TO_SPKMIXL_MASK 0x0008 /* MIXINL_TO_SPKMIXL */
+#define WM8962_MIXINL_TO_SPKMIXL_SHIFT 3 /* MIXINL_TO_SPKMIXL */
+#define WM8962_MIXINL_TO_SPKMIXL_WIDTH 1 /* MIXINL_TO_SPKMIXL */
+#define WM8962_MIXINR_TO_SPKMIXL 0x0004 /* MIXINR_TO_SPKMIXL */
+#define WM8962_MIXINR_TO_SPKMIXL_MASK 0x0004 /* MIXINR_TO_SPKMIXL */
+#define WM8962_MIXINR_TO_SPKMIXL_SHIFT 2 /* MIXINR_TO_SPKMIXL */
+#define WM8962_MIXINR_TO_SPKMIXL_WIDTH 1 /* MIXINR_TO_SPKMIXL */
+#define WM8962_IN4L_TO_SPKMIXL 0x0002 /* IN4L_TO_SPKMIXL */
+#define WM8962_IN4L_TO_SPKMIXL_MASK 0x0002 /* IN4L_TO_SPKMIXL */
+#define WM8962_IN4L_TO_SPKMIXL_SHIFT 1 /* IN4L_TO_SPKMIXL */
+#define WM8962_IN4L_TO_SPKMIXL_WIDTH 1 /* IN4L_TO_SPKMIXL */
+#define WM8962_IN4R_TO_SPKMIXL 0x0001 /* IN4R_TO_SPKMIXL */
+#define WM8962_IN4R_TO_SPKMIXL_MASK 0x0001 /* IN4R_TO_SPKMIXL */
+#define WM8962_IN4R_TO_SPKMIXL_SHIFT 0 /* IN4R_TO_SPKMIXL */
+#define WM8962_IN4R_TO_SPKMIXL_WIDTH 1 /* IN4R_TO_SPKMIXL */
+
+/*
+ * R106 (0x6A) - Speaker Mixer (2)
+ */
+#define WM8962_SPKMIXR_TO_SPKOUTR_PGA 0x0080 /* SPKMIXR_TO_SPKOUTR_PGA */
+#define WM8962_SPKMIXR_TO_SPKOUTR_PGA_MASK 0x0080 /* SPKMIXR_TO_SPKOUTR_PGA */
+#define WM8962_SPKMIXR_TO_SPKOUTR_PGA_SHIFT 7 /* SPKMIXR_TO_SPKOUTR_PGA */
+#define WM8962_SPKMIXR_TO_SPKOUTR_PGA_WIDTH 1 /* SPKMIXR_TO_SPKOUTR_PGA */
+#define WM8962_DACL_TO_SPKMIXR 0x0020 /* DACL_TO_SPKMIXR */
+#define WM8962_DACL_TO_SPKMIXR_MASK 0x0020 /* DACL_TO_SPKMIXR */
+#define WM8962_DACL_TO_SPKMIXR_SHIFT 5 /* DACL_TO_SPKMIXR */
+#define WM8962_DACL_TO_SPKMIXR_WIDTH 1 /* DACL_TO_SPKMIXR */
+#define WM8962_DACR_TO_SPKMIXR 0x0010 /* DACR_TO_SPKMIXR */
+#define WM8962_DACR_TO_SPKMIXR_MASK 0x0010 /* DACR_TO_SPKMIXR */
+#define WM8962_DACR_TO_SPKMIXR_SHIFT 4 /* DACR_TO_SPKMIXR */
+#define WM8962_DACR_TO_SPKMIXR_WIDTH 1 /* DACR_TO_SPKMIXR */
+#define WM8962_MIXINL_TO_SPKMIXR 0x0008 /* MIXINL_TO_SPKMIXR */
+#define WM8962_MIXINL_TO_SPKMIXR_MASK 0x0008 /* MIXINL_TO_SPKMIXR */
+#define WM8962_MIXINL_TO_SPKMIXR_SHIFT 3 /* MIXINL_TO_SPKMIXR */
+#define WM8962_MIXINL_TO_SPKMIXR_WIDTH 1 /* MIXINL_TO_SPKMIXR */
+#define WM8962_MIXINR_TO_SPKMIXR 0x0004 /* MIXINR_TO_SPKMIXR */
+#define WM8962_MIXINR_TO_SPKMIXR_MASK 0x0004 /* MIXINR_TO_SPKMIXR */
+#define WM8962_MIXINR_TO_SPKMIXR_SHIFT 2 /* MIXINR_TO_SPKMIXR */
+#define WM8962_MIXINR_TO_SPKMIXR_WIDTH 1 /* MIXINR_TO_SPKMIXR */
+#define WM8962_IN4L_TO_SPKMIXR 0x0002 /* IN4L_TO_SPKMIXR */
+#define WM8962_IN4L_TO_SPKMIXR_MASK 0x0002 /* IN4L_TO_SPKMIXR */
+#define WM8962_IN4L_TO_SPKMIXR_SHIFT 1 /* IN4L_TO_SPKMIXR */
+#define WM8962_IN4L_TO_SPKMIXR_WIDTH 1 /* IN4L_TO_SPKMIXR */
+#define WM8962_IN4R_TO_SPKMIXR 0x0001 /* IN4R_TO_SPKMIXR */
+#define WM8962_IN4R_TO_SPKMIXR_MASK 0x0001 /* IN4R_TO_SPKMIXR */
+#define WM8962_IN4R_TO_SPKMIXR_SHIFT 0 /* IN4R_TO_SPKMIXR */
+#define WM8962_IN4R_TO_SPKMIXR_WIDTH 1 /* IN4R_TO_SPKMIXR */
+
+/*
+ * R107 (0x6B) - Speaker Mixer (3)
+ */
+#define WM8962_SPKMIXL_MUTE 0x0100 /* SPKMIXL_MUTE */
+#define WM8962_SPKMIXL_MUTE_MASK 0x0100 /* SPKMIXL_MUTE */
+#define WM8962_SPKMIXL_MUTE_SHIFT 8 /* SPKMIXL_MUTE */
+#define WM8962_SPKMIXL_MUTE_WIDTH 1 /* SPKMIXL_MUTE */
+#define WM8962_MIXINL_SPKMIXL_VOL 0x0080 /* MIXINL_SPKMIXL_VOL */
+#define WM8962_MIXINL_SPKMIXL_VOL_MASK 0x0080 /* MIXINL_SPKMIXL_VOL */
+#define WM8962_MIXINL_SPKMIXL_VOL_SHIFT 7 /* MIXINL_SPKMIXL_VOL */
+#define WM8962_MIXINL_SPKMIXL_VOL_WIDTH 1 /* MIXINL_SPKMIXL_VOL */
+#define WM8962_MIXINR_SPKMIXL_VOL 0x0040 /* MIXINR_SPKMIXL_VOL */
+#define WM8962_MIXINR_SPKMIXL_VOL_MASK 0x0040 /* MIXINR_SPKMIXL_VOL */
+#define WM8962_MIXINR_SPKMIXL_VOL_SHIFT 6 /* MIXINR_SPKMIXL_VOL */
+#define WM8962_MIXINR_SPKMIXL_VOL_WIDTH 1 /* MIXINR_SPKMIXL_VOL */
+#define WM8962_IN4L_SPKMIXL_VOL_MASK 0x0038 /* IN4L_SPKMIXL_VOL - [5:3] */
+#define WM8962_IN4L_SPKMIXL_VOL_SHIFT 3 /* IN4L_SPKMIXL_VOL - [5:3] */
+#define WM8962_IN4L_SPKMIXL_VOL_WIDTH 3 /* IN4L_SPKMIXL_VOL - [5:3] */
+#define WM8962_IN4R_SPKMIXL_VOL_MASK 0x0007 /* IN4R_SPKMIXL_VOL - [2:0] */
+#define WM8962_IN4R_SPKMIXL_VOL_SHIFT 0 /* IN4R_SPKMIXL_VOL - [2:0] */
+#define WM8962_IN4R_SPKMIXL_VOL_WIDTH 3 /* IN4R_SPKMIXL_VOL - [2:0] */
+
+/*
+ * R108 (0x6C) - Speaker Mixer (4)
+ */
+#define WM8962_SPKMIXR_MUTE 0x0100 /* SPKMIXR_MUTE */
+#define WM8962_SPKMIXR_MUTE_MASK 0x0100 /* SPKMIXR_MUTE */
+#define WM8962_SPKMIXR_MUTE_SHIFT 8 /* SPKMIXR_MUTE */
+#define WM8962_SPKMIXR_MUTE_WIDTH 1 /* SPKMIXR_MUTE */
+#define WM8962_MIXINL_SPKMIXR_VOL 0x0080 /* MIXINL_SPKMIXR_VOL */
+#define WM8962_MIXINL_SPKMIXR_VOL_MASK 0x0080 /* MIXINL_SPKMIXR_VOL */
+#define WM8962_MIXINL_SPKMIXR_VOL_SHIFT 7 /* MIXINL_SPKMIXR_VOL */
+#define WM8962_MIXINL_SPKMIXR_VOL_WIDTH 1 /* MIXINL_SPKMIXR_VOL */
+#define WM8962_MIXINR_SPKMIXR_VOL 0x0040 /* MIXINR_SPKMIXR_VOL */
+#define WM8962_MIXINR_SPKMIXR_VOL_MASK 0x0040 /* MIXINR_SPKMIXR_VOL */
+#define WM8962_MIXINR_SPKMIXR_VOL_SHIFT 6 /* MIXINR_SPKMIXR_VOL */
+#define WM8962_MIXINR_SPKMIXR_VOL_WIDTH 1 /* MIXINR_SPKMIXR_VOL */
+#define WM8962_IN4L_SPKMIXR_VOL_MASK 0x0038 /* IN4L_SPKMIXR_VOL - [5:3] */
+#define WM8962_IN4L_SPKMIXR_VOL_SHIFT 3 /* IN4L_SPKMIXR_VOL - [5:3] */
+#define WM8962_IN4L_SPKMIXR_VOL_WIDTH 3 /* IN4L_SPKMIXR_VOL - [5:3] */
+#define WM8962_IN4R_SPKMIXR_VOL_MASK 0x0007 /* IN4R_SPKMIXR_VOL - [2:0] */
+#define WM8962_IN4R_SPKMIXR_VOL_SHIFT 0 /* IN4R_SPKMIXR_VOL - [2:0] */
+#define WM8962_IN4R_SPKMIXR_VOL_WIDTH 3 /* IN4R_SPKMIXR_VOL - [2:0] */
+
+/*
+ * R109 (0x6D) - Speaker Mixer (5)
+ */
+#define WM8962_DACL_SPKMIXL_VOL 0x0080 /* DACL_SPKMIXL_VOL */
+#define WM8962_DACL_SPKMIXL_VOL_MASK 0x0080 /* DACL_SPKMIXL_VOL */
+#define WM8962_DACL_SPKMIXL_VOL_SHIFT 7 /* DACL_SPKMIXL_VOL */
+#define WM8962_DACL_SPKMIXL_VOL_WIDTH 1 /* DACL_SPKMIXL_VOL */
+#define WM8962_DACR_SPKMIXL_VOL 0x0040 /* DACR_SPKMIXL_VOL */
+#define WM8962_DACR_SPKMIXL_VOL_MASK 0x0040 /* DACR_SPKMIXL_VOL */
+#define WM8962_DACR_SPKMIXL_VOL_SHIFT 6 /* DACR_SPKMIXL_VOL */
+#define WM8962_DACR_SPKMIXL_VOL_WIDTH 1 /* DACR_SPKMIXL_VOL */
+#define WM8962_DACL_SPKMIXR_VOL 0x0020 /* DACL_SPKMIXR_VOL */
+#define WM8962_DACL_SPKMIXR_VOL_MASK 0x0020 /* DACL_SPKMIXR_VOL */
+#define WM8962_DACL_SPKMIXR_VOL_SHIFT 5 /* DACL_SPKMIXR_VOL */
+#define WM8962_DACL_SPKMIXR_VOL_WIDTH 1 /* DACL_SPKMIXR_VOL */
+#define WM8962_DACR_SPKMIXR_VOL 0x0010 /* DACR_SPKMIXR_VOL */
+#define WM8962_DACR_SPKMIXR_VOL_MASK 0x0010 /* DACR_SPKMIXR_VOL */
+#define WM8962_DACR_SPKMIXR_VOL_SHIFT 4 /* DACR_SPKMIXR_VOL */
+#define WM8962_DACR_SPKMIXR_VOL_WIDTH 1 /* DACR_SPKMIXR_VOL */
+
+/*
+ * R110 (0x6E) - Beep Generator (1)
+ */
+#define WM8962_BEEP_GAIN_MASK 0x00F0 /* BEEP_GAIN - [7:4] */
+#define WM8962_BEEP_GAIN_SHIFT 4 /* BEEP_GAIN - [7:4] */
+#define WM8962_BEEP_GAIN_WIDTH 4 /* BEEP_GAIN - [7:4] */
+#define WM8962_BEEP_RATE_MASK 0x0006 /* BEEP_RATE - [2:1] */
+#define WM8962_BEEP_RATE_SHIFT 1 /* BEEP_RATE - [2:1] */
+#define WM8962_BEEP_RATE_WIDTH 2 /* BEEP_RATE - [2:1] */
+#define WM8962_BEEP_ENA 0x0001 /* BEEP_ENA */
+#define WM8962_BEEP_ENA_MASK 0x0001 /* BEEP_ENA */
+#define WM8962_BEEP_ENA_SHIFT 0 /* BEEP_ENA */
+#define WM8962_BEEP_ENA_WIDTH 1 /* BEEP_ENA */
+
+/*
+ * R115 (0x73) - Oscillator Trim (3)
+ */
+#define WM8962_OSC_TRIM_XTI_MASK 0x001F /* OSC_TRIM_XTI - [4:0] */
+#define WM8962_OSC_TRIM_XTI_SHIFT 0 /* OSC_TRIM_XTI - [4:0] */
+#define WM8962_OSC_TRIM_XTI_WIDTH 5 /* OSC_TRIM_XTI - [4:0] */
+
+/*
+ * R116 (0x74) - Oscillator Trim (4)
+ */
+#define WM8962_OSC_TRIM_XTO_MASK 0x001F /* OSC_TRIM_XTO - [4:0] */
+#define WM8962_OSC_TRIM_XTO_SHIFT 0 /* OSC_TRIM_XTO - [4:0] */
+#define WM8962_OSC_TRIM_XTO_WIDTH 5 /* OSC_TRIM_XTO - [4:0] */
+
+/*
+ * R119 (0x77) - Oscillator Trim (7)
+ */
+#define WM8962_XTO_CAP_SEL_MASK 0x00F0 /* XTO_CAP_SEL - [7:4] */
+#define WM8962_XTO_CAP_SEL_SHIFT 4 /* XTO_CAP_SEL - [7:4] */
+#define WM8962_XTO_CAP_SEL_WIDTH 4 /* XTO_CAP_SEL - [7:4] */
+#define WM8962_XTI_CAP_SEL_MASK 0x000F /* XTI_CAP_SEL - [3:0] */
+#define WM8962_XTI_CAP_SEL_SHIFT 0 /* XTI_CAP_SEL - [3:0] */
+#define WM8962_XTI_CAP_SEL_WIDTH 4 /* XTI_CAP_SEL - [3:0] */
+
+/*
+ * R124 (0x7C) - Analogue Clocking1
+ */
+#define WM8962_CLKOUT2_SEL_MASK 0x0060 /* CLKOUT2_SEL - [6:5] */
+#define WM8962_CLKOUT2_SEL_SHIFT 5 /* CLKOUT2_SEL - [6:5] */
+#define WM8962_CLKOUT2_SEL_WIDTH 2 /* CLKOUT2_SEL - [6:5] */
+#define WM8962_CLKOUT3_SEL_MASK 0x0018 /* CLKOUT3_SEL - [4:3] */
+#define WM8962_CLKOUT3_SEL_SHIFT 3 /* CLKOUT3_SEL - [4:3] */
+#define WM8962_CLKOUT3_SEL_WIDTH 2 /* CLKOUT3_SEL - [4:3] */
+#define WM8962_CLKOUT5_SEL 0x0001 /* CLKOUT5_SEL */
+#define WM8962_CLKOUT5_SEL_MASK 0x0001 /* CLKOUT5_SEL */
+#define WM8962_CLKOUT5_SEL_SHIFT 0 /* CLKOUT5_SEL */
+#define WM8962_CLKOUT5_SEL_WIDTH 1 /* CLKOUT5_SEL */
+
+/*
+ * R125 (0x7D) - Analogue Clocking2
+ */
+#define WM8962_PLL2_OUTDIV 0x0080 /* PLL2_OUTDIV */
+#define WM8962_PLL2_OUTDIV_MASK 0x0080 /* PLL2_OUTDIV */
+#define WM8962_PLL2_OUTDIV_SHIFT 7 /* PLL2_OUTDIV */
+#define WM8962_PLL2_OUTDIV_WIDTH 1 /* PLL2_OUTDIV */
+#define WM8962_PLL3_OUTDIV 0x0040 /* PLL3_OUTDIV */
+#define WM8962_PLL3_OUTDIV_MASK 0x0040 /* PLL3_OUTDIV */
+#define WM8962_PLL3_OUTDIV_SHIFT 6 /* PLL3_OUTDIV */
+#define WM8962_PLL3_OUTDIV_WIDTH 1 /* PLL3_OUTDIV */
+#define WM8962_PLL_SYSCLK_DIV_MASK 0x0018 /* PLL_SYSCLK_DIV - [4:3] */
+#define WM8962_PLL_SYSCLK_DIV_SHIFT 3 /* PLL_SYSCLK_DIV - [4:3] */
+#define WM8962_PLL_SYSCLK_DIV_WIDTH 2 /* PLL_SYSCLK_DIV - [4:3] */
+#define WM8962_CLKOUT3_DIV 0x0004 /* CLKOUT3_DIV */
+#define WM8962_CLKOUT3_DIV_MASK 0x0004 /* CLKOUT3_DIV */
+#define WM8962_CLKOUT3_DIV_SHIFT 2 /* CLKOUT3_DIV */
+#define WM8962_CLKOUT3_DIV_WIDTH 1 /* CLKOUT3_DIV */
+#define WM8962_CLKOUT2_DIV 0x0002 /* CLKOUT2_DIV */
+#define WM8962_CLKOUT2_DIV_MASK 0x0002 /* CLKOUT2_DIV */
+#define WM8962_CLKOUT2_DIV_SHIFT 1 /* CLKOUT2_DIV */
+#define WM8962_CLKOUT2_DIV_WIDTH 1 /* CLKOUT2_DIV */
+#define WM8962_CLKOUT5_DIV 0x0001 /* CLKOUT5_DIV */
+#define WM8962_CLKOUT5_DIV_MASK 0x0001 /* CLKOUT5_DIV */
+#define WM8962_CLKOUT5_DIV_SHIFT 0 /* CLKOUT5_DIV */
+#define WM8962_CLKOUT5_DIV_WIDTH 1 /* CLKOUT5_DIV */
+
+/*
+ * R126 (0x7E) - Analogue Clocking3
+ */
+#define WM8962_CLKOUT2_OE 0x0008 /* CLKOUT2_OE */
+#define WM8962_CLKOUT2_OE_MASK 0x0008 /* CLKOUT2_OE */
+#define WM8962_CLKOUT2_OE_SHIFT 3 /* CLKOUT2_OE */
+#define WM8962_CLKOUT2_OE_WIDTH 1 /* CLKOUT2_OE */
+#define WM8962_CLKOUT3_OE 0x0004 /* CLKOUT3_OE */
+#define WM8962_CLKOUT3_OE_MASK 0x0004 /* CLKOUT3_OE */
+#define WM8962_CLKOUT3_OE_SHIFT 2 /* CLKOUT3_OE */
+#define WM8962_CLKOUT3_OE_WIDTH 1 /* CLKOUT3_OE */
+#define WM8962_CLKOUT5_OE 0x0001 /* CLKOUT5_OE */
+#define WM8962_CLKOUT5_OE_MASK 0x0001 /* CLKOUT5_OE */
+#define WM8962_CLKOUT5_OE_SHIFT 0 /* CLKOUT5_OE */
+#define WM8962_CLKOUT5_OE_WIDTH 1 /* CLKOUT5_OE */
+
+/*
+ * R127 (0x7F) - PLL Software Reset
+ */
+#define WM8962_SW_RESET_PLL_MASK 0xFFFF /* SW_RESET_PLL - [15:0] */
+#define WM8962_SW_RESET_PLL_SHIFT 0 /* SW_RESET_PLL - [15:0] */
+#define WM8962_SW_RESET_PLL_WIDTH 16 /* SW_RESET_PLL - [15:0] */
+
+/*
+ * R129 (0x81) - PLL2
+ */
+#define WM8962_OSC_ENA 0x0080 /* OSC_ENA */
+#define WM8962_OSC_ENA_MASK 0x0080 /* OSC_ENA */
+#define WM8962_OSC_ENA_SHIFT 7 /* OSC_ENA */
+#define WM8962_OSC_ENA_WIDTH 1 /* OSC_ENA */
+#define WM8962_PLL2_ENA 0x0020 /* PLL2_ENA */
+#define WM8962_PLL2_ENA_MASK 0x0020 /* PLL2_ENA */
+#define WM8962_PLL2_ENA_SHIFT 5 /* PLL2_ENA */
+#define WM8962_PLL2_ENA_WIDTH 1 /* PLL2_ENA */
+#define WM8962_PLL3_ENA 0x0010 /* PLL3_ENA */
+#define WM8962_PLL3_ENA_MASK 0x0010 /* PLL3_ENA */
+#define WM8962_PLL3_ENA_SHIFT 4 /* PLL3_ENA */
+#define WM8962_PLL3_ENA_WIDTH 1 /* PLL3_ENA */
+
+/*
+ * R131 (0x83) - PLL 4
+ */
+#define WM8962_PLL_CLK_SRC 0x0002 /* PLL_CLK_SRC */
+#define WM8962_PLL_CLK_SRC_MASK 0x0002 /* PLL_CLK_SRC */
+#define WM8962_PLL_CLK_SRC_SHIFT 1 /* PLL_CLK_SRC */
+#define WM8962_PLL_CLK_SRC_WIDTH 1 /* PLL_CLK_SRC */
+#define WM8962_FLL_TO_PLL3 0x0001 /* FLL_TO_PLL3 */
+#define WM8962_FLL_TO_PLL3_MASK 0x0001 /* FLL_TO_PLL3 */
+#define WM8962_FLL_TO_PLL3_SHIFT 0 /* FLL_TO_PLL3 */
+#define WM8962_FLL_TO_PLL3_WIDTH 1 /* FLL_TO_PLL3 */
+
+/*
+ * R136 (0x88) - PLL 9
+ */
+#define WM8962_PLL2_FRAC 0x0040 /* PLL2_FRAC */
+#define WM8962_PLL2_FRAC_MASK 0x0040 /* PLL2_FRAC */
+#define WM8962_PLL2_FRAC_SHIFT 6 /* PLL2_FRAC */
+#define WM8962_PLL2_FRAC_WIDTH 1 /* PLL2_FRAC */
+#define WM8962_PLL2_N_MASK 0x001F /* PLL2_N - [4:0] */
+#define WM8962_PLL2_N_SHIFT 0 /* PLL2_N - [4:0] */
+#define WM8962_PLL2_N_WIDTH 5 /* PLL2_N - [4:0] */
+
+/*
+ * R137 (0x89) - PLL 10
+ */
+#define WM8962_PLL2_K_MASK 0x00FF /* PLL2_K - [7:0] */
+#define WM8962_PLL2_K_SHIFT 0 /* PLL2_K - [7:0] */
+#define WM8962_PLL2_K_WIDTH 8 /* PLL2_K - [7:0] */
+
+/*
+ * R138 (0x8A) - PLL 11
+ */
+#define WM8962_PLL2_K_MASK 0x00FF /* PLL2_K - [7:0] */
+#define WM8962_PLL2_K_SHIFT 0 /* PLL2_K - [7:0] */
+#define WM8962_PLL2_K_WIDTH 8 /* PLL2_K - [7:0] */
+
+/*
+ * R139 (0x8B) - PLL 12
+ */
+#define WM8962_PLL2_K_MASK 0x00FF /* PLL2_K - [7:0] */
+#define WM8962_PLL2_K_SHIFT 0 /* PLL2_K - [7:0] */
+#define WM8962_PLL2_K_WIDTH 8 /* PLL2_K - [7:0] */
+
+/*
+ * R140 (0x8C) - PLL 13
+ */
+#define WM8962_PLL3_FRAC 0x0040 /* PLL3_FRAC */
+#define WM8962_PLL3_FRAC_MASK 0x0040 /* PLL3_FRAC */
+#define WM8962_PLL3_FRAC_SHIFT 6 /* PLL3_FRAC */
+#define WM8962_PLL3_FRAC_WIDTH 1 /* PLL3_FRAC */
+#define WM8962_PLL3_N_MASK 0x001F /* PLL3_N - [4:0] */
+#define WM8962_PLL3_N_SHIFT 0 /* PLL3_N - [4:0] */
+#define WM8962_PLL3_N_WIDTH 5 /* PLL3_N - [4:0] */
+
+/*
+ * R141 (0x8D) - PLL 14
+ */
+#define WM8962_PLL3_K_MASK 0x00FF /* PLL3_K - [7:0] */
+#define WM8962_PLL3_K_SHIFT 0 /* PLL3_K - [7:0] */
+#define WM8962_PLL3_K_WIDTH 8 /* PLL3_K - [7:0] */
+
+/*
+ * R142 (0x8E) - PLL 15
+ */
+#define WM8962_PLL3_K_MASK 0x00FF /* PLL3_K - [7:0] */
+#define WM8962_PLL3_K_SHIFT 0 /* PLL3_K - [7:0] */
+#define WM8962_PLL3_K_WIDTH 8 /* PLL3_K - [7:0] */
+
+/*
+ * R143 (0x8F) - PLL 16
+ */
+#define WM8962_PLL3_K_MASK 0x00FF /* PLL3_K - [7:0] */
+#define WM8962_PLL3_K_SHIFT 0 /* PLL3_K - [7:0] */
+#define WM8962_PLL3_K_WIDTH 8 /* PLL3_K - [7:0] */
+
+/*
+ * R155 (0x9B) - FLL Control (1)
+ */
+#define WM8962_FLL_REFCLK_SRC_MASK 0x0060 /* FLL_REFCLK_SRC - [6:5] */
+#define WM8962_FLL_REFCLK_SRC_SHIFT 5 /* FLL_REFCLK_SRC - [6:5] */
+#define WM8962_FLL_REFCLK_SRC_WIDTH 2 /* FLL_REFCLK_SRC - [6:5] */
+#define WM8962_FLL_FRAC 0x0004 /* FLL_FRAC */
+#define WM8962_FLL_FRAC_MASK 0x0004 /* FLL_FRAC */
+#define WM8962_FLL_FRAC_SHIFT 2 /* FLL_FRAC */
+#define WM8962_FLL_FRAC_WIDTH 1 /* FLL_FRAC */
+#define WM8962_FLL_OSC_ENA 0x0002 /* FLL_OSC_ENA */
+#define WM8962_FLL_OSC_ENA_MASK 0x0002 /* FLL_OSC_ENA */
+#define WM8962_FLL_OSC_ENA_SHIFT 1 /* FLL_OSC_ENA */
+#define WM8962_FLL_OSC_ENA_WIDTH 1 /* FLL_OSC_ENA */
+#define WM8962_FLL_ENA 0x0001 /* FLL_ENA */
+#define WM8962_FLL_ENA_MASK 0x0001 /* FLL_ENA */
+#define WM8962_FLL_ENA_SHIFT 0 /* FLL_ENA */
+#define WM8962_FLL_ENA_WIDTH 1 /* FLL_ENA */
+
+/*
+ * R156 (0x9C) - FLL Control (2)
+ */
+#define WM8962_FLL_OUTDIV_MASK 0x01F8 /* FLL_OUTDIV - [8:3] */
+#define WM8962_FLL_OUTDIV_SHIFT 3 /* FLL_OUTDIV - [8:3] */
+#define WM8962_FLL_OUTDIV_WIDTH 6 /* FLL_OUTDIV - [8:3] */
+#define WM8962_FLL_REFCLK_DIV_MASK 0x0003 /* FLL_REFCLK_DIV - [1:0] */
+#define WM8962_FLL_REFCLK_DIV_SHIFT 0 /* FLL_REFCLK_DIV - [1:0] */
+#define WM8962_FLL_REFCLK_DIV_WIDTH 2 /* FLL_REFCLK_DIV - [1:0] */
+
+/*
+ * R157 (0x9D) - FLL Control (3)
+ */
+#define WM8962_FLL_FRATIO_MASK 0x0007 /* FLL_FRATIO - [2:0] */
+#define WM8962_FLL_FRATIO_SHIFT 0 /* FLL_FRATIO - [2:0] */
+#define WM8962_FLL_FRATIO_WIDTH 3 /* FLL_FRATIO - [2:0] */
+
+/*
+ * R159 (0x9F) - FLL Control (5)
+ */
+#define WM8962_FLL_FRC_NCO_VAL_MASK 0x007E /* FLL_FRC_NCO_VAL - [6:1] */
+#define WM8962_FLL_FRC_NCO_VAL_SHIFT 1 /* FLL_FRC_NCO_VAL - [6:1] */
+#define WM8962_FLL_FRC_NCO_VAL_WIDTH 6 /* FLL_FRC_NCO_VAL - [6:1] */
+#define WM8962_FLL_FRC_NCO 0x0001 /* FLL_FRC_NCO */
+#define WM8962_FLL_FRC_NCO_MASK 0x0001 /* FLL_FRC_NCO */
+#define WM8962_FLL_FRC_NCO_SHIFT 0 /* FLL_FRC_NCO */
+#define WM8962_FLL_FRC_NCO_WIDTH 1 /* FLL_FRC_NCO */
+
+/*
+ * R160 (0xA0) - FLL Control (6)
+ */
+#define WM8962_FLL_THETA_MASK 0xFFFF /* FLL_THETA - [15:0] */
+#define WM8962_FLL_THETA_SHIFT 0 /* FLL_THETA - [15:0] */
+#define WM8962_FLL_THETA_WIDTH 16 /* FLL_THETA - [15:0] */
+
+/*
+ * R161 (0xA1) - FLL Control (7)
+ */
+#define WM8962_FLL_LAMBDA_MASK 0xFFFF /* FLL_LAMBDA - [15:0] */
+#define WM8962_FLL_LAMBDA_SHIFT 0 /* FLL_LAMBDA - [15:0] */
+#define WM8962_FLL_LAMBDA_WIDTH 16 /* FLL_LAMBDA - [15:0] */
+
+/*
+ * R162 (0xA2) - FLL Control (8)
+ */
+#define WM8962_FLL_N_MASK 0x03FF /* FLL_N - [9:0] */
+#define WM8962_FLL_N_SHIFT 0 /* FLL_N - [9:0] */
+#define WM8962_FLL_N_WIDTH 10 /* FLL_N - [9:0] */
+
+/*
+ * R252 (0xFC) - General test 1
+ */
+#define WM8962_REG_SYNC 0x0004 /* REG_SYNC */
+#define WM8962_REG_SYNC_MASK 0x0004 /* REG_SYNC */
+#define WM8962_REG_SYNC_SHIFT 2 /* REG_SYNC */
+#define WM8962_REG_SYNC_WIDTH 1 /* REG_SYNC */
+#define WM8962_AUTO_INC 0x0001 /* AUTO_INC */
+#define WM8962_AUTO_INC_MASK 0x0001 /* AUTO_INC */
+#define WM8962_AUTO_INC_SHIFT 0 /* AUTO_INC */
+#define WM8962_AUTO_INC_WIDTH 1 /* AUTO_INC */
+
+/*
+ * R256 (0x100) - DF1
+ */
+#define WM8962_DRC_DF1_ENA 0x0008 /* DRC_DF1_ENA */
+#define WM8962_DRC_DF1_ENA_MASK 0x0008 /* DRC_DF1_ENA */
+#define WM8962_DRC_DF1_ENA_SHIFT 3 /* DRC_DF1_ENA */
+#define WM8962_DRC_DF1_ENA_WIDTH 1 /* DRC_DF1_ENA */
+#define WM8962_DF1_SHARED_COEFF 0x0004 /* DF1_SHARED_COEFF */
+#define WM8962_DF1_SHARED_COEFF_MASK 0x0004 /* DF1_SHARED_COEFF */
+#define WM8962_DF1_SHARED_COEFF_SHIFT 2 /* DF1_SHARED_COEFF */
+#define WM8962_DF1_SHARED_COEFF_WIDTH 1 /* DF1_SHARED_COEFF */
+#define WM8962_DF1_SHARED_COEFF_SEL 0x0002 /* DF1_SHARED_COEFF_SEL */
+#define WM8962_DF1_SHARED_COEFF_SEL_MASK 0x0002 /* DF1_SHARED_COEFF_SEL */
+#define WM8962_DF1_SHARED_COEFF_SEL_SHIFT 1 /* DF1_SHARED_COEFF_SEL */
+#define WM8962_DF1_SHARED_COEFF_SEL_WIDTH 1 /* DF1_SHARED_COEFF_SEL */
+#define WM8962_DF1_ENA 0x0001 /* DF1_ENA */
+#define WM8962_DF1_ENA_MASK 0x0001 /* DF1_ENA */
+#define WM8962_DF1_ENA_SHIFT 0 /* DF1_ENA */
+#define WM8962_DF1_ENA_WIDTH 1 /* DF1_ENA */
+
+/*
+ * R257 (0x101) - DF2
+ */
+#define WM8962_DF1_COEFF_L0_MASK 0xFFFF /* DF1_COEFF_L0 - [15:0] */
+#define WM8962_DF1_COEFF_L0_SHIFT 0 /* DF1_COEFF_L0 - [15:0] */
+#define WM8962_DF1_COEFF_L0_WIDTH 16 /* DF1_COEFF_L0 - [15:0] */
+
+/*
+ * R258 (0x102) - DF3
+ */
+#define WM8962_DF1_COEFF_L1_MASK 0xFFFF /* DF1_COEFF_L1 - [15:0] */
+#define WM8962_DF1_COEFF_L1_SHIFT 0 /* DF1_COEFF_L1 - [15:0] */
+#define WM8962_DF1_COEFF_L1_WIDTH 16 /* DF1_COEFF_L1 - [15:0] */
+
+/*
+ * R259 (0x103) - DF4
+ */
+#define WM8962_DF1_COEFF_L2_MASK 0xFFFF /* DF1_COEFF_L2 - [15:0] */
+#define WM8962_DF1_COEFF_L2_SHIFT 0 /* DF1_COEFF_L2 - [15:0] */
+#define WM8962_DF1_COEFF_L2_WIDTH 16 /* DF1_COEFF_L2 - [15:0] */
+
+/*
+ * R260 (0x104) - DF5
+ */
+#define WM8962_DF1_COEFF_R0_MASK 0xFFFF /* DF1_COEFF_R0 - [15:0] */
+#define WM8962_DF1_COEFF_R0_SHIFT 0 /* DF1_COEFF_R0 - [15:0] */
+#define WM8962_DF1_COEFF_R0_WIDTH 16 /* DF1_COEFF_R0 - [15:0] */
+
+/*
+ * R261 (0x105) - DF6
+ */
+#define WM8962_DF1_COEFF_R1_MASK 0xFFFF /* DF1_COEFF_R1 - [15:0] */
+#define WM8962_DF1_COEFF_R1_SHIFT 0 /* DF1_COEFF_R1 - [15:0] */
+#define WM8962_DF1_COEFF_R1_WIDTH 16 /* DF1_COEFF_R1 - [15:0] */
+
+/*
+ * R262 (0x106) - DF7
+ */
+#define WM8962_DF1_COEFF_R2_MASK 0xFFFF /* DF1_COEFF_R2 - [15:0] */
+#define WM8962_DF1_COEFF_R2_SHIFT 0 /* DF1_COEFF_R2 - [15:0] */
+#define WM8962_DF1_COEFF_R2_WIDTH 16 /* DF1_COEFF_R2 - [15:0] */
+
+/*
+ * R264 (0x108) - LHPF1
+ */
+#define WM8962_LHPF_MODE 0x0002 /* LHPF_MODE */
+#define WM8962_LHPF_MODE_MASK 0x0002 /* LHPF_MODE */
+#define WM8962_LHPF_MODE_SHIFT 1 /* LHPF_MODE */
+#define WM8962_LHPF_MODE_WIDTH 1 /* LHPF_MODE */
+#define WM8962_LHPF_ENA 0x0001 /* LHPF_ENA */
+#define WM8962_LHPF_ENA_MASK 0x0001 /* LHPF_ENA */
+#define WM8962_LHPF_ENA_SHIFT 0 /* LHPF_ENA */
+#define WM8962_LHPF_ENA_WIDTH 1 /* LHPF_ENA */
+
+/*
+ * R265 (0x109) - LHPF2
+ */
+#define WM8962_LHPF_COEFF_MASK 0xFFFF /* LHPF_COEFF - [15:0] */
+#define WM8962_LHPF_COEFF_SHIFT 0 /* LHPF_COEFF - [15:0] */
+#define WM8962_LHPF_COEFF_WIDTH 16 /* LHPF_COEFF - [15:0] */
+
+/*
+ * R268 (0x10C) - THREED1
+ */
+#define WM8962_ADC_MONOMIX 0x0040 /* ADC_MONOMIX */
+#define WM8962_ADC_MONOMIX_MASK 0x0040 /* ADC_MONOMIX */
+#define WM8962_ADC_MONOMIX_SHIFT 6 /* ADC_MONOMIX */
+#define WM8962_ADC_MONOMIX_WIDTH 1 /* ADC_MONOMIX */
+#define WM8962_THREED_SIGN_L 0x0020 /* THREED_SIGN_L */
+#define WM8962_THREED_SIGN_L_MASK 0x0020 /* THREED_SIGN_L */
+#define WM8962_THREED_SIGN_L_SHIFT 5 /* THREED_SIGN_L */
+#define WM8962_THREED_SIGN_L_WIDTH 1 /* THREED_SIGN_L */
+#define WM8962_THREED_SIGN_R 0x0010 /* THREED_SIGN_R */
+#define WM8962_THREED_SIGN_R_MASK 0x0010 /* THREED_SIGN_R */
+#define WM8962_THREED_SIGN_R_SHIFT 4 /* THREED_SIGN_R */
+#define WM8962_THREED_SIGN_R_WIDTH 1 /* THREED_SIGN_R */
+#define WM8962_THREED_LHPF_MODE 0x0004 /* THREED_LHPF_MODE */
+#define WM8962_THREED_LHPF_MODE_MASK 0x0004 /* THREED_LHPF_MODE */
+#define WM8962_THREED_LHPF_MODE_SHIFT 2 /* THREED_LHPF_MODE */
+#define WM8962_THREED_LHPF_MODE_WIDTH 1 /* THREED_LHPF_MODE */
+#define WM8962_THREED_LHPF_ENA 0x0002 /* THREED_LHPF_ENA */
+#define WM8962_THREED_LHPF_ENA_MASK 0x0002 /* THREED_LHPF_ENA */
+#define WM8962_THREED_LHPF_ENA_SHIFT 1 /* THREED_LHPF_ENA */
+#define WM8962_THREED_LHPF_ENA_WIDTH 1 /* THREED_LHPF_ENA */
+#define WM8962_THREED_ENA 0x0001 /* THREED_ENA */
+#define WM8962_THREED_ENA_MASK 0x0001 /* THREED_ENA */
+#define WM8962_THREED_ENA_SHIFT 0 /* THREED_ENA */
+#define WM8962_THREED_ENA_WIDTH 1 /* THREED_ENA */
+
+/*
+ * R269 (0x10D) - THREED2
+ */
+#define WM8962_THREED_FGAINL_MASK 0xF800 /* THREED_FGAINL - [15:11] */
+#define WM8962_THREED_FGAINL_SHIFT 11 /* THREED_FGAINL - [15:11] */
+#define WM8962_THREED_FGAINL_WIDTH 5 /* THREED_FGAINL - [15:11] */
+#define WM8962_THREED_CGAINL_MASK 0x07C0 /* THREED_CGAINL - [10:6] */
+#define WM8962_THREED_CGAINL_SHIFT 6 /* THREED_CGAINL - [10:6] */
+#define WM8962_THREED_CGAINL_WIDTH 5 /* THREED_CGAINL - [10:6] */
+#define WM8962_THREED_DELAYL_MASK 0x003C /* THREED_DELAYL - [5:2] */
+#define WM8962_THREED_DELAYL_SHIFT 2 /* THREED_DELAYL - [5:2] */
+#define WM8962_THREED_DELAYL_WIDTH 4 /* THREED_DELAYL - [5:2] */
+
+/*
+ * R270 (0x10E) - THREED3
+ */
+#define WM8962_THREED_LHPF_COEFF_MASK 0xFFFF /* THREED_LHPF_COEFF - [15:0] */
+#define WM8962_THREED_LHPF_COEFF_SHIFT 0 /* THREED_LHPF_COEFF - [15:0] */
+#define WM8962_THREED_LHPF_COEFF_WIDTH 16 /* THREED_LHPF_COEFF - [15:0] */
+
+/*
+ * R271 (0x10F) - THREED4
+ */
+#define WM8962_THREED_FGAINR_MASK 0xF800 /* THREED_FGAINR - [15:11] */
+#define WM8962_THREED_FGAINR_SHIFT 11 /* THREED_FGAINR - [15:11] */
+#define WM8962_THREED_FGAINR_WIDTH 5 /* THREED_FGAINR - [15:11] */
+#define WM8962_THREED_CGAINR_MASK 0x07C0 /* THREED_CGAINR - [10:6] */
+#define WM8962_THREED_CGAINR_SHIFT 6 /* THREED_CGAINR - [10:6] */
+#define WM8962_THREED_CGAINR_WIDTH 5 /* THREED_CGAINR - [10:6] */
+#define WM8962_THREED_DELAYR_MASK 0x003C /* THREED_DELAYR - [5:2] */
+#define WM8962_THREED_DELAYR_SHIFT 2 /* THREED_DELAYR - [5:2] */
+#define WM8962_THREED_DELAYR_WIDTH 4 /* THREED_DELAYR - [5:2] */
+
+/*
+ * R276 (0x114) - DRC 1
+ */
+#define WM8962_DRC_SIG_DET_RMS_MASK 0x7C00 /* DRC_SIG_DET_RMS - [14:10] */
+#define WM8962_DRC_SIG_DET_RMS_SHIFT 10 /* DRC_SIG_DET_RMS - [14:10] */
+#define WM8962_DRC_SIG_DET_RMS_WIDTH 5 /* DRC_SIG_DET_RMS - [14:10] */
+#define WM8962_DRC_SIG_DET_PK_MASK 0x0300 /* DRC_SIG_DET_PK - [9:8] */
+#define WM8962_DRC_SIG_DET_PK_SHIFT 8 /* DRC_SIG_DET_PK - [9:8] */
+#define WM8962_DRC_SIG_DET_PK_WIDTH 2 /* DRC_SIG_DET_PK - [9:8] */
+#define WM8962_DRC_NG_ENA 0x0080 /* DRC_NG_ENA */
+#define WM8962_DRC_NG_ENA_MASK 0x0080 /* DRC_NG_ENA */
+#define WM8962_DRC_NG_ENA_SHIFT 7 /* DRC_NG_ENA */
+#define WM8962_DRC_NG_ENA_WIDTH 1 /* DRC_NG_ENA */
+#define WM8962_DRC_SIG_DET_MODE 0x0040 /* DRC_SIG_DET_MODE */
+#define WM8962_DRC_SIG_DET_MODE_MASK 0x0040 /* DRC_SIG_DET_MODE */
+#define WM8962_DRC_SIG_DET_MODE_SHIFT 6 /* DRC_SIG_DET_MODE */
+#define WM8962_DRC_SIG_DET_MODE_WIDTH 1 /* DRC_SIG_DET_MODE */
+#define WM8962_DRC_SIG_DET 0x0020 /* DRC_SIG_DET */
+#define WM8962_DRC_SIG_DET_MASK 0x0020 /* DRC_SIG_DET */
+#define WM8962_DRC_SIG_DET_SHIFT 5 /* DRC_SIG_DET */
+#define WM8962_DRC_SIG_DET_WIDTH 1 /* DRC_SIG_DET */
+#define WM8962_DRC_KNEE2_OP_ENA 0x0010 /* DRC_KNEE2_OP_ENA */
+#define WM8962_DRC_KNEE2_OP_ENA_MASK 0x0010 /* DRC_KNEE2_OP_ENA */
+#define WM8962_DRC_KNEE2_OP_ENA_SHIFT 4 /* DRC_KNEE2_OP_ENA */
+#define WM8962_DRC_KNEE2_OP_ENA_WIDTH 1 /* DRC_KNEE2_OP_ENA */
+#define WM8962_DRC_QR 0x0008 /* DRC_QR */
+#define WM8962_DRC_QR_MASK 0x0008 /* DRC_QR */
+#define WM8962_DRC_QR_SHIFT 3 /* DRC_QR */
+#define WM8962_DRC_QR_WIDTH 1 /* DRC_QR */
+#define WM8962_DRC_ANTICLIP 0x0004 /* DRC_ANTICLIP */
+#define WM8962_DRC_ANTICLIP_MASK 0x0004 /* DRC_ANTICLIP */
+#define WM8962_DRC_ANTICLIP_SHIFT 2 /* DRC_ANTICLIP */
+#define WM8962_DRC_ANTICLIP_WIDTH 1 /* DRC_ANTICLIP */
+#define WM8962_DRC_MODE 0x0002 /* DRC_MODE */
+#define WM8962_DRC_MODE_MASK 0x0002 /* DRC_MODE */
+#define WM8962_DRC_MODE_SHIFT 1 /* DRC_MODE */
+#define WM8962_DRC_MODE_WIDTH 1 /* DRC_MODE */
+#define WM8962_DRC_ENA 0x0001 /* DRC_ENA */
+#define WM8962_DRC_ENA_MASK 0x0001 /* DRC_ENA */
+#define WM8962_DRC_ENA_SHIFT 0 /* DRC_ENA */
+#define WM8962_DRC_ENA_WIDTH 1 /* DRC_ENA */
+
+/*
+ * R277 (0x115) - DRC 2
+ */
+#define WM8962_DRC_ATK_MASK 0x1E00 /* DRC_ATK - [12:9] */
+#define WM8962_DRC_ATK_SHIFT 9 /* DRC_ATK - [12:9] */
+#define WM8962_DRC_ATK_WIDTH 4 /* DRC_ATK - [12:9] */
+#define WM8962_DRC_DCY_MASK 0x01E0 /* DRC_DCY - [8:5] */
+#define WM8962_DRC_DCY_SHIFT 5 /* DRC_DCY - [8:5] */
+#define WM8962_DRC_DCY_WIDTH 4 /* DRC_DCY - [8:5] */
+#define WM8962_DRC_MINGAIN_MASK 0x001C /* DRC_MINGAIN - [4:2] */
+#define WM8962_DRC_MINGAIN_SHIFT 2 /* DRC_MINGAIN - [4:2] */
+#define WM8962_DRC_MINGAIN_WIDTH 3 /* DRC_MINGAIN - [4:2] */
+#define WM8962_DRC_MAXGAIN_MASK 0x0003 /* DRC_MAXGAIN - [1:0] */
+#define WM8962_DRC_MAXGAIN_SHIFT 0 /* DRC_MAXGAIN - [1:0] */
+#define WM8962_DRC_MAXGAIN_WIDTH 2 /* DRC_MAXGAIN - [1:0] */
+
+/*
+ * R278 (0x116) - DRC 3
+ */
+#define WM8962_DRC_NG_MINGAIN_MASK 0xF000 /* DRC_NG_MINGAIN - [15:12] */
+#define WM8962_DRC_NG_MINGAIN_SHIFT 12 /* DRC_NG_MINGAIN - [15:12] */
+#define WM8962_DRC_NG_MINGAIN_WIDTH 4 /* DRC_NG_MINGAIN - [15:12] */
+#define WM8962_DRC_QR_THR_MASK 0x0C00 /* DRC_QR_THR - [11:10] */
+#define WM8962_DRC_QR_THR_SHIFT 10 /* DRC_QR_THR - [11:10] */
+#define WM8962_DRC_QR_THR_WIDTH 2 /* DRC_QR_THR - [11:10] */
+#define WM8962_DRC_QR_DCY_MASK 0x0300 /* DRC_QR_DCY - [9:8] */
+#define WM8962_DRC_QR_DCY_SHIFT 8 /* DRC_QR_DCY - [9:8] */
+#define WM8962_DRC_QR_DCY_WIDTH 2 /* DRC_QR_DCY - [9:8] */
+#define WM8962_DRC_NG_EXP_MASK 0x00C0 /* DRC_NG_EXP - [7:6] */
+#define WM8962_DRC_NG_EXP_SHIFT 6 /* DRC_NG_EXP - [7:6] */
+#define WM8962_DRC_NG_EXP_WIDTH 2 /* DRC_NG_EXP - [7:6] */
+#define WM8962_DRC_HI_COMP_MASK 0x0038 /* DRC_HI_COMP - [5:3] */
+#define WM8962_DRC_HI_COMP_SHIFT 3 /* DRC_HI_COMP - [5:3] */
+#define WM8962_DRC_HI_COMP_WIDTH 3 /* DRC_HI_COMP - [5:3] */
+#define WM8962_DRC_LO_COMP_MASK 0x0007 /* DRC_LO_COMP - [2:0] */
+#define WM8962_DRC_LO_COMP_SHIFT 0 /* DRC_LO_COMP - [2:0] */
+#define WM8962_DRC_LO_COMP_WIDTH 3 /* DRC_LO_COMP - [2:0] */
+
+/*
+ * R279 (0x117) - DRC 4
+ */
+#define WM8962_DRC_KNEE_IP_MASK 0x07E0 /* DRC_KNEE_IP - [10:5] */
+#define WM8962_DRC_KNEE_IP_SHIFT 5 /* DRC_KNEE_IP - [10:5] */
+#define WM8962_DRC_KNEE_IP_WIDTH 6 /* DRC_KNEE_IP - [10:5] */
+#define WM8962_DRC_KNEE_OP_MASK 0x001F /* DRC_KNEE_OP - [4:0] */
+#define WM8962_DRC_KNEE_OP_SHIFT 0 /* DRC_KNEE_OP - [4:0] */
+#define WM8962_DRC_KNEE_OP_WIDTH 5 /* DRC_KNEE_OP - [4:0] */
+
+/*
+ * R280 (0x118) - DRC 5
+ */
+#define WM8962_DRC_KNEE2_IP_MASK 0x03E0 /* DRC_KNEE2_IP - [9:5] */
+#define WM8962_DRC_KNEE2_IP_SHIFT 5 /* DRC_KNEE2_IP - [9:5] */
+#define WM8962_DRC_KNEE2_IP_WIDTH 5 /* DRC_KNEE2_IP - [9:5] */
+#define WM8962_DRC_KNEE2_OP_MASK 0x001F /* DRC_KNEE2_OP - [4:0] */
+#define WM8962_DRC_KNEE2_OP_SHIFT 0 /* DRC_KNEE2_OP - [4:0] */
+#define WM8962_DRC_KNEE2_OP_WIDTH 5 /* DRC_KNEE2_OP - [4:0] */
+
+/*
+ * R285 (0x11D) - Tloopback
+ */
+#define WM8962_TLB_ENA 0x0002 /* TLB_ENA */
+#define WM8962_TLB_ENA_MASK 0x0002 /* TLB_ENA */
+#define WM8962_TLB_ENA_SHIFT 1 /* TLB_ENA */
+#define WM8962_TLB_ENA_WIDTH 1 /* TLB_ENA */
+#define WM8962_TLB_MODE 0x0001 /* TLB_MODE */
+#define WM8962_TLB_MODE_MASK 0x0001 /* TLB_MODE */
+#define WM8962_TLB_MODE_SHIFT 0 /* TLB_MODE */
+#define WM8962_TLB_MODE_WIDTH 1 /* TLB_MODE */
+
+/*
+ * R335 (0x14F) - EQ1
+ */
+#define WM8962_EQ_SHARED_COEFF 0x0004 /* EQ_SHARED_COEFF */
+#define WM8962_EQ_SHARED_COEFF_MASK 0x0004 /* EQ_SHARED_COEFF */
+#define WM8962_EQ_SHARED_COEFF_SHIFT 2 /* EQ_SHARED_COEFF */
+#define WM8962_EQ_SHARED_COEFF_WIDTH 1 /* EQ_SHARED_COEFF */
+#define WM8962_EQ_SHARED_COEFF_SEL 0x0002 /* EQ_SHARED_COEFF_SEL */
+#define WM8962_EQ_SHARED_COEFF_SEL_MASK 0x0002 /* EQ_SHARED_COEFF_SEL */
+#define WM8962_EQ_SHARED_COEFF_SEL_SHIFT 1 /* EQ_SHARED_COEFF_SEL */
+#define WM8962_EQ_SHARED_COEFF_SEL_WIDTH 1 /* EQ_SHARED_COEFF_SEL */
+#define WM8962_EQ_ENA 0x0001 /* EQ_ENA */
+#define WM8962_EQ_ENA_MASK 0x0001 /* EQ_ENA */
+#define WM8962_EQ_ENA_SHIFT 0 /* EQ_ENA */
+#define WM8962_EQ_ENA_WIDTH 1 /* EQ_ENA */
+
+/*
+ * R336 (0x150) - EQ2
+ */
+#define WM8962_EQL_B1_GAIN_MASK 0xF800 /* EQL_B1_GAIN - [15:11] */
+#define WM8962_EQL_B1_GAIN_SHIFT 11 /* EQL_B1_GAIN - [15:11] */
+#define WM8962_EQL_B1_GAIN_WIDTH 5 /* EQL_B1_GAIN - [15:11] */
+#define WM8962_EQL_B2_GAIN_MASK 0x07C0 /* EQL_B2_GAIN - [10:6] */
+#define WM8962_EQL_B2_GAIN_SHIFT 6 /* EQL_B2_GAIN - [10:6] */
+#define WM8962_EQL_B2_GAIN_WIDTH 5 /* EQL_B2_GAIN - [10:6] */
+#define WM8962_EQL_B3_GAIN_MASK 0x003E /* EQL_B3_GAIN - [5:1] */
+#define WM8962_EQL_B3_GAIN_SHIFT 1 /* EQL_B3_GAIN - [5:1] */
+#define WM8962_EQL_B3_GAIN_WIDTH 5 /* EQL_B3_GAIN - [5:1] */
+
+/*
+ * R337 (0x151) - EQ3
+ */
+#define WM8962_EQL_B4_GAIN_MASK 0xF800 /* EQL_B4_GAIN - [15:11] */
+#define WM8962_EQL_B4_GAIN_SHIFT 11 /* EQL_B4_GAIN - [15:11] */
+#define WM8962_EQL_B4_GAIN_WIDTH 5 /* EQL_B4_GAIN - [15:11] */
+#define WM8962_EQL_B5_GAIN_MASK 0x07C0 /* EQL_B5_GAIN - [10:6] */
+#define WM8962_EQL_B5_GAIN_SHIFT 6 /* EQL_B5_GAIN - [10:6] */
+#define WM8962_EQL_B5_GAIN_WIDTH 5 /* EQL_B5_GAIN - [10:6] */
+
+/*
+ * R338 (0x152) - EQ4
+ */
+#define WM8962_EQL_B1_A_MASK 0xFFFF /* EQL_B1_A - [15:0] */
+#define WM8962_EQL_B1_A_SHIFT 0 /* EQL_B1_A - [15:0] */
+#define WM8962_EQL_B1_A_WIDTH 16 /* EQL_B1_A - [15:0] */
+
+/*
+ * R339 (0x153) - EQ5
+ */
+#define WM8962_EQL_B1_B_MASK 0xFFFF /* EQL_B1_B - [15:0] */
+#define WM8962_EQL_B1_B_SHIFT 0 /* EQL_B1_B - [15:0] */
+#define WM8962_EQL_B1_B_WIDTH 16 /* EQL_B1_B - [15:0] */
+
+/*
+ * R340 (0x154) - EQ6
+ */
+#define WM8962_EQL_B1_PG_MASK 0xFFFF /* EQL_B1_PG - [15:0] */
+#define WM8962_EQL_B1_PG_SHIFT 0 /* EQL_B1_PG - [15:0] */
+#define WM8962_EQL_B1_PG_WIDTH 16 /* EQL_B1_PG - [15:0] */
+
+/*
+ * R341 (0x155) - EQ7
+ */
+#define WM8962_EQL_B2_A_MASK 0xFFFF /* EQL_B2_A - [15:0] */
+#define WM8962_EQL_B2_A_SHIFT 0 /* EQL_B2_A - [15:0] */
+#define WM8962_EQL_B2_A_WIDTH 16 /* EQL_B2_A - [15:0] */
+
+/*
+ * R342 (0x156) - EQ8
+ */
+#define WM8962_EQL_B2_B_MASK 0xFFFF /* EQL_B2_B - [15:0] */
+#define WM8962_EQL_B2_B_SHIFT 0 /* EQL_B2_B - [15:0] */
+#define WM8962_EQL_B2_B_WIDTH 16 /* EQL_B2_B - [15:0] */
+
+/*
+ * R343 (0x157) - EQ9
+ */
+#define WM8962_EQL_B2_C_MASK 0xFFFF /* EQL_B2_C - [15:0] */
+#define WM8962_EQL_B2_C_SHIFT 0 /* EQL_B2_C - [15:0] */
+#define WM8962_EQL_B2_C_WIDTH 16 /* EQL_B2_C - [15:0] */
+
+/*
+ * R344 (0x158) - EQ10
+ */
+#define WM8962_EQL_B2_PG_MASK 0xFFFF /* EQL_B2_PG - [15:0] */
+#define WM8962_EQL_B2_PG_SHIFT 0 /* EQL_B2_PG - [15:0] */
+#define WM8962_EQL_B2_PG_WIDTH 16 /* EQL_B2_PG - [15:0] */
+
+/*
+ * R345 (0x159) - EQ11
+ */
+#define WM8962_EQL_B3_A_MASK 0xFFFF /* EQL_B3_A - [15:0] */
+#define WM8962_EQL_B3_A_SHIFT 0 /* EQL_B3_A - [15:0] */
+#define WM8962_EQL_B3_A_WIDTH 16 /* EQL_B3_A - [15:0] */
+
+/*
+ * R346 (0x15A) - EQ12
+ */
+#define WM8962_EQL_B3_B_MASK 0xFFFF /* EQL_B3_B - [15:0] */
+#define WM8962_EQL_B3_B_SHIFT 0 /* EQL_B3_B - [15:0] */
+#define WM8962_EQL_B3_B_WIDTH 16 /* EQL_B3_B - [15:0] */
+
+/*
+ * R347 (0x15B) - EQ13
+ */
+#define WM8962_EQL_B3_C_MASK 0xFFFF /* EQL_B3_C - [15:0] */
+#define WM8962_EQL_B3_C_SHIFT 0 /* EQL_B3_C - [15:0] */
+#define WM8962_EQL_B3_C_WIDTH 16 /* EQL_B3_C - [15:0] */
+
+/*
+ * R348 (0x15C) - EQ14
+ */
+#define WM8962_EQL_B3_PG_MASK 0xFFFF /* EQL_B3_PG - [15:0] */
+#define WM8962_EQL_B3_PG_SHIFT 0 /* EQL_B3_PG - [15:0] */
+#define WM8962_EQL_B3_PG_WIDTH 16 /* EQL_B3_PG - [15:0] */
+
+/*
+ * R349 (0x15D) - EQ15
+ */
+#define WM8962_EQL_B4_A_MASK 0xFFFF /* EQL_B4_A - [15:0] */
+#define WM8962_EQL_B4_A_SHIFT 0 /* EQL_B4_A - [15:0] */
+#define WM8962_EQL_B4_A_WIDTH 16 /* EQL_B4_A - [15:0] */
+
+/*
+ * R350 (0x15E) - EQ16
+ */
+#define WM8962_EQL_B4_B_MASK 0xFFFF /* EQL_B4_B - [15:0] */
+#define WM8962_EQL_B4_B_SHIFT 0 /* EQL_B4_B - [15:0] */
+#define WM8962_EQL_B4_B_WIDTH 16 /* EQL_B4_B - [15:0] */
+
+/*
+ * R351 (0x15F) - EQ17
+ */
+#define WM8962_EQL_B4_C_MASK 0xFFFF /* EQL_B4_C - [15:0] */
+#define WM8962_EQL_B4_C_SHIFT 0 /* EQL_B4_C - [15:0] */
+#define WM8962_EQL_B4_C_WIDTH 16 /* EQL_B4_C - [15:0] */
+
+/*
+ * R352 (0x160) - EQ18
+ */
+#define WM8962_EQL_B4_PG_MASK 0xFFFF /* EQL_B4_PG - [15:0] */
+#define WM8962_EQL_B4_PG_SHIFT 0 /* EQL_B4_PG - [15:0] */
+#define WM8962_EQL_B4_PG_WIDTH 16 /* EQL_B4_PG - [15:0] */
+
+/*
+ * R353 (0x161) - EQ19
+ */
+#define WM8962_EQL_B5_A_MASK 0xFFFF /* EQL_B5_A - [15:0] */
+#define WM8962_EQL_B5_A_SHIFT 0 /* EQL_B5_A - [15:0] */
+#define WM8962_EQL_B5_A_WIDTH 16 /* EQL_B5_A - [15:0] */
+
+/*
+ * R354 (0x162) - EQ20
+ */
+#define WM8962_EQL_B5_B_MASK 0xFFFF /* EQL_B5_B - [15:0] */
+#define WM8962_EQL_B5_B_SHIFT 0 /* EQL_B5_B - [15:0] */
+#define WM8962_EQL_B5_B_WIDTH 16 /* EQL_B5_B - [15:0] */
+
+/*
+ * R355 (0x163) - EQ21
+ */
+#define WM8962_EQL_B5_PG_MASK 0xFFFF /* EQL_B5_PG - [15:0] */
+#define WM8962_EQL_B5_PG_SHIFT 0 /* EQL_B5_PG - [15:0] */
+#define WM8962_EQL_B5_PG_WIDTH 16 /* EQL_B5_PG - [15:0] */
+
+/*
+ * R356 (0x164) - EQ22
+ */
+#define WM8962_EQR_B1_GAIN_MASK 0xF800 /* EQR_B1_GAIN - [15:11] */
+#define WM8962_EQR_B1_GAIN_SHIFT 11 /* EQR_B1_GAIN - [15:11] */
+#define WM8962_EQR_B1_GAIN_WIDTH 5 /* EQR_B1_GAIN - [15:11] */
+#define WM8962_EQR_B2_GAIN_MASK 0x07C0 /* EQR_B2_GAIN - [10:6] */
+#define WM8962_EQR_B2_GAIN_SHIFT 6 /* EQR_B2_GAIN - [10:6] */
+#define WM8962_EQR_B2_GAIN_WIDTH 5 /* EQR_B2_GAIN - [10:6] */
+#define WM8962_EQR_B3_GAIN_MASK 0x003E /* EQR_B3_GAIN - [5:1] */
+#define WM8962_EQR_B3_GAIN_SHIFT 1 /* EQR_B3_GAIN - [5:1] */
+#define WM8962_EQR_B3_GAIN_WIDTH 5 /* EQR_B3_GAIN - [5:1] */
+
+/*
+ * R357 (0x165) - EQ23
+ */
+#define WM8962_EQR_B4_GAIN_MASK 0xF800 /* EQR_B4_GAIN - [15:11] */
+#define WM8962_EQR_B4_GAIN_SHIFT 11 /* EQR_B4_GAIN - [15:11] */
+#define WM8962_EQR_B4_GAIN_WIDTH 5 /* EQR_B4_GAIN - [15:11] */
+#define WM8962_EQR_B5_GAIN_MASK 0x07C0 /* EQR_B5_GAIN - [10:6] */
+#define WM8962_EQR_B5_GAIN_SHIFT 6 /* EQR_B5_GAIN - [10:6] */
+#define WM8962_EQR_B5_GAIN_WIDTH 5 /* EQR_B5_GAIN - [10:6] */
+
+/*
+ * R358 (0x166) - EQ24
+ */
+#define WM8962_EQR_B1_A_MASK 0xFFFF /* EQR_B1_A - [15:0] */
+#define WM8962_EQR_B1_A_SHIFT 0 /* EQR_B1_A - [15:0] */
+#define WM8962_EQR_B1_A_WIDTH 16 /* EQR_B1_A - [15:0] */
+
+/*
+ * R359 (0x167) - EQ25
+ */
+#define WM8962_EQR_B1_B_MASK 0xFFFF /* EQR_B1_B - [15:0] */
+#define WM8962_EQR_B1_B_SHIFT 0 /* EQR_B1_B - [15:0] */
+#define WM8962_EQR_B1_B_WIDTH 16 /* EQR_B1_B - [15:0] */
+
+/*
+ * R360 (0x168) - EQ26
+ */
+#define WM8962_EQR_B1_PG_MASK 0xFFFF /* EQR_B1_PG - [15:0] */
+#define WM8962_EQR_B1_PG_SHIFT 0 /* EQR_B1_PG - [15:0] */
+#define WM8962_EQR_B1_PG_WIDTH 16 /* EQR_B1_PG - [15:0] */
+
+/*
+ * R361 (0x169) - EQ27
+ */
+#define WM8962_EQR_B2_A_MASK 0xFFFF /* EQR_B2_A - [15:0] */
+#define WM8962_EQR_B2_A_SHIFT 0 /* EQR_B2_A - [15:0] */
+#define WM8962_EQR_B2_A_WIDTH 16 /* EQR_B2_A - [15:0] */
+
+/*
+ * R362 (0x16A) - EQ28
+ */
+#define WM8962_EQR_B2_B_MASK 0xFFFF /* EQR_B2_B - [15:0] */
+#define WM8962_EQR_B2_B_SHIFT 0 /* EQR_B2_B - [15:0] */
+#define WM8962_EQR_B2_B_WIDTH 16 /* EQR_B2_B - [15:0] */
+
+/*
+ * R363 (0x16B) - EQ29
+ */
+#define WM8962_EQR_B2_C_MASK 0xFFFF /* EQR_B2_C - [15:0] */
+#define WM8962_EQR_B2_C_SHIFT 0 /* EQR_B2_C - [15:0] */
+#define WM8962_EQR_B2_C_WIDTH 16 /* EQR_B2_C - [15:0] */
+
+/*
+ * R364 (0x16C) - EQ30
+ */
+#define WM8962_EQR_B2_PG_MASK 0xFFFF /* EQR_B2_PG - [15:0] */
+#define WM8962_EQR_B2_PG_SHIFT 0 /* EQR_B2_PG - [15:0] */
+#define WM8962_EQR_B2_PG_WIDTH 16 /* EQR_B2_PG - [15:0] */
+
+/*
+ * R365 (0x16D) - EQ31
+ */
+#define WM8962_EQR_B3_A_MASK 0xFFFF /* EQR_B3_A - [15:0] */
+#define WM8962_EQR_B3_A_SHIFT 0 /* EQR_B3_A - [15:0] */
+#define WM8962_EQR_B3_A_WIDTH 16 /* EQR_B3_A - [15:0] */
+
+/*
+ * R366 (0x16E) - EQ32
+ */
+#define WM8962_EQR_B3_B_MASK 0xFFFF /* EQR_B3_B - [15:0] */
+#define WM8962_EQR_B3_B_SHIFT 0 /* EQR_B3_B - [15:0] */
+#define WM8962_EQR_B3_B_WIDTH 16 /* EQR_B3_B - [15:0] */
+
+/*
+ * R367 (0x16F) - EQ33
+ */
+#define WM8962_EQR_B3_C_MASK 0xFFFF /* EQR_B3_C - [15:0] */
+#define WM8962_EQR_B3_C_SHIFT 0 /* EQR_B3_C - [15:0] */
+#define WM8962_EQR_B3_C_WIDTH 16 /* EQR_B3_C - [15:0] */
+
+/*
+ * R368 (0x170) - EQ34
+ */
+#define WM8962_EQR_B3_PG_MASK 0xFFFF /* EQR_B3_PG - [15:0] */
+#define WM8962_EQR_B3_PG_SHIFT 0 /* EQR_B3_PG - [15:0] */
+#define WM8962_EQR_B3_PG_WIDTH 16 /* EQR_B3_PG - [15:0] */
+
+/*
+ * R369 (0x171) - EQ35
+ */
+#define WM8962_EQR_B4_A_MASK 0xFFFF /* EQR_B4_A - [15:0] */
+#define WM8962_EQR_B4_A_SHIFT 0 /* EQR_B4_A - [15:0] */
+#define WM8962_EQR_B4_A_WIDTH 16 /* EQR_B4_A - [15:0] */
+
+/*
+ * R370 (0x172) - EQ36
+ */
+#define WM8962_EQR_B4_B_MASK 0xFFFF /* EQR_B4_B - [15:0] */
+#define WM8962_EQR_B4_B_SHIFT 0 /* EQR_B4_B - [15:0] */
+#define WM8962_EQR_B4_B_WIDTH 16 /* EQR_B4_B - [15:0] */
+
+/*
+ * R371 (0x173) - EQ37
+ */
+#define WM8962_EQR_B4_C_MASK 0xFFFF /* EQR_B4_C - [15:0] */
+#define WM8962_EQR_B4_C_SHIFT 0 /* EQR_B4_C - [15:0] */
+#define WM8962_EQR_B4_C_WIDTH 16 /* EQR_B4_C - [15:0] */
+
+/*
+ * R372 (0x174) - EQ38
+ */
+#define WM8962_EQR_B4_PG_MASK 0xFFFF /* EQR_B4_PG - [15:0] */
+#define WM8962_EQR_B4_PG_SHIFT 0 /* EQR_B4_PG - [15:0] */
+#define WM8962_EQR_B4_PG_WIDTH 16 /* EQR_B4_PG - [15:0] */
+
+/*
+ * R373 (0x175) - EQ39
+ */
+#define WM8962_EQR_B5_A_MASK 0xFFFF /* EQR_B5_A - [15:0] */
+#define WM8962_EQR_B5_A_SHIFT 0 /* EQR_B5_A - [15:0] */
+#define WM8962_EQR_B5_A_WIDTH 16 /* EQR_B5_A - [15:0] */
+
+/*
+ * R374 (0x176) - EQ40
+ */
+#define WM8962_EQR_B5_B_MASK 0xFFFF /* EQR_B5_B - [15:0] */
+#define WM8962_EQR_B5_B_SHIFT 0 /* EQR_B5_B - [15:0] */
+#define WM8962_EQR_B5_B_WIDTH 16 /* EQR_B5_B - [15:0] */
+
+/*
+ * R375 (0x177) - EQ41
+ */
+#define WM8962_EQR_B5_PG_MASK 0xFFFF /* EQR_B5_PG - [15:0] */
+#define WM8962_EQR_B5_PG_SHIFT 0 /* EQR_B5_PG - [15:0] */
+#define WM8962_EQR_B5_PG_WIDTH 16 /* EQR_B5_PG - [15:0] */
+
+/*
+ * R513 (0x201) - GPIO 2
+ */
+#define WM8962_GP2_POL 0x0400 /* GP2_POL */
+#define WM8962_GP2_POL_MASK 0x0400 /* GP2_POL */
+#define WM8962_GP2_POL_SHIFT 10 /* GP2_POL */
+#define WM8962_GP2_POL_WIDTH 1 /* GP2_POL */
+#define WM8962_GP2_LVL 0x0040 /* GP2_LVL */
+#define WM8962_GP2_LVL_MASK 0x0040 /* GP2_LVL */
+#define WM8962_GP2_LVL_SHIFT 6 /* GP2_LVL */
+#define WM8962_GP2_LVL_WIDTH 1 /* GP2_LVL */
+#define WM8962_GP2_FN_MASK 0x001F /* GP2_FN - [4:0] */
+#define WM8962_GP2_FN_SHIFT 0 /* GP2_FN - [4:0] */
+#define WM8962_GP2_FN_WIDTH 5 /* GP2_FN - [4:0] */
+
+/*
+ * R514 (0x202) - GPIO 3
+ */
+#define WM8962_GP3_POL 0x0400 /* GP3_POL */
+#define WM8962_GP3_POL_MASK 0x0400 /* GP3_POL */
+#define WM8962_GP3_POL_SHIFT 10 /* GP3_POL */
+#define WM8962_GP3_POL_WIDTH 1 /* GP3_POL */
+#define WM8962_GP3_LVL 0x0040 /* GP3_LVL */
+#define WM8962_GP3_LVL_MASK 0x0040 /* GP3_LVL */
+#define WM8962_GP3_LVL_SHIFT 6 /* GP3_LVL */
+#define WM8962_GP3_LVL_WIDTH 1 /* GP3_LVL */
+#define WM8962_GP3_FN_MASK 0x001F /* GP3_FN - [4:0] */
+#define WM8962_GP3_FN_SHIFT 0 /* GP3_FN - [4:0] */
+#define WM8962_GP3_FN_WIDTH 5 /* GP3_FN - [4:0] */
+
+/*
+ * R516 (0x204) - GPIO 5
+ */
+#define WM8962_GP5_DIR 0x8000 /* GP5_DIR */
+#define WM8962_GP5_DIR_MASK 0x8000 /* GP5_DIR */
+#define WM8962_GP5_DIR_SHIFT 15 /* GP5_DIR */
+#define WM8962_GP5_DIR_WIDTH 1 /* GP5_DIR */
+#define WM8962_GP5_PU 0x4000 /* GP5_PU */
+#define WM8962_GP5_PU_MASK 0x4000 /* GP5_PU */
+#define WM8962_GP5_PU_SHIFT 14 /* GP5_PU */
+#define WM8962_GP5_PU_WIDTH 1 /* GP5_PU */
+#define WM8962_GP5_PD 0x2000 /* GP5_PD */
+#define WM8962_GP5_PD_MASK 0x2000 /* GP5_PD */
+#define WM8962_GP5_PD_SHIFT 13 /* GP5_PD */
+#define WM8962_GP5_PD_WIDTH 1 /* GP5_PD */
+#define WM8962_GP5_POL 0x0400 /* GP5_POL */
+#define WM8962_GP5_POL_MASK 0x0400 /* GP5_POL */
+#define WM8962_GP5_POL_SHIFT 10 /* GP5_POL */
+#define WM8962_GP5_POL_WIDTH 1 /* GP5_POL */
+#define WM8962_GP5_OP_CFG 0x0200 /* GP5_OP_CFG */
+#define WM8962_GP5_OP_CFG_MASK 0x0200 /* GP5_OP_CFG */
+#define WM8962_GP5_OP_CFG_SHIFT 9 /* GP5_OP_CFG */
+#define WM8962_GP5_OP_CFG_WIDTH 1 /* GP5_OP_CFG */
+#define WM8962_GP5_DB 0x0100 /* GP5_DB */
+#define WM8962_GP5_DB_MASK 0x0100 /* GP5_DB */
+#define WM8962_GP5_DB_SHIFT 8 /* GP5_DB */
+#define WM8962_GP5_DB_WIDTH 1 /* GP5_DB */
+#define WM8962_GP5_LVL 0x0040 /* GP5_LVL */
+#define WM8962_GP5_LVL_MASK 0x0040 /* GP5_LVL */
+#define WM8962_GP5_LVL_SHIFT 6 /* GP5_LVL */
+#define WM8962_GP5_LVL_WIDTH 1 /* GP5_LVL */
+#define WM8962_GP5_FN_MASK 0x001F /* GP5_FN - [4:0] */
+#define WM8962_GP5_FN_SHIFT 0 /* GP5_FN - [4:0] */
+#define WM8962_GP5_FN_WIDTH 5 /* GP5_FN - [4:0] */
+
+/*
+ * R517 (0x205) - GPIO 6
+ */
+#define WM8962_GP6_DIR 0x8000 /* GP6_DIR */
+#define WM8962_GP6_DIR_MASK 0x8000 /* GP6_DIR */
+#define WM8962_GP6_DIR_SHIFT 15 /* GP6_DIR */
+#define WM8962_GP6_DIR_WIDTH 1 /* GP6_DIR */
+#define WM8962_GP6_PU 0x4000 /* GP6_PU */
+#define WM8962_GP6_PU_MASK 0x4000 /* GP6_PU */
+#define WM8962_GP6_PU_SHIFT 14 /* GP6_PU */
+#define WM8962_GP6_PU_WIDTH 1 /* GP6_PU */
+#define WM8962_GP6_PD 0x2000 /* GP6_PD */
+#define WM8962_GP6_PD_MASK 0x2000 /* GP6_PD */
+#define WM8962_GP6_PD_SHIFT 13 /* GP6_PD */
+#define WM8962_GP6_PD_WIDTH 1 /* GP6_PD */
+#define WM8962_GP6_POL 0x0400 /* GP6_POL */
+#define WM8962_GP6_POL_MASK 0x0400 /* GP6_POL */
+#define WM8962_GP6_POL_SHIFT 10 /* GP6_POL */
+#define WM8962_GP6_POL_WIDTH 1 /* GP6_POL */
+#define WM8962_GP6_OP_CFG 0x0200 /* GP6_OP_CFG */
+#define WM8962_GP6_OP_CFG_MASK 0x0200 /* GP6_OP_CFG */
+#define WM8962_GP6_OP_CFG_SHIFT 9 /* GP6_OP_CFG */
+#define WM8962_GP6_OP_CFG_WIDTH 1 /* GP6_OP_CFG */
+#define WM8962_GP6_DB 0x0100 /* GP6_DB */
+#define WM8962_GP6_DB_MASK 0x0100 /* GP6_DB */
+#define WM8962_GP6_DB_SHIFT 8 /* GP6_DB */
+#define WM8962_GP6_DB_WIDTH 1 /* GP6_DB */
+#define WM8962_GP6_LVL 0x0040 /* GP6_LVL */
+#define WM8962_GP6_LVL_MASK 0x0040 /* GP6_LVL */
+#define WM8962_GP6_LVL_SHIFT 6 /* GP6_LVL */
+#define WM8962_GP6_LVL_WIDTH 1 /* GP6_LVL */
+#define WM8962_GP6_FN_MASK 0x001F /* GP6_FN - [4:0] */
+#define WM8962_GP6_FN_SHIFT 0 /* GP6_FN - [4:0] */
+#define WM8962_GP6_FN_WIDTH 5 /* GP6_FN - [4:0] */
+
+/*
+ * R560 (0x230) - Interrupt Status 1
+ */
+#define WM8962_GP6_EINT 0x0020 /* GP6_EINT */
+#define WM8962_GP6_EINT_MASK 0x0020 /* GP6_EINT */
+#define WM8962_GP6_EINT_SHIFT 5 /* GP6_EINT */
+#define WM8962_GP6_EINT_WIDTH 1 /* GP6_EINT */
+#define WM8962_GP5_EINT 0x0010 /* GP5_EINT */
+#define WM8962_GP5_EINT_MASK 0x0010 /* GP5_EINT */
+#define WM8962_GP5_EINT_SHIFT 4 /* GP5_EINT */
+#define WM8962_GP5_EINT_WIDTH 1 /* GP5_EINT */
+
+/*
+ * R561 (0x231) - Interrupt Status 2
+ */
+#define WM8962_MICSCD_EINT 0x8000 /* MICSCD_EINT */
+#define WM8962_MICSCD_EINT_MASK 0x8000 /* MICSCD_EINT */
+#define WM8962_MICSCD_EINT_SHIFT 15 /* MICSCD_EINT */
+#define WM8962_MICSCD_EINT_WIDTH 1 /* MICSCD_EINT */
+#define WM8962_MICD_EINT 0x4000 /* MICD_EINT */
+#define WM8962_MICD_EINT_MASK 0x4000 /* MICD_EINT */
+#define WM8962_MICD_EINT_SHIFT 14 /* MICD_EINT */
+#define WM8962_MICD_EINT_WIDTH 1 /* MICD_EINT */
+#define WM8962_FIFOS_ERR_EINT 0x2000 /* FIFOS_ERR_EINT */
+#define WM8962_FIFOS_ERR_EINT_MASK 0x2000 /* FIFOS_ERR_EINT */
+#define WM8962_FIFOS_ERR_EINT_SHIFT 13 /* FIFOS_ERR_EINT */
+#define WM8962_FIFOS_ERR_EINT_WIDTH 1 /* FIFOS_ERR_EINT */
+#define WM8962_ALC_LOCK_EINT 0x1000 /* ALC_LOCK_EINT */
+#define WM8962_ALC_LOCK_EINT_MASK 0x1000 /* ALC_LOCK_EINT */
+#define WM8962_ALC_LOCK_EINT_SHIFT 12 /* ALC_LOCK_EINT */
+#define WM8962_ALC_LOCK_EINT_WIDTH 1 /* ALC_LOCK_EINT */
+#define WM8962_ALC_THRESH_EINT 0x0800 /* ALC_THRESH_EINT */
+#define WM8962_ALC_THRESH_EINT_MASK 0x0800 /* ALC_THRESH_EINT */
+#define WM8962_ALC_THRESH_EINT_SHIFT 11 /* ALC_THRESH_EINT */
+#define WM8962_ALC_THRESH_EINT_WIDTH 1 /* ALC_THRESH_EINT */
+#define WM8962_ALC_SAT_EINT 0x0400 /* ALC_SAT_EINT */
+#define WM8962_ALC_SAT_EINT_MASK 0x0400 /* ALC_SAT_EINT */
+#define WM8962_ALC_SAT_EINT_SHIFT 10 /* ALC_SAT_EINT */
+#define WM8962_ALC_SAT_EINT_WIDTH 1 /* ALC_SAT_EINT */
+#define WM8962_ALC_PKOVR_EINT 0x0200 /* ALC_PKOVR_EINT */
+#define WM8962_ALC_PKOVR_EINT_MASK 0x0200 /* ALC_PKOVR_EINT */
+#define WM8962_ALC_PKOVR_EINT_SHIFT 9 /* ALC_PKOVR_EINT */
+#define WM8962_ALC_PKOVR_EINT_WIDTH 1 /* ALC_PKOVR_EINT */
+#define WM8962_ALC_NGATE_EINT 0x0100 /* ALC_NGATE_EINT */
+#define WM8962_ALC_NGATE_EINT_MASK 0x0100 /* ALC_NGATE_EINT */
+#define WM8962_ALC_NGATE_EINT_SHIFT 8 /* ALC_NGATE_EINT */
+#define WM8962_ALC_NGATE_EINT_WIDTH 1 /* ALC_NGATE_EINT */
+#define WM8962_WSEQ_DONE_EINT 0x0080 /* WSEQ_DONE_EINT */
+#define WM8962_WSEQ_DONE_EINT_MASK 0x0080 /* WSEQ_DONE_EINT */
+#define WM8962_WSEQ_DONE_EINT_SHIFT 7 /* WSEQ_DONE_EINT */
+#define WM8962_WSEQ_DONE_EINT_WIDTH 1 /* WSEQ_DONE_EINT */
+#define WM8962_DRC_ACTDET_EINT 0x0040 /* DRC_ACTDET_EINT */
+#define WM8962_DRC_ACTDET_EINT_MASK 0x0040 /* DRC_ACTDET_EINT */
+#define WM8962_DRC_ACTDET_EINT_SHIFT 6 /* DRC_ACTDET_EINT */
+#define WM8962_DRC_ACTDET_EINT_WIDTH 1 /* DRC_ACTDET_EINT */
+#define WM8962_FLL_LOCK_EINT 0x0020 /* FLL_LOCK_EINT */
+#define WM8962_FLL_LOCK_EINT_MASK 0x0020 /* FLL_LOCK_EINT */
+#define WM8962_FLL_LOCK_EINT_SHIFT 5 /* FLL_LOCK_EINT */
+#define WM8962_FLL_LOCK_EINT_WIDTH 1 /* FLL_LOCK_EINT */
+#define WM8962_PLL3_LOCK_EINT 0x0008 /* PLL3_LOCK_EINT */
+#define WM8962_PLL3_LOCK_EINT_MASK 0x0008 /* PLL3_LOCK_EINT */
+#define WM8962_PLL3_LOCK_EINT_SHIFT 3 /* PLL3_LOCK_EINT */
+#define WM8962_PLL3_LOCK_EINT_WIDTH 1 /* PLL3_LOCK_EINT */
+#define WM8962_PLL2_LOCK_EINT 0x0004 /* PLL2_LOCK_EINT */
+#define WM8962_PLL2_LOCK_EINT_MASK 0x0004 /* PLL2_LOCK_EINT */
+#define WM8962_PLL2_LOCK_EINT_SHIFT 2 /* PLL2_LOCK_EINT */
+#define WM8962_PLL2_LOCK_EINT_WIDTH 1 /* PLL2_LOCK_EINT */
+#define WM8962_TEMP_SHUT_EINT 0x0001 /* TEMP_SHUT_EINT */
+#define WM8962_TEMP_SHUT_EINT_MASK 0x0001 /* TEMP_SHUT_EINT */
+#define WM8962_TEMP_SHUT_EINT_SHIFT 0 /* TEMP_SHUT_EINT */
+#define WM8962_TEMP_SHUT_EINT_WIDTH 1 /* TEMP_SHUT_EINT */
+
+/*
+ * R568 (0x238) - Interrupt Status 1 Mask
+ */
+#define WM8962_IM_GP6_EINT 0x0020 /* IM_GP6_EINT */
+#define WM8962_IM_GP6_EINT_MASK 0x0020 /* IM_GP6_EINT */
+#define WM8962_IM_GP6_EINT_SHIFT 5 /* IM_GP6_EINT */
+#define WM8962_IM_GP6_EINT_WIDTH 1 /* IM_GP6_EINT */
+#define WM8962_IM_GP5_EINT 0x0010 /* IM_GP5_EINT */
+#define WM8962_IM_GP5_EINT_MASK 0x0010 /* IM_GP5_EINT */
+#define WM8962_IM_GP5_EINT_SHIFT 4 /* IM_GP5_EINT */
+#define WM8962_IM_GP5_EINT_WIDTH 1 /* IM_GP5_EINT */
+
+/*
+ * R569 (0x239) - Interrupt Status 2 Mask
+ */
+#define WM8962_IM_MICSCD_EINT 0x8000 /* IM_MICSCD_EINT */
+#define WM8962_IM_MICSCD_EINT_MASK 0x8000 /* IM_MICSCD_EINT */
+#define WM8962_IM_MICSCD_EINT_SHIFT 15 /* IM_MICSCD_EINT */
+#define WM8962_IM_MICSCD_EINT_WIDTH 1 /* IM_MICSCD_EINT */
+#define WM8962_IM_MICD_EINT 0x4000 /* IM_MICD_EINT */
+#define WM8962_IM_MICD_EINT_MASK 0x4000 /* IM_MICD_EINT */
+#define WM8962_IM_MICD_EINT_SHIFT 14 /* IM_MICD_EINT */
+#define WM8962_IM_MICD_EINT_WIDTH 1 /* IM_MICD_EINT */
+#define WM8962_IM_FIFOS_ERR_EINT 0x2000 /* IM_FIFOS_ERR_EINT */
+#define WM8962_IM_FIFOS_ERR_EINT_MASK 0x2000 /* IM_FIFOS_ERR_EINT */
+#define WM8962_IM_FIFOS_ERR_EINT_SHIFT 13 /* IM_FIFOS_ERR_EINT */
+#define WM8962_IM_FIFOS_ERR_EINT_WIDTH 1 /* IM_FIFOS_ERR_EINT */
+#define WM8962_IM_ALC_LOCK_EINT 0x1000 /* IM_ALC_LOCK_EINT */
+#define WM8962_IM_ALC_LOCK_EINT_MASK 0x1000 /* IM_ALC_LOCK_EINT */
+#define WM8962_IM_ALC_LOCK_EINT_SHIFT 12 /* IM_ALC_LOCK_EINT */
+#define WM8962_IM_ALC_LOCK_EINT_WIDTH 1 /* IM_ALC_LOCK_EINT */
+#define WM8962_IM_ALC_THRESH_EINT 0x0800 /* IM_ALC_THRESH_EINT */
+#define WM8962_IM_ALC_THRESH_EINT_MASK 0x0800 /* IM_ALC_THRESH_EINT */
+#define WM8962_IM_ALC_THRESH_EINT_SHIFT 11 /* IM_ALC_THRESH_EINT */
+#define WM8962_IM_ALC_THRESH_EINT_WIDTH 1 /* IM_ALC_THRESH_EINT */
+#define WM8962_IM_ALC_SAT_EINT 0x0400 /* IM_ALC_SAT_EINT */
+#define WM8962_IM_ALC_SAT_EINT_MASK 0x0400 /* IM_ALC_SAT_EINT */
+#define WM8962_IM_ALC_SAT_EINT_SHIFT 10 /* IM_ALC_SAT_EINT */
+#define WM8962_IM_ALC_SAT_EINT_WIDTH 1 /* IM_ALC_SAT_EINT */
+#define WM8962_IM_ALC_PKOVR_EINT 0x0200 /* IM_ALC_PKOVR_EINT */
+#define WM8962_IM_ALC_PKOVR_EINT_MASK 0x0200 /* IM_ALC_PKOVR_EINT */
+#define WM8962_IM_ALC_PKOVR_EINT_SHIFT 9 /* IM_ALC_PKOVR_EINT */
+#define WM8962_IM_ALC_PKOVR_EINT_WIDTH 1 /* IM_ALC_PKOVR_EINT */
+#define WM8962_IM_ALC_NGATE_EINT 0x0100 /* IM_ALC_NGATE_EINT */
+#define WM8962_IM_ALC_NGATE_EINT_MASK 0x0100 /* IM_ALC_NGATE_EINT */
+#define WM8962_IM_ALC_NGATE_EINT_SHIFT 8 /* IM_ALC_NGATE_EINT */
+#define WM8962_IM_ALC_NGATE_EINT_WIDTH 1 /* IM_ALC_NGATE_EINT */
+#define WM8962_IM_WSEQ_DONE_EINT 0x0080 /* IM_WSEQ_DONE_EINT */
+#define WM8962_IM_WSEQ_DONE_EINT_MASK 0x0080 /* IM_WSEQ_DONE_EINT */
+#define WM8962_IM_WSEQ_DONE_EINT_SHIFT 7 /* IM_WSEQ_DONE_EINT */
+#define WM8962_IM_WSEQ_DONE_EINT_WIDTH 1 /* IM_WSEQ_DONE_EINT */
+#define WM8962_IM_DRC_ACTDET_EINT 0x0040 /* IM_DRC_ACTDET_EINT */
+#define WM8962_IM_DRC_ACTDET_EINT_MASK 0x0040 /* IM_DRC_ACTDET_EINT */
+#define WM8962_IM_DRC_ACTDET_EINT_SHIFT 6 /* IM_DRC_ACTDET_EINT */
+#define WM8962_IM_DRC_ACTDET_EINT_WIDTH 1 /* IM_DRC_ACTDET_EINT */
+#define WM8962_IM_FLL_LOCK_EINT 0x0020 /* IM_FLL_LOCK_EINT */
+#define WM8962_IM_FLL_LOCK_EINT_MASK 0x0020 /* IM_FLL_LOCK_EINT */
+#define WM8962_IM_FLL_LOCK_EINT_SHIFT 5 /* IM_FLL_LOCK_EINT */
+#define WM8962_IM_FLL_LOCK_EINT_WIDTH 1 /* IM_FLL_LOCK_EINT */
+#define WM8962_IM_PLL3_LOCK_EINT 0x0008 /* IM_PLL3_LOCK_EINT */
+#define WM8962_IM_PLL3_LOCK_EINT_MASK 0x0008 /* IM_PLL3_LOCK_EINT */
+#define WM8962_IM_PLL3_LOCK_EINT_SHIFT 3 /* IM_PLL3_LOCK_EINT */
+#define WM8962_IM_PLL3_LOCK_EINT_WIDTH 1 /* IM_PLL3_LOCK_EINT */
+#define WM8962_IM_PLL2_LOCK_EINT 0x0004 /* IM_PLL2_LOCK_EINT */
+#define WM8962_IM_PLL2_LOCK_EINT_MASK 0x0004 /* IM_PLL2_LOCK_EINT */
+#define WM8962_IM_PLL2_LOCK_EINT_SHIFT 2 /* IM_PLL2_LOCK_EINT */
+#define WM8962_IM_PLL2_LOCK_EINT_WIDTH 1 /* IM_PLL2_LOCK_EINT */
+#define WM8962_IM_TEMP_SHUT_EINT 0x0001 /* IM_TEMP_SHUT_EINT */
+#define WM8962_IM_TEMP_SHUT_EINT_MASK 0x0001 /* IM_TEMP_SHUT_EINT */
+#define WM8962_IM_TEMP_SHUT_EINT_SHIFT 0 /* IM_TEMP_SHUT_EINT */
+#define WM8962_IM_TEMP_SHUT_EINT_WIDTH 1 /* IM_TEMP_SHUT_EINT */
+
+/*
+ * R576 (0x240) - Interrupt Control
+ */
+#define WM8962_IRQ_POL 0x0001 /* IRQ_POL */
+#define WM8962_IRQ_POL_MASK 0x0001 /* IRQ_POL */
+#define WM8962_IRQ_POL_SHIFT 0 /* IRQ_POL */
+#define WM8962_IRQ_POL_WIDTH 1 /* IRQ_POL */
+
+/*
+ * R584 (0x248) - IRQ Debounce
+ */
+#define WM8962_FLL_LOCK_DB 0x0020 /* FLL_LOCK_DB */
+#define WM8962_FLL_LOCK_DB_MASK 0x0020 /* FLL_LOCK_DB */
+#define WM8962_FLL_LOCK_DB_SHIFT 5 /* FLL_LOCK_DB */
+#define WM8962_FLL_LOCK_DB_WIDTH 1 /* FLL_LOCK_DB */
+#define WM8962_PLL3_LOCK_DB 0x0008 /* PLL3_LOCK_DB */
+#define WM8962_PLL3_LOCK_DB_MASK 0x0008 /* PLL3_LOCK_DB */
+#define WM8962_PLL3_LOCK_DB_SHIFT 3 /* PLL3_LOCK_DB */
+#define WM8962_PLL3_LOCK_DB_WIDTH 1 /* PLL3_LOCK_DB */
+#define WM8962_PLL2_LOCK_DB 0x0004 /* PLL2_LOCK_DB */
+#define WM8962_PLL2_LOCK_DB_MASK 0x0004 /* PLL2_LOCK_DB */
+#define WM8962_PLL2_LOCK_DB_SHIFT 2 /* PLL2_LOCK_DB */
+#define WM8962_PLL2_LOCK_DB_WIDTH 1 /* PLL2_LOCK_DB */
+#define WM8962_TEMP_SHUT_DB 0x0001 /* TEMP_SHUT_DB */
+#define WM8962_TEMP_SHUT_DB_MASK 0x0001 /* TEMP_SHUT_DB */
+#define WM8962_TEMP_SHUT_DB_SHIFT 0 /* TEMP_SHUT_DB */
+#define WM8962_TEMP_SHUT_DB_WIDTH 1 /* TEMP_SHUT_DB */
+
+/*
+ * R586 (0x24A) - MICINT Source Pol
+ */
+#define WM8962_MICSCD_IRQ_POL 0x8000 /* MICSCD_IRQ_POL */
+#define WM8962_MICSCD_IRQ_POL_MASK 0x8000 /* MICSCD_IRQ_POL */
+#define WM8962_MICSCD_IRQ_POL_SHIFT 15 /* MICSCD_IRQ_POL */
+#define WM8962_MICSCD_IRQ_POL_WIDTH 1 /* MICSCD_IRQ_POL */
+#define WM8962_MICD_IRQ_POL 0x4000 /* MICD_IRQ_POL */
+#define WM8962_MICD_IRQ_POL_MASK 0x4000 /* MICD_IRQ_POL */
+#define WM8962_MICD_IRQ_POL_SHIFT 14 /* MICD_IRQ_POL */
+#define WM8962_MICD_IRQ_POL_WIDTH 1 /* MICD_IRQ_POL */
+
+/*
+ * R768 (0x300) - DSP2 Power Management
+ */
+#define WM8962_DSP2_ENA 0x0001 /* DSP2_ENA */
+#define WM8962_DSP2_ENA_MASK 0x0001 /* DSP2_ENA */
+#define WM8962_DSP2_ENA_SHIFT 0 /* DSP2_ENA */
+#define WM8962_DSP2_ENA_WIDTH 1 /* DSP2_ENA */
+
+/*
+ * R1037 (0x40D) - DSP2_ExecControl
+ */
+#define WM8962_DSP2_STOPC 0x0020 /* DSP2_STOPC */
+#define WM8962_DSP2_STOPC_MASK 0x0020 /* DSP2_STOPC */
+#define WM8962_DSP2_STOPC_SHIFT 5 /* DSP2_STOPC */
+#define WM8962_DSP2_STOPC_WIDTH 1 /* DSP2_STOPC */
+#define WM8962_DSP2_STOPS 0x0010 /* DSP2_STOPS */
+#define WM8962_DSP2_STOPS_MASK 0x0010 /* DSP2_STOPS */
+#define WM8962_DSP2_STOPS_SHIFT 4 /* DSP2_STOPS */
+#define WM8962_DSP2_STOPS_WIDTH 1 /* DSP2_STOPS */
+#define WM8962_DSP2_STOPI 0x0008 /* DSP2_STOPI */
+#define WM8962_DSP2_STOPI_MASK 0x0008 /* DSP2_STOPI */
+#define WM8962_DSP2_STOPI_SHIFT 3 /* DSP2_STOPI */
+#define WM8962_DSP2_STOPI_WIDTH 1 /* DSP2_STOPI */
+#define WM8962_DSP2_STOP 0x0004 /* DSP2_STOP */
+#define WM8962_DSP2_STOP_MASK 0x0004 /* DSP2_STOP */
+#define WM8962_DSP2_STOP_SHIFT 2 /* DSP2_STOP */
+#define WM8962_DSP2_STOP_WIDTH 1 /* DSP2_STOP */
+#define WM8962_DSP2_RUNR 0x0002 /* DSP2_RUNR */
+#define WM8962_DSP2_RUNR_MASK 0x0002 /* DSP2_RUNR */
+#define WM8962_DSP2_RUNR_SHIFT 1 /* DSP2_RUNR */
+#define WM8962_DSP2_RUNR_WIDTH 1 /* DSP2_RUNR */
+#define WM8962_DSP2_RUN 0x0001 /* DSP2_RUN */
+#define WM8962_DSP2_RUN_MASK 0x0001 /* DSP2_RUN */
+#define WM8962_DSP2_RUN_SHIFT 0 /* DSP2_RUN */
+#define WM8962_DSP2_RUN_WIDTH 1 /* DSP2_RUN */
+
+/*
+ * R8192 (0x2000) - DSP2 Instruction RAM 0
+ */
+#define WM8962_DSP2_INSTR_RAM_1024_10_9_0_MASK 0x03FF /* DSP2_INSTR_RAM_1024_10_9_0 - [9:0] */
+#define WM8962_DSP2_INSTR_RAM_1024_10_9_0_SHIFT 0 /* DSP2_INSTR_RAM_1024_10_9_0 - [9:0] */
+#define WM8962_DSP2_INSTR_RAM_1024_10_9_0_WIDTH 10 /* DSP2_INSTR_RAM_1024_10_9_0 - [9:0] */
+
+/*
+ * R9216 (0x2400) - DSP2 Address RAM 2
+ */
+#define WM8962_DSP2_ADDR_RAM_1024_38_37_32_MASK 0x003F /* DSP2_ADDR_RAM_1024_38_37_32 - [5:0] */
+#define WM8962_DSP2_ADDR_RAM_1024_38_37_32_SHIFT 0 /* DSP2_ADDR_RAM_1024_38_37_32 - [5:0] */
+#define WM8962_DSP2_ADDR_RAM_1024_38_37_32_WIDTH 6 /* DSP2_ADDR_RAM_1024_38_37_32 - [5:0] */
+
+/*
+ * R9217 (0x2401) - DSP2 Address RAM 1
+ */
+#define WM8962_DSP2_ADDR_RAM_1024_38_31_16_MASK 0xFFFF /* DSP2_ADDR_RAM_1024_38_31_16 - [15:0] */
+#define WM8962_DSP2_ADDR_RAM_1024_38_31_16_SHIFT 0 /* DSP2_ADDR_RAM_1024_38_31_16 - [15:0] */
+#define WM8962_DSP2_ADDR_RAM_1024_38_31_16_WIDTH 16 /* DSP2_ADDR_RAM_1024_38_31_16 - [15:0] */
+
+/*
+ * R9218 (0x2402) - DSP2 Address RAM 0
+ */
+#define WM8962_DSP2_ADDR_RAM_1024_38_15_0_MASK 0xFFFF /* DSP2_ADDR_RAM_1024_38_15_0 - [15:0] */
+#define WM8962_DSP2_ADDR_RAM_1024_38_15_0_SHIFT 0 /* DSP2_ADDR_RAM_1024_38_15_0 - [15:0] */
+#define WM8962_DSP2_ADDR_RAM_1024_38_15_0_WIDTH 16 /* DSP2_ADDR_RAM_1024_38_15_0 - [15:0] */
+
+/*
+ * R12288 (0x3000) - DSP2 Data1 RAM 1
+ */
+#define WM8962_DSP2_DATA1_RAM_384_24_23_16_MASK 0x00FF /* DSP2_DATA1_RAM_384_24_23_16 - [7:0] */
+#define WM8962_DSP2_DATA1_RAM_384_24_23_16_SHIFT 0 /* DSP2_DATA1_RAM_384_24_23_16 - [7:0] */
+#define WM8962_DSP2_DATA1_RAM_384_24_23_16_WIDTH 8 /* DSP2_DATA1_RAM_384_24_23_16 - [7:0] */
+
+/*
+ * R12289 (0x3001) - DSP2 Data1 RAM 0
+ */
+#define WM8962_DSP2_DATA1_RAM_384_24_15_0_MASK 0xFFFF /* DSP2_DATA1_RAM_384_24_15_0 - [15:0] */
+#define WM8962_DSP2_DATA1_RAM_384_24_15_0_SHIFT 0 /* DSP2_DATA1_RAM_384_24_15_0 - [15:0] */
+#define WM8962_DSP2_DATA1_RAM_384_24_15_0_WIDTH 16 /* DSP2_DATA1_RAM_384_24_15_0 - [15:0] */
+
+/*
+ * R13312 (0x3400) - DSP2 Data2 RAM 1
+ */
+#define WM8962_DSP2_DATA2_RAM_384_24_23_16_MASK 0x00FF /* DSP2_DATA2_RAM_384_24_23_16 - [7:0] */
+#define WM8962_DSP2_DATA2_RAM_384_24_23_16_SHIFT 0 /* DSP2_DATA2_RAM_384_24_23_16 - [7:0] */
+#define WM8962_DSP2_DATA2_RAM_384_24_23_16_WIDTH 8 /* DSP2_DATA2_RAM_384_24_23_16 - [7:0] */
+
+/*
+ * R13313 (0x3401) - DSP2 Data2 RAM 0
+ */
+#define WM8962_DSP2_DATA2_RAM_384_24_15_0_MASK 0xFFFF /* DSP2_DATA2_RAM_384_24_15_0 - [15:0] */
+#define WM8962_DSP2_DATA2_RAM_384_24_15_0_SHIFT 0 /* DSP2_DATA2_RAM_384_24_15_0 - [15:0] */
+#define WM8962_DSP2_DATA2_RAM_384_24_15_0_WIDTH 16 /* DSP2_DATA2_RAM_384_24_15_0 - [15:0] */
+
+/*
+ * R14336 (0x3800) - DSP2 Data3 RAM 1
+ */
+#define WM8962_DSP2_DATA3_RAM_384_24_23_16_MASK 0x00FF /* DSP2_DATA3_RAM_384_24_23_16 - [7:0] */
+#define WM8962_DSP2_DATA3_RAM_384_24_23_16_SHIFT 0 /* DSP2_DATA3_RAM_384_24_23_16 - [7:0] */
+#define WM8962_DSP2_DATA3_RAM_384_24_23_16_WIDTH 8 /* DSP2_DATA3_RAM_384_24_23_16 - [7:0] */
+
+/*
+ * R14337 (0x3801) - DSP2 Data3 RAM 0
+ */
+#define WM8962_DSP2_DATA3_RAM_384_24_15_0_MASK 0xFFFF /* DSP2_DATA3_RAM_384_24_15_0 - [15:0] */
+#define WM8962_DSP2_DATA3_RAM_384_24_15_0_SHIFT 0 /* DSP2_DATA3_RAM_384_24_15_0 - [15:0] */
+#define WM8962_DSP2_DATA3_RAM_384_24_15_0_WIDTH 16 /* DSP2_DATA3_RAM_384_24_15_0 - [15:0] */
+
+/*
+ * R15360 (0x3C00) - DSP2 Coeff RAM 0
+ */
+#define WM8962_DSP2_CMAP_RAM_384_11_10_0_MASK 0x07FF /* DSP2_CMAP_RAM_384_11_10_0 - [10:0] */
+#define WM8962_DSP2_CMAP_RAM_384_11_10_0_SHIFT 0 /* DSP2_CMAP_RAM_384_11_10_0 - [10:0] */
+#define WM8962_DSP2_CMAP_RAM_384_11_10_0_WIDTH 11 /* DSP2_CMAP_RAM_384_11_10_0 - [10:0] */
+
+/*
+ * R16384 (0x4000) - RETUNEADC_SHARED_COEFF_1
+ */
+#define WM8962_ADC_RETUNE_SCV 0x0080 /* ADC_RETUNE_SCV */
+#define WM8962_ADC_RETUNE_SCV_MASK 0x0080 /* ADC_RETUNE_SCV */
+#define WM8962_ADC_RETUNE_SCV_SHIFT 7 /* ADC_RETUNE_SCV */
+#define WM8962_ADC_RETUNE_SCV_WIDTH 1 /* ADC_RETUNE_SCV */
+#define WM8962_RETUNEADC_SHARED_COEFF_22_16_MASK 0x007F /* RETUNEADC_SHARED_COEFF_22_16 - [6:0] */
+#define WM8962_RETUNEADC_SHARED_COEFF_22_16_SHIFT 0 /* RETUNEADC_SHARED_COEFF_22_16 - [6:0] */
+#define WM8962_RETUNEADC_SHARED_COEFF_22_16_WIDTH 7 /* RETUNEADC_SHARED_COEFF_22_16 - [6:0] */
+
+/*
+ * R16385 (0x4001) - RETUNEADC_SHARED_COEFF_0
+ */
+#define WM8962_RETUNEADC_SHARED_COEFF_15_00_MASK 0xFFFF /* RETUNEADC_SHARED_COEFF_15_00 - [15:0] */
+#define WM8962_RETUNEADC_SHARED_COEFF_15_00_SHIFT 0 /* RETUNEADC_SHARED_COEFF_15_00 - [15:0] */
+#define WM8962_RETUNEADC_SHARED_COEFF_15_00_WIDTH 16 /* RETUNEADC_SHARED_COEFF_15_00 - [15:0] */
+
+/*
+ * R16386 (0x4002) - RETUNEDAC_SHARED_COEFF_1
+ */
+#define WM8962_DAC_RETUNE_SCV 0x0080 /* DAC_RETUNE_SCV */
+#define WM8962_DAC_RETUNE_SCV_MASK 0x0080 /* DAC_RETUNE_SCV */
+#define WM8962_DAC_RETUNE_SCV_SHIFT 7 /* DAC_RETUNE_SCV */
+#define WM8962_DAC_RETUNE_SCV_WIDTH 1 /* DAC_RETUNE_SCV */
+#define WM8962_RETUNEDAC_SHARED_COEFF_23_16_MASK 0x007F /* RETUNEDAC_SHARED_COEFF_23_16 - [6:0] */
+#define WM8962_RETUNEDAC_SHARED_COEFF_23_16_SHIFT 0 /* RETUNEDAC_SHARED_COEFF_23_16 - [6:0] */
+#define WM8962_RETUNEDAC_SHARED_COEFF_23_16_WIDTH 7 /* RETUNEDAC_SHARED_COEFF_23_16 - [6:0] */
+
+/*
+ * R16387 (0x4003) - RETUNEDAC_SHARED_COEFF_0
+ */
+#define WM8962_RETUNEDAC_SHARED_COEFF_15_00_MASK 0xFFFF /* RETUNEDAC_SHARED_COEFF_15_00 - [15:0] */
+#define WM8962_RETUNEDAC_SHARED_COEFF_15_00_SHIFT 0 /* RETUNEDAC_SHARED_COEFF_15_00 - [15:0] */
+#define WM8962_RETUNEDAC_SHARED_COEFF_15_00_WIDTH 16 /* RETUNEDAC_SHARED_COEFF_15_00 - [15:0] */
+
+/*
+ * R16388 (0x4004) - SOUNDSTAGE_ENABLES_1
+ */
+#define WM8962_SOUNDSTAGE_ENABLES_23_16_MASK 0x00FF /* SOUNDSTAGE_ENABLES_23_16 - [7:0] */
+#define WM8962_SOUNDSTAGE_ENABLES_23_16_SHIFT 0 /* SOUNDSTAGE_ENABLES_23_16 - [7:0] */
+#define WM8962_SOUNDSTAGE_ENABLES_23_16_WIDTH 8 /* SOUNDSTAGE_ENABLES_23_16 - [7:0] */
+
+/*
+ * R16389 (0x4005) - SOUNDSTAGE_ENABLES_0
+ */
+#define WM8962_SOUNDSTAGE_ENABLES_15_06_MASK 0xFFC0 /* SOUNDSTAGE_ENABLES_15_06 - [15:6] */
+#define WM8962_SOUNDSTAGE_ENABLES_15_06_SHIFT 6 /* SOUNDSTAGE_ENABLES_15_06 - [15:6] */
+#define WM8962_SOUNDSTAGE_ENABLES_15_06_WIDTH 10 /* SOUNDSTAGE_ENABLES_15_06 - [15:6] */
+#define WM8962_RTN_ADC_ENA 0x0020 /* RTN_ADC_ENA */
+#define WM8962_RTN_ADC_ENA_MASK 0x0020 /* RTN_ADC_ENA */
+#define WM8962_RTN_ADC_ENA_SHIFT 5 /* RTN_ADC_ENA */
+#define WM8962_RTN_ADC_ENA_WIDTH 1 /* RTN_ADC_ENA */
+#define WM8962_RTN_DAC_ENA 0x0010 /* RTN_DAC_ENA */
+#define WM8962_RTN_DAC_ENA_MASK 0x0010 /* RTN_DAC_ENA */
+#define WM8962_RTN_DAC_ENA_SHIFT 4 /* RTN_DAC_ENA */
+#define WM8962_RTN_DAC_ENA_WIDTH 1 /* RTN_DAC_ENA */
+#define WM8962_HDBASS_ENA 0x0008 /* HDBASS_ENA */
+#define WM8962_HDBASS_ENA_MASK 0x0008 /* HDBASS_ENA */
+#define WM8962_HDBASS_ENA_SHIFT 3 /* HDBASS_ENA */
+#define WM8962_HDBASS_ENA_WIDTH 1 /* HDBASS_ENA */
+#define WM8962_HPF2_ENA 0x0004 /* HPF2_ENA */
+#define WM8962_HPF2_ENA_MASK 0x0004 /* HPF2_ENA */
+#define WM8962_HPF2_ENA_SHIFT 2 /* HPF2_ENA */
+#define WM8962_HPF2_ENA_WIDTH 1 /* HPF2_ENA */
+#define WM8962_HPF1_ENA 0x0002 /* HPF1_ENA */
+#define WM8962_HPF1_ENA_MASK 0x0002 /* HPF1_ENA */
+#define WM8962_HPF1_ENA_SHIFT 1 /* HPF1_ENA */
+#define WM8962_HPF1_ENA_WIDTH 1 /* HPF1_ENA */
+#define WM8962_VSS_ENA 0x0001 /* VSS_ENA */
+#define WM8962_VSS_ENA_MASK 0x0001 /* VSS_ENA */
+#define WM8962_VSS_ENA_SHIFT 0 /* VSS_ENA */
+#define WM8962_VSS_ENA_WIDTH 1 /* VSS_ENA */
+
+extern const u16 wm8962_reg[WM8962_MAX_REGISTER + 1];
+
+struct wm8962_reg_access {
+ u16 read;
+ u16 write;
+ u16 vol;
+};
+
+extern
+const struct wm8962_reg_access wm8962_reg_access[WM8962_MAX_REGISTER + 1];
+
+#endif
diff --git a/sound/soc/codecs/wm8971.c b/sound/soc/codecs/wm8971.c
index a99620f335d2..63f6dbf5d070 100644
--- a/sound/soc/codecs/wm8971.c
+++ b/sound/soc/codecs/wm8971.c
@@ -30,14 +30,13 @@
#include "wm8971.h"
-#define WM8971_VERSION "0.9"
-
#define WM8971_REG_COUNT 43
static struct workqueue_struct *wm8971_workq = NULL;
/* codec private data */
struct wm8971_priv {
+ enum snd_soc_control_type control_type;
unsigned int sysclk;
};
@@ -492,8 +491,7 @@ static int wm8971_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct wm8971_priv *wm8971 = snd_soc_codec_get_drvdata(codec);
u16 iface = snd_soc_read(codec, WM8971_IFACE) & 0x1f3;
u16 srate = snd_soc_read(codec, WM8971_SRATE) & 0x1c0;
@@ -573,8 +571,8 @@ static struct snd_soc_dai_ops wm8971_dai_ops = {
.set_sysclk = wm8971_set_dai_sysclk,
};
-struct snd_soc_dai wm8971_dai = {
- .name = "WM8971",
+static struct snd_soc_dai_driver wm8971_dai = {
+ .name = "wm8971-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -589,7 +587,6 @@ struct snd_soc_dai wm8971_dai = {
.formats = WM8971_FORMATS,},
.ops = &wm8971_dai_ops,
};
-EXPORT_SYMBOL_GPL(wm8971_dai);
static void wm8971_work(struct work_struct *work)
{
@@ -598,19 +595,14 @@ static void wm8971_work(struct work_struct *work)
wm8971_set_bias_level(codec, codec->bias_level);
}
-static int wm8971_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8971_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8971_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8971_resume(struct platform_device *pdev)
+static int wm8971_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
u8 data[2];
u16 *cache = codec->reg_cache;
@@ -639,37 +631,24 @@ static int wm8971_resume(struct platform_device *pdev)
return 0;
}
-static int wm8971_init(struct snd_soc_device *socdev,
- enum snd_soc_control_type control)
+static int wm8971_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = socdev->card->codec;
- int reg, ret = 0;
-
- codec->name = "WM8971";
- codec->owner = THIS_MODULE;
- codec->set_bias_level = wm8971_set_bias_level;
- codec->dai = &wm8971_dai;
- codec->reg_cache_size = ARRAY_SIZE(wm8971_reg);
- codec->num_dai = 1;
- codec->reg_cache = kmemdup(wm8971_reg, sizeof(wm8971_reg), GFP_KERNEL);
-
- if (codec->reg_cache == NULL)
- return -ENOMEM;
+ struct wm8971_priv *wm8971 = snd_soc_codec_get_drvdata(codec);
+ int ret = 0;
+ u16 reg;
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8971->control_type);
if (ret < 0) {
printk(KERN_ERR "wm8971: failed to set cache I/O: %d\n", ret);
- goto err;
+ return ret;
}
- wm8971_reset(codec);
+ INIT_DELAYED_WORK(&codec->delayed_work, wm8971_work);
+ wm8971_workq = create_workqueue("wm8971");
+ if (wm8971_workq == NULL)
+ return -ENOMEM;
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "wm8971: failed to create pcms\n");
- goto err;
- }
+ wm8971_reset(codec);
/* charge output caps - set vmid to 5k for quick power up */
reg = snd_soc_read(codec, WM8971_PWR1) & 0xfe3e;
@@ -704,40 +683,54 @@ static int wm8971_init(struct snd_soc_device *socdev,
wm8971_add_widgets(codec);
return ret;
-
-err:
- kfree(codec->reg_cache);
- return ret;
}
-/* If the i2c layer weren't so broken, we could pass this kind of data
- around */
-static struct snd_soc_device *wm8971_socdev;
-#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
+/* power down chip */
+static int wm8971_remove(struct snd_soc_codec *codec)
+{
+ wm8971_set_bias_level(codec, SND_SOC_BIAS_OFF);
+
+ if (wm8971_workq)
+ destroy_workqueue(wm8971_workq);
+ return 0;
+}
-static int wm8971_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+static struct snd_soc_codec_driver soc_codec_dev_wm8971 = {
+ .probe = wm8971_probe,
+ .remove = wm8971_remove,
+ .suspend = wm8971_suspend,
+ .resume = wm8971_resume,
+ .set_bias_level = wm8971_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(wm8971_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8971_reg,
+};
+
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static __devinit int wm8971_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
{
- struct snd_soc_device *socdev = wm8971_socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct wm8971_priv *wm8971;
int ret;
- i2c_set_clientdata(i2c, codec);
+ wm8971 = kzalloc(sizeof(struct wm8971_priv), GFP_KERNEL);
+ if (wm8971 == NULL)
+ return -ENOMEM;
- codec->control_data = i2c;
+ i2c_set_clientdata(i2c, wm8971);
- ret = wm8971_init(socdev, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8971, &wm8971_dai, 1);
if (ret < 0)
- pr_err("failed to initialise WM8971\n");
-
+ kfree(wm8971);
return ret;
}
-static int wm8971_i2c_remove(struct i2c_client *client)
+static __devexit int wm8971_i2c_remove(struct i2c_client *client)
{
- struct snd_soc_codec *codec = i2c_get_clientdata(client);
- kfree(codec->reg_cache);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -749,148 +742,34 @@ MODULE_DEVICE_TABLE(i2c, wm8971_i2c_id);
static struct i2c_driver wm8971_i2c_driver = {
.driver = {
- .name = "WM8971 I2C Codec",
+ .name = "wm8971-codec",
.owner = THIS_MODULE,
},
- .probe = wm8971_i2c_probe,
- .remove = wm8971_i2c_remove,
+ .probe = wm8971_i2c_probe,
+ .remove = __devexit_p(wm8971_i2c_remove),
.id_table = wm8971_i2c_id,
};
-
-static int wm8971_add_i2c_device(struct platform_device *pdev,
- const struct wm8971_setup_data *setup)
-{
- struct i2c_board_info info;
- struct i2c_adapter *adapter;
- struct i2c_client *client;
- int ret;
-
- ret = i2c_add_driver(&wm8971_i2c_driver);
- if (ret != 0) {
- dev_err(&pdev->dev, "can't add i2c driver\n");
- return ret;
- }
-
- memset(&info, 0, sizeof(struct i2c_board_info));
- info.addr = setup->i2c_address;
- strlcpy(info.type, "wm8971", I2C_NAME_SIZE);
-
- adapter = i2c_get_adapter(setup->i2c_bus);
- if (!adapter) {
- dev_err(&pdev->dev, "can't get i2c adapter %d\n",
- setup->i2c_bus);
- goto err_driver;
- }
-
- client = i2c_new_device(adapter, &info);
- i2c_put_adapter(adapter);
- if (!client) {
- dev_err(&pdev->dev, "can't add i2c device at 0x%x\n",
- (unsigned int)info.addr);
- goto err_driver;
- }
-
- return 0;
-
-err_driver:
- i2c_del_driver(&wm8971_i2c_driver);
- return -ENODEV;
-}
-
#endif
-static int wm8971_probe(struct platform_device *pdev)
+static int __init wm8971_modinit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct wm8971_setup_data *setup;
- struct snd_soc_codec *codec;
- struct wm8971_priv *wm8971;
int ret = 0;
-
- pr_info("WM8971 Audio Codec %s", WM8971_VERSION);
-
- setup = socdev->codec_data;
- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (codec == NULL)
- return -ENOMEM;
-
- wm8971 = kzalloc(sizeof(struct wm8971_priv), GFP_KERNEL);
- if (wm8971 == NULL) {
- kfree(codec);
- return -ENOMEM;
- }
-
- snd_soc_codec_set_drvdata(codec, wm8971);
- socdev->card->codec = codec;
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
- wm8971_socdev = socdev;
-
- INIT_DELAYED_WORK(&codec->delayed_work, wm8971_work);
- wm8971_workq = create_workqueue("wm8971");
- if (wm8971_workq == NULL) {
- kfree(snd_soc_codec_get_drvdata(codec));
- kfree(codec);
- return -ENOMEM;
- }
-
-#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
- if (setup->i2c_address) {
- ret = wm8971_add_i2c_device(pdev, setup);
- }
-#endif
- /* Add other interfaces here */
-
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+ ret = i2c_add_driver(&wm8971_i2c_driver);
if (ret != 0) {
- destroy_workqueue(wm8971_workq);
- kfree(snd_soc_codec_get_drvdata(codec));
- kfree(codec);
+ printk(KERN_ERR "Failed to register WM8971 I2C driver: %d\n",
+ ret);
}
-
- return ret;
-}
-
-/* power down chip */
-static int wm8971_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec->control_data)
- wm8971_set_bias_level(codec, SND_SOC_BIAS_OFF);
- if (wm8971_workq)
- destroy_workqueue(wm8971_workq);
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
- i2c_unregister_device(codec->control_data);
- i2c_del_driver(&wm8971_i2c_driver);
#endif
- kfree(snd_soc_codec_get_drvdata(codec));
- kfree(codec);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8971 = {
- .probe = wm8971_probe,
- .remove = wm8971_remove,
- .suspend = wm8971_suspend,
- .resume = wm8971_resume,
-};
-
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8971);
-
-static int __init wm8971_modinit(void)
-{
- return snd_soc_register_dai(&wm8971_dai);
+ return ret;
}
module_init(wm8971_modinit);
static void __exit wm8971_exit(void)
{
- snd_soc_unregister_dai(&wm8971_dai);
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+ i2c_del_driver(&wm8971_i2c_driver);
+#endif
}
module_exit(wm8971_exit);
diff --git a/sound/soc/codecs/wm8971.h b/sound/soc/codecs/wm8971.h
index ef4f08f9f344..f31c38fddfc4 100644
--- a/sound/soc/codecs/wm8971.h
+++ b/sound/soc/codecs/wm8971.h
@@ -53,12 +53,4 @@
#define WM8971_SYSCLK 0
-struct wm8971_setup_data {
- int i2c_bus;
- unsigned short i2c_address;
-};
-
-extern struct snd_soc_dai wm8971_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8971;
-
#endif
diff --git a/sound/soc/codecs/wm8974.c b/sound/soc/codecs/wm8974.c
index 1468fe10cbbe..b4363f6d19b3 100644
--- a/sound/soc/codecs/wm8974.c
+++ b/sound/soc/codecs/wm8974.c
@@ -51,12 +51,10 @@ static const u16 wm8974_reg[WM8974_CACHEREGNUM] = {
#define WM8974_POWER1_BUFIOEN 0x04
struct wm8974_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
u16 reg_cache[WM8974_CACHEREGNUM];
};
-static struct snd_soc_codec *wm8974_codec;
-
#define wm8974_reset(c) snd_soc_write(c, WM8974_RESET, 0)
static const char *wm8974_companding[] = {"Off", "NC", "u-law", "A-law" };
@@ -566,8 +564,8 @@ static struct snd_soc_dai_ops wm8974_ops = {
.set_pll = wm8974_set_dai_pll,
};
-struct snd_soc_dai wm8974_dai = {
- .name = "WM8974 HiFi",
+static struct snd_soc_dai_driver wm8974_dai = {
+ .name = "wm8974-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -583,21 +581,15 @@ struct snd_soc_dai wm8974_dai = {
.ops = &wm8974_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(wm8974_dai);
-static int wm8974_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8974_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8974_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8974_resume(struct platform_device *pdev)
+static int wm8974_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
u8 data[2];
u16 *cache = codec->reg_cache;
@@ -613,156 +605,72 @@ static int wm8974_resume(struct platform_device *pdev)
return 0;
}
-static int wm8974_probe(struct platform_device *pdev)
+static int wm8974_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
int ret = 0;
- if (wm8974_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, SND_SOC_I2C);
+ if (ret < 0) {
+ dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
+ return ret;
}
- socdev->card->codec = wm8974_codec;
- codec = wm8974_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
+ ret = wm8974_reset(codec);
if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
+ dev_err(codec->dev, "Failed to issue reset\n");
+ return ret;
}
+ wm8974_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
snd_soc_add_controls(codec, wm8974_snd_controls,
ARRAY_SIZE(wm8974_snd_controls));
wm8974_add_widgets(codec);
return ret;
-
-pcm_err:
- return ret;
}
/* power down chip */
-static int wm8974_remove(struct platform_device *pdev)
+static int wm8974_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
+ wm8974_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_wm8974 = {
+static struct snd_soc_codec_driver soc_codec_dev_wm8974 = {
.probe = wm8974_probe,
.remove = wm8974_remove,
.suspend = wm8974_suspend,
.resume = wm8974_resume,
+ .set_bias_level = wm8974_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(wm8974_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8974_reg,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8974);
-
-static __devinit int wm8974_register(struct wm8974_priv *wm8974)
-{
- int ret;
- struct snd_soc_codec *codec = &wm8974->codec;
-
- if (wm8974_codec) {
- dev_err(codec->dev, "Another WM8974 is registered\n");
- ret = -EINVAL;
- goto err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8974);
- codec->name = "WM8974";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8974_set_bias_level;
- codec->dai = &wm8974_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = WM8974_CACHEREGNUM;
- codec->reg_cache = &wm8974->reg_cache;
-
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, SND_SOC_I2C);
- if (ret < 0) {
- dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
- }
-
- memcpy(codec->reg_cache, wm8974_reg, sizeof(wm8974_reg));
-
- ret = wm8974_reset(codec);
- if (ret < 0) {
- dev_err(codec->dev, "Failed to issue reset\n");
- goto err;
- }
-
- wm8974_dai.dev = codec->dev;
-
- wm8974_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
- wm8974_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
-
- ret = snd_soc_register_dai(&wm8974_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
-
- return 0;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- kfree(wm8974);
- return ret;
-}
-
-static __devexit void wm8974_unregister(struct wm8974_priv *wm8974)
-{
- wm8974_set_bias_level(&wm8974->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dai(&wm8974_dai);
- snd_soc_unregister_codec(&wm8974->codec);
- kfree(wm8974);
- wm8974_codec = NULL;
-}
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static __devinit int wm8974_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct wm8974_priv *wm8974;
- struct snd_soc_codec *codec;
+ int ret;
wm8974 = kzalloc(sizeof(struct wm8974_priv), GFP_KERNEL);
if (wm8974 == NULL)
return -ENOMEM;
- codec = &wm8974->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
-
i2c_set_clientdata(i2c, wm8974);
- codec->control_data = i2c;
-
- codec->dev = &i2c->dev;
- return wm8974_register(wm8974);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8974, &wm8974_dai, 1);
+ if (ret < 0)
+ kfree(wm8974);
+ return ret;
}
static __devexit int wm8974_i2c_remove(struct i2c_client *client)
{
- struct wm8974_priv *wm8974 = i2c_get_clientdata(client);
- wm8974_unregister(wm8974);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -774,23 +682,34 @@ MODULE_DEVICE_TABLE(i2c, wm8974_i2c_id);
static struct i2c_driver wm8974_i2c_driver = {
.driver = {
- .name = "WM8974",
+ .name = "wm8974-codec",
.owner = THIS_MODULE,
},
.probe = wm8974_i2c_probe,
.remove = __devexit_p(wm8974_i2c_remove),
.id_table = wm8974_i2c_id,
};
+#endif
static int __init wm8974_modinit(void)
{
- return i2c_add_driver(&wm8974_i2c_driver);
+ int ret = 0;
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+ ret = i2c_add_driver(&wm8974_i2c_driver);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register wm8974 I2C driver: %d\n",
+ ret);
+ }
+#endif
+ return ret;
}
module_init(wm8974_modinit);
static void __exit wm8974_exit(void)
{
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_del_driver(&wm8974_i2c_driver);
+#endif
}
module_exit(wm8974_exit);
diff --git a/sound/soc/codecs/wm8974.h b/sound/soc/codecs/wm8974.h
index 896a7f0f3fc4..3c94e7bb55a6 100644
--- a/sound/soc/codecs/wm8974.h
+++ b/sound/soc/codecs/wm8974.h
@@ -83,7 +83,4 @@
#define WM8974_MCLKDIV_8 (6 << 5)
#define WM8974_MCLKDIV_12 (7 << 5)
-extern struct snd_soc_dai wm8974_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8974;
-
#endif
diff --git a/sound/soc/codecs/wm8978.c b/sound/soc/codecs/wm8978.c
index 8a1ad778e7e3..676a4306cc87 100644
--- a/sound/soc/codecs/wm8978.c
+++ b/sound/soc/codecs/wm8978.c
@@ -31,8 +31,6 @@
#include "wm8978.h"
-static struct snd_soc_codec *wm8978_codec;
-
/* wm8978 register cache. Note that register 0 is not included in the cache. */
static const u16 wm8978_reg[WM8978_CACHEREGNUM] = {
0x0000, 0x0000, 0x0000, 0x0000, /* 0x00...0x03 */
@@ -54,7 +52,8 @@ static const u16 wm8978_reg[WM8978_CACHEREGNUM] = {
/* codec private data */
struct wm8978_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
+ void *control_data;
unsigned int f_pllout;
unsigned int f_mclk;
unsigned int f_256fs;
@@ -374,8 +373,8 @@ struct wm8978_pll_div {
#define FIXED_PLL_SIZE (1 << 24)
-static void pll_factors(struct wm8978_pll_div *pll_div, unsigned int target,
- unsigned int source)
+static void pll_factors(struct snd_soc_codec *codec,
+ struct wm8978_pll_div *pll_div, unsigned int target, unsigned int source)
{
u64 k_part;
unsigned int k, n_div, n_mod;
@@ -390,7 +389,7 @@ static void pll_factors(struct wm8978_pll_div *pll_div, unsigned int target,
}
if (n_div < 6 || n_div > 12)
- dev_warn(wm8978_codec->dev,
+ dev_warn(codec->dev,
"WM8978 N value exceeds recommended range! N = %u\n",
n_div);
@@ -505,7 +504,7 @@ static int wm8978_configure_pll(struct snd_soc_codec *codec)
dev_dbg(codec->dev, "%s: f_MCLK=%uHz, f_PLLOUT=%uHz\n", __func__,
wm8978->f_mclk, wm8978->f_pllout);
- pll_factors(&pll_div, f2, wm8978->f_mclk);
+ pll_factors(codec, &pll_div, f2, wm8978->f_mclk);
dev_dbg(codec->dev, "%s: calculated PLL N=0x%x, K=0x%x, div2=%d\n",
__func__, pll_div.n, pll_div.k, pll_div.div2);
@@ -690,8 +689,7 @@ static int wm8978_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct wm8978_priv *wm8978 = snd_soc_codec_get_drvdata(codec);
/* Word length mask = 0x60 */
u16 iface_ctl = snd_soc_read(codec, WM8978_AUDIO_INTERFACE) & ~0x60;
@@ -875,9 +873,8 @@ static struct snd_soc_dai_ops wm8978_dai_ops = {
};
/* Also supports 12kHz */
-struct snd_soc_dai wm8978_dai = {
- .name = "WM8978 HiFi",
- .id = 1,
+static struct snd_soc_dai_driver wm8978_dai = {
+ .name = "wm8978-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -894,13 +891,9 @@ struct snd_soc_dai wm8978_dai = {
},
.ops = &wm8978_dai_ops,
};
-EXPORT_SYMBOL_GPL(wm8978_dai);
-static int wm8978_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8978_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8978_set_bias_level(codec, SND_SOC_BIAS_OFF);
/* Also switch PLL off */
snd_soc_write(codec, WM8978_POWER_MANAGEMENT_1, 0);
@@ -908,10 +901,8 @@ static int wm8978_suspend(struct platform_device *pdev, pm_message_t state)
return 0;
}
-static int wm8978_resume(struct platform_device *pdev)
+static int wm8978_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
struct wm8978_priv *wm8978 = snd_soc_codec_get_drvdata(codec);
int i;
u16 *cache = codec->reg_cache;
@@ -933,54 +924,6 @@ static int wm8978_resume(struct platform_device *pdev)
return 0;
}
-static int wm8978_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (wm8978_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = wm8978_codec;
- codec = wm8978_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
- snd_soc_add_controls(codec, wm8978_snd_controls,
- ARRAY_SIZE(wm8978_snd_controls));
- wm8978_add_widgets(codec);
-
-pcm_err:
- return ret;
-}
-
-/* power down chip */
-static int wm8978_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8978 = {
- .probe = wm8978_probe,
- .remove = wm8978_remove,
- .suspend = wm8978_suspend,
- .resume = wm8978_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8978);
-
/*
* These registers contain an "update" bit - bit 8. This means, for example,
* that one can write new DAC digital volume for both channels, but only when
@@ -1000,44 +943,23 @@ static const int update_reg[] = {
WM8978_ROUT2_SPK_CONTROL,
};
-static __devinit int wm8978_register(struct wm8978_priv *wm8978)
+static int wm8978_probe(struct snd_soc_codec *codec)
{
- int ret, i;
- struct snd_soc_codec *codec = &wm8978->codec;
-
- if (wm8978_codec) {
- dev_err(codec->dev, "Another WM8978 is registered\n");
- return -EINVAL;
- }
+ struct wm8978_priv *wm8978 = snd_soc_codec_get_drvdata(codec);
+ int ret = 0, i;
/*
* Set default system clock to PLL, it is more precise, this is also the
* default hardware setting
*/
wm8978->sysclk = WM8978_PLL;
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8978);
- codec->name = "WM8978";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8978_set_bias_level;
- codec->dai = &wm8978_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = WM8978_CACHEREGNUM;
- codec->reg_cache = &wm8978->reg_cache;
-
+ codec->control_data = wm8978->control_data;
ret = snd_soc_codec_set_cache_io(codec, 7, 9, SND_SOC_I2C);
if (ret < 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
+ return ret;
}
- memcpy(codec->reg_cache, wm8978_reg, sizeof(wm8978_reg));
-
/*
* Set the update bit in all registers, that have one. This way all
* writes to those registers will also cause the update bit to be
@@ -1050,74 +972,61 @@ static __devinit int wm8978_register(struct wm8978_priv *wm8978)
ret = snd_soc_write(codec, WM8978_RESET, 0);
if (ret < 0) {
dev_err(codec->dev, "Failed to issue reset\n");
- goto err;
+ return ret;
}
- wm8978_dai.dev = codec->dev;
-
wm8978_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
- wm8978_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
-
- ret = snd_soc_register_dai(&wm8978_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
+ snd_soc_add_controls(codec, wm8978_snd_controls,
+ ARRAY_SIZE(wm8978_snd_controls));
+ wm8978_add_widgets(codec);
return 0;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- return ret;
}
-static __devexit void wm8978_unregister(struct wm8978_priv *wm8978)
+/* power down chip */
+static int wm8978_remove(struct snd_soc_codec *codec)
{
- wm8978_set_bias_level(&wm8978->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dai(&wm8978_dai);
- snd_soc_unregister_codec(&wm8978->codec);
- wm8978_codec = NULL;
+ wm8978_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_wm8978 = {
+ .probe = wm8978_probe,
+ .remove = wm8978_remove,
+ .suspend = wm8978_suspend,
+ .resume = wm8978_resume,
+ .set_bias_level = wm8978_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(wm8978_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8978_reg,
+};
+
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static __devinit int wm8978_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
- int ret;
struct wm8978_priv *wm8978;
- struct snd_soc_codec *codec;
+ int ret;
wm8978 = kzalloc(sizeof(struct wm8978_priv), GFP_KERNEL);
if (wm8978 == NULL)
return -ENOMEM;
- codec = &wm8978->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
-
i2c_set_clientdata(i2c, wm8978);
- codec->control_data = i2c;
-
- codec->dev = &i2c->dev;
+ wm8978->control_data = i2c;
- ret = wm8978_register(wm8978);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8978, &wm8978_dai, 1);
if (ret < 0)
kfree(wm8978);
-
return ret;
}
static __devexit int wm8978_i2c_remove(struct i2c_client *client)
{
- struct wm8978_priv *wm8978 = i2c_get_clientdata(client);
- wm8978_unregister(wm8978);
- kfree(wm8978);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -1129,23 +1038,34 @@ MODULE_DEVICE_TABLE(i2c, wm8978_i2c_id);
static struct i2c_driver wm8978_i2c_driver = {
.driver = {
- .name = "WM8978",
+ .name = "WM8978-codec",
.owner = THIS_MODULE,
},
.probe = wm8978_i2c_probe,
.remove = __devexit_p(wm8978_i2c_remove),
.id_table = wm8978_i2c_id,
};
+#endif
static int __init wm8978_modinit(void)
{
- return i2c_add_driver(&wm8978_i2c_driver);
+ int ret = 0;
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+ ret = i2c_add_driver(&wm8978_i2c_driver);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register WM8978 I2C driver: %d\n",
+ ret);
+ }
+#endif
+ return ret;
}
module_init(wm8978_modinit);
static void __exit wm8978_exit(void)
{
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_del_driver(&wm8978_i2c_driver);
+#endif
}
module_exit(wm8978_exit);
diff --git a/sound/soc/codecs/wm8978.h b/sound/soc/codecs/wm8978.h
index 56ec83270917..c75525b7f154 100644
--- a/sound/soc/codecs/wm8978.h
+++ b/sound/soc/codecs/wm8978.h
@@ -80,7 +80,4 @@ enum wm8978_sysclk_src {
WM8978_MCLK
};
-extern struct snd_soc_dai wm8978_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8978;
-
#endif /* __WM8978_H__ */
diff --git a/sound/soc/codecs/wm8988.c b/sound/soc/codecs/wm8988.c
index 19ad590ca0b3..d070a58e4f8e 100644
--- a/sound/soc/codecs/wm8988.c
+++ b/sound/soc/codecs/wm8988.c
@@ -52,7 +52,7 @@ static const u16 wm8988_reg[] = {
/* codec private data */
struct wm8988_priv {
unsigned int sysclk;
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
struct snd_pcm_hw_constraint_list *sysclk_constraints;
u16 reg_cache[WM8988_NUM_REG];
};
@@ -608,8 +608,7 @@ static int wm8988_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
struct wm8988_priv *wm8988 = snd_soc_codec_get_drvdata(codec);
u16 iface = snd_soc_read(codec, WM8988_IFACE) & 0x1f3;
u16 srate = snd_soc_read(codec, WM8988_SRATE) & 0x180;
@@ -711,8 +710,8 @@ static struct snd_soc_dai_ops wm8988_ops = {
.digital_mute = wm8988_mute,
};
-struct snd_soc_dai wm8988_dai = {
- .name = "WM8988",
+static struct snd_soc_dai_driver wm8988_dai = {
+ .name = "wm8988-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -730,21 +729,15 @@ struct snd_soc_dai wm8988_dai = {
.ops = &wm8988_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(wm8988_dai);
-static int wm8988_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8988_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8988_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8988_resume(struct platform_device *pdev)
+static int wm8988_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
u8 data[2];
u16 *cache = codec->reg_cache;
@@ -763,99 +756,22 @@ static int wm8988_resume(struct platform_device *pdev)
return 0;
}
-static struct snd_soc_codec *wm8988_codec;
-
-static int wm8988_probe(struct platform_device *pdev)
+static int wm8988_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
+ struct wm8988_priv *wm8988 = snd_soc_codec_get_drvdata(codec);
int ret = 0;
-
- if (wm8988_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = wm8988_codec;
- codec = wm8988_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-
- snd_soc_add_controls(codec, wm8988_snd_controls,
- ARRAY_SIZE(wm8988_snd_controls));
- snd_soc_dapm_new_controls(codec, wm8988_dapm_widgets,
- ARRAY_SIZE(wm8988_dapm_widgets));
- snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
-
- return ret;
-
-pcm_err:
- return ret;
-}
-
-static int wm8988_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8988 = {
- .probe = wm8988_probe,
- .remove = wm8988_remove,
- .suspend = wm8988_suspend,
- .resume = wm8988_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8988);
-
-static int wm8988_register(struct wm8988_priv *wm8988,
- enum snd_soc_control_type control)
-{
- struct snd_soc_codec *codec = &wm8988->codec;
- int ret;
u16 reg;
- if (wm8988_codec) {
- dev_err(codec->dev, "Another WM8988 is registered\n");
- ret = -EINVAL;
- goto err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm8988);
- codec->name = "WM8988";
- codec->owner = THIS_MODULE;
- codec->dai = &wm8988_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = ARRAY_SIZE(wm8988->reg_cache);
- codec->reg_cache = &wm8988->reg_cache;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8988_set_bias_level;
-
- memcpy(codec->reg_cache, wm8988_reg,
- sizeof(wm8988_reg));
-
- ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8988->control_type);
if (ret < 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
+ return ret;
}
ret = wm8988_reset(codec);
if (ret < 0) {
dev_err(codec->dev, "Failed to issue reset\n");
- goto err;
+ return ret;
}
/* set the update bits (we always update left then right) */
@@ -870,139 +786,133 @@ static int wm8988_register(struct wm8988_priv *wm8988,
reg = snd_soc_read(codec, WM8988_RINVOL);
snd_soc_write(codec, WM8988_RINVOL, reg | 0x0100);
- wm8988_set_bias_level(&wm8988->codec, SND_SOC_BIAS_STANDBY);
-
- wm8988_dai.dev = codec->dev;
-
- wm8988_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
+ wm8988_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
- ret = snd_soc_register_dai(&wm8988_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
+ snd_soc_add_controls(codec, wm8988_snd_controls,
+ ARRAY_SIZE(wm8988_snd_controls));
+ snd_soc_dapm_new_controls(codec, wm8988_dapm_widgets,
+ ARRAY_SIZE(wm8988_dapm_widgets));
+ snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
return 0;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- kfree(wm8988);
- return ret;
}
-static void wm8988_unregister(struct wm8988_priv *wm8988)
+static int wm8988_remove(struct snd_soc_codec *codec)
{
- wm8988_set_bias_level(&wm8988->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dai(&wm8988_dai);
- snd_soc_unregister_codec(&wm8988->codec);
- kfree(wm8988);
- wm8988_codec = NULL;
+ wm8988_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
}
-#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
-static int wm8988_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+static struct snd_soc_codec_driver soc_codec_dev_wm8988 = {
+ .probe = wm8988_probe,
+ .remove = wm8988_remove,
+ .suspend = wm8988_suspend,
+ .resume = wm8988_resume,
+ .set_bias_level = wm8988_set_bias_level,
+ .reg_cache_size = sizeof(wm8988_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8988_reg,
+};
+
+#if defined(CONFIG_SPI_MASTER)
+static int __devinit wm8988_spi_probe(struct spi_device *spi)
{
struct wm8988_priv *wm8988;
- struct snd_soc_codec *codec;
+ int ret;
wm8988 = kzalloc(sizeof(struct wm8988_priv), GFP_KERNEL);
if (wm8988 == NULL)
return -ENOMEM;
- codec = &wm8988->codec;
-
- i2c_set_clientdata(i2c, wm8988);
- codec->control_data = i2c;
-
- codec->dev = &i2c->dev;
+ wm8988->control_type = SND_SOC_SPI;
+ spi_set_drvdata(spi, wm8988);
- return wm8988_register(wm8988, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&spi->dev,
+ &soc_codec_dev_wm8988, &wm8988_dai, 1);
+ if (ret < 0)
+ kfree(wm8988);
+ return ret;
}
-static int wm8988_i2c_remove(struct i2c_client *client)
+static int __devexit wm8988_spi_remove(struct spi_device *spi)
{
- struct wm8988_priv *wm8988 = i2c_get_clientdata(client);
- wm8988_unregister(wm8988);
+ snd_soc_unregister_codec(&spi->dev);
+ kfree(spi_get_drvdata(spi));
return 0;
}
-static const struct i2c_device_id wm8988_i2c_id[] = {
- { "wm8988", 0 },
- { }
-};
-MODULE_DEVICE_TABLE(i2c, wm8988_i2c_id);
-
-static struct i2c_driver wm8988_i2c_driver = {
+static struct spi_driver wm8988_spi_driver = {
.driver = {
- .name = "WM8988",
- .owner = THIS_MODULE,
+ .name = "wm8988-codec",
+ .bus = &spi_bus_type,
+ .owner = THIS_MODULE,
},
- .probe = wm8988_i2c_probe,
- .remove = wm8988_i2c_remove,
- .id_table = wm8988_i2c_id,
+ .probe = wm8988_spi_probe,
+ .remove = __devexit_p(wm8988_spi_remove),
};
-#endif
+#endif /* CONFIG_SPI_MASTER */
-#if defined(CONFIG_SPI_MASTER)
-static int __devinit wm8988_spi_probe(struct spi_device *spi)
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static __devinit int wm8988_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
{
struct wm8988_priv *wm8988;
- struct snd_soc_codec *codec;
+ int ret;
wm8988 = kzalloc(sizeof(struct wm8988_priv), GFP_KERNEL);
if (wm8988 == NULL)
return -ENOMEM;
- codec = &wm8988->codec;
- codec->control_data = spi;
- codec->dev = &spi->dev;
-
- dev_set_drvdata(&spi->dev, wm8988);
+ i2c_set_clientdata(i2c, wm8988);
+ wm8988->control_type = SND_SOC_I2C;
- return wm8988_register(wm8988, SND_SOC_SPI);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8988, &wm8988_dai, 1);
+ if (ret < 0)
+ kfree(wm8988);
+ return ret;
}
-static int __devexit wm8988_spi_remove(struct spi_device *spi)
+static __devexit int wm8988_i2c_remove(struct i2c_client *client)
{
- struct wm8988_priv *wm8988 = dev_get_drvdata(&spi->dev);
-
- wm8988_unregister(wm8988);
-
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
-static struct spi_driver wm8988_spi_driver = {
+static const struct i2c_device_id wm8988_i2c_id[] = {
+ { "wm8988", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, wm8988_i2c_id);
+
+static struct i2c_driver wm8988_i2c_driver = {
.driver = {
- .name = "wm8988",
- .bus = &spi_bus_type,
- .owner = THIS_MODULE,
+ .name = "wm8988-codec",
+ .owner = THIS_MODULE,
},
- .probe = wm8988_spi_probe,
- .remove = __devexit_p(wm8988_spi_remove),
+ .probe = wm8988_i2c_probe,
+ .remove = __devexit_p(wm8988_i2c_remove),
+ .id_table = wm8988_i2c_id,
};
#endif
static int __init wm8988_modinit(void)
{
- int ret;
-
+ int ret = 0;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8988_i2c_driver);
- if (ret != 0)
- pr_err("WM8988: Unable to register I2C driver: %d\n", ret);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register WM8988 I2C driver: %d\n",
+ ret);
+ }
#endif
#if defined(CONFIG_SPI_MASTER)
ret = spi_register_driver(&wm8988_spi_driver);
- if (ret != 0)
- pr_err("WM8988: Unable to register SPI driver: %d\n", ret);
+ if (ret != 0) {
+ printk(KERN_ERR "Failed to register WM8988 SPI driver: %d\n",
+ ret);
+ }
#endif
return ret;
}
diff --git a/sound/soc/codecs/wm8988.h b/sound/soc/codecs/wm8988.h
index 4552d37fdd41..5c04024e5f9f 100644
--- a/sound/soc/codecs/wm8988.h
+++ b/sound/soc/codecs/wm8988.h
@@ -54,7 +54,4 @@
#define WM8988_SYSCLK 0
-extern struct snd_soc_dai wm8988_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8988;
-
#endif
diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c
index dd8d909788c1..0ffecbd1e33b 100644
--- a/sound/soc/codecs/wm8990.c
+++ b/sound/soc/codecs/wm8990.c
@@ -32,6 +32,7 @@
/* codec private data */
struct wm8990_priv {
+ enum snd_soc_control_type control_type;
unsigned int sysclk;
unsigned int pcmclk;
};
@@ -1114,8 +1115,7 @@ static int wm8990_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
u16 audio1 = snd_soc_read(codec, WM8990_AUDIO_INTERFACE_1);
audio1 &= ~WM8990_AIF_WL_MASK;
@@ -1293,10 +1293,9 @@ static struct snd_soc_dai_ops wm8990_dai_ops = {
.set_sysclk = wm8990_set_dai_sysclk,
};
-struct snd_soc_dai wm8990_dai = {
+static struct snd_soc_dai_driver wm8990_dai = {
/* ADC/DAC on primary */
- .name = "WM8990 ADC/DAC Primary",
- .id = 1,
+ .name = "wm8990-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -1311,21 +1310,15 @@ struct snd_soc_dai wm8990_dai = {
.formats = WM8990_FORMATS,},
.ops = &wm8990_dai_ops,
};
-EXPORT_SYMBOL_GPL(wm8990_dai);
-static int wm8990_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8990_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm8990_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm8990_resume(struct platform_device *pdev)
+static int wm8990_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i;
u8 data[2];
u16 *cache = codec->reg_cache;
@@ -1347,38 +1340,19 @@ static int wm8990_resume(struct platform_device *pdev)
* initialise the WM8990 driver
* register the mixer and dsp interfaces with the kernel
*/
-static int wm8990_init(struct snd_soc_device *socdev)
+static int wm8990_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = socdev->card->codec;
+ int ret;
u16 reg;
- int ret = 0;
-
- codec->name = "WM8990";
- codec->owner = THIS_MODULE;
- codec->set_bias_level = wm8990_set_bias_level;
- codec->dai = &wm8990_dai;
- codec->num_dai = 2;
- codec->reg_cache_size = ARRAY_SIZE(wm8990_reg);
- codec->reg_cache = kmemdup(wm8990_reg, sizeof(wm8990_reg), GFP_KERNEL);
-
- if (codec->reg_cache == NULL)
- return -ENOMEM;
ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C);
if (ret < 0) {
printk(KERN_ERR "wm8990: failed to set cache I/O: %d\n", ret);
- goto pcm_err;
+ return ret;
}
wm8990_reset(codec);
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- printk(KERN_ERR "wm8990: failed to create pcms\n");
- goto pcm_err;
- }
-
/* charge output caps */
codec->bias_level = SND_SOC_BIAS_OFF;
wm8990_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
@@ -1400,47 +1374,51 @@ static int wm8990_init(struct snd_soc_device *socdev)
ARRAY_SIZE(wm8990_snd_controls));
wm8990_add_widgets(codec);
- return ret;
+ return 0;
+}
-pcm_err:
- kfree(codec->reg_cache);
- return ret;
+/* power down chip */
+static int wm8990_remove(struct snd_soc_codec *codec)
+{
+ wm8990_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ return 0;
}
-/* If the i2c layer weren't so broken, we could pass this kind of data
- around */
-static struct snd_soc_device *wm8990_socdev;
+static struct snd_soc_codec_driver soc_codec_dev_wm8990 = {
+ .probe = wm8990_probe,
+ .remove = wm8990_remove,
+ .suspend = wm8990_suspend,
+ .resume = wm8990_resume,
+ .set_bias_level = wm8990_set_bias_level,
+ .reg_cache_size = ARRAY_SIZE(wm8990_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8990_reg,
+};
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
-
-/*
- * WM891 2 wire address is determined by GPIO5
- * state during powerup.
- * low = 0x34
- * high = 0x36
- */
-
-static int wm8990_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+static __devinit int wm8990_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
{
- struct snd_soc_device *socdev = wm8990_socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct wm8990_priv *wm8990;
int ret;
- i2c_set_clientdata(i2c, codec);
- codec->control_data = i2c;
+ wm8990 = kzalloc(sizeof(struct wm8990_priv), GFP_KERNEL);
+ if (wm8990 == NULL)
+ return -ENOMEM;
- ret = wm8990_init(socdev);
- if (ret < 0)
- pr_err("failed to initialise WM8990\n");
+ i2c_set_clientdata(i2c, wm8990);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8990, &wm8990_dai, 1);
+ if (ret < 0)
+ kfree(wm8990);
return ret;
}
-static int wm8990_i2c_remove(struct i2c_client *client)
+static __devexit int wm8990_i2c_remove(struct i2c_client *client)
{
- struct snd_soc_codec *codec = i2c_get_clientdata(client);
- kfree(codec->reg_cache);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -1452,134 +1430,34 @@ MODULE_DEVICE_TABLE(i2c, wm8990_i2c_id);
static struct i2c_driver wm8990_i2c_driver = {
.driver = {
- .name = "WM8990 I2C Codec",
+ .name = "wm8990-codec",
.owner = THIS_MODULE,
},
.probe = wm8990_i2c_probe,
- .remove = wm8990_i2c_remove,
+ .remove = __devexit_p(wm8990_i2c_remove),
.id_table = wm8990_i2c_id,
};
-
-static int wm8990_add_i2c_device(struct platform_device *pdev,
- const struct wm8990_setup_data *setup)
-{
- struct i2c_board_info info;
- struct i2c_adapter *adapter;
- struct i2c_client *client;
- int ret;
-
- ret = i2c_add_driver(&wm8990_i2c_driver);
- if (ret != 0) {
- dev_err(&pdev->dev, "can't add i2c driver\n");
- return ret;
- }
-
- memset(&info, 0, sizeof(struct i2c_board_info));
- info.addr = setup->i2c_address;
- strlcpy(info.type, "wm8990", I2C_NAME_SIZE);
-
- adapter = i2c_get_adapter(setup->i2c_bus);
- if (!adapter) {
- dev_err(&pdev->dev, "can't get i2c adapter %d\n",
- setup->i2c_bus);
- goto err_driver;
- }
-
- client = i2c_new_device(adapter, &info);
- i2c_put_adapter(adapter);
- if (!client) {
- dev_err(&pdev->dev, "can't add i2c device at 0x%x\n",
- (unsigned int)info.addr);
- goto err_driver;
- }
-
- return 0;
-
-err_driver:
- i2c_del_driver(&wm8990_i2c_driver);
- return -ENODEV;
-}
#endif
-static int wm8990_probe(struct platform_device *pdev)
+static int __init wm8990_modinit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct wm8990_setup_data *setup;
- struct snd_soc_codec *codec;
- struct wm8990_priv *wm8990;
- int ret;
-
- setup = socdev->codec_data;
- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
- if (codec == NULL)
- return -ENOMEM;
-
- wm8990 = kzalloc(sizeof(struct wm8990_priv), GFP_KERNEL);
- if (wm8990 == NULL) {
- kfree(codec);
- return -ENOMEM;
- }
-
- snd_soc_codec_set_drvdata(codec, wm8990);
- socdev->card->codec = codec;
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
- wm8990_socdev = socdev;
-
- ret = -ENODEV;
-
+ int ret = 0;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
- if (setup->i2c_address) {
- codec->hw_write = (hw_write_t)i2c_master_send;
- ret = wm8990_add_i2c_device(pdev, setup);
- }
-#endif
-
+ ret = i2c_add_driver(&wm8990_i2c_driver);
if (ret != 0) {
- kfree(snd_soc_codec_get_drvdata(codec));
- kfree(codec);
+ printk(KERN_ERR "Failed to register wm8990 I2C driver: %d\n",
+ ret);
}
+#endif
return ret;
}
+module_init(wm8990_modinit);
-/* power down chip */
-static int wm8990_remove(struct platform_device *pdev)
+static void __exit wm8990_exit(void)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec->control_data)
- wm8990_set_bias_level(codec, SND_SOC_BIAS_OFF);
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
- i2c_unregister_device(codec->control_data);
i2c_del_driver(&wm8990_i2c_driver);
#endif
- kfree(snd_soc_codec_get_drvdata(codec));
- kfree(codec);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8990 = {
- .probe = wm8990_probe,
- .remove = wm8990_remove,
- .suspend = wm8990_suspend,
- .resume = wm8990_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8990);
-
-static int __init wm8990_modinit(void)
-{
- return snd_soc_register_dai(&wm8990_dai);
-}
-module_init(wm8990_modinit);
-
-static void __exit wm8990_exit(void)
-{
- snd_soc_unregister_dai(&wm8990_dai);
}
module_exit(wm8990_exit);
diff --git a/sound/soc/codecs/wm8990.h b/sound/soc/codecs/wm8990.h
index 7114ddc88b4b..77c98a4bfe9c 100644
--- a/sound/soc/codecs/wm8990.h
+++ b/sound/soc/codecs/wm8990.h
@@ -826,18 +826,10 @@
#define WM8990_INMIXR_PWR_BIT 2
#define WM8990_AINRMUX_PWR_BIT 3
-struct wm8990_setup_data {
- unsigned i2c_bus;
- unsigned short i2c_address;
-};
-
#define WM8990_MCLK_DIV 0
#define WM8990_DACCLK_DIV 1
#define WM8990_ADCCLK_DIV 2
#define WM8990_BCLK_DIV 3
-extern struct snd_soc_dai wm8990_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8990;
-
#endif /* __WM8990REGISTERDEFS_H__ */
/*------------------------------ END OF FILE ---------------------------------*/
diff --git a/sound/soc/codecs/wm8993.c b/sound/soc/codecs/wm8993.c
index d8d300c6175f..a3fd6b935804 100644
--- a/sound/soc/codecs/wm8993.c
+++ b/sound/soc/codecs/wm8993.c
@@ -229,7 +229,7 @@ struct wm8993_priv {
u16 reg_cache[WM8993_REGISTER_COUNT];
struct regulator_bulk_data supplies[WM8993_NUM_SUPPLIES];
struct wm8993_platform_data pdata;
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
int master;
int sysclk_source;
int tdm_slots;
@@ -367,10 +367,9 @@ static int fll_factors(struct _fll_div *fll_div, unsigned int Fref,
return 0;
}
-static int wm8993_set_fll(struct snd_soc_dai *dai, int fll_id, int source,
+static int _wm8993_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
unsigned int Fref, unsigned int Fout)
{
- struct snd_soc_codec *codec = dai->codec;
struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec);
u16 reg1, reg4, reg5;
struct _fll_div fll_div;
@@ -456,6 +455,12 @@ static int wm8993_set_fll(struct snd_soc_dai *dai, int fll_id, int source,
return 0;
}
+static int wm8993_set_fll(struct snd_soc_dai *dai, int fll_id, int source,
+ unsigned int Fref, unsigned int Fout)
+{
+ return _wm8993_set_fll(dai->codec, fll_id, source, Fref, Fout);
+}
+
static int configure_clock(struct snd_soc_codec *codec)
{
struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec);
@@ -1394,8 +1399,8 @@ static struct snd_soc_dai_ops wm8993_ops = {
SNDRV_PCM_FMTBIT_S24_LE |\
SNDRV_PCM_FMTBIT_S32_LE)
-struct snd_soc_dai wm8993_dai = {
- .name = "WM8993",
+static struct snd_soc_dai_driver wm8993_dai = {
+ .name = "wm8993-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
@@ -1413,32 +1418,81 @@ struct snd_soc_dai wm8993_dai = {
.ops = &wm8993_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(wm8993_dai);
-
-static struct snd_soc_codec *wm8993_codec;
-static int wm8993_probe(struct platform_device *pdev)
+static int wm8993_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- struct wm8993_priv *wm8993;
- int ret = 0;
+ struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec);
+ int ret, i, val;
+
+ wm8993->hubs_data.hp_startup_mode = 1;
+ wm8993->hubs_data.dcs_codes = -2;
+
+ ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C);
+ if (ret != 0) {
+ dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
+ return ret;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(wm8993->supplies); i++)
+ wm8993->supplies[i].supply = wm8993_supply_names[i];
- if (!wm8993_codec) {
- dev_err(&pdev->dev, "I2C device not yet probed\n");
- goto err;
+ ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8993->supplies),
+ wm8993->supplies);
+ if (ret != 0) {
+ dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
+ return ret;
}
- socdev->card->codec = wm8993_codec;
- codec = wm8993_codec;
- wm8993 = snd_soc_codec_get_drvdata(codec);
+ ret = regulator_bulk_enable(ARRAY_SIZE(wm8993->supplies),
+ wm8993->supplies);
+ if (ret != 0) {
+ dev_err(codec->dev, "Failed to enable supplies: %d\n", ret);
+ goto err_get;
+ }
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms\n");
- goto err;
+ val = snd_soc_read(codec, WM8993_SOFTWARE_RESET);
+ if (val != wm8993_reg_defaults[WM8993_SOFTWARE_RESET]) {
+ dev_err(codec->dev, "Invalid ID register value %x\n", val);
+ ret = -EINVAL;
+ goto err_enable;
}
+ ret = snd_soc_write(codec, WM8993_SOFTWARE_RESET, 0xffff);
+ if (ret != 0)
+ goto err_enable;
+
+ codec->cache_only = 1;
+
+ /* By default we're using the output mixers */
+ wm8993->class_w_users = 2;
+
+ /* Latch volume update bits and default ZC on */
+ snd_soc_update_bits(codec, WM8993_RIGHT_DAC_DIGITAL_VOLUME,
+ WM8993_DAC_VU, WM8993_DAC_VU);
+ snd_soc_update_bits(codec, WM8993_RIGHT_ADC_DIGITAL_VOLUME,
+ WM8993_ADC_VU, WM8993_ADC_VU);
+
+ /* Manualy manage the HPOUT sequencing for independent stereo
+ * control. */
+ snd_soc_update_bits(codec, WM8993_ANALOGUE_HP_0,
+ WM8993_HPOUT1_AUTO_PU, 0);
+
+ /* Use automatic clock configuration */
+ snd_soc_update_bits(codec, WM8993_CLOCKING_4, WM8993_SR_MODE, 0);
+
+ wm_hubs_handle_analogue_pdata(codec, wm8993->pdata.lineout1_diff,
+ wm8993->pdata.lineout2_diff,
+ wm8993->pdata.lineout1fb,
+ wm8993->pdata.lineout2fb,
+ wm8993->pdata.jd_scthr,
+ wm8993->pdata.jd_thr,
+ wm8993->pdata.micbias1_lvl,
+ wm8993->pdata.micbias2_lvl);
+
+ ret = wm8993_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+ if (ret != 0)
+ goto err_enable;
+
snd_soc_add_controls(codec, wm8993_snd_controls,
ARRAY_SIZE(wm8993_snd_controls));
if (wm8993->pdata.num_retune_configs != 0) {
@@ -1457,36 +1511,36 @@ static int wm8993_probe(struct platform_device *pdev)
wm_hubs_add_analogue_routes(codec, wm8993->pdata.lineout1_diff,
wm8993->pdata.lineout2_diff);
- return ret;
+ return 0;
-err:
+err_enable:
+ regulator_bulk_disable(ARRAY_SIZE(wm8993->supplies), wm8993->supplies);
+err_get:
+ regulator_bulk_free(ARRAY_SIZE(wm8993->supplies), wm8993->supplies);
return ret;
}
-static int wm8993_remove(struct platform_device *pdev)
+static int wm8993_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
+ struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec);
+ wm8993_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ regulator_bulk_free(ARRAY_SIZE(wm8993->supplies), wm8993->supplies);
return 0;
}
#ifdef CONFIG_PM
-static int wm8993_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8993_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec);
int fll_fout = wm8993->fll_fout;
int fll_fref = wm8993->fll_fref;
int ret;
/* Stop the FLL in an orderly fashion */
- ret = wm8993_set_fll(codec->dai, 0, 0, 0, 0);
+ ret = _wm8993_set_fll(codec, 0, 0, 0, 0);
if (ret != 0) {
- dev_err(&pdev->dev, "Failed to stop FLL\n");
+ dev_err(codec->dev, "Failed to stop FLL\n");
return ret;
}
@@ -1498,10 +1552,8 @@ static int wm8993_suspend(struct platform_device *pdev, pm_message_t state)
return 0;
}
-static int wm8993_resume(struct platform_device *pdev)
+static int wm8993_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec);
int ret;
@@ -1515,7 +1567,7 @@ static int wm8993_resume(struct platform_device *pdev)
wm8993->fll_fref = 0;
wm8993->fll_fout = 0;
- ret = wm8993_set_fll(codec->dai, 0, wm8993->fll_src,
+ ret = _wm8993_set_fll(codec, 0, wm8993->fll_src,
fll_fref, fll_fout);
if (ret != 0)
dev_err(codec->dev, "Failed to restart FLL\n");
@@ -1528,162 +1580,42 @@ static int wm8993_resume(struct platform_device *pdev)
#define wm8993_resume NULL
#endif
-struct snd_soc_codec_device soc_codec_dev_wm8993 = {
+static struct snd_soc_codec_driver soc_codec_dev_wm8993 = {
.probe = wm8993_probe,
.remove = wm8993_remove,
.suspend = wm8993_suspend,
.resume = wm8993_resume,
+ .set_bias_level = wm8993_set_bias_level,
+ .reg_cache_size = sizeof(wm8993_reg_defaults),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm8993_reg_defaults,
+ .volatile_register = wm8993_volatile,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8993);
-static int wm8993_i2c_probe(struct i2c_client *i2c,
- const struct i2c_device_id *id)
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+static __devinit int wm8993_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
{
struct wm8993_priv *wm8993;
- struct snd_soc_codec *codec;
- unsigned int val;
int ret;
- int i;
-
- if (wm8993_codec) {
- dev_err(&i2c->dev, "A WM8993 is already registered\n");
- return -EINVAL;
- }
wm8993 = kzalloc(sizeof(struct wm8993_priv), GFP_KERNEL);
if (wm8993 == NULL)
return -ENOMEM;
- codec = &wm8993->codec;
- if (i2c->dev.platform_data)
- memcpy(&wm8993->pdata, i2c->dev.platform_data,
- sizeof(wm8993->pdata));
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->name = "WM8993";
- codec->volatile_register = wm8993_volatile;
- codec->reg_cache = wm8993->reg_cache;
- codec->reg_cache_size = ARRAY_SIZE(wm8993->reg_cache);
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8993_set_bias_level;
- codec->dai = &wm8993_dai;
- codec->num_dai = 1;
- snd_soc_codec_set_drvdata(codec, wm8993);
-
- wm8993->hubs_data.hp_startup_mode = 1;
- wm8993->hubs_data.dcs_codes = -2;
-
- memcpy(wm8993->reg_cache, wm8993_reg_defaults,
- sizeof(wm8993->reg_cache));
-
- ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
- }
-
i2c_set_clientdata(i2c, wm8993);
- codec->control_data = i2c;
- wm8993_codec = codec;
-
- codec->dev = &i2c->dev;
-
- for (i = 0; i < ARRAY_SIZE(wm8993->supplies); i++)
- wm8993->supplies[i].supply = wm8993_supply_names[i];
-
- ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8993->supplies),
- wm8993->supplies);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
- goto err;
- }
-
- ret = regulator_bulk_enable(ARRAY_SIZE(wm8993->supplies),
- wm8993->supplies);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to enable supplies: %d\n", ret);
- goto err_get;
- }
-
- val = snd_soc_read(codec, WM8993_SOFTWARE_RESET);
- if (val != wm8993_reg_defaults[WM8993_SOFTWARE_RESET]) {
- dev_err(codec->dev, "Invalid ID register value %x\n", val);
- ret = -EINVAL;
- goto err_enable;
- }
-
- ret = snd_soc_write(codec, WM8993_SOFTWARE_RESET, 0xffff);
- if (ret != 0)
- goto err_enable;
-
- codec->cache_only = 1;
-
- /* By default we're using the output mixers */
- wm8993->class_w_users = 2;
-
- /* Latch volume update bits and default ZC on */
- snd_soc_update_bits(codec, WM8993_RIGHT_DAC_DIGITAL_VOLUME,
- WM8993_DAC_VU, WM8993_DAC_VU);
- snd_soc_update_bits(codec, WM8993_RIGHT_ADC_DIGITAL_VOLUME,
- WM8993_ADC_VU, WM8993_ADC_VU);
- /* Manualy manage the HPOUT sequencing for independent stereo
- * control. */
- snd_soc_update_bits(codec, WM8993_ANALOGUE_HP_0,
- WM8993_HPOUT1_AUTO_PU, 0);
-
- /* Use automatic clock configuration */
- snd_soc_update_bits(codec, WM8993_CLOCKING_4, WM8993_SR_MODE, 0);
-
- wm_hubs_handle_analogue_pdata(codec, wm8993->pdata.lineout1_diff,
- wm8993->pdata.lineout2_diff,
- wm8993->pdata.lineout1fb,
- wm8993->pdata.lineout2fb,
- wm8993->pdata.jd_scthr,
- wm8993->pdata.jd_thr,
- wm8993->pdata.micbias1_lvl,
- wm8993->pdata.micbias2_lvl);
-
- ret = wm8993_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
- if (ret != 0)
- goto err_enable;
-
- wm8993_dai.dev = codec->dev;
-
- ret = snd_soc_register_dai(&wm8993_dai);
- if (ret != 0)
- goto err_bias;
-
- ret = snd_soc_register_codec(codec);
-
- return 0;
-
-err_bias:
- wm8993_set_bias_level(codec, SND_SOC_BIAS_OFF);
-err_enable:
- regulator_bulk_disable(ARRAY_SIZE(wm8993->supplies), wm8993->supplies);
-err_get:
- regulator_bulk_free(ARRAY_SIZE(wm8993->supplies), wm8993->supplies);
-err:
- wm8993_codec = NULL;
- kfree(wm8993);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm8993, &wm8993_dai, 1);
+ if (ret < 0)
+ kfree(wm8993);
return ret;
}
-static int wm8993_i2c_remove(struct i2c_client *client)
+static __devexit int wm8993_i2c_remove(struct i2c_client *client)
{
- struct wm8993_priv *wm8993 = i2c_get_clientdata(client);
-
- snd_soc_unregister_codec(&wm8993->codec);
- snd_soc_unregister_dai(&wm8993_dai);
-
- wm8993_set_bias_level(&wm8993->codec, SND_SOC_BIAS_OFF);
- regulator_bulk_free(ARRAY_SIZE(wm8993->supplies), wm8993->supplies);
- kfree(wm8993);
-
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -1695,30 +1627,34 @@ MODULE_DEVICE_TABLE(i2c, wm8993_i2c_id);
static struct i2c_driver wm8993_i2c_driver = {
.driver = {
- .name = "WM8993",
+ .name = "wm8993-codec",
.owner = THIS_MODULE,
},
- .probe = wm8993_i2c_probe,
- .remove = wm8993_i2c_remove,
+ .probe = wm8993_i2c_probe,
+ .remove = __devexit_p(wm8993_i2c_remove),
.id_table = wm8993_i2c_id,
};
-
+#endif
static int __init wm8993_modinit(void)
{
- int ret;
-
+ int ret = 0;
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8993_i2c_driver);
- if (ret != 0)
- pr_err("WM8993: Unable to register I2C driver: %d\n", ret);
-
+ if (ret != 0) {
+ pr_err("WM8993: Unable to register I2C driver: %d\n",
+ ret);
+ }
+#endif
return ret;
}
module_init(wm8993_modinit);
static void __exit wm8993_exit(void)
{
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_del_driver(&wm8993_i2c_driver);
+#endif
}
module_exit(wm8993_exit);
diff --git a/sound/soc/codecs/wm8993.h b/sound/soc/codecs/wm8993.h
index 30e71ca88dad..2184617b9611 100644
--- a/sound/soc/codecs/wm8993.h
+++ b/sound/soc/codecs/wm8993.h
@@ -1,9 +1,6 @@
#ifndef WM8993_H
#define WM8993_H
-extern struct snd_soc_dai wm8993_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm8993;
-
#define WM8993_SYSCLK_MCLK 1
#define WM8993_SYSCLK_FLL 2
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
index 522249d5c2b4..76a066e908ed 100644
--- a/sound/soc/codecs/wm8994.c
+++ b/sound/soc/codecs/wm8994.c
@@ -36,9 +36,6 @@
#include "wm8994.h"
#include "wm_hubs.h"
-static struct snd_soc_codec *wm8994_codec;
-struct snd_soc_codec_device soc_codec_dev_wm8994;
-
struct fll_config {
int src;
int in;
@@ -71,7 +68,9 @@ struct wm8994_micdet {
/* codec private data */
struct wm8994_priv {
struct wm_hubs_data hubs;
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
+ void *control_data;
+ struct snd_soc_codec *codec;
u16 reg_cache[WM8994_REG_CACHE_SIZE + 1];
int sysclk[2];
int sysclk_rate[2];
@@ -1902,8 +1901,6 @@ static int wm8994_put_drc_sw(struct snd_kcontrol *kcontrol,
return snd_soc_put_volsw(kcontrol, ucontrol);
}
-
-
static void wm8994_set_drc(struct snd_soc_codec *codec, int drc)
{
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
@@ -1942,7 +1939,7 @@ static int wm8994_put_drc_enum(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
- struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
+ struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
struct wm8994_pdata *pdata = wm8994->pdata;
int drc = wm8994_get_drc(kcontrol->id.name);
int value = ucontrol->value.integer.value[0];
@@ -2045,7 +2042,7 @@ static int wm8994_put_retune_mobile_enum(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
- struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
+ struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
struct wm8994_pdata *pdata = wm8994->pdata;
int block = wm8994_get_retune_mobile_block(kcontrol->id.name);
int value = ucontrol->value.integer.value[0];
@@ -2067,7 +2064,7 @@ static int wm8994_get_retune_mobile_enum(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
- struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
+ struct wm8994_priv *wm8994 =snd_soc_codec_get_drvdata(codec);
int block = wm8994_get_retune_mobile_block(kcontrol->id.name);
ucontrol->value.enumerated.item[0] = wm8994->retune_mobile_cfg[block];
@@ -2881,10 +2878,9 @@ static int wm8994_get_fll_config(struct fll_div *fll,
return 0;
}
-static int wm8994_set_fll(struct snd_soc_dai *dai, int id, int src,
+static int _wm8994_set_fll(struct snd_soc_codec *codec, int id, int src,
unsigned int freq_in, unsigned int freq_out)
{
- struct snd_soc_codec *codec = dai->codec;
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
int reg_offset, ret;
struct fll_div fll;
@@ -2995,8 +2991,15 @@ static int wm8994_set_fll(struct snd_soc_dai *dai, int id, int src,
return 0;
}
+
static int opclk_divs[] = { 10, 20, 30, 40, 55, 60, 80, 120, 160 };
+static int wm8994_set_fll(struct snd_soc_dai *dai, int id, int src,
+ unsigned int freq_in, unsigned int freq_out)
+{
+ return _wm8994_set_fll(dai->codec, id, src, freq_in, freq_out);
+}
+
static int wm8994_set_dai_sysclk(struct snd_soc_dai *dai,
int clk_id, unsigned int freq, int dir)
{
@@ -3515,10 +3518,9 @@ static struct snd_soc_dai_ops wm8994_aif3_dai_ops = {
.set_tristate = wm8994_set_tristate,
};
-struct snd_soc_dai wm8994_dai[] = {
+static struct snd_soc_dai_driver wm8994_dai[] = {
{
- .name = "WM8994 AIF1",
- .id = 1,
+ .name = "wm8994-aif1",
.playback = {
.stream_name = "AIF1 Playback",
.channels_min = 2,
@@ -3536,8 +3538,7 @@ struct snd_soc_dai wm8994_dai[] = {
.ops = &wm8994_aif1_dai_ops,
},
{
- .name = "WM8994 AIF2",
- .id = 2,
+ .name = "wm8994-aif2",
.playback = {
.stream_name = "AIF2 Playback",
.channels_min = 2,
@@ -3555,8 +3556,7 @@ struct snd_soc_dai wm8994_dai[] = {
.ops = &wm8994_aif2_dai_ops,
},
{
- .name = "WM8994 AIF3",
- .id = 3,
+ .name = "wm8994-aif3",
.playback = {
.stream_name = "AIF3 Playback",
.channels_min = 2,
@@ -3574,20 +3574,17 @@ struct snd_soc_dai wm8994_dai[] = {
.ops = &wm8994_aif3_dai_ops,
}
};
-EXPORT_SYMBOL_GPL(wm8994_dai);
#ifdef CONFIG_PM
-static int wm8994_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm8994_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
int i, ret;
for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) {
memcpy(&wm8994->fll_suspend[i], &wm8994->fll[i],
sizeof(struct fll_config));
- ret = wm8994_set_fll(&codec->dai[0], i + 1, 0, 0, 0);
+ ret = _wm8994_set_fll(codec, i + 1, 0, 0, 0);
if (ret < 0)
dev_warn(codec->dev, "Failed to stop FLL%d: %d\n",
i + 1, ret);
@@ -3598,10 +3595,8 @@ static int wm8994_suspend(struct platform_device *pdev, pm_message_t state)
return 0;
}
-static int wm8994_resume(struct platform_device *pdev)
+static int wm8994_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
u16 *reg_cache = codec->reg_cache;
int i, ret;
@@ -3630,7 +3625,7 @@ static int wm8994_resume(struct platform_device *pdev)
if (!wm8994->fll_suspend[i].out)
continue;
- ret = wm8994_set_fll(&codec->dai[0], i + 1,
+ ret = _wm8994_set_fll(codec, i + 1,
wm8994->fll_suspend[i].src,
wm8994->fll_suspend[i].in,
wm8994->fll_suspend[i].out);
@@ -3648,7 +3643,7 @@ static int wm8994_resume(struct platform_device *pdev)
static void wm8994_handle_retune_mobile_pdata(struct wm8994_priv *wm8994)
{
- struct snd_soc_codec *codec = &wm8994->codec;
+ struct snd_soc_codec *codec = wm8994->codec;
struct wm8994_pdata *pdata = wm8994->pdata;
struct snd_kcontrol_new controls[] = {
SOC_ENUM_EXT("AIF1.1 EQ Mode",
@@ -3706,16 +3701,16 @@ static void wm8994_handle_retune_mobile_pdata(struct wm8994_priv *wm8994)
wm8994->retune_mobile_enum.max = wm8994->num_retune_mobile_texts;
wm8994->retune_mobile_enum.texts = wm8994->retune_mobile_texts;
- ret = snd_soc_add_controls(&wm8994->codec, controls,
+ ret = snd_soc_add_controls(wm8994->codec, controls,
ARRAY_SIZE(controls));
if (ret != 0)
- dev_err(wm8994->codec.dev,
+ dev_err(wm8994->codec->dev,
"Failed to add ReTune Mobile controls: %d\n", ret);
}
static void wm8994_handle_pdata(struct wm8994_priv *wm8994)
{
- struct snd_soc_codec *codec = &wm8994->codec;
+ struct snd_soc_codec *codec = wm8994->codec;
struct wm8994_pdata *pdata = wm8994->pdata;
int ret, i;
@@ -3747,7 +3742,7 @@ static void wm8994_handle_pdata(struct wm8994_priv *wm8994)
wm8994->drc_texts = kmalloc(sizeof(char *)
* pdata->num_drc_cfgs, GFP_KERNEL);
if (!wm8994->drc_texts) {
- dev_err(wm8994->codec.dev,
+ dev_err(wm8994->codec->dev,
"Failed to allocate %d DRC config texts\n",
pdata->num_drc_cfgs);
return;
@@ -3759,10 +3754,10 @@ static void wm8994_handle_pdata(struct wm8994_priv *wm8994)
wm8994->drc_enum.max = pdata->num_drc_cfgs;
wm8994->drc_enum.texts = wm8994->drc_texts;
- ret = snd_soc_add_controls(&wm8994->codec, controls,
+ ret = snd_soc_add_controls(wm8994->codec, controls,
ARRAY_SIZE(controls));
if (ret != 0)
- dev_err(wm8994->codec.dev,
+ dev_err(wm8994->codec->dev,
"Failed to add DRC mode controls: %d\n", ret);
for (i = 0; i < WM8994_NUM_DRC; i++)
@@ -3775,62 +3770,10 @@ static void wm8994_handle_pdata(struct wm8994_priv *wm8994)
if (pdata->num_retune_mobile_cfgs)
wm8994_handle_retune_mobile_pdata(wm8994);
else
- snd_soc_add_controls(&wm8994->codec, wm8994_eq_controls,
+ snd_soc_add_controls(wm8994->codec, wm8994_eq_controls,
ARRAY_SIZE(wm8994_eq_controls));
}
-static int wm8994_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-
- if (wm8994_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
- }
-
- socdev->card->codec = wm8994_codec;
- codec = wm8994_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- return ret;
- }
-
- wm8994_handle_pdata(snd_soc_codec_get_drvdata(codec));
-
- wm_hubs_add_analogue_controls(codec);
- snd_soc_add_controls(codec, wm8994_snd_controls,
- ARRAY_SIZE(wm8994_snd_controls));
- snd_soc_dapm_new_controls(codec, wm8994_dapm_widgets,
- ARRAY_SIZE(wm8994_dapm_widgets));
- wm_hubs_add_analogue_routes(codec, 0, 0);
- snd_soc_dapm_add_routes(codec, intercon, ARRAY_SIZE(intercon));
-
- return 0;
-}
-
-static int wm8994_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
- return 0;
-}
-
-struct snd_soc_codec_device soc_codec_dev_wm8994 = {
- .probe = wm8994_probe,
- .remove = wm8994_remove,
- .suspend = wm8994_suspend,
- .resume = wm8994_resume,
-};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8994);
-
/**
* wm8994_mic_detect - Enable microphone detection via the WM8994 IRQ
*
@@ -3889,7 +3832,7 @@ EXPORT_SYMBOL_GPL(wm8994_mic_detect);
static irqreturn_t wm8994_mic_irq(int irq, void *data)
{
struct wm8994_priv *priv = data;
- struct snd_soc_codec *codec = &priv->codec;
+ struct snd_soc_codec *codec = priv->codec;
int reg;
int report;
@@ -3921,46 +3864,20 @@ static irqreturn_t wm8994_mic_irq(int irq, void *data)
return IRQ_HANDLED;
}
-static int wm8994_codec_probe(struct platform_device *pdev)
+static int wm8994_codec_probe(struct snd_soc_codec *codec)
{
- int ret;
struct wm8994_priv *wm8994;
- struct snd_soc_codec *codec;
- int i;
+ int ret, i;
- if (wm8994_codec) {
- dev_err(&pdev->dev, "Another WM8994 is registered\n");
- return -EINVAL;
- }
+ codec->control_data = dev_get_drvdata(codec->dev->parent);
wm8994 = kzalloc(sizeof(struct wm8994_priv), GFP_KERNEL);
- if (!wm8994) {
- dev_err(&pdev->dev, "Failed to allocate private data\n");
+ if (wm8994 == NULL)
return -ENOMEM;
- }
-
- codec = &wm8994->codec;
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
snd_soc_codec_set_drvdata(codec, wm8994);
- codec->control_data = dev_get_drvdata(pdev->dev.parent);
- codec->name = "WM8994";
- codec->owner = THIS_MODULE;
- codec->read = wm8994_read;
- codec->write = wm8994_write;
- codec->readable_register = wm8994_readable;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm8994_set_bias_level;
- codec->dai = &wm8994_dai[0];
- codec->num_dai = 3;
- codec->reg_cache_size = WM8994_MAX_REGISTER;
- codec->reg_cache = &wm8994->reg_cache;
- codec->dev = &pdev->dev;
-
- wm8994->pdata = pdev->dev.parent->platform_data;
+
+ wm8994->pdata = dev_get_platdata(codec->dev->parent);
+ wm8994->codec = codec;
/* Fill the cache with physical values we inherited; don't reset */
ret = wm8994_bulk_read(codec->control_data, 0,
@@ -3996,25 +3913,25 @@ static int wm8994_codec_probe(struct platform_device *pdev)
ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_MIC1_DET,
wm8994_mic_irq, "Mic 1 detect", wm8994);
if (ret != 0)
- dev_warn(&pdev->dev,
+ dev_warn(codec->dev,
"Failed to request Mic1 detect IRQ: %d\n", ret);
ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_MIC1_SHRT,
wm8994_mic_irq, "Mic 1 short", wm8994);
if (ret != 0)
- dev_warn(&pdev->dev,
+ dev_warn(codec->dev,
"Failed to request Mic1 short IRQ: %d\n", ret);
ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_MIC2_DET,
wm8994_mic_irq, "Mic 2 detect", wm8994);
if (ret != 0)
- dev_warn(&pdev->dev,
+ dev_warn(codec->dev,
"Failed to request Mic2 detect IRQ: %d\n", ret);
ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_MIC2_SHRT,
wm8994_mic_irq, "Mic 2 short", wm8994);
if (ret != 0)
- dev_warn(&pdev->dev,
+ dev_warn(codec->dev,
"Failed to request Mic2 short IRQ: %d\n", ret);
/* Remember if AIFnLRCLK is configured as a GPIO. This should be
@@ -4045,13 +3962,8 @@ static int wm8994_codec_probe(struct platform_device *pdev)
wm8994->lrclk_shared[1] = 0;
}
- for (i = 0; i < ARRAY_SIZE(wm8994_dai); i++)
- wm8994_dai[i].dev = codec->dev;
-
wm8994_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
- wm8994_codec = codec;
-
/* Latch volume updates (right only; we always do left then right). */
snd_soc_update_bits(codec, WM8994_AIF1_DAC1_RIGHT_VOLUME,
WM8994_AIF1DAC1_VU, WM8994_AIF1DAC1_VU);
@@ -4088,24 +4000,18 @@ static int wm8994_codec_probe(struct platform_device *pdev)
wm8994_update_class_w(codec);
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err_irq;
- }
+ wm8994_handle_pdata(wm8994);
- ret = snd_soc_register_dais(wm8994_dai, ARRAY_SIZE(wm8994_dai));
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAIs: %d\n", ret);
- goto err_codec;
- }
-
- platform_set_drvdata(pdev, wm8994);
+ wm_hubs_add_analogue_controls(codec);
+ snd_soc_add_controls(codec, wm8994_snd_controls,
+ ARRAY_SIZE(wm8994_snd_controls));
+ snd_soc_dapm_new_controls(codec, wm8994_dapm_widgets,
+ ARRAY_SIZE(wm8994_dapm_widgets));
+ wm_hubs_add_analogue_routes(codec, 0, 0);
+ snd_soc_dapm_add_routes(codec, intercon, ARRAY_SIZE(intercon));
return 0;
-err_codec:
- snd_soc_unregister_codec(codec);
err_irq:
wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_SHRT, wm8994);
wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_DET, wm8994);
@@ -4116,31 +4022,50 @@ err:
return ret;
}
-static int __devexit wm8994_codec_remove(struct platform_device *pdev)
+static int wm8994_codec_remove(struct snd_soc_codec *codec)
{
- struct wm8994_priv *wm8994 = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = &wm8994->codec;
+ struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
wm8994_set_bias_level(codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dais(wm8994_dai, ARRAY_SIZE(wm8994_dai));
- snd_soc_unregister_codec(&wm8994->codec);
+
wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_SHRT, wm8994);
wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_DET, wm8994);
wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_SHRT, wm8994);
wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_DET, wm8994);
kfree(wm8994);
- wm8994_codec = NULL;
return 0;
}
+static struct snd_soc_codec_driver soc_codec_dev_wm8994 = {
+ .probe = wm8994_codec_probe,
+ .remove = wm8994_codec_remove,
+ .suspend = wm8994_suspend,
+ .resume = wm8994_resume,
+ .read = wm8994_read,
+ .write = wm8994_write,
+ .set_bias_level = wm8994_set_bias_level,
+};
+
+static int __devinit wm8994_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8994,
+ wm8994_dai, ARRAY_SIZE(wm8994_dai));
+}
+
+static int __devexit wm8994_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_codec(&pdev->dev);
+ return 0;
+}
+
static struct platform_driver wm8994_codec_driver = {
.driver = {
.name = "wm8994-codec",
.owner = THIS_MODULE,
},
- .probe = wm8994_codec_probe,
- .remove = __devexit_p(wm8994_codec_remove),
+ .probe = wm8994_probe,
+ .remove = __devexit_p(wm8994_remove),
};
static __init int wm8994_init(void)
diff --git a/sound/soc/codecs/wm8994.h b/sound/soc/codecs/wm8994.h
index 2e0ca67a8df7..d8dce260c430 100644
--- a/sound/soc/codecs/wm8994.h
+++ b/sound/soc/codecs/wm8994.h
@@ -11,9 +11,6 @@
#include <sound/soc.h>
-extern struct snd_soc_codec_device soc_codec_dev_wm8994;
-extern struct snd_soc_dai wm8994_dai[];
-
/* Sources for AIF1/2 SYSCLK - use with set_dai_sysclk() */
#define WM8994_SYSCLK_MCLK1 1
#define WM8994_SYSCLK_MCLK2 2
diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c
index 76b37ff6c264..00249d5b6793 100644
--- a/sound/soc/codecs/wm9081.c
+++ b/sound/soc/codecs/wm9081.c
@@ -156,7 +156,8 @@ static struct {
};
struct wm9081_priv {
- struct snd_soc_codec codec;
+ enum snd_soc_control_type control_type;
+ void *control_data;
u16 reg_cache[WM9081_MAX_REGISTER + 1];
int sysclk_source;
int mclk_rate;
@@ -1212,8 +1213,8 @@ static struct snd_soc_dai_ops wm9081_dai_ops = {
/* We report two channels because the CODEC processes a stereo signal, even
* though it is only capable of handling a mono output.
*/
-struct snd_soc_dai wm9081_dai = {
- .name = "WM9081",
+static struct snd_soc_dai_driver wm9081_dai = {
+ .name = "wm9081-hifi",
.playback = {
.stream_name = "HiFi Playback",
.channels_min = 1,
@@ -1223,34 +1224,42 @@ struct snd_soc_dai wm9081_dai = {
},
.ops = &wm9081_dai_ops,
};
-EXPORT_SYMBOL_GPL(wm9081_dai);
-
-static struct snd_soc_codec *wm9081_codec;
-
-static int wm9081_probe(struct platform_device *pdev)
+static int wm9081_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- struct wm9081_priv *wm9081;
- int ret = 0;
+ struct wm9081_priv *wm9081 = snd_soc_codec_get_drvdata(codec);
+ int ret;
+ u16 reg;
- if (wm9081_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
+ codec->control_data = wm9081->control_data;
+ ret = snd_soc_codec_set_cache_io(codec, 8, 16, wm9081->control_type);
+ if (ret != 0) {
+ dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
+ return ret;
}
- socdev->card->codec = wm9081_codec;
- codec = wm9081_codec;
- wm9081 = snd_soc_codec_get_drvdata(codec);
+ reg = snd_soc_read(codec, WM9081_SOFTWARE_RESET);
+ if (reg != 0x9081) {
+ dev_err(codec->dev, "Device is not a WM9081: ID=0x%x\n", reg);
+ ret = -EINVAL;
+ return ret;
+ }
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
+ ret = wm9081_reset(codec);
if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
+ dev_err(codec->dev, "Failed to issue reset\n");
+ return ret;
}
+ wm9081_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+
+ /* Enable zero cross by default */
+ reg = snd_soc_read(codec, WM9081_ANALOGUE_LINEOUT);
+ snd_soc_write(codec, WM9081_ANALOGUE_LINEOUT, reg | WM9081_LINEOUTZC);
+ reg = snd_soc_read(codec, WM9081_ANALOGUE_SPEAKER_PGA);
+ snd_soc_write(codec, WM9081_ANALOGUE_SPEAKER_PGA,
+ reg | WM9081_SPKPGAZC);
+
snd_soc_add_controls(codec, wm9081_snd_controls,
ARRAY_SIZE(wm9081_snd_controls));
if (!wm9081->retune) {
@@ -1265,40 +1274,28 @@ static int wm9081_probe(struct platform_device *pdev)
snd_soc_dapm_add_routes(codec, audio_paths, ARRAY_SIZE(audio_paths));
return ret;
-
-pcm_err:
- return ret;
}
-static int wm9081_remove(struct platform_device *pdev)
+static int wm9081_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-
+ wm9081_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
#ifdef CONFIG_PM
-static int wm9081_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm9081_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm9081_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm9081_resume(struct platform_device *pdev)
+static int wm9081_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
u16 *reg_cache = codec->reg_cache;
int i;
- for (i = 0; i < codec->reg_cache_size; i++) {
+ for (i = 0; i < codec->driver->reg_cache_size; i++) {
if (i == WM9081_SOFTWARE_RESET)
continue;
@@ -1314,133 +1311,43 @@ static int wm9081_resume(struct platform_device *pdev)
#define wm9081_resume NULL
#endif
-struct snd_soc_codec_device soc_codec_dev_wm9081 = {
+static struct snd_soc_codec_driver soc_codec_dev_wm9081 = {
.probe = wm9081_probe,
.remove = wm9081_remove,
.suspend = wm9081_suspend,
.resume = wm9081_resume,
+ .set_bias_level = wm9081_set_bias_level,
+ .reg_cache_size = sizeof(wm9081_reg_defaults),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm9081_reg_defaults,
+ .volatile_register = wm9081_volatile_register,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm9081);
-
-static int wm9081_register(struct wm9081_priv *wm9081,
- enum snd_soc_control_type control)
-{
- struct snd_soc_codec *codec = &wm9081->codec;
- int ret;
- u16 reg;
-
- if (wm9081_codec) {
- dev_err(codec->dev, "Another WM9081 is registered\n");
- ret = -EINVAL;
- goto err;
- }
-
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- snd_soc_codec_set_drvdata(codec, wm9081);
- codec->name = "WM9081";
- codec->owner = THIS_MODULE;
- codec->dai = &wm9081_dai;
- codec->num_dai = 1;
- codec->reg_cache_size = ARRAY_SIZE(wm9081->reg_cache);
- codec->reg_cache = &wm9081->reg_cache;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm9081_set_bias_level;
- codec->volatile_register = wm9081_volatile_register;
-
- memcpy(codec->reg_cache, wm9081_reg_defaults,
- sizeof(wm9081_reg_defaults));
-
- ret = snd_soc_codec_set_cache_io(codec, 8, 16, control);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
- }
-
- reg = snd_soc_read(codec, WM9081_SOFTWARE_RESET);
- if (reg != 0x9081) {
- dev_err(codec->dev, "Device is not a WM9081: ID=0x%x\n", reg);
- ret = -EINVAL;
- goto err;
- }
-
- ret = wm9081_reset(codec);
- if (ret < 0) {
- dev_err(codec->dev, "Failed to issue reset\n");
- goto err;
- }
-
- wm9081_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
- /* Enable zero cross by default */
- reg = snd_soc_read(codec, WM9081_ANALOGUE_LINEOUT);
- snd_soc_write(codec, WM9081_ANALOGUE_LINEOUT, reg | WM9081_LINEOUTZC);
- reg = snd_soc_read(codec, WM9081_ANALOGUE_SPEAKER_PGA);
- snd_soc_write(codec, WM9081_ANALOGUE_SPEAKER_PGA,
- reg | WM9081_SPKPGAZC);
-
- wm9081_dai.dev = codec->dev;
-
- wm9081_codec = codec;
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register codec: %d\n", ret);
- goto err;
- }
-
- ret = snd_soc_register_dai(&wm9081_dai);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
- goto err_codec;
- }
-
- return 0;
-
-err_codec:
- snd_soc_unregister_codec(codec);
-err:
- kfree(wm9081);
- return ret;
-}
-
-static void wm9081_unregister(struct wm9081_priv *wm9081)
-{
- wm9081_set_bias_level(&wm9081->codec, SND_SOC_BIAS_OFF);
- snd_soc_unregister_dai(&wm9081_dai);
- snd_soc_unregister_codec(&wm9081->codec);
- kfree(wm9081);
- wm9081_codec = NULL;
-}
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static __devinit int wm9081_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct wm9081_priv *wm9081;
- struct snd_soc_codec *codec;
+ int ret;
wm9081 = kzalloc(sizeof(struct wm9081_priv), GFP_KERNEL);
if (wm9081 == NULL)
return -ENOMEM;
- codec = &wm9081->codec;
- codec->hw_write = (hw_write_t)i2c_master_send;
- wm9081->retune = i2c->dev.platform_data;
-
i2c_set_clientdata(i2c, wm9081);
- codec->control_data = i2c;
-
- codec->dev = &i2c->dev;
+ wm9081->control_data = i2c;
- return wm9081_register(wm9081, SND_SOC_I2C);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm9081, &wm9081_dai, 1);
+ if (ret < 0)
+ kfree(wm9081);
+ return ret;
}
static __devexit int wm9081_i2c_remove(struct i2c_client *client)
{
- struct wm9081_priv *wm9081 = i2c_get_clientdata(client);
- wm9081_unregister(wm9081);
+ snd_soc_unregister_codec(&client->dev);
+ kfree(i2c_get_clientdata(client));
return 0;
}
@@ -1452,31 +1359,34 @@ MODULE_DEVICE_TABLE(i2c, wm9081_i2c_id);
static struct i2c_driver wm9081_i2c_driver = {
.driver = {
- .name = "wm9081",
+ .name = "wm9081-codec",
.owner = THIS_MODULE,
},
.probe = wm9081_i2c_probe,
.remove = __devexit_p(wm9081_i2c_remove),
.id_table = wm9081_i2c_id,
};
+#endif
static int __init wm9081_modinit(void)
{
- int ret;
-
+ int ret = 0;
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm9081_i2c_driver);
if (ret != 0) {
printk(KERN_ERR "Failed to register WM9081 I2C driver: %d\n",
ret);
}
-
+#endif
return ret;
}
module_init(wm9081_modinit);
static void __exit wm9081_exit(void)
{
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_del_driver(&wm9081_i2c_driver);
+#endif
}
module_exit(wm9081_exit);
diff --git a/sound/soc/codecs/wm9081.h b/sound/soc/codecs/wm9081.h
index 42d3bc757021..871cccb066dc 100644
--- a/sound/soc/codecs/wm9081.h
+++ b/sound/soc/codecs/wm9081.h
@@ -15,9 +15,6 @@
#include <sound/soc.h>
-extern struct snd_soc_dai wm9081_dai;
-extern struct snd_soc_codec_device soc_codec_dev_wm9081;
-
/*
* SYSCLK sources
*/
diff --git a/sound/soc/codecs/wm9090.c b/sound/soc/codecs/wm9090.c
index 1592250daec0..7a1825418ee4 100644
--- a/sound/soc/codecs/wm9090.c
+++ b/sound/soc/codecs/wm9090.c
@@ -34,8 +34,6 @@
#include "wm9090.h"
-static struct snd_soc_codec *wm9090_codec;
-
static const u16 wm9090_reg_defaults[] = {
0x9093, /* R0 - Software Reset */
0x0006, /* R1 - Power Management (1) */
@@ -142,15 +140,10 @@ static const u16 wm9090_reg_defaults[] = {
/* This struct is used to save the context */
struct wm9090_priv {
- /* We're not really registering as a CODEC since ASoC core
- * does not yet support multiple CODECs but having the CODEC
- * structure means we can reuse some of the ASoC core
- * features.
- */
- struct snd_soc_codec codec;
struct mutex mutex;
u16 reg_cache[WM9090_MAX_REGISTER + 1];
struct wm9090_platform_data pdata;
+ void *control_data;
};
static int wm9090_volatile(unsigned int reg)
@@ -523,7 +516,7 @@ static int wm9090_set_bias_level(struct snd_soc_codec *codec,
case SND_SOC_BIAS_STANDBY:
if (codec->bias_level == SND_SOC_BIAS_OFF) {
/* Restore the register cache */
- for (i = 1; i < codec->reg_cache_size; i++) {
+ for (i = 1; i < codec->driver->reg_cache_size; i++) {
if (reg_cache[i] == wm9090_reg_defaults[i])
continue;
if (wm9090_volatile(i))
@@ -556,51 +549,67 @@ static int wm9090_set_bias_level(struct snd_soc_codec *codec,
return 0;
}
-static int wm9090_probe(struct platform_device *pdev)
+static int wm9090_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
+ struct wm9090_priv *wm9090 = snd_soc_codec_get_drvdata(codec);
+ int ret;
- if (wm9090_codec == NULL) {
- dev_err(&pdev->dev, "Codec device not registered\n");
- return -ENODEV;
+ codec->control_data = wm9090->control_data;
+ ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C);
+ if (ret != 0) {
+ dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
+ return ret;
}
- socdev->card->codec = wm9090_codec;
- codec = wm9090_codec;
-
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
+ ret = snd_soc_read(codec, WM9090_SOFTWARE_RESET);
+ if (ret < 0)
+ return ret;
+ if (ret != wm9090_reg_defaults[WM9090_SOFTWARE_RESET]) {
+ dev_err(codec->dev, "Device is not a WM9090, ID=%x\n", ret);
+ return -EINVAL;
}
+ ret = snd_soc_write(codec, WM9090_SOFTWARE_RESET, 0);
+ if (ret < 0)
+ return ret;
+
+ /* Configure some defaults; they will be written out when we
+ * bring the bias up.
+ */
+ wm9090->reg_cache[WM9090_IN1_LINE_INPUT_A_VOLUME] |= WM9090_IN1_VU
+ | WM9090_IN1A_ZC;
+ wm9090->reg_cache[WM9090_IN1_LINE_INPUT_B_VOLUME] |= WM9090_IN1_VU
+ | WM9090_IN1B_ZC;
+ wm9090->reg_cache[WM9090_IN2_LINE_INPUT_A_VOLUME] |= WM9090_IN2_VU
+ | WM9090_IN2A_ZC;
+ wm9090->reg_cache[WM9090_IN2_LINE_INPUT_B_VOLUME] |= WM9090_IN2_VU
+ | WM9090_IN2B_ZC;
+ wm9090->reg_cache[WM9090_SPEAKER_VOLUME_LEFT] |=
+ WM9090_SPKOUT_VU | WM9090_SPKOUTL_ZC;
+ wm9090->reg_cache[WM9090_LEFT_OUTPUT_VOLUME] |=
+ WM9090_HPOUT1_VU | WM9090_HPOUT1L_ZC;
+ wm9090->reg_cache[WM9090_RIGHT_OUTPUT_VOLUME] |=
+ WM9090_HPOUT1_VU | WM9090_HPOUT1R_ZC;
+
+ wm9090->reg_cache[WM9090_CLOCKING_1] |= WM9090_TOCLK_ENA;
+
+ wm9090_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+
wm9090_add_controls(codec);
return 0;
-
-pcm_err:
- return ret;
}
#ifdef CONFIG_PM
-static int wm9090_suspend(struct platform_device *pdev, pm_message_t state)
+static int wm9090_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm9090_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm9090_resume(struct platform_device *pdev)
+static int wm9090_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm9090_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
@@ -610,29 +619,29 @@ static int wm9090_resume(struct platform_device *pdev)
#define wm9090_resume NULL
#endif
-static int wm9090_remove(struct platform_device *pdev)
+static int wm9090_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
+ wm9090_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_wm9090 = {
+static struct snd_soc_codec_driver soc_codec_dev_wm9090 = {
.probe = wm9090_probe,
.remove = wm9090_remove,
.suspend = wm9090_suspend,
.resume = wm9090_resume,
+ .set_bias_level = wm9090_set_bias_level,
+ .reg_cache_size = (WM9090_MAX_REGISTER + 1),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_default = wm9090_reg_defaults,
+ .volatile_register = wm9090_volatile,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm9090);
static int wm9090_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct wm9090_priv *wm9090;
- struct snd_soc_codec *codec;
int ret;
wm9090 = kzalloc(sizeof(*wm9090), GFP_KERNEL);
@@ -640,102 +649,28 @@ static int wm9090_i2c_probe(struct i2c_client *i2c,
dev_err(&i2c->dev, "Can not allocate memory\n");
return -ENOMEM;
}
- codec = &wm9090->codec;
if (i2c->dev.platform_data)
memcpy(&wm9090->pdata, i2c->dev.platform_data,
sizeof(wm9090->pdata));
- wm9090_codec = codec;
-
i2c_set_clientdata(i2c, wm9090);
+ wm9090->control_data = i2c;
+ mutex_init(&wm9090->mutex);
- mutex_init(&codec->mutex);
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
- codec->control_data = i2c;
- snd_soc_codec_set_drvdata(codec, wm9090);
- codec->dev = &i2c->dev;
- codec->name = "WM9090";
- codec->owner = THIS_MODULE;
- codec->bias_level = SND_SOC_BIAS_OFF;
- codec->set_bias_level = wm9090_set_bias_level,
- codec->reg_cache_size = WM9090_MAX_REGISTER + 1;
- codec->reg_cache = &wm9090->reg_cache;
- codec->volatile_register = wm9090_volatile;
-
- ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C);
- if (ret != 0) {
- dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
- goto err;
- }
-
- memcpy(&wm9090->reg_cache, wm9090_reg_defaults,
- sizeof(wm9090->reg_cache));
-
- ret = snd_soc_read(codec, WM9090_SOFTWARE_RESET);
- if (ret < 0)
- goto err;
- if (ret != wm9090_reg_defaults[WM9090_SOFTWARE_RESET]) {
- dev_err(&i2c->dev, "Device is not a WM9090, ID=%x\n", ret);
- ret = -EINVAL;
- goto err;
- }
-
- ret = snd_soc_write(codec, WM9090_SOFTWARE_RESET, 0);
+ ret = snd_soc_register_codec(&i2c->dev,
+ &soc_codec_dev_wm9090, NULL, 0);
if (ret < 0)
- goto err;
-
- /* Configure some defaults; they will be written out when we
- * bring the bias up.
- */
- wm9090->reg_cache[WM9090_IN1_LINE_INPUT_A_VOLUME] |= WM9090_IN1_VU
- | WM9090_IN1A_ZC;
- wm9090->reg_cache[WM9090_IN1_LINE_INPUT_B_VOLUME] |= WM9090_IN1_VU
- | WM9090_IN1B_ZC;
- wm9090->reg_cache[WM9090_IN2_LINE_INPUT_A_VOLUME] |= WM9090_IN2_VU
- | WM9090_IN2A_ZC;
- wm9090->reg_cache[WM9090_IN2_LINE_INPUT_B_VOLUME] |= WM9090_IN2_VU
- | WM9090_IN2B_ZC;
- wm9090->reg_cache[WM9090_SPEAKER_VOLUME_LEFT] |=
- WM9090_SPKOUT_VU | WM9090_SPKOUTL_ZC;
- wm9090->reg_cache[WM9090_LEFT_OUTPUT_VOLUME] |=
- WM9090_HPOUT1_VU | WM9090_HPOUT1L_ZC;
- wm9090->reg_cache[WM9090_RIGHT_OUTPUT_VOLUME] |=
- WM9090_HPOUT1_VU | WM9090_HPOUT1R_ZC;
-
- wm9090->reg_cache[WM9090_CLOCKING_1] |= WM9090_TOCLK_ENA;
-
- wm9090_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
- ret = snd_soc_register_codec(codec);
- if (ret != 0) {
- dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret);
- goto err_bias;
- }
-
- return 0;
-
-err_bias:
- wm9090_set_bias_level(codec, SND_SOC_BIAS_OFF);
-err:
- kfree(wm9090);
- i2c_set_clientdata(i2c, NULL);
- wm9090_codec = NULL;
-
+ kfree(wm9090);
return ret;
}
static int wm9090_i2c_remove(struct i2c_client *i2c)
{
struct wm9090_priv *wm9090 = i2c_get_clientdata(i2c);
- struct snd_soc_codec *codec = &wm9090->codec;
- snd_soc_unregister_codec(codec);
- wm9090_set_bias_level(codec, SND_SOC_BIAS_OFF);
+ snd_soc_unregister_codec(&i2c->dev);
kfree(wm9090);
- wm9090_codec = NULL;
return 0;
}
@@ -748,7 +683,7 @@ MODULE_DEVICE_TABLE(i2c, wm9090_id);
static struct i2c_driver wm9090_i2c_driver = {
.driver = {
- .name = "wm9090",
+ .name = "wm9090-codec",
.owner = THIS_MODULE,
},
.probe = wm9090_i2c_probe,
diff --git a/sound/soc/codecs/wm9090.h b/sound/soc/codecs/wm9090.h
index b08eab932a5b..29b9d9fc70b4 100644
--- a/sound/soc/codecs/wm9090.h
+++ b/sound/soc/codecs/wm9090.h
@@ -23,8 +23,6 @@
#ifndef __WM9090_H
#define __WM9090_H
-extern struct snd_soc_codec_device soc_codec_dev_wm9090;
-
/*
* Register values.
*/
diff --git a/sound/soc/codecs/wm9705.c b/sound/soc/codecs/wm9705.c
index 8793341849d1..e4d8f5339c51 100644
--- a/sound/soc/codecs/wm9705.c
+++ b/sound/soc/codecs/wm9705.c
@@ -248,8 +248,7 @@ static int ac97_prepare(struct snd_pcm_substream *substream,
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
int reg;
u16 vra;
@@ -273,9 +272,9 @@ static struct snd_soc_dai_ops wm9705_dai_ops = {
.prepare = ac97_prepare,
};
-struct snd_soc_dai wm9705_dai[] = {
+static struct snd_soc_dai_driver wm9705_dai[] = {
{
- .name = "AC97 HiFi",
+ .name = "wm9705-hifi",
.ac97_control = 1,
.playback = {
.stream_name = "HiFi Playback",
@@ -294,7 +293,7 @@ struct snd_soc_dai wm9705_dai[] = {
.ops = &wm9705_dai_ops,
},
{
- .name = "AC97 Aux",
+ .name = "wm9705-aux",
.playback = {
.stream_name = "Aux Playback",
.channels_min = 1,
@@ -304,7 +303,6 @@ struct snd_soc_dai wm9705_dai[] = {
},
}
};
-EXPORT_SYMBOL_GPL(wm9705_dai);
static int wm9705_reset(struct snd_soc_codec *codec)
{
@@ -318,20 +316,15 @@ static int wm9705_reset(struct snd_soc_codec *codec)
}
#ifdef CONFIG_PM
-static int wm9705_soc_suspend(struct platform_device *pdev, pm_message_t msg)
+static int wm9705_soc_suspend(struct snd_soc_codec *codec, pm_message_t msg)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
soc_ac97_ops.write(codec->ac97, AC97_POWERDOWN, 0xffff);
return 0;
}
-static int wm9705_soc_resume(struct platform_device *pdev)
+static int wm9705_soc_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i, ret;
u16 *cache = codec->reg_cache;
@@ -352,49 +345,18 @@ static int wm9705_soc_resume(struct platform_device *pdev)
#define wm9705_soc_resume NULL
#endif
-static int wm9705_soc_probe(struct platform_device *pdev)
+static int wm9705_soc_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
int ret = 0;
printk(KERN_INFO "WM9705 SoC Audio Codec\n");
- socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec),
- GFP_KERNEL);
- if (socdev->card->codec == NULL)
- return -ENOMEM;
- codec = socdev->card->codec;
- mutex_init(&codec->mutex);
-
- codec->reg_cache = kmemdup(wm9705_reg, sizeof(wm9705_reg), GFP_KERNEL);
- if (codec->reg_cache == NULL) {
- ret = -ENOMEM;
- goto cache_err;
- }
- codec->reg_cache_size = sizeof(wm9705_reg);
- codec->reg_cache_step = 2;
-
- codec->name = "WM9705";
- codec->owner = THIS_MODULE;
- codec->dai = wm9705_dai;
- codec->num_dai = ARRAY_SIZE(wm9705_dai);
- codec->write = ac97_write;
- codec->read = ac97_read;
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
if (ret < 0) {
printk(KERN_ERR "wm9705: failed to register AC97 codec\n");
- goto codec_err;
+ return ret;
}
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0)
- goto pcm_err;
-
ret = wm9705_reset(codec);
if (ret)
goto reset_err;
@@ -406,40 +368,62 @@ static int wm9705_soc_probe(struct platform_device *pdev)
return 0;
reset_err:
- snd_soc_free_pcms(socdev);
-pcm_err:
snd_soc_free_ac97_codec(codec);
-codec_err:
- kfree(codec->reg_cache);
-cache_err:
- kfree(socdev->card->codec);
- socdev->card->codec = NULL;
return ret;
}
-static int wm9705_soc_remove(struct platform_device *pdev)
+static int wm9705_soc_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec == NULL)
- return 0;
-
- snd_soc_dapm_free(socdev);
- snd_soc_free_pcms(socdev);
snd_soc_free_ac97_codec(codec);
- kfree(codec->reg_cache);
- kfree(codec);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_wm9705 = {
+static struct snd_soc_codec_driver soc_codec_dev_wm9705 = {
.probe = wm9705_soc_probe,
.remove = wm9705_soc_remove,
.suspend = wm9705_soc_suspend,
.resume = wm9705_soc_resume,
+ .read = ac97_read,
+ .write = ac97_write,
+ .reg_cache_size = sizeof(wm9705_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_step = 2,
+ .reg_cache_default = wm9705_reg,
+};
+
+static __devinit int wm9705_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_wm9705, wm9705_dai, ARRAY_SIZE(wm9705_dai));
+}
+
+static int __devexit wm9705_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_codec(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver wm9705_codec_driver = {
+ .driver = {
+ .name = "wm9705-codec",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = wm9705_probe,
+ .remove = __devexit_p(wm9705_remove),
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm9705);
+
+static int __init wm9705_init(void)
+{
+ return platform_driver_register(&wm9705_codec_driver);
+}
+module_init(wm9705_init);
+
+static void __exit wm9705_exit(void)
+{
+ platform_driver_unregister(&wm9705_codec_driver);
+}
+module_exit(wm9705_exit);
MODULE_DESCRIPTION("ASoC WM9705 driver");
MODULE_AUTHOR("Ian Molton");
diff --git a/sound/soc/codecs/wm9705.h b/sound/soc/codecs/wm9705.h
index d380f110f9e2..23ea9ce47359 100644
--- a/sound/soc/codecs/wm9705.h
+++ b/sound/soc/codecs/wm9705.h
@@ -8,7 +8,4 @@
#define WM9705_DAI_AC97_HIFI 0
#define WM9705_DAI_AC97_AUX 1
-extern struct snd_soc_dai wm9705_dai[2];
-extern struct snd_soc_codec_device soc_codec_dev_wm9705;
-
#endif
diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c
index 28790a2ffe8d..f8f37ae30910 100644
--- a/sound/soc/codecs/wm9712.c
+++ b/sound/soc/codecs/wm9712.c
@@ -478,8 +478,7 @@ static int ac97_prepare(struct snd_pcm_substream *substream,
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec =rtd->codec;
int reg;
u16 vra;
@@ -499,8 +498,7 @@ static int ac97_aux_prepare(struct snd_pcm_substream *substream,
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
u16 vra, xsle;
vra = ac97_read(codec, AC97_EXTENDED_STATUS);
@@ -526,9 +524,9 @@ static struct snd_soc_dai_ops wm9712_dai_ops_aux = {
.prepare = ac97_aux_prepare,
};
-struct snd_soc_dai wm9712_dai[] = {
+struct snd_soc_dai_driver wm9712_dai[] = {
{
- .name = "AC97 HiFi",
+ .name = "wm9712-hifi",
.ac97_control = 1,
.playback = {
.stream_name = "HiFi Playback",
@@ -545,7 +543,7 @@ struct snd_soc_dai wm9712_dai[] = {
.ops = &wm9712_dai_ops_hifi,
},
{
- .name = "AC97 Aux",
+ .name = "wm9712-aux",
.playback = {
.stream_name = "Aux Playback",
.channels_min = 1,
@@ -555,7 +553,6 @@ struct snd_soc_dai wm9712_dai[] = {
.ops = &wm9712_dai_ops_aux,
}
};
-EXPORT_SYMBOL_GPL(wm9712_dai);
static int wm9712_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level)
@@ -597,20 +594,15 @@ err:
return -EIO;
}
-static int wm9712_soc_suspend(struct platform_device *pdev,
+static int wm9712_soc_suspend(struct snd_soc_codec *codec,
pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
wm9712_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-static int wm9712_soc_resume(struct platform_device *pdev)
+static int wm9712_soc_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
int i, ret;
u16 *cache = codec->reg_cache;
@@ -635,51 +627,18 @@ static int wm9712_soc_resume(struct platform_device *pdev)
return ret;
}
-static int wm9712_soc_probe(struct platform_device *pdev)
+static int wm9712_soc_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
int ret = 0;
printk(KERN_INFO "WM9711/WM9712 SoC Audio Codec %s\n", WM9712_VERSION);
- socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec),
- GFP_KERNEL);
- if (socdev->card->codec == NULL)
- return -ENOMEM;
- codec = socdev->card->codec;
- mutex_init(&codec->mutex);
-
- codec->reg_cache = kmemdup(wm9712_reg, sizeof(wm9712_reg), GFP_KERNEL);
-
- if (codec->reg_cache == NULL) {
- ret = -ENOMEM;
- goto cache_err;
- }
- codec->reg_cache_size = sizeof(wm9712_reg);
- codec->reg_cache_step = 2;
-
- codec->name = "WM9712";
- codec->owner = THIS_MODULE;
- codec->dai = wm9712_dai;
- codec->num_dai = ARRAY_SIZE(wm9712_dai);
- codec->write = ac97_write;
- codec->read = ac97_read;
- codec->set_bias_level = wm9712_set_bias_level;
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
-
ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
if (ret < 0) {
printk(KERN_ERR "wm9712: failed to register AC97 codec\n");
- goto codec_err;
+ return ret;
}
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0)
- goto pcm_err;
-
ret = wm9712_reset(codec, 0);
if (ret < 0) {
printk(KERN_ERR "Failed to reset WM9712: AC97 link error\n");
@@ -697,42 +656,63 @@ static int wm9712_soc_probe(struct platform_device *pdev)
return 0;
reset_err:
- snd_soc_free_pcms(socdev);
-pcm_err:
snd_soc_free_ac97_codec(codec);
-
-codec_err:
- kfree(codec->reg_cache);
-
-cache_err:
- kfree(socdev->card->codec);
- socdev->card->codec = NULL;
return ret;
}
-static int wm9712_soc_remove(struct platform_device *pdev)
+static int wm9712_soc_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec == NULL)
- return 0;
-
- snd_soc_dapm_free(socdev);
- snd_soc_free_pcms(socdev);
snd_soc_free_ac97_codec(codec);
- kfree(codec->reg_cache);
- kfree(codec);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_wm9712 = {
+static struct snd_soc_codec_driver soc_codec_dev_wm9712 = {
.probe = wm9712_soc_probe,
.remove = wm9712_soc_remove,
.suspend = wm9712_soc_suspend,
.resume = wm9712_soc_resume,
+ .read = ac97_read,
+ .write = ac97_write,
+ .set_bias_level = wm9712_set_bias_level,
+ .reg_cache_size = sizeof(wm9712_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_step = 2,
+ .reg_cache_default = wm9712_reg,
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm9712);
+
+static __devinit int wm9712_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_wm9712, wm9712_dai, ARRAY_SIZE(wm9712_dai));
+}
+
+static int __devexit wm9712_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_codec(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver wm9712_codec_driver = {
+ .driver = {
+ .name = "wm9712-codec",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = wm9712_probe,
+ .remove = __devexit_p(wm9712_remove),
+};
+
+static int __init wm9712_init(void)
+{
+ return platform_driver_register(&wm9712_codec_driver);
+}
+module_init(wm9712_init);
+
+static void __exit wm9712_exit(void)
+{
+ platform_driver_unregister(&wm9712_codec_driver);
+}
+module_exit(wm9712_exit);
MODULE_DESCRIPTION("ASoC WM9711/WM9712 driver");
MODULE_AUTHOR("Liam Girdwood");
diff --git a/sound/soc/codecs/wm9712.h b/sound/soc/codecs/wm9712.h
index d29e8a18ca6d..fb69c3aa4ed0 100644
--- a/sound/soc/codecs/wm9712.h
+++ b/sound/soc/codecs/wm9712.h
@@ -8,7 +8,4 @@
#define WM9712_DAI_AC97_HIFI 0
#define WM9712_DAI_AC97_AUX 1
-extern struct snd_soc_dai wm9712_dai[2];
-extern struct snd_soc_codec_device soc_codec_dev_wm9712;
-
#endif
diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c
index 34e0c91092fa..463917e762b5 100644
--- a/sound/soc/codecs/wm9713.c
+++ b/sound/soc/codecs/wm9713.c
@@ -1057,9 +1057,9 @@ static struct snd_soc_dai_ops wm9713_dai_ops_voice = {
.set_tristate = wm9713_set_dai_tristate,
};
-struct snd_soc_dai wm9713_dai[] = {
+static struct snd_soc_dai_driver wm9713_dai[] = {
{
- .name = "AC97 HiFi",
+ .name = "wm9713-hifi",
.ac97_control = 1,
.playback = {
.stream_name = "HiFi Playback",
@@ -1076,7 +1076,7 @@ struct snd_soc_dai wm9713_dai[] = {
.ops = &wm9713_dai_ops_hifi,
},
{
- .name = "AC97 Aux",
+ .name = "wm9713-aux",
.playback = {
.stream_name = "Aux Playback",
.channels_min = 1,
@@ -1086,7 +1086,7 @@ struct snd_soc_dai wm9713_dai[] = {
.ops = &wm9713_dai_ops_aux,
},
{
- .name = "WM9713 Voice",
+ .name = "wm9713-voice",
.playback = {
.stream_name = "Voice Playback",
.channels_min = 1,
@@ -1103,7 +1103,6 @@ struct snd_soc_dai wm9713_dai[] = {
.symmetric_rates = 1,
},
};
-EXPORT_SYMBOL_GPL(wm9713_dai);
int wm9713_reset(struct snd_soc_codec *codec, int try_warm)
{
@@ -1152,11 +1151,9 @@ static int wm9713_set_bias_level(struct snd_soc_codec *codec,
return 0;
}
-static int wm9713_soc_suspend(struct platform_device *pdev,
+static int wm9713_soc_suspend(struct snd_soc_codec *codec,
pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
u16 reg;
/* Disable everything except touchpanel - that will be handled
@@ -1171,10 +1168,8 @@ static int wm9713_soc_suspend(struct platform_device *pdev,
return 0;
}
-static int wm9713_soc_resume(struct platform_device *pdev)
+static int wm9713_soc_resume(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);
int i, ret;
u16 *cache = codec->reg_cache;
@@ -1204,53 +1199,20 @@ static int wm9713_soc_resume(struct platform_device *pdev)
return ret;
}
-static int wm9713_soc_probe(struct platform_device *pdev)
+static int wm9713_soc_probe(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
+ struct wm9713_priv *wm9713;
int ret = 0, reg;
- socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec),
- GFP_KERNEL);
- if (socdev->card->codec == NULL)
+ wm9713 = kzalloc(sizeof(struct wm9713_priv), GFP_KERNEL);
+ if (wm9713 == NULL)
return -ENOMEM;
- codec = socdev->card->codec;
- mutex_init(&codec->mutex);
-
- codec->reg_cache = kmemdup(wm9713_reg, sizeof(wm9713_reg), GFP_KERNEL);
- if (codec->reg_cache == NULL) {
- ret = -ENOMEM;
- goto cache_err;
- }
- codec->reg_cache_size = sizeof(wm9713_reg);
- codec->reg_cache_step = 2;
-
- snd_soc_codec_set_drvdata(codec, kzalloc(sizeof(struct wm9713_priv),
- GFP_KERNEL));
- if (snd_soc_codec_get_drvdata(codec) == NULL) {
- ret = -ENOMEM;
- goto priv_err;
- }
-
- codec->name = "WM9713";
- codec->owner = THIS_MODULE;
- codec->dai = wm9713_dai;
- codec->num_dai = ARRAY_SIZE(wm9713_dai);
- codec->write = ac97_write;
- codec->read = ac97_read;
- codec->set_bias_level = wm9713_set_bias_level;
- INIT_LIST_HEAD(&codec->dapm_widgets);
- INIT_LIST_HEAD(&codec->dapm_paths);
+ snd_soc_codec_set_drvdata(codec, wm9713);
ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
if (ret < 0)
goto codec_err;
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0)
- goto pcm_err;
-
/* do a cold reset for the controller and then try
* a warm reset followed by an optional cold reset for codec */
wm9713_reset(codec, 0);
@@ -1273,46 +1235,67 @@ static int wm9713_soc_probe(struct platform_device *pdev)
return 0;
reset_err:
- snd_soc_free_pcms(socdev);
-pcm_err:
snd_soc_free_ac97_codec(codec);
-
codec_err:
- kfree(snd_soc_codec_get_drvdata(codec));
-
-priv_err:
- kfree(codec->reg_cache);
-
-cache_err:
- kfree(socdev->card->codec);
- socdev->card->codec = NULL;
+ kfree(wm9713);
return ret;
}
-static int wm9713_soc_remove(struct platform_device *pdev)
+static int wm9713_soc_remove(struct snd_soc_codec *codec)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-
- if (codec == NULL)
- return 0;
-
- snd_soc_dapm_free(socdev);
- snd_soc_free_pcms(socdev);
+ struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);
snd_soc_free_ac97_codec(codec);
- kfree(snd_soc_codec_get_drvdata(codec));
- kfree(codec->reg_cache);
- kfree(codec);
+ kfree(wm9713);
return 0;
}
-struct snd_soc_codec_device soc_codec_dev_wm9713 = {
+static struct snd_soc_codec_driver soc_codec_dev_wm9713 = {
.probe = wm9713_soc_probe,
.remove = wm9713_soc_remove,
.suspend = wm9713_soc_suspend,
.resume = wm9713_soc_resume,
+ .read = ac97_read,
+ .write = ac97_write,
+ .set_bias_level = wm9713_set_bias_level,
+ .reg_cache_size = sizeof(wm9713_reg),
+ .reg_word_size = sizeof(u16),
+ .reg_cache_step = 2,
+ .reg_cache_default = wm9713_reg,
+};
+
+static __devinit int wm9713_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_codec(&pdev->dev,
+ &soc_codec_dev_wm9713, wm9713_dai, ARRAY_SIZE(wm9713_dai));
+}
+
+static int __devexit wm9713_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_codec(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver wm9713_codec_driver = {
+ .driver = {
+ .name = "wm9713-codec",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = wm9713_probe,
+ .remove = __devexit_p(wm9713_remove),
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_wm9713);
+
+static int __init wm9713_init(void)
+{
+ return platform_driver_register(&wm9713_codec_driver);
+}
+module_init(wm9713_init);
+
+static void __exit wm9713_exit(void)
+{
+ platform_driver_unregister(&wm9713_codec_driver);
+}
+module_exit(wm9713_exit);
MODULE_DESCRIPTION("ASoC WM9713/WM9714 driver");
MODULE_AUTHOR("Liam Girdwood");
diff --git a/sound/soc/codecs/wm9713.h b/sound/soc/codecs/wm9713.h
index 63b8d81756e3..793da863a03d 100644
--- a/sound/soc/codecs/wm9713.h
+++ b/sound/soc/codecs/wm9713.h
@@ -45,9 +45,6 @@
#define WM9713_DAI_AC97_AUX 1
#define WM9713_DAI_PCM_VOICE 2
-extern struct snd_soc_codec_device soc_codec_dev_wm9713;
-extern struct snd_soc_dai wm9713_dai[3];
-
int wm9713_reset(struct snd_soc_codec *codec, int try_warm);
#endif
diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c
index 97f74d6a33e6..2b07b17a6b2d 100644
--- a/sound/soc/davinci/davinci-evm.c
+++ b/sound/soc/davinci/davinci-evm.c
@@ -28,12 +28,9 @@
#include <mach/mux.h>
#include "../codecs/tlv320aic3x.h"
-#include "../codecs/cq93vc.h"
-#include "../codecs/spdif_transciever.h"
#include "davinci-pcm.h"
#include "davinci-i2s.h"
#include "davinci-mcasp.h"
-#include "davinci-vcif.h"
#define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \
SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF)
@@ -41,8 +38,8 @@ static int evm_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret = 0;
unsigned sysclk;
@@ -87,7 +84,7 @@ static int evm_spdif_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
/* set cpu DAI configuration */
return snd_soc_dai_set_fmt(cpu_dai, AUDIO_FORMAT);
@@ -132,8 +129,10 @@ static const struct snd_soc_dapm_route audio_map[] = {
};
/* Logic for a aic3x as connected on a davinci-evm */
-static int evm_aic3x_init(struct snd_soc_codec *codec)
+static int evm_aic3x_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
/* Add davinci-evm specific widgets */
snd_soc_dapm_new_controls(codec, aic3x_dapm_widgets,
ARRAY_SIZE(aic3x_dapm_widgets));
@@ -161,8 +160,10 @@ static int evm_aic3x_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link evm_dai = {
.name = "TLV320AIC3X",
.stream_name = "AIC3X",
- .cpu_dai = &davinci_i2s_dai,
- .codec_dai = &aic3x_dai,
+ .cpu_dai_name = "davinci-mcasp.0",
+ .codec_dai_name = "tlv320aic3x-hifi",
+ .codec_name = "tlv320aic3x-codec.0-001a",
+ .platform_name = "davinci-pcm-audio",
.init = evm_aic3x_init,
.ops = &evm_ops,
};
@@ -171,40 +172,49 @@ static struct snd_soc_dai_link dm365_evm_dai = {
#ifdef CONFIG_SND_DM365_AIC3X_CODEC
.name = "TLV320AIC3X",
.stream_name = "AIC3X",
- .cpu_dai = &davinci_i2s_dai,
- .codec_dai = &aic3x_dai,
+ .cpu_dai_name = "davinci-i2s",
+ .codec_dai_name = "tlv320aic3x-hifi",
.init = evm_aic3x_init,
+ .codec_name = "tlv320aic3x-codec.0-001a",
.ops = &evm_ops,
#elif defined(CONFIG_SND_DM365_VOICE_CODEC)
.name = "Voice Codec - CQ93VC",
.stream_name = "CQ93",
- .cpu_dai = &davinci_vcif_dai,
- .codec_dai = &cq93vc_dai,
+ .cpu_dai_name = "davinci-vcif",
+ .codec_dai_name = "cq93vc-hifi",
+ .codec_name = "cq93vc-codec",
#endif
+ .platform_name = "davinci-pcm-audio",
};
static struct snd_soc_dai_link dm6467_evm_dai[] = {
{
.name = "TLV320AIC3X",
.stream_name = "AIC3X",
- .cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_I2S_DAI],
- .codec_dai = &aic3x_dai,
+ .cpu_dai_name= "davinci-mcasp.0",
+ .codec_dai_name = "tlv320aic3x-hifi",
+ .platform_name ="davinci-pcm-audio",
+ .codec_name = "tlv320aic3x-codec.0-001a",
.init = evm_aic3x_init,
.ops = &evm_ops,
},
{
.name = "McASP",
.stream_name = "spdif",
- .cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_DIT_DAI],
- .codec_dai = &dit_stub_dai,
+ .cpu_dai_name= "davinci-mcasp.1",
+ .codec_dai_name = "dit-hifi",
+ .codec_name = "spdif_dit",
+ .platform_name = "davinci-pcm-audio",
.ops = &evm_spdif_ops,
},
};
static struct snd_soc_dai_link da8xx_evm_dai = {
.name = "TLV320AIC3X",
.stream_name = "AIC3X",
- .cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_I2S_DAI],
- .codec_dai = &aic3x_dai,
+ .cpu_dai_name= "davinci-mcasp.0",
+ .codec_dai_name = "tlv320aic3x-hifi",
+ .codec_name = "tlv320aic3x-codec.0-001a",
+ .platform_name = "davinci-pcm-audio",
.init = evm_aic3x_init,
.ops = &evm_ops,
};
@@ -212,7 +222,6 @@ static struct snd_soc_dai_link da8xx_evm_dai = {
/* davinci dm6446, dm355 evm audio machine driver */
static struct snd_soc_card snd_soc_card_evm = {
.name = "DaVinci EVM",
- .platform = &davinci_soc_platform,
.dai_link = &evm_dai,
.num_links = 1,
};
@@ -220,16 +229,13 @@ static struct snd_soc_card snd_soc_card_evm = {
/* davinci dm365 evm audio machine driver */
static struct snd_soc_card dm365_snd_soc_card_evm = {
.name = "DaVinci DM365 EVM",
- .platform = &davinci_soc_platform,
.dai_link = &dm365_evm_dai,
.num_links = 1,
};
-
/* davinci dm6467 evm audio machine driver */
static struct snd_soc_card dm6467_snd_soc_card_evm = {
.name = "DaVinci DM6467 EVM",
- .platform = &davinci_soc_platform,
.dai_link = dm6467_evm_dai,
.num_links = ARRAY_SIZE(dm6467_evm_dai),
};
@@ -237,82 +243,40 @@ static struct snd_soc_card dm6467_snd_soc_card_evm = {
static struct snd_soc_card da830_snd_soc_card = {
.name = "DA830/OMAP-L137 EVM",
.dai_link = &da8xx_evm_dai,
- .platform = &davinci_soc_platform,
.num_links = 1,
};
static struct snd_soc_card da850_snd_soc_card = {
.name = "DA850/OMAP-L138 EVM",
.dai_link = &da8xx_evm_dai,
- .platform = &davinci_soc_platform,
.num_links = 1,
};
-static struct aic3x_setup_data aic3x_setup;
-
-/* evm audio subsystem */
-static struct snd_soc_device evm_snd_devdata = {
- .card = &snd_soc_card_evm,
- .codec_dev = &soc_codec_dev_aic3x,
- .codec_data = &aic3x_setup,
-};
-
-/* evm audio subsystem */
-static struct snd_soc_device dm365_evm_snd_devdata = {
- .card = &dm365_snd_soc_card_evm,
-#ifdef CONFIG_SND_DM365_AIC3X_CODEC
- .codec_dev = &soc_codec_dev_aic3x,
- .codec_data = &aic3x_setup,
-#elif defined(CONFIG_SND_DM365_VOICE_CODEC)
- .codec_dev = &soc_codec_dev_cq93vc,
-#endif
-};
-
-/* evm audio subsystem */
-static struct snd_soc_device dm6467_evm_snd_devdata = {
- .card = &dm6467_snd_soc_card_evm,
- .codec_dev = &soc_codec_dev_aic3x,
- .codec_data = &aic3x_setup,
-};
-
-/* evm audio subsystem */
-static struct snd_soc_device da830_evm_snd_devdata = {
- .card = &da830_snd_soc_card,
- .codec_dev = &soc_codec_dev_aic3x,
- .codec_data = &aic3x_setup,
-};
-
-static struct snd_soc_device da850_evm_snd_devdata = {
- .card = &da850_snd_soc_card,
- .codec_dev = &soc_codec_dev_aic3x,
- .codec_data = &aic3x_setup,
-};
-
static struct platform_device *evm_snd_device;
static int __init evm_init(void)
{
- struct snd_soc_device *evm_snd_dev_data;
+ struct snd_soc_card *evm_snd_dev_data;
int index;
int ret;
if (machine_is_davinci_evm()) {
- evm_snd_dev_data = &evm_snd_devdata;
+ evm_snd_dev_data = &snd_soc_card_evm;
index = 0;
} else if (machine_is_davinci_dm355_evm()) {
- evm_snd_dev_data = &evm_snd_devdata;
+ evm_snd_dev_data = &snd_soc_card_evm;
index = 1;
} else if (machine_is_davinci_dm365_evm()) {
- evm_snd_dev_data = &dm365_evm_snd_devdata;
+ evm_snd_dev_data = &dm365_snd_soc_card_evm;
index = 0;
} else if (machine_is_davinci_dm6467_evm()) {
- evm_snd_dev_data = &dm6467_evm_snd_devdata;
+ evm_snd_dev_data = &dm6467_snd_soc_card_evm;
index = 0;
} else if (machine_is_davinci_da830_evm()) {
- evm_snd_dev_data = &da830_evm_snd_devdata;
+ evm_snd_dev_data = &da830_snd_soc_card;
index = 1;
} else if (machine_is_davinci_da850_evm()) {
- evm_snd_dev_data = &da850_evm_snd_devdata;
+ evm_snd_dev_data = &da850_snd_soc_card;
index = 0;
} else
return -EINVAL;
@@ -322,7 +286,6 @@ static int __init evm_init(void)
return -ENOMEM;
platform_set_drvdata(evm_snd_device, evm_snd_dev_data);
- evm_snd_dev_data->dev = &evm_snd_device->dev;
ret = platform_device_add(evm_snd_device);
if (ret)
platform_device_put(evm_snd_device);
diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c
index 9e8932abf158..9f8b6c556866 100644
--- a/sound/soc/davinci/davinci-i2s.c
+++ b/sound/soc/davinci/davinci-i2s.c
@@ -183,8 +183,7 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev,
struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_platform *platform = socdev->card->platform;
+ struct snd_soc_platform *platform = rtd->platform;
int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
u32 spcr;
u32 mask = playback ? DAVINCI_MCBSP_SPCR_XRST : DAVINCI_MCBSP_SPCR_RRST;
@@ -205,8 +204,8 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev,
if (playback) {
/* Stop the DMA to avoid data loss */
/* while the transmitter is out of reset to handle XSYNCERR */
- if (platform->pcm_ops->trigger) {
- int ret = platform->pcm_ops->trigger(substream,
+ if (platform->driver->ops->trigger) {
+ int ret = platform->driver->ops->trigger(substream,
SNDRV_PCM_TRIGGER_STOP);
if (ret < 0)
printk(KERN_DEBUG "Playback DMA stop failed\n");
@@ -227,8 +226,8 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev,
toggle_clock(dev, playback);
/* Restart the DMA */
- if (platform->pcm_ops->trigger) {
- int ret = platform->pcm_ops->trigger(substream,
+ if (platform->driver->ops->trigger) {
+ int ret = platform->driver->ops->trigger(substream,
SNDRV_PCM_TRIGGER_START);
if (ret < 0)
printk(KERN_DEBUG "Playback DMA start failed\n");
@@ -263,7 +262,7 @@ static void davinci_mcbsp_stop(struct davinci_mcbsp_dev *dev, int playback)
static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai,
unsigned int fmt)
{
- struct davinci_mcbsp_dev *dev = cpu_dai->private_data;
+ struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
unsigned int pcr;
unsigned int srgr;
/* Attention srgr is updated by hw_params! */
@@ -404,7 +403,7 @@ static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai,
static int davinci_i2s_dai_set_clkdiv(struct snd_soc_dai *cpu_dai,
int div_id, int div)
{
- struct davinci_mcbsp_dev *dev = cpu_dai->private_data;
+ struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
if (div_id != DAVINCI_MCBSP_CLKGDV)
return -ENODEV;
@@ -417,7 +416,7 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
- struct davinci_mcbsp_dev *dev = dai->private_data;
+ struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai);
struct davinci_pcm_dma_params *dma_params =
&dev->dma_params[substream->stream];
struct snd_interval *i = NULL;
@@ -427,6 +426,9 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream,
snd_pcm_format_t fmt;
unsigned element_cnt = 1;
+ dai->capture_dma_data = dev->dma_params;
+ dai->playback_dma_data = dev->dma_params;
+
/* general line settings */
spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG);
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
@@ -569,7 +571,7 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream,
static int davinci_i2s_prepare(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct davinci_mcbsp_dev *dev = dai->private_data;
+ struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai);
int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
davinci_mcbsp_stop(dev, playback);
if ((dev->pcr & DAVINCI_MCBSP_PCR_FSXM) == 0) {
@@ -582,7 +584,7 @@ static int davinci_i2s_prepare(struct snd_pcm_substream *substream,
static int davinci_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
- struct davinci_mcbsp_dev *dev = dai->private_data;
+ struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai);
int ret = 0;
int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
if ((dev->pcr & DAVINCI_MCBSP_PCR_FSXM) == 0)
@@ -608,7 +610,7 @@ static int davinci_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
static void davinci_i2s_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct davinci_mcbsp_dev *dev = dai->private_data;
+ struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai);
int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
davinci_mcbsp_stop(dev, playback);
}
@@ -625,9 +627,7 @@ static struct snd_soc_dai_ops davinci_i2s_dai_ops = {
};
-struct snd_soc_dai davinci_i2s_dai = {
- .name = "davinci-i2s",
- .id = 0,
+static struct snd_soc_dai_driver davinci_i2s_dai = {
.playback = {
.channels_min = 2,
.channels_max = 2,
@@ -641,7 +641,6 @@ struct snd_soc_dai davinci_i2s_dai = {
.ops = &davinci_i2s_dai_ops,
};
-EXPORT_SYMBOL_GPL(davinci_i2s_dai);
static int davinci_i2s_probe(struct platform_device *pdev)
{
@@ -720,10 +719,9 @@ static int davinci_i2s_probe(struct platform_device *pdev)
dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start;
dev->dev = &pdev->dev;
- davinci_i2s_dai.private_data = dev;
- davinci_i2s_dai.capture.dma_data = dev->dma_params;
- davinci_i2s_dai.playback.dma_data = dev->dma_params;
- ret = snd_soc_register_dai(&davinci_i2s_dai);
+ dev_set_drvdata(&pdev->dev, dev);
+
+ ret = snd_soc_register_dai(&pdev->dev, &davinci_i2s_dai);
if (ret != 0)
goto err_free_mem;
@@ -739,10 +737,10 @@ err_release_region:
static int davinci_i2s_remove(struct platform_device *pdev)
{
- struct davinci_mcbsp_dev *dev = davinci_i2s_dai.private_data;
+ struct davinci_mcbsp_dev *dev = dev_get_drvdata(&pdev->dev);
struct resource *mem;
- snd_soc_unregister_dai(&davinci_i2s_dai);
+ snd_soc_unregister_dai(&pdev->dev);
clk_disable(dev->clk);
clk_put(dev->clk);
dev->clk = NULL;
@@ -757,7 +755,7 @@ static struct platform_driver davinci_mcbsp_driver = {
.probe = davinci_i2s_probe,
.remove = davinci_i2s_remove,
.driver = {
- .name = "davinci-asp",
+ .name = "davinci-i2s",
.owner = THIS_MODULE,
},
};
diff --git a/sound/soc/davinci/davinci-i2s.h b/sound/soc/davinci/davinci-i2s.h
index 0b1e77b8c279..48dac3e2521a 100644
--- a/sound/soc/davinci/davinci-i2s.h
+++ b/sound/soc/davinci/davinci-i2s.h
@@ -17,6 +17,4 @@ enum davinci_mcbsp_div {
DAVINCI_MCBSP_CLKGDV, /* Sample rate generator divider */
};
-extern struct snd_soc_dai davinci_i2s_dai;
-
#endif
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
index b24720894af6..c8e97dcbfff4 100644
--- a/sound/soc/davinci/davinci-mcasp.c
+++ b/sound/soc/davinci/davinci-mcasp.c
@@ -422,7 +422,7 @@ static void davinci_mcasp_stop(struct davinci_audio_dev *dev, int stream)
static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
unsigned int fmt)
{
- struct davinci_audio_dev *dev = cpu_dai->private_data;
+ struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
void __iomem *base = dev->base;
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
@@ -709,12 +709,15 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *cpu_dai)
{
- struct davinci_audio_dev *dev = cpu_dai->private_data;
+ struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
struct davinci_pcm_dma_params *dma_params =
&dev->dma_params[substream->stream];
int word_length;
u8 fifo_level;
+ cpu_dai->capture_dma_data = dev->dma_params;
+ cpu_dai->playback_dma_data = dev->dma_params;
+
davinci_hw_common_param(dev, substream->stream);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
fifo_level = dev->txnumevt;
@@ -761,8 +764,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
int cmd, struct snd_soc_dai *cpu_dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct davinci_audio_dev *dev = rtd->dai->cpu_dai->private_data;
+ struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
int ret = 0;
switch (cmd) {
@@ -804,10 +806,9 @@ static struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
};
-struct snd_soc_dai davinci_mcasp_dai[] = {
+static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
{
- .name = "davinci-i2s",
- .id = 0,
+ .name = "davinci-mcasp.0",
.playback = {
.channels_min = 2,
.channels_max = 2,
@@ -828,8 +829,7 @@ struct snd_soc_dai davinci_mcasp_dai[] = {
},
{
- .name = "davinci-dit",
- .id = 1,
+ "davinci-mcasp.1",
.playback = {
.channels_min = 1,
.channels_max = 384,
@@ -840,7 +840,6 @@ struct snd_soc_dai davinci_mcasp_dai[] = {
},
};
-EXPORT_SYMBOL_GPL(davinci_mcasp_dai);
static int davinci_mcasp_probe(struct platform_device *pdev)
{
@@ -917,11 +916,8 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
}
dma_data->channel = res->start;
- davinci_mcasp_dai[pdata->op_mode].private_data = dev;
- davinci_mcasp_dai[pdata->op_mode].capture.dma_data = dev->dma_params;
- davinci_mcasp_dai[pdata->op_mode].playback.dma_data = dev->dma_params;
- davinci_mcasp_dai[pdata->op_mode].dev = &pdev->dev;
- ret = snd_soc_register_dai(&davinci_mcasp_dai[pdata->op_mode]);
+ dev_set_drvdata(&pdev->dev, dev);
+ ret = snd_soc_register_dai(&pdev->dev, &davinci_mcasp_dai[pdata->op_mode]);
if (ret != 0)
goto err_release_region;
@@ -937,12 +933,10 @@ err_release_data:
static int davinci_mcasp_remove(struct platform_device *pdev)
{
- struct snd_platform_data *pdata = pdev->dev.platform_data;
- struct davinci_audio_dev *dev;
+ struct davinci_audio_dev *dev = dev_get_drvdata(&pdev->dev);
struct resource *mem;
- snd_soc_unregister_dai(&davinci_mcasp_dai[pdata->op_mode]);
- dev = davinci_mcasp_dai[pdata->op_mode].private_data;
+ snd_soc_unregister_dai(&pdev->dev);
clk_disable(dev->clk);
clk_put(dev->clk);
dev->clk = NULL;
diff --git a/sound/soc/davinci/davinci-mcasp.h b/sound/soc/davinci/davinci-mcasp.h
index e755b5121ec7..4681acc63606 100644
--- a/sound/soc/davinci/davinci-mcasp.h
+++ b/sound/soc/davinci/davinci-mcasp.h
@@ -22,8 +22,6 @@
#include <mach/asp.h>
#include "davinci-pcm.h"
-extern struct snd_soc_dai davinci_mcasp_dai[];
-
#define DAVINCI_MCASP_RATES SNDRV_PCM_RATE_8000_96000
#define DAVINCI_MCASP_I2S_DAI 0
#define DAVINCI_MCASP_DIT_DAI 1
diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c
index a7124116d2e0..9d35b8c1a624 100644
--- a/sound/soc/davinci/davinci-pcm.c
+++ b/sound/soc/davinci/davinci-pcm.c
@@ -653,7 +653,7 @@ static int davinci_pcm_open(struct snd_pcm_substream *substream)
struct davinci_pcm_dma_params *pa;
struct davinci_pcm_dma_params *params;
- pa = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ pa = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
if (!pa)
return -ENODEV;
params = &pa[substream->stream];
@@ -821,7 +821,7 @@ static int davinci_pcm_new(struct snd_card *card,
if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = 0xffffffff;
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
ret = davinci_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK,
pcm_hardware_playback.buffer_bytes_max);
@@ -829,7 +829,7 @@ static int davinci_pcm_new(struct snd_card *card,
return ret;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
ret = davinci_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE,
pcm_hardware_capture.buffer_bytes_max);
@@ -840,25 +840,44 @@ static int davinci_pcm_new(struct snd_card *card,
return 0;
}
-struct snd_soc_platform davinci_soc_platform = {
- .name = "davinci-audio",
- .pcm_ops = &davinci_pcm_ops,
+static struct snd_soc_platform_driver davinci_soc_platform = {
+ .ops = &davinci_pcm_ops,
.pcm_new = davinci_pcm_new,
.pcm_free = davinci_pcm_free,
};
-EXPORT_SYMBOL_GPL(davinci_soc_platform);
-static int __init davinci_soc_platform_init(void)
+static int __devinit davinci_soc_platform_probe(struct platform_device *pdev)
{
- return snd_soc_register_platform(&davinci_soc_platform);
+ return snd_soc_register_platform(&pdev->dev, &davinci_soc_platform);
}
-module_init(davinci_soc_platform_init);
-static void __exit davinci_soc_platform_exit(void)
+static int __devexit davinci_soc_platform_remove(struct platform_device *pdev)
{
- snd_soc_unregister_platform(&davinci_soc_platform);
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver davinci_pcm_driver = {
+ .driver = {
+ .name = "davinci-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = davinci_soc_platform_probe,
+ .remove = __devexit_p(davinci_soc_platform_remove),
+};
+
+static int __init snd_davinci_pcm_init(void)
+{
+ return platform_driver_register(&davinci_pcm_driver);
+}
+module_init(snd_davinci_pcm_init);
+
+static void __exit snd_davinci_pcm_exit(void)
+{
+ platform_driver_unregister(&davinci_pcm_driver);
}
-module_exit(davinci_soc_platform_exit);
+module_exit(snd_davinci_pcm_exit);
MODULE_AUTHOR("Vladimir Barinov");
MODULE_DESCRIPTION("TI DAVINCI PCM DMA module");
diff --git a/sound/soc/davinci/davinci-pcm.h b/sound/soc/davinci/davinci-pcm.h
index b799a02333d8..c0d6c9be4b4d 100644
--- a/sound/soc/davinci/davinci-pcm.h
+++ b/sound/soc/davinci/davinci-pcm.h
@@ -28,7 +28,4 @@ struct davinci_pcm_dma_params {
unsigned int fifo_level;
};
-
-extern struct snd_soc_platform davinci_soc_platform;
-
#endif
diff --git a/sound/soc/davinci/davinci-sffsdr.c b/sound/soc/davinci/davinci-sffsdr.c
index 40eccfe9e358..997c54f3693c 100644
--- a/sound/soc/davinci/davinci-sffsdr.c
+++ b/sound/soc/davinci/davinci-sffsdr.c
@@ -29,7 +29,6 @@
#include <asm/plat-sffsdr/sffsdr-fpga.h>
#endif
-#include <mach/mcbsp.h>
#include <mach/edma.h>
#include "../codecs/pcm3008.h"
@@ -48,7 +47,7 @@ static int sffsdr_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int fs;
int ret = 0;
@@ -85,15 +84,16 @@ static struct snd_soc_ops sffsdr_ops = {
static struct snd_soc_dai_link sffsdr_dai = {
.name = "PCM3008", /* Codec name */
.stream_name = "PCM3008 HiFi",
- .cpu_dai = &davinci_i2s_dai,
- .codec_dai = &pcm3008_dai,
+ .cpu_dai_name = "davinci-asp.0",
+ .codec_dai_name = "pcm3008-hifi",
+ .codec_name = "pcm3008-codec",
+ .platform_name = "davinci-pcm-audio",
.ops = &sffsdr_ops,
};
/* davinci-sffsdr audio machine driver */
static struct snd_soc_card snd_soc_sffsdr = {
.name = "DaVinci SFFSDR",
- .platform = &davinci_soc_platform,
.dai_link = &sffsdr_dai,
.num_links = 1,
};
@@ -106,11 +106,12 @@ static struct pcm3008_setup_data sffsdr_pcm3008_setup = {
.pdda_pin = GPIO(38),
};
-/* sffsdr audio subsystem */
-static struct snd_soc_device sffsdr_snd_devdata = {
- .card = &snd_soc_sffsdr,
- .codec_dev = &soc_codec_dev_pcm3008,
- .codec_data = &sffsdr_pcm3008_setup,
+struct platform_device pcm3008_codec = {
+ .name = "pcm3008-codec",
+ .id = 0,
+ .dev = {
+ .platform_data = &sffsdr_pcm3008_setup,
+ },
};
static struct resource sffsdr_snd_resources[] = {
@@ -135,14 +136,15 @@ static int __init sffsdr_init(void)
if (!machine_is_sffsdr())
return -EINVAL;
+ platform_device_register(&pcm3008_codec);
+
sffsdr_snd_device = platform_device_alloc("soc-audio", 0);
if (!sffsdr_snd_device) {
printk(KERN_ERR "platform device allocation failed\n");
return -ENOMEM;
}
- platform_set_drvdata(sffsdr_snd_device, &sffsdr_snd_devdata);
- sffsdr_snd_devdata.dev = &sffsdr_snd_device->dev;
+ platform_set_drvdata(sffsdr_snd_device, &snd_soc_sffsdr);
platform_device_add_data(sffsdr_snd_device, &sffsdr_snd_data,
sizeof(sffsdr_snd_data));
@@ -168,6 +170,7 @@ error:
static void __exit sffsdr_exit(void)
{
platform_device_unregister(sffsdr_snd_device);
+ platform_device_unregister(&pcm3008_codec);
}
module_init(sffsdr_init);
diff --git a/sound/soc/davinci/davinci-vcif.c b/sound/soc/davinci/davinci-vcif.c
index 48678533da7a..ea232f6a2c21 100644
--- a/sound/soc/davinci/davinci-vcif.c
+++ b/sound/soc/davinci/davinci-vcif.c
@@ -36,7 +36,6 @@
#include "davinci-pcm.h"
#include "davinci-i2s.h"
-#include "davinci-vcif.h"
#define MOD_REG_BIT(val, mask, set) do { \
if (set) { \
@@ -55,7 +54,7 @@ static void davinci_vcif_start(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct davinci_vcif_dev *davinci_vcif_dev =
- rtd->dai->cpu_dai->private_data;
+ snd_soc_dai_get_drvdata(rtd->cpu_dai);
struct davinci_vc *davinci_vc = davinci_vcif_dev->davinci_vc;
u32 w;
@@ -74,7 +73,7 @@ static void davinci_vcif_stop(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct davinci_vcif_dev *davinci_vcif_dev =
- rtd->dai->cpu_dai->private_data;
+ snd_soc_dai_get_drvdata(rtd->cpu_dai);
struct davinci_vc *davinci_vc = davinci_vcif_dev->davinci_vc;
u32 w;
@@ -92,12 +91,15 @@ static int davinci_vcif_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
- struct davinci_vcif_dev *davinci_vcif_dev = dai->private_data;
+ struct davinci_vcif_dev *davinci_vcif_dev = snd_soc_dai_get_drvdata(dai);
struct davinci_vc *davinci_vc = davinci_vcif_dev->davinci_vc;
struct davinci_pcm_dma_params *dma_params =
&davinci_vcif_dev->dma_params[substream->stream];
u32 w;
+ dai->capture_dma_data = davinci_vcif_dev->dma_params;
+ dai->playback_dma_data = davinci_vcif_dev->dma_params;
+
/* Restart the codec before setup */
davinci_vcif_stop(substream);
davinci_vcif_start(substream);
@@ -179,8 +181,7 @@ static struct snd_soc_dai_ops davinci_vcif_dai_ops = {
.hw_params = davinci_vcif_hw_params,
};
-struct snd_soc_dai davinci_vcif_dai = {
- .name = "davinci-vcif",
+static struct snd_soc_dai_driver davinci_vcif_dai = {
.playback = {
.channels_min = 1,
.channels_max = 2,
@@ -194,7 +195,6 @@ struct snd_soc_dai davinci_vcif_dai = {
.ops = &davinci_vcif_dai_ops,
};
-EXPORT_SYMBOL_GPL(davinci_vcif_dai);
static int davinci_vcif_probe(struct platform_device *pdev)
{
@@ -222,12 +222,9 @@ static int davinci_vcif_probe(struct platform_device *pdev)
davinci_vcif_dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].dma_addr =
davinci_vc->davinci_vcif.dma_rx_addr;
- davinci_vcif_dai.dev = &pdev->dev;
- davinci_vcif_dai.capture.dma_data = davinci_vcif_dev->dma_params;
- davinci_vcif_dai.playback.dma_data = davinci_vcif_dev->dma_params;
- davinci_vcif_dai.private_data = davinci_vcif_dev;
+ dev_set_drvdata(&pdev->dev, davinci_vcif_dev);
- ret = snd_soc_register_dai(&davinci_vcif_dai);
+ ret = snd_soc_register_dai(&pdev->dev, &davinci_vcif_dai);
if (ret != 0) {
dev_err(&pdev->dev, "could not register dai\n");
goto fail;
@@ -243,7 +240,7 @@ fail:
static int davinci_vcif_remove(struct platform_device *pdev)
{
- snd_soc_unregister_dai(&davinci_vcif_dai);
+ snd_soc_unregister_dai(&pdev->dev);
return 0;
}
@@ -252,7 +249,7 @@ static struct platform_driver davinci_vcif_driver = {
.probe = davinci_vcif_probe,
.remove = davinci_vcif_remove,
.driver = {
- .name = "davinci_vcif",
+ .name = "davinci-vcif",
.owner = THIS_MODULE,
},
};
diff --git a/sound/soc/davinci/davinci-vcif.h b/sound/soc/davinci/davinci-vcif.h
deleted file mode 100644
index 571c9948724f..000000000000
--- a/sound/soc/davinci/davinci-vcif.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * ALSA SoC Voice Codec Interface for TI DAVINCI processor
- *
- * Copyright (C) 2010 Texas Instruments.
- *
- * Author: Miguel Aguilar <miguel.aguilar@ridgerun.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef _DAVINCI_VCIF_H
-#define _DAVINCI_VCIF_H
-
-extern struct snd_soc_dai davinci_vcif_dai;
-
-#endif
diff --git a/sound/soc/ep93xx/ep93xx-i2s.c b/sound/soc/ep93xx/ep93xx-i2s.c
index 00b946632184..4f4873359613 100644
--- a/sound/soc/ep93xx/ep93xx-i2s.c
+++ b/sound/soc/ep93xx/ep93xx-i2s.c
@@ -31,7 +31,6 @@
#include <mach/dma.h>
#include "ep93xx-pcm.h"
-#include "ep93xx-i2s.h"
#define EP93XX_I2S_TXCLKCFG 0x00
#define EP93XX_I2S_RXCLKCFG 0x04
@@ -145,8 +144,8 @@ static int ep93xx_i2s_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct ep93xx_i2s_info *info = rtd->dai->cpu_dai->private_data;
+ struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(dai);
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
snd_soc_dai_set_dma_data(cpu_dai, substream,
&info->dma_params[substream->stream]);
@@ -156,8 +155,7 @@ static int ep93xx_i2s_startup(struct snd_pcm_substream *substream,
static void ep93xx_i2s_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct ep93xx_i2s_info *info = rtd->dai->cpu_dai->private_data;
+ struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(dai);
ep93xx_i2s_disable(info, substream->stream);
}
@@ -165,7 +163,7 @@ static void ep93xx_i2s_shutdown(struct snd_pcm_substream *substream,
static int ep93xx_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai,
unsigned int fmt)
{
- struct ep93xx_i2s_info *info = cpu_dai->private_data;
+ struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(cpu_dai);
unsigned int clk_cfg, lin_ctrl;
clk_cfg = ep93xx_i2s_read_reg(info, EP93XX_I2S_RXCLKCFG);
@@ -242,9 +240,7 @@ static int ep93xx_i2s_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct ep93xx_i2s_info *info = cpu_dai->private_data;
+ struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(dai);
unsigned word_len, div, sdiv, lrdiv;
int found = 0, err;
@@ -302,7 +298,7 @@ out:
static int ep93xx_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id,
unsigned int freq, int dir)
{
- struct ep93xx_i2s_info *info = cpu_dai->private_data;
+ struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(cpu_dai);
if (dir == SND_SOC_CLOCK_IN || clk_id != 0)
return -EINVAL;
@@ -313,7 +309,7 @@ static int ep93xx_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id,
#ifdef CONFIG_PM
static int ep93xx_i2s_suspend(struct snd_soc_dai *dai)
{
- struct ep93xx_i2s_info *info = dai->private_data;
+ struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(dai);
if (!dai->active)
return;
@@ -324,7 +320,7 @@ static int ep93xx_i2s_suspend(struct snd_soc_dai *dai)
static int ep93xx_i2s_resume(struct snd_soc_dai *dai)
{
- struct ep93xx_i2s_info *info = dai->private_data;
+ struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(dai);
if (!dai->active)
return;
@@ -349,9 +345,7 @@ static struct snd_soc_dai_ops ep93xx_i2s_dai_ops = {
SNDRV_PCM_FMTBIT_S24_LE | \
SNDRV_PCM_FMTBIT_S32_LE)
-struct snd_soc_dai ep93xx_i2s_dai = {
- .name = "ep93xx-i2s",
- .id = 0,
+static struct snd_soc_dai_driver ep93xx_i2s_dai = {
.symmetric_rates= 1,
.suspend = ep93xx_i2s_suspend,
.resume = ep93xx_i2s_resume,
@@ -369,7 +363,6 @@ struct snd_soc_dai ep93xx_i2s_dai = {
},
.ops = &ep93xx_i2s_dai_ops,
};
-EXPORT_SYMBOL_GPL(ep93xx_i2s_dai);
static int ep93xx_i2s_probe(struct platform_device *pdev)
{
@@ -383,8 +376,7 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
goto fail;
}
- ep93xx_i2s_dai.dev = &pdev->dev;
- ep93xx_i2s_dai.private_data = info;
+ dev_set_drvdata(&pdev->dev, info);
info->dma_params = ep93xx_i2s_dma_params;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -424,7 +416,7 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
goto fail_put_sclk;
}
- err = snd_soc_register_dai(&ep93xx_i2s_dai);
+ err = snd_soc_register_dai(&pdev->dev, &ep93xx_i2s_dai);
if (err)
goto fail_put_lrclk;
@@ -447,9 +439,9 @@ fail:
static int __devexit ep93xx_i2s_remove(struct platform_device *pdev)
{
- struct ep93xx_i2s_info *info = ep93xx_i2s_dai.private_data;
+ struct ep93xx_i2s_info *info = dev_get_drvdata(&pdev->dev);
- snd_soc_unregister_dai(&ep93xx_i2s_dai);
+ snd_soc_unregister_dai(&pdev->dev);
clk_put(info->lrclk);
clk_put(info->sclk);
clk_put(info->mclk);
diff --git a/sound/soc/ep93xx/ep93xx-i2s.h b/sound/soc/ep93xx/ep93xx-i2s.h
deleted file mode 100644
index 3bd4ebfaa1de..000000000000
--- a/sound/soc/ep93xx/ep93xx-i2s.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * linux/sound/soc/ep93xx-i2s.h
- * EP93xx I2S driver
- *
- * Copyright (C) 2010 Ryan Mallon <ryan@bluewatersys.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- */
-
-#ifndef _EP93XX_SND_SOC_I2S_H
-#define _EP93XX_SND_SOC_I2S_H
-
-extern struct snd_soc_dai ep93xx_i2s_dai;
-
-#endif /* _EP93XX_SND_SOC_I2S_H */
diff --git a/sound/soc/ep93xx/ep93xx-pcm.c b/sound/soc/ep93xx/ep93xx-pcm.c
index 4ba938400791..2f121ddbe4bb 100644
--- a/sound/soc/ep93xx/ep93xx-pcm.c
+++ b/sound/soc/ep93xx/ep93xx-pcm.c
@@ -95,7 +95,7 @@ static void ep93xx_pcm_buffer_finished(void *cookie,
static int ep93xx_pcm_open(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *soc_rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = soc_rtd->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = soc_rtd->cpu_dai;
struct ep93xx_pcm_dma_params *dma_params;
struct ep93xx_runtime_data *rtd;
int ret;
@@ -276,14 +276,14 @@ static int ep93xx_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = 0xffffffff;
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
ret = ep93xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK);
if (ret)
return ret;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
ret = ep93xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE);
if (ret)
@@ -293,22 +293,41 @@ static int ep93xx_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
return 0;
}
-struct snd_soc_platform ep93xx_soc_platform = {
- .name = "ep93xx-audio",
- .pcm_ops = &ep93xx_pcm_ops,
+static struct snd_soc_platform_driver ep93xx_soc_platform = {
+ .ops = &ep93xx_pcm_ops,
.pcm_new = &ep93xx_pcm_new,
.pcm_free = &ep93xx_pcm_free_dma_buffers,
};
-EXPORT_SYMBOL_GPL(ep93xx_soc_platform);
+
+static int __devinit ep93xx_soc_platform_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_platform(&pdev->dev, &ep93xx_soc_platform);
+}
+
+static int __devexit ep93xx_soc_platform_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver ep93xx_pcm_driver = {
+ .driver = {
+ .name = "ep93xx-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = ep93xx_soc_platform_probe,
+ .remove = __devexit_p(ep93xx_soc_platform_remove),
+};
static int __init ep93xx_soc_platform_init(void)
{
- return snd_soc_register_platform(&ep93xx_soc_platform);
+ return platform_driver_register(&ep93xx_pcm_driver);
}
static void __exit ep93xx_soc_platform_exit(void)
{
- snd_soc_unregister_platform(&ep93xx_soc_platform);
+ platform_driver_unregister(&ep93xx_pcm_driver);
}
module_init(ep93xx_soc_platform_init);
diff --git a/sound/soc/ep93xx/ep93xx-pcm.h b/sound/soc/ep93xx/ep93xx-pcm.h
index 4ffdd3f62fe9..111e1121ecb8 100644
--- a/sound/soc/ep93xx/ep93xx-pcm.h
+++ b/sound/soc/ep93xx/ep93xx-pcm.h
@@ -17,6 +17,4 @@ struct ep93xx_pcm_dma_params {
int dma_port;
};
-extern struct snd_soc_platform ep93xx_soc_platform;
-
#endif /* _EP93XX_SND_SOC_PCM_H */
diff --git a/sound/soc/ep93xx/snappercl15.c b/sound/soc/ep93xx/snappercl15.c
index 64955340ff75..28ab5ff772ac 100644
--- a/sound/soc/ep93xx/snappercl15.c
+++ b/sound/soc/ep93xx/snappercl15.c
@@ -22,7 +22,6 @@
#include "../codecs/tlv320aic23.h"
#include "ep93xx-pcm.h"
-#include "ep93xx-i2s.h"
#define CODEC_CLOCK 5644800
@@ -30,8 +29,8 @@ static int snappercl15_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int err;
err = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
@@ -77,8 +76,10 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"MICIN", NULL, "Mic Jack"},
};
-static int snappercl15_tlv320aic23_init(struct snd_soc_codec *codec)
+static int snappercl15_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
snd_soc_dapm_new_controls(codec, tlv320aic23_dapm_widgets,
ARRAY_SIZE(tlv320aic23_dapm_widgets));
@@ -89,24 +90,20 @@ static int snappercl15_tlv320aic23_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link snappercl15_dai = {
.name = "tlv320aic23",
.stream_name = "AIC23",
- .cpu_dai = &ep93xx_i2s_dai,
- .codec_dai = &tlv320aic23_dai,
+ .cpu_dai_name = "ep93xx-i2s",
+ .codec_dai_name = "tlv320aic23-hifi",
+ .codec_name = "tlv320aic23-codec.0-001a",
+ .platform_name = "ep93xx-pcm-audio",
.init = snappercl15_tlv320aic23_init,
.ops = &snappercl15_ops,
};
static struct snd_soc_card snd_soc_snappercl15 = {
.name = "Snapper CL15",
- .platform = &ep93xx_soc_platform,
.dai_link = &snappercl15_dai,
.num_links = 1,
};
-static struct snd_soc_device snappercl15_snd_devdata = {
- .card = &snd_soc_snappercl15,
- .codec_dev = &soc_codec_dev_tlv320aic23,
-};
-
static struct platform_device *snappercl15_snd_device;
static int __init snappercl15_init(void)
@@ -126,8 +123,7 @@ static int __init snappercl15_init(void)
if (!snappercl15_snd_device)
return -ENOMEM;
- platform_set_drvdata(snappercl15_snd_device, &snappercl15_snd_devdata);
- snappercl15_snd_devdata.dev = &snappercl15_snd_device->dev;
+ platform_set_drvdata(snappercl15_snd_device, &snd_soc_snappercl15);
ret = platform_device_add(snappercl15_snd_device);
if (ret)
platform_device_put(snappercl15_snd_device);
diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig
index 8cb65ccad35f..981868700388 100644
--- a/sound/soc/fsl/Kconfig
+++ b/sound/soc/fsl/Kconfig
@@ -1,6 +1,3 @@
-config SND_SOC_OF_SIMPLE
- tristate
-
config SND_MPC52xx_DMA
tristate
diff --git a/sound/soc/fsl/Makefile b/sound/soc/fsl/Makefile
index a83a73967ec6..7e472a53fcd3 100644
--- a/sound/soc/fsl/Makefile
+++ b/sound/soc/fsl/Makefile
@@ -1,6 +1,3 @@
-# Simple machine driver that extracts configuration from the OF device tree
-obj-$(CONFIG_SND_SOC_OF_SIMPLE) += soc-of-simple.o
-
# MPC8610 HPCD Machine Support
snd-soc-mpc8610-hpcd-objs := mpc8610_hpcd.o
obj-$(CONFIG_SND_SOC_MPC8610_HPCD) += snd-soc-mpc8610-hpcd.o
diff --git a/sound/soc/fsl/efika-audio-fabric.c b/sound/soc/fsl/efika-audio-fabric.c
index 1a5b8e0d6a34..53251e6b5bd5 100644
--- a/sound/soc/fsl/efika-audio-fabric.c
+++ b/sound/soc/fsl/efika-audio-fabric.c
@@ -24,7 +24,6 @@
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <sound/soc.h>
-#include <sound/soc-of-simple.h>
#include "mpc5200_dma.h"
#include "mpc5200_psc_ac97.h"
@@ -32,21 +31,24 @@
#define DRV_NAME "efika-audio-fabric"
-static struct snd_soc_device device;
static struct snd_soc_card card;
static struct snd_soc_dai_link efika_fabric_dai[] = {
{
.name = "AC97",
.stream_name = "AC97 Analog",
- .codec_dai = &stac9766_dai[STAC9766_DAI_AC97_ANALOG],
- .cpu_dai = &psc_ac97_dai[MPC5200_AC97_NORMAL],
+ .codec_dai_name = "stac9766-hifi-analog",
+ .cpu_dai_name = "mpc5200-psc-ac97.0",
+ .platform_name = "mpc5200-pcm-audio",
+ .codec_name = "stac9766-codec",
},
{
.name = "AC97",
.stream_name = "AC97 IEC958",
- .codec_dai = &stac9766_dai[STAC9766_DAI_AC97_DIGITAL],
- .cpu_dai = &psc_ac97_dai[MPC5200_AC97_SPDIF],
+ .codec_dai_name = "stac9766-hifi-IEC958",
+ .cpu_dai_name = "mpc5200-psc-ac97.1",
+ .platform_name = "mpc5200-pcm-audio",
+ .codec_name = "stac9766-codec",
},
};
@@ -58,13 +60,10 @@ static __init int efika_fabric_init(void)
if (!of_machine_is_compatible("bplan,efika"))
return -ENODEV;
- card.platform = &mpc5200_audio_dma_platform;
card.name = "Efika";
card.dai_link = efika_fabric_dai;
card.num_links = ARRAY_SIZE(efika_fabric_dai);
- device.card = &card;
- device.codec_dev = &soc_codec_dev_stac9766;
pdev = platform_device_alloc("soc-audio", 1);
if (!pdev) {
@@ -72,8 +71,7 @@ static __init int efika_fabric_init(void)
return -ENODEV;
}
- platform_set_drvdata(pdev, &device);
- device.dev = &pdev->dev;
+ platform_set_drvdata(pdev, &card);
rc = platform_device_add(pdev);
if (rc) {
diff --git a/sound/soc/fsl/fsl_dma.c b/sound/soc/fsl/fsl_dma.c
index 410c7496a18d..57774cb91ae3 100644
--- a/sound/soc/fsl/fsl_dma.c
+++ b/sound/soc/fsl/fsl_dma.c
@@ -3,10 +3,11 @@
*
* Author: Timur Tabi <timur@freescale.com>
*
- * Copyright 2007-2008 Freescale Semiconductor, Inc. This file is licensed
- * under the terms of the GNU General Public License version 2. This
- * program is licensed "as is" without any warranty of any kind, whether
- * express or implied.
+ * Copyright 2007-2010 Freescale Semiconductor, Inc.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
*
* This driver implements ASoC support for the Elo DMA controller, which is
* the DMA controller on Freescale 83xx, 85xx, and 86xx SOCs. In ALSA terms,
@@ -20,6 +21,8 @@
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/gfp.h>
+#include <linux/of_platform.h>
+#include <linux/list.h>
#include <sound/core.h>
#include <sound/pcm.h>
@@ -29,6 +32,7 @@
#include <asm/io.h>
#include "fsl_dma.h"
+#include "fsl_ssi.h" /* For the offset of stx0 and srx0 */
/*
* The formats that the DMA controller supports, which is anything
@@ -52,26 +56,15 @@
#define FSLDMA_PCM_RATES (SNDRV_PCM_RATE_5512 | SNDRV_PCM_RATE_8000_192000 | \
SNDRV_PCM_RATE_CONTINUOUS)
-/* DMA global data. This structure is used by fsl_dma_open() to determine
- * which DMA channels to assign to a substream. Unfortunately, ASoC V1 does
- * not allow the machine driver to provide this information to the PCM
- * driver in advance, and there's no way to differentiate between the two
- * DMA controllers. So for now, this driver only supports one SSI device
- * using two DMA channels. We cannot support multiple DMA devices.
- *
- * ssi_stx_phys: bus address of SSI STX register
- * ssi_srx_phys: bus address of SSI SRX register
- * dma_channel: pointer to the DMA channel's registers
- * irq: IRQ for this DMA channel
- * assigned: set to 1 if that DMA channel is assigned to a substream
- */
-static struct {
+struct dma_object {
+ struct snd_soc_platform_driver dai;
dma_addr_t ssi_stx_phys;
dma_addr_t ssi_srx_phys;
- struct ccsr_dma_channel __iomem *dma_channel[2];
- unsigned int irq[2];
- unsigned int assigned[2];
-} dma_global_data;
+ struct ccsr_dma_channel __iomem *channel;
+ unsigned int irq;
+ bool assigned;
+ char path[1];
+};
/*
* The number of DMA links to use. Two is the bare minimum, but if you
@@ -88,8 +81,6 @@ static struct {
* structure.
*
* @link[]: array of link descriptors
- * @controller_id: which DMA controller (0, 1, ...)
- * @channel_id: which DMA channel on the controller (0, 1, 2, ...)
* @dma_channel: pointer to the DMA channel's registers
* @irq: IRQ for this DMA channel
* @substream: pointer to the substream object, needed by the ISR
@@ -104,8 +95,6 @@ static struct {
*/
struct fsl_dma_private {
struct fsl_dma_link_descriptor link[NUM_DMA_LINKS];
- unsigned int controller_id;
- unsigned int channel_id;
struct ccsr_dma_channel __iomem *dma_channel;
unsigned int irq;
struct snd_pcm_substream *substream;
@@ -185,13 +174,23 @@ static void fsl_dma_update_pointers(struct fsl_dma_private *dma_private)
struct fsl_dma_link_descriptor *link =
&dma_private->link[dma_private->current_link];
- /* Update our link descriptors to point to the next period */
- if (dma_private->substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
- link->source_addr =
- cpu_to_be32(dma_private->dma_buf_next);
- else
- link->dest_addr =
- cpu_to_be32(dma_private->dma_buf_next);
+ /* Update our link descriptors to point to the next period. On a 36-bit
+ * system, we also need to update the ESAD bits. We also set (keep) the
+ * snoop bits. See the comments in fsl_dma_hw_params() about snooping.
+ */
+ if (dma_private->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+ link->source_addr = cpu_to_be32(dma_private->dma_buf_next);
+#ifdef CONFIG_PHYS_64BIT
+ link->source_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP |
+ upper_32_bits(dma_private->dma_buf_next));
+#endif
+ } else {
+ link->dest_addr = cpu_to_be32(dma_private->dma_buf_next);
+#ifdef CONFIG_PHYS_64BIT
+ link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP |
+ upper_32_bits(dma_private->dma_buf_next));
+#endif
+ }
/* Update our variables for next time */
dma_private->dma_buf_next += dma_private->period_size;
@@ -212,6 +211,9 @@ static void fsl_dma_update_pointers(struct fsl_dma_private *dma_private)
static irqreturn_t fsl_dma_isr(int irq, void *dev_id)
{
struct fsl_dma_private *dma_private = dev_id;
+ struct snd_pcm_substream *substream = dma_private->substream;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct device *dev = rtd->platform->dev;
struct ccsr_dma_channel __iomem *dma_channel = dma_private->dma_channel;
irqreturn_t ret = IRQ_NONE;
u32 sr, sr2 = 0;
@@ -222,11 +224,8 @@ static irqreturn_t fsl_dma_isr(int irq, void *dev_id)
sr = in_be32(&dma_channel->sr);
if (sr & CCSR_DMA_SR_TE) {
- dev_err(dma_private->substream->pcm->card->dev,
- "DMA transmit error (controller=%u channel=%u irq=%u\n",
- dma_private->controller_id,
- dma_private->channel_id, irq);
- fsl_dma_abort_stream(dma_private->substream);
+ dev_err(dev, "dma transmit error\n");
+ fsl_dma_abort_stream(substream);
sr2 |= CCSR_DMA_SR_TE;
ret = IRQ_HANDLED;
}
@@ -235,11 +234,8 @@ static irqreturn_t fsl_dma_isr(int irq, void *dev_id)
ret = IRQ_HANDLED;
if (sr & CCSR_DMA_SR_PE) {
- dev_err(dma_private->substream->pcm->card->dev,
- "DMA%u programming error (channel=%u irq=%u)\n",
- dma_private->controller_id,
- dma_private->channel_id, irq);
- fsl_dma_abort_stream(dma_private->substream);
+ dev_err(dev, "dma programming error\n");
+ fsl_dma_abort_stream(substream);
sr2 |= CCSR_DMA_SR_PE;
ret = IRQ_HANDLED;
}
@@ -253,8 +249,6 @@ static irqreturn_t fsl_dma_isr(int irq, void *dev_id)
ret = IRQ_HANDLED;
if (sr & CCSR_DMA_SR_EOSI) {
- struct snd_pcm_substream *substream = dma_private->substream;
-
/* Tell ALSA we completed a period. */
snd_pcm_period_elapsed(substream);
@@ -288,11 +282,19 @@ static irqreturn_t fsl_dma_isr(int irq, void *dev_id)
* This function is called when the codec driver calls snd_soc_new_pcms(),
* once for each .dai_link in the machine driver's snd_soc_card
* structure.
+ *
+ * snd_dma_alloc_pages() is just a front-end to dma_alloc_coherent(), which
+ * (currently) always allocates the DMA buffer in lowmem, even if GFP_HIGHMEM
+ * is specified. Therefore, any DMA buffers we allocate will always be in low
+ * memory, but we support for 36-bit physical addresses anyway.
+ *
+ * Regardless of where the memory is actually allocated, since the device can
+ * technically DMA to any 36-bit address, we do need to set the DMA mask to 36.
*/
static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
struct snd_pcm *pcm)
{
- static u64 fsl_dma_dmamask = DMA_BIT_MASK(32);
+ static u64 fsl_dma_dmamask = DMA_BIT_MASK(36);
int ret;
if (!card->dev->dma_mask)
@@ -305,10 +307,8 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
fsl_dma_hardware.buffer_bytes_max,
&pcm->streams[0].substream->dma_buffer);
if (ret) {
- dev_err(card->dev,
- "Can't allocate playback DMA buffer (size=%u)\n",
- fsl_dma_hardware.buffer_bytes_max);
- return -ENOMEM;
+ dev_err(card->dev, "can't allocate playback dma buffer\n");
+ return ret;
}
ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev,
@@ -316,10 +316,8 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
&pcm->streams[1].substream->dma_buffer);
if (ret) {
snd_dma_free_pages(&pcm->streams[0].substream->dma_buffer);
- dev_err(card->dev,
- "Can't allocate capture DMA buffer (size=%u)\n",
- fsl_dma_hardware.buffer_bytes_max);
- return -ENOMEM;
+ dev_err(card->dev, "can't allocate capture dma buffer\n");
+ return ret;
}
return 0;
@@ -390,6 +388,10 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
static int fsl_dma_open(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct device *dev = rtd->platform->dev;
+ struct dma_object *dma =
+ container_of(rtd->platform->driver, struct dma_object, dai);
struct fsl_dma_private *dma_private;
struct ccsr_dma_channel __iomem *dma_channel;
dma_addr_t ld_buf_phys;
@@ -407,52 +409,44 @@ static int fsl_dma_open(struct snd_pcm_substream *substream)
ret = snd_pcm_hw_constraint_integer(runtime,
SNDRV_PCM_HW_PARAM_PERIODS);
if (ret < 0) {
- dev_err(substream->pcm->card->dev, "invalid buffer size\n");
+ dev_err(dev, "invalid buffer size\n");
return ret;
}
channel = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1;
- if (dma_global_data.assigned[channel]) {
- dev_err(substream->pcm->card->dev,
- "DMA channel already assigned\n");
+ if (dma->assigned) {
+ dev_err(dev, "dma channel already assigned\n");
return -EBUSY;
}
- dma_private = dma_alloc_coherent(substream->pcm->card->dev,
- sizeof(struct fsl_dma_private), &ld_buf_phys, GFP_KERNEL);
+ dma_private = dma_alloc_coherent(dev, sizeof(struct fsl_dma_private),
+ &ld_buf_phys, GFP_KERNEL);
if (!dma_private) {
- dev_err(substream->pcm->card->dev,
- "can't allocate DMA private data\n");
+ dev_err(dev, "can't allocate dma private data\n");
return -ENOMEM;
}
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
- dma_private->ssi_sxx_phys = dma_global_data.ssi_stx_phys;
+ dma_private->ssi_sxx_phys = dma->ssi_stx_phys;
else
- dma_private->ssi_sxx_phys = dma_global_data.ssi_srx_phys;
+ dma_private->ssi_sxx_phys = dma->ssi_srx_phys;
- dma_private->dma_channel = dma_global_data.dma_channel[channel];
- dma_private->irq = dma_global_data.irq[channel];
+ dma_private->dma_channel = dma->channel;
+ dma_private->irq = dma->irq;
dma_private->substream = substream;
dma_private->ld_buf_phys = ld_buf_phys;
dma_private->dma_buf_phys = substream->dma_buffer.addr;
- /* We only support one DMA controller for now */
- dma_private->controller_id = 0;
- dma_private->channel_id = channel;
-
ret = request_irq(dma_private->irq, fsl_dma_isr, 0, "DMA", dma_private);
if (ret) {
- dev_err(substream->pcm->card->dev,
- "can't register ISR for IRQ %u (ret=%i)\n",
+ dev_err(dev, "can't register ISR for IRQ %u (ret=%i)\n",
dma_private->irq, ret);
- dma_free_coherent(substream->pcm->card->dev,
- sizeof(struct fsl_dma_private),
+ dma_free_coherent(dev, sizeof(struct fsl_dma_private),
dma_private, dma_private->ld_buf_phys);
return ret;
}
- dma_global_data.assigned[channel] = 1;
+ dma->assigned = 1;
snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer);
snd_soc_set_runtime_hwparams(substream, &fsl_dma_hardware);
@@ -546,6 +540,8 @@ static int fsl_dma_hw_params(struct snd_pcm_substream *substream,
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct fsl_dma_private *dma_private = runtime->private_data;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct device *dev = rtd->platform->dev;
/* Number of bits per sample */
unsigned int sample_size =
@@ -606,8 +602,7 @@ static int fsl_dma_hw_params(struct snd_pcm_substream *substream,
break;
default:
/* We should never get here */
- dev_err(substream->pcm->card->dev,
- "unsupported sample size %u\n", sample_size);
+ dev_err(dev, "unsupported sample size %u\n", sample_size);
return -EINVAL;
}
@@ -631,12 +626,7 @@ static int fsl_dma_hw_params(struct snd_pcm_substream *substream,
link->count = cpu_to_be32(period_size);
- /* Even though the DMA controller supports 36-bit addressing,
- * for simplicity we allow only 32-bit addresses for the audio
- * buffer itself. This was enforced in fsl_dma_new() with the
- * DMA mask.
- *
- * The snoop bit tells the DMA controller whether it should tell
+ /* The snoop bit tells the DMA controller whether it should tell
* the ECM to snoop during a read or write to an address. For
* audio, we use DMA to transfer data between memory and an I/O
* device (the SSI's STX0 or SRX0 register). Snooping is only
@@ -651,20 +641,24 @@ static int fsl_dma_hw_params(struct snd_pcm_substream *substream,
* flush out the data for the previous period. So if you
* increased period_bytes_min to a large enough size, you might
* get more performance by not snooping, and you'll still be
- * okay.
+ * okay. You'll need to update fsl_dma_update_pointers() also.
*/
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
link->source_addr = cpu_to_be32(temp_addr);
- link->source_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP);
+ link->source_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP |
+ upper_32_bits(temp_addr));
link->dest_addr = cpu_to_be32(ssi_sxx_phys);
- link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_NOSNOOP);
+ link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_NOSNOOP |
+ upper_32_bits(ssi_sxx_phys));
} else {
link->source_addr = cpu_to_be32(ssi_sxx_phys);
- link->source_attr = cpu_to_be32(CCSR_DMA_ATR_NOSNOOP);
+ link->source_attr = cpu_to_be32(CCSR_DMA_ATR_NOSNOOP |
+ upper_32_bits(ssi_sxx_phys));
link->dest_addr = cpu_to_be32(temp_addr);
- link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP);
+ link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP |
+ upper_32_bits(temp_addr));
}
temp_addr += period_size;
@@ -689,14 +683,29 @@ static snd_pcm_uframes_t fsl_dma_pointer(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct fsl_dma_private *dma_private = runtime->private_data;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct device *dev = rtd->platform->dev;
struct ccsr_dma_channel __iomem *dma_channel = dma_private->dma_channel;
dma_addr_t position;
snd_pcm_uframes_t frames;
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+ /* Obtain the current DMA pointer, but don't read the ESAD bits if we
+ * only have 32-bit DMA addresses. This function is typically called
+ * in interrupt context, so we need to optimize it.
+ */
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
position = in_be32(&dma_channel->sar);
- else
+#ifdef CONFIG_PHYS_64BIT
+ position |= (u64)(in_be32(&dma_channel->satr) &
+ CCSR_DMA_ATR_ESAD_MASK) << 32;
+#endif
+ } else {
position = in_be32(&dma_channel->dar);
+#ifdef CONFIG_PHYS_64BIT
+ position |= (u64)(in_be32(&dma_channel->datr) &
+ CCSR_DMA_ATR_ESAD_MASK) << 32;
+#endif
+ }
/*
* When capture is started, the SSI immediately starts to fill its FIFO.
@@ -710,8 +719,7 @@ static snd_pcm_uframes_t fsl_dma_pointer(struct snd_pcm_substream *substream)
if ((position < dma_private->dma_buf_phys) ||
(position > dma_private->dma_buf_end)) {
- dev_err(substream->pcm->card->dev,
- "dma pointer is out of range, halting stream\n");
+ dev_err(dev, "dma pointer is out of range, halting stream\n");
return SNDRV_PCM_POS_XRUN;
}
@@ -772,26 +780,28 @@ static int fsl_dma_close(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct fsl_dma_private *dma_private = runtime->private_data;
- int dir = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct device *dev = rtd->platform->dev;
+ struct dma_object *dma =
+ container_of(rtd->platform->driver, struct dma_object, dai);
if (dma_private) {
if (dma_private->irq)
free_irq(dma_private->irq, dma_private);
if (dma_private->ld_buf_phys) {
- dma_unmap_single(substream->pcm->card->dev,
- dma_private->ld_buf_phys,
- sizeof(dma_private->link), DMA_TO_DEVICE);
+ dma_unmap_single(dev, dma_private->ld_buf_phys,
+ sizeof(dma_private->link),
+ DMA_TO_DEVICE);
}
/* Deallocate the fsl_dma_private structure */
- dma_free_coherent(substream->pcm->card->dev,
- sizeof(struct fsl_dma_private),
- dma_private, dma_private->ld_buf_phys);
+ dma_free_coherent(dev, sizeof(struct fsl_dma_private),
+ dma_private, dma_private->ld_buf_phys);
substream->runtime->private_data = NULL;
}
- dma_global_data.assigned[dir] = 0;
+ dma->assigned = 0;
return 0;
}
@@ -814,6 +824,37 @@ static void fsl_dma_free_dma_buffers(struct snd_pcm *pcm)
}
}
+/**
+ * find_ssi_node -- returns the SSI node that points to his DMA channel node
+ *
+ * Although this DMA driver attempts to operate independently of the other
+ * devices, it still needs to determine some information about the SSI device
+ * that it's working with. Unfortunately, the device tree does not contain
+ * a pointer from the DMA channel node to the SSI node -- the pointer goes the
+ * other way. So we need to scan the device tree for SSI nodes until we find
+ * the one that points to the given DMA channel node. It's ugly, but at least
+ * it's contained in this one function.
+ */
+static struct device_node *find_ssi_node(struct device_node *dma_channel_np)
+{
+ struct device_node *ssi_np, *np;
+
+ for_each_compatible_node(ssi_np, NULL, "fsl,mpc8610-ssi") {
+ /* Check each DMA phandle to see if it points to us. We
+ * assume that device_node pointers are a valid comparison.
+ */
+ np = of_parse_phandle(ssi_np, "fsl,playback-dma", 0);
+ if (np == dma_channel_np)
+ return ssi_np;
+
+ np = of_parse_phandle(ssi_np, "fsl,capture-dma", 0);
+ if (np == dma_channel_np)
+ return ssi_np;
+ }
+
+ return NULL;
+}
+
static struct snd_pcm_ops fsl_dma_ops = {
.open = fsl_dma_open,
.close = fsl_dma_close,
@@ -823,59 +864,102 @@ static struct snd_pcm_ops fsl_dma_ops = {
.pointer = fsl_dma_pointer,
};
-struct snd_soc_platform fsl_soc_platform = {
- .name = "fsl-dma",
- .pcm_ops = &fsl_dma_ops,
- .pcm_new = fsl_dma_new,
- .pcm_free = fsl_dma_free_dma_buffers,
-};
-EXPORT_SYMBOL_GPL(fsl_soc_platform);
+static int __devinit fsl_soc_dma_probe(struct of_device *of_dev,
+ const struct of_device_id *match)
+ {
+ struct dma_object *dma;
+ struct device_node *np = of_dev->dev.of_node;
+ struct device_node *ssi_np;
+ struct resource res;
+ int ret;
-/**
- * fsl_dma_configure: store the DMA parameters from the fabric driver.
- *
- * This function is called by the ASoC fabric driver to give us the DMA and
- * SSI channel information.
- *
- * Unfortunately, ASoC V1 does make it possible to determine the DMA/SSI
- * data when a substream is created, so for now we need to store this data
- * into a global variable. This means that we can only support one DMA
- * controller, and hence only one SSI.
- */
-int fsl_dma_configure(struct fsl_dma_info *dma_info)
+ /* Find the SSI node that points to us. */
+ ssi_np = find_ssi_node(np);
+ if (!ssi_np) {
+ dev_err(&of_dev->dev, "cannot find parent SSI node\n");
+ return -ENODEV;
+ }
+
+ ret = of_address_to_resource(ssi_np, 0, &res);
+ of_node_put(ssi_np);
+ if (ret) {
+ dev_err(&of_dev->dev, "could not determine device resources\n");
+ return ret;
+ }
+
+ dma = kzalloc(sizeof(*dma) + strlen(np->full_name), GFP_KERNEL);
+ if (!dma) {
+ dev_err(&of_dev->dev, "could not allocate dma object\n");
+ return -ENOMEM;
+ }
+
+ strcpy(dma->path, np->full_name);
+ dma->dai.ops = &fsl_dma_ops;
+ dma->dai.pcm_new = fsl_dma_new;
+ dma->dai.pcm_free = fsl_dma_free_dma_buffers;
+
+ /* Store the SSI-specific information that we need */
+ dma->ssi_stx_phys = res.start + offsetof(struct ccsr_ssi, stx0);
+ dma->ssi_srx_phys = res.start + offsetof(struct ccsr_ssi, srx0);
+
+ ret = snd_soc_register_platform(&of_dev->dev, &dma->dai);
+ if (ret) {
+ dev_err(&of_dev->dev, "could not register platform\n");
+ kfree(dma);
+ return ret;
+ }
+
+ dma->channel = of_iomap(np, 0);
+ dma->irq = irq_of_parse_and_map(np, 0);
+
+ dev_set_drvdata(&of_dev->dev, dma);
+
+ return 0;
+}
+
+static int __devexit fsl_soc_dma_remove(struct of_device *of_dev)
{
- static int initialized;
+ struct dma_object *dma = dev_get_drvdata(&of_dev->dev);
- /* We only support one DMA controller for now */
- if (initialized)
- return 0;
+ snd_soc_unregister_platform(&of_dev->dev);
+ iounmap(dma->channel);
+ irq_dispose_mapping(dma->irq);
+ kfree(dma);
- dma_global_data.ssi_stx_phys = dma_info->ssi_stx_phys;
- dma_global_data.ssi_srx_phys = dma_info->ssi_srx_phys;
- dma_global_data.dma_channel[0] = dma_info->dma_channel[0];
- dma_global_data.dma_channel[1] = dma_info->dma_channel[1];
- dma_global_data.irq[0] = dma_info->dma_irq[0];
- dma_global_data.irq[1] = dma_info->dma_irq[1];
- dma_global_data.assigned[0] = 0;
- dma_global_data.assigned[1] = 0;
-
- initialized = 1;
- return 1;
+ return 0;
}
-EXPORT_SYMBOL_GPL(fsl_dma_configure);
-static int __init fsl_soc_platform_init(void)
+static const struct of_device_id fsl_soc_dma_ids[] = {
+ { .compatible = "fsl,ssi-dma-channel", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, fsl_soc_dma_ids);
+
+static struct of_platform_driver fsl_soc_dma_driver = {
+ .driver = {
+ .name = "fsl-pcm-audio",
+ .owner = THIS_MODULE,
+ .of_match_table = fsl_soc_dma_ids,
+ },
+ .probe = fsl_soc_dma_probe,
+ .remove = __devexit_p(fsl_soc_dma_remove),
+};
+
+static int __init fsl_soc_dma_init(void)
{
- return snd_soc_register_platform(&fsl_soc_platform);
+ pr_info("Freescale Elo DMA ASoC PCM Driver\n");
+
+ return of_register_platform_driver(&fsl_soc_dma_driver);
}
-module_init(fsl_soc_platform_init);
-static void __exit fsl_soc_platform_exit(void)
+static void __exit fsl_soc_dma_exit(void)
{
- snd_soc_unregister_platform(&fsl_soc_platform);
+ of_unregister_platform_driver(&fsl_soc_dma_driver);
}
-module_exit(fsl_soc_platform_exit);
+
+module_init(fsl_soc_dma_init);
+module_exit(fsl_soc_dma_exit);
MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
-MODULE_DESCRIPTION("Freescale Elo DMA ASoC PCM module");
-MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Freescale Elo DMA ASoC PCM Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/fsl/fsl_dma.h b/sound/soc/fsl/fsl_dma.h
index 385d4a42603c..78fee97e8036 100644
--- a/sound/soc/fsl/fsl_dma.h
+++ b/sound/soc/fsl/fsl_dma.h
@@ -126,24 +126,4 @@ struct fsl_dma_link_descriptor {
u8 res[4]; /* Reserved */
} __attribute__ ((aligned(32), packed));
-/* DMA information needed to create a snd_soc_dai object
- *
- * ssi_stx_phys: bus address of SSI STX register to use
- * ssi_srx_phys: bus address of SSI SRX register to use
- * dma[0]: points to the DMA channel to use for playback
- * dma[1]: points to the DMA channel to use for capture
- * dma_irq[0]: IRQ of the DMA channel to use for playback
- * dma_irq[1]: IRQ of the DMA channel to use for capture
- */
-struct fsl_dma_info {
- dma_addr_t ssi_stx_phys;
- dma_addr_t ssi_srx_phys;
- struct ccsr_dma_channel __iomem *dma_channel[2];
- unsigned int dma_irq[2];
-};
-
-extern struct snd_soc_platform fsl_soc_platform;
-
-int fsl_dma_configure(struct fsl_dma_info *dma_info);
-
#endif
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c
index 762c1b8e8e4e..7939c337ed9d 100644
--- a/sound/soc/fsl/fsl_ssi.c
+++ b/sound/soc/fsl/fsl_ssi.c
@@ -3,10 +3,11 @@
*
* Author: Timur Tabi <timur@freescale.com>
*
- * Copyright 2007-2008 Freescale Semiconductor, Inc. This file is licensed
- * under the terms of the GNU General Public License version 2. This
- * program is licensed "as is" without any warranty of any kind, whether
- * express or implied.
+ * Copyright 2007-2010 Freescale Semiconductor, Inc.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
*/
#include <linux/init.h>
@@ -15,6 +16,7 @@
#include <linux/device.h>
#include <linux/delay.h>
#include <linux/slab.h>
+#include <linux/of_platform.h>
#include <sound/core.h>
#include <sound/pcm.h>
@@ -22,8 +24,6 @@
#include <sound/initval.h>
#include <sound/soc.h>
-#include <asm/immap_86xx.h>
-
#include "fsl_ssi.h"
/**
@@ -71,33 +71,31 @@
/**
* fsl_ssi_private: per-SSI private data
*
- * @name: short name for this device ("SSI0", "SSI1", etc)
* @ssi: pointer to the SSI's registers
* @ssi_phys: physical address of the SSI registers
* @irq: IRQ of this SSI
* @first_stream: pointer to the stream that was opened first
* @second_stream: pointer to second stream
- * @dev: struct device pointer
* @playback: the number of playback streams opened
* @capture: the number of capture streams opened
* @asynchronous: 0=synchronous mode, 1=asynchronous mode
* @cpu_dai: the CPU DAI for this device
* @dev_attr: the sysfs device attribute structure
* @stats: SSI statistics
+ * @name: name for this device
*/
struct fsl_ssi_private {
- char name[8];
struct ccsr_ssi __iomem *ssi;
dma_addr_t ssi_phys;
unsigned int irq;
struct snd_pcm_substream *first_stream;
struct snd_pcm_substream *second_stream;
- struct device *dev;
unsigned int playback;
unsigned int capture;
int asynchronous;
- struct snd_soc_dai cpu_dai;
+ struct snd_soc_dai_driver cpu_dai_drv;
struct device_attribute dev_attr;
+ struct platform_device *pdev;
struct {
unsigned int rfrc;
@@ -122,6 +120,8 @@ struct fsl_ssi_private {
unsigned int tfe1;
unsigned int tfe0;
} stats;
+
+ char name[1];
};
/**
@@ -280,7 +280,7 @@ static int fsl_ssi_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct fsl_ssi_private *ssi_private = rtd->dai->cpu_dai->private_data;
+ struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(rtd->cpu_dai);
/*
* If this is the first stream opened, then request the IRQ
@@ -290,6 +290,7 @@ static int fsl_ssi_startup(struct snd_pcm_substream *substream,
struct ccsr_ssi __iomem *ssi = ssi_private->ssi;
int ret;
+ /* The 'name' should not have any slashes in it. */
ret = request_irq(ssi_private->irq, fsl_ssi_isr, 0,
ssi_private->name, ssi_private);
if (ret < 0) {
@@ -422,7 +423,7 @@ static int fsl_ssi_startup(struct snd_pcm_substream *substream,
static int fsl_ssi_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *hw_params, struct snd_soc_dai *cpu_dai)
{
- struct fsl_ssi_private *ssi_private = cpu_dai->private_data;
+ struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);
if (substream == ssi_private->first_stream) {
struct ccsr_ssi __iomem *ssi = ssi_private->ssi;
@@ -458,7 +459,7 @@ static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct fsl_ssi_private *ssi_private = rtd->dai->cpu_dai->private_data;
+ struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(rtd->cpu_dai);
struct ccsr_ssi __iomem *ssi = ssi_private->ssi;
switch (cmd) {
@@ -497,7 +498,7 @@ static void fsl_ssi_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct fsl_ssi_private *ssi_private = rtd->dai->cpu_dai->private_data;
+ struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(rtd->cpu_dai);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
ssi_private->playback--;
@@ -523,56 +524,15 @@ static void fsl_ssi_shutdown(struct snd_pcm_substream *substream,
}
}
-/**
- * fsl_ssi_set_sysclk: set the clock frequency and direction
- *
- * This function is called by the machine driver to tell us what the clock
- * frequency and direction are.
- *
- * Currently, we only support operating as a clock slave (SND_SOC_CLOCK_IN),
- * and we don't care about the frequency. Return an error if the direction
- * is not SND_SOC_CLOCK_IN.
- *
- * @clk_id: reserved, should be zero
- * @freq: the frequency of the given clock ID, currently ignored
- * @dir: SND_SOC_CLOCK_IN (clock slave) or SND_SOC_CLOCK_OUT (clock master)
- */
-static int fsl_ssi_set_sysclk(struct snd_soc_dai *cpu_dai,
- int clk_id, unsigned int freq, int dir)
-{
-
- return (dir == SND_SOC_CLOCK_IN) ? 0 : -EINVAL;
-}
-
-/**
- * fsl_ssi_set_fmt: set the serial format.
- *
- * This function is called by the machine driver to tell us what serial
- * format to use.
- *
- * Currently, we only support I2S mode. Return an error if the format is
- * not SND_SOC_DAIFMT_I2S.
- *
- * @format: one of SND_SOC_DAIFMT_xxx
- */
-static int fsl_ssi_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int format)
-{
- return (format == SND_SOC_DAIFMT_I2S) ? 0 : -EINVAL;
-}
-
-/**
- * fsl_ssi_dai_template: template CPU DAI for the SSI
- */
static struct snd_soc_dai_ops fsl_ssi_dai_ops = {
.startup = fsl_ssi_startup,
.hw_params = fsl_ssi_hw_params,
.shutdown = fsl_ssi_shutdown,
.trigger = fsl_ssi_trigger,
- .set_sysclk = fsl_ssi_set_sysclk,
- .set_fmt = fsl_ssi_set_fmt,
};
-static struct snd_soc_dai fsl_ssi_dai_template = {
+/* Template for the CPU dai driver structure */
+static struct snd_soc_dai_driver fsl_ssi_dai_template = {
.playback = {
/* The SSI does not support monaural audio. */
.channels_min = 2,
@@ -640,95 +600,186 @@ static ssize_t fsl_sysfs_ssi_show(struct device *dev,
}
/**
- * fsl_ssi_create_dai: create a snd_soc_dai structure
- *
- * This function is called by the machine driver to create a snd_soc_dai
- * structure. The function creates an ssi_private object, which contains
- * the snd_soc_dai. It also creates the sysfs statistics device.
+ * Make every character in a string lower-case
*/
-struct snd_soc_dai *fsl_ssi_create_dai(struct fsl_ssi_info *ssi_info)
+static void make_lowercase(char *s)
+{
+ char *p = s;
+ char c;
+
+ while ((c = *p)) {
+ if ((c >= 'A') && (c <= 'Z'))
+ *p = c + ('a' - 'A');
+ p++;
+ }
+}
+
+static int __devinit fsl_ssi_probe(struct of_device *of_dev,
+ const struct of_device_id *match)
{
- struct snd_soc_dai *fsl_ssi_dai;
struct fsl_ssi_private *ssi_private;
int ret = 0;
- struct device_attribute *dev_attr;
+ struct device_attribute *dev_attr = NULL;
+ struct device_node *np = of_dev->dev.of_node;
+ const char *p, *sprop;
+ struct resource res;
+ char name[64];
+
+ /* SSIs that are not connected on the board should have a
+ * status = "disabled"
+ * property in their device tree nodes.
+ */
+ if (!of_device_is_available(np))
+ return -ENODEV;
+
+ /* Check for a codec-handle property. */
+ if (!of_get_property(np, "codec-handle", NULL)) {
+ dev_err(&of_dev->dev, "missing codec-handle property\n");
+ return -ENODEV;
+ }
+
+ /* We only support the SSI in "I2S Slave" mode */
+ sprop = of_get_property(np, "fsl,mode", NULL);
+ if (!sprop || strcmp(sprop, "i2s-slave")) {
+ dev_notice(&of_dev->dev, "mode %s is unsupported\n", sprop);
+ return -ENODEV;
+ }
- ssi_private = kzalloc(sizeof(struct fsl_ssi_private), GFP_KERNEL);
+ /* The DAI name is the last part of the full name of the node. */
+ p = strrchr(np->full_name, '/') + 1;
+ ssi_private = kzalloc(sizeof(struct fsl_ssi_private) + strlen(p),
+ GFP_KERNEL);
if (!ssi_private) {
- dev_err(ssi_info->dev, "could not allocate DAI object\n");
- return NULL;
+ dev_err(&of_dev->dev, "could not allocate DAI object\n");
+ return -ENOMEM;
}
- memcpy(&ssi_private->cpu_dai, &fsl_ssi_dai_template,
- sizeof(struct snd_soc_dai));
- fsl_ssi_dai = &ssi_private->cpu_dai;
- dev_attr = &ssi_private->dev_attr;
+ strcpy(ssi_private->name, p);
- sprintf(ssi_private->name, "ssi%u", (u8) ssi_info->id);
- ssi_private->ssi = ssi_info->ssi;
- ssi_private->ssi_phys = ssi_info->ssi_phys;
- ssi_private->irq = ssi_info->irq;
- ssi_private->dev = ssi_info->dev;
- ssi_private->asynchronous = ssi_info->asynchronous;
+ /* Initialize this copy of the CPU DAI driver structure */
+ memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_dai_template,
+ sizeof(fsl_ssi_dai_template));
+ ssi_private->cpu_dai_drv.name = ssi_private->name;
+
+ /* Get the addresses and IRQ */
+ ret = of_address_to_resource(np, 0, &res);
+ if (ret) {
+ dev_err(&of_dev->dev, "could not determine device resources\n");
+ kfree(ssi_private);
+ return ret;
+ }
+ ssi_private->ssi = ioremap(res.start, 1 + res.end - res.start);
+ ssi_private->ssi_phys = res.start;
+ ssi_private->irq = irq_of_parse_and_map(np, 0);
- dev_set_drvdata(ssi_private->dev, fsl_ssi_dai);
+ /* Are the RX and the TX clocks locked? */
+ if (of_find_property(np, "fsl,ssi-asynchronous", NULL))
+ ssi_private->asynchronous = 1;
+ else
+ ssi_private->cpu_dai_drv.symmetric_rates = 1;
/* Initialize the the device_attribute structure */
- dev_attr->attr.name = "ssi-stats";
+ dev_attr = &ssi_private->dev_attr;
+ dev_attr->attr.name = "statistics";
dev_attr->attr.mode = S_IRUGO;
dev_attr->show = fsl_sysfs_ssi_show;
- ret = device_create_file(ssi_private->dev, dev_attr);
+ ret = device_create_file(&of_dev->dev, dev_attr);
if (ret) {
- dev_err(ssi_info->dev, "could not create sysfs %s file\n",
+ dev_err(&of_dev->dev, "could not create sysfs %s file\n",
ssi_private->dev_attr.attr.name);
- kfree(fsl_ssi_dai);
- return NULL;
+ goto error;
}
- fsl_ssi_dai->private_data = ssi_private;
- fsl_ssi_dai->name = ssi_private->name;
- fsl_ssi_dai->id = ssi_info->id;
- fsl_ssi_dai->dev = ssi_info->dev;
- fsl_ssi_dai->symmetric_rates = 1;
+ /* Register with ASoC */
+ dev_set_drvdata(&of_dev->dev, ssi_private);
+
+ ret = snd_soc_register_dai(&of_dev->dev, &ssi_private->cpu_dai_drv);
+ if (ret) {
+ dev_err(&of_dev->dev, "failed to register DAI: %d\n", ret);
+ goto error;
+ }
- ret = snd_soc_register_dai(fsl_ssi_dai);
- if (ret != 0) {
- dev_err(ssi_info->dev, "failed to register DAI: %d\n", ret);
- kfree(fsl_ssi_dai);
- return NULL;
+ /* Trigger the machine driver's probe function. The platform driver
+ * name of the machine driver is taken from the /model property of the
+ * device tree. We also pass the address of the CPU DAI driver
+ * structure.
+ */
+ sprop = of_get_property(of_find_node_by_path("/"), "model", NULL);
+ /* Sometimes the model name has a "fsl," prefix, so we strip that. */
+ p = strrchr(sprop, ',');
+ if (p)
+ sprop = p + 1;
+ snprintf(name, sizeof(name), "snd-soc-%s", sprop);
+ make_lowercase(name);
+
+ ssi_private->pdev =
+ platform_device_register_data(&of_dev->dev, name, 0, NULL, 0);
+ if (IS_ERR(ssi_private->pdev)) {
+ ret = PTR_ERR(ssi_private->pdev);
+ dev_err(&of_dev->dev, "failed to register platform: %d\n", ret);
+ goto error;
}
- return fsl_ssi_dai;
+ return 0;
+
+error:
+ snd_soc_unregister_dai(&of_dev->dev);
+ dev_set_drvdata(&of_dev->dev, NULL);
+ if (dev_attr)
+ device_remove_file(&of_dev->dev, dev_attr);
+ irq_dispose_mapping(ssi_private->irq);
+ iounmap(ssi_private->ssi);
+ kfree(ssi_private);
+
+ return ret;
}
-EXPORT_SYMBOL_GPL(fsl_ssi_create_dai);
-/**
- * fsl_ssi_destroy_dai: destroy the snd_soc_dai object
- *
- * This function undoes the operations of fsl_ssi_create_dai()
- */
-void fsl_ssi_destroy_dai(struct snd_soc_dai *fsl_ssi_dai)
+static int fsl_ssi_remove(struct of_device *of_dev)
{
- struct fsl_ssi_private *ssi_private =
- container_of(fsl_ssi_dai, struct fsl_ssi_private, cpu_dai);
-
- device_remove_file(ssi_private->dev, &ssi_private->dev_attr);
+ struct fsl_ssi_private *ssi_private = dev_get_drvdata(&of_dev->dev);
- snd_soc_unregister_dai(&ssi_private->cpu_dai);
+ platform_device_unregister(ssi_private->pdev);
+ snd_soc_unregister_dai(&of_dev->dev);
+ device_remove_file(&of_dev->dev, &ssi_private->dev_attr);
kfree(ssi_private);
+ dev_set_drvdata(&of_dev->dev, NULL);
+
+ return 0;
}
-EXPORT_SYMBOL_GPL(fsl_ssi_destroy_dai);
+
+static const struct of_device_id fsl_ssi_ids[] = {
+ { .compatible = "fsl,mpc8610-ssi", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, fsl_ssi_ids);
+
+static struct of_platform_driver fsl_ssi_driver = {
+ .driver = {
+ .name = "fsl-ssi-dai",
+ .owner = THIS_MODULE,
+ .of_match_table = fsl_ssi_ids,
+ },
+ .probe = fsl_ssi_probe,
+ .remove = fsl_ssi_remove,
+};
static int __init fsl_ssi_init(void)
{
printk(KERN_INFO "Freescale Synchronous Serial Interface (SSI) ASoC Driver\n");
- return 0;
+ return of_register_platform_driver(&fsl_ssi_driver);
}
+
+static void __exit fsl_ssi_exit(void)
+{
+ of_unregister_platform_driver(&fsl_ssi_driver);
+}
+
module_init(fsl_ssi_init);
+module_exit(fsl_ssi_exit);
MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
MODULE_DESCRIPTION("Freescale Synchronous Serial Interface (SSI) ASoC Driver");
-MODULE_LICENSE("GPL");
+MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/fsl/fsl_ssi.h b/sound/soc/fsl/fsl_ssi.h
index eade01feaab6..217300029b5b 100644
--- a/sound/soc/fsl/fsl_ssi.h
+++ b/sound/soc/fsl/fsl_ssi.h
@@ -196,31 +196,5 @@ struct ccsr_ssi {
#define CCSR_SSI_SOR_WAIT(x) (((x) & 3) << CCSR_SSI_SOR_WAIT_SHIFT)
#define CCSR_SSI_SOR_SYNRST 0x00000001
-/* Instantiation data for an SSI interface
- *
- * This structure contains all the information that the the SSI driver needs
- * to instantiate an SSI interface with ALSA. The machine driver should
- * create this structure, fill it in, call fsl_ssi_create_dai(), and then
- * delete the structure.
- *
- * id: which SSI this is (0, 1, etc. )
- * ssi: pointer to the SSI's registers
- * ssi_phys: physical address of the SSI registers
- * irq: IRQ of this SSI
- * dev: struct device, used to create the sysfs statistics file
- * asynchronous: 0=synchronous mode, 1=asynchronous mode
-*/
-struct fsl_ssi_info {
- unsigned int id;
- struct ccsr_ssi __iomem *ssi;
- dma_addr_t ssi_phys;
- unsigned int irq;
- struct device *dev;
- int asynchronous;
-};
-
-struct snd_soc_dai *fsl_ssi_create_dai(struct fsl_ssi_info *ssi_info);
-void fsl_ssi_destroy_dai(struct snd_soc_dai *fsl_ssi_dai);
-
#endif
diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c
index 3dcd1469f283..dce6b551cd78 100644
--- a/sound/soc/fsl/mpc5200_dma.c
+++ b/sound/soc/fsl/mpc5200_dma.c
@@ -9,6 +9,8 @@
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/slab.h>
+#include <linux/of_device.h>
+#include <linux/of_platform.h>
#include <sound/soc.h>
@@ -107,7 +109,7 @@ static int psc_dma_hw_free(struct snd_pcm_substream *substream)
static int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data;
+ struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
struct snd_pcm_runtime *runtime = substream->runtime;
struct psc_dma_stream *s = to_psc_dma_stream(substream, psc_dma);
struct mpc52xx_psc __iomem *regs = psc_dma->psc_regs;
@@ -212,7 +214,7 @@ static int psc_dma_open(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data;
+ struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
struct psc_dma_stream *s;
int rc;
@@ -239,7 +241,7 @@ static int psc_dma_open(struct snd_pcm_substream *substream)
static int psc_dma_close(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data;
+ struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
struct psc_dma_stream *s;
dev_dbg(psc_dma->dev, "psc_dma_close(substream=%p)\n", substream);
@@ -264,7 +266,7 @@ static snd_pcm_uframes_t
psc_dma_pointer(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data;
+ struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
struct psc_dma_stream *s;
dma_addr_t count;
@@ -302,11 +304,11 @@ static int psc_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
struct snd_pcm *pcm)
{
struct snd_soc_pcm_runtime *rtd = pcm->private_data;
- struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data;
+ struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
size_t size = psc_dma_hardware.buffer_bytes_max;
int rc = 0;
- dev_dbg(rtd->socdev->dev, "psc_dma_new(card=%p, dai=%p, pcm=%p)\n",
+ dev_dbg(rtd->platform->dev, "psc_dma_new(card=%p, dai=%p, pcm=%p)\n",
card, dai, pcm);
if (!card->dev->dma_mask)
@@ -328,8 +330,8 @@ static int psc_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
goto capture_alloc_err;
}
- if (rtd->socdev->card->codec->ac97)
- rtd->socdev->card->codec->ac97->private_data = psc_dma;
+ if (rtd->codec->ac97)
+ rtd->codec->ac97->private_data = psc_dma;
return 0;
@@ -349,7 +351,7 @@ static void psc_dma_free(struct snd_pcm *pcm)
struct snd_pcm_substream *substream;
int stream;
- dev_dbg(rtd->socdev->dev, "psc_dma_free(pcm=%p)\n", pcm);
+ dev_dbg(rtd->platform->dev, "psc_dma_free(pcm=%p)\n", pcm);
for (stream = 0; stream < 2; stream++) {
substream = pcm->streams[stream].substream;
@@ -361,15 +363,14 @@ static void psc_dma_free(struct snd_pcm *pcm)
}
}
-struct snd_soc_platform mpc5200_audio_dma_platform = {
- .name = "mpc5200-psc-audio",
- .pcm_ops = &psc_dma_ops,
+static struct snd_soc_platform_driver mpc5200_audio_dma_platform = {
+ .ops = &psc_dma_ops,
.pcm_new = &psc_dma_new,
.pcm_free = &psc_dma_free,
};
-EXPORT_SYMBOL_GPL(mpc5200_audio_dma_platform);
-int mpc5200_audio_dma_create(struct platform_device *op)
+static int mpc5200_hpcd_probe(struct of_device *op,
+ const struct of_device_id *match)
{
phys_addr_t fifo;
struct psc_dma *psc_dma;
@@ -475,7 +476,7 @@ int mpc5200_audio_dma_create(struct platform_device *op)
dev_set_drvdata(&op->dev, psc_dma);
/* Tell the ASoC OF helpers about it */
- return snd_soc_register_platform(&mpc5200_audio_dma_platform);
+ return snd_soc_register_platform(&op->dev, &mpc5200_audio_dma_platform);
out_irq:
free_irq(psc_dma->irq, psc_dma);
free_irq(psc_dma->capture.irq, &psc_dma->capture);
@@ -486,15 +487,14 @@ out_unmap:
iounmap(regs);
return ret;
}
-EXPORT_SYMBOL_GPL(mpc5200_audio_dma_create);
-int mpc5200_audio_dma_destroy(struct platform_device *op)
+static int mpc5200_hpcd_remove(struct of_device *op)
{
struct psc_dma *psc_dma = dev_get_drvdata(&op->dev);
dev_dbg(&op->dev, "mpc5200_audio_dma_destroy()\n");
- snd_soc_unregister_platform(&mpc5200_audio_dma_platform);
+ snd_soc_unregister_platform(&op->dev);
bcom_gen_bd_rx_release(psc_dma->capture.bcom_task);
bcom_gen_bd_tx_release(psc_dma->playback.bcom_task);
@@ -510,7 +510,35 @@ int mpc5200_audio_dma_destroy(struct platform_device *op)
return 0;
}
-EXPORT_SYMBOL_GPL(mpc5200_audio_dma_destroy);
+
+static struct of_device_id mpc5200_hpcd_match[] = {
+ {
+ .compatible = "fsl,mpc5200-pcm",
+ },
+ {}
+};
+MODULE_DEVICE_TABLE(of, mpc5200_hpcd_match);
+
+static struct of_platform_driver mpc5200_hpcd_of_driver = {
+ .owner = THIS_MODULE,
+ .name = "mpc5200-pcm-audio",
+ .match_table = mpc5200_hpcd_match,
+ .probe = mpc5200_hpcd_probe,
+ .remove = mpc5200_hpcd_remove,
+};
+
+static int __init mpc5200_hpcd_init(void)
+{
+ return of_register_platform_driver(&mpc5200_hpcd_of_driver);
+}
+
+static void __exit mpc5200_hpcd_exit(void)
+{
+ of_unregister_platform_driver(&mpc5200_hpcd_of_driver);
+}
+
+module_init(mpc5200_hpcd_init);
+module_exit(mpc5200_hpcd_exit);
MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>");
MODULE_DESCRIPTION("Freescale MPC5200 PSC in DMA mode ASoC Driver");
diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h
index ca99586f2ad9..a3c0cd5382fb 100644
--- a/sound/soc/fsl/mpc5200_dma.h
+++ b/sound/soc/fsl/mpc5200_dma.h
@@ -81,9 +81,4 @@ to_psc_dma_stream(struct snd_pcm_substream *substream, struct psc_dma *psc_dma)
return &psc_dma->playback;
}
-int mpc5200_audio_dma_create(struct platform_device *op);
-int mpc5200_audio_dma_destroy(struct platform_device *op);
-
-extern struct snd_soc_platform mpc5200_audio_dma_platform;
-
#endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */
diff --git a/sound/soc/fsl/mpc5200_psc_ac97.c b/sound/soc/fsl/mpc5200_psc_ac97.c
index a9560235daee..40acc8e2b1ca 100644
--- a/sound/soc/fsl/mpc5200_psc_ac97.c
+++ b/sound/soc/fsl/mpc5200_psc_ac97.c
@@ -143,7 +143,7 @@ static int psc_ac97_hw_analog_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *cpu_dai)
{
- struct psc_dma *psc_dma = cpu_dai->private_data;
+ struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(cpu_dai);
struct psc_dma_stream *s = to_psc_dma_stream(substream, psc_dma);
dev_dbg(psc_dma->dev, "%s(substream=%p) p_size=%i p_bytes=%i"
@@ -166,7 +166,7 @@ static int psc_ac97_hw_digital_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *cpu_dai)
{
- struct psc_dma *psc_dma = cpu_dai->private_data;
+ struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(cpu_dai);
dev_dbg(psc_dma->dev, "%s(substream=%p)\n", __func__, substream);
@@ -181,8 +181,7 @@ static int psc_ac97_hw_digital_params(struct snd_pcm_substream *substream,
static int psc_ac97_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data;
+ struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(dai);
struct psc_dma_stream *s = to_psc_dma_stream(substream, psc_dma);
switch (cmd) {
@@ -207,10 +206,9 @@ static int psc_ac97_trigger(struct snd_pcm_substream *substream, int cmd,
return 0;
}
-static int psc_ac97_probe(struct platform_device *pdev,
- struct snd_soc_dai *cpu_dai)
+static int psc_ac97_probe(struct snd_soc_dai *cpu_dai)
{
- struct psc_dma *psc_dma = cpu_dai->private_data;
+ struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(cpu_dai);
struct mpc52xx_psc __iomem *regs = psc_dma->psc_regs;
/* Go */
@@ -237,9 +235,8 @@ static struct snd_soc_dai_ops psc_ac97_digital_ops = {
.hw_params = psc_ac97_hw_digital_params,
};
-struct snd_soc_dai psc_ac97_dai[] = {
+static struct snd_soc_dai_driver psc_ac97_dai[] = {
{
- .name = "AC97",
.ac97_control = 1,
.probe = psc_ac97_probe,
.playback = {
@@ -257,7 +254,6 @@ struct snd_soc_dai psc_ac97_dai[] = {
.ops = &psc_ac97_analog_ops,
},
{
- .name = "SPDIF",
.ac97_control = 1,
.playback = {
.channels_min = 1,
@@ -268,7 +264,6 @@ struct snd_soc_dai psc_ac97_dai[] = {
},
.ops = &psc_ac97_digital_ops,
} };
-EXPORT_SYMBOL_GPL(psc_ac97_dai);
@@ -280,18 +275,11 @@ EXPORT_SYMBOL_GPL(psc_ac97_dai);
static int __devinit psc_ac97_of_probe(struct platform_device *op,
const struct of_device_id *match)
{
- int rc, i;
+ int rc;
struct snd_ac97 ac97;
struct mpc52xx_psc __iomem *regs;
- rc = mpc5200_audio_dma_create(op);
- if (rc != 0)
- return rc;
-
- for (i = 0; i < ARRAY_SIZE(psc_ac97_dai); i++)
- psc_ac97_dai[i].dev = &op->dev;
-
- rc = snd_soc_register_dais(psc_ac97_dai, ARRAY_SIZE(psc_ac97_dai));
+ rc = snd_soc_register_dais(&op->dev, psc_ac97_dai, ARRAY_SIZE(psc_ac97_dai));
if (rc != 0) {
dev_err(&op->dev, "Failed to register DAI\n");
return rc;
@@ -301,9 +289,6 @@ static int __devinit psc_ac97_of_probe(struct platform_device *op,
regs = psc_dma->psc_regs;
ac97.private_data = psc_dma;
- for (i = 0; i < ARRAY_SIZE(psc_ac97_dai); i++)
- psc_ac97_dai[i].private_data = psc_dma;
-
psc_dma->imr = 0;
out_be16(&psc_dma->psc_regs->isr_imr.imr, psc_dma->imr);
@@ -319,7 +304,8 @@ static int __devinit psc_ac97_of_probe(struct platform_device *op,
static int __devexit psc_ac97_of_remove(struct platform_device *op)
{
- return mpc5200_audio_dma_destroy(op);
+ snd_soc_unregister_dais(&op->dev, ARRAY_SIZE(psc_ac97_dai));
+ return 0;
}
/* Match table for of_platform binding */
diff --git a/sound/soc/fsl/mpc5200_psc_ac97.h b/sound/soc/fsl/mpc5200_psc_ac97.h
index 4bc18c35c369..e881e784b270 100644
--- a/sound/soc/fsl/mpc5200_psc_ac97.h
+++ b/sound/soc/fsl/mpc5200_psc_ac97.h
@@ -7,8 +7,6 @@
#ifndef __SOUND_SOC_FSL_MPC52xx_PSC_AC97_H__
#define __SOUND_SOC_FSL_MPC52xx_PSC_AC97_H__
-extern struct snd_soc_dai psc_ac97_dai[];
-
#define MPC5200_AC97_NORMAL 0
#define MPC5200_AC97_SPDIF 1
diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_i2s.c
index 534f04cb15d7..74ffed41340f 100644
--- a/sound/soc/fsl/mpc5200_psc_i2s.c
+++ b/sound/soc/fsl/mpc5200_psc_i2s.c
@@ -40,7 +40,7 @@ static int psc_i2s_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data;
+ struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
u32 mode;
dev_dbg(psc_dma->dev, "%s(substream=%p) p_size=%i p_bytes=%i"
@@ -88,7 +88,7 @@ static int psc_i2s_hw_params(struct snd_pcm_substream *substream,
static int psc_i2s_set_sysclk(struct snd_soc_dai *cpu_dai,
int clk_id, unsigned int freq, int dir)
{
- struct psc_dma *psc_dma = cpu_dai->private_data;
+ struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(cpu_dai);
dev_dbg(psc_dma->dev, "psc_i2s_set_sysclk(cpu_dai=%p, dir=%i)\n",
cpu_dai, dir);
return (dir == SND_SOC_CLOCK_IN) ? 0 : -EINVAL;
@@ -107,7 +107,7 @@ static int psc_i2s_set_sysclk(struct snd_soc_dai *cpu_dai,
*/
static int psc_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int format)
{
- struct psc_dma *psc_dma = cpu_dai->private_data;
+ struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(cpu_dai);
dev_dbg(psc_dma->dev, "psc_i2s_set_fmt(cpu_dai=%p, format=%i)\n",
cpu_dai, format);
return (format == SND_SOC_DAIFMT_I2S) ? 0 : -EINVAL;
@@ -129,8 +129,7 @@ static struct snd_soc_dai_ops psc_i2s_dai_ops = {
.set_fmt = psc_i2s_set_fmt,
};
-struct snd_soc_dai psc_i2s_dai[] = {{
- .name = "I2S",
+static struct snd_soc_dai_driver psc_i2s_dai[] = {{
.playback = {
.channels_min = 2,
.channels_max = 2,
@@ -145,7 +144,6 @@ struct snd_soc_dai psc_i2s_dai[] = {{
},
.ops = &psc_i2s_dai_ops,
} };
-EXPORT_SYMBOL_GPL(psc_i2s_dai);
/* ---------------------------------------------------------------------
* OF platform bus binding code:
@@ -159,11 +157,7 @@ static int __devinit psc_i2s_of_probe(struct platform_device *op,
struct psc_dma *psc_dma;
struct mpc52xx_psc __iomem *regs;
- rc = mpc5200_audio_dma_create(op);
- if (rc != 0)
- return rc;
-
- rc = snd_soc_register_dais(psc_i2s_dai, ARRAY_SIZE(psc_i2s_dai));
+ rc = snd_soc_register_dais(&op->dev, psc_i2s_dai, ARRAY_SIZE(psc_i2s_dai));
if (rc != 0) {
pr_err("Failed to register DAI\n");
return 0;
@@ -207,7 +201,8 @@ static int __devinit psc_i2s_of_probe(struct platform_device *op,
static int __devexit psc_i2s_of_remove(struct platform_device *op)
{
- return mpc5200_audio_dma_destroy(op);
+ snd_soc_unregister_dais(&op->dev, ARRAY_SIZE(psc_i2s_dai));
+ return 0;
}
/* Match table for of_platform binding */
diff --git a/sound/soc/fsl/mpc8610_hpcd.c b/sound/soc/fsl/mpc8610_hpcd.c
index 3b13b8d65262..38339c158ed9 100644
--- a/sound/soc/fsl/mpc8610_hpcd.c
+++ b/sound/soc/fsl/mpc8610_hpcd.c
@@ -1,85 +1,96 @@
/**
- * Freescale MPC8610HPCD ALSA SoC Fabric driver
+ * Freescale MPC8610HPCD ALSA SoC Machine driver
*
* Author: Timur Tabi <timur@freescale.com>
*
- * Copyright 2007-2008 Freescale Semiconductor, Inc. This file is licensed
- * under the terms of the GNU General Public License version 2. This
- * program is licensed "as is" without any warranty of any kind, whether
- * express or implied.
+ * Copyright 2007-2010 Freescale Semiconductor, Inc.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
*/
-#include <linux/slab.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/of_device.h>
-#include <linux/of_platform.h>
#include <sound/soc.h>
-#include <asm/immap_86xx.h>
+#include <asm/fsl_guts.h>
-#include "../codecs/cs4270.h"
#include "fsl_dma.h"
#include "fsl_ssi.h"
+/* There's only one global utilities register */
+static phys_addr_t guts_phys;
+
+#define DAI_NAME_SIZE 32
+
/**
- * mpc8610_hpcd_data: fabric-specific ASoC device data
+ * mpc8610_hpcd_data: machine-specific ASoC device data
*
* This structure contains data for a single sound platform device on an
* MPC8610 HPCD. Some of the data is taken from the device tree.
*/
struct mpc8610_hpcd_data {
- struct snd_soc_device sound_devdata;
- struct snd_soc_dai_link dai;
- struct snd_soc_card machine;
+ struct snd_soc_dai_link dai[2];
+ struct snd_soc_card card;
unsigned int dai_format;
unsigned int codec_clk_direction;
unsigned int cpu_clk_direction;
unsigned int clk_frequency;
- struct ccsr_guts __iomem *guts;
- struct ccsr_ssi __iomem *ssi;
- unsigned int ssi_id; /* 0 = SSI1, 1 = SSI2, etc */
- unsigned int ssi_irq;
- unsigned int dma_id; /* 0 = DMA1, 1 = DMA2, etc */
- unsigned int dma_irq[2];
- struct ccsr_dma_channel __iomem *dma[2];
+ unsigned int ssi_id; /* 0 = SSI1, 1 = SSI2, etc */
+ unsigned int dma_id[2]; /* 0 = DMA1, 1 = DMA2, etc */
unsigned int dma_channel_id[2]; /* 0 = ch 0, 1 = ch 1, etc*/
+ char codec_dai_name[DAI_NAME_SIZE];
+ char codec_name[DAI_NAME_SIZE];
+ char platform_name[2][DAI_NAME_SIZE]; /* One for each DMA channel */
};
/**
* mpc8610_hpcd_machine_probe: initialize the board
*
- * This function is called when platform_device_add() is called. It is used
- * to initialize the board-specific hardware.
+ * This function is used to initialize the board-specific hardware.
*
* Here we program the DMACR and PMUXCR registers.
*/
static int mpc8610_hpcd_machine_probe(struct platform_device *sound_device)
{
+ struct snd_soc_card *card = platform_get_drvdata(sound_device);
struct mpc8610_hpcd_data *machine_data =
- sound_device->dev.platform_data;
+ container_of(card, struct mpc8610_hpcd_data, card);
+ struct ccsr_guts_86xx __iomem *guts;
- /* Program the signal routing between the SSI and the DMA */
- guts_set_dmacr(machine_data->guts, machine_data->dma_id,
- machine_data->dma_channel_id[0], CCSR_GUTS_DMACR_DEV_SSI);
- guts_set_dmacr(machine_data->guts, machine_data->dma_id,
- machine_data->dma_channel_id[1], CCSR_GUTS_DMACR_DEV_SSI);
+ guts = ioremap(guts_phys, sizeof(struct ccsr_guts_86xx));
+ if (!guts) {
+ dev_err(card->dev, "could not map global utilities\n");
+ return -ENOMEM;
+ }
- guts_set_pmuxcr_dma(machine_data->guts, machine_data->dma_id,
- machine_data->dma_channel_id[0], 0);
- guts_set_pmuxcr_dma(machine_data->guts, machine_data->dma_id,
- machine_data->dma_channel_id[1], 0);
+ /* Program the signal routing between the SSI and the DMA */
+ guts_set_dmacr(guts, machine_data->dma_id[0],
+ machine_data->dma_channel_id[0],
+ CCSR_GUTS_DMACR_DEV_SSI);
+ guts_set_dmacr(guts, machine_data->dma_id[1],
+ machine_data->dma_channel_id[1],
+ CCSR_GUTS_DMACR_DEV_SSI);
+
+ guts_set_pmuxcr_dma(guts, machine_data->dma_id[0],
+ machine_data->dma_channel_id[0], 0);
+ guts_set_pmuxcr_dma(guts, machine_data->dma_id[1],
+ machine_data->dma_channel_id[1], 0);
switch (machine_data->ssi_id) {
case 0:
- clrsetbits_be32(&machine_data->guts->pmuxcr,
+ clrsetbits_be32(&guts->pmuxcr,
CCSR_GUTS_PMUXCR_SSI1_MASK, CCSR_GUTS_PMUXCR_SSI1_SSI);
break;
case 1:
- clrsetbits_be32(&machine_data->guts->pmuxcr,
+ clrsetbits_be32(&guts->pmuxcr,
CCSR_GUTS_PMUXCR_SSI2_MASK, CCSR_GUTS_PMUXCR_SSI2_SSI);
break;
}
+ iounmap(guts);
+
return 0;
}
@@ -93,38 +104,15 @@ static int mpc8610_hpcd_machine_probe(struct platform_device *sound_device)
static int mpc8610_hpcd_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
struct mpc8610_hpcd_data *machine_data =
- rtd->socdev->dev->platform_data;
+ container_of(rtd->card, struct mpc8610_hpcd_data, card);
+ struct device *dev = rtd->card->dev;
int ret = 0;
- /* Tell the CPU driver what the serial protocol is. */
- ret = snd_soc_dai_set_fmt(cpu_dai, machine_data->dai_format);
- if (ret < 0) {
- dev_err(substream->pcm->card->dev,
- "could not set CPU driver audio format\n");
- return ret;
- }
-
/* Tell the codec driver what the serial protocol is. */
- ret = snd_soc_dai_set_fmt(codec_dai, machine_data->dai_format);
+ ret = snd_soc_dai_set_fmt(rtd->codec_dai, machine_data->dai_format);
if (ret < 0) {
- dev_err(substream->pcm->card->dev,
- "could not set codec driver audio format\n");
- return ret;
- }
-
- /*
- * Tell the CPU driver what the clock frequency is, and whether it's a
- * slave or master.
- */
- ret = snd_soc_dai_set_sysclk(cpu_dai, 0,
- machine_data->clk_frequency,
- machine_data->cpu_clk_direction);
- if (ret < 0) {
- dev_err(substream->pcm->card->dev,
- "could not set CPU driver clock parameters\n");
+ dev_err(dev, "could not set codec driver audio format\n");
return ret;
}
@@ -132,12 +120,11 @@ static int mpc8610_hpcd_startup(struct snd_pcm_substream *substream)
* Tell the codec driver what the MCLK frequency is, and whether it's
* a slave or master.
*/
- ret = snd_soc_dai_set_sysclk(codec_dai, 0,
- machine_data->clk_frequency,
- machine_data->codec_clk_direction);
+ ret = snd_soc_dai_set_sysclk(rtd->codec_dai, 0,
+ machine_data->clk_frequency,
+ machine_data->codec_clk_direction);
if (ret < 0) {
- dev_err(substream->pcm->card->dev,
- "could not set codec driver clock params\n");
+ dev_err(dev, "could not set codec driver clock params\n");
return ret;
}
@@ -150,116 +137,254 @@ static int mpc8610_hpcd_startup(struct snd_pcm_substream *substream)
* This function is called to remove the sound device for one SSI. We
* de-program the DMACR and PMUXCR register.
*/
-int mpc8610_hpcd_machine_remove(struct platform_device *sound_device)
+static int mpc8610_hpcd_machine_remove(struct platform_device *sound_device)
{
+ struct snd_soc_card *card = platform_get_drvdata(sound_device);
struct mpc8610_hpcd_data *machine_data =
- sound_device->dev.platform_data;
+ container_of(card, struct mpc8610_hpcd_data, card);
+ struct ccsr_guts_86xx __iomem *guts;
+
+ guts = ioremap(guts_phys, sizeof(struct ccsr_guts_86xx));
+ if (!guts) {
+ dev_err(card->dev, "could not map global utilities\n");
+ return -ENOMEM;
+ }
/* Restore the signal routing */
- guts_set_dmacr(machine_data->guts, machine_data->dma_id,
- machine_data->dma_channel_id[0], 0);
- guts_set_dmacr(machine_data->guts, machine_data->dma_id,
- machine_data->dma_channel_id[1], 0);
+ guts_set_dmacr(guts, machine_data->dma_id[0],
+ machine_data->dma_channel_id[0], 0);
+ guts_set_dmacr(guts, machine_data->dma_id[1],
+ machine_data->dma_channel_id[1], 0);
switch (machine_data->ssi_id) {
case 0:
- clrsetbits_be32(&machine_data->guts->pmuxcr,
+ clrsetbits_be32(&guts->pmuxcr,
CCSR_GUTS_PMUXCR_SSI1_MASK, CCSR_GUTS_PMUXCR_SSI1_LA);
break;
case 1:
- clrsetbits_be32(&machine_data->guts->pmuxcr,
+ clrsetbits_be32(&guts->pmuxcr,
CCSR_GUTS_PMUXCR_SSI2_MASK, CCSR_GUTS_PMUXCR_SSI2_LA);
break;
}
+ iounmap(guts);
+
return 0;
}
/**
- * mpc8610_hpcd_ops: ASoC fabric driver operations
+ * mpc8610_hpcd_ops: ASoC machine driver operations
*/
static struct snd_soc_ops mpc8610_hpcd_ops = {
.startup = mpc8610_hpcd_startup,
};
/**
- * mpc8610_hpcd_probe: OF probe function for the fabric driver
+ * get_node_by_phandle_name - get a node by its phandle name
*
- * This function gets called when an SSI node is found in the device tree.
+ * This function takes a node, the name of a property in that node, and a
+ * compatible string. Assuming the property is a phandle to another node,
+ * it returns that node, (optionally) if that node is compatible.
*
- * Although this is a fabric driver, the SSI node is the "master" node with
- * respect to audio hardware connections. Therefore, we create a new ASoC
- * device for each new SSI node that has a codec attached.
+ * If the property is not a phandle, or the node it points to is not compatible
+ * with the specific string, then NULL is returned.
+ */
+static struct device_node *get_node_by_phandle_name(struct device_node *np,
+ const char *name,
+ const char *compatible)
+{
+ const phandle *ph;
+ int len;
+
+ ph = of_get_property(np, name, &len);
+ if (!ph || (len != sizeof(phandle)))
+ return NULL;
+
+ np = of_find_node_by_phandle(*ph);
+ if (!np)
+ return NULL;
+
+ if (compatible && !of_device_is_compatible(np, compatible)) {
+ of_node_put(np);
+ return NULL;
+ }
+
+ return np;
+}
+
+/**
+ * get_parent_cell_index -- return the cell-index of the parent of a node
*
- * FIXME: Currently, we only support one DMA controller, so if there are
- * multiple SSI nodes with codecs, only the first will be supported.
+ * Return the value of the cell-index property of the parent of the given
+ * node. This is used for DMA channel nodes that need to know the DMA ID
+ * of the controller they are on.
+ */
+static int get_parent_cell_index(struct device_node *np)
+{
+ struct device_node *parent = of_get_parent(np);
+ const u32 *iprop;
+
+ if (!parent)
+ return -1;
+
+ iprop = of_get_property(parent, "cell-index", NULL);
+ of_node_put(parent);
+
+ if (!iprop)
+ return -1;
+
+ return *iprop;
+}
+
+/**
+ * codec_node_dev_name - determine the dev_name for a codec node
+ *
+ * This function determines the dev_name for an I2C node. This is the name
+ * that would be returned by dev_name() if this device_node were part of a
+ * 'struct device' It's ugly and hackish, but it works.
*
- * FIXME: Even if we did support multiple DMA controllers, we have no
- * mechanism for assigning DMA controllers and channels to the individual
- * SSI devices. We also probably aren't compatible with the generic Elo DMA
- * device driver.
+ * The dev_name for such devices include the bus number and I2C address. For
+ * example, "cs4270-codec.0-004f".
*/
-static int mpc8610_hpcd_probe(struct platform_device *ofdev,
- const struct of_device_id *match)
+static int codec_node_dev_name(struct device_node *np, char *buf, size_t len)
{
- struct device_node *np = ofdev->dev.of_node;
- struct device_node *codec_np = NULL;
- struct device_node *guts_np = NULL;
- struct device_node *dma_np = NULL;
- struct device_node *dma_channel_np = NULL;
- const phandle *codec_ph;
- const char *sprop;
const u32 *iprop;
+ int bus, addr;
+ char temp[DAI_NAME_SIZE];
+
+ of_modalias_node(np, temp, DAI_NAME_SIZE);
+
+ iprop = of_get_property(np, "reg", NULL);
+ if (!iprop)
+ return -EINVAL;
+
+ addr = *iprop;
+
+ bus = get_parent_cell_index(np);
+ if (bus < 0)
+ return bus;
+
+ snprintf(buf, len, "%s-codec.%u-%04x", temp, bus, addr);
+
+ return 0;
+}
+
+static int get_dma_channel(struct device_node *ssi_np,
+ const char *compatible,
+ struct snd_soc_dai_link *dai,
+ unsigned int *dma_channel_id,
+ unsigned int *dma_id)
+{
struct resource res;
+ struct device_node *dma_channel_np;
+ const u32 *iprop;
+ int ret;
+
+ dma_channel_np = get_node_by_phandle_name(ssi_np, compatible,
+ "fsl,ssi-dma-channel");
+ if (!dma_channel_np)
+ return -EINVAL;
+
+ /* Determine the dev_name for the device_node. This code mimics the
+ * behavior of of_device_make_bus_id(). We need this because ASoC uses
+ * the dev_name() of the device to match the platform (DMA) device with
+ * the CPU (SSI) device. It's all ugly and hackish, but it works (for
+ * now).
+ *
+ * dai->platform name should already point to an allocated buffer.
+ */
+ ret = of_address_to_resource(dma_channel_np, 0, &res);
+ if (ret)
+ return ret;
+ snprintf((char *)dai->platform_name, DAI_NAME_SIZE, "%llx.%s",
+ (unsigned long long) res.start, dma_channel_np->name);
+
+ iprop = of_get_property(dma_channel_np, "cell-index", NULL);
+ if (!iprop) {
+ of_node_put(dma_channel_np);
+ return -EINVAL;
+ }
+
+ *dma_channel_id = *iprop;
+ *dma_id = get_parent_cell_index(dma_channel_np);
+ of_node_put(dma_channel_np);
+
+ return 0;
+}
+
+/**
+ * mpc8610_hpcd_probe: platform probe function for the machine driver
+ *
+ * Although this is a machine driver, the SSI node is the "master" node with
+ * respect to audio hardware connections. Therefore, we create a new ASoC
+ * device for each new SSI node that has a codec attached.
+ */
+static int mpc8610_hpcd_probe(struct platform_device *pdev)
+{
+ struct device *dev = pdev->dev.parent;
+ /* of_dev is the OF device for the SSI node that probed us */
+ struct of_device *of_dev = container_of(dev, struct of_device, dev);
+ struct device_node *np = of_dev->dev.of_node;
+ struct device_node *codec_np = NULL;
struct platform_device *sound_device = NULL;
struct mpc8610_hpcd_data *machine_data;
- struct fsl_ssi_info ssi_info;
- struct fsl_dma_info dma_info;
int ret = -ENODEV;
- unsigned int playback_dma_channel;
- unsigned int capture_dma_channel;
+ const char *sprop;
+ const u32 *iprop;
+
+ /* We are only interested in SSIs with a codec phandle in them,
+ * so let's make sure this SSI has one. The MPC8610 HPCD only
+ * knows about the CS4270 codec, so reject anything else.
+ */
+ codec_np = get_node_by_phandle_name(np, "codec-handle",
+ "cirrus,cs4270");
+ if (!codec_np) {
+ dev_err(dev, "invalid codec node\n");
+ return -EINVAL;
+ }
machine_data = kzalloc(sizeof(struct mpc8610_hpcd_data), GFP_KERNEL);
if (!machine_data)
return -ENOMEM;
- memset(&ssi_info, 0, sizeof(ssi_info));
- memset(&dma_info, 0, sizeof(dma_info));
-
- ssi_info.dev = &ofdev->dev;
+ machine_data->dai[0].cpu_dai_name = dev_name(&of_dev->dev);
+ machine_data->dai[0].ops = &mpc8610_hpcd_ops;
- /*
- * We are only interested in SSIs with a codec phandle in them, so let's
- * make sure this SSI has one.
- */
- codec_ph = of_get_property(np, "codec-handle", NULL);
- if (!codec_ph)
+ /* Determine the codec name, it will be used as the codec DAI name */
+ ret = codec_node_dev_name(codec_np, machine_data->codec_name,
+ DAI_NAME_SIZE);
+ if (ret) {
+ dev_err(&pdev->dev, "invalid codec node %s\n",
+ codec_np->full_name);
+ ret = -EINVAL;
goto error;
+ }
+ machine_data->dai[0].codec_name = machine_data->codec_name;
- codec_np = of_find_node_by_phandle(*codec_ph);
- if (!codec_np)
- goto error;
+ /* The DAI name from the codec (snd_soc_dai_driver.name) */
+ machine_data->dai[0].codec_dai_name = "cs4270-hifi";
- /* The MPC8610 HPCD only knows about the CS4270 codec, so reject
- anything else. */
- if (!of_device_is_compatible(codec_np, "cirrus,cs4270"))
- goto error;
+ /* We register two DAIs per SSI, one for playback and the other for
+ * capture. Currently, we only support codecs that have one DAI for
+ * both playback and capture.
+ */
+ memcpy(&machine_data->dai[1], &machine_data->dai[0],
+ sizeof(struct snd_soc_dai_link));
/* Get the device ID */
iprop = of_get_property(np, "cell-index", NULL);
if (!iprop) {
- dev_err(&ofdev->dev, "cell-index property not found\n");
+ dev_err(&pdev->dev, "cell-index property not found\n");
ret = -EINVAL;
goto error;
}
machine_data->ssi_id = *iprop;
- ssi_info.id = *iprop;
/* Get the serial format and clock direction. */
sprop = of_get_property(np, "fsl,mode", NULL);
if (!sprop) {
- dev_err(&ofdev->dev, "fsl,mode property not found\n");
+ dev_err(&pdev->dev, "fsl,mode property not found\n");
ret = -EINVAL;
goto error;
}
@@ -269,15 +394,14 @@ static int mpc8610_hpcd_probe(struct platform_device *ofdev,
machine_data->codec_clk_direction = SND_SOC_CLOCK_OUT;
machine_data->cpu_clk_direction = SND_SOC_CLOCK_IN;
- /*
- * In i2s-slave mode, the codec has its own clock source, so we
+ /* In i2s-slave mode, the codec has its own clock source, so we
* need to get the frequency from the device tree and pass it to
* the codec driver.
*/
iprop = of_get_property(codec_np, "clock-frequency", NULL);
if (!iprop || !*iprop) {
- dev_err(&ofdev->dev, "codec bus-frequency property "
- "is missing or invalid\n");
+ dev_err(&pdev->dev, "codec bus-frequency "
+ "property is missing or invalid\n");
ret = -EINVAL;
goto error;
}
@@ -311,317 +435,153 @@ static int mpc8610_hpcd_probe(struct platform_device *ofdev,
machine_data->codec_clk_direction = SND_SOC_CLOCK_IN;
machine_data->cpu_clk_direction = SND_SOC_CLOCK_OUT;
} else {
- dev_err(&ofdev->dev,
- "unrecognized fsl,mode property \"%s\"\n", sprop);
+ dev_err(&pdev->dev,
+ "unrecognized fsl,mode property '%s'\n", sprop);
ret = -EINVAL;
goto error;
}
if (!machine_data->clk_frequency) {
- dev_err(&ofdev->dev, "unknown clock frequency\n");
+ dev_err(&pdev->dev, "unknown clock frequency\n");
ret = -EINVAL;
goto error;
}
- /* Read the SSI information from the device tree */
- ret = of_address_to_resource(np, 0, &res);
+ /* Find the playback DMA channel to use. */
+ machine_data->dai[0].platform_name = machine_data->platform_name[0];
+ ret = get_dma_channel(np, "fsl,playback-dma", &machine_data->dai[0],
+ &machine_data->dma_channel_id[0],
+ &machine_data->dma_id[0]);
if (ret) {
- dev_err(&ofdev->dev, "could not obtain SSI address\n");
- goto error;
- }
- if (!res.start) {
- dev_err(&ofdev->dev, "invalid SSI address\n");
- goto error;
- }
- ssi_info.ssi_phys = res.start;
-
- machine_data->ssi = ioremap(ssi_info.ssi_phys, sizeof(struct ccsr_ssi));
- if (!machine_data->ssi) {
- dev_err(&ofdev->dev, "could not map SSI address %x\n",
- ssi_info.ssi_phys);
- ret = -EINVAL;
+ dev_err(&pdev->dev, "missing/invalid playback DMA phandle\n");
goto error;
}
- ssi_info.ssi = machine_data->ssi;
-
- /* Get the IRQ of the SSI */
- machine_data->ssi_irq = irq_of_parse_and_map(np, 0);
- if (!machine_data->ssi_irq) {
- dev_err(&ofdev->dev, "could not get SSI IRQ\n");
- ret = -EINVAL;
- goto error;
- }
- ssi_info.irq = machine_data->ssi_irq;
-
- /* Do we want to use asynchronous mode? */
- ssi_info.asynchronous =
- of_find_property(np, "fsl,ssi-asynchronous", NULL) ? 1 : 0;
- if (ssi_info.asynchronous)
- dev_info(&ofdev->dev, "using asynchronous mode\n");
-
- /* Map the global utilities registers. */
- guts_np = of_find_compatible_node(NULL, NULL, "fsl,mpc8610-guts");
- if (!guts_np) {
- dev_err(&ofdev->dev, "could not obtain address of GUTS\n");
- ret = -EINVAL;
- goto error;
- }
- machine_data->guts = of_iomap(guts_np, 0);
- of_node_put(guts_np);
- if (!machine_data->guts) {
- dev_err(&ofdev->dev, "could not map GUTS\n");
- ret = -EINVAL;
- goto error;
- }
-
- /* Find the DMA channels to use. Both SSIs need to use the same DMA
- * controller, so let's use DMA#1.
- */
- for_each_compatible_node(dma_np, NULL, "fsl,mpc8610-dma") {
- iprop = of_get_property(dma_np, "cell-index", NULL);
- if (iprop && (*iprop == 0)) {
- of_node_put(dma_np);
- break;
- }
- }
- if (!dma_np) {
- dev_err(&ofdev->dev, "could not find DMA node\n");
- ret = -EINVAL;
- goto error;
- }
- machine_data->dma_id = *iprop;
-
- /* SSI1 needs to use DMA Channels 0 and 1, and SSI2 needs to use DMA
- * channels 2 and 3. This is just how the MPC8610 is wired
- * internally.
- */
- playback_dma_channel = (machine_data->ssi_id == 0) ? 0 : 2;
- capture_dma_channel = (machine_data->ssi_id == 0) ? 1 : 3;
-
- /*
- * Find the DMA channels to use.
- */
- while ((dma_channel_np = of_get_next_child(dma_np, dma_channel_np))) {
- iprop = of_get_property(dma_channel_np, "cell-index", NULL);
- if (iprop && (*iprop == playback_dma_channel)) {
- /* dma_channel[0] and dma_irq[0] are for playback */
- dma_info.dma_channel[0] = of_iomap(dma_channel_np, 0);
- dma_info.dma_irq[0] =
- irq_of_parse_and_map(dma_channel_np, 0);
- machine_data->dma_channel_id[0] = *iprop;
- continue;
- }
- if (iprop && (*iprop == capture_dma_channel)) {
- /* dma_channel[1] and dma_irq[1] are for capture */
- dma_info.dma_channel[1] = of_iomap(dma_channel_np, 0);
- dma_info.dma_irq[1] =
- irq_of_parse_and_map(dma_channel_np, 0);
- machine_data->dma_channel_id[1] = *iprop;
- continue;
- }
- }
- if (!dma_info.dma_channel[0] || !dma_info.dma_channel[1] ||
- !dma_info.dma_irq[0] || !dma_info.dma_irq[1]) {
- dev_err(&ofdev->dev, "could not find DMA channels\n");
- ret = -EINVAL;
+ /* Find the capture DMA channel to use. */
+ machine_data->dai[1].platform_name = machine_data->platform_name[1];
+ ret = get_dma_channel(np, "fsl,capture-dma", &machine_data->dai[1],
+ &machine_data->dma_channel_id[1],
+ &machine_data->dma_id[1]);
+ if (ret) {
+ dev_err(&pdev->dev, "missing/invalid capture DMA phandle\n");
goto error;
}
- dma_info.ssi_stx_phys = ssi_info.ssi_phys +
- offsetof(struct ccsr_ssi, stx0);
- dma_info.ssi_srx_phys = ssi_info.ssi_phys +
- offsetof(struct ccsr_ssi, srx0);
-
- /* We have the DMA information, so tell the DMA driver what it is */
- if (!fsl_dma_configure(&dma_info)) {
- dev_err(&ofdev->dev, "could not instantiate DMA device\n");
- ret = -EBUSY;
- goto error;
- }
+ /* Initialize our DAI data structure. */
+ machine_data->dai[0].stream_name = "playback";
+ machine_data->dai[1].stream_name = "capture";
+ machine_data->dai[0].name = machine_data->dai[0].stream_name;
+ machine_data->dai[1].name = machine_data->dai[1].stream_name;
- /*
- * Initialize our DAI data structure. We should probably get this
- * information from the device tree.
- */
- machine_data->dai.name = "CS4270";
- machine_data->dai.stream_name = "CS4270";
-
- machine_data->dai.cpu_dai = fsl_ssi_create_dai(&ssi_info);
- machine_data->dai.codec_dai = &cs4270_dai; /* The codec_dai we want */
- machine_data->dai.ops = &mpc8610_hpcd_ops;
-
- machine_data->machine.probe = mpc8610_hpcd_machine_probe;
- machine_data->machine.remove = mpc8610_hpcd_machine_remove;
- machine_data->machine.name = "MPC8610 HPCD";
- machine_data->machine.num_links = 1;
- machine_data->machine.dai_link = &machine_data->dai;
+ machine_data->card.probe = mpc8610_hpcd_machine_probe;
+ machine_data->card.remove = mpc8610_hpcd_machine_remove;
+ machine_data->card.name = pdev->name; /* The platform driver name */
+ machine_data->card.num_links = 2;
+ machine_data->card.dai_link = machine_data->dai;
/* Allocate a new audio platform device structure */
sound_device = platform_device_alloc("soc-audio", -1);
if (!sound_device) {
- dev_err(&ofdev->dev, "platform device allocation failed\n");
+ dev_err(&pdev->dev, "platform device alloc failed\n");
ret = -ENOMEM;
goto error;
}
- machine_data->sound_devdata.card = &machine_data->machine;
- machine_data->sound_devdata.codec_dev = &soc_codec_device_cs4270;
- machine_data->machine.platform = &fsl_soc_platform;
-
- sound_device->dev.platform_data = machine_data;
-
-
- /* Set the platform device and ASoC device to point to each other */
- platform_set_drvdata(sound_device, &machine_data->sound_devdata);
+ /* Associate the card data with the sound device */
+ platform_set_drvdata(sound_device, &machine_data->card);
- machine_data->sound_devdata.dev = &sound_device->dev;
-
-
- /* Tell ASoC to probe us. This will call mpc8610_hpcd_machine.probe(),
- if it exists. */
+ /* Register with ASoC */
ret = platform_device_add(sound_device);
-
if (ret) {
- dev_err(&ofdev->dev, "platform device add failed\n");
+ dev_err(&pdev->dev, "platform device add failed\n");
goto error;
}
- dev_set_drvdata(&ofdev->dev, sound_device);
+ of_node_put(codec_np);
return 0;
error:
of_node_put(codec_np);
- of_node_put(guts_np);
- of_node_put(dma_np);
- of_node_put(dma_channel_np);
if (sound_device)
platform_device_unregister(sound_device);
- if (machine_data->dai.cpu_dai)
- fsl_ssi_destroy_dai(machine_data->dai.cpu_dai);
-
- if (ssi_info.ssi)
- iounmap(ssi_info.ssi);
-
- if (ssi_info.irq)
- irq_dispose_mapping(ssi_info.irq);
-
- if (dma_info.dma_channel[0])
- iounmap(dma_info.dma_channel[0]);
-
- if (dma_info.dma_channel[1])
- iounmap(dma_info.dma_channel[1]);
-
- if (dma_info.dma_irq[0])
- irq_dispose_mapping(dma_info.dma_irq[0]);
-
- if (dma_info.dma_irq[1])
- irq_dispose_mapping(dma_info.dma_irq[1]);
-
- if (machine_data->guts)
- iounmap(machine_data->guts);
-
kfree(machine_data);
return ret;
}
/**
- * mpc8610_hpcd_remove: remove the OF device
+ * mpc8610_hpcd_remove: remove the platform device
*
- * This function is called when the OF device is removed.
+ * This function is called when the platform device is removed.
*/
-static int mpc8610_hpcd_remove(struct platform_device *ofdev)
+static int __devexit mpc8610_hpcd_remove(struct platform_device *pdev)
{
- struct platform_device *sound_device = dev_get_drvdata(&ofdev->dev);
+ struct platform_device *sound_device = dev_get_drvdata(&pdev->dev);
+ struct snd_soc_card *card = platform_get_drvdata(sound_device);
struct mpc8610_hpcd_data *machine_data =
- sound_device->dev.platform_data;
+ container_of(card, struct mpc8610_hpcd_data, card);
platform_device_unregister(sound_device);
- if (machine_data->dai.cpu_dai)
- fsl_ssi_destroy_dai(machine_data->dai.cpu_dai);
-
- if (machine_data->ssi)
- iounmap(machine_data->ssi);
-
- if (machine_data->dma[0])
- iounmap(machine_data->dma[0]);
-
- if (machine_data->dma[1])
- iounmap(machine_data->dma[1]);
-
- if (machine_data->dma_irq[0])
- irq_dispose_mapping(machine_data->dma_irq[0]);
-
- if (machine_data->dma_irq[1])
- irq_dispose_mapping(machine_data->dma_irq[1]);
-
- if (machine_data->guts)
- iounmap(machine_data->guts);
-
kfree(machine_data);
sound_device->dev.platform_data = NULL;
- dev_set_drvdata(&ofdev->dev, NULL);
+ dev_set_drvdata(&pdev->dev, NULL);
return 0;
}
-static struct of_device_id mpc8610_hpcd_match[] = {
- {
- .compatible = "fsl,mpc8610-ssi",
- },
- {}
-};
-MODULE_DEVICE_TABLE(of, mpc8610_hpcd_match);
-
-static struct of_platform_driver mpc8610_hpcd_of_driver = {
+static struct platform_driver mpc8610_hpcd_driver = {
+ .probe = mpc8610_hpcd_probe,
+ .remove = __devexit_p(mpc8610_hpcd_remove),
.driver = {
- .name = "mpc8610_hpcd",
+ /* The name must match the 'model' property in the device tree,
+ * in lowercase letters.
+ */
+ .name = "snd-soc-mpc8610hpcd",
.owner = THIS_MODULE,
- .of_match_table = mpc8610_hpcd_match,
},
- .probe = mpc8610_hpcd_probe,
- .remove = mpc8610_hpcd_remove,
};
/**
- * mpc8610_hpcd_init: fabric driver initialization.
+ * mpc8610_hpcd_init: machine driver initialization.
*
* This function is called when this module is loaded.
*/
static int __init mpc8610_hpcd_init(void)
{
- int ret;
-
- printk(KERN_INFO "Freescale MPC8610 HPCD ALSA SoC fabric driver\n");
+ struct device_node *guts_np;
+ struct resource res;
- ret = of_register_platform_driver(&mpc8610_hpcd_of_driver);
+ pr_info("Freescale MPC8610 HPCD ALSA SoC machine driver\n");
- if (ret)
- printk(KERN_ERR
- "mpc8610-hpcd: failed to register platform driver\n");
+ /* Get the physical address of the global utilities registers */
+ guts_np = of_find_compatible_node(NULL, NULL, "fsl,mpc8610-guts");
+ if (of_address_to_resource(guts_np, 0, &res)) {
+ pr_err("mpc8610-hpcd: missing/invalid global utilities node\n");
+ return -EINVAL;
+ }
+ guts_phys = res.start;
- return ret;
+ return platform_driver_register(&mpc8610_hpcd_driver);
}
/**
- * mpc8610_hpcd_exit: fabric driver exit
+ * mpc8610_hpcd_exit: machine driver exit
*
* This function is called when this driver is unloaded.
*/
static void __exit mpc8610_hpcd_exit(void)
{
- of_unregister_platform_driver(&mpc8610_hpcd_of_driver);
+ platform_driver_unregister(&mpc8610_hpcd_driver);
}
module_init(mpc8610_hpcd_init);
module_exit(mpc8610_hpcd_exit);
MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
-MODULE_DESCRIPTION("Freescale MPC8610 HPCD ALSA SoC fabric driver");
-MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Freescale MPC8610 HPCD ALSA SoC machine driver");
+MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/fsl/pcm030-audio-fabric.c b/sound/soc/fsl/pcm030-audio-fabric.c
index 6644cba7cbf2..fe15bb26e484 100644
--- a/sound/soc/fsl/pcm030-audio-fabric.c
+++ b/sound/soc/fsl/pcm030-audio-fabric.c
@@ -32,21 +32,24 @@
#define DRV_NAME "pcm030-audio-fabric"
-static struct snd_soc_device device;
static struct snd_soc_card card;
static struct snd_soc_dai_link pcm030_fabric_dai[] = {
{
.name = "AC97",
.stream_name = "AC97 Analog",
- .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI],
- .cpu_dai = &psc_ac97_dai[MPC5200_AC97_NORMAL],
+ .codec_dai_name = "wm9712-hifi",
+ .cpu_dai_name = "mpc5200-psc-ac97.0",
+ .platform_name = "mpc5200-pcm-audio",
+ .codec_name = "wm9712-codec",
},
{
.name = "AC97",
.stream_name = "AC97 IEC958",
- .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX],
- .cpu_dai = &psc_ac97_dai[MPC5200_AC97_SPDIF],
+ .codec_dai_name = "wm9712-aux",
+ .cpu_dai_name = "mpc5200-psc-ac97.1",
+ .platform_name = "mpc5200-pcm-audio",
+ ..codec_name = "wm9712-codec",
},
};
@@ -58,22 +61,18 @@ static __init int pcm030_fabric_init(void)
if (!of_machine_is_compatible("phytec,pcm030"))
return -ENODEV;
- card.platform = &mpc5200_audio_dma_platform;
+
card.name = "pcm030";
card.dai_link = pcm030_fabric_dai;
card.num_links = ARRAY_SIZE(pcm030_fabric_dai);
- device.card = &card;
- device.codec_dev = &soc_codec_dev_wm9712;
-
pdev = platform_device_alloc("soc-audio", 1);
if (!pdev) {
pr_err("pcm030_fabric_init: platform_device_alloc() failed\n");
return -ENODEV;
}
- platform_set_drvdata(pdev, &device);
- device.dev = &pdev->dev;
+ platform_set_drvdata(pdev, &card);
rc = platform_device_add(pdev);
if (rc) {
diff --git a/sound/soc/fsl/soc-of-simple.c b/sound/soc/fsl/soc-of-simple.c
deleted file mode 100644
index 3bc13fd89096..000000000000
--- a/sound/soc/fsl/soc-of-simple.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * OF helpers for ALSA SoC Layer
- *
- * Copyright (C) 2008, Secret Lab Technologies Ltd.
- */
-
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/pm.h>
-#include <linux/bitops.h>
-#include <linux/platform_device.h>
-#include <linux/of.h>
-#include <linux/slab.h>
-#include <sound/core.h>
-#include <sound/pcm.h>
-#include <sound/pcm_params.h>
-#include <sound/soc.h>
-#include <sound/soc-of-simple.h>
-#include <sound/initval.h>
-
-MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>");
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("ALSA SoC OpenFirmware bindings");
-
-static DEFINE_MUTEX(of_snd_soc_mutex);
-static LIST_HEAD(of_snd_soc_device_list);
-static int of_snd_soc_next_index;
-
-struct of_snd_soc_device {
- int id;
- struct list_head list;
- struct snd_soc_device device;
- struct snd_soc_card card;
- struct snd_soc_dai_link dai_link;
- struct platform_device *pdev;
- struct device_node *platform_node;
- struct device_node *codec_node;
-};
-
-static struct snd_soc_ops of_snd_soc_ops = {
-};
-
-static struct of_snd_soc_device *
-of_snd_soc_get_device(struct device_node *codec_node)
-{
- struct of_snd_soc_device *of_soc;
-
- list_for_each_entry(of_soc, &of_snd_soc_device_list, list) {
- if (of_soc->codec_node == codec_node)
- return of_soc;
- }
-
- of_soc = kzalloc(sizeof(struct of_snd_soc_device), GFP_KERNEL);
- if (!of_soc)
- return NULL;
-
- /* Initialize the structure and add it to the global list */
- of_soc->codec_node = codec_node;
- of_soc->id = of_snd_soc_next_index++;
- of_soc->card.dai_link = &of_soc->dai_link;
- of_soc->card.num_links = 1;
- of_soc->device.card = &of_soc->card;
- of_soc->dai_link.ops = &of_snd_soc_ops;
- list_add(&of_soc->list, &of_snd_soc_device_list);
-
- return of_soc;
-}
-
-static void of_snd_soc_register_device(struct of_snd_soc_device *of_soc)
-{
- struct platform_device *pdev;
- int rc;
-
- /* Only register the device if both the codec and platform have
- * been registered */
- if ((!of_soc->device.codec_data) || (!of_soc->platform_node))
- return;
-
- pr_info("platform<-->codec match achieved; registering machine\n");
-
- pdev = platform_device_alloc("soc-audio", of_soc->id);
- if (!pdev) {
- pr_err("of_soc: platform_device_alloc() failed\n");
- return;
- }
-
- pdev->dev.platform_data = of_soc;
- platform_set_drvdata(pdev, &of_soc->device);
- of_soc->device.dev = &pdev->dev;
-
- /* The ASoC device is complete; register it */
- rc = platform_device_add(pdev);
- if (rc) {
- pr_err("of_soc: platform_device_add() failed\n");
- return;
- }
-
-}
-
-int of_snd_soc_register_codec(struct snd_soc_codec_device *codec_dev,
- void *codec_data, struct snd_soc_dai *dai,
- struct device_node *node)
-{
- struct of_snd_soc_device *of_soc;
- int rc = 0;
-
- pr_info("registering ASoC codec driver: %s\n", node->full_name);
-
- mutex_lock(&of_snd_soc_mutex);
- of_soc = of_snd_soc_get_device(node);
- if (!of_soc) {
- rc = -ENOMEM;
- goto out;
- }
-
- /* Store the codec data */
- of_soc->device.codec_data = codec_data;
- of_soc->device.codec_dev = codec_dev;
- of_soc->dai_link.name = (char *)node->name;
- of_soc->dai_link.stream_name = (char *)node->name;
- of_soc->dai_link.codec_dai = dai;
-
- /* Now try to register the SoC device */
- of_snd_soc_register_device(of_soc);
-
- out:
- mutex_unlock(&of_snd_soc_mutex);
- return rc;
-}
-EXPORT_SYMBOL_GPL(of_snd_soc_register_codec);
-
-int of_snd_soc_register_platform(struct snd_soc_platform *platform,
- struct device_node *node,
- struct snd_soc_dai *cpu_dai)
-{
- struct of_snd_soc_device *of_soc;
- struct device_node *codec_node;
- const phandle *handle;
- int len, rc = 0;
-
- pr_info("registering ASoC platform driver: %s\n", node->full_name);
-
- handle = of_get_property(node, "codec-handle", &len);
- if (!handle || len < sizeof(handle))
- return -ENODEV;
- codec_node = of_find_node_by_phandle(*handle);
- if (!codec_node)
- return -ENODEV;
- pr_info("looking for codec: %s\n", codec_node->full_name);
-
- mutex_lock(&of_snd_soc_mutex);
- of_soc = of_snd_soc_get_device(codec_node);
- if (!of_soc) {
- rc = -ENOMEM;
- goto out;
- }
-
- of_soc->platform_node = node;
- of_soc->dai_link.cpu_dai = cpu_dai;
- of_soc->card.platform = platform;
- of_soc->card.name = of_soc->dai_link.cpu_dai->name;
-
- /* Now try to register the SoC device */
- of_snd_soc_register_device(of_soc);
-
- out:
- mutex_unlock(&of_snd_soc_mutex);
- return rc;
-}
-EXPORT_SYMBOL_GPL(of_snd_soc_register_platform);
diff --git a/sound/soc/imx/Kconfig b/sound/soc/imx/Kconfig
index 687c76fc0839..642270a635ea 100644
--- a/sound/soc/imx/Kconfig
+++ b/sound/soc/imx/Kconfig
@@ -8,12 +8,24 @@ menuconfig SND_IMX_SOC
Say Y or M if you want to add support for codecs attached to
the i.MX SSI interface.
+
if SND_IMX_SOC
+config SND_MXC_SOC_SSI
+ tristate
+
+config SND_MXC_SOC_FIQ
+ tristate
+
+config SND_MXC_SOC_MX2
+ tristate
+
config SND_MXC_SOC_WM1133_EV1
tristate "Audio on the the i.MX31ADS with WM1133-EV1 fitted"
depends on MACH_MX31ADS_WM1133_EV1 && EXPERIMENTAL
select SND_SOC_WM8350
+ select SND_MXC_SOC_SSI
+ select SND_MXC_SOC_FIQ
help
Enable support for audio on the i.MX31ADS with the WM1133-EV1
PMIC board with WM8835x fitted.
@@ -22,6 +34,8 @@ config SND_SOC_PHYCORE_AC97
tristate "SoC Audio support for Phytec phyCORE (and phyCARD) boards"
depends on MACH_PCM043 || MACH_PCA100
select SND_SOC_WM9712
+ select SND_MXC_SOC_SSI
+ select SND_MXC_SOC_FIQ
help
Say Y if you want to add support for SoC audio on Phytec phyCORE
and phyCARD boards in AC97 mode
@@ -32,6 +46,8 @@ config SND_SOC_EUKREA_TLV320
|| MACH_EUKREA_MBIMXSD25_BASEBOARD \
|| MACH_EUKREA_MBIMXSD35_BASEBOARD
select SND_SOC_TLV320AIC23
+ select SND_MXC_SOC_SSI
+ select SND_MXC_SOC_FIQ
help
Enable I2S based access to the TLV320AIC23B codec attached
to the SSI interface
diff --git a/sound/soc/imx/Makefile b/sound/soc/imx/Makefile
index 7bc57baf2b0e..b67fc02a4ecc 100644
--- a/sound/soc/imx/Makefile
+++ b/sound/soc/imx/Makefile
@@ -1,11 +1,11 @@
# i.MX Platform Support
-snd-soc-imx-objs := imx-ssi.o imx-pcm-fiq.o
-
-ifdef CONFIG_MACH_MX27
-snd-soc-imx-objs += imx-pcm-dma-mx2.o
-endif
+snd-soc-imx-objs := imx-ssi.o
+snd-soc-imx-fiq-objs := imx-pcm-fiq.o
+snd-soc-imx-mx2-objs := imx-pcm-dma-mx2.o
obj-$(CONFIG_SND_IMX_SOC) += snd-soc-imx.o
+obj-$(CONFIG_SND_MXC_SOC_FIQ) += snd-soc-imx-fiq.o
+obj-$(CONFIG_SND_MXC_SOC_MX2) += snd-soc-imx-mx2.o
# i.MX Machine Support
snd-soc-eukrea-tlv320-objs := eukrea-tlv320.o
diff --git a/sound/soc/imx/eukrea-tlv320.c b/sound/soc/imx/eukrea-tlv320.c
index f15dfbdc47ee..807f736ee294 100644
--- a/sound/soc/imx/eukrea-tlv320.c
+++ b/sound/soc/imx/eukrea-tlv320.c
@@ -79,22 +79,19 @@ static struct snd_soc_ops eukrea_tlv320_snd_ops = {
static struct snd_soc_dai_link eukrea_tlv320_dai = {
.name = "tlv320aic23",
.stream_name = "TLV320AIC23",
- .codec_dai = &tlv320aic23_dai,
+ .codec_dai = "tlv320aic23-hifi",
+ .platform_name = "imx-pcm-audio.0",
+ .codec_name = "tlv320aic23-codec.0-001a",
+ .cpu_dai = "imx-ssi-dai.0",
.ops = &eukrea_tlv320_snd_ops,
};
static struct snd_soc_card eukrea_tlv320 = {
.name = "cpuimx-audio",
- .platform = &imx_soc_platform,
.dai_link = &eukrea_tlv320_dai,
.num_links = 1,
};
-static struct snd_soc_device eukrea_tlv320_snd_devdata = {
- .card = &eukrea_tlv320,
- .codec_dev = &soc_codec_dev_tlv320aic23,
-};
-
static struct platform_device *eukrea_tlv320_snd_device;
static int __init eukrea_tlv320_init(void)
@@ -110,10 +107,7 @@ static int __init eukrea_tlv320_init(void)
if (!eukrea_tlv320_snd_device)
return -ENOMEM;
- eukrea_tlv320_dai.cpu_dai = &imx_ssi_pcm_dai[0];
-
- platform_set_drvdata(eukrea_tlv320_snd_device, &eukrea_tlv320_snd_devdata);
- eukrea_tlv320_snd_devdata.dev = &eukrea_tlv320_snd_device->dev;
+ platform_set_drvdata(eukrea_tlv320_snd_device, &eukrea_tlv320);
ret = platform_device_add(eukrea_tlv320_snd_device);
if (ret) {
diff --git a/sound/soc/imx/imx-pcm-dma-mx2.c b/sound/soc/imx/imx-pcm-dma-mx2.c
index 0a595da4811d..fd493ee1428e 100644
--- a/sound/soc/imx/imx-pcm-dma-mx2.c
+++ b/sound/soc/imx/imx-pcm-dma-mx2.c
@@ -103,7 +103,7 @@ static int imx_ssi_dma_alloc(struct snd_pcm_substream *substream)
struct imx_pcm_runtime_data *iprtd = runtime->private_data;
int ret;
- dma_params = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ dma_params = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
iprtd->dma = imx_dma_request_by_prio(DRV_NAME, DMA_PRIO_HIGH);
if (iprtd->dma < 0) {
@@ -213,7 +213,7 @@ static int snd_imx_pcm_prepare(struct snd_pcm_substream *substream)
struct imx_pcm_runtime_data *iprtd = runtime->private_data;
int err;
- dma_params = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ dma_params = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
iprtd->substream = substream;
iprtd->buf = (unsigned int *)substream->dma_buffer.area;
@@ -318,19 +318,42 @@ static struct snd_pcm_ops imx_pcm_ops = {
.mmap = snd_imx_pcm_mmap,
};
-static struct snd_soc_platform imx_soc_platform_dma = {
- .name = "imx-audio",
- .pcm_ops = &imx_pcm_ops,
+static struct snd_soc_platform_driver imx_soc_platform_mx2 = {
+ .ops = &imx_pcm_ops,
.pcm_new = imx_pcm_new,
.pcm_free = imx_pcm_free,
};
-struct snd_soc_platform *imx_ssi_dma_mx2_init(struct platform_device *pdev,
- struct imx_ssi *ssi)
+static int __devinit imx_soc_platform_probe(struct platform_device *pdev)
{
- ssi->dma_params_tx.burstsize = DMA_TXFIFO_BURST;
- ssi->dma_params_rx.burstsize = DMA_RXFIFO_BURST;
+ return snd_soc_register_platform(&pdev->dev, &imx_soc_platform_mx2);
+}
+
+static int __devexit imx_soc_platform_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver imx_pcm_driver = {
+ .driver = {
+ .name = "imx-pcm-audio",
+ .owner = THIS_MODULE,
+ },
- return &imx_soc_platform_dma;
+ .probe = imx_soc_platform_probe,
+ .remove = __devexit_p(imx_soc_platform_remove),
+};
+
+static int __init snd_imx_pcm_init(void)
+{
+ return platform_driver_register(&imx_pcm_driver);
+}
+module_init(snd_imx_pcm_init);
+
+static void __exit snd_imx_pcm_exit(void)
+{
+ platform_driver_unregister(&imx_pcm_driver);
}
+module_exit(snd_imx_pcm_exit);
diff --git a/sound/soc/imx/imx-pcm-fiq.c b/sound/soc/imx/imx-pcm-fiq.c
index b2bf27282cd2..413b78da248f 100644
--- a/sound/soc/imx/imx-pcm-fiq.c
+++ b/sound/soc/imx/imx-pcm-fiq.c
@@ -236,6 +236,8 @@ static struct snd_pcm_ops imx_pcm_ops = {
.mmap = snd_imx_pcm_mmap,
};
+static int ssi_irq = 0;
+
static int imx_pcm_fiq_new(struct snd_card *card, struct snd_soc_dai *dai,
struct snd_pcm *pcm)
{
@@ -245,7 +247,7 @@ static int imx_pcm_fiq_new(struct snd_card *card, struct snd_soc_dai *dai,
if (ret)
return ret;
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
struct snd_pcm_substream *substream =
pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream;
struct snd_dma_buffer *buf = &substream->dma_buffer;
@@ -253,7 +255,7 @@ static int imx_pcm_fiq_new(struct snd_card *card, struct snd_soc_dai *dai,
imx_ssi_fiq_tx_buffer = (unsigned long)buf->area;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
struct snd_pcm_substream *substream =
pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream;
struct snd_dma_buffer *buf = &substream->dma_buffer;
@@ -267,24 +269,32 @@ static int imx_pcm_fiq_new(struct snd_card *card, struct snd_soc_dai *dai,
return 0;
}
-static struct snd_soc_platform imx_soc_platform_fiq = {
- .pcm_ops = &imx_pcm_ops,
+static void imx_pcm_fiq_free(struct snd_pcm *pcm)
+{
+ mxc_set_irq_fiq(ssi_irq, 0);
+ release_fiq(&fh);
+ imx_pcm_free(pcm);
+}
+
+static struct snd_soc_platform_driver imx_soc_platform_fiq = {
+ .ops = &imx_pcm_ops,
.pcm_new = imx_pcm_fiq_new,
- .pcm_free = imx_pcm_free,
+ .pcm_free = imx_pcm_fiq_free,
};
-struct snd_soc_platform *imx_ssi_fiq_init(struct platform_device *pdev,
- struct imx_ssi *ssi)
+static int __devinit imx_soc_platform_probe(struct platform_device *pdev)
{
- int ret = 0;
+ struct imx_ssi *ssi = platform_get_drvdata(pdev);
+ int ret;
ret = claim_fiq(&fh);
if (ret) {
dev_err(&pdev->dev, "failed to claim fiq: %d", ret);
- return ERR_PTR(ret);
+ return ret;
}
mxc_set_irq_fiq(ssi->irq, 1);
+ ssi_irq = ssi->irq;
imx_pcm_fiq = ssi->irq;
@@ -293,13 +303,43 @@ struct snd_soc_platform *imx_ssi_fiq_init(struct platform_device *pdev,
ssi->dma_params_tx.burstsize = 4;
ssi->dma_params_rx.burstsize = 6;
- return &imx_soc_platform_fiq;
+ ret = snd_soc_register_platform(&pdev->dev, &imx_soc_platform_fiq);
+ if (ret)
+ goto failed_register;
+
+ return 0;
+
+failed_register:
+ mxc_set_irq_fiq(ssi_irq, 0);
+ release_fiq(&fh);
+
+ return ret;
}
-void imx_ssi_fiq_exit(struct platform_device *pdev,
- struct imx_ssi *ssi)
+static int __devexit imx_soc_platform_remove(struct platform_device *pdev)
{
- mxc_set_irq_fiq(ssi->irq, 0);
- release_fiq(&fh);
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
}
+static struct platform_driver imx_pcm_driver = {
+ .driver = {
+ .name = "imx-fiq-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = imx_soc_platform_probe,
+ .remove = __devexit_p(imx_soc_platform_remove),
+};
+
+static int __init snd_imx_pcm_init(void)
+{
+ return platform_driver_register(&imx_pcm_driver);
+}
+module_init(snd_imx_pcm_init);
+
+static void __exit snd_imx_pcm_exit(void)
+{
+ platform_driver_unregister(&imx_pcm_driver);
+}
+module_exit(snd_imx_pcm_exit);
diff --git a/sound/soc/imx/imx-ssi.c b/sound/soc/imx/imx-ssi.c
index a11daa1e905b..2601be5a4ed8 100644
--- a/sound/soc/imx/imx-ssi.c
+++ b/sound/soc/imx/imx-ssi.c
@@ -61,7 +61,7 @@
static int imx_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
{
- struct imx_ssi *ssi = cpu_dai->private_data;
+ struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai);
u32 sccr;
sccr = readl(ssi->base + SSI_STCCR);
@@ -86,7 +86,7 @@ static int imx_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
*/
static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
{
- struct imx_ssi *ssi = cpu_dai->private_data;
+ struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai);
u32 strcr = 0, scr;
scr = readl(ssi->base + SSI_SCR) & ~(SSI_SCR_SYN | SSI_SCR_NET);
@@ -164,7 +164,7 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
static int imx_ssi_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
int clk_id, unsigned int freq, int dir)
{
- struct imx_ssi *ssi = cpu_dai->private_data;
+ struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai);
u32 scr;
scr = readl(ssi->base + SSI_SCR);
@@ -192,7 +192,7 @@ static int imx_ssi_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
static int imx_ssi_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
int div_id, int div)
{
- struct imx_ssi *ssi = cpu_dai->private_data;
+ struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai);
u32 stccr, srccr;
stccr = readl(ssi->base + SSI_STCCR);
@@ -241,7 +241,7 @@ static int imx_ssi_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *cpu_dai)
{
- struct imx_ssi *ssi = cpu_dai->private_data;
+ struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai);
struct imx_pcm_dma_params *dma_data;
u32 reg, sccr;
@@ -279,9 +279,7 @@ static int imx_ssi_hw_params(struct snd_pcm_substream *substream,
static int imx_ssi_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct imx_ssi *ssi = cpu_dai->private_data;
+ struct imx_ssi *ssi = snd_soc_dai_get_drvdata(dai);
unsigned int sier_bits, sier;
unsigned int scr;
@@ -350,22 +348,6 @@ static struct snd_soc_dai_ops imx_ssi_pcm_dai_ops = {
.trigger = imx_ssi_trigger,
};
-static struct snd_soc_dai imx_ssi_dai = {
- .playback = {
- .channels_min = 2,
- .channels_max = 2,
- .rates = SNDRV_PCM_RATE_8000_96000,
- .formats = SNDRV_PCM_FMTBIT_S16_LE,
- },
- .capture = {
- .channels_min = 2,
- .channels_max = 2,
- .rates = SNDRV_PCM_RATE_8000_96000,
- .formats = SNDRV_PCM_FMTBIT_S16_LE,
- },
- .ops = &imx_ssi_pcm_dai_ops,
-};
-
int snd_imx_pcm_mmap(struct snd_pcm_substream *substream,
struct vm_area_struct *vma)
{
@@ -381,6 +363,7 @@ int snd_imx_pcm_mmap(struct snd_pcm_substream *substream,
runtime->dma_bytes);
return ret;
}
+EXPORT_SYMBOL_GPL(snd_imx_pcm_mmap);
static int imx_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
{
@@ -412,14 +395,14 @@ int imx_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
card->dev->dma_mask = &imx_pcm_dmamask;
if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
ret = imx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK);
if (ret)
goto out;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
ret = imx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE);
if (ret)
@@ -429,6 +412,7 @@ int imx_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
out:
return ret;
}
+EXPORT_SYMBOL_GPL(imx_pcm_new);
void imx_pcm_free(struct snd_pcm *pcm)
{
@@ -450,14 +434,40 @@ void imx_pcm_free(struct snd_pcm *pcm)
buf->area = NULL;
}
}
+EXPORT_SYMBOL_GPL(imx_pcm_free);
-struct snd_soc_platform imx_soc_platform = {
- .name = "imx-audio",
+static struct snd_soc_dai_driver imx_ssi_dai = {
+ .playback = {
+ .channels_min = 2,
+ .channels_max = 2,
+ .rates = SNDRV_PCM_RATE_8000_96000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ },
+ .capture = {
+ .channels_min = 2,
+ .channels_max = 2,
+ .rates = SNDRV_PCM_RATE_8000_96000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ },
+ .ops = &imx_ssi_pcm_dai_ops,
};
-EXPORT_SYMBOL_GPL(imx_soc_platform);
-static struct snd_soc_dai imx_ac97_dai = {
- .name = "AC97",
+static int imx_ssi_dai_probe(struct snd_soc_dai *dai)
+{
+ struct imx_ssi *ssi = dev_get_drvdata(dai->dev);
+ uint32_t val;
+
+ snd_soc_dai_set_drvdata(dai, ssi);
+
+ val = SSI_SFCSR_TFWM0(ssi->dma_params_tx.burstsize) |
+ SSI_SFCSR_RFWM0(ssi->dma_params_rx.burstsize);
+ writel(val, ssi->base + SSI_SFCSR);
+
+ return 0;
+}
+
+static struct snd_soc_dai_driver imx_ac97_dai = {
+ .probe = imx_ssi_dai_probe,
.ac97_control = 1,
.playback = {
.stream_name = "AC97 Playback",
@@ -577,25 +587,18 @@ struct snd_ac97_bus_ops soc_ac97_ops = {
};
EXPORT_SYMBOL_GPL(soc_ac97_ops);
-struct snd_soc_dai imx_ssi_pcm_dai[2];
-EXPORT_SYMBOL_GPL(imx_ssi_pcm_dai);
-
static int imx_ssi_probe(struct platform_device *pdev)
{
struct resource *res;
struct imx_ssi *ssi;
struct imx_ssi_platform_data *pdata = pdev->dev.platform_data;
- struct snd_soc_platform *platform;
int ret = 0;
- unsigned int val;
- struct snd_soc_dai *dai = &imx_ssi_pcm_dai[pdev->id];
-
- if (dai->id >= ARRAY_SIZE(imx_ssi_pcm_dai))
- return -EINVAL;
+ struct snd_soc_dai_driver *dai;
ssi = kzalloc(sizeof(*ssi), GFP_KERNEL);
if (!ssi)
return -ENOMEM;
+ dev_set_drvdata(&pdev->dev, ssi);
if (pdata) {
ssi->ac97_reset = pdata->ac97_reset;
@@ -640,9 +643,9 @@ static int imx_ssi_probe(struct platform_device *pdev)
}
ac97_ssi = ssi;
setup_channel_to_ac97(ssi);
- memcpy(dai, &imx_ac97_dai, sizeof(imx_ac97_dai));
+ dai = &imx_ac97_dai;
} else
- memcpy(dai, &imx_ssi_dai, sizeof(imx_ssi_dai));
+ dai = &imx_ssi_dai;
writel(0x0, ssi->base + SSI_SIER);
@@ -657,37 +660,36 @@ static int imx_ssi_probe(struct platform_device *pdev)
if (res)
ssi->dma_params_rx.dma = res->start;
- dai->id = pdev->id;
- dai->dev = &pdev->dev;
- dai->name = kasprintf(GFP_KERNEL, "imx-ssi.%d", pdev->id);
- dai->private_data = ssi;
-
if ((cpu_is_mx27() || cpu_is_mx21()) &&
!(ssi->flags & IMX_SSI_USE_AC97) &&
(ssi->flags & IMX_SSI_DMA)) {
ssi->flags |= IMX_SSI_DMA;
- platform = imx_ssi_dma_mx2_init(pdev, ssi);
- } else
- platform = imx_ssi_fiq_init(pdev, ssi);
-
- imx_soc_platform.pcm_ops = platform->pcm_ops;
- imx_soc_platform.pcm_new = platform->pcm_new;
- imx_soc_platform.pcm_free = platform->pcm_free;
+ }
- val = SSI_SFCSR_TFWM0(ssi->dma_params_tx.burstsize) |
- SSI_SFCSR_RFWM0(ssi->dma_params_rx.burstsize);
- writel(val, ssi->base + SSI_SFCSR);
+ platform_set_drvdata(pdev, ssi);
- ret = snd_soc_register_dai(dai);
+ ret = snd_soc_register_dai(&pdev->dev, dai);
if (ret) {
dev_err(&pdev->dev, "register DAI failed\n");
goto failed_register;
}
- platform_set_drvdata(pdev, ssi);
+ ssi->soc_platform_pdev = platform_device_alloc("imx-fiq-pcm-audio", pdev->id);
+ if (!ssi->soc_platform_pdev)
+ goto failed_pdev_alloc;
+ platform_set_drvdata(ssi->soc_platform_pdev, ssi);
+ ret = platform_device_add(ssi->soc_platform_pdev);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to add platform device\n");
+ goto failed_pdev_add;
+ }
return 0;
+failed_pdev_add:
+ platform_device_put(ssi->soc_platform_pdev);
+failed_pdev_alloc:
+ snd_soc_unregister_dai(&pdev->dev);
failed_register:
failed_ac97:
iounmap(ssi->base);
@@ -706,16 +708,15 @@ static int __devexit imx_ssi_remove(struct platform_device *pdev)
{
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
struct imx_ssi *ssi = platform_get_drvdata(pdev);
- struct snd_soc_dai *dai = &imx_ssi_pcm_dai[pdev->id];
- snd_soc_unregister_dai(dai);
+ platform_device_del(ssi->soc_platform_pdev);
+ platform_device_put(ssi->soc_platform_pdev);
+
+ snd_soc_unregister_dai(&pdev->dev);
if (ssi->flags & IMX_SSI_USE_AC97)
ac97_ssi = NULL;
- if (!(ssi->flags & IMX_SSI_DMA))
- imx_ssi_fiq_exit(pdev, ssi);
-
iounmap(ssi->base);
release_mem_region(res->start, resource_size(res));
clk_disable(ssi->clk);
@@ -730,34 +731,19 @@ static struct platform_driver imx_ssi_driver = {
.remove = __devexit_p(imx_ssi_remove),
.driver = {
- .name = DRV_NAME,
+ .name = "imx-ssi-dai",
.owner = THIS_MODULE,
},
};
static int __init imx_ssi_init(void)
{
- int ret;
-
- ret = snd_soc_register_platform(&imx_soc_platform);
- if (ret) {
- pr_err("failed to register soc platform: %d\n", ret);
- return ret;
- }
-
- ret = platform_driver_register(&imx_ssi_driver);
- if (ret) {
- snd_soc_unregister_platform(&imx_soc_platform);
- return ret;
- }
-
- return 0;
+ return platform_driver_register(&imx_ssi_driver);
}
static void __exit imx_ssi_exit(void)
{
platform_driver_unregister(&imx_ssi_driver);
- snd_soc_unregister_platform(&imx_soc_platform);
}
module_init(imx_ssi_init);
diff --git a/sound/soc/imx/imx-ssi.h b/sound/soc/imx/imx-ssi.h
index 55f26ebcd8c2..53b780d9b2b0 100644
--- a/sound/soc/imx/imx-ssi.h
+++ b/sound/soc/imx/imx-ssi.h
@@ -183,9 +183,6 @@
#define IMX_SSI_RX_DIV_PSR 4
#define IMX_SSI_RX_DIV_PM 5
-extern struct snd_soc_dai imx_ssi_pcm_dai[2];
-extern struct snd_soc_platform imx_soc_platform;
-
#define DRV_NAME "imx-ssi"
struct imx_pcm_dma_params {
@@ -197,7 +194,7 @@ struct imx_pcm_dma_params {
struct imx_ssi {
struct platform_device *ac97_dev;
- struct snd_soc_device imx_ac97;
+ struct snd_soc_dai *imx_ac97;
struct clk *clk;
void __iomem *base;
int irq;
@@ -213,6 +210,8 @@ struct imx_ssi {
struct imx_pcm_dma_params dma_params_tx;
int enabled;
+
+ struct platform_device *soc_platform_pdev;
};
struct snd_soc_platform *imx_ssi_fiq_init(struct platform_device *pdev,
diff --git a/sound/soc/imx/phycore-ac97.c b/sound/soc/imx/phycore-ac97.c
index a8307d55c70e..65f0f99ca6dd 100644
--- a/sound/soc/imx/phycore-ac97.c
+++ b/sound/soc/imx/phycore-ac97.c
@@ -32,23 +32,20 @@ static struct snd_soc_dai_link imx_phycore_dai_ac97[] = {
{
.name = "HiFi",
.stream_name = "HiFi",
- .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI],
+ .codec_dai_name = "wm9712-hifi",
+ .codec_name = "wm9712-codec",
+ .cpu_dai_name = "imx-ssi-dai.0",
+ .platform_name = "imx-fiq-pcm-audio.0",
.ops = &imx_phycore_hifi_ops,
},
};
static struct snd_soc_card imx_phycore = {
.name = "PhyCORE-audio",
- .platform = &imx_soc_platform,
.dai_link = imx_phycore_dai_ac97,
.num_links = ARRAY_SIZE(imx_phycore_dai_ac97),
};
-static struct snd_soc_device imx_phycore_snd_devdata = {
- .card = &imx_phycore,
- .codec_dev = &soc_codec_dev_wm9712,
-};
-
static struct platform_device *imx_phycore_snd_device;
static int __init imx_phycore_init(void)
@@ -63,10 +60,12 @@ static int __init imx_phycore_init(void)
if (!imx_phycore_snd_device)
return -ENOMEM;
- imx_phycore_dai_ac97[0].cpu_dai = &imx_ssi_pcm_dai[0];
+ platform_set_drvdata(imx_phycore_snd_device, &imx_phycore);
+ ret = platform_device_add(imx_phycore_snd_device);
- platform_set_drvdata(imx_phycore_snd_device, &imx_phycore_snd_devdata);
- imx_phycore_snd_devdata.dev = &imx_phycore_snd_device->dev;
+ imx_phycore_snd_device = platform_device_alloc("wm9712-codec", -1);
+ if (!imx_phycore_snd_device)
+ return -ENOMEM;
ret = platform_device_add(imx_phycore_snd_device);
if (ret) {
diff --git a/sound/soc/imx/wm1133-ev1.c b/sound/soc/imx/wm1133-ev1.c
index a6e7d9497639..74068636c1d8 100644
--- a/sound/soc/imx/wm1133-ev1.c
+++ b/sound/soc/imx/wm1133-ev1.c
@@ -82,8 +82,8 @@ static int wm1133_ev1_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int i, found = 0;
snd_pcm_format_t format = params_format(params);
unsigned int rate = params_rate(params);
@@ -210,9 +210,9 @@ static struct snd_soc_jack_pin mic_jack_pins[] = {
{ .pin = "Mic2 Jack", .mask = SND_JACK_MICROPHONE },
};
-static int wm1133_ev1_init(struct snd_soc_codec *codec)
+static int wm1133_ev1_init(struct snd_soc_pcm_runtime *rtd)
{
- struct snd_soc_card *card = codec->socdev->card;
+ struct snd_soc_codec *codec = rtd->codec;
snd_soc_dapm_new_controls(codec, wm1133_ev1_widgets,
ARRAY_SIZE(wm1133_ev1_widgets));
@@ -221,13 +221,13 @@ static int wm1133_ev1_init(struct snd_soc_codec *codec)
ARRAY_SIZE(wm1133_ev1_map));
/* Headphone jack detection */
- snd_soc_jack_new(card, "Headphone", SND_JACK_HEADPHONE, &hp_jack);
+ snd_soc_jack_new(codec, "Headphone", SND_JACK_HEADPHONE, &hp_jack);
snd_soc_jack_add_pins(&hp_jack, ARRAY_SIZE(hp_jack_pins),
hp_jack_pins);
wm8350_hp_jack_detect(codec, WM8350_JDR, &hp_jack, SND_JACK_HEADPHONE);
/* Microphone jack detection */
- snd_soc_jack_new(card, "Microphone",
+ snd_soc_jack_new(codec, "Microphone",
SND_JACK_MICROPHONE | SND_JACK_BTN_0, &mic_jack);
snd_soc_jack_add_pins(&mic_jack, ARRAY_SIZE(mic_jack_pins),
mic_jack_pins);
@@ -243,8 +243,10 @@ static int wm1133_ev1_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link wm1133_ev1_dai = {
.name = "WM1133-EV1",
.stream_name = "Audio",
- .cpu_dai = &imx_ssi_pcm_dai[0],
- .codec_dai = &wm8350_dai,
+ .cpu_dai_name = "imx-ssi-dai.0",
+ .codec_dai_name = "wm8350-hifi",
+ .platform_name = "imx-fiq-pcm-audio.0",
+ .codec_name = "wm8350-codec.0-0x1a",
.init = wm1133_ev1_init,
.ops = &wm1133_ev1_ops,
.symmetric_rates = 1,
@@ -252,16 +254,10 @@ static struct snd_soc_dai_link wm1133_ev1_dai = {
static struct snd_soc_card wm1133_ev1 = {
.name = "WM1133-EV1",
- .platform = &imx_soc_platform,
.dai_link = &wm1133_ev1_dai,
.num_links = 1,
};
-static struct snd_soc_device wm1133_ev1_snd_devdata = {
- .card = &wm1133_ev1,
- .codec_dev = &soc_codec_dev_wm8350,
-};
-
static struct platform_device *wm1133_ev1_snd_device;
static int __init wm1133_ev1_audio_init(void)
@@ -286,8 +282,7 @@ static int __init wm1133_ev1_audio_init(void)
if (!wm1133_ev1_snd_device)
return -ENOMEM;
- platform_set_drvdata(wm1133_ev1_snd_device, &wm1133_ev1_snd_devdata);
- wm1133_ev1_snd_devdata.dev = &wm1133_ev1_snd_device->dev;
+ platform_set_drvdata(wm1133_ev1_snd_device, &wm1133_ev1);
ret = platform_device_add(wm1133_ev1_snd_device);
if (ret)
diff --git a/sound/soc/jz4740/jz4740-i2s.c b/sound/soc/jz4740/jz4740-i2s.c
index eb518f0c5e01..f3cffd183401 100644
--- a/sound/soc/jz4740/jz4740-i2s.c
+++ b/sound/soc/jz4740/jz4740-i2s.c
@@ -106,15 +106,10 @@ static inline void jz4740_i2s_write(const struct jz4740_i2s *i2s,
writel(value, i2s->base + reg);
}
-static inline struct jz4740_i2s *jz4740_dai_to_i2s(struct snd_soc_dai *dai)
-{
- return dai->private_data;
-}
-
static int jz4740_i2s_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai);
+ struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
uint32_t conf, ctrl;
if (dai->active)
@@ -136,7 +131,7 @@ static int jz4740_i2s_startup(struct snd_pcm_substream *substream,
static void jz4740_i2s_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai);
+ struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
uint32_t conf;
if (!dai->active)
@@ -152,7 +147,7 @@ static void jz4740_i2s_shutdown(struct snd_pcm_substream *substream,
static int jz4740_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
- struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai);
+ struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
uint32_t ctrl;
uint32_t mask;
@@ -186,7 +181,7 @@ static int jz4740_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
static int jz4740_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
{
- struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai);
+ struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
uint32_t format = 0;
uint32_t conf;
@@ -238,7 +233,7 @@ static int jz4740_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
{
- struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai);
+ struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
enum jz4740_dma_width dma_width;
struct jz4740_pcm_config *pcm_config;
unsigned int sample_size;
@@ -288,7 +283,7 @@ static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream,
static int jz4740_i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id,
unsigned int freq, int dir)
{
- struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai);
+ struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
struct clk *parent;
int ret = 0;
@@ -312,7 +307,7 @@ static int jz4740_i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id,
static int jz4740_i2s_suspend(struct snd_soc_dai *dai)
{
- struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai);
+ struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
uint32_t conf;
if (dai->active) {
@@ -330,7 +325,7 @@ static int jz4740_i2s_suspend(struct snd_soc_dai *dai)
static int jz4740_i2s_resume(struct snd_soc_dai *dai)
{
- struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai);
+ struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
uint32_t conf;
clk_enable(i2s->clk_aic);
@@ -346,11 +341,38 @@ static int jz4740_i2s_resume(struct snd_soc_dai *dai)
return 0;
}
-static int jz4740_i2s_probe(struct platform_device *pdev, struct snd_soc_dai *dai)
+static void jz4740_i2c_init_pcm_config(struct jz4740_i2s *i2s)
{
- struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai);
+ struct jz4740_dma_config *dma_config;
+
+ /* Playback */
+ dma_config = &i2s->pcm_config_playback.dma_config;
+ dma_config->src_width = JZ4740_DMA_WIDTH_32BIT,
+ dma_config->transfer_size = JZ4740_DMA_TRANSFER_SIZE_16BYTE;
+ dma_config->request_type = JZ4740_DMA_TYPE_AIC_TRANSMIT;
+ dma_config->flags = JZ4740_DMA_SRC_AUTOINC;
+ dma_config->mode = JZ4740_DMA_MODE_SINGLE;
+ i2s->pcm_config_playback.fifo_addr = i2s->phys_base + JZ_REG_AIC_FIFO;
+
+ /* Capture */
+ dma_config = &i2s->pcm_config_capture.dma_config;
+ dma_config->dst_width = JZ4740_DMA_WIDTH_32BIT,
+ dma_config->transfer_size = JZ4740_DMA_TRANSFER_SIZE_16BYTE;
+ dma_config->request_type = JZ4740_DMA_TYPE_AIC_RECEIVE;
+ dma_config->flags = JZ4740_DMA_DST_AUTOINC;
+ dma_config->mode = JZ4740_DMA_MODE_SINGLE;
+ i2s->pcm_config_capture.fifo_addr = i2s->phys_base + JZ_REG_AIC_FIFO;
+}
+
+static int jz4740_i2s_dai_probe(struct snd_soc_dai *dai)
+{
+ struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
uint32_t conf;
+ clk_enable(i2s->clk_aic);
+
+ jz4740_i2c_init_pcm_config(i2s);
+
conf = (7 << JZ_AIC_CONF_FIFO_RX_THRESHOLD_OFFSET) |
(8 << JZ_AIC_CONF_FIFO_TX_THRESHOLD_OFFSET) |
JZ_AIC_CONF_OVERFLOW_PLAY_LAST |
@@ -363,6 +385,14 @@ static int jz4740_i2s_probe(struct platform_device *pdev, struct snd_soc_dai *da
return 0;
}
+static int jz4740_i2s_dai_remove(struct snd_soc_dai *dai)
+{
+ struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
+
+ clk_disable(i2s->clk_aic);
+ return 0;
+}
+
static struct snd_soc_dai_ops jz4740_i2s_dai_ops = {
.startup = jz4740_i2s_startup,
.shutdown = jz4740_i2s_shutdown,
@@ -375,9 +405,9 @@ static struct snd_soc_dai_ops jz4740_i2s_dai_ops = {
#define JZ4740_I2S_FMTS (SNDRV_PCM_FMTBIT_S8 | \
SNDRV_PCM_FMTBIT_S16_LE)
-struct snd_soc_dai jz4740_i2s_dai = {
- .name = "jz4740-i2s",
- .probe = jz4740_i2s_probe,
+static struct snd_soc_dai_driver jz4740_i2s_dai = {
+ .probe = jz4740_i2s_dai_probe,
+ .remove = jz4740_i2s_dai_remove,
.playback = {
.channels_min = 1,
.channels_max = 2,
@@ -395,30 +425,6 @@ struct snd_soc_dai jz4740_i2s_dai = {
.suspend = jz4740_i2s_suspend,
.resume = jz4740_i2s_resume,
};
-EXPORT_SYMBOL_GPL(jz4740_i2s_dai);
-
-static void __devinit jz4740_i2c_init_pcm_config(struct jz4740_i2s *i2s)
-{
- struct jz4740_dma_config *dma_config;
-
- /* Playback */
- dma_config = &i2s->pcm_config_playback.dma_config;
- dma_config->src_width = JZ4740_DMA_WIDTH_32BIT,
- dma_config->transfer_size = JZ4740_DMA_TRANSFER_SIZE_16BYTE;
- dma_config->request_type = JZ4740_DMA_TYPE_AIC_TRANSMIT;
- dma_config->flags = JZ4740_DMA_SRC_AUTOINC;
- dma_config->mode = JZ4740_DMA_MODE_SINGLE;
- i2s->pcm_config_playback.fifo_addr = i2s->phys_base + JZ_REG_AIC_FIFO;
-
- /* Capture */
- dma_config = &i2s->pcm_config_capture.dma_config;
- dma_config->dst_width = JZ4740_DMA_WIDTH_32BIT,
- dma_config->transfer_size = JZ4740_DMA_TRANSFER_SIZE_16BYTE;
- dma_config->request_type = JZ4740_DMA_TYPE_AIC_RECEIVE;
- dma_config->flags = JZ4740_DMA_DST_AUTOINC;
- dma_config->mode = JZ4740_DMA_MODE_SINGLE;
- i2s->pcm_config_capture.fifo_addr = i2s->phys_base + JZ_REG_AIC_FIFO;
-}
static int __devinit jz4740_i2s_dev_probe(struct platform_device *pdev)
{
@@ -463,24 +469,17 @@ static int __devinit jz4740_i2s_dev_probe(struct platform_device *pdev)
goto err_clk_put_aic;
}
- clk_enable(i2s->clk_aic);
-
- jz4740_i2c_init_pcm_config(i2s);
-
- jz4740_i2s_dai.private_data = i2s;
- ret = snd_soc_register_dai(&jz4740_i2s_dai);
+ platform_set_drvdata(pdev, i2s);
+ ret = snd_soc_register_dai(&pdev->dev, &jz4740_i2s_dai);
if (ret) {
dev_err(&pdev->dev, "Failed to register DAI\n");
goto err_clk_put_i2s;
}
- platform_set_drvdata(pdev, i2s);
-
return 0;
err_clk_put_i2s:
- clk_disable(i2s->clk_aic);
clk_put(i2s->clk_i2s);
err_clk_put_aic:
clk_put(i2s->clk_aic);
@@ -498,9 +497,8 @@ static int __devexit jz4740_i2s_dev_remove(struct platform_device *pdev)
{
struct jz4740_i2s *i2s = platform_get_drvdata(pdev);
- snd_soc_unregister_dai(&jz4740_i2s_dai);
+ snd_soc_unregister_dai(&pdev->dev);
- clk_disable(i2s->clk_aic);
clk_put(i2s->clk_i2s);
clk_put(i2s->clk_aic);
diff --git a/sound/soc/jz4740/jz4740-i2s.h b/sound/soc/jz4740/jz4740-i2s.h
index da22ed88a589..5e49339d8b93 100644
--- a/sound/soc/jz4740/jz4740-i2s.h
+++ b/sound/soc/jz4740/jz4740-i2s.h
@@ -13,6 +13,4 @@
#define JZ4740_I2S_BIT_CLK 0
-extern struct snd_soc_dai jz4740_i2s_dai;
-
#endif
diff --git a/sound/soc/jz4740/jz4740-pcm.c b/sound/soc/jz4740/jz4740-pcm.c
index ee68d850c8dd..fb1483f7c966 100644
--- a/sound/soc/jz4740/jz4740-pcm.c
+++ b/sound/soc/jz4740/jz4740-pcm.c
@@ -109,7 +109,7 @@ static int jz4740_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct jz4740_pcm_config *config;
- config = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ config = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
if (!config)
return 0;
@@ -310,14 +310,14 @@ int jz4740_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
ret = jz4740_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK);
if (ret)
goto err;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
ret = jz4740_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE);
if (ret)
@@ -328,22 +328,20 @@ err:
return ret;
}
-struct snd_soc_platform jz4740_soc_platform = {
- .name = "jz4740-pcm",
- .pcm_ops = &jz4740_pcm_ops,
+static struct snd_soc_platform_driver jz4740_soc_platform = {
+ .ops = &jz4740_pcm_ops,
.pcm_new = jz4740_pcm_new,
.pcm_free = jz4740_pcm_free,
};
-EXPORT_SYMBOL_GPL(jz4740_soc_platform);
static int __devinit jz4740_pcm_probe(struct platform_device *pdev)
{
- return snd_soc_register_platform(&jz4740_soc_platform);
+ return snd_soc_register_platform(&pdev->dev, &jz4740_soc_platform);
}
static int __devexit jz4740_pcm_remove(struct platform_device *pdev)
{
- snd_soc_unregister_platform(&jz4740_soc_platform);
+ snd_soc_unregister_platform(&pdev->dev);
return 0;
}
@@ -351,7 +349,7 @@ static struct platform_driver jz4740_pcm_driver = {
.probe = jz4740_pcm_probe,
.remove = __devexit_p(jz4740_pcm_remove),
.driver = {
- .name = "jz4740-pcm",
+ .name = "jz4740-pcm-audio",
.owner = THIS_MODULE,
},
};
diff --git a/sound/soc/jz4740/jz4740-pcm.h b/sound/soc/jz4740/jz4740-pcm.h
index e3f221e2779c..1220cbb4382c 100644
--- a/sound/soc/jz4740/jz4740-pcm.h
+++ b/sound/soc/jz4740/jz4740-pcm.h
@@ -11,8 +11,6 @@
#include <linux/dma-mapping.h>
#include <asm/mach-jz4740/dma.h>
-/* platform data */
-extern struct snd_soc_platform jz4740_soc_platform;
struct jz4740_pcm_config {
struct jz4740_dma_config dma_config;
diff --git a/sound/soc/jz4740/qi_lb60.c b/sound/soc/jz4740/qi_lb60.c
index f15f4918f15f..ef1a99e6a3bd 100644
--- a/sound/soc/jz4740/qi_lb60.c
+++ b/sound/soc/jz4740/qi_lb60.c
@@ -22,11 +22,6 @@
#include <sound/soc-dapm.h>
#include <linux/gpio.h>
-#include "../codecs/jz4740.h"
-#include "jz4740-pcm.h"
-#include "jz4740-i2s.h"
-
-
#define QI_LB60_SND_GPIO JZ_GPIO_PORTB(29)
#define QI_LB60_AMP_GPIO JZ_GPIO_PORTD(4)
@@ -60,10 +55,11 @@ static const struct snd_soc_dapm_route qi_lb60_routes[] = {
SND_SOC_DAIFMT_NB_NF | \
SND_SOC_DAIFMT_CBM_CFM)
-static int qi_lb60_codec_init(struct snd_soc_codec *codec)
+static int qi_lb60_codec_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
- struct snd_soc_dai *cpu_dai = codec->socdev->card->dai_link->cpu_dai;
snd_soc_dapm_nc_pin(codec, "LIN");
snd_soc_dapm_nc_pin(codec, "RIN");
@@ -84,8 +80,10 @@ static int qi_lb60_codec_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link qi_lb60_dai = {
.name = "jz4740",
.stream_name = "jz4740",
- .cpu_dai = &jz4740_i2s_dai,
- .codec_dai = &jz4740_codec_dai,
+ .cpu_dai_name = "jz4740-i2s",
+ .platform_name = "jz4740-pcm-audio",
+ .codec_dai_name = "jz4740-hifi",
+ .codec_name = "jz4740-codec",
.init = qi_lb60_codec_init,
};
@@ -93,12 +91,6 @@ static struct snd_soc_card qi_lb60 = {
.name = "QI LB60",
.dai_link = &qi_lb60_dai,
.num_links = 1,
- .platform = &jz4740_soc_platform,
-};
-
-static struct snd_soc_device qi_lb60_snd_devdata = {
- .card = &qi_lb60,
- .codec_dev = &soc_codec_dev_jz4740_codec,
};
static struct platform_device *qi_lb60_snd_device;
@@ -129,8 +121,7 @@ static int __init qi_lb60_init(void)
gpio_direction_output(QI_LB60_SND_GPIO, 0);
gpio_direction_output(QI_LB60_AMP_GPIO, 0);
- platform_set_drvdata(qi_lb60_snd_device, &qi_lb60_snd_devdata);
- qi_lb60_snd_devdata.dev = &qi_lb60_snd_device->dev;
+ platform_set_drvdata(qi_lb60_snd_device, &qi_lb60);
ret = platform_device_add(qi_lb60_snd_device);
if (ret) {
diff --git a/sound/soc/kirkwood/kirkwood-dma.c b/sound/soc/kirkwood/kirkwood-dma.c
index a30205be3e2b..693049d42d24 100644
--- a/sound/soc/kirkwood/kirkwood-dma.c
+++ b/sound/soc/kirkwood/kirkwood-dma.c
@@ -18,7 +18,6 @@
#include <linux/dma-mapping.h>
#include <linux/mbus.h>
#include <sound/soc.h>
-#include "kirkwood-dma.h"
#include "kirkwood.h"
#define KIRKWOOD_RATES \
@@ -123,9 +122,10 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream)
int err;
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
- struct snd_soc_dai *cpu_dai = soc_runtime->dai->cpu_dai;
+ struct snd_soc_platform *platform = soc_runtime->platform;
+ struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai;
struct kirkwood_dma_data *priv;
- struct kirkwood_dma_priv *prdata = cpu_dai->private_data;
+ struct kirkwood_dma_priv *prdata = snd_soc_platform_get_drvdata(platform);
unsigned long addr;
priv = snd_soc_dai_get_dma_data(cpu_dai, substream);
@@ -151,7 +151,7 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream)
if (err < 0)
return err;
- if (soc_runtime->dai->cpu_dai->private_data == NULL) {
+ if (prdata == NULL) {
prdata = kzalloc(sizeof(struct kirkwood_dma_priv), GFP_KERNEL);
if (prdata == NULL)
return -ENOMEM;
@@ -165,7 +165,7 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream)
return -EBUSY;
}
- soc_runtime->dai->cpu_dai->private_data = prdata;
+ snd_soc_platform_set_drvdata(platform, prdata);
/*
* Enable Error interrupts. We're only ack'ing them but
@@ -191,8 +191,9 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream)
static int kirkwood_dma_close(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
- struct snd_soc_dai *cpu_dai = soc_runtime->dai->cpu_dai;
- struct kirkwood_dma_priv *prdata = cpu_dai->private_data;
+ struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai;
+ struct snd_soc_platform *platform = soc_runtime->platform;
+ struct kirkwood_dma_priv *prdata = snd_soc_platform_get_drvdata(platform);
struct kirkwood_dma_data *priv;
priv = snd_soc_dai_get_dma_data(cpu_dai, substream);
@@ -209,7 +210,7 @@ static int kirkwood_dma_close(struct snd_pcm_substream *substream)
writel(0, priv->io + KIRKWOOD_ERR_MASK);
free_irq(priv->irq, prdata);
kfree(prdata);
- soc_runtime->dai->cpu_dai->private_data = NULL;
+ snd_soc_platform_set_drvdata(platform, NULL);
}
return 0;
@@ -236,7 +237,7 @@ static int kirkwood_dma_prepare(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
- struct snd_soc_dai *cpu_dai = soc_runtime->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai;
struct kirkwood_dma_data *priv;
unsigned long size, count;
@@ -265,7 +266,7 @@ static snd_pcm_uframes_t kirkwood_dma_pointer(struct snd_pcm_substream
*substream)
{
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
- struct snd_soc_dai *cpu_dai = soc_runtime->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai;
struct kirkwood_dma_data *priv;
snd_pcm_uframes_t count;
@@ -320,14 +321,14 @@ static int kirkwood_dma_new(struct snd_card *card,
if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = 0xffffffff;
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
ret = kirkwood_dma_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK);
if (ret)
return ret;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
ret = kirkwood_dma_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE);
if (ret)
@@ -357,25 +358,44 @@ static void kirkwood_dma_free_dma_buffers(struct snd_pcm *pcm)
}
}
-struct snd_soc_platform kirkwood_soc_platform = {
- .name = "kirkwood-dma",
- .pcm_ops = &kirkwood_dma_ops,
+static struct snd_soc_platform_driver kirkwood_soc_platform = {
+ .ops = &kirkwood_dma_ops,
.pcm_new = kirkwood_dma_new,
.pcm_free = kirkwood_dma_free_dma_buffers,
};
-EXPORT_SYMBOL_GPL(kirkwood_soc_platform);
-static int __init kirkwood_soc_platform_init(void)
+static int __devinit kirkwood_soc_platform_probe(struct platform_device *pdev)
{
- return snd_soc_register_platform(&kirkwood_soc_platform);
+ return snd_soc_register_platform(&pdev->dev, &kirkwood_soc_platform);
}
-module_init(kirkwood_soc_platform_init);
-static void __exit kirkwood_soc_platform_exit(void)
+static int __devexit kirkwood_soc_platform_remove(struct platform_device *pdev)
{
- snd_soc_unregister_platform(&kirkwood_soc_platform);
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver kirkwood_pcm_driver = {
+ .driver = {
+ .name = "kirkwood-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = kirkwood_soc_platform_probe,
+ .remove = __devexit_p(kirkwood_soc_platform_remove),
+};
+
+static int __init kirkwood_pcm_init(void)
+{
+ return platform_driver_register(&kirkwood_pcm_driver);
+}
+module_init(kirkwood_pcm_init);
+
+static void __exit kirkwood_pcm_exit(void)
+{
+ platform_driver_unregister(&kirkwood_pcm_driver);
}
-module_exit(kirkwood_soc_platform_exit);
+module_exit(kirkwood_pcm_exit);
MODULE_AUTHOR("Arnaud Patard <apatard@mandriva.com>");
MODULE_DESCRIPTION("Marvell Kirkwood Audio DMA module");
diff --git a/sound/soc/kirkwood/kirkwood-dma.h b/sound/soc/kirkwood/kirkwood-dma.h
deleted file mode 100644
index ba4454cd34f1..000000000000
--- a/sound/soc/kirkwood/kirkwood-dma.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * kirkwood-dma.h
- *
- * (c) 2010 Arnaud Patard <apatard@mandriva.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- */
-
-#ifndef _KIRKWOOD_DMA_H
-#define _KIRKWOOD_DMA_H
-
-extern struct snd_soc_platform kirkwood_soc_platform;
-
-#endif
diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c
index 981ffc2a13c8..9b62cba4f590 100644
--- a/sound/soc/kirkwood/kirkwood-i2s.c
+++ b/sound/soc/kirkwood/kirkwood-i2s.c
@@ -20,7 +20,6 @@
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <plat/audio.h>
-#include "kirkwood-i2s.h"
#include "kirkwood.h"
#define DRV_NAME "kirkwood-i2s"
@@ -33,13 +32,10 @@
SNDRV_PCM_FMTBIT_S24_LE | \
SNDRV_PCM_FMTBIT_S32_LE)
-
-struct snd_soc_dai kirkwood_i2s_dai;
-static struct kirkwood_dma_data *priv;
-
static int kirkwood_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
unsigned int fmt)
{
+ struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(cpu_dai);
unsigned long mask;
unsigned long value;
@@ -101,10 +97,20 @@ static inline void kirkwood_set_dco(void __iomem *io, unsigned long rate)
} while (value == 0);
}
+static int kirkwood_i2s_startup(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai);
+
+ snd_soc_dai_set_dma_data(dai, substream, priv);
+ return 0;
+}
+
static int kirkwood_i2s_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
+ struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai);
unsigned int i2s_reg, reg;
unsigned long i2s_value, value;
@@ -171,6 +177,7 @@ static int kirkwood_i2s_hw_params(struct snd_pcm_substream *substream,
static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream,
int cmd, struct snd_soc_dai *dai)
{
+ struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai);
unsigned long value;
/*
@@ -244,6 +251,7 @@ static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream,
static int kirkwood_i2s_rec_trigger(struct snd_pcm_substream *substream,
int cmd, struct snd_soc_dai *dai)
{
+ struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai);
unsigned long value;
value = readl(priv->io + KIRKWOOD_RECCTL);
@@ -323,9 +331,9 @@ static int kirkwood_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
return 0;
}
-static int kirkwood_i2s_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int kirkwood_i2s_probe(struct snd_soc_dai *dai)
{
+ struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai);
unsigned long value;
unsigned int reg_data;
@@ -359,21 +367,20 @@ static int kirkwood_i2s_probe(struct platform_device *pdev,
}
-static void kirkwood_i2s_remove(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int kirkwood_i2s_remove(struct snd_soc_dai *dai)
{
+ return 0;
}
static struct snd_soc_dai_ops kirkwood_i2s_dai_ops = {
+ .startup = kirkwood_i2s_startup,
.trigger = kirkwood_i2s_trigger,
.hw_params = kirkwood_i2s_hw_params,
.set_fmt = kirkwood_i2s_set_fmt,
};
-struct snd_soc_dai kirkwood_i2s_dai = {
- .name = DRV_NAME,
- .id = 0,
+static struct snd_soc_dai_driver kirkwood_i2s_dai = {
.probe = kirkwood_i2s_probe,
.remove = kirkwood_i2s_remove,
.playback = {
@@ -388,13 +395,13 @@ struct snd_soc_dai kirkwood_i2s_dai = {
.formats = KIRKWOOD_I2S_FORMATS,},
.ops = &kirkwood_i2s_dai_ops,
};
-EXPORT_SYMBOL_GPL(kirkwood_i2s_dai);
static __devinit int kirkwood_i2s_dev_probe(struct platform_device *pdev)
{
struct resource *mem;
struct kirkwood_asoc_platform_data *data =
pdev->dev.platform_data;
+ struct kirkwood_dma_data *priv;
int err;
priv = kzalloc(sizeof(struct kirkwood_dma_data), GFP_KERNEL);
@@ -403,6 +410,7 @@ static __devinit int kirkwood_i2s_dev_probe(struct platform_device *pdev)
err = -ENOMEM;
goto error;
}
+ dev_set_drvdata(&pdev->dev, priv);
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mem) {
@@ -441,10 +449,7 @@ static __devinit int kirkwood_i2s_dev_probe(struct platform_device *pdev)
priv->dram = data->dram;
priv->burst = data->burst;
- kirkwood_i2s_dai.capture.dma_data = priv;
- kirkwood_i2s_dai.playback.dma_data = priv;
-
- return snd_soc_register_dai(&kirkwood_i2s_dai);
+ return snd_soc_register_dai(&pdev->dev, &kirkwood_i2s_dai);
err_ioremap:
iounmap(priv->io);
@@ -458,12 +463,13 @@ error:
static __devexit int kirkwood_i2s_dev_remove(struct platform_device *pdev)
{
- if (priv) {
- iounmap(priv->io);
- release_mem_region(priv->mem->start, SZ_16K);
- kfree(priv);
- }
- snd_soc_unregister_dai(&kirkwood_i2s_dai);
+ struct kirkwood_dma_data *priv = dev_get_drvdata(&pdev->dev);
+
+ snd_soc_unregister_dai(&pdev->dev);
+ iounmap(priv->io);
+ release_mem_region(priv->mem->start, SZ_16K);
+ kfree(priv);
+
return 0;
}
diff --git a/sound/soc/kirkwood/kirkwood-i2s.h b/sound/soc/kirkwood/kirkwood-i2s.h
deleted file mode 100644
index c5595c616d7a..000000000000
--- a/sound/soc/kirkwood/kirkwood-i2s.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * kirkwood-i2s.h
- *
- * (c) 2010 Arnaud Patard <apatard@mandriva.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- */
-
-#ifndef _KIRKWOOD_I2S_H
-#define _KIRKWOOD_I2S_H
-
-extern struct snd_soc_dai kirkwood_i2s_dai;
-
-#endif
diff --git a/sound/soc/kirkwood/kirkwood-openrd.c b/sound/soc/kirkwood/kirkwood-openrd.c
index 0353d06bc41a..cc1a1e277edf 100644
--- a/sound/soc/kirkwood/kirkwood-openrd.c
+++ b/sound/soc/kirkwood/kirkwood-openrd.c
@@ -18,16 +18,14 @@
#include <mach/kirkwood.h>
#include <plat/audio.h>
#include <asm/mach-types.h>
-#include "kirkwood-i2s.h"
-#include "kirkwood-dma.h"
#include "../codecs/cs42l51.h"
static int openrd_client_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
unsigned int freq, fmt;
@@ -66,8 +64,10 @@ static struct snd_soc_dai_link openrd_client_dai[] = {
{
.name = "CS42L51",
.stream_name = "CS42L51 HiFi",
- .cpu_dai = &kirkwood_i2s_dai,
- .codec_dai = &cs42l51_dai,
+ .cpu_dai_name = "kirkwood-i2s",
+ .platform_name = "kirkwood-pcm-audio",
+ .codec_dai_name = "cs42l51_hifi",
+ .codec_name = "cs42l51-codec.0-004a",
.ops = &openrd_client_ops,
},
};
@@ -75,16 +75,10 @@ static struct snd_soc_dai_link openrd_client_dai[] = {
static struct snd_soc_card openrd_client = {
.name = "OpenRD Client",
- .platform = &kirkwood_soc_platform,
.dai_link = openrd_client_dai,
.num_links = ARRAY_SIZE(openrd_client_dai),
};
-static struct snd_soc_device openrd_client_snd_devdata = {
- .card = &openrd_client,
- .codec_dev = &soc_codec_device_cs42l51,
-};
-
static struct platform_device *openrd_client_snd_device;
static int __init openrd_client_init(void)
@@ -99,8 +93,7 @@ static int __init openrd_client_init(void)
return -ENOMEM;
platform_set_drvdata(openrd_client_snd_device,
- &openrd_client_snd_devdata);
- openrd_client_snd_devdata.dev = &openrd_client_snd_device->dev;
+ &openrd_client);
ret = platform_device_add(openrd_client_snd_device);
if (ret) {
diff --git a/sound/soc/nuc900/nuc900-ac97.c b/sound/soc/nuc900/nuc900-ac97.c
index caa7c901bc2e..02b64a17dec2 100644
--- a/sound/soc/nuc900/nuc900-ac97.c
+++ b/sound/soc/nuc900/nuc900-ac97.c
@@ -297,8 +297,7 @@ static struct snd_soc_dai_ops nuc900_ac97_dai_ops = {
.trigger = nuc900_ac97_trigger,
};
-struct snd_soc_dai nuc900_ac97_dai = {
- .name = "nuc900-ac97",
+static struct snd_soc_dai_driver nuc900_ac97_dai = {
.probe = nuc900_ac97_probe,
.remove = nuc900_ac97_remove,
.ac97_control = 1,
@@ -316,7 +315,6 @@ struct snd_soc_dai nuc900_ac97_dai = {
},
.ops = &nuc900_ac97_dai_ops,
}
-EXPORT_SYMBOL_GPL(nuc900_ac97_dai);
static int __devinit nuc900_ac97_drvprobe(struct platform_device *pdev)
{
@@ -365,9 +363,7 @@ static int __devinit nuc900_ac97_drvprobe(struct platform_device *pdev)
nuc900_ac97_data = nuc900_audio;
- nuc900_audio->dev = nuc900_ac97_dai.dev = &pdev->dev;
-
- ret = snd_soc_register_dai(&nuc900_ac97_dai);
+ ret = snd_soc_register_dai(&pdev->dev, &nuc900_ac97_dai);
if (ret)
goto out3;
@@ -390,7 +386,7 @@ out0:
static int __devexit nuc900_ac97_drvremove(struct platform_device *pdev)
{
- snd_soc_unregister_dai(&nuc900_ac97_dai);
+ snd_soc_unregister_dai(&pdev->dev);
clk_put(nuc900_ac97_data->clk);
iounmap(nuc900_ac97_data->mmio);
@@ -404,7 +400,7 @@ static int __devexit nuc900_ac97_drvremove(struct platform_device *pdev)
static struct platform_driver nuc900_ac97_driver = {
.driver = {
- .name = "nuc900-audio",
+ .name = "nuc900-ac97",
.owner = THIS_MODULE,
},
.probe = nuc900_ac97_drvprobe,
diff --git a/sound/soc/nuc900/nuc900-audio.c b/sound/soc/nuc900/nuc900-audio.c
index 72e6f518f7b2..161f5b667d7b 100644
--- a/sound/soc/nuc900/nuc900-audio.c
+++ b/sound/soc/nuc900/nuc900-audio.c
@@ -20,26 +20,21 @@
#include <sound/soc.h>
#include <sound/soc-dapm.h>
-#include "../codecs/ac97.h"
#include "nuc900-audio.h"
static struct snd_soc_dai_link nuc900evb_ac97_dai = {
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &nuc900_ac97_dai,
- .codec_dai = &ac97_dai,
+ .cpu_dai_name = "nuc900-ac97",
+ .codec_dai_name = "ac97-hifi",
+ .codec_name = "ac97-codec",
+ .platform_name = "nuc900-pcm-audio",
};
static struct snd_soc_card nuc900evb_audio_machine = {
.name = "NUC900EVB_AC97",
.dai_link = &nuc900evb_ac97_dai,
.num_links = 1,
- .platform = &nuc900_soc_platform,
-};
-
-static struct snd_soc_device nuc900evb_ac97_devdata = {
- .card = &nuc900evb_audio_machine,
- .codec_dev = &soc_codec_dev_ac97,
};
static struct platform_device *nuc900evb_asoc_dev;
@@ -54,9 +49,8 @@ static int __init nuc900evb_audio_init(void)
goto out;
/* nuc900 board audio device */
- platform_set_drvdata(nuc900evb_asoc_dev, &nuc900evb_ac97_devdata);
+ platform_set_drvdata(nuc900evb_asoc_dev, &nuc900evb_audio_machine);
- nuc900evb_ac97_devdata.dev = &nuc900evb_asoc_dev->dev;
ret = platform_device_add(nuc900evb_asoc_dev);
if (ret) {
diff --git a/sound/soc/nuc900/nuc900-audio.h b/sound/soc/nuc900/nuc900-audio.h
index 3038f519729f..aeed8ead2b2b 100644
--- a/sound/soc/nuc900/nuc900-audio.h
+++ b/sound/soc/nuc900/nuc900-audio.h
@@ -110,8 +110,4 @@ struct nuc900_audio {
};
-extern struct nuc900_audio *nuc900_ac97_data;
-extern struct snd_soc_dai nuc900_ac97_dai;
-extern struct snd_soc_platform nuc900_soc_platform;
-
#endif /*end _NUC900_AUDIO_H */
diff --git a/sound/soc/nuc900/nuc900-pcm.c b/sound/soc/nuc900/nuc900-pcm.c
index e81e803b3a63..195d1ac94771 100644
--- a/sound/soc/nuc900/nuc900-pcm.c
+++ b/sound/soc/nuc900/nuc900-pcm.c
@@ -328,26 +328,44 @@ static int nuc900_dma_new(struct snd_card *card,
return 0;
}
-struct snd_soc_platform nuc900_soc_platform = {
- .name = "nuc900-dma",
- .pcm_ops = &nuc900_dma_ops,
+static struct snd_soc_platform_driver nuc900_soc_platform = {
+ .ops = &nuc900_dma_ops,
.pcm_new = nuc900_dma_new,
.pcm_free = nuc900_dma_free_dma_buffers,
}
-EXPORT_SYMBOL_GPL(nuc900_soc_platform);
-static int __init nuc900_soc_platform_init(void)
+static int __devinit nuc900_soc_platform_probe(struct platform_device *pdev)
{
- return snd_soc_register_platform(&nuc900_soc_platform);
+ return snd_soc_register_platform(&pdev->dev, &nuc900_soc_platform);
}
-static void __exit nuc900_soc_platform_exit(void)
+static int __devexit nuc900_soc_platform_remove(struct platform_device *pdev)
{
- snd_soc_unregister_platform(&nuc900_soc_platform);
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
}
-module_init(nuc900_soc_platform_init);
-module_exit(nuc900_soc_platform_exit);
+static struct platform_driver nuc900_pcm_driver = {
+ .driver = {
+ .name = "nuc900-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = nuc900_soc_platform_probe,
+ .remove = __devexit_p(nuc900_soc_platform_remove),
+};
+
+static int __init nuc900_pcm_init(void)
+{
+ return platform_driver_register(&nuc900_pcm_driver);
+}
+module_init(nuc900_pcm_init);
+
+static void __exit nuc900_pcm_exit(void)
+{
+ platform_driver_unregister(&nuc900_pcm_driver);
+}
+module_exit(nuc900_pcm_exit);
MODULE_AUTHOR("Wan ZongShun, <mcuos.com@gmail.com>");
MODULE_DESCRIPTION("nuc900 Audio DMA module");
diff --git a/sound/soc/omap/am3517evm.c b/sound/soc/omap/am3517evm.c
index 135901b2ea11..68bd902ccd4e 100644
--- a/sound/soc/omap/am3517evm.c
+++ b/sound/soc/omap/am3517evm.c
@@ -40,8 +40,8 @@ static int am3517evm_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* Set codec DAI configuration */
@@ -111,8 +111,10 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"MICIN", NULL, "Mic In"},
};
-static int am3517evm_aic23_init(struct snd_soc_codec *codec)
+static int am3517evm_aic23_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
/* Add am3517-evm specific widgets */
snd_soc_dapm_new_controls(codec, tlv320aic23_dapm_widgets,
ARRAY_SIZE(tlv320aic23_dapm_widgets));
@@ -134,8 +136,10 @@ static int am3517evm_aic23_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link am3517evm_dai = {
.name = "TLV320AIC23",
.stream_name = "AIC23",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &tlv320aic23_dai,
+ .cpu_dai_name ="omap-mcbsp-dai.0",
+ .codec_dai_name = "tlv320aic23-hifi",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "tlv320aic23-codec",
.init = am3517evm_aic23_init,
.ops = &am3517evm_ops,
};
@@ -143,17 +147,10 @@ static struct snd_soc_dai_link am3517evm_dai = {
/* Audio machine driver */
static struct snd_soc_card snd_soc_am3517evm = {
.name = "am3517evm",
- .platform = &omap_soc_platform,
.dai_link = &am3517evm_dai,
.num_links = 1,
};
-/* Audio subsystem */
-static struct snd_soc_device am3517evm_snd_devdata = {
- .card = &snd_soc_am3517evm,
- .codec_dev = &soc_codec_dev_tlv320aic23,
-};
-
static struct platform_device *am3517evm_snd_device;
static int __init am3517evm_soc_init(void)
@@ -172,9 +169,7 @@ static int __init am3517evm_soc_init(void)
return -ENOMEM;
}
- platform_set_drvdata(am3517evm_snd_device, &am3517evm_snd_devdata);
- am3517evm_snd_devdata.dev = &am3517evm_snd_device->dev;
- *(unsigned int *)am3517evm_dai.cpu_dai->private_data = 0; /* McBSP1 */
+ platform_set_drvdata(am3517evm_snd_device, &snd_soc_am3517evm);
ret = platform_device_add(am3517evm_snd_device);
if (ret)
diff --git a/sound/soc/omap/ams-delta.c b/sound/soc/omap/ams-delta.c
index b0f618e44840..9d88efa06e3c 100644
--- a/sound/soc/omap/ams-delta.c
+++ b/sound/soc/omap/ams-delta.c
@@ -99,7 +99,7 @@ static int ams_delta_set_audio_mode(struct snd_kcontrol *kcontrol,
int pin, changed = 0;
/* Refuse any mode changes if we are not able to control the codec. */
- if (!codec->control_data)
+ if (!codec->hw_write)
return -EUNATCH;
if (ucontrol->value.enumerated.item[0] >= control->max)
@@ -268,10 +268,32 @@ static void cx81801_timeout(unsigned long data)
ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC, 0);
}
+/*
+ * Used for passing a codec structure pointer
+ * from the board initialization code to the tty line discipline.
+ */
+static struct snd_soc_codec *cx20442_codec;
+
/* Line discipline .open() */
static int cx81801_open(struct tty_struct *tty)
{
- return v253_ops.open(tty);
+ int ret;
+
+ if (!cx20442_codec)
+ return -ENODEV;
+
+ /*
+ * Pass the codec structure pointer for use by other ldisc callbacks,
+ * both the card and the codec specific parts.
+ */
+ tty->disc_data = cx20442_codec;
+
+ ret = v253_ops.open(tty);
+
+ if (ret < 0)
+ tty->disc_data = NULL;
+
+ return ret;
}
/* Line discipline .close() */
@@ -281,11 +303,14 @@ static void cx81801_close(struct tty_struct *tty)
del_timer_sync(&cx81801_timer);
- v253_ops.close(tty);
-
/* Prevent the hook switch from further changing the DAPM pins */
INIT_LIST_HEAD(&ams_delta_hook_switch.pins);
+ if (!codec)
+ return;
+
+ v253_ops.close(tty);
+
/* Revert back to default audio input/output constellation */
snd_soc_dapm_disable_pin(codec, "Mouthpiece");
snd_soc_dapm_enable_pin(codec, "Earpiece");
@@ -310,7 +335,10 @@ static void cx81801_receive(struct tty_struct *tty,
const unsigned char *c;
int apply, ret;
- if (!codec->control_data) {
+ if (!codec)
+ return;
+
+ if (!codec->hw_write) {
/* First modem response, complete setup procedure */
/* Initialize timer used for config pulse generation */
@@ -323,7 +351,7 @@ static void cx81801_receive(struct tty_struct *tty,
ARRAY_SIZE(ams_delta_hook_switch_pins),
ams_delta_hook_switch_pins);
if (ret)
- dev_warn(codec->socdev->card->dev,
+ dev_warn(codec->dev,
"Failed to link hook switch to DAPM pins, "
"will continue with hook switch unlinked.\n");
@@ -383,7 +411,7 @@ static int ams_delta_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_pcm_runtime *rtd = substream->private_data;
/* Set cpu DAI configuration */
- return snd_soc_dai_set_fmt(rtd->dai->cpu_dai,
+ return snd_soc_dai_set_fmt(rtd->cpu_dai,
SND_SOC_DAIFMT_DSP_A |
SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBM_CFM);
@@ -398,7 +426,7 @@ static struct snd_soc_ops ams_delta_ops = {
static int ams_delta_set_bias_level(struct snd_soc_card *card,
enum snd_soc_bias_level level)
{
- struct snd_soc_codec *codec = card->codec;
+ struct snd_soc_codec *codec = card->rtd->codec;
switch (level) {
case SND_SOC_BIAS_ON:
@@ -461,18 +489,22 @@ static void ams_delta_shutdown(struct snd_pcm_substream *substream)
* Card initialization
*/
-static int ams_delta_cx20442_init(struct snd_soc_codec *codec)
+static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd)
{
- struct snd_soc_dai *codec_dai = codec->dai;
- struct snd_soc_card *card = codec->socdev->card;
+ struct snd_soc_codec *codec = rtd->codec;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_card *card = rtd->card;
int ret;
/* Codec is ready, now add/activate board specific controls */
+ /* Store a pointer to the codec structure for tty ldisc use */
+ cx20442_codec = codec;
+
/* Set up digital mute if not provided by the codec */
- if (!codec_dai->ops) {
- codec_dai->ops = &ams_delta_dai_ops;
- } else if (!codec_dai->ops->digital_mute) {
- codec_dai->ops->digital_mute = ams_delta_digital_mute;
+ if (!codec_dai->driver->ops) {
+ codec_dai->driver->ops = &ams_delta_dai_ops;
+ } else if (!codec_dai->driver->ops->digital_mute) {
+ codec_dai->driver->ops->digital_mute = ams_delta_digital_mute;
} else {
ams_delta_ops.startup = ams_delta_startup;
ams_delta_ops.shutdown = ams_delta_shutdown;
@@ -483,7 +515,7 @@ static int ams_delta_cx20442_init(struct snd_soc_codec *codec)
/* Add hook switch - can be used to control the codec from userspace
* even if line discipline fails */
- ret = snd_soc_jack_new(card, "hook_switch",
+ ret = snd_soc_jack_new(rtd->codec, "hook_switch",
SND_JACK_HEADSET, &ams_delta_hook_switch);
if (ret)
dev_warn(card->dev,
@@ -551,27 +583,22 @@ static int ams_delta_cx20442_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link ams_delta_dai_link = {
.name = "CX20442",
.stream_name = "CX20442",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &cx20442_dai,
+ .cpu_dai_name ="omap-mcbsp-dai.0",
+ .codec_dai_name = "cx20442-hifi",
.init = ams_delta_cx20442_init,
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "cx20442-codec",
.ops = &ams_delta_ops,
};
/* Audio card driver */
static struct snd_soc_card ams_delta_audio_card = {
.name = "AMS_DELTA",
- .platform = &omap_soc_platform,
.dai_link = &ams_delta_dai_link,
.num_links = 1,
.set_bias_level = ams_delta_set_bias_level,
};
-/* Audio subsystem */
-static struct snd_soc_device ams_delta_snd_soc_device = {
- .card = &ams_delta_audio_card,
- .codec_dev = &cx20442_codec_dev,
-};
-
/* Module init/exit */
static struct platform_device *ams_delta_audio_platform_device;
static struct platform_device *cx20442_platform_device;
@@ -589,9 +616,7 @@ static int __init ams_delta_module_init(void)
return -ENOMEM;
platform_set_drvdata(ams_delta_audio_platform_device,
- &ams_delta_snd_soc_device);
- ams_delta_snd_soc_device.dev = &ams_delta_audio_platform_device->dev;
- *(unsigned int *)ams_delta_dai_link.cpu_dai->private_data = OMAP_MCBSP1;
+ &ams_delta_audio_card);
ret = platform_device_add(ams_delta_audio_platform_device);
if (ret)
@@ -601,8 +626,8 @@ static int __init ams_delta_module_init(void)
* Codec platform device could be registered from elsewhere (board?),
* but I do it here as it makes sense only if used with the card.
*/
- cx20442_platform_device = platform_device_register_simple("cx20442",
- -1, NULL, 0);
+ cx20442_platform_device =
+ platform_device_register_simple("cx20442-codec", -1, NULL, 0);
return 0;
err:
platform_device_put(ams_delta_audio_platform_device);
@@ -612,19 +637,6 @@ module_init(ams_delta_module_init);
static void __exit ams_delta_module_exit(void)
{
- struct snd_soc_codec *codec;
- struct tty_struct *tty;
-
- if (ams_delta_audio_card.codec) {
- codec = ams_delta_audio_card.codec;
-
- if (codec->control_data) {
- tty = codec->control_data;
-
- tty_hangup(tty);
- }
- }
-
if (tty_unregister_ldisc(N_V253) != 0)
dev_warn(&ams_delta_audio_platform_device->dev,
"failed to unregister V253 line discipline\n");
diff --git a/sound/soc/omap/igep0020.c b/sound/soc/omap/igep0020.c
index 3583c429f9be..d296cfcc672e 100644
--- a/sound/soc/omap/igep0020.c
+++ b/sound/soc/omap/igep0020.c
@@ -33,14 +33,13 @@
#include "omap-mcbsp.h"
#include "omap-pcm.h"
-#include "../codecs/twl4030.h"
static int igep2_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* Set codec DAI configuration */
@@ -82,25 +81,20 @@ static struct snd_soc_ops igep2_ops = {
static struct snd_soc_dai_link igep2_dai = {
.name = "TWL4030",
.stream_name = "TWL4030",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI],
+ .cpu_dai_name = "omap-mcbsp-dai.1",
+ .codec_dai_name = "twl4030-hifi",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "twl4030-codec",
.ops = &igep2_ops,
};
/* Audio machine driver */
static struct snd_soc_card snd_soc_card_igep2 = {
.name = "igep2",
- .platform = &omap_soc_platform,
.dai_link = &igep2_dai,
.num_links = 1,
};
-/* Audio subsystem */
-static struct snd_soc_device igep2_snd_devdata = {
- .card = &snd_soc_card_igep2,
- .codec_dev = &soc_codec_dev_twl4030,
-};
-
static struct platform_device *igep2_snd_device;
static int __init igep2_soc_init(void)
@@ -119,9 +113,7 @@ static int __init igep2_soc_init(void)
return -ENOMEM;
}
- platform_set_drvdata(igep2_snd_device, &igep2_snd_devdata);
- igep2_snd_devdata.dev = &igep2_snd_device->dev;
- *(unsigned int *)igep2_dai.cpu_dai->private_data = 1; /* McBSP2 */
+ platform_set_drvdata(igep2_snd_device, &snd_soc_card_igep2);
ret = platform_device_add(igep2_snd_device);
if (ret)
diff --git a/sound/soc/omap/mcpdm.c b/sound/soc/omap/mcpdm.c
index 90b8bf71c893..928f03707451 100644
--- a/sound/soc/omap/mcpdm.c
+++ b/sound/soc/omap/mcpdm.c
@@ -402,7 +402,7 @@ int omap_mcpdm_set_offset(int offset1, int offset2)
return 0;
}
-static int __devinit omap_mcpdm_probe(struct platform_device *pdev)
+int __devinit omap_mcpdm_probe(struct platform_device *pdev)
{
struct resource *res;
int ret = 0;
@@ -449,7 +449,7 @@ exit:
return ret;
}
-static int __devexit omap_mcpdm_remove(struct platform_device *pdev)
+int __devexit omap_mcpdm_remove(struct platform_device *pdev)
{
struct omap_mcpdm *mcpdm_ptr = platform_get_drvdata(pdev);
@@ -468,18 +468,3 @@ static int __devexit omap_mcpdm_remove(struct platform_device *pdev)
return 0;
}
-static struct platform_driver omap_mcpdm_driver = {
- .probe = omap_mcpdm_probe,
- .remove = __devexit_p(omap_mcpdm_remove),
- .driver = {
- .name = "omap-mcpdm",
- },
-};
-
-static struct platform_device *omap_mcpdm_device;
-
-static int __init omap_mcpdm_init(void)
-{
- return platform_driver_register(&omap_mcpdm_driver);
-}
-arch_initcall(omap_mcpdm_init);
diff --git a/sound/soc/omap/mcpdm.h b/sound/soc/omap/mcpdm.h
index 7bb326ef0886..df3e16fb51f3 100644
--- a/sound/soc/omap/mcpdm.h
+++ b/sound/soc/omap/mcpdm.h
@@ -149,3 +149,5 @@ extern int omap_mcpdm_playback_close(struct omap_mcpdm_link *downlink);
extern int omap_mcpdm_request(void);
extern void omap_mcpdm_free(void);
extern int omap_mcpdm_set_offset(int offset1, int offset2);
+int __devinit omap_mcpdm_probe(struct platform_device *pdev);
+int __devexit omap_mcpdm_remove(struct platform_device *pdev);
diff --git a/sound/soc/omap/n810.c b/sound/soc/omap/n810.c
index 08e09d72790f..a3b6d897ad84 100644
--- a/sound/soc/omap/n810.c
+++ b/sound/soc/omap/n810.c
@@ -97,7 +97,7 @@ static int n810_startup(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_codec *codec = rtd->socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
snd_pcm_hw_constraint_minmax(runtime,
SNDRV_PCM_HW_PARAM_CHANNELS, 2, 2);
@@ -115,8 +115,8 @@ static int n810_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int err;
/* Set codec DAI configuration */
@@ -271,8 +271,9 @@ static const struct snd_kcontrol_new aic33_n810_controls[] = {
n810_get_input, n810_set_input),
};
-static int n810_aic33_init(struct snd_soc_codec *codec)
+static int n810_aic33_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int err;
/* Not connected */
@@ -307,8 +308,10 @@ static int n810_aic33_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link n810_dai = {
.name = "TLV320AIC33",
.stream_name = "AIC33",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &aic3x_dai,
+ .cpu_dai_name = "omap-mcbsp-dai.1",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "tlv320aic3x-codec.2-0018",
+ .codec_dai_name = "tlv320aic3x-hifi",
.init = n810_aic33_init,
.ops = &n810_ops,
};
@@ -316,33 +319,12 @@ static struct snd_soc_dai_link n810_dai = {
/* Audio machine driver */
static struct snd_soc_card snd_soc_n810 = {
.name = "N810",
- .platform = &omap_soc_platform,
.dai_link = &n810_dai,
.num_links = 1,
};
-/* Audio private data */
-static struct aic3x_setup_data n810_aic33_setup = {
- .gpio_func[0] = AIC3X_GPIO1_FUNC_DISABLED,
- .gpio_func[1] = AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT,
-};
-
-/* Audio subsystem */
-static struct snd_soc_device n810_snd_devdata = {
- .card = &snd_soc_n810,
- .codec_dev = &soc_codec_dev_aic3x,
- .codec_data = &n810_aic33_setup,
-};
-
static struct platform_device *n810_snd_device;
-/* temporary i2c device creation until this can be moved into the machine
- * support file.
-*/
-static struct i2c_board_info i2c_device[] = {
- { I2C_BOARD_INFO("tlv320aic3x", 0x1b), }
-};
-
static int __init n810_soc_init(void)
{
int err;
@@ -351,15 +333,11 @@ static int __init n810_soc_init(void)
if (!(machine_is_nokia_n810() || machine_is_nokia_n810_wimax()))
return -ENODEV;
- i2c_register_board_info(1, i2c_device, ARRAY_SIZE(i2c_device));
-
n810_snd_device = platform_device_alloc("soc-audio", -1);
if (!n810_snd_device)
return -ENOMEM;
- platform_set_drvdata(n810_snd_device, &n810_snd_devdata);
- n810_snd_devdata.dev = &n810_snd_device->dev;
- *(unsigned int *)n810_dai.cpu_dai->private_data = 1; /* McBSP2 */
+ platform_set_drvdata(n810_snd_device, &snd_soc_n810);
err = platform_device_add(n810_snd_device);
if (err)
goto err1;
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c
index 86f213905e2c..7ba5690118f8 100644
--- a/sound/soc/omap/omap-mcbsp.c
+++ b/sound/soc/omap/omap-mcbsp.c
@@ -62,8 +62,6 @@ struct omap_mcbsp_data {
int wlen;
};
-#define to_mcbsp(priv) container_of((priv), struct omap_mcbsp_data, bus_id)
-
static struct omap_mcbsp_data mcbsp_data[NUM_LINKS];
/*
@@ -153,13 +151,13 @@ static const unsigned long omap34xx_mcbsp_port[][2] = {};
static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai);
struct omap_pcm_dma_data *dma_data;
int dma_op_mode = omap_mcbsp_get_dma_op_mode(mcbsp_data->bus_id);
int words;
- dma_data = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
/* TODO: Currently, MODE_ELEMENT == MODE_FRAME */
if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD)
@@ -203,11 +201,9 @@ static int omap_mcbsp_hwrule_min_buffersize(struct snd_pcm_hw_params *params,
}
static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream,
- struct snd_soc_dai *dai)
+ struct snd_soc_dai *cpu_dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
+ struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai);
int bus_id = mcbsp_data->bus_id;
int err = 0;
@@ -249,11 +245,9 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream,
}
static void omap_mcbsp_dai_shutdown(struct snd_pcm_substream *substream,
- struct snd_soc_dai *dai)
+ struct snd_soc_dai *cpu_dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
+ struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai);
if (!cpu_dai->active) {
omap_mcbsp_free(mcbsp_data->bus_id);
@@ -262,11 +256,9 @@ static void omap_mcbsp_dai_shutdown(struct snd_pcm_substream *substream,
}
static int omap_mcbsp_dai_trigger(struct snd_pcm_substream *substream, int cmd,
- struct snd_soc_dai *dai)
+ struct snd_soc_dai *cpu_dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
+ struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai);
int err = 0, play = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
switch (cmd) {
@@ -295,8 +287,8 @@ static snd_pcm_sframes_t omap_mcbsp_dai_delay(
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai);
u16 fifo_use;
snd_pcm_sframes_t delay;
@@ -317,11 +309,9 @@ static snd_pcm_sframes_t omap_mcbsp_dai_delay(
static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
- struct snd_soc_dai *dai)
+ struct snd_soc_dai *cpu_dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
+ struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai);
struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs;
struct omap_pcm_dma_data *dma_data;
int dma, bus_id = mcbsp_data->bus_id;
@@ -496,7 +486,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai,
unsigned int fmt)
{
- struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
+ struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai);
struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs;
unsigned int temp_fmt = fmt;
@@ -596,7 +586,7 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai,
static int omap_mcbsp_dai_set_clkdiv(struct snd_soc_dai *cpu_dai,
int div_id, int div)
{
- struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
+ struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai);
struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs;
if (div_id != OMAP_MCBSP_CLKGDV)
@@ -699,7 +689,7 @@ static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
int clk_id, unsigned int freq,
int dir)
{
- struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
+ struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai);
struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs;
int err = 0;
@@ -733,7 +723,7 @@ static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
return err;
}
-static struct snd_soc_dai_ops omap_mcbsp_dai_ops = {
+static struct snd_soc_dai_ops mcbsp_dai_ops = {
.startup = omap_mcbsp_dai_startup,
.shutdown = omap_mcbsp_dai_shutdown,
.trigger = omap_mcbsp_dai_trigger,
@@ -744,42 +734,31 @@ static struct snd_soc_dai_ops omap_mcbsp_dai_ops = {
.set_sysclk = omap_mcbsp_dai_set_dai_sysclk,
};
-#define OMAP_MCBSP_DAI_BUILDER(link_id) \
-{ \
- .name = "omap-mcbsp-dai-"#link_id, \
- .id = (link_id), \
- .playback = { \
- .channels_min = 1, \
- .channels_max = 16, \
- .rates = OMAP_MCBSP_RATES, \
- .formats = SNDRV_PCM_FMTBIT_S16_LE | \
- SNDRV_PCM_FMTBIT_S32_LE, \
- }, \
- .capture = { \
- .channels_min = 1, \
- .channels_max = 16, \
- .rates = OMAP_MCBSP_RATES, \
- .formats = SNDRV_PCM_FMTBIT_S16_LE | \
- SNDRV_PCM_FMTBIT_S32_LE, \
- }, \
- .ops = &omap_mcbsp_dai_ops, \
- .private_data = &mcbsp_data[(link_id)].bus_id, \
+static int mcbsp_dai_probe(struct snd_soc_dai *dai)
+{
+ mcbsp_data[dai->id].bus_id = dai->id;
+ snd_soc_dai_set_drvdata(dai, &mcbsp_data[dai->id].bus_id);
+ return 0;
}
-struct snd_soc_dai omap_mcbsp_dai[] = {
- OMAP_MCBSP_DAI_BUILDER(0),
- OMAP_MCBSP_DAI_BUILDER(1),
-#if NUM_LINKS >= 3
- OMAP_MCBSP_DAI_BUILDER(2),
-#endif
-#if NUM_LINKS == 5
- OMAP_MCBSP_DAI_BUILDER(3),
- OMAP_MCBSP_DAI_BUILDER(4),
-#endif
+static struct snd_soc_dai_driver omap_mcbsp_dai =
+{
+ .probe = mcbsp_dai_probe,
+ .playback = {
+ .channels_min = 1,
+ .channels_max = 16,
+ .rates = OMAP_MCBSP_RATES,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE,
+ },
+ .capture = {
+ .channels_min = 1,
+ .channels_max = 16,
+ .rates = OMAP_MCBSP_RATES,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE,
+ },
+ .ops = &mcbsp_dai_ops,
};
-EXPORT_SYMBOL_GPL(omap_mcbsp_dai);
-
int omap_mcbsp_st_info_volsw(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
@@ -910,16 +889,36 @@ int omap_mcbsp_st_add_controls(struct snd_soc_codec *codec, int mcbsp_id)
}
EXPORT_SYMBOL_GPL(omap_mcbsp_st_add_controls);
+static __devinit int asoc_mcbsp_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_dai(&pdev->dev, &omap_mcbsp_dai);
+}
+
+static int __devexit asoc_mcbsp_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_dai(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver asoc_mcbsp_driver = {
+ .driver = {
+ .name = "omap-mcbsp-dai",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = asoc_mcbsp_probe,
+ .remove = __devexit_p(asoc_mcbsp_remove),
+};
+
static int __init snd_omap_mcbsp_init(void)
{
- return snd_soc_register_dais(omap_mcbsp_dai,
- ARRAY_SIZE(omap_mcbsp_dai));
+ return platform_driver_register(&asoc_mcbsp_driver);
}
module_init(snd_omap_mcbsp_init);
static void __exit snd_omap_mcbsp_exit(void)
{
- snd_soc_unregister_dais(omap_mcbsp_dai, ARRAY_SIZE(omap_mcbsp_dai));
+ platform_driver_unregister(&asoc_mcbsp_driver);
}
module_exit(snd_omap_mcbsp_exit);
diff --git a/sound/soc/omap/omap-mcbsp.h b/sound/soc/omap/omap-mcbsp.h
index 6c363e5f4387..ffdcc5abb7b9 100644
--- a/sound/soc/omap/omap-mcbsp.h
+++ b/sound/soc/omap/omap-mcbsp.h
@@ -55,8 +55,6 @@ enum omap_mcbsp_div {
#define NUM_LINKS 5
#endif
-extern struct snd_soc_dai omap_mcbsp_dai[NUM_LINKS];
-
int omap_mcbsp_st_add_controls(struct snd_soc_codec *codec, int mcbsp_id);
#endif
diff --git a/sound/soc/omap/omap-mcpdm.c b/sound/soc/omap/omap-mcpdm.c
index b7f4f7e015f3..f161c2f5ed36 100644
--- a/sound/soc/omap/omap-mcpdm.c
+++ b/sound/soc/omap/omap-mcpdm.c
@@ -36,7 +36,6 @@
#include <plat/dma.h>
#include <plat/mcbsp.h>
#include "mcpdm.h"
-#include "omap-mcpdm.h"
#include "omap-pcm.h"
struct omap_mcpdm_data {
@@ -89,11 +88,9 @@ static struct omap_pcm_dma_data omap_mcpdm_dai_dma_params[] = {
static int omap_mcpdm_dai_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
int err = 0;
- if (!cpu_dai->active)
+ if (!dai->active)
err = omap_mcpdm_request();
return err;
@@ -102,19 +99,14 @@ static int omap_mcpdm_dai_startup(struct snd_pcm_substream *substream,
static void omap_mcpdm_dai_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
-
- if (!cpu_dai->active)
+ if (!dai->active)
omap_mcpdm_free();
}
static int omap_mcpdm_dai_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct omap_mcpdm_data *mcpdm_priv = cpu_dai->private_data;
+ struct omap_mcpdm_data *mcpdm_priv = snd_soc_dai_get_drvdata(dai);
int stream = substream->stream;
int err = 0;
@@ -143,14 +135,12 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct omap_mcpdm_data *mcpdm_priv = cpu_dai->private_data;
+ struct omap_mcpdm_data *mcpdm_priv = snd_soc_dai_get_drvdata(dai);
struct omap_mcpdm_link *mcpdm_links = mcpdm_priv->links;
int stream = substream->stream;
int channels, err, link_mask = 0;
- snd_soc_dai_set_dma_data(cpu_dai, substream,
+ snd_soc_dai_set_dma_data(dai, substream,
&omap_mcpdm_dai_dma_params[stream]);
channels = params_channels(params);
@@ -189,9 +179,7 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream,
static int omap_mcpdm_dai_hw_free(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct omap_mcpdm_data *mcpdm_priv = cpu_dai->private_data;
+ struct omap_mcpdm_data *mcpdm_priv = snd_soc_dai_get_drvdata(dai);
struct omap_mcpdm_link *mcpdm_links = mcpdm_priv->links;
int stream = substream->stream;
int err;
@@ -215,9 +203,14 @@ static struct snd_soc_dai_ops omap_mcpdm_dai_ops = {
#define OMAP_MCPDM_RATES (SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
#define OMAP_MCPDM_FORMATS (SNDRV_PCM_FMTBIT_S32_LE)
-struct snd_soc_dai omap_mcpdm_dai = {
- .name = "omap-mcpdm",
- .id = -1,
+static int omap_mcpdm_dai_probe(struct snd_soc_dai *dai)
+{
+ snd_soc_dai_set_drvdata(dai, &mcpdm_data);
+ return 0;
+}
+
+static struct snd_soc_dai_driver omap_mcpdm_dai = {
+ .probe = omap_mcpdm_dai_probe,
.playback = {
.channels_min = 1,
.channels_max = 4,
@@ -231,19 +224,47 @@ struct snd_soc_dai omap_mcpdm_dai = {
.formats = OMAP_MCPDM_FORMATS,
},
.ops = &omap_mcpdm_dai_ops,
- .private_data = &mcpdm_data,
};
-EXPORT_SYMBOL_GPL(omap_mcpdm_dai);
+
+static __devinit int asoc_mcpdm_probe(struct platform_device *pdev)
+{
+ int ret;
+
+ ret = omap_mcpdm_probe(pdev);
+ if (ret < 0)
+ return ret;
+ ret = snd_soc_register_dai(&pdev->dev, &omap_mcpdm_dai);
+ if (ret < 0)
+ omap_mcpdm_remove(pdev);
+ return ret;
+}
+
+static int __devexit asoc_mcpdm_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_dai(&pdev->dev);
+ omap_mcpdm_remove(pdev);
+ return 0;
+}
+
+static struct platform_driver asoc_mcpdm_driver = {
+ .driver = {
+ .name = "omap-mcpdm-dai",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = asoc_mcpdm_probe,
+ .remove = __devexit_p(asoc_mcpdm_remove),
+};
static int __init snd_omap_mcpdm_init(void)
{
- return snd_soc_register_dai(&omap_mcpdm_dai);
+ return platform_driver_register(&asoc_mcpdm_driver);
}
module_init(snd_omap_mcpdm_init);
static void __exit snd_omap_mcpdm_exit(void)
{
- snd_soc_unregister_dai(&omap_mcpdm_dai);
+ platform_driver_unregister(&asoc_mcpdm_driver);
}
module_exit(snd_omap_mcpdm_exit);
diff --git a/sound/soc/omap/omap-mcpdm.h b/sound/soc/omap/omap-mcpdm.h
deleted file mode 100644
index 73b80d559345..000000000000
--- a/sound/soc/omap/omap-mcpdm.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * omap-mcpdm.h
- *
- * Copyright (C) 2009 Texas Instruments
- *
- * Contact: Misael Lopez Cruz <x0052729@ti.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- *
- */
-
-#ifndef __OMAP_MCPDM_H__
-#define __OMAP_MCPDM_H__
-
-extern struct snd_soc_dai omap_mcpdm_dai;
-
-#endif /* End of __OMAP_MCPDM_H__ */
diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c
index 1e521904ea64..8caeb8d305c3 100644
--- a/sound/soc/omap/omap-pcm.c
+++ b/sound/soc/omap/omap-pcm.c
@@ -101,9 +101,10 @@ static int omap_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct omap_runtime_data *prtd = runtime->private_data;
struct omap_pcm_dma_data *dma_data;
+
int err = 0;
- dma_data = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
/* return if this is a bufferless transfer e.g.
* codec <--> BT codec or GSM modem -- lg FIXME */
@@ -374,14 +375,14 @@ static int omap_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = DMA_BIT_MASK(64);
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
ret = omap_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK);
if (ret)
goto out;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
ret = omap_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE);
if (ret)
@@ -392,25 +393,45 @@ out:
return ret;
}
-struct snd_soc_platform omap_soc_platform = {
- .name = "omap-pcm-audio",
- .pcm_ops = &omap_pcm_ops,
+static struct snd_soc_platform_driver omap_soc_platform = {
+ .ops = &omap_pcm_ops,
.pcm_new = omap_pcm_new,
.pcm_free = omap_pcm_free_dma_buffers,
};
-EXPORT_SYMBOL_GPL(omap_soc_platform);
-static int __init omap_soc_platform_init(void)
+static __devinit int omap_pcm_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_platform(&pdev->dev,
+ &omap_soc_platform);
+}
+
+static int __devexit omap_pcm_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver omap_pcm_driver = {
+ .driver = {
+ .name = "omap-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = omap_pcm_probe,
+ .remove = __devexit_p(omap_pcm_remove),
+};
+
+static int __init snd_omap_pcm_init(void)
{
- return snd_soc_register_platform(&omap_soc_platform);
+ return platform_driver_register(&omap_pcm_driver);
}
-module_init(omap_soc_platform_init);
+module_init(snd_omap_pcm_init);
-static void __exit omap_soc_platform_exit(void)
+static void __exit snd_omap_pcm_exit(void)
{
- snd_soc_unregister_platform(&omap_soc_platform);
+ platform_driver_unregister(&omap_pcm_driver);
}
-module_exit(omap_soc_platform_exit);
+module_exit(snd_omap_pcm_exit);
MODULE_AUTHOR("Jarkko Nikula <jhnikula@gmail.com>");
MODULE_DESCRIPTION("OMAP PCM DMA module");
diff --git a/sound/soc/omap/omap-pcm.h b/sound/soc/omap/omap-pcm.h
index b19975d26907..fea0515331fb 100644
--- a/sound/soc/omap/omap-pcm.h
+++ b/sound/soc/omap/omap-pcm.h
@@ -35,6 +35,4 @@ struct omap_pcm_dma_data {
int packet_size; /* packet size only in PACKET mode */
};
-extern struct snd_soc_platform omap_soc_platform;
-
#endif
diff --git a/sound/soc/omap/omap2evm.c b/sound/soc/omap/omap2evm.c
index c7adea38274c..38cd1894623e 100644
--- a/sound/soc/omap/omap2evm.c
+++ b/sound/soc/omap/omap2evm.c
@@ -35,15 +35,13 @@
#include "omap-mcbsp.h"
#include "omap-pcm.h"
-#include "../codecs/twl4030.h"
static int omap2evm_hw_params(struct snd_pcm_substream *substream,
- struct snd_pcm_hw_params *params,
- struct snd_soc_dai *dai)
+ struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* Set codec DAI configuration */
@@ -85,25 +83,20 @@ static struct snd_soc_ops omap2evm_ops = {
static struct snd_soc_dai_link omap2evm_dai = {
.name = "TWL4030",
.stream_name = "TWL4030",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI],
+ .cpu_dai_name = "omap-mcbsp-dai.1",
+ .codec_dai_name = "twl4030-hifi",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "twl4030-codec",
.ops = &omap2evm_ops,
};
/* Audio machine driver */
static struct snd_soc_card snd_soc_omap2evm = {
.name = "omap2evm",
- .platform = &omap_soc_platform,
.dai_link = &omap2evm_dai,
.num_links = 1,
};
-/* Audio subsystem */
-static struct snd_soc_device omap2evm_snd_devdata = {
- .card = &snd_soc_omap2evm,
- .codec_dev = &soc_codec_dev_twl4030,
-};
-
static struct platform_device *omap2evm_snd_device;
static int __init omap2evm_soc_init(void)
@@ -122,9 +115,7 @@ static int __init omap2evm_soc_init(void)
return -ENOMEM;
}
- platform_set_drvdata(omap2evm_snd_device, &omap2evm_snd_devdata);
- omap2evm_snd_devdata.dev = &omap2evm_snd_device->dev;
- *(unsigned int *)omap2evm_dai.cpu_dai->private_data = 1; /* McBSP2 */
+ platform_set_drvdata(omap2evm_snd_device, &snd_soc_omap2evm);
ret = platform_device_add(omap2evm_snd_device);
if (ret)
diff --git a/sound/soc/omap/omap3beagle.c b/sound/soc/omap/omap3beagle.c
index 240e0975dd6a..7c11e1afe9e6 100644
--- a/sound/soc/omap/omap3beagle.c
+++ b/sound/soc/omap/omap3beagle.c
@@ -33,14 +33,13 @@
#include "omap-mcbsp.h"
#include "omap-pcm.h"
-#include "../codecs/twl4030.h"
static int omap3beagle_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int fmt;
int ret;
@@ -92,25 +91,21 @@ static struct snd_soc_ops omap3beagle_ops = {
static struct snd_soc_dai_link omap3beagle_dai = {
.name = "TWL4030",
.stream_name = "TWL4030",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI],
+ .cpu_dai_name = "omap-mcbsp-dai.1",
+ .platform_name = "omap-pcm-audio",
+ .codec_dai_name = "twl4030-hifi",
+ .codec_name = "twl4030-codec",
.ops = &omap3beagle_ops,
};
/* Audio machine driver */
static struct snd_soc_card snd_soc_omap3beagle = {
.name = "omap3beagle",
- .platform = &omap_soc_platform,
+ .owner = THIS_MODULE,
.dai_link = &omap3beagle_dai,
.num_links = 1,
};
-/* Audio subsystem */
-static struct snd_soc_device omap3beagle_snd_devdata = {
- .card = &snd_soc_omap3beagle,
- .codec_dev = &soc_codec_dev_twl4030,
-};
-
static struct platform_device *omap3beagle_snd_device;
static int __init omap3beagle_soc_init(void)
@@ -129,9 +124,7 @@ static int __init omap3beagle_soc_init(void)
return -ENOMEM;
}
- platform_set_drvdata(omap3beagle_snd_device, &omap3beagle_snd_devdata);
- omap3beagle_snd_devdata.dev = &omap3beagle_snd_device->dev;
- *(unsigned int *)omap3beagle_dai.cpu_dai->private_data = 1; /* McBSP2 */
+ platform_set_drvdata(omap3beagle_snd_device, &snd_soc_omap3beagle);
ret = platform_device_add(omap3beagle_snd_device);
if (ret)
diff --git a/sound/soc/omap/omap3evm.c b/sound/soc/omap/omap3evm.c
index dfcb344092e4..1ac5babef00d 100644
--- a/sound/soc/omap/omap3evm.c
+++ b/sound/soc/omap/omap3evm.c
@@ -31,14 +31,13 @@
#include "omap-mcbsp.h"
#include "omap-pcm.h"
-#include "../codecs/twl4030.h"
static int omap3evm_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* Set codec DAI configuration */
@@ -80,32 +79,20 @@ static struct snd_soc_ops omap3evm_ops = {
static struct snd_soc_dai_link omap3evm_dai = {
.name = "TWL4030",
.stream_name = "TWL4030",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI],
+ .cpu_dai_name = "omap-mcbsp-dai.1",
+ .codec_dai_name = "twl4030-hifi",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "twl4030-codec",
.ops = &omap3evm_ops,
};
/* Audio machine driver */
static struct snd_soc_card snd_soc_omap3evm = {
.name = "omap3evm",
- .platform = &omap_soc_platform,
.dai_link = &omap3evm_dai,
.num_links = 1,
};
-/* twl4030 setup */
-static struct twl4030_setup_data twl4030_setup = {
- .ramp_delay_value = 4,
- .sysclk = 26000,
-};
-
-/* Audio subsystem */
-static struct snd_soc_device omap3evm_snd_devdata = {
- .card = &snd_soc_omap3evm,
- .codec_dev = &soc_codec_dev_twl4030,
- .codec_data = &twl4030_setup,
-};
-
static struct platform_device *omap3evm_snd_device;
static int __init omap3evm_soc_init(void)
@@ -124,10 +111,7 @@ static int __init omap3evm_soc_init(void)
return -ENOMEM;
}
- platform_set_drvdata(omap3evm_snd_device, &omap3evm_snd_devdata);
- omap3evm_snd_devdata.dev = &omap3evm_snd_device->dev;
- *(unsigned int *)omap3evm_dai.cpu_dai->private_data = 1;
-
+ platform_set_drvdata(omap3evm_snd_device, &snd_soc_omap3evm);
ret = platform_device_add(omap3evm_snd_device);
if (ret)
goto err1;
diff --git a/sound/soc/omap/omap3pandora.c b/sound/soc/omap/omap3pandora.c
index 9eecac135bbb..dbd9d96b5f92 100644
--- a/sound/soc/omap/omap3pandora.c
+++ b/sound/soc/omap/omap3pandora.c
@@ -31,10 +31,10 @@
#include <sound/soc-dapm.h>
#include <asm/mach-types.h>
+#include <plat/mcbsp.h>
#include "omap-mcbsp.h"
#include "omap-pcm.h"
-#include "../codecs/twl4030.h"
#define OMAP3_PANDORA_DAC_POWER_GPIO 118
#define OMAP3_PANDORA_AMP_POWER_GPIO 14
@@ -47,8 +47,8 @@ static int omap3pandora_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBS_CFS;
int ret;
@@ -167,8 +167,9 @@ static const struct snd_soc_dapm_route omap3pandora_in_map[] = {
{"Mic Bias 2", NULL, "Mic (external)"},
};
-static int omap3pandora_out_init(struct snd_soc_codec *codec)
+static int omap3pandora_out_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int ret;
/* All TWL4030 output pins are floating */
@@ -194,8 +195,9 @@ static int omap3pandora_out_init(struct snd_soc_codec *codec)
return snd_soc_dapm_sync(codec);
}
-static int omap3pandora_in_init(struct snd_soc_codec *codec)
+static int omap3pandora_in_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int ret;
/* Not comnnected */
@@ -224,15 +226,19 @@ static struct snd_soc_dai_link omap3pandora_dai[] = {
{
.name = "PCM1773",
.stream_name = "HiFi Out",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI],
+ .cpu_dai_name = "omap-mcbsp-dai.1",
+ .codec_dai_name = "twl4030-hifi",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "twl4030-codec",
.ops = &omap3pandora_ops,
.init = omap3pandora_out_init,
}, {
.name = "TWL4030",
.stream_name = "Line/Mic In",
- .cpu_dai = &omap_mcbsp_dai[1],
- .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI],
+ .cpu_dai_name = "omap-mcbsp-dai.3",
+ .codec_dai_name = "twl4030-hifi",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "twl4030-codec",
.ops = &omap3pandora_ops,
.init = omap3pandora_in_init,
}
@@ -241,17 +247,10 @@ static struct snd_soc_dai_link omap3pandora_dai[] = {
/* SoC card */
static struct snd_soc_card snd_soc_card_omap3pandora = {
.name = "omap3pandora",
- .platform = &omap_soc_platform,
.dai_link = omap3pandora_dai,
.num_links = ARRAY_SIZE(omap3pandora_dai),
};
-/* Audio subsystem */
-static struct snd_soc_device omap3pandora_snd_data = {
- .card = &snd_soc_card_omap3pandora,
- .codec_dev = &soc_codec_dev_twl4030,
-};
-
static struct platform_device *omap3pandora_snd_device;
static int __init omap3pandora_soc_init(void)
@@ -294,10 +293,7 @@ static int __init omap3pandora_soc_init(void)
goto fail1;
}
- platform_set_drvdata(omap3pandora_snd_device, &omap3pandora_snd_data);
- omap3pandora_snd_data.dev = &omap3pandora_snd_device->dev;
- *(unsigned int *)omap_mcbsp_dai[0].private_data = 1; /* McBSP2 */
- *(unsigned int *)omap_mcbsp_dai[1].private_data = 3; /* McBSP4 */
+ platform_set_drvdata(omap3pandora_snd_device, &snd_soc_card_omap3pandora);
ret = platform_device_add(omap3pandora_snd_device);
if (ret) {
diff --git a/sound/soc/omap/osk5912.c b/sound/soc/omap/osk5912.c
index 498ca2e03519..f0e662556428 100644
--- a/sound/soc/omap/osk5912.c
+++ b/sound/soc/omap/osk5912.c
@@ -55,8 +55,8 @@ static int osk_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int err;
/* Set codec DAI configuration */
@@ -113,8 +113,9 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"MICIN", NULL, "Mic Jack"},
};
-static int osk_tlv320aic23_init(struct snd_soc_codec *codec)
+static int osk_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
/* Add osk5912 specific widgets */
snd_soc_dapm_new_controls(codec, tlv320aic23_dapm_widgets,
@@ -136,8 +137,10 @@ static int osk_tlv320aic23_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link osk_dai = {
.name = "TLV320AIC23",
.stream_name = "AIC23",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &tlv320aic23_dai,
+ .cpu_dai_name = "omap-mcbsp-dai.0",
+ .codec_dai_name = "tlv320aic23-hifi",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "tlv320aic23-codec",
.init = osk_tlv320aic23_init,
.ops = &osk_ops,
};
@@ -145,17 +148,10 @@ static struct snd_soc_dai_link osk_dai = {
/* Audio machine driver */
static struct snd_soc_card snd_soc_card_osk = {
.name = "OSK5912",
- .platform = &omap_soc_platform,
.dai_link = &osk_dai,
.num_links = 1,
};
-/* Audio subsystem */
-static struct snd_soc_device osk_snd_devdata = {
- .card = &snd_soc_card_osk,
- .codec_dev = &soc_codec_dev_tlv320aic23,
-};
-
static struct platform_device *osk_snd_device;
static int __init osk_soc_init(void)
@@ -171,9 +167,7 @@ static int __init osk_soc_init(void)
if (!osk_snd_device)
return -ENOMEM;
- platform_set_drvdata(osk_snd_device, &osk_snd_devdata);
- osk_snd_devdata.dev = &osk_snd_device->dev;
- *(unsigned int *)osk_dai.cpu_dai->private_data = 0; /* McBSP1 */
+ platform_set_drvdata(osk_snd_device, &snd_soc_card_osk);
err = platform_device_add(osk_snd_device);
if (err)
goto err1;
diff --git a/sound/soc/omap/overo.c b/sound/soc/omap/overo.c
index c25f5276ad6f..e95a607937de 100644
--- a/sound/soc/omap/overo.c
+++ b/sound/soc/omap/overo.c
@@ -33,14 +33,13 @@
#include "omap-mcbsp.h"
#include "omap-pcm.h"
-#include "../codecs/twl4030.h"
static int overo_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* Set codec DAI configuration */
@@ -82,25 +81,20 @@ static struct snd_soc_ops overo_ops = {
static struct snd_soc_dai_link overo_dai = {
.name = "TWL4030",
.stream_name = "TWL4030",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI],
+ .cpu_dai_name = "omap-mcbsp-dai.1",
+ .codec_dai_name = "twl4030-hifi",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "twl4030-codec",
.ops = &overo_ops,
};
/* Audio machine driver */
static struct snd_soc_card snd_soc_card_overo = {
.name = "overo",
- .platform = &omap_soc_platform,
.dai_link = &overo_dai,
.num_links = 1,
};
-/* Audio subsystem */
-static struct snd_soc_device overo_snd_devdata = {
- .card = &snd_soc_card_overo,
- .codec_dev = &soc_codec_dev_twl4030,
-};
-
static struct platform_device *overo_snd_device;
static int __init overo_soc_init(void)
@@ -119,9 +113,7 @@ static int __init overo_soc_init(void)
return -ENOMEM;
}
- platform_set_drvdata(overo_snd_device, &overo_snd_devdata);
- overo_snd_devdata.dev = &overo_snd_device->dev;
- *(unsigned int *)overo_dai.cpu_dai->private_data = 1; /* McBSP2 */
+ platform_set_drvdata(overo_snd_device, &snd_soc_card_overo);
ret = platform_device_add(overo_snd_device);
if (ret)
diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c
index 88052d29617f..d1d8098923ce 100644
--- a/sound/soc/omap/rx51.c
+++ b/sound/soc/omap/rx51.c
@@ -31,6 +31,7 @@
#include <sound/pcm.h>
#include <sound/soc.h>
#include <sound/soc-dapm.h>
+#include <plat/mcbsp.h>
#include <asm/mach-types.h>
@@ -76,7 +77,7 @@ static int rx51_startup(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_codec *codec = rtd->socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
snd_pcm_hw_constraint_minmax(runtime,
SNDRV_PCM_HW_PARAM_CHANNELS, 2, 2);
@@ -89,8 +90,8 @@ static int rx51_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int err;
/* Set codec DAI configuration */
@@ -240,9 +241,9 @@ static const struct snd_kcontrol_new aic34_rx51_controls[] = {
rx51_get_jack, rx51_set_jack),
};
-static int rx51_aic34_init(struct snd_soc_codec *codec)
+static int rx51_aic34_init(struct snd_soc_pcm_runtime *rtd)
{
- struct snd_soc_card *card = codec->socdev->card;
+ struct snd_soc_codec *codec = rtd->codec;
int err;
/* Set up NC codec pins */
@@ -266,7 +267,7 @@ static int rx51_aic34_init(struct snd_soc_codec *codec)
snd_soc_dapm_sync(codec);
/* AV jack detection */
- err = snd_soc_jack_new(card, "AV Jack",
+ err = snd_soc_jack_new(codec, "AV Jack",
SND_JACK_VIDEOOUT, &rx51_av_jack);
if (err)
return err;
@@ -282,32 +283,20 @@ static struct snd_soc_dai_link rx51_dai[] = {
{
.name = "TLV320AIC34",
.stream_name = "AIC34",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &aic3x_dai,
+ .cpu_dai_name = "omap-mcbsp-dai.1",
+ .codec_dai_name = "tlv320aic3x-hifi",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "tlv320aic3x-codec.2-0018",
.init = rx51_aic34_init,
.ops = &rx51_ops,
},
};
-/* Audio private data */
-static struct aic3x_setup_data rx51_aic34_setup = {
- .gpio_func[0] = AIC3X_GPIO1_FUNC_DISABLED,
- .gpio_func[1] = AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT,
-};
-
/* Audio card */
static struct snd_soc_card rx51_sound_card = {
.name = "RX-51",
.dai_link = rx51_dai,
.num_links = ARRAY_SIZE(rx51_dai),
- .platform = &omap_soc_platform,
-};
-
-/* Audio subsystem */
-static struct snd_soc_device rx51_snd_devdata = {
- .card = &rx51_sound_card,
- .codec_dev = &soc_codec_dev_aic3x,
- .codec_data = &rx51_aic34_setup,
};
static struct platform_device *rx51_snd_device;
@@ -330,9 +319,7 @@ static int __init rx51_soc_init(void)
goto err1;
}
- platform_set_drvdata(rx51_snd_device, &rx51_snd_devdata);
- rx51_snd_devdata.dev = &rx51_snd_device->dev;
- *(unsigned int *)rx51_dai[0].cpu_dai->private_data = 1; /* McBSP2 */
+ platform_set_drvdata(rx51_snd_device, &rx51_sound_card);
err = platform_device_add(rx51_snd_device);
if (err)
diff --git a/sound/soc/omap/sdp3430.c b/sound/soc/omap/sdp3430.c
index 3c85c0f92823..76ce77b91844 100644
--- a/sound/soc/omap/sdp3430.c
+++ b/sound/soc/omap/sdp3430.c
@@ -36,9 +36,11 @@
#include <mach/gpio.h>
#include <plat/mcbsp.h>
+/* Register descriptions for twl4030 codec part */
+#include <linux/mfd/twl4030-codec.h>
+
#include "omap-mcbsp.h"
#include "omap-pcm.h"
-#include "../codecs/twl4030.h"
/* TWL4030 PMBR1 Register */
#define TWL4030_INTBR_PMBR1 0x0D
@@ -51,8 +53,8 @@ static int sdp3430_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* Set codec DAI configuration */
@@ -94,8 +96,8 @@ static int sdp3430_hw_voice_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* Set codec DAI configuration */
@@ -186,8 +188,9 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"Headset Stereophone", NULL, "HSOR"},
};
-static int sdp3430_twl4030_init(struct snd_soc_codec *codec)
+static int sdp3430_twl4030_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int ret;
/* Add SDP3430 specific widgets */
@@ -225,7 +228,7 @@ static int sdp3430_twl4030_init(struct snd_soc_codec *codec)
return ret;
/* Headset jack detection */
- ret = snd_soc_jack_new(&snd_soc_sdp3430, "Headset Jack",
+ ret = snd_soc_jack_new(codec, "Headset Jack",
SND_JACK_HEADSET, &hs_jack);
if (ret)
return ret;
@@ -241,14 +244,15 @@ static int sdp3430_twl4030_init(struct snd_soc_codec *codec)
return ret;
}
-static int sdp3430_twl4030_voice_init(struct snd_soc_codec *codec)
+static int sdp3430_twl4030_voice_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
unsigned short reg;
/* Enable voice interface */
- reg = codec->read(codec, TWL4030_REG_VOICE_IF);
+ reg = codec->driver->read(codec, TWL4030_REG_VOICE_IF);
reg |= TWL4030_VIF_DIN_EN | TWL4030_VIF_DOUT_EN | TWL4030_VIF_EN;
- codec->write(codec, TWL4030_REG_VOICE_IF, reg);
+ codec->driver->write(codec, TWL4030_REG_VOICE_IF, reg);
return 0;
}
@@ -259,16 +263,20 @@ static struct snd_soc_dai_link sdp3430_dai[] = {
{
.name = "TWL4030 I2S",
.stream_name = "TWL4030 Audio",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI],
+ .cpu_dai_name = "omap-mcbsp-dai.1",
+ .codec_dai_name = "twl4030-hifi",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "twl4030-codec",
.init = sdp3430_twl4030_init,
.ops = &sdp3430_ops,
},
{
.name = "TWL4030 PCM",
.stream_name = "TWL4030 Voice",
- .cpu_dai = &omap_mcbsp_dai[1],
- .codec_dai = &twl4030_dai[TWL4030_DAI_VOICE],
+ .cpu_dai_name = "omap-mcbsp-dai.2",
+ .codec_dai_name = "twl4030-voice",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "twl4030-codec",
.init = sdp3430_twl4030_voice_init,
.ops = &sdp3430_voice_ops,
},
@@ -277,25 +285,10 @@ static struct snd_soc_dai_link sdp3430_dai[] = {
/* Audio machine driver */
static struct snd_soc_card snd_soc_sdp3430 = {
.name = "SDP3430",
- .platform = &omap_soc_platform,
.dai_link = sdp3430_dai,
.num_links = ARRAY_SIZE(sdp3430_dai),
};
-/* twl4030 setup */
-static struct twl4030_setup_data twl4030_setup = {
- .ramp_delay_value = 3,
- .sysclk = 26000,
- .hs_extmute = 1,
-};
-
-/* Audio subsystem */
-static struct snd_soc_device sdp3430_snd_devdata = {
- .card = &snd_soc_sdp3430,
- .codec_dev = &soc_codec_dev_twl4030,
- .codec_data = &twl4030_setup,
-};
-
static struct platform_device *sdp3430_snd_device;
static int __init sdp3430_soc_init(void)
@@ -315,10 +308,7 @@ static int __init sdp3430_soc_init(void)
return -ENOMEM;
}
- platform_set_drvdata(sdp3430_snd_device, &sdp3430_snd_devdata);
- sdp3430_snd_devdata.dev = &sdp3430_snd_device->dev;
- *(unsigned int *)sdp3430_dai[0].cpu_dai->private_data = 1; /* McBSP2 */
- *(unsigned int *)sdp3430_dai[1].cpu_dai->private_data = 2; /* McBSP3 */
+ platform_set_drvdata(sdp3430_snd_device, &snd_soc_sdp3430);
/* Set TWL4030 GPIO6 as EXTMUTE signal */
twl_i2c_read_u8(TWL4030_MODULE_INTBR, &pin_mux,
diff --git a/sound/soc/omap/sdp4430.c b/sound/soc/omap/sdp4430.c
index 4ebbde6b565f..62f6a622d791 100644
--- a/sound/soc/omap/sdp4430.c
+++ b/sound/soc/omap/sdp4430.c
@@ -31,7 +31,6 @@
#include <plat/mux.h>
#include "mcpdm.h"
-#include "omap-mcpdm.h"
#include "omap-pcm.h"
#include "../codecs/twl6040.h"
@@ -41,7 +40,7 @@ static int sdp4430_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
int clk_id, freq;
int ret;
@@ -60,6 +59,7 @@ static int sdp4430_hw_params(struct snd_pcm_substream *substream,
printk(KERN_ERR "can't set codec system clock\n");
return ret;
}
+ return ret;
}
static struct snd_soc_ops sdp4430_ops = {
@@ -126,8 +126,9 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"Earphone Spk", NULL, "EP"},
};
-static int sdp4430_twl6040_init(struct snd_soc_codec *codec)
+static int sdp4430_twl6040_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int ret;
/* Add SDP4430 specific controls */
@@ -164,8 +165,10 @@ static int sdp4430_twl6040_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link sdp4430_dai = {
.name = "TWL6040",
.stream_name = "TWL6040",
- .cpu_dai = &omap_mcpdm_dai,
- .codec_dai = &twl6040_dai,
+ .cpu_dai_name ="omap-mcpdm-dai",
+ .codec_dai_name = "twl6040-hifi",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "twl6040-codec",
.init = sdp4430_twl6040_init,
.ops = &sdp4430_ops,
};
@@ -173,17 +176,10 @@ static struct snd_soc_dai_link sdp4430_dai = {
/* Audio machine driver */
static struct snd_soc_card snd_soc_sdp4430 = {
.name = "SDP4430",
- .platform = &omap_soc_platform,
.dai_link = &sdp4430_dai,
.num_links = 1,
};
-/* Audio subsystem */
-static struct snd_soc_device sdp4430_snd_devdata = {
- .card = &snd_soc_sdp4430,
- .codec_dev = &soc_codec_dev_twl6040,
-};
-
static struct platform_device *sdp4430_snd_device;
static int __init sdp4430_soc_init(void)
@@ -202,8 +198,7 @@ static int __init sdp4430_soc_init(void)
return -ENOMEM;
}
- platform_set_drvdata(sdp4430_snd_device, &sdp4430_snd_devdata);
- sdp4430_snd_devdata.dev = &sdp4430_snd_device->dev;
+ platform_set_drvdata(sdp4430_snd_device, &snd_soc_sdp4430);
ret = platform_device_add(sdp4430_snd_device);
if (ret)
diff --git a/sound/soc/omap/zoom2.c b/sound/soc/omap/zoom2.c
index 50a94ee76ecc..338dc9552bd6 100644
--- a/sound/soc/omap/zoom2.c
+++ b/sound/soc/omap/zoom2.c
@@ -29,21 +29,23 @@
#include <asm/mach-types.h>
#include <mach/hardware.h>
#include <mach/gpio.h>
+#include <mach/board-zoom.h>
#include <plat/mcbsp.h>
+/* Register descriptions for twl4030 codec part */
+#include <linux/mfd/twl4030-codec.h>
+
#include "omap-mcbsp.h"
#include "omap-pcm.h"
-#include "../codecs/twl4030.h"
#define ZOOM2_HEADSET_MUX_GPIO (OMAP_MAX_GPIO_LINES + 15)
-#define ZOOM2_HEADSET_EXTMUTE_GPIO 153
static int zoom2_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* Set codec DAI configuration */
@@ -85,8 +87,8 @@ static int zoom2_hw_voice_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* Set codec DAI configuration */
@@ -157,8 +159,9 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"Aux In", NULL, "AUXR"},
};
-static int zoom2_twl4030_init(struct snd_soc_codec *codec)
+static int zoom2_twl4030_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int ret;
/* Add Zoom2 specific widgets */
@@ -192,14 +195,15 @@ static int zoom2_twl4030_init(struct snd_soc_codec *codec)
return ret;
}
-static int zoom2_twl4030_voice_init(struct snd_soc_codec *codec)
+static int zoom2_twl4030_voice_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
unsigned short reg;
/* Enable voice interface */
- reg = codec->read(codec, TWL4030_REG_VOICE_IF);
+ reg = codec->driver->read(codec, TWL4030_REG_VOICE_IF);
reg |= TWL4030_VIF_DIN_EN | TWL4030_VIF_DOUT_EN | TWL4030_VIF_EN;
- codec->write(codec, TWL4030_REG_VOICE_IF, reg);
+ codec->driver->write(codec, TWL4030_REG_VOICE_IF, reg);
return 0;
}
@@ -209,16 +213,20 @@ static struct snd_soc_dai_link zoom2_dai[] = {
{
.name = "TWL4030 I2S",
.stream_name = "TWL4030 Audio",
- .cpu_dai = &omap_mcbsp_dai[0],
- .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI],
+ .cpu_dai_name = "omap-mcbsp-dai.1",
+ .codec_dai_name = "twl4030-hifi",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "twl4030-codec",
.init = zoom2_twl4030_init,
.ops = &zoom2_ops,
},
{
.name = "TWL4030 PCM",
.stream_name = "TWL4030 Voice",
- .cpu_dai = &omap_mcbsp_dai[1],
- .codec_dai = &twl4030_dai[TWL4030_DAI_VOICE],
+ .cpu_dai_name = "omap-mcbsp-dai.2",
+ .codec_dai_name = "twl4030-voice",
+ .platform_name = "omap-pcm-audio",
+ .codec_name = "twl4030-codec",
.init = zoom2_twl4030_voice_init,
.ops = &zoom2_voice_ops,
},
@@ -227,32 +235,10 @@ static struct snd_soc_dai_link zoom2_dai[] = {
/* Audio machine driver */
static struct snd_soc_card snd_soc_zoom2 = {
.name = "Zoom2",
- .platform = &omap_soc_platform,
.dai_link = zoom2_dai,
.num_links = ARRAY_SIZE(zoom2_dai),
};
-/* EXTMUTE callback function */
-void zoom2_set_hs_extmute(int mute)
-{
- gpio_set_value(ZOOM2_HEADSET_EXTMUTE_GPIO, mute);
-}
-
-/* twl4030 setup */
-static struct twl4030_setup_data twl4030_setup = {
- .ramp_delay_value = 3, /* 161 ms */
- .sysclk = 26000,
- .hs_extmute = 1,
- .set_hs_extmute = zoom2_set_hs_extmute,
-};
-
-/* Audio subsystem */
-static struct snd_soc_device zoom2_snd_devdata = {
- .card = &snd_soc_zoom2,
- .codec_dev = &soc_codec_dev_twl4030,
- .codec_data = &twl4030_setup,
-};
-
static struct platform_device *zoom2_snd_device;
static int __init zoom2_soc_init(void)
@@ -271,11 +257,7 @@ static int __init zoom2_soc_init(void)
return -ENOMEM;
}
- platform_set_drvdata(zoom2_snd_device, &zoom2_snd_devdata);
- zoom2_snd_devdata.dev = &zoom2_snd_device->dev;
- *(unsigned int *)zoom2_dai[0].cpu_dai->private_data = 1; /* McBSP2 */
- *(unsigned int *)zoom2_dai[1].cpu_dai->private_data = 2; /* McBSP3 */
-
+ platform_set_drvdata(zoom2_snd_device, &snd_soc_zoom2);
ret = platform_device_add(zoom2_snd_device);
if (ret)
goto err1;
diff --git a/sound/soc/pxa/corgi.c b/sound/soc/pxa/corgi.c
index fefe1a57f31a..555689cf6727 100644
--- a/sound/soc/pxa/corgi.c
+++ b/sound/soc/pxa/corgi.c
@@ -30,7 +30,6 @@
#include <mach/audio.h>
#include "../codecs/wm8731.h"
-#include "pxa2xx-pcm.h"
#include "pxa2xx-i2s.h"
#define CORGI_HP 0
@@ -99,7 +98,7 @@ static void corgi_ext_control(struct snd_soc_codec *codec)
static int corgi_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_codec *codec = rtd->socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
/* check the jack status at stream startup */
corgi_ext_control(codec);
@@ -118,8 +117,8 @@ static int corgi_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int clk = 0;
int ret = 0;
@@ -272,8 +271,9 @@ static const struct snd_kcontrol_new wm8731_corgi_controls[] = {
/*
* Logic for a wm8731 as connected on a Sharp SL-C7x0 Device
*/
-static int corgi_wm8731_init(struct snd_soc_codec *codec)
+static int corgi_wm8731_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int err;
snd_soc_dapm_nc_pin(codec, "LLINEIN");
@@ -300,8 +300,10 @@ static int corgi_wm8731_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link corgi_dai = {
.name = "WM8731",
.stream_name = "WM8731",
- .cpu_dai = &pxa_i2s_dai,
- .codec_dai = &wm8731_dai,
+ .cpu_dai_name = "pxa-is2-dai",
+ .codec_dai_name = "wm8731-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm8731-codec-0.001a",
.init = corgi_wm8731_init,
.ops = &corgi_ops,
};
@@ -309,17 +311,10 @@ static struct snd_soc_dai_link corgi_dai = {
/* corgi audio machine driver */
static struct snd_soc_card snd_soc_corgi = {
.name = "Corgi",
- .platform = &pxa2xx_soc_platform,
.dai_link = &corgi_dai,
.num_links = 1,
};
-/* corgi audio subsystem */
-static struct snd_soc_device corgi_snd_devdata = {
- .card = &snd_soc_corgi,
- .codec_dev = &soc_codec_dev_wm8731,
-};
-
static struct platform_device *corgi_snd_device;
static int __init corgi_init(void)
@@ -334,8 +329,7 @@ static int __init corgi_init(void)
if (!corgi_snd_device)
return -ENOMEM;
- platform_set_drvdata(corgi_snd_device, &corgi_snd_devdata);
- corgi_snd_devdata.dev = &corgi_snd_device->dev;
+ platform_set_drvdata(corgi_snd_device, &snd_soc_corgi);
ret = platform_device_add(corgi_snd_device);
if (ret)
diff --git a/sound/soc/pxa/e740_wm9705.c b/sound/soc/pxa/e740_wm9705.c
index 7cd2f89d7b10..f614607b2055 100644
--- a/sound/soc/pxa/e740_wm9705.c
+++ b/sound/soc/pxa/e740_wm9705.c
@@ -24,7 +24,6 @@
#include <asm/mach-types.h>
#include "../codecs/wm9705.h"
-#include "pxa2xx-pcm.h"
#include "pxa2xx-ac97.h"
@@ -90,8 +89,10 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"Mic Amp", NULL, "Mic (Internal)"},
};
-static int e740_ac97_init(struct snd_soc_codec *codec)
+static int e740_ac97_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
snd_soc_dapm_nc_pin(codec, "HPOUTL");
snd_soc_dapm_nc_pin(codec, "HPOUTR");
snd_soc_dapm_nc_pin(codec, "PHONE");
@@ -116,30 +117,28 @@ static struct snd_soc_dai_link e740_dai[] = {
{
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
- .codec_dai = &wm9705_dai[WM9705_DAI_AC97_HIFI],
+ .cpu_dai_name = "pxa-ac97.0",
+ .codec_dai_name = "wm9705-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9705-codec",
.init = e740_ac97_init,
},
{
.name = "AC97 Aux",
.stream_name = "AC97 Aux",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX],
- .codec_dai = &wm9705_dai[WM9705_DAI_AC97_AUX],
+ .cpu_dai_name = "pxa-ac97.1",
+ .codec_dai_name = "wm9705-aux",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9705-codec",
},
};
static struct snd_soc_card e740 = {
.name = "Toshiba e740",
- .platform = &pxa2xx_soc_platform,
.dai_link = e740_dai,
.num_links = ARRAY_SIZE(e740_dai),
};
-static struct snd_soc_device e740_snd_devdata = {
- .card = &e740,
- .codec_dev = &soc_codec_dev_wm9705,
-};
-
static struct platform_device *e740_snd_device;
static int __init e740_init(void)
@@ -178,8 +177,7 @@ static int __init e740_init(void)
goto free_apwr_gpio;
}
- platform_set_drvdata(e740_snd_device, &e740_snd_devdata);
- e740_snd_devdata.dev = &e740_snd_device->dev;
+ platform_set_drvdata(e740_snd_device, &e740);
ret = platform_device_add(e740_snd_device);
if (!ret)
diff --git a/sound/soc/pxa/e750_wm9705.c b/sound/soc/pxa/e750_wm9705.c
index 8dceccc5e059..4c143803a75e 100644
--- a/sound/soc/pxa/e750_wm9705.c
+++ b/sound/soc/pxa/e750_wm9705.c
@@ -24,7 +24,6 @@
#include <asm/mach-types.h>
#include "../codecs/wm9705.h"
-#include "pxa2xx-pcm.h"
#include "pxa2xx-ac97.h"
static int e750_spk_amp_event(struct snd_soc_dapm_widget *w,
@@ -72,8 +71,10 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"MIC1", NULL, "Mic (Internal)"},
};
-static int e750_ac97_init(struct snd_soc_codec *codec)
+static int e750_ac97_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
snd_soc_dapm_nc_pin(codec, "LOUT");
snd_soc_dapm_nc_pin(codec, "ROUT");
snd_soc_dapm_nc_pin(codec, "PHONE");
@@ -98,31 +99,29 @@ static struct snd_soc_dai_link e750_dai[] = {
{
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
- .codec_dai = &wm9705_dai[WM9705_DAI_AC97_HIFI],
+ .cpu_dai_name = "pxa-ac97.0",
+ .codec_dai_name = "wm9705-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9705-codec",
.init = e750_ac97_init,
/* use ops to check startup state */
},
{
.name = "AC97 Aux",
.stream_name = "AC97 Aux",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX],
- .codec_dai = &wm9705_dai[WM9705_DAI_AC97_AUX],
+ .cpu_dai_name = "pxa-ac97.1",
+ .codec_dai_name ="wm9705-aux",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9705-codec",
},
};
static struct snd_soc_card e750 = {
.name = "Toshiba e750",
- .platform = &pxa2xx_soc_platform,
.dai_link = e750_dai,
.num_links = ARRAY_SIZE(e750_dai),
};
-static struct snd_soc_device e750_snd_devdata = {
- .card = &e750,
- .codec_dev = &soc_codec_dev_wm9705,
-};
-
static struct platform_device *e750_snd_device;
static int __init e750_init(void)
@@ -154,8 +153,7 @@ static int __init e750_init(void)
goto free_spk_amp_gpio;
}
- platform_set_drvdata(e750_snd_device, &e750_snd_devdata);
- e750_snd_devdata.dev = &e750_snd_device->dev;
+ platform_set_drvdata(e750_snd_device, &e750);
ret = platform_device_add(e750_snd_device);
if (!ret)
diff --git a/sound/soc/pxa/e800_wm9712.c b/sound/soc/pxa/e800_wm9712.c
index bc019cdce429..d42e5fe832c5 100644
--- a/sound/soc/pxa/e800_wm9712.c
+++ b/sound/soc/pxa/e800_wm9712.c
@@ -23,7 +23,6 @@
#include <mach/eseries-gpio.h>
#include "../codecs/wm9712.h"
-#include "pxa2xx-pcm.h"
#include "pxa2xx-ac97.h"
static int e800_spk_amp_event(struct snd_soc_dapm_widget *w,
@@ -73,8 +72,10 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"MIC2", NULL, "Mic (Internal2)"},
};
-static int e800_ac97_init(struct snd_soc_codec *codec)
+static int e800_ac97_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
snd_soc_dapm_new_controls(codec, e800_dapm_widgets,
ARRAY_SIZE(e800_dapm_widgets));
@@ -88,30 +89,28 @@ static struct snd_soc_dai_link e800_dai[] = {
{
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
- .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI],
+ .cpu_dai_name = "pxa-ac97.0",
+ .codec_dai_name = "wm9712-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9712-codec",
.init = e800_ac97_init,
},
{
.name = "AC97 Aux",
.stream_name = "AC97 Aux",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX],
- .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX],
+ .cpu_dai_name = "pxa-ac97.1",
+ .codec_dai_name ="wm9712-aux",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9712-codec",
},
};
static struct snd_soc_card e800 = {
.name = "Toshiba e800",
- .platform = &pxa2xx_soc_platform,
.dai_link = e800_dai,
.num_links = ARRAY_SIZE(e800_dai),
};
-static struct snd_soc_device e800_snd_devdata = {
- .card = &e800,
- .codec_dev = &soc_codec_dev_wm9712,
-};
-
static struct platform_device *e800_snd_device;
static int __init e800_init(void)
@@ -141,8 +140,7 @@ static int __init e800_init(void)
if (!e800_snd_device)
return -ENOMEM;
- platform_set_drvdata(e800_snd_device, &e800_snd_devdata);
- e800_snd_devdata.dev = &e800_snd_device->dev;
+ platform_set_drvdata(e800_snd_device, &e800);
ret = platform_device_add(e800_snd_device);
if (!ret)
diff --git a/sound/soc/pxa/em-x270.c b/sound/soc/pxa/em-x270.c
index f4756e4025fd..eadf9d351a04 100644
--- a/sound/soc/pxa/em-x270.c
+++ b/sound/soc/pxa/em-x270.c
@@ -32,36 +32,33 @@
#include <mach/audio.h>
#include "../codecs/wm9712.h"
-#include "pxa2xx-pcm.h"
#include "pxa2xx-ac97.h"
static struct snd_soc_dai_link em_x270_dai[] = {
{
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
- .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI],
+ .cpu_dai_name = "pxa-ac97.0",
+ .codec_dai_name = "wm9712-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9712-codec",
},
{
.name = "AC97 Aux",
.stream_name = "AC97 Aux",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX],
- .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX],
+ .cpu_dai_name = "pxa-ac97.1",
+ .codec_dai_name ="wm9712-aux",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9712-codec",
},
};
static struct snd_soc_card em_x270 = {
.name = "EM-X270",
- .platform = &pxa2xx_soc_platform,
.dai_link = em_x270_dai,
.num_links = ARRAY_SIZE(em_x270_dai),
};
-static struct snd_soc_device em_x270_snd_devdata = {
- .card = &em_x270,
- .codec_dev = &soc_codec_dev_wm9712,
-};
-
static struct platform_device *em_x270_snd_device;
static int __init em_x270_init(void)
@@ -76,8 +73,7 @@ static int __init em_x270_init(void)
if (!em_x270_snd_device)
return -ENOMEM;
- platform_set_drvdata(em_x270_snd_device, &em_x270_snd_devdata);
- em_x270_snd_devdata.dev = &em_x270_snd_device->dev;
+ platform_set_drvdata(em_x270_snd_device, &em_x270);
ret = platform_device_add(em_x270_snd_device);
if (ret)
diff --git a/sound/soc/pxa/imote2.c b/sound/soc/pxa/imote2.c
index 405587a01160..03765fc5ac74 100644
--- a/sound/soc/pxa/imote2.c
+++ b/sound/soc/pxa/imote2.c
@@ -6,14 +6,13 @@
#include "../codecs/wm8940.h"
#include "pxa2xx-i2s.h"
-#include "pxa2xx-pcm.h"
static int imote2_asoc_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int clk = 0;
int ret;
@@ -64,23 +63,19 @@ static struct snd_soc_ops imote2_asoc_ops = {
static struct snd_soc_dai_link imote2_dai = {
.name = "WM8940",
.stream_name = "WM8940",
- .cpu_dai = &pxa_i2s_dai,
- .codec_dai = &wm8940_dai,
+ .cpu_dai_name = "pxa-i2s",
+ .codec_dai_name = "wm8940-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm8940-codec.0-0034",
.ops = &imote2_asoc_ops,
};
static struct snd_soc_card snd_soc_imote2 = {
.name = "Imote2",
- .platform = &pxa2xx_soc_platform,
.dai_link = &imote2_dai,
.num_links = 1,
};
-static struct snd_soc_device imote2_snd_devdata = {
- .card = &snd_soc_imote2,
- .codec_dev = &soc_codec_dev_wm8940,
-};
-
static struct platform_device *imote2_snd_device;
static int __init imote2_asoc_init(void)
@@ -93,8 +88,7 @@ static int __init imote2_asoc_init(void)
if (!imote2_snd_device)
return -ENOMEM;
- platform_set_drvdata(imote2_snd_device, &imote2_snd_devdata);
- imote2_snd_devdata.dev = &imote2_snd_device->dev;
+ platform_set_drvdata(imote2_snd_device, &snd_soc_imote2);
ret = platform_device_add(imote2_snd_device);
if (ret)
platform_device_put(imote2_snd_device);
diff --git a/sound/soc/pxa/magician.c b/sound/soc/pxa/magician.c
index 4c8d99a8d386..608bc3dd835f 100644
--- a/sound/soc/pxa/magician.c
+++ b/sound/soc/pxa/magician.c
@@ -32,7 +32,6 @@
#include <mach/magician.h>
#include <asm/mach-types.h>
#include "../codecs/uda1380.h"
-#include "pxa2xx-pcm.h"
#include "pxa2xx-i2s.h"
#include "pxa-ssp.h"
@@ -71,7 +70,7 @@ static void magician_ext_control(struct snd_soc_codec *codec)
static int magician_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_codec *codec = rtd->socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
/* check the jack status at stream startup */
magician_ext_control(codec);
@@ -86,8 +85,8 @@ static int magician_playback_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int acps, acds, width, rate;
unsigned int div4 = PXA_SSP_CLK_SCDB_4;
int ret = 0;
@@ -227,8 +226,8 @@ static int magician_capture_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret = 0;
/* set codec DAI configuration */
@@ -393,8 +392,9 @@ static const struct snd_kcontrol_new uda1380_magician_controls[] = {
/*
* Logic for a uda1380 as connected on a HTC Magician
*/
-static int magician_uda1380_init(struct snd_soc_codec *codec)
+static int magician_uda1380_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int err;
/* NC codec pins */
@@ -427,16 +427,20 @@ static struct snd_soc_dai_link magician_dai[] = {
{
.name = "uda1380",
.stream_name = "UDA1380 Playback",
- .cpu_dai = &pxa_ssp_dai[PXA_DAI_SSP1],
- .codec_dai = &uda1380_dai[UDA1380_DAI_PLAYBACK],
+ .cpu_dai_name = "pxa-ssp-dai.0",
+ .codec_dai_name = "uda1380-hifi-playback",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "uda1380-codec.0-0018",
.init = magician_uda1380_init,
.ops = &magician_playback_ops,
},
{
.name = "uda1380",
.stream_name = "UDA1380 Capture",
- .cpu_dai = &pxa_i2s_dai,
- .codec_dai = &uda1380_dai[UDA1380_DAI_CAPTURE],
+ .cpu_dai_name = "pxa-i2s",
+ .codec_dai_name = "uda1380-hifi-capture",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "uda1380-codec.0-0018",
.ops = &magician_capture_ops,
}
};
@@ -446,13 +450,7 @@ static struct snd_soc_card snd_soc_card_magician = {
.name = "Magician",
.dai_link = magician_dai,
.num_links = ARRAY_SIZE(magician_dai),
- .platform = &pxa2xx_soc_platform,
-};
-/* magician audio subsystem */
-static struct snd_soc_device magician_snd_devdata = {
- .card = &snd_soc_card_magician,
- .codec_dev = &soc_codec_dev_uda1380,
};
static struct platform_device *magician_snd_device;
@@ -514,8 +512,7 @@ static int __init magician_init(void)
goto err_pdev;
}
- platform_set_drvdata(magician_snd_device, &magician_snd_devdata);
- magician_snd_devdata.dev = &magician_snd_device->dev;
+ platform_set_drvdata(magician_snd_device, &snd_soc_card_magician);
ret = platform_device_add(magician_snd_device);
if (ret) {
platform_device_put(magician_snd_device);
diff --git a/sound/soc/pxa/mioa701_wm9713.c b/sound/soc/pxa/mioa701_wm9713.c
index 19eda8bbfdaf..f284cc54bc80 100644
--- a/sound/soc/pxa/mioa701_wm9713.c
+++ b/sound/soc/pxa/mioa701_wm9713.c
@@ -54,7 +54,6 @@
#include <sound/initval.h>
#include <sound/ac97_codec.h>
-#include "pxa2xx-pcm.h"
#include "pxa2xx-ac97.h"
#include "../codecs/wm9713.h"
@@ -128,8 +127,9 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"Rear Speaker", NULL, "SPKR"},
};
-static int mioa701_wm9713_init(struct snd_soc_codec *codec)
+static int mioa701_wm9713_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
unsigned short reg;
/* Add mioa701 specific widgets */
@@ -139,12 +139,12 @@ static int mioa701_wm9713_init(struct snd_soc_codec *codec)
snd_soc_dapm_add_routes(codec, ARRAY_AND_SIZE(audio_map));
/* Prepare GPIO8 for rear speaker amplifier */
- reg = codec->read(codec, AC97_GPIO_CFG);
- codec->write(codec, AC97_GPIO_CFG, reg | 0x0100);
+ reg = codec->driver->read(codec, AC97_GPIO_CFG);
+ codec->driver->write(codec, AC97_GPIO_CFG, reg | 0x0100);
/* Prepare MIC input */
- reg = codec->read(codec, AC97_3D_CONTROL);
- codec->write(codec, AC97_3D_CONTROL, reg | 0xc000);
+ reg = codec->driver->read(codec, AC97_3D_CONTROL);
+ codec->driver->write(codec, AC97_3D_CONTROL, reg | 0xc000);
snd_soc_dapm_enable_pin(codec, "Front Speaker");
snd_soc_dapm_enable_pin(codec, "Rear Speaker");
@@ -162,32 +162,30 @@ static struct snd_soc_dai_link mioa701_dai[] = {
{
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
- .codec_dai = &wm9713_dai[WM9713_DAI_AC97_HIFI],
+ .cpu_dai_name = "pxa-ac97.0",
+ .codec_dai_name = "wm9713-hifi",
+ .codec_name = "wm9713-codec",
.init = mioa701_wm9713_init,
+ .platform_name = "pxa-pcm-audio",
.ops = &mioa701_ops,
},
{
.name = "AC97 Aux",
.stream_name = "AC97 Aux",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX],
- .codec_dai = &wm9713_dai[WM9713_DAI_AC97_AUX],
+ .cpu_dai_name = "pxa-ac97.1",
+ .codec_dai_name ="wm9713-aux",
+ .codec_name = "wm9713-codec",
+ .platform_name = "pxa-pcm-audio",
.ops = &mioa701_ops,
},
};
static struct snd_soc_card mioa701 = {
.name = "MioA701",
- .platform = &pxa2xx_soc_platform,
.dai_link = mioa701_dai,
.num_links = ARRAY_SIZE(mioa701_dai),
};
-static struct snd_soc_device mioa701_snd_devdata = {
- .card = &mioa701,
- .codec_dev = &soc_codec_dev_wm9713,
-};
-
static struct platform_device *mioa701_snd_device;
static int mioa701_wm9713_probe(struct platform_device *pdev)
@@ -205,8 +203,7 @@ static int mioa701_wm9713_probe(struct platform_device *pdev)
if (!mioa701_snd_device)
return -ENOMEM;
- platform_set_drvdata(mioa701_snd_device, &mioa701_snd_devdata);
- mioa701_snd_devdata.dev = &mioa701_snd_device->dev;
+ platform_set_drvdata(mioa701_snd_device, &mioa701);
ret = platform_device_add(mioa701_snd_device);
if (!ret)
diff --git a/sound/soc/pxa/palm27x.c b/sound/soc/pxa/palm27x.c
index 1f96e3227be5..13f6d485d571 100644
--- a/sound/soc/pxa/palm27x.c
+++ b/sound/soc/pxa/palm27x.c
@@ -29,7 +29,6 @@
#include <mach/palmasoc.h>
#include "../codecs/wm9712.h"
-#include "pxa2xx-pcm.h"
#include "pxa2xx-ac97.h"
static struct snd_soc_jack hs_jack;
@@ -75,8 +74,9 @@ static const struct snd_soc_dapm_route audio_map[] = {
static struct snd_soc_card palm27x_asoc;
-static int palm27x_ac97_init(struct snd_soc_codec *codec)
+static int palm27x_ac97_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int err;
/* add palm27x specific widgets */
@@ -112,7 +112,7 @@ static int palm27x_ac97_init(struct snd_soc_codec *codec)
return err;
/* Jack detection API stuff */
- err = snd_soc_jack_new(&palm27x_asoc, "Headphone Jack",
+ err = snd_soc_jack_new(codec, "Headphone Jack",
SND_JACK_HEADPHONE, &hs_jack);
if (err)
return err;
@@ -132,30 +132,28 @@ static struct snd_soc_dai_link palm27x_dai[] = {
{
.name = "AC97 HiFi",
.stream_name = "AC97 HiFi",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
- .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI],
+ .cpu_dai_name = "pxa-ac97.0",
+ .codec_dai_name = "wm9712-hifi",
+ .codec_name = "wm9712-codec",
+ .platform_name = "pxa-pcm-audio",
.init = palm27x_ac97_init,
},
{
.name = "AC97 Aux",
.stream_name = "AC97 Aux",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX],
- .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX],
+ .cpu_dai_name = "pxa-ac97.1",
+ .codec_dai_name = "wm9712-aux",
+ .codec_name = "wm9712-codec",
+ .platform_name = "pxa-pcm-audio",
},
};
static struct snd_soc_card palm27x_asoc = {
.name = "Palm/PXA27x",
- .platform = &pxa2xx_soc_platform,
.dai_link = palm27x_dai,
.num_links = ARRAY_SIZE(palm27x_dai),
};
-static struct snd_soc_device palm27x_snd_devdata = {
- .card = &palm27x_asoc,
- .codec_dev = &soc_codec_dev_wm9712,
-};
-
static struct platform_device *palm27x_snd_device;
static int palm27x_asoc_probe(struct platform_device *pdev)
@@ -178,8 +176,7 @@ static int palm27x_asoc_probe(struct platform_device *pdev)
if (!palm27x_snd_device)
return -ENOMEM;
- platform_set_drvdata(palm27x_snd_device, &palm27x_snd_devdata);
- palm27x_snd_devdata.dev = &palm27x_snd_device->dev;
+ platform_set_drvdata(palm27x_snd_device, &palm27x_asoc);
ret = platform_device_add(palm27x_snd_device);
if (ret != 0)
diff --git a/sound/soc/pxa/poodle.c b/sound/soc/pxa/poodle.c
index c5f36e0eab58..add0e1c25bc8 100644
--- a/sound/soc/pxa/poodle.c
+++ b/sound/soc/pxa/poodle.c
@@ -31,7 +31,6 @@
#include <mach/audio.h>
#include "../codecs/wm8731.h"
-#include "pxa2xx-pcm.h"
#include "pxa2xx-i2s.h"
#define POODLE_HP 1
@@ -76,7 +75,7 @@ static void poodle_ext_control(struct snd_soc_codec *codec)
static int poodle_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_codec *codec = rtd->socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
/* check the jack status at stream startup */
poodle_ext_control(codec);
@@ -97,8 +96,8 @@ static int poodle_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int clk = 0;
int ret = 0;
@@ -237,8 +236,9 @@ static const struct snd_kcontrol_new wm8731_poodle_controls[] = {
/*
* Logic for a wm8731 as connected on a Sharp SL-C7x0 Device
*/
-static int poodle_wm8731_init(struct snd_soc_codec *codec)
+static int poodle_wm8731_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int err;
snd_soc_dapm_nc_pin(codec, "LLINEIN");
@@ -266,8 +266,10 @@ static int poodle_wm8731_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link poodle_dai = {
.name = "WM8731",
.stream_name = "WM8731",
- .cpu_dai = &pxa_i2s_dai,
- .codec_dai = &wm8731_dai,
+ .cpu_dai_name = "pxa-i2s",
+ .codec_dai_name = "wm8731-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm8731-codec.0-001a",
.init = poodle_wm8731_init,
.ops = &poodle_ops,
};
@@ -275,15 +277,9 @@ static struct snd_soc_dai_link poodle_dai = {
/* poodle audio machine driver */
static struct snd_soc_card snd_soc_poodle = {
.name = "Poodle",
- .platform = &pxa2xx_soc_platform,
.dai_link = &poodle_dai,
.num_links = 1,
-};
-
-/* poodle audio subsystem */
-static struct snd_soc_device poodle_snd_devdata = {
- .card = &snd_soc_poodle,
- .codec_dev = &soc_codec_dev_wm8731,
+ .owner = THIS_MODULE,
};
static struct platform_device *poodle_snd_device;
@@ -307,8 +303,7 @@ static int __init poodle_init(void)
if (!poodle_snd_device)
return -ENOMEM;
- platform_set_drvdata(poodle_snd_device, &poodle_snd_devdata);
- poodle_snd_devdata.dev = &poodle_snd_device->dev;
+ platform_set_drvdata(poodle_snd_device, &snd_soc_poodle);
ret = platform_device_add(poodle_snd_device);
if (ret)
diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c
index a1fd23e0e3d0..8dfbcda956ff 100644
--- a/sound/soc/pxa/pxa-ssp.c
+++ b/sound/soc/pxa/pxa-ssp.c
@@ -35,7 +35,7 @@
#include <mach/audio.h>
#include <plat/ssp.h>
-#include "pxa2xx-pcm.h"
+#include "../../arm/pxa2xx-pcm.h"
#include "pxa-ssp.h"
/*
@@ -108,11 +108,9 @@ pxa_ssp_get_dma_params(struct ssp_device *ssp, int width4, int out)
}
static int pxa_ssp_startup(struct snd_pcm_substream *substream,
- struct snd_soc_dai *dai)
+ struct snd_soc_dai *cpu_dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct ssp_priv *priv = cpu_dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai);
struct ssp_device *ssp = priv->ssp;
int ret = 0;
@@ -128,11 +126,9 @@ static int pxa_ssp_startup(struct snd_pcm_substream *substream,
}
static void pxa_ssp_shutdown(struct snd_pcm_substream *substream,
- struct snd_soc_dai *dai)
+ struct snd_soc_dai *cpu_dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct ssp_priv *priv = cpu_dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai);
struct ssp_device *ssp = priv->ssp;
if (!cpu_dai->active) {
@@ -148,7 +144,7 @@ static void pxa_ssp_shutdown(struct snd_pcm_substream *substream,
static int pxa_ssp_suspend(struct snd_soc_dai *cpu_dai)
{
- struct ssp_priv *priv = cpu_dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai);
struct ssp_device *ssp = priv->ssp;
if (!cpu_dai->active)
@@ -166,7 +162,7 @@ static int pxa_ssp_suspend(struct snd_soc_dai *cpu_dai)
static int pxa_ssp_resume(struct snd_soc_dai *cpu_dai)
{
- struct ssp_priv *priv = cpu_dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai);
struct ssp_device *ssp = priv->ssp;
uint32_t sssr = SSSR_ROR | SSSR_TUR | SSSR_BCE;
@@ -230,7 +226,7 @@ static u32 pxa_ssp_get_scr(struct ssp_device *ssp)
static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
int clk_id, unsigned int freq, int dir)
{
- struct ssp_priv *priv = cpu_dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai);
struct ssp_device *ssp = priv->ssp;
int val;
@@ -287,7 +283,7 @@ static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
static int pxa_ssp_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
int div_id, int div)
{
- struct ssp_priv *priv = cpu_dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai);
struct ssp_device *ssp = priv->ssp;
int val;
@@ -338,7 +334,7 @@ static int pxa_ssp_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id,
int source, unsigned int freq_in, unsigned int freq_out)
{
- struct ssp_priv *priv = cpu_dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai);
struct ssp_device *ssp = priv->ssp;
u32 ssacd = pxa_ssp_read_reg(ssp, SSACD) & ~0x70;
@@ -407,7 +403,7 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id,
static int pxa_ssp_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
{
- struct ssp_priv *priv = cpu_dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai);
struct ssp_device *ssp = priv->ssp;
u32 sscr0;
@@ -442,7 +438,7 @@ static int pxa_ssp_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
static int pxa_ssp_set_dai_tristate(struct snd_soc_dai *cpu_dai,
int tristate)
{
- struct ssp_priv *priv = cpu_dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai);
struct ssp_device *ssp = priv->ssp;
u32 sscr1;
@@ -464,11 +460,9 @@ static int pxa_ssp_set_dai_tristate(struct snd_soc_dai *cpu_dai,
static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
unsigned int fmt)
{
- struct ssp_priv *priv = cpu_dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai);
struct ssp_device *ssp = priv->ssp;
- u32 sscr0;
- u32 sscr1;
- u32 sspsp;
+ u32 sscr0, sscr1, sspsp, scfr;
/* check if we need to change anything at all */
if (priv->dai_fmt == fmt)
@@ -483,16 +477,16 @@ static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
/* reset port settings */
sscr0 = pxa_ssp_read_reg(ssp, SSCR0) &
- (SSCR0_ECS | SSCR0_NCS | SSCR0_MOD | SSCR0_ACS);
+ ~(SSCR0_ECS | SSCR0_NCS | SSCR0_MOD | SSCR0_ACS);
sscr1 = SSCR1_RxTresh(8) | SSCR1_TxTresh(7);
sspsp = 0;
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
case SND_SOC_DAIFMT_CBM_CFM:
- sscr1 |= SSCR1_SCLKDIR | SSCR1_SFRMDIR;
+ sscr1 |= SSCR1_SCLKDIR | SSCR1_SFRMDIR | SSCR1_SCFR;
break;
case SND_SOC_DAIFMT_CBM_CFS:
- sscr1 |= SSCR1_SCLKDIR;
+ sscr1 |= SSCR1_SCLKDIR | SSCR1_SCFR;
break;
case SND_SOC_DAIFMT_CBS_CFS:
break;
@@ -538,6 +532,17 @@ static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
pxa_ssp_write_reg(ssp, SSCR1, sscr1);
pxa_ssp_write_reg(ssp, SSPSP, sspsp);
+ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
+ case SND_SOC_DAIFMT_CBM_CFM:
+ case SND_SOC_DAIFMT_CBM_CFS:
+ scfr = pxa_ssp_read_reg(ssp, SSCR1) | SSCR1_SCFR;
+ pxa_ssp_write_reg(ssp, SSCR1, scfr);
+
+ while (pxa_ssp_read_reg(ssp, SSSR) & SSSR_BSY)
+ cpu_relax();
+ break;
+ }
+
dump_registers(ssp);
/* Since we are configuring the timings for the format by hand
@@ -555,11 +560,9 @@ static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
*/
static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
- struct snd_soc_dai *dai)
+ struct snd_soc_dai *cpu_dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct ssp_priv *priv = cpu_dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai);
struct ssp_device *ssp = priv->ssp;
int chn = params_channels(params);
u32 sscr0;
@@ -568,7 +571,7 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
int ttsa = pxa_ssp_read_reg(ssp, SSTSA) & 0xf;
struct pxa2xx_pcm_dma_params *dma_data;
- dma_data = snd_soc_dai_get_dma_data(dai, substream);
+ dma_data = snd_soc_dai_get_dma_data(cpu_dai, substream);
/* generate correct DMA params */
kfree(dma_data);
@@ -581,7 +584,7 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
((chn == 2) && (ttsa != 1)) || (width == 32),
substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
- snd_soc_dai_set_dma_data(dai, substream, dma_data);
+ snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data);
/* we can only change the settings if the port is not in use */
if (pxa_ssp_read_reg(ssp, SSCR0) & SSCR0_SSE)
@@ -589,10 +592,8 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
/* clear selected SSP bits */
sscr0 = pxa_ssp_read_reg(ssp, SSCR0) & ~(SSCR0_DSS | SSCR0_EDSS);
- pxa_ssp_write_reg(ssp, SSCR0, sscr0);
/* bit size */
- sscr0 = pxa_ssp_read_reg(ssp, SSCR0);
switch (params_format(params)) {
case SNDRV_PCM_FORMAT_S16_LE:
#ifdef CONFIG_PXA3xx
@@ -668,12 +669,10 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
}
static int pxa_ssp_trigger(struct snd_pcm_substream *substream, int cmd,
- struct snd_soc_dai *dai)
+ struct snd_soc_dai *cpu_dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
int ret = 0;
- struct ssp_priv *priv = cpu_dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai);
struct ssp_device *ssp = priv->ssp;
int val;
@@ -729,8 +728,7 @@ static int pxa_ssp_trigger(struct snd_pcm_substream *substream, int cmd,
return ret;
}
-static int pxa_ssp_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int pxa_ssp_probe(struct snd_soc_dai *dai)
{
struct ssp_priv *priv;
int ret;
@@ -746,7 +744,7 @@ static int pxa_ssp_probe(struct platform_device *pdev,
}
priv->dai_fmt = (unsigned int) -1;
- dai->private_data = priv;
+ snd_soc_dai_set_drvdata(dai, priv);
return 0;
@@ -755,11 +753,12 @@ err_priv:
return ret;
}
-static void pxa_ssp_remove(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int pxa_ssp_remove(struct snd_soc_dai *dai)
{
- struct ssp_priv *priv = dai->private_data;
+ struct ssp_priv *priv = snd_soc_dai_get_drvdata(dai);
+
pxa_ssp_free(priv->ssp);
+ return 0;
}
#define PXA_SSP_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
@@ -784,10 +783,7 @@ static struct snd_soc_dai_ops pxa_ssp_dai_ops = {
.set_tristate = pxa_ssp_set_dai_tristate,
};
-struct snd_soc_dai pxa_ssp_dai[] = {
- {
- .name = "pxa2xx-ssp1",
- .id = 0,
+static struct snd_soc_dai_driver pxa_ssp_dai = {
.probe = pxa_ssp_probe,
.remove = pxa_ssp_remove,
.suspend = pxa_ssp_suspend,
@@ -805,81 +801,38 @@ struct snd_soc_dai pxa_ssp_dai[] = {
.formats = PXA_SSP_FORMATS,
},
.ops = &pxa_ssp_dai_ops,
+};
+
+static __devinit int asoc_ssp_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_dai(&pdev->dev, &pxa_ssp_dai);
+}
+
+static int __devexit asoc_ssp_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_dai(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver asoc_ssp_driver = {
+ .driver = {
+ .name = "pxa-ssp-dai",
+ .owner = THIS_MODULE,
},
- { .name = "pxa2xx-ssp2",
- .id = 1,
- .probe = pxa_ssp_probe,
- .remove = pxa_ssp_remove,
- .suspend = pxa_ssp_suspend,
- .resume = pxa_ssp_resume,
- .playback = {
- .channels_min = 1,
- .channels_max = 8,
- .rates = PXA_SSP_RATES,
- .formats = PXA_SSP_FORMATS,
- },
- .capture = {
- .channels_min = 1,
- .channels_max = 8,
- .rates = PXA_SSP_RATES,
- .formats = PXA_SSP_FORMATS,
- },
- .ops = &pxa_ssp_dai_ops,
- },
- {
- .name = "pxa2xx-ssp3",
- .id = 2,
- .probe = pxa_ssp_probe,
- .remove = pxa_ssp_remove,
- .suspend = pxa_ssp_suspend,
- .resume = pxa_ssp_resume,
- .playback = {
- .channels_min = 1,
- .channels_max = 8,
- .rates = PXA_SSP_RATES,
- .formats = PXA_SSP_FORMATS,
- },
- .capture = {
- .channels_min = 1,
- .channels_max = 8,
- .rates = PXA_SSP_RATES,
- .formats = PXA_SSP_FORMATS,
- },
- .ops = &pxa_ssp_dai_ops,
- },
- {
- .name = "pxa2xx-ssp4",
- .id = 3,
- .probe = pxa_ssp_probe,
- .remove = pxa_ssp_remove,
- .suspend = pxa_ssp_suspend,
- .resume = pxa_ssp_resume,
- .playback = {
- .channels_min = 1,
- .channels_max = 8,
- .rates = PXA_SSP_RATES,
- .formats = PXA_SSP_FORMATS,
- },
- .capture = {
- .channels_min = 1,
- .channels_max = 8,
- .rates = PXA_SSP_RATES,
- .formats = PXA_SSP_FORMATS,
- },
- .ops = &pxa_ssp_dai_ops,
- },
+
+ .probe = asoc_ssp_probe,
+ .remove = __devexit_p(asoc_ssp_remove),
};
-EXPORT_SYMBOL_GPL(pxa_ssp_dai);
static int __init pxa_ssp_init(void)
{
- return snd_soc_register_dais(pxa_ssp_dai, ARRAY_SIZE(pxa_ssp_dai));
+ return platform_driver_register(&asoc_ssp_driver);
}
module_init(pxa_ssp_init);
static void __exit pxa_ssp_exit(void)
{
- snd_soc_unregister_dais(pxa_ssp_dai, ARRAY_SIZE(pxa_ssp_dai));
+ platform_driver_unregister(&asoc_ssp_driver);
}
module_exit(pxa_ssp_exit);
diff --git a/sound/soc/pxa/pxa-ssp.h b/sound/soc/pxa/pxa-ssp.h
index 91deadd55675..bc79da221c0d 100644
--- a/sound/soc/pxa/pxa-ssp.h
+++ b/sound/soc/pxa/pxa-ssp.h
@@ -42,6 +42,4 @@
#define PXA_SSP_PLL_OUT 0
-extern struct snd_soc_dai pxa_ssp_dai[4];
-
#endif
diff --git a/sound/soc/pxa/pxa2xx-ac97.c b/sound/soc/pxa/pxa2xx-ac97.c
index d314115e3dd7..9c2bafa112ad 100644
--- a/sound/soc/pxa/pxa2xx-ac97.c
+++ b/sound/soc/pxa/pxa2xx-ac97.c
@@ -104,24 +104,21 @@ static int pxa2xx_ac97_resume(struct snd_soc_dai *dai)
#define pxa2xx_ac97_resume NULL
#endif
-static int pxa2xx_ac97_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int pxa2xx_ac97_probe(struct snd_soc_dai *dai)
{
return pxa2xx_ac97_hw_probe(to_platform_device(dai->dev));
}
-static void pxa2xx_ac97_remove(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int pxa2xx_ac97_remove(struct snd_soc_dai *dai)
{
pxa2xx_ac97_hw_remove(to_platform_device(dai->dev));
+ return 0;
}
static int pxa2xx_ac97_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
- struct snd_soc_dai *dai)
+ struct snd_soc_dai *cpu_dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
struct pxa2xx_pcm_dma_params *dma_data;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
@@ -136,10 +133,8 @@ static int pxa2xx_ac97_hw_params(struct snd_pcm_substream *substream,
static int pxa2xx_ac97_hw_aux_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
- struct snd_soc_dai *dai)
+ struct snd_soc_dai *cpu_dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
struct pxa2xx_pcm_dma_params *dma_data;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
@@ -154,11 +149,8 @@ static int pxa2xx_ac97_hw_aux_params(struct snd_pcm_substream *substream,
static int pxa2xx_ac97_hw_mic_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
- struct snd_soc_dai *dai)
+ struct snd_soc_dai *cpu_dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
-
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
return -ENODEV;
else
@@ -188,10 +180,9 @@ static struct snd_soc_dai_ops pxa_ac97_mic_dai_ops = {
* There is only 1 physical AC97 interface for pxa2xx, but it
* has extra fifo's that can be used for aux DACs and ADCs.
*/
-struct snd_soc_dai pxa_ac97_dai[] = {
+static struct snd_soc_dai_driver pxa_ac97_dai[] = {
{
.name = "pxa2xx-ac97",
- .id = 0,
.ac97_control = 1,
.probe = pxa2xx_ac97_probe,
.remove = pxa2xx_ac97_remove,
@@ -213,7 +204,6 @@ struct snd_soc_dai pxa_ac97_dai[] = {
},
{
.name = "pxa2xx-ac97-aux",
- .id = 1,
.ac97_control = 1,
.playback = {
.stream_name = "AC97 Aux Playback",
@@ -231,7 +221,6 @@ struct snd_soc_dai pxa_ac97_dai[] = {
},
{
.name = "pxa2xx-ac97-mic",
- .id = 2,
.ac97_control = 1,
.capture = {
.stream_name = "AC97 Mic Capture",
@@ -243,36 +232,26 @@ struct snd_soc_dai pxa_ac97_dai[] = {
},
};
-EXPORT_SYMBOL_GPL(pxa_ac97_dai);
EXPORT_SYMBOL_GPL(soc_ac97_ops);
-static int __devinit pxa2xx_ac97_dev_probe(struct platform_device *pdev)
+static __devinit int pxa2xx_ac97_dev_probe(struct platform_device *pdev)
{
- int i;
- pxa2xx_audio_ops_t *pdata = pdev->dev.platform_data;
-
- if (pdev->id >= 0) {
+ if (pdev->id != -1) {
dev_err(&pdev->dev, "PXA2xx has only one AC97 port.\n");
return -ENXIO;
}
- for (i = 0; i < ARRAY_SIZE(pxa_ac97_dai); i++) {
- pxa_ac97_dai[i].dev = &pdev->dev;
- if (pdata && pdata->codec_pdata[0])
- pxa_ac97_dai[i].ac97_pdata = pdata->codec_pdata[0];
- }
-
/* Punt most of the init to the SoC probe; we may need the machine
* driver to do interesting things with the clocking to get us up
* and running.
*/
- return snd_soc_register_dais(pxa_ac97_dai, ARRAY_SIZE(pxa_ac97_dai));
+ return snd_soc_register_dais(&pdev->dev, pxa_ac97_dai,
+ ARRAY_SIZE(pxa_ac97_dai));
}
static int __devexit pxa2xx_ac97_dev_remove(struct platform_device *pdev)
{
- snd_soc_unregister_dais(pxa_ac97_dai, ARRAY_SIZE(pxa_ac97_dai));
-
+ snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(pxa_ac97_dai));
return 0;
}
diff --git a/sound/soc/pxa/pxa2xx-ac97.h b/sound/soc/pxa/pxa2xx-ac97.h
index e390de8edcd4..eda891e6f31b 100644
--- a/sound/soc/pxa/pxa2xx-ac97.h
+++ b/sound/soc/pxa/pxa2xx-ac97.h
@@ -14,8 +14,6 @@
#define PXA2XX_DAI_AC97_AUX 1
#define PXA2XX_DAI_AC97_MIC 2
-extern struct snd_soc_dai pxa_ac97_dai[3];
-
/* platform data */
extern struct snd_ac97_bus_ops pxa2xx_ac97_ops;
diff --git a/sound/soc/pxa/pxa2xx-i2s.c b/sound/soc/pxa/pxa2xx-i2s.c
index c1a5275721e4..d1b2ca69fd30 100644
--- a/sound/soc/pxa/pxa2xx-i2s.c
+++ b/sound/soc/pxa/pxa2xx-i2s.c
@@ -27,7 +27,6 @@
#include <mach/dma.h>
#include <mach/audio.h>
-#include "pxa2xx-pcm.h"
#include "pxa2xx-i2s.h"
/*
@@ -80,6 +79,7 @@ struct pxa_i2s_port {
};
static struct pxa_i2s_port pxa_i2s;
static struct clk *clk_i2s;
+static int clk_ena = 0;
static struct pxa2xx_pcm_dma_params pxa2xx_i2s_pcm_stereo_out = {
.name = "I2S PCM Stereo out",
@@ -101,7 +101,7 @@ static int pxa2xx_i2s_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
if (IS_ERR(clk_i2s))
return PTR_ERR(clk_i2s);
@@ -162,13 +162,11 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
struct pxa2xx_pcm_dma_params *dma_data;
BUG_ON(IS_ERR(clk_i2s));
clk_enable(clk_i2s);
- dai->private_data = dai;
+ clk_ena = 1;
pxa_i2s_wait();
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
@@ -176,7 +174,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream,
else
dma_data = &pxa2xx_i2s_pcm_stereo_in;
- snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data);
+ snd_soc_dai_set_dma_data(dai, substream, dma_data);
/* is port used by another stream */
if (!(SACR0 & SACR0_ENB)) {
@@ -259,9 +257,9 @@ static void pxa2xx_i2s_shutdown(struct snd_pcm_substream *substream,
if ((SACR1 & (SACR1_DREC | SACR1_DRPL)) == (SACR1_DREC | SACR1_DRPL)) {
SACR0 &= ~SACR0_ENB;
pxa_i2s_wait();
- if (dai->private_data != NULL) {
+ if (clk_ena) {
clk_disable(clk_i2s);
- dai->private_data = NULL;
+ clk_ena = 0;
}
}
}
@@ -300,6 +298,35 @@ static int pxa2xx_i2s_resume(struct snd_soc_dai *dai)
#define pxa2xx_i2s_resume NULL
#endif
+static int pxa2xx_i2s_probe(struct snd_soc_dai *dai)
+{
+ clk_i2s = clk_get(dai->dev, "I2SCLK");
+ if (IS_ERR(clk_i2s))
+ return PTR_ERR(clk_i2s);
+
+ /*
+ * PXA Developer's Manual:
+ * If SACR0[ENB] is toggled in the middle of a normal operation,
+ * the SACR0[RST] bit must also be set and cleared to reset all
+ * I2S controller registers.
+ */
+ SACR0 = SACR0_RST;
+ SACR0 = 0;
+ /* Make sure RPL and REC are disabled */
+ SACR1 = SACR1_DRPL | SACR1_DREC;
+ /* Along with FIFO servicing */
+ SAIMR &= ~(SAIMR_RFS | SAIMR_TFS);
+
+ return 0;
+}
+
+static int pxa2xx_i2s_remove(struct snd_soc_dai *dai)
+{
+ clk_put(clk_i2s);
+ clk_i2s = ERR_PTR(-ENOENT);
+ return 0;
+}
+
#define PXA2XX_I2S_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | \
SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000)
@@ -313,9 +340,9 @@ static struct snd_soc_dai_ops pxa_i2s_dai_ops = {
.set_sysclk = pxa2xx_i2s_set_dai_sysclk,
};
-struct snd_soc_dai pxa_i2s_dai = {
- .name = "pxa2xx-i2s",
- .id = 0,
+static struct snd_soc_dai_driver pxa_i2s_dai = {
+ .probe = pxa2xx_i2s_probe,
+ .remove = pxa2xx_i2s_remove,
.suspend = pxa2xx_i2s_suspend,
.resume = pxa2xx_i2s_resume,
.playback = {
@@ -332,49 +359,20 @@ struct snd_soc_dai pxa_i2s_dai = {
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(pxa_i2s_dai);
-
-static int pxa2xx_i2s_probe(struct platform_device *dev)
+static int pxa2xx_i2s_drv_probe(struct platform_device *pdev)
{
- int ret;
-
- clk_i2s = clk_get(&dev->dev, "I2SCLK");
- if (IS_ERR(clk_i2s))
- return PTR_ERR(clk_i2s);
-
- pxa_i2s_dai.dev = &dev->dev;
- pxa_i2s_dai.private_data = NULL;
- ret = snd_soc_register_dai(&pxa_i2s_dai);
- if (ret != 0)
- clk_put(clk_i2s);
-
- /*
- * PXA Developer's Manual:
- * If SACR0[ENB] is toggled in the middle of a normal operation,
- * the SACR0[RST] bit must also be set and cleared to reset all
- * I2S controller registers.
- */
- SACR0 = SACR0_RST;
- SACR0 = 0;
- /* Make sure RPL and REC are disabled */
- SACR1 = SACR1_DRPL | SACR1_DREC;
- /* Along with FIFO servicing */
- SAIMR &= ~(SAIMR_RFS | SAIMR_TFS);
-
- return ret;
+ return snd_soc_register_dai(&pdev->dev, &pxa_i2s_dai);
}
-static int __devexit pxa2xx_i2s_remove(struct platform_device *dev)
+static int __devexit pxa2xx_i2s_drv_remove(struct platform_device *pdev)
{
- snd_soc_unregister_dai(&pxa_i2s_dai);
- clk_put(clk_i2s);
- clk_i2s = ERR_PTR(-ENOENT);
+ snd_soc_unregister_dai(&pdev->dev);
return 0;
}
static struct platform_driver pxa2xx_i2s_driver = {
- .probe = pxa2xx_i2s_probe,
- .remove = __devexit_p(pxa2xx_i2s_remove),
+ .probe = pxa2xx_i2s_drv_probe,
+ .remove = __devexit_p(pxa2xx_i2s_drv_remove),
.driver = {
.name = "pxa2xx-i2s",
diff --git a/sound/soc/pxa/pxa2xx-i2s.h b/sound/soc/pxa/pxa2xx-i2s.h
index e2def441153e..070f3c6059fe 100644
--- a/sound/soc/pxa/pxa2xx-i2s.h
+++ b/sound/soc/pxa/pxa2xx-i2s.h
@@ -15,6 +15,4 @@
/* I2S clock */
#define PXA2XX_I2S_SYSCLK 0
-extern struct snd_soc_dai pxa_i2s_dai;
-
#endif
diff --git a/sound/soc/pxa/pxa2xx-pcm.c b/sound/soc/pxa/pxa2xx-pcm.c
index adc7e6f15f93..02fb66416ddc 100644
--- a/sound/soc/pxa/pxa2xx-pcm.c
+++ b/sound/soc/pxa/pxa2xx-pcm.c
@@ -16,7 +16,6 @@
#include <sound/soc.h>
#include <sound/pxa2xx-lib.h>
-#include "pxa2xx-pcm.h"
#include "../../arm/pxa2xx-pcm.h"
static int pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,
@@ -28,7 +27,7 @@ static int pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,
struct pxa2xx_pcm_dma_params *dma;
int ret;
- dma = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ dma = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
/* return if this is a bufferless transfer e.g.
* codec <--> BT codec or GSM modem -- lg FIXME */
@@ -95,14 +94,14 @@ static int pxa2xx_soc_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK);
if (ret)
goto out;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE);
if (ret)
@@ -112,25 +111,44 @@ static int pxa2xx_soc_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
return ret;
}
-struct snd_soc_platform pxa2xx_soc_platform = {
- .name = "pxa2xx-audio",
- .pcm_ops = &pxa2xx_pcm_ops,
+static struct snd_soc_platform_driver pxa2xx_soc_platform = {
+ .ops = &pxa2xx_pcm_ops,
.pcm_new = pxa2xx_soc_pcm_new,
.pcm_free = pxa2xx_pcm_free_dma_buffers,
};
-EXPORT_SYMBOL_GPL(pxa2xx_soc_platform);
-static int __init pxa2xx_soc_platform_init(void)
+static int __devinit pxa2xx_soc_platform_probe(struct platform_device *pdev)
{
- return snd_soc_register_platform(&pxa2xx_soc_platform);
+ return snd_soc_register_platform(&pdev->dev, &pxa2xx_soc_platform);
}
-module_init(pxa2xx_soc_platform_init);
-static void __exit pxa2xx_soc_platform_exit(void)
+static int __devexit pxa2xx_soc_platform_remove(struct platform_device *pdev)
{
- snd_soc_unregister_platform(&pxa2xx_soc_platform);
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver pxa_pcm_driver = {
+ .driver = {
+ .name = "pxa-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = pxa2xx_soc_platform_probe,
+ .remove = __devexit_p(pxa2xx_soc_platform_remove),
+};
+
+static int __init snd_pxa_pcm_init(void)
+{
+ return platform_driver_register(&pxa_pcm_driver);
+}
+module_init(snd_pxa_pcm_init);
+
+static void __exit snd_pxa_pcm_exit(void)
+{
+ platform_driver_unregister(&pxa_pcm_driver);
}
-module_exit(pxa2xx_soc_platform_exit);
+module_exit(snd_pxa_pcm_exit);
MODULE_AUTHOR("Nicolas Pitre");
MODULE_DESCRIPTION("Intel PXA2xx PCM DMA module");
diff --git a/sound/soc/pxa/pxa2xx-pcm.h b/sound/soc/pxa/pxa2xx-pcm.h
deleted file mode 100644
index 60c3b20aeeb4..000000000000
--- a/sound/soc/pxa/pxa2xx-pcm.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * linux/sound/arm/pxa2xx-pcm.h -- ALSA PCM interface for the Intel PXA2xx chip
- *
- * Author: Nicolas Pitre
- * Created: Nov 30, 2004
- * Copyright: MontaVista Software, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef _PXA2XX_PCM_H
-#define _PXA2XX_PCM_H
-
-/* platform data */
-extern struct snd_soc_platform pxa2xx_soc_platform;
-
-#endif
diff --git a/sound/soc/pxa/raumfeld.c b/sound/soc/pxa/raumfeld.c
index 7e3f41696c41..2cda82bc5d2e 100644
--- a/sound/soc/pxa/raumfeld.c
+++ b/sound/soc/pxa/raumfeld.c
@@ -26,9 +26,6 @@
#include <asm/mach-types.h>
-#include "../codecs/cs4270.h"
-#include "../codecs/ak4104.h"
-#include "pxa2xx-pcm.h"
#include "pxa-ssp.h"
#define GPIO_SPDIF_RESET (38)
@@ -71,7 +68,7 @@ static void raumfeld_enable_audio(bool en)
static int raumfeld_cs4270_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
/* set freq to 0 to enable all possible codec sample rates */
return snd_soc_dai_set_sysclk(codec_dai, 0, 0, 0);
@@ -80,7 +77,7 @@ static int raumfeld_cs4270_startup(struct snd_pcm_substream *substream)
static void raumfeld_cs4270_shutdown(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
/* set freq to 0 to enable all possible codec sample rates */
snd_soc_dai_set_sysclk(codec_dai, 0, 0, 0);
@@ -90,8 +87,8 @@ static int raumfeld_cs4270_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int fmt, clk = 0;
int ret = 0;
@@ -167,32 +164,14 @@ static int raumfeld_line_resume(struct platform_device *pdev)
return 0;
}
-static struct snd_soc_dai_link raumfeld_line_dai = {
- .name = "CS4270",
- .stream_name = "CS4270",
- .cpu_dai = &pxa_ssp_dai[PXA_DAI_SSP1],
- .codec_dai = &cs4270_dai,
- .ops = &raumfeld_cs4270_ops,
-};
-
-static struct snd_soc_card snd_soc_line_raumfeld = {
- .name = "Raumfeld analog",
- .platform = &pxa2xx_soc_platform,
- .dai_link = &raumfeld_line_dai,
- .suspend_post = raumfeld_line_suspend,
- .resume_pre = raumfeld_line_resume,
- .num_links = 1,
-};
-
-
/* AK4104 */
static int raumfeld_ak4104_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int fmt, ret = 0, clk = 0;
switch (params_rate(params)) {
@@ -247,34 +226,35 @@ static struct snd_soc_ops raumfeld_ak4104_ops = {
.hw_params = raumfeld_ak4104_hw_params,
};
-static struct snd_soc_dai_link raumfeld_spdif_dai = {
+static struct snd_soc_dai_link raumfeld_dai[] = {
+{
.name = "ak4104",
.stream_name = "Playback",
- .cpu_dai = &pxa_ssp_dai[PXA_DAI_SSP2],
- .codec_dai = &ak4104_dai,
+ .cpu_dai_name = "pxa-ssp-dai.1",
+ .codec_dai_name = "ak4104-hifi",
+ .platform_name = "pxa-pcm-audio",
.ops = &raumfeld_ak4104_ops,
-};
-
-static struct snd_soc_card snd_soc_spdif_raumfeld = {
- .name = "Raumfeld S/PDIF",
- .platform = &pxa2xx_soc_platform,
- .dai_link = &raumfeld_spdif_dai,
- .num_links = 1
-};
-
-/* raumfeld_audio audio subsystem */
-static struct snd_soc_device raumfeld_line_devdata = {
- .card = &snd_soc_line_raumfeld,
- .codec_dev = &soc_codec_device_cs4270,
-};
+ .codec_name = "ak4104-codec.0",
+},
+{
+ .name = "CS4270",
+ .stream_name = "CS4270",
+ .cpu_dai_name = "pxa-ssp-dai.0",
+ .platform_name = "pxa-pcm-audio",
+ .codec_dai_name = "cs4270-hifi",
+ .codec_name = "cs4270-codec.0-0048",
+ .ops = &raumfeld_cs4270_ops,
+},};
-static struct snd_soc_device raumfeld_spdif_devdata = {
- .card = &snd_soc_spdif_raumfeld,
- .codec_dev = &soc_codec_device_ak4104,
+static struct snd_soc_card snd_soc_raumfeld = {
+ .name = "Raumfeld",
+ .dai_link = raumfeld_dai,
+ .suspend_post = raumfeld_line_suspend,
+ .resume_pre = raumfeld_line_resume,
+ .num_links = ARRAY_SIZE(raumfeld_dai),
};
-static struct platform_device *raumfeld_audio_line_device;
-static struct platform_device *raumfeld_audio_spdif_device;
+static struct platform_device *raumfeld_audio_device;
static int __init raumfeld_audio_init(void)
{
@@ -292,38 +272,19 @@ static int __init raumfeld_audio_init(void)
set_max9485_clk(MAX9485_MCLK_FREQ_122880);
- /* LINE */
- raumfeld_audio_line_device = platform_device_alloc("soc-audio", 0);
- if (!raumfeld_audio_line_device)
+ /* Register LINE and SPDIF */
+ raumfeld_audio_device = platform_device_alloc("soc-audio", 0);
+ if (!raumfeld_audio_device)
return -ENOMEM;
- platform_set_drvdata(raumfeld_audio_line_device,
- &raumfeld_line_devdata);
- raumfeld_line_devdata.dev = &raumfeld_audio_line_device->dev;
- ret = platform_device_add(raumfeld_audio_line_device);
- if (ret)
- platform_device_put(raumfeld_audio_line_device);
+ platform_set_drvdata(raumfeld_audio_device,
+ &snd_soc_raumfeld);
+ ret = platform_device_add(raumfeld_audio_device);
/* no S/PDIF on Speakers */
if (machine_is_raumfeld_speaker())
return ret;
- /* S/PDIF */
- raumfeld_audio_spdif_device = platform_device_alloc("soc-audio", 1);
- if (!raumfeld_audio_spdif_device) {
- platform_device_put(raumfeld_audio_line_device);
- return -ENOMEM;
- }
-
- platform_set_drvdata(raumfeld_audio_spdif_device,
- &raumfeld_spdif_devdata);
- raumfeld_spdif_devdata.dev = &raumfeld_audio_spdif_device->dev;
- ret = platform_device_add(raumfeld_audio_spdif_device);
- if (ret) {
- platform_device_put(raumfeld_audio_line_device);
- platform_device_put(raumfeld_audio_spdif_device);
- }
-
raumfeld_enable_audio(true);
return ret;
@@ -333,10 +294,7 @@ static void __exit raumfeld_audio_exit(void)
{
raumfeld_enable_audio(false);
- platform_device_unregister(raumfeld_audio_line_device);
-
- if (machine_is_raumfeld_connector())
- platform_device_unregister(raumfeld_audio_spdif_device);
+ platform_device_unregister(raumfeld_audio_device);
i2c_unregister_device(max9486_client);
diff --git a/sound/soc/pxa/spitz.c b/sound/soc/pxa/spitz.c
index d256f5f313b5..f470f360f4dd 100644
--- a/sound/soc/pxa/spitz.c
+++ b/sound/soc/pxa/spitz.c
@@ -28,7 +28,6 @@
#include <asm/mach-types.h>
#include <mach/spitz.h>
#include "../codecs/wm8750.h"
-#include "pxa2xx-pcm.h"
#include "pxa2xx-i2s.h"
#define SPITZ_HP 0
@@ -107,7 +106,7 @@ static void spitz_ext_control(struct snd_soc_codec *codec)
static int spitz_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_codec *codec = rtd->socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->codec;
/* check the jack status at stream startup */
spitz_ext_control(codec);
@@ -118,8 +117,8 @@ static int spitz_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int clk = 0;
int ret = 0;
@@ -274,8 +273,9 @@ static const struct snd_kcontrol_new wm8750_spitz_controls[] = {
/*
* Logic for a wm8750 as connected on a Sharp SL-Cxx00 Device
*/
-static int spitz_wm8750_init(struct snd_soc_codec *codec)
+static int spitz_wm8750_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int err;
/* NC codec pins */
@@ -308,8 +308,10 @@ static int spitz_wm8750_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link spitz_dai = {
.name = "wm8750",
.stream_name = "WM8750",
- .cpu_dai = &pxa_i2s_dai,
- .codec_dai = &wm8750_dai,
+ .cpu_dai_name = "pxa-is2",
+ .codec_dai_name = "wm8750-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm8750-codec.0-001a",
.init = spitz_wm8750_init,
.ops = &spitz_ops,
};
@@ -317,17 +319,10 @@ static struct snd_soc_dai_link spitz_dai = {
/* spitz audio machine driver */
static struct snd_soc_card snd_soc_spitz = {
.name = "Spitz",
- .platform = &pxa2xx_soc_platform,
.dai_link = &spitz_dai,
.num_links = 1,
};
-/* spitz audio subsystem */
-static struct snd_soc_device spitz_snd_devdata = {
- .card = &snd_soc_spitz,
- .codec_dev = &soc_codec_dev_wm8750,
-};
-
static struct platform_device *spitz_snd_device;
static int __init spitz_init(void)
@@ -341,8 +336,7 @@ static int __init spitz_init(void)
if (!spitz_snd_device)
return -ENOMEM;
- platform_set_drvdata(spitz_snd_device, &spitz_snd_devdata);
- spitz_snd_devdata.dev = &spitz_snd_device->dev;
+ platform_set_drvdata(spitz_snd_device, &snd_soc_spitz);
ret = platform_device_add(spitz_snd_device);
if (ret)
diff --git a/sound/soc/pxa/tosa.c b/sound/soc/pxa/tosa.c
index dbbd3e9d1637..a3bfb2e8b70f 100644
--- a/sound/soc/pxa/tosa.c
+++ b/sound/soc/pxa/tosa.c
@@ -33,7 +33,6 @@
#include <mach/audio.h>
#include "../codecs/wm9712.h"
-#include "pxa2xx-pcm.h"
#include "pxa2xx-ac97.h"
static struct snd_soc_card tosa;
@@ -80,7 +79,7 @@ static void tosa_ext_control(struct snd_soc_codec *codec)
static int tosa_startup(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_codec *codec = rtd->socdev->card->codec;
+ struct snd_soc_codec *codec = rtd->card->codec;
/* check the jack status at stream startup */
tosa_ext_control(codec);
@@ -184,8 +183,9 @@ static const struct snd_kcontrol_new tosa_controls[] = {
tosa_set_spk),
};
-static int tosa_ac97_init(struct snd_soc_codec *codec)
+static int tosa_ac97_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int err;
snd_soc_dapm_nc_pin(codec, "OUT3");
@@ -212,16 +212,20 @@ static struct snd_soc_dai_link tosa_dai[] = {
{
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
- .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI],
+ .cpu_dai_name = "pxa-ac97.0",
+ .codec_dai_name = "wm9712-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9712-codec",
.init = tosa_ac97_init,
.ops = &tosa_ops,
},
{
.name = "AC97 Aux",
.stream_name = "AC97 Aux",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX],
- .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX],
+ .cpu_dai_name = "pxa-ac97.1",
+ .codec_dai_name = "wm9712-aux",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9712-codec",
.ops = &tosa_ops,
},
};
@@ -248,18 +252,12 @@ static int tosa_remove(struct platform_device *dev)
static struct snd_soc_card tosa = {
.name = "Tosa",
- .platform = &pxa2xx_soc_platform,
.dai_link = tosa_dai,
.num_links = ARRAY_SIZE(tosa_dai),
.probe = tosa_probe,
.remove = tosa_remove,
};
-static struct snd_soc_device tosa_snd_devdata = {
- .card = &tosa,
- .codec_dev = &soc_codec_dev_wm9712,
-};
-
static struct platform_device *tosa_snd_device;
static int __init tosa_init(void)
@@ -275,8 +273,7 @@ static int __init tosa_init(void)
goto err_alloc;
}
- platform_set_drvdata(tosa_snd_device, &tosa_snd_devdata);
- tosa_snd_devdata.dev = &tosa_snd_device->dev;
+ platform_set_drvdata(tosa_snd_device, &tosa);
ret = platform_device_add(tosa_snd_device);
if (!ret)
diff --git a/sound/soc/pxa/z2.c b/sound/soc/pxa/z2.c
index 4e4d2fa8ddc5..704f74b56ab6 100644
--- a/sound/soc/pxa/z2.c
+++ b/sound/soc/pxa/z2.c
@@ -30,7 +30,6 @@
#include <mach/z2.h>
#include "../codecs/wm8750.h"
-#include "pxa2xx-pcm.h"
#include "pxa2xx-i2s.h"
static struct snd_soc_card snd_soc_z2;
@@ -39,8 +38,8 @@ static int z2_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int clk = 0;
int ret = 0;
@@ -138,8 +137,9 @@ static const struct snd_soc_dapm_route audio_map[] = {
/*
* Logic for a wm8750 as connected on a Z2 Device
*/
-static int z2_wm8750_init(struct snd_soc_codec *codec)
+static int z2_wm8750_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int ret;
/* NC codec pins */
@@ -160,7 +160,7 @@ static int z2_wm8750_init(struct snd_soc_codec *codec)
goto err;
/* Jack detection API stuff */
- ret = snd_soc_jack_new(&snd_soc_z2, "Headset Jack", SND_JACK_HEADSET,
+ ret = snd_soc_jack_new(codec, "Headset Jack", SND_JACK_HEADSET,
&hs_jack);
if (ret)
goto err;
@@ -189,8 +189,10 @@ static struct snd_soc_ops z2_ops = {
static struct snd_soc_dai_link z2_dai = {
.name = "wm8750",
.stream_name = "WM8750",
- .cpu_dai = &pxa_i2s_dai,
- .codec_dai = &wm8750_dai,
+ .cpu_dai_name = "pxa-i2s",
+ .codec_dai_name = "wm8750-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm8750-codec.0-001a",
.init = z2_wm8750_init,
.ops = &z2_ops,
};
@@ -198,17 +200,10 @@ static struct snd_soc_dai_link z2_dai = {
/* z2 audio machine driver */
static struct snd_soc_card snd_soc_z2 = {
.name = "Z2",
- .platform = &pxa2xx_soc_platform,
.dai_link = &z2_dai,
.num_links = 1,
};
-/* z2 audio subsystem */
-static struct snd_soc_device z2_snd_devdata = {
- .card = &snd_soc_z2,
- .codec_dev = &soc_codec_dev_wm8750,
-};
-
static struct platform_device *z2_snd_device;
static int __init z2_init(void)
@@ -222,8 +217,7 @@ static int __init z2_init(void)
if (!z2_snd_device)
return -ENOMEM;
- platform_set_drvdata(z2_snd_device, &z2_snd_devdata);
- z2_snd_devdata.dev = &z2_snd_device->dev;
+ platform_set_drvdata(z2_snd_device, &snd_soc_z2);
ret = platform_device_add(z2_snd_device);
if (ret)
diff --git a/sound/soc/pxa/zylonite.c b/sound/soc/pxa/zylonite.c
index dd678ae24398..d27e05af7759 100644
--- a/sound/soc/pxa/zylonite.c
+++ b/sound/soc/pxa/zylonite.c
@@ -23,7 +23,6 @@
#include <sound/soc-dapm.h>
#include "../codecs/wm9713.h"
-#include "pxa2xx-pcm.h"
#include "pxa2xx-ac97.h"
#include "pxa-ssp.h"
@@ -71,10 +70,12 @@ static const struct snd_soc_dapm_route audio_map[] = {
{ "Multiactor", NULL, "SPKR" },
};
-static int zylonite_wm9713_init(struct snd_soc_codec *codec)
+static int zylonite_wm9713_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
if (clk_pout)
- snd_soc_dai_set_pll(&codec->dai[0], 0, 0,
+ snd_soc_dai_set_pll(rtd->codec_dai, 0, 0,
clk_get_rate(pout), 0);
snd_soc_dapm_new_controls(codec, zylonite_dapm_widgets,
@@ -94,8 +95,8 @@ static int zylonite_voice_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int pll_out = 0;
unsigned int wm9713_div = 0;
int ret = 0;
@@ -163,21 +164,27 @@ static struct snd_soc_dai_link zylonite_dai[] = {
{
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
- .codec_dai = &wm9713_dai[WM9713_DAI_AC97_HIFI],
+ .codec_name = "wm9713-codec",
+ .platform_name = "pxa-pcm-audio",
+ .cpu_dai_name = "pxa-ac97.0",
+ .codec_name = "wm9713-hifi",
.init = zylonite_wm9713_init,
},
{
.name = "AC97 Aux",
.stream_name = "AC97 Aux",
- .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX],
- .codec_dai = &wm9713_dai[WM9713_DAI_AC97_AUX],
+ .codec_name = "wm9713-codec",
+ .platform_name = "pxa-pcm-audio",
+ .cpu_dai_name = "pxa-ac97.1",
+ .codec_name = "wm9713-aux",
},
{
.name = "WM9713 Voice",
.stream_name = "WM9713 Voice",
- .cpu_dai = &pxa_ssp_dai[PXA_DAI_SSP3],
- .codec_dai = &wm9713_dai[WM9713_DAI_PCM_VOICE],
+ .codec_name = "wm9713-codec",
+ .platform_name = "pxa-pcm-audio",
+ .cpu_dai_name = "pxa-ssp-dai.2",
+ .codec_name = "wm9713-voice",
.ops = &zylonite_voice_ops,
},
};
@@ -248,14 +255,9 @@ static struct snd_soc_card zylonite = {
.remove = &zylonite_remove,
.suspend_post = &zylonite_suspend_post,
.resume_pre = &zylonite_resume_pre,
- .platform = &pxa2xx_soc_platform,
.dai_link = zylonite_dai,
.num_links = ARRAY_SIZE(zylonite_dai),
-};
-
-static struct snd_soc_device zylonite_snd_ac97_devdata = {
- .card = &zylonite,
- .codec_dev = &soc_codec_dev_wm9713,
+ .owner = THIS_MODULE,
};
static struct platform_device *zylonite_snd_ac97_device;
@@ -268,9 +270,7 @@ static int __init zylonite_init(void)
if (!zylonite_snd_ac97_device)
return -ENOMEM;
- platform_set_drvdata(zylonite_snd_ac97_device,
- &zylonite_snd_ac97_devdata);
- zylonite_snd_ac97_devdata.dev = &zylonite_snd_ac97_device->dev;
+ platform_set_drvdata(zylonite_snd_ac97_device, &zylonite);
ret = platform_device_add(zylonite_snd_ac97_device);
if (ret != 0)
diff --git a/sound/soc/s3c24xx/Kconfig b/sound/soc/s3c24xx/Kconfig
index 213963ac3c28..1cdc37bd58f4 100644
--- a/sound/soc/s3c24xx/Kconfig
+++ b/sound/soc/s3c24xx/Kconfig
@@ -131,3 +131,21 @@ config SND_S3C64XX_SOC_SMARTQ
depends on SND_S3C24XX_SOC && MACH_SMARTQ
select SND_S3C64XX_SOC_I2S
select SND_SOC_WM8750
+
+config SND_S5PC110_SOC_AQUILA_WM8994
+ tristate "SoC I2S Audio support for AQUILA - WM8994"
+ depends on SND_S3C24XX_SOC && MACH_AQUILA
+ select SND_S3C64XX_SOC_I2S_V4
+ select SND_SOC_WM8994
+ help
+ Say Y if you want to add support for SoC audio on aquila
+ with the WM8994.
+
+config SND_S5PV210_SOC_GONI_WM8994
+ tristate "SoC I2S Audio support for GONI - WM8994"
+ depends on SND_S3C24XX_SOC && MACH_GONI
+ select SND_S3C64XX_SOC_I2S_V4
+ select SND_SOC_WM8994
+ help
+ Say Y if you want to add support for SoC audio on goni
+ with the WM8994.
diff --git a/sound/soc/s3c24xx/Makefile b/sound/soc/s3c24xx/Makefile
index 50172c385d90..47ed6d70b90b 100644
--- a/sound/soc/s3c24xx/Makefile
+++ b/sound/soc/s3c24xx/Makefile
@@ -30,6 +30,8 @@ snd-soc-s3c24xx-simtec-tlv320aic23-objs := s3c24xx_simtec_tlv320aic23.o
snd-soc-smdk64xx-wm8580-objs := smdk64xx_wm8580.o
snd-soc-smdk-wm9713-objs := smdk_wm9713.o
snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o
+snd-soc-aquila-wm8994-objs := aquila_wm8994.o
+snd-soc-goni-wm8994-objs := goni_wm8994.o
obj-$(CONFIG_SND_S3C24XX_SOC_JIVE_WM8750) += snd-soc-jive-wm8750.o
obj-$(CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753) += snd-soc-neo1973-wm8753.o
@@ -43,3 +45,5 @@ obj-$(CONFIG_SND_S3C24XX_SOC_SIMTEC_TLV320AIC23) += snd-soc-s3c24xx-simtec-tlv32
obj-$(CONFIG_SND_S3C64XX_SOC_WM8580) += snd-soc-smdk64xx-wm8580.o
obj-$(CONFIG_SND_SOC_SMDK_WM9713) += snd-soc-smdk-wm9713.o
obj-$(CONFIG_SND_S3C64XX_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o
+obj-$(CONFIG_SND_S5PC110_SOC_AQUILA_WM8994) += snd-soc-aquila-wm8994.o
+obj-$(CONFIG_SND_S5PV210_SOC_GONI_WM8994) += snd-soc-goni-wm8994.o
diff --git a/sound/soc/s3c24xx/aquila_wm8994.c b/sound/soc/s3c24xx/aquila_wm8994.c
new file mode 100644
index 000000000000..235d1973f7d0
--- /dev/null
+++ b/sound/soc/s3c24xx/aquila_wm8994.c
@@ -0,0 +1,295 @@
+/*
+ * aquila_wm8994.c
+ *
+ * Copyright (C) 2010 Samsung Electronics Co.Ltd
+ * Author: Chanwoo Choi <cw00.choi@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/io.h>
+#include <linux/platform_device.h>
+#include <sound/soc.h>
+#include <sound/soc-dapm.h>
+#include <sound/jack.h>
+#include <asm/mach-types.h>
+#include <mach/gpio.h>
+#include <mach/regs-clock.h>
+
+#include <linux/mfd/wm8994/core.h>
+#include <linux/mfd/wm8994/registers.h>
+#include "../codecs/wm8994.h"
+#include "s3c-dma.h"
+#include "s3c64xx-i2s.h"
+
+static struct snd_soc_card aquila;
+static struct platform_device *aquila_snd_device;
+
+/* 3.5 pie jack */
+static struct snd_soc_jack jack;
+
+/* 3.5 pie jack detection DAPM pins */
+static struct snd_soc_jack_pin jack_pins[] = {
+ {
+ .pin = "Headset Mic",
+ .mask = SND_JACK_MICROPHONE,
+ }, {
+ .pin = "Headset Stereophone",
+ .mask = SND_JACK_HEADPHONE | SND_JACK_MECHANICAL |
+ SND_JACK_AVOUT,
+ },
+};
+
+/* 3.5 pie jack detection gpios */
+static struct snd_soc_jack_gpio jack_gpios[] = {
+ {
+ .gpio = S5PV210_GPH0(6),
+ .name = "DET_3.5",
+ .report = SND_JACK_HEADSET | SND_JACK_MECHANICAL |
+ SND_JACK_AVOUT,
+ .debounce_time = 200,
+ },
+};
+
+static const struct snd_soc_dapm_widget aquila_dapm_widgets[] = {
+ SND_SOC_DAPM_SPK("Ext Spk", NULL),
+ SND_SOC_DAPM_SPK("Ext Rcv", NULL),
+ SND_SOC_DAPM_HP("Headset Stereophone", NULL),
+ SND_SOC_DAPM_MIC("Headset Mic", NULL),
+ SND_SOC_DAPM_MIC("Main Mic", NULL),
+ SND_SOC_DAPM_MIC("2nd Mic", NULL),
+ SND_SOC_DAPM_LINE("Radio In", NULL),
+};
+
+static const struct snd_soc_dapm_route aquila_dapm_routes[] = {
+ {"Ext Spk", NULL, "SPKOUTLP"},
+ {"Ext Spk", NULL, "SPKOUTLN"},
+
+ {"Ext Rcv", NULL, "HPOUT2N"},
+ {"Ext Rcv", NULL, "HPOUT2P"},
+
+ {"Headset Stereophone", NULL, "HPOUT1L"},
+ {"Headset Stereophone", NULL, "HPOUT1R"},
+
+ {"IN1RN", NULL, "Headset Mic"},
+ {"IN1RP", NULL, "Headset Mic"},
+
+ {"IN1RN", NULL, "2nd Mic"},
+ {"IN1RP", NULL, "2nd Mic"},
+
+ {"IN1LN", NULL, "Main Mic"},
+ {"IN1LP", NULL, "Main Mic"},
+
+ {"IN2LN", NULL, "Radio In"},
+ {"IN2RN", NULL, "Radio In"},
+};
+
+static int aquila_wm8994_init(struct snd_soc_pcm_runtime *rtd)
+{
+ struct snd_soc_codec *codec = rtd->codec;
+ int ret;
+
+ /* add aquila specific widgets */
+ snd_soc_dapm_new_controls(codec, aquila_dapm_widgets,
+ ARRAY_SIZE(aquila_dapm_widgets));
+
+ /* set up aquila specific audio routes */
+ snd_soc_dapm_add_routes(codec, aquila_dapm_routes,
+ ARRAY_SIZE(aquila_dapm_routes));
+
+ /* set endpoints to not connected */
+ snd_soc_dapm_nc_pin(codec, "IN2LP:VXRN");
+ snd_soc_dapm_nc_pin(codec, "IN2RP:VXRP");
+ snd_soc_dapm_nc_pin(codec, "LINEOUT1N");
+ snd_soc_dapm_nc_pin(codec, "LINEOUT1P");
+ snd_soc_dapm_nc_pin(codec, "LINEOUT2N");
+ snd_soc_dapm_nc_pin(codec, "LINEOUT2P");
+ snd_soc_dapm_nc_pin(codec, "SPKOUTRN");
+ snd_soc_dapm_nc_pin(codec, "SPKOUTRP");
+
+ snd_soc_dapm_sync(codec);
+
+ /* Headset jack detection */
+ ret = snd_soc_jack_new(&aquila, "Headset Jack",
+ SND_JACK_HEADSET | SND_JACK_MECHANICAL | SND_JACK_AVOUT,
+ &jack);
+ if (ret)
+ return ret;
+
+ ret = snd_soc_jack_add_pins(&jack, ARRAY_SIZE(jack_pins), jack_pins);
+ if (ret)
+ return ret;
+
+ ret = snd_soc_jack_add_gpios(&jack, ARRAY_SIZE(jack_gpios), jack_gpios);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
+static int aquila_hifi_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params)
+{
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ unsigned int pll_out = 24000000;
+ int ret = 0;
+
+ /* set the cpu DAI configuration */
+ ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
+ SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
+ if (ret < 0)
+ return ret;
+
+ /* set the cpu system clock */
+ ret = snd_soc_dai_set_sysclk(cpu_dai, S3C64XX_CLKSRC_PCLK,
+ 0, SND_SOC_CLOCK_IN);
+ if (ret < 0)
+ return ret;
+
+ /* set codec DAI configuration */
+ ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
+ SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
+ if (ret < 0)
+ return ret;
+
+ /* set the codec FLL */
+ ret = snd_soc_dai_set_pll(codec_dai, WM8994_FLL1, 0, pll_out,
+ params_rate(params) * 256);
+ if (ret < 0)
+ return ret;
+
+ /* set the codec system clock */
+ ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL1,
+ params_rate(params) * 256, SND_SOC_CLOCK_IN);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
+static struct snd_soc_ops aquila_hifi_ops = {
+ .hw_params = aquila_hifi_hw_params,
+};
+
+static int aquila_voice_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params)
+{
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ unsigned int pll_out = 24000000;
+ int ret = 0;
+
+ if (params_rate(params) != 8000)
+ return -EINVAL;
+
+ /* set codec DAI configuration */
+ ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_LEFT_J |
+ SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_CBM_CFM);
+ if (ret < 0)
+ return ret;
+
+ /* set the codec FLL */
+ ret = snd_soc_dai_set_pll(codec_dai, WM8994_FLL2, 0, pll_out,
+ params_rate(params) * 256);
+ if (ret < 0)
+ return ret;
+
+ /* set the codec system clock */
+ ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL2,
+ params_rate(params) * 256, SND_SOC_CLOCK_IN);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
+static struct snd_soc_dai_driver voice_dai = {
+ .name = "aquila-voice-dai",
+ .playback = {
+ .channels_min = 1,
+ .channels_max = 2,
+ .rates = SNDRV_PCM_RATE_8000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,},
+ .capture = {
+ .channels_min = 1,
+ .channels_max = 2,
+ .rates = SNDRV_PCM_RATE_8000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,},
+};
+
+static struct snd_soc_ops aquila_voice_ops = {
+ .hw_params = aquila_voice_hw_params,
+};
+
+static struct snd_soc_dai_link aquila_dai[] = {
+{
+ .name = "WM8994",
+ .stream_name = "WM8994 HiFi",
+ .cpu_dai_name = "s3c64xx-i2s-v4",
+ .codec_dai_name = "wm8994-hifi",
+ .platform_name = "s3c24xx-pcm-audio",
+ .codec_name = "wm8994-codec.0-0x1a",
+ .init = aquila_wm8994_init,
+ .ops = &aquila_hifi_ops,
+}, {
+ .name = "WM8994 Voice",
+ .stream_name = "Voice",
+ .cpu_dai_name = "aquila-voice-dai",
+ .codec_dai_name = "wm8994-voice",
+ .platform_name = "s3c24xx-pcm-audio",
+ .codec_name = "wm8994-codec.0-0x1a",
+ .ops = &aquila_voice_ops,
+},
+};
+
+static struct snd_soc_card aquila = {
+ .name = "aquila",
+ .dai_link = aquila_dai,
+ .num_links = ARRAY_SIZE(aquila_dai),
+};
+
+static int __init aquila_init(void)
+{
+ int ret;
+
+ if (!machine_is_aquila())
+ return -ENODEV;
+
+ aquila_snd_device = platform_device_alloc("soc-audio", -1);
+ if (!aquila_snd_device)
+ return -ENOMEM;
+
+ /* register voice DAI here */
+ ret = snd_soc_register_dai(&aquila_snd_device->dev, &voice_dai);
+ if (ret)
+ return ret;
+
+ platform_set_drvdata(aquila_snd_device, &aquila);
+ ret = platform_device_add(aquila_snd_device);
+
+ if (ret)
+ platform_device_put(aquila_snd_device);
+
+ return ret;
+}
+
+static void __exit aquila_exit(void)
+{
+ platform_device_unregister(aquila_snd_device);
+}
+
+module_init(aquila_init);
+module_exit(aquila_exit);
+
+/* Module information */
+MODULE_DESCRIPTION("ALSA SoC WM8994 Aquila(S5PC110)");
+MODULE_AUTHOR("Chanwoo Choi <cw00.choi@samsung.com>");
+MODULE_LICENSE("GPL");
diff --git a/sound/soc/s3c24xx/goni_wm8994.c b/sound/soc/s3c24xx/goni_wm8994.c
new file mode 100644
index 000000000000..694f702cc8e2
--- /dev/null
+++ b/sound/soc/s3c24xx/goni_wm8994.c
@@ -0,0 +1,298 @@
+/*
+ * goni_wm8994.c
+ *
+ * Copyright (C) 2010 Samsung Electronics Co.Ltd
+ * Author: Chanwoo Choi <cw00.choi@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/io.h>
+#include <linux/platform_device.h>
+#include <sound/soc.h>
+#include <sound/soc-dapm.h>
+#include <sound/jack.h>
+#include <asm/mach-types.h>
+#include <mach/gpio.h>
+#include <mach/regs-clock.h>
+
+#include <linux/mfd/wm8994/core.h>
+#include <linux/mfd/wm8994/registers.h>
+#include "../codecs/wm8994.h"
+#include "s3c-dma.h"
+#include "s3c64xx-i2s.h"
+
+static struct snd_soc_card goni;
+static struct platform_device *goni_snd_device;
+
+/* 3.5 pie jack */
+static struct snd_soc_jack jack;
+
+/* 3.5 pie jack detection DAPM pins */
+static struct snd_soc_jack_pin jack_pins[] = {
+ {
+ .pin = "Headset Mic",
+ .mask = SND_JACK_MICROPHONE,
+ }, {
+ .pin = "Headset Stereophone",
+ .mask = SND_JACK_HEADPHONE | SND_JACK_MECHANICAL |
+ SND_JACK_AVOUT,
+ },
+};
+
+/* 3.5 pie jack detection gpios */
+static struct snd_soc_jack_gpio jack_gpios[] = {
+ {
+ .gpio = S5PV210_GPH0(6),
+ .name = "DET_3.5",
+ .report = SND_JACK_HEADSET | SND_JACK_MECHANICAL |
+ SND_JACK_AVOUT,
+ .debounce_time = 200,
+ },
+};
+
+static const struct snd_soc_dapm_widget goni_dapm_widgets[] = {
+ SND_SOC_DAPM_SPK("Ext Left Spk", NULL),
+ SND_SOC_DAPM_SPK("Ext Right Spk", NULL),
+ SND_SOC_DAPM_SPK("Ext Rcv", NULL),
+ SND_SOC_DAPM_HP("Headset Stereophone", NULL),
+ SND_SOC_DAPM_MIC("Headset Mic", NULL),
+ SND_SOC_DAPM_MIC("Main Mic", NULL),
+ SND_SOC_DAPM_MIC("2nd Mic", NULL),
+ SND_SOC_DAPM_LINE("Radio In", NULL),
+};
+
+static const struct snd_soc_dapm_route goni_dapm_routes[] = {
+ {"Ext Left Spk", NULL, "SPKOUTLP"},
+ {"Ext Left Spk", NULL, "SPKOUTLN"},
+
+ {"Ext Right Spk", NULL, "SPKOUTRP"},
+ {"Ext Right Spk", NULL, "SPKOUTRN"},
+
+ {"Ext Rcv", NULL, "HPOUT2N"},
+ {"Ext Rcv", NULL, "HPOUT2P"},
+
+ {"Headset Stereophone", NULL, "HPOUT1L"},
+ {"Headset Stereophone", NULL, "HPOUT1R"},
+
+ {"IN1RN", NULL, "Headset Mic"},
+ {"IN1RP", NULL, "Headset Mic"},
+
+ {"IN1RN", NULL, "2nd Mic"},
+ {"IN1RP", NULL, "2nd Mic"},
+
+ {"IN1LN", NULL, "Main Mic"},
+ {"IN1LP", NULL, "Main Mic"},
+
+ {"IN2LN", NULL, "Radio In"},
+ {"IN2RN", NULL, "Radio In"},
+};
+
+static int goni_wm8994_init(struct snd_soc_pcm_runtime *rtd)
+{
+ struct snd_soc_codec *codec = rtd->codec;
+ int ret;
+
+ /* add goni specific widgets */
+ snd_soc_dapm_new_controls(codec, goni_dapm_widgets,
+ ARRAY_SIZE(goni_dapm_widgets));
+
+ /* set up goni specific audio routes */
+ snd_soc_dapm_add_routes(codec, goni_dapm_routes,
+ ARRAY_SIZE(goni_dapm_routes));
+
+ /* set endpoints to not connected */
+ snd_soc_dapm_nc_pin(codec, "IN2LP:VXRN");
+ snd_soc_dapm_nc_pin(codec, "IN2RP:VXRP");
+ snd_soc_dapm_nc_pin(codec, "LINEOUT1N");
+ snd_soc_dapm_nc_pin(codec, "LINEOUT1P");
+ snd_soc_dapm_nc_pin(codec, "LINEOUT2N");
+ snd_soc_dapm_nc_pin(codec, "LINEOUT2P");
+
+ snd_soc_dapm_sync(codec);
+
+ /* Headset jack detection */
+ ret = snd_soc_jack_new(&goni, "Headset Jack",
+ SND_JACK_HEADSET | SND_JACK_MECHANICAL | SND_JACK_AVOUT,
+ &jack);
+ if (ret)
+ return ret;
+
+ ret = snd_soc_jack_add_pins(&jack, ARRAY_SIZE(jack_pins), jack_pins);
+ if (ret)
+ return ret;
+
+ ret = snd_soc_jack_add_gpios(&jack, ARRAY_SIZE(jack_gpios), jack_gpios);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
+static int goni_hifi_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params)
+{
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ unsigned int pll_out = 24000000;
+ int ret = 0;
+
+ /* set the cpu DAI configuration */
+ ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
+ SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
+ if (ret < 0)
+ return ret;
+
+ /* set the cpu system clock */
+ ret = snd_soc_dai_set_sysclk(cpu_dai, S3C64XX_CLKSRC_PCLK,
+ 0, SND_SOC_CLOCK_IN);
+ if (ret < 0)
+ return ret;
+
+ /* set codec DAI configuration */
+ ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
+ SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
+ if (ret < 0)
+ return ret;
+
+ /* set the codec FLL */
+ ret = snd_soc_dai_set_pll(codec_dai, WM8994_FLL1, 0, pll_out,
+ params_rate(params) * 256);
+ if (ret < 0)
+ return ret;
+
+ /* set the codec system clock */
+ ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL1,
+ params_rate(params) * 256, SND_SOC_CLOCK_IN);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
+static struct snd_soc_ops goni_hifi_ops = {
+ .hw_params = goni_hifi_hw_params,
+};
+
+static int goni_voice_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params)
+{
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ unsigned int pll_out = 24000000;
+ int ret = 0;
+
+ if (params_rate(params) != 8000)
+ return -EINVAL;
+
+ /* set codec DAI configuration */
+ ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_LEFT_J |
+ SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_CBM_CFM);
+ if (ret < 0)
+ return ret;
+
+ /* set the codec FLL */
+ ret = snd_soc_dai_set_pll(codec_dai, WM8994_FLL2, 0, pll_out,
+ params_rate(params) * 256);
+ if (ret < 0)
+ return ret;
+
+ /* set the codec system clock */
+ ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL2,
+ params_rate(params) * 256, SND_SOC_CLOCK_IN);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
+static struct snd_soc_dai_driver voice_dai = {
+ .name = "goni-voice-dai",
+ .id = 0,
+ .playback = {
+ .channels_min = 1,
+ .channels_max = 2,
+ .rates = SNDRV_PCM_RATE_8000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,},
+ .capture = {
+ .channels_min = 1,
+ .channels_max = 2,
+ .rates = SNDRV_PCM_RATE_8000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,},
+};
+
+static struct snd_soc_ops goni_voice_ops = {
+ .hw_params = goni_voice_hw_params,
+};
+
+static struct snd_soc_dai_link goni_dai[] = {
+{
+ .name = "WM8994",
+ .stream_name = "WM8994 HiFi",
+ .cpu_dai_name = "s3c64xx-i2s-v4",
+ .codec_dai_name = "wm8994-hifi",
+ .platform_name = "s3c24xx-pcm-audio",
+ .codec_name = "wm8994-codec.0-0x1a",
+ .init = goni_wm8994_init,
+ .ops = &goni_hifi_ops,
+}, {
+ .name = "WM8994 Voice",
+ .stream_name = "Voice",
+ .cpu_dai_name = "goni-voice-dai",
+ .codec_dai_name = "wm8994-voice",
+ .platform_name = "s3c24xx-pcm-audio",
+ .codec_name = "wm8994-codec.0-0x1a",
+ .ops = &goni_voice_ops,
+},
+};
+
+static struct snd_soc_card goni = {
+ .name = "goni",
+ .dai_link = goni_dai,
+ .num_links = ARRAY_SIZE(goni_dai),
+};
+
+static int __init goni_init(void)
+{
+ int ret;
+
+ if (!machine_is_goni())
+ return -ENODEV;
+
+ goni_snd_device = platform_device_alloc("soc-audio", -1);
+ if (!goni_snd_device)
+ return -ENOMEM;
+
+ /* register voice DAI here */
+ ret = snd_soc_register_dai(&goni_snd_device->dev, &voice_dai);
+ if (ret)
+ return ret;
+
+ platform_set_drvdata(goni_snd_device, &goni);
+ ret = platform_device_add(goni_snd_device);
+
+ if (ret)
+ platform_device_put(goni_snd_device);
+
+ return ret;
+}
+
+static void __exit goni_exit(void)
+{
+ platform_device_unregister(goni_snd_device);
+}
+
+module_init(goni_init);
+module_exit(goni_exit);
+
+/* Module information */
+MODULE_DESCRIPTION("ALSA SoC WM8994 GONI(S5PV210)");
+MODULE_AUTHOR("Chanwoo Choi <cw00.choi@samsung.com>");
+MODULE_LICENSE("GPL");
diff --git a/sound/soc/s3c24xx/jive_wm8750.c b/sound/soc/s3c24xx/jive_wm8750.c
index 8c108b121c10..49605cd83947 100644
--- a/sound/soc/s3c24xx/jive_wm8750.c
+++ b/sound/soc/s3c24xx/jive_wm8750.c
@@ -49,8 +49,8 @@ static int jive_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
struct s3c_i2sv2_rate_calc div;
unsigned int clk = 0;
int ret = 0;
@@ -108,8 +108,9 @@ static struct snd_soc_ops jive_ops = {
.hw_params = jive_hw_params,
};
-static int jive_wm8750_init(struct snd_soc_codec *codec)
+static int jive_wm8750_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int err;
/* These endpoints are not being used. */
@@ -138,8 +139,10 @@ static int jive_wm8750_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link jive_dai = {
.name = "wm8750",
.stream_name = "WM8750",
- .cpu_dai = &s3c2412_i2s_dai,
- .codec_dai = &wm8750_dai,
+ .cpu_dai_name = "s3c2412-i2s",
+ .codec_dai_name = "wm8750-hifi",
+ .platform_name = "s3c24xx-pcm-audio",
+ .codec_name = "wm8750-codec.0-0x1a",
.init = jive_wm8750_init,
.ops = &jive_ops,
};
@@ -147,17 +150,10 @@ static struct snd_soc_dai_link jive_dai = {
/* jive audio machine driver */
static struct snd_soc_card snd_soc_machine_jive = {
.name = "Jive",
- .platform = &s3c24xx_soc_platform,
.dai_link = &jive_dai,
.num_links = 1,
};
-/* jive audio subsystem */
-static struct snd_soc_device jive_snd_devdata = {
- .card = &snd_soc_machine_jive,
- .codec_dev = &soc_codec_dev_wm8750,
-};
-
static struct platform_device *jive_snd_device;
static int __init jive_init(void)
@@ -173,8 +169,7 @@ static int __init jive_init(void)
if (!jive_snd_device)
return -ENOMEM;
- platform_set_drvdata(jive_snd_device, &jive_snd_devdata);
- jive_snd_devdata.dev = &jive_snd_device->dev;
+ platform_set_drvdata(jive_snd_device, &snd_soc_machine_jive);
ret = platform_device_add(jive_snd_device);
if (ret)
diff --git a/sound/soc/s3c24xx/ln2440sbc_alc650.c b/sound/soc/s3c24xx/ln2440sbc_alc650.c
index ffa954fe6931..abe64abe8c84 100644
--- a/sound/soc/s3c24xx/ln2440sbc_alc650.c
+++ b/sound/soc/s3c24xx/ln2440sbc_alc650.c
@@ -23,7 +23,6 @@
#include <sound/soc.h>
#include <sound/soc-dapm.h>
-#include "../codecs/ac97.h"
#include "s3c-dma.h"
#include "s3c-ac97.h"
@@ -33,23 +32,19 @@ static struct snd_soc_dai_link ln2440sbc_dai[] = {
{
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &s3c_ac97_dai[S3C_AC97_DAI_PCM],
- .codec_dai = &ac97_dai,
+ .cpu_dai_name = "s3c-ac97",
+ .codec_dai_name = "ac97-hifi",
+ .codec_name = "ac97-codec",
+ .platform_name = "s3c24xx-pcm-audio",
},
};
static struct snd_soc_card ln2440sbc = {
.name = "LN2440SBC",
- .platform = &s3c24xx_soc_platform,
.dai_link = ln2440sbc_dai,
.num_links = ARRAY_SIZE(ln2440sbc_dai),
};
-static struct snd_soc_device ln2440sbc_snd_ac97_devdata = {
- .card = &ln2440sbc,
- .codec_dev = &soc_codec_dev_ac97,
-};
-
static struct platform_device *ln2440sbc_snd_ac97_device;
static int __init ln2440sbc_init(void)
@@ -60,9 +55,7 @@ static int __init ln2440sbc_init(void)
if (!ln2440sbc_snd_ac97_device)
return -ENOMEM;
- platform_set_drvdata(ln2440sbc_snd_ac97_device,
- &ln2440sbc_snd_ac97_devdata);
- ln2440sbc_snd_ac97_devdata.dev = &ln2440sbc_snd_ac97_device->dev;
+ platform_set_drvdata(ln2440sbc_snd_ac97_device, &ln2440sbc);
ret = platform_device_add(ln2440sbc_snd_ac97_device);
if (ret)
diff --git a/sound/soc/s3c24xx/neo1973_gta02_wm8753.c b/sound/soc/s3c24xx/neo1973_gta02_wm8753.c
index 209c25994c7e..c457bfd8297c 100644
--- a/sound/soc/s3c24xx/neo1973_gta02_wm8753.c
+++ b/sound/soc/s3c24xx/neo1973_gta02_wm8753.c
@@ -41,8 +41,8 @@ static int neo1973_gta02_hifi_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int pll_out = 0, bclk = 0;
int ret = 0;
unsigned long iis_clkrate;
@@ -130,7 +130,7 @@ static int neo1973_gta02_hifi_hw_params(struct snd_pcm_substream *substream,
static int neo1973_gta02_hifi_hw_free(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
/* disable the PLL */
return snd_soc_dai_set_pll(codec_dai, WM8753_PLL1, 0, 0, 0);
@@ -149,7 +149,7 @@ static int neo1973_gta02_voice_hw_params(
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
unsigned int pcmdiv = 0;
int ret = 0;
unsigned long iis_clkrate;
@@ -194,7 +194,7 @@ static int neo1973_gta02_voice_hw_params(
static int neo1973_gta02_voice_hw_free(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
/* disable the PLL */
return snd_soc_dai_set_pll(codec_dai, WM8753_PLL2, 0, 0, 0);
@@ -262,7 +262,7 @@ static int lm4853_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *k,
int event)
{
- gpio_set_value(GTA02_GPIO_AMP_SHUT, SND_SOC_DAPM_EVENT_OFF(value));
+ gpio_set_value(GTA02_GPIO_AMP_SHUT, SND_SOC_DAPM_EVENT_OFF(event));
return 0;
}
@@ -330,8 +330,9 @@ static const struct snd_kcontrol_new wm8753_neo1973_gta02_controls[] = {
* This is an example machine initialisation for a wm8753 connected to a
* neo1973 GTA02.
*/
-static int neo1973_gta02_wm8753_init(struct snd_soc_codec *codec)
+static int neo1973_gta02_wm8753_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int err;
/* set up NC codec pins */
@@ -378,9 +379,8 @@ static int neo1973_gta02_wm8753_init(struct snd_soc_codec *codec)
/*
* BT Codec DAI
*/
-static struct snd_soc_dai bt_dai = {
- .name = "Bluetooth",
- .id = 0,
+static struct snd_soc_dai_driver bt_dai = {
+ .name = "bluetooth-dai",
.playback = {
.channels_min = 1,
.channels_max = 1,
@@ -397,32 +397,30 @@ static struct snd_soc_dai_link neo1973_gta02_dai[] = {
{ /* Hifi Playback - for similatious use with voice below */
.name = "WM8753",
.stream_name = "WM8753 HiFi",
- .cpu_dai = &s3c24xx_i2s_dai,
- .codec_dai = &wm8753_dai[WM8753_DAI_HIFI],
+ .cpu_dai_name = "s3c24xx-i2s",
+ .codec_dai_name = "wm8753-hifi",
.init = neo1973_gta02_wm8753_init,
+ .platform_name = "s3c24xx-pcm-audio",
+ .codec_name = "wm8753-codec.0-0x1a",
.ops = &neo1973_gta02_hifi_ops,
},
{ /* Voice via BT */
.name = "Bluetooth",
.stream_name = "Voice",
- .cpu_dai = &bt_dai,
- .codec_dai = &wm8753_dai[WM8753_DAI_VOICE],
+ .cpu_dai_name = "bluetooth-dai",
+ .codec_dai_name = "wm8753-voice",
.ops = &neo1973_gta02_voice_ops,
+ .codec_name = "wm8753-codec.0-0x1a",
+ .platform_name = "s3c24xx-pcm-audio",
},
};
static struct snd_soc_card neo1973_gta02 = {
.name = "neo1973-gta02",
- .platform = &s3c24xx_soc_platform,
.dai_link = neo1973_gta02_dai,
.num_links = ARRAY_SIZE(neo1973_gta02_dai),
};
-static struct snd_soc_device neo1973_gta02_snd_devdata = {
- .card = &neo1973_gta02,
- .codec_dev = &soc_codec_dev_wm8753,
-};
-
static struct platform_device *neo1973_gta02_snd_device;
static int __init neo1973_gta02_init(void)
@@ -435,18 +433,18 @@ static int __init neo1973_gta02_init(void)
return -ENODEV;
}
- /* register bluetooth DAI here */
- ret = snd_soc_register_dai(&bt_dai);
- if (ret)
- return ret;
-
neo1973_gta02_snd_device = platform_device_alloc("soc-audio", -1);
if (!neo1973_gta02_snd_device)
return -ENOMEM;
- platform_set_drvdata(neo1973_gta02_snd_device,
- &neo1973_gta02_snd_devdata);
- neo1973_gta02_snd_devdata.dev = &neo1973_gta02_snd_device->dev;
+ /* register bluetooth DAI here */
+ ret = snd_soc_register_dai(&neo1973_gta02_snd_device->dev, -1, &bt_dai);
+ if (ret) {
+ platform_device_put(neo1973_gta02_snd_device);
+ return ret;
+ }
+
+ platform_set_drvdata(neo1973_gta02_snd_device, &neo1973_gta02);
ret = platform_device_add(neo1973_gta02_snd_device);
if (ret) {
@@ -461,7 +459,7 @@ static int __init neo1973_gta02_init(void)
goto err_unregister_device;
}
- ret = gpio_direction_output(GTA02_GPIO_AMP_HP_IN, 1);
+ ret = gpio_direction_output(GTA02_GPIO_HP_IN, 1);
if (ret) {
pr_err("gta02_wm8753: Failed to configure GPIO %d\n", GTA02_GPIO_HP_IN);
goto err_free_gpio_hp_in;
@@ -493,7 +491,7 @@ module_init(neo1973_gta02_init);
static void __exit neo1973_gta02_exit(void)
{
- snd_soc_unregister_dai(&bt_dai);
+ snd_soc_unregister_dai(&neo1973_gta02_snd_device->dev, -1);
platform_device_unregister(neo1973_gta02_snd_device);
gpio_free(GTA02_GPIO_HP_IN);
gpio_free(GTA02_GPIO_AMP_SHUT);
diff --git a/sound/soc/s3c24xx/neo1973_wm8753.c b/sound/soc/s3c24xx/neo1973_wm8753.c
index 0cb4f86f6d1e..d7a39a0fe99b 100644
--- a/sound/soc/s3c24xx/neo1973_wm8753.c
+++ b/sound/soc/s3c24xx/neo1973_wm8753.c
@@ -57,8 +57,8 @@ static int neo1973_hifi_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int pll_out = 0, bclk = 0;
int ret = 0;
unsigned long iis_clkrate;
@@ -147,7 +147,7 @@ static int neo1973_hifi_hw_params(struct snd_pcm_substream *substream,
static int neo1973_hifi_hw_free(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
pr_debug("Entered %s\n", __func__);
@@ -167,7 +167,7 @@ static int neo1973_voice_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
unsigned int pcmdiv = 0;
int ret = 0;
unsigned long iis_clkrate;
@@ -213,7 +213,7 @@ static int neo1973_voice_hw_params(struct snd_pcm_substream *substream,
static int neo1973_voice_hw_free(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
pr_debug("Entered %s\n", __func__);
@@ -499,8 +499,9 @@ static const struct snd_kcontrol_new wm8753_neo1973_controls[] = {
* neo1973 II. It is missing logic to detect hp/mic insertions and logic
* to re-route the audio in such an event.
*/
-static int neo1973_wm8753_init(struct snd_soc_codec *codec)
+static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
int err;
pr_debug("Entered %s\n", __func__);
@@ -538,8 +539,7 @@ static int neo1973_wm8753_init(struct snd_soc_codec *codec)
* BT Codec DAI
*/
static struct snd_soc_dai bt_dai = {
- .name = "Bluetooth",
- .id = 0,
+ .name = "bluetooth-dai",
.playback = {
.channels_min = 1,
.channels_max = 1,
@@ -556,32 +556,30 @@ static struct snd_soc_dai_link neo1973_dai[] = {
{ /* Hifi Playback - for similatious use with voice below */
.name = "WM8753",
.stream_name = "WM8753 HiFi",
- .cpu_dai = &s3c24xx_i2s_dai,
- .codec_dai = &wm8753_dai[WM8753_DAI_HIFI],
+ .platform_name = "s3c24xx-pcm-audio",
+ .cpu_dai_name = "s3c24xx-i2s",
+ .codec_dai_name = "wm8753-hifi",
+ .codec_name = "wm8753-codec.0-0x1a",
.init = neo1973_wm8753_init,
.ops = &neo1973_hifi_ops,
},
{ /* Voice via BT */
.name = "Bluetooth",
.stream_name = "Voice",
- .cpu_dai = &bt_dai,
- .codec_dai = &wm8753_dai[WM8753_DAI_VOICE],
+ .platform_name = "s3c24xx-pcm-audio",
+ .cpu_dai_name = "bluetooth-dai",
+ .codec_dai_name = "wm8753-voice",
+ .codec_name = "wm8753-codec.0-0x1a",
.ops = &neo1973_voice_ops,
},
};
static struct snd_soc_card neo1973 = {
.name = "neo1973",
- .platform = &s3c24xx_soc_platform,
.dai_link = neo1973_dai,
.num_links = ARRAY_SIZE(neo1973_dai),
};
-static struct snd_soc_device neo1973_snd_devdata = {
- .card = &neo1973,
- .codec_dev = &soc_codec_dev_wm8753,
-};
-
static int lm4857_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -673,8 +671,7 @@ static int __init neo1973_init(void)
if (!neo1973_snd_device)
return -ENOMEM;
- platform_set_drvdata(neo1973_snd_device, &neo1973_snd_devdata);
- neo1973_snd_devdata.dev = &neo1973_snd_device->dev;
+ platform_set_drvdata(neo1973_snd_device, &neo1973);
ret = platform_device_add(neo1973_snd_device);
if (ret) {
diff --git a/sound/soc/s3c24xx/s3c-ac97.c b/sound/soc/s3c24xx/s3c-ac97.c
index 31f6d45b6384..26f4ed90a0ee 100644
--- a/sound/soc/s3c24xx/s3c-ac97.c
+++ b/sound/soc/s3c24xx/s3c-ac97.c
@@ -222,7 +222,7 @@ static int s3c_ac97_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
struct s3c_dma_params *dma_data;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
@@ -241,7 +241,7 @@ static int s3c_ac97_trigger(struct snd_pcm_substream *substream, int cmd,
u32 ac_glbctrl;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct s3c_dma_params *dma_data =
- snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL);
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
@@ -277,7 +277,7 @@ static int s3c_ac97_hw_mic_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
return -ENODEV;
@@ -293,7 +293,7 @@ static int s3c_ac97_mic_trigger(struct snd_pcm_substream *substream,
u32 ac_glbctrl;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct s3c_dma_params *dma_data =
- snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL);
ac_glbctrl &= ~S3C_AC97_GLBCTRL_MICINTM_MASK;
@@ -328,10 +328,9 @@ static struct snd_soc_dai_ops s3c_ac97_mic_dai_ops = {
.trigger = s3c_ac97_mic_trigger,
};
-struct snd_soc_dai s3c_ac97_dai[] = {
+static struct snd_soc_dai_driver s3c_ac97_dai[] = {
[S3C_AC97_DAI_PCM] = {
.name = "s3c-ac97",
- .id = S3C_AC97_DAI_PCM,
.ac97_control = 1,
.playback = {
.stream_name = "AC97 Playback",
@@ -349,7 +348,6 @@ struct snd_soc_dai s3c_ac97_dai[] = {
},
[S3C_AC97_DAI_MIC] = {
.name = "s3c-ac97-mic",
- .id = S3C_AC97_DAI_MIC,
.ac97_control = 1,
.capture = {
.stream_name = "AC97 Mic Capture",
@@ -360,7 +358,6 @@ struct snd_soc_dai s3c_ac97_dai[] = {
.ops = &s3c_ac97_mic_dai_ops,
},
};
-EXPORT_SYMBOL_GPL(s3c_ac97_dai);
static __devinit int s3c_ac97_probe(struct platform_device *pdev)
{
@@ -449,10 +446,8 @@ static __devinit int s3c_ac97_probe(struct platform_device *pdev)
goto err4;
}
- s3c_ac97_dai[S3C_AC97_DAI_PCM].dev = &pdev->dev;
- s3c_ac97_dai[S3C_AC97_DAI_MIC].dev = &pdev->dev;
-
- ret = snd_soc_register_dais(s3c_ac97_dai, ARRAY_SIZE(s3c_ac97_dai));
+ ret = snd_soc_register_dais(&pdev->dev, s3c_ac97_dai,
+ ARRAY_SIZE(s3c_ac97_dai));
if (ret)
goto err5;
@@ -476,7 +471,7 @@ static __devexit int s3c_ac97_remove(struct platform_device *pdev)
{
struct resource *mem_res, *irq_res;
- snd_soc_unregister_dais(s3c_ac97_dai, ARRAY_SIZE(s3c_ac97_dai));
+ snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(s3c_ac97_dai));
irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (irq_res)
@@ -518,3 +513,4 @@ module_exit(s3c_ac97_exit);
MODULE_AUTHOR("Jaswinder Singh, <jassi.brar@samsung.com>");
MODULE_DESCRIPTION("AC97 driver for the Samsung SoC");
MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:s3c-ac97");
diff --git a/sound/soc/s3c24xx/s3c-ac97.h b/sound/soc/s3c24xx/s3c-ac97.h
index 278198379def..5dcedd07fdbb 100644
--- a/sound/soc/s3c24xx/s3c-ac97.h
+++ b/sound/soc/s3c24xx/s3c-ac97.h
@@ -18,6 +18,4 @@
#define S3C_AC97_DAI_PCM 0
#define S3C_AC97_DAI_MIC 1
-extern struct snd_soc_dai s3c_ac97_dai[];
-
#endif /* __S3C_AC97_H_ */
diff --git a/sound/soc/s3c24xx/s3c-dma.c b/sound/soc/s3c24xx/s3c-dma.c
index 1b61c23ff300..54bff83c98b4 100644
--- a/sound/soc/s3c24xx/s3c-dma.c
+++ b/sound/soc/s3c24xx/s3c-dma.c
@@ -147,7 +147,7 @@ static int s3c_dma_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_pcm_runtime *rtd = substream->private_data;
unsigned long totbytes = params_buffer_bytes(params);
struct s3c_dma_params *dma =
- snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
int ret = 0;
@@ -441,14 +441,14 @@ static int s3c_dma_new(struct snd_card *card,
if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = 0xffffffff;
- if (dai->playback.channels_min) {
+ if (dai->driver->playback.channels_min) {
ret = s3c_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK);
if (ret)
goto out;
}
- if (dai->capture.channels_min) {
+ if (dai->driver->capture.channels_min) {
ret = s3c_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE);
if (ret)
@@ -458,26 +458,46 @@ static int s3c_dma_new(struct snd_card *card,
return ret;
}
-struct snd_soc_platform s3c24xx_soc_platform = {
- .name = "s3c24xx-audio",
- .pcm_ops = &s3c_dma_ops,
+static struct snd_soc_platform_driver s3c24xx_soc_platform = {
+ .ops = &s3c_dma_ops,
.pcm_new = s3c_dma_new,
.pcm_free = s3c_dma_free_dma_buffers,
};
-EXPORT_SYMBOL_GPL(s3c24xx_soc_platform);
-static int __init s3c24xx_soc_platform_init(void)
+static int __devinit s3c24xx_soc_platform_probe(struct platform_device *pdev)
{
- return snd_soc_register_platform(&s3c24xx_soc_platform);
+ return snd_soc_register_platform(&pdev->dev, &s3c24xx_soc_platform);
}
-module_init(s3c24xx_soc_platform_init);
-static void __exit s3c24xx_soc_platform_exit(void)
+static int __devexit s3c24xx_soc_platform_remove(struct platform_device *pdev)
{
- snd_soc_unregister_platform(&s3c24xx_soc_platform);
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver s3c24xx_pcm_driver = {
+ .driver = {
+ .name = "s3c24xx-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = s3c24xx_soc_platform_probe,
+ .remove = __devexit_p(s3c24xx_soc_platform_remove),
+};
+
+static int __init snd_s3c24xx_pcm_init(void)
+{
+ return platform_driver_register(&s3c24xx_pcm_driver);
+}
+module_init(snd_s3c24xx_pcm_init);
+
+static void __exit snd_s3c24xx_pcm_exit(void)
+{
+ platform_driver_unregister(&s3c24xx_pcm_driver);
}
-module_exit(s3c24xx_soc_platform_exit);
+module_exit(snd_s3c24xx_pcm_exit);
MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
MODULE_DESCRIPTION("Samsung S3C Audio DMA module");
MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:s3c24xx-pcm-audio");
diff --git a/sound/soc/s3c24xx/s3c-dma.h b/sound/soc/s3c24xx/s3c-dma.h
index 69bb6bf6fc1c..748c07d7c075 100644
--- a/sound/soc/s3c24xx/s3c-dma.h
+++ b/sound/soc/s3c24xx/s3c-dma.h
@@ -25,7 +25,6 @@ struct s3c_dma_params {
#define S3C24XX_DAI_I2S 0
/* platform data */
-extern struct snd_soc_platform s3c24xx_soc_platform;
extern struct snd_ac97_bus_ops s3c24xx_ac97_ops;
#endif
diff --git a/sound/soc/s3c24xx/s3c-i2s-v2.c b/sound/soc/s3c24xx/s3c-i2s-v2.c
index 64376b2aac73..b3866d5b19e9 100644
--- a/sound/soc/s3c24xx/s3c-i2s-v2.c
+++ b/sound/soc/s3c24xx/s3c-i2s-v2.c
@@ -49,7 +49,7 @@
static inline struct s3c_i2sv2_info *to_info(struct snd_soc_dai *cpu_dai)
{
- return cpu_dai->private_data;
+ return snd_soc_dai_get_drvdata(cpu_dai);
}
#define bit_set(v, b) (((v) & (b)) ? 1 : 0)
@@ -307,11 +307,9 @@ static int s3c2412_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
static int s3c_i2sv2_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
- struct snd_soc_dai *socdai)
+ struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai_link *dai = rtd->dai;
- struct s3c_i2sv2_info *i2s = to_info(dai->cpu_dai);
+ struct s3c_i2sv2_info *i2s = to_info(dai);
struct s3c_dma_params *dma_data;
u32 iismod;
@@ -322,7 +320,7 @@ static int s3c_i2sv2_hw_params(struct snd_pcm_substream *substream,
else
dma_data = i2s->dma_capture;
- snd_soc_dai_set_dma_data(dai->cpu_dai, substream, dma_data);
+ snd_soc_dai_set_dma_data(dai, substream, dma_data);
/* Working copies of register */
iismod = readl(i2s->regs + S3C2412_IISMOD);
@@ -396,12 +394,12 @@ static int s3c2412_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct s3c_i2sv2_info *i2s = to_info(rtd->dai->cpu_dai);
+ struct s3c_i2sv2_info *i2s = to_info(rtd->cpu_dai);
int capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);
unsigned long irqs;
int ret = 0;
struct s3c_dma_params *dma_data =
- snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
pr_debug("Entered %s\n", __func__);
@@ -640,36 +638,17 @@ int s3c_i2sv2_iis_calc_rate(struct s3c_i2sv2_rate_calc *info,
}
EXPORT_SYMBOL_GPL(s3c_i2sv2_iis_calc_rate);
-int s3c_i2sv2_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai,
+int s3c_i2sv2_probe(struct snd_soc_dai *dai,
struct s3c_i2sv2_info *i2s,
unsigned long base)
{
- struct device *dev = &pdev->dev;
+ struct device *dev = dai->dev;
unsigned int iismod;
i2s->dev = dev;
/* record our i2s structure for later use in the callbacks */
- dai->private_data = i2s;
-
- if (!base) {
- struct resource *res = platform_get_resource(pdev,
- IORESOURCE_MEM,
- 0);
- if (!res) {
- dev_err(dev, "Unable to get register resource\n");
- return -ENXIO;
- }
-
- if (!request_mem_region(res->start, resource_size(res),
- "s3c64xx-i2s-v4")) {
- dev_err(dev, "Unable to request register region\n");
- return -EBUSY;
- }
-
- base = res->start;
- }
+ snd_soc_dai_set_drvdata(dai, i2s);
i2s->regs = ioremap(base, 0x100);
if (i2s->regs == NULL) {
@@ -752,9 +731,10 @@ static int s3c2412_i2s_resume(struct snd_soc_dai *dai)
#define s3c2412_i2s_resume NULL
#endif
-int s3c_i2sv2_register_dai(struct snd_soc_dai *dai)
+int s3c_i2sv2_register_dai(struct device *dev, int id,
+ struct snd_soc_dai_driver *drv)
{
- struct snd_soc_dai_ops *ops = dai->ops;
+ struct snd_soc_dai_ops *ops = drv->ops;
ops->trigger = s3c2412_i2s_trigger;
if (!ops->hw_params)
@@ -767,10 +747,10 @@ int s3c_i2sv2_register_dai(struct snd_soc_dai *dai)
if (!ops->delay)
ops->delay = s3c2412_i2s_delay;
- dai->suspend = s3c2412_i2s_suspend;
- dai->resume = s3c2412_i2s_resume;
+ drv->suspend = s3c2412_i2s_suspend;
+ drv->resume = s3c2412_i2s_resume;
- return snd_soc_register_dai(dai);
+ return snd_soc_register_dai(dev, drv);
}
EXPORT_SYMBOL_GPL(s3c_i2sv2_register_dai);
diff --git a/sound/soc/s3c24xx/s3c-i2s-v2.h b/sound/soc/s3c24xx/s3c-i2s-v2.h
index 766f43a13d8b..d45830151484 100644
--- a/sound/soc/s3c24xx/s3c-i2s-v2.h
+++ b/sound/soc/s3c24xx/s3c-i2s-v2.h
@@ -66,6 +66,8 @@ struct s3c_i2sv2_info {
u32 suspend_iismod;
u32 suspend_iiscon;
u32 suspend_iispsr;
+
+ unsigned long base;
};
extern struct clk *s3c_i2sv2_get_clock(struct snd_soc_dai *cpu_dai);
@@ -81,23 +83,24 @@ extern int s3c_i2sv2_iis_calc_rate(struct s3c_i2sv2_rate_calc *info,
/**
* s3c_i2sv2_probe - probe for i2s device helper
- * @pdev: The platform device supplied to the original probe.
* @dai: The ASoC DAI structure supplied to the original probe.
* @i2s: Our local i2s structure to fill in.
* @base: The base address for the registers.
*/
-extern int s3c_i2sv2_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai,
+extern int s3c_i2sv2_probe(struct snd_soc_dai *dai,
struct s3c_i2sv2_info *i2s,
unsigned long base);
/**
* s3c_i2sv2_register_dai - register dai with soc core
- * @dai: The snd_soc_dai structure to register
+ * @dev: DAI device
+ * @id: DAI ID
+ * @drv: The driver structure to register
*
* Fill in any missing fields and then register the given dai with the
* soc core.
*/
-extern int s3c_i2sv2_register_dai(struct snd_soc_dai *dai);
+extern int s3c_i2sv2_register_dai(struct device *dev, int id,
+ struct snd_soc_dai_driver *drv);
#endif /* __SND_SOC_S3C24XX_S3C_I2SV2_I2S_H */
diff --git a/sound/soc/s3c24xx/s3c-pcm.c b/sound/soc/s3c24xx/s3c-pcm.c
index 326f0a9e7e30..6174e26e433e 100644
--- a/sound/soc/s3c24xx/s3c-pcm.c
+++ b/sound/soc/s3c24xx/s3c-pcm.c
@@ -64,11 +64,6 @@ static struct s3c_dma_params s3c_pcm_stereo_in[] = {
static struct s3c_pcm_info s3c_pcm[2];
-static inline struct s3c_pcm_info *to_info(struct snd_soc_dai *cpu_dai)
-{
- return cpu_dai->private_data;
-}
-
static void s3c_pcm_snd_txctrl(struct s3c_pcm_info *pcm, int on)
{
void __iomem *regs = pcm->regs;
@@ -132,7 +127,7 @@ static int s3c_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct s3c_pcm_info *pcm = to_info(rtd->dai->cpu_dai);
+ struct s3c_pcm_info *pcm = snd_soc_dai_get_drvdata(rtd->cpu_dai);
unsigned long flags;
dev_dbg(pcm->dev, "Entered %s\n", __func__);
@@ -176,8 +171,7 @@ static int s3c_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *socdai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai_link *dai = rtd->dai;
- struct s3c_pcm_info *pcm = to_info(dai->cpu_dai);
+ struct s3c_pcm_info *pcm = snd_soc_dai_get_drvdata(rtd->cpu_dai);
struct s3c_dma_params *dma_data;
void __iomem *regs = pcm->regs;
struct clk *clk;
@@ -192,7 +186,7 @@ static int s3c_pcm_hw_params(struct snd_pcm_substream *substream,
else
dma_data = pcm->dma_capture;
- snd_soc_dai_set_dma_data(dai->cpu_dai, substream, dma_data);
+ snd_soc_dai_set_dma_data(rtd->cpu_dai, substream, dma_data);
/* Strictly check for sample size */
switch (params_format(params)) {
@@ -242,7 +236,7 @@ static int s3c_pcm_hw_params(struct snd_pcm_substream *substream,
static int s3c_pcm_set_fmt(struct snd_soc_dai *cpu_dai,
unsigned int fmt)
{
- struct s3c_pcm_info *pcm = to_info(cpu_dai);
+ struct s3c_pcm_info *pcm = snd_soc_dai_get_drvdata(cpu_dai);
void __iomem *regs = pcm->regs;
unsigned long flags;
int ret = 0;
@@ -313,7 +307,7 @@ exit:
static int s3c_pcm_set_clkdiv(struct snd_soc_dai *cpu_dai,
int div_id, int div)
{
- struct s3c_pcm_info *pcm = to_info(cpu_dai);
+ struct s3c_pcm_info *pcm = snd_soc_dai_get_drvdata(cpu_dai);
switch (div_id) {
case S3C_PCM_SCLK_PER_FS:
@@ -330,7 +324,7 @@ static int s3c_pcm_set_clkdiv(struct snd_soc_dai *cpu_dai,
static int s3c_pcm_set_sysclk(struct snd_soc_dai *cpu_dai,
int clk_id, unsigned int freq, int dir)
{
- struct s3c_pcm_info *pcm = to_info(cpu_dai);
+ struct s3c_pcm_info *pcm = snd_soc_dai_get_drvdata(cpu_dai);
void __iomem *regs = pcm->regs;
u32 clkctl = readl(regs + S3C_PCM_CLKCTL);
@@ -366,10 +360,9 @@ static struct snd_soc_dai_ops s3c_pcm_dai_ops = {
#define S3C_PCM_RATES SNDRV_PCM_RATE_8000_96000
-#define S3C_PCM_DECLARE(n) \
+#define S3C_PCM_DAI_DECLARE \
{ \
- .name = "samsung-pcm", \
- .id = (n), \
+ .name = "samsung-dai", \
.symmetric_rates = 1, \
.ops = &s3c_pcm_dai_ops, \
.playback = { \
@@ -386,16 +379,15 @@ static struct snd_soc_dai_ops s3c_pcm_dai_ops = {
}, \
}
-struct snd_soc_dai s3c_pcm_dai[] = {
- S3C_PCM_DECLARE(0),
- S3C_PCM_DECLARE(1),
+struct snd_soc_dai_driver s3c_pcm_dai[] = {
+ S3C_PCM_DAI_DECLARE,
+ S3C_PCM_DAI_DECLARE,
};
EXPORT_SYMBOL_GPL(s3c_pcm_dai);
static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev)
{
struct s3c_pcm_info *pcm;
- struct snd_soc_dai *dai;
struct resource *mem_res, *dmatx_res, *dmarx_res;
struct s3c_audio_pdata *pcm_pdata;
int ret;
@@ -437,9 +429,6 @@ static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev)
spin_lock_init(&pcm->lock);
- dai = &s3c_pcm_dai[pdev->id];
- dai->dev = &pdev->dev;
-
/* Default is 128fs */
pcm->sclk_per_fs = 128;
@@ -452,7 +441,7 @@ static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev)
clk_enable(pcm->cclk);
/* record our pcm structure for later use in the callbacks */
- dai->private_data = pcm;
+ dev_set_drvdata(&pdev->dev, pcm);
if (!request_mem_region(mem_res->start,
resource_size(mem_res), "samsung-pcm")) {
@@ -476,7 +465,7 @@ static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev)
}
clk_enable(pcm->pclk);
- ret = snd_soc_register_dai(dai);
+ ret = snd_soc_register_dai(&pdev->dev, s3c_pcm_dai);
if (ret != 0) {
dev_err(&pdev->dev, "failed to get pcm_clock\n");
goto err5;
@@ -514,6 +503,8 @@ static __devexit int s3c_pcm_dev_remove(struct platform_device *pdev)
struct s3c_pcm_info *pcm = &s3c_pcm[pdev->id];
struct resource *mem_res;
+ snd_soc_unregister_dai(&pdev->dev);
+
iounmap(pcm->regs);
mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -531,7 +522,7 @@ static struct platform_driver s3c_pcm_driver = {
.probe = s3c_pcm_dev_probe,
.remove = s3c_pcm_dev_remove,
.driver = {
- .name = "samsung-pcm",
+ .name = "samsung-pcm-audio",
.owner = THIS_MODULE,
},
};
@@ -552,3 +543,4 @@ module_exit(s3c_pcm_exit);
MODULE_AUTHOR("Jaswinder Singh, <jassi.brar@samsung.com>");
MODULE_DESCRIPTION("S3C PCM Controller Driver");
MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:samsung-pcm-audio");
diff --git a/sound/soc/s3c24xx/s3c2412-i2s.c b/sound/soc/s3c24xx/s3c2412-i2s.c
index 709adef9d043..4a861cfa52c5 100644
--- a/sound/soc/s3c24xx/s3c2412-i2s.c
+++ b/sound/soc/s3c24xx/s3c2412-i2s.c
@@ -65,26 +65,20 @@ static struct s3c_dma_params s3c2412_i2s_pcm_stereo_in = {
static struct s3c_i2sv2_info s3c2412_i2s;
-static inline struct s3c_i2sv2_info *to_info(struct snd_soc_dai *cpu_dai)
-{
- return cpu_dai->private_data;
-}
-
-static int s3c2412_i2s_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
{
int ret;
pr_debug("Entered %s\n", __func__);
- ret = s3c_i2sv2_probe(pdev, dai, &s3c2412_i2s, S3C2410_PA_IIS);
+ ret = s3c_i2sv2_probe(dai, &s3c2412_i2s, S3C2410_PA_IIS);
if (ret)
return ret;
s3c2412_i2s.dma_capture = &s3c2412_i2s_pcm_stereo_in;
s3c2412_i2s.dma_playback = &s3c2412_i2s_pcm_stereo_out;
- s3c2412_i2s.iis_cclk = clk_get(&pdev->dev, "i2sclk");
+ s3c2412_i2s.iis_cclk = clk_get(dai->dev, "i2sclk");
if (s3c2412_i2s.iis_cclk == NULL) {
pr_err("failed to get i2sclk clock\n");
iounmap(s3c2412_i2s.regs);
@@ -108,11 +102,20 @@ static int s3c2412_i2s_probe(struct platform_device *pdev,
return 0;
}
+static int s3c2412_i2s_remove(struct snd_soc_dai *dai)
+{
+ clk_disable(s3c2412_i2s.iis_cclk);
+ clk_put(s3c2412_i2s.iis_cclk);
+ iounmap(s3c2412_i2s.regs);
+
+ return 0;
+}
+
static int s3c2412_i2s_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *cpu_dai)
{
- struct s3c_i2sv2_info *i2s = to_info(cpu_dai);
+ struct s3c_i2sv2_info *i2s = snd_soc_dai_get_drvdata(cpu_dai);
struct s3c_dma_params *dma_data;
u32 iismod;
@@ -152,10 +155,9 @@ static struct snd_soc_dai_ops s3c2412_i2s_dai_ops = {
.hw_params = s3c2412_i2s_hw_params,
};
-struct snd_soc_dai s3c2412_i2s_dai = {
- .name = "s3c2412-i2s",
- .id = 0,
+static struct snd_soc_dai_driver s3c2412_i2s_dai = {
.probe = s3c2412_i2s_probe,
+ .remove = s3c2412_i2s_remove,
.playback = {
.channels_min = 2,
.channels_max = 2,
@@ -170,17 +172,36 @@ struct snd_soc_dai s3c2412_i2s_dai = {
},
.ops = &s3c2412_i2s_dai_ops,
};
-EXPORT_SYMBOL_GPL(s3c2412_i2s_dai);
+
+static __devinit int s3c2412_iis_dev_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_dai(&pdev->dev, &s3c2412_i2s_dai);
+}
+
+static __devexit int s3c2412_iis_dev_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_dai(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver s3c2412_iis_driver = {
+ .probe = s3c2412_iis_dev_probe,
+ .remove = s3c2412_iis_dev_remove,
+ .driver = {
+ .name = "s3c2412-iis",
+ .owner = THIS_MODULE,
+ },
+};
static int __init s3c2412_i2s_init(void)
{
- return s3c_i2sv2_register_dai(&s3c2412_i2s_dai);
+ return platform_driver_register(&s3c2412_iis_driver);
}
module_init(s3c2412_i2s_init);
static void __exit s3c2412_i2s_exit(void)
{
- snd_soc_unregister_dai(&s3c2412_i2s_dai);
+ platform_driver_unregister(&s3c2412_iis_driver);
}
module_exit(s3c2412_i2s_exit);
@@ -188,3 +209,4 @@ module_exit(s3c2412_i2s_exit);
MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
MODULE_DESCRIPTION("S3C2412 I2S SoC Interface");
MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:s3c2412-iis");
diff --git a/sound/soc/s3c24xx/s3c2412-i2s.h b/sound/soc/s3c24xx/s3c2412-i2s.h
index 0b5686b4d5c3..01a0471ac65c 100644
--- a/sound/soc/s3c24xx/s3c2412-i2s.h
+++ b/sound/soc/s3c24xx/s3c2412-i2s.h
@@ -24,6 +24,4 @@
#define S3C2412_CLKSRC_PCLK S3C_I2SV2_CLKSRC_PCLK
#define S3C2412_CLKSRC_I2SCLK S3C_I2SV2_CLKSRC_AUDIOBUS
-extern struct snd_soc_dai s3c2412_i2s_dai;
-
#endif /* __SND_SOC_S3C24XX_S3C2412_I2S_H */
diff --git a/sound/soc/s3c24xx/s3c24xx-i2s.c b/sound/soc/s3c24xx/s3c24xx-i2s.c
index c3ac890a3986..e060daaa458f 100644
--- a/sound/soc/s3c24xx/s3c24xx-i2s.c
+++ b/sound/soc/s3c24xx/s3c24xx-i2s.c
@@ -252,7 +252,7 @@ static int s3c24xx_i2s_hw_params(struct snd_pcm_substream *substream,
else
dma_data = &s3c24xx_i2s_pcm_stereo_in;
- snd_soc_dai_set_dma_data(rtd->dai->cpu_dai, substream, dma_data);
+ snd_soc_dai_set_dma_data(rtd->cpu_dai, substream, dma_data);
/* Working copies of register */
iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
@@ -280,9 +280,8 @@ static int s3c24xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
int ret = 0;
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct s3c_dma_params *dma_data =
- snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+ snd_soc_dai_get_dma_data(dai, substream);
pr_debug("Entered %s\n", __func__);
@@ -387,8 +386,7 @@ u32 s3c24xx_i2s_get_clockrate(void)
}
EXPORT_SYMBOL_GPL(s3c24xx_i2s_get_clockrate);
-static int s3c24xx_i2s_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int s3c24xx_i2s_probe(struct snd_soc_dai *dai)
{
pr_debug("Entered %s\n", __func__);
@@ -396,7 +394,7 @@ static int s3c24xx_i2s_probe(struct platform_device *pdev,
if (s3c24xx_i2s.regs == NULL)
return -ENXIO;
- s3c24xx_i2s.iis_clk = clk_get(&pdev->dev, "iis");
+ s3c24xx_i2s.iis_clk = clk_get(dai->dev, "iis");
if (s3c24xx_i2s.iis_clk == NULL) {
pr_err("failed to get iis_clock\n");
iounmap(s3c24xx_i2s.regs);
@@ -465,9 +463,7 @@ static struct snd_soc_dai_ops s3c24xx_i2s_dai_ops = {
.set_sysclk = s3c24xx_i2s_set_sysclk,
};
-struct snd_soc_dai s3c24xx_i2s_dai = {
- .name = "s3c24xx-i2s",
- .id = 0,
+static struct snd_soc_dai_driver s3c24xx_i2s_dai = {
.probe = s3c24xx_i2s_probe,
.suspend = s3c24xx_i2s_suspend,
.resume = s3c24xx_i2s_resume,
@@ -483,17 +479,36 @@ struct snd_soc_dai s3c24xx_i2s_dai = {
.formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,},
.ops = &s3c24xx_i2s_dai_ops,
};
-EXPORT_SYMBOL_GPL(s3c24xx_i2s_dai);
+
+static __devinit int s3c24xx_iis_dev_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_dai(&pdev->dev, &s3c24xx_i2s_dai);
+}
+
+static __devexit int s3c24xx_iis_dev_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_dai(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver s3c24xx_iis_driver = {
+ .probe = s3c24xx_iis_dev_probe,
+ .remove = s3c24xx_iis_dev_remove,
+ .driver = {
+ .name = "s3c24xx-iis",
+ .owner = THIS_MODULE,
+ },
+};
static int __init s3c24xx_i2s_init(void)
{
- return snd_soc_register_dai(&s3c24xx_i2s_dai);
+ return platform_driver_register(&s3c24xx_iis_driver);
}
module_init(s3c24xx_i2s_init);
static void __exit s3c24xx_i2s_exit(void)
{
- snd_soc_unregister_dai(&s3c24xx_i2s_dai);
+ platform_driver_unregister(&s3c24xx_iis_driver);
}
module_exit(s3c24xx_i2s_exit);
@@ -501,3 +516,4 @@ module_exit(s3c24xx_i2s_exit);
MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
MODULE_DESCRIPTION("s3c24xx I2S SoC Interface");
MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:s3c24xx-iis");
diff --git a/sound/soc/s3c24xx/s3c24xx-i2s.h b/sound/soc/s3c24xx/s3c24xx-i2s.h
index 726d91cf4e1c..f9ca04edacb7 100644
--- a/sound/soc/s3c24xx/s3c24xx-i2s.h
+++ b/sound/soc/s3c24xx/s3c24xx-i2s.h
@@ -32,6 +32,4 @@
u32 s3c24xx_i2s_get_clockrate(void);
-extern struct snd_soc_dai s3c24xx_i2s_dai;
-
#endif /*S3C24XXI2S_H_*/
diff --git a/sound/soc/s3c24xx/s3c24xx_simtec.c b/sound/soc/s3c24xx/s3c24xx_simtec.c
index 4984754f3298..c4c111442010 100644
--- a/sound/soc/s3c24xx/s3c24xx_simtec.c
+++ b/sound/soc/s3c24xx/s3c24xx_simtec.c
@@ -139,8 +139,10 @@ static const struct snd_kcontrol_new amp_unmute_controls[] = {
speaker_unmute_get, speaker_unmute_put),
};
-void simtec_audio_init(struct snd_soc_codec *codec)
+void simtec_audio_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
if (pdata->amp_gpio > 0) {
pr_debug("%s: adding amp routes\n", __func__);
@@ -170,8 +172,8 @@ static int simtec_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* Set the CODEC as the bus clock master, I2S */
@@ -319,12 +321,12 @@ EXPORT_SYMBOL_GPL(simtec_audio_pmops);
#endif
int __devinit simtec_audio_core_probe(struct platform_device *pdev,
- struct snd_soc_device *socdev)
+ struct snd_soc_card *card)
{
struct platform_device *snd_dev;
int ret;
- socdev->card->dai_link->ops = &simtec_snd_ops;
+ card->dai_link->ops = &simtec_snd_ops;
pdata = pdev->dev.platform_data;
if (!pdata) {
@@ -353,8 +355,7 @@ int __devinit simtec_audio_core_probe(struct platform_device *pdev,
goto err_gpio;
}
- platform_set_drvdata(snd_dev, socdev);
- socdev->dev = &snd_dev->dev;
+ platform_set_drvdata(snd_dev, card);
ret = platform_device_add(snd_dev);
if (ret) {
diff --git a/sound/soc/s3c24xx/s3c24xx_simtec.h b/sound/soc/s3c24xx/s3c24xx_simtec.h
index e18faee30cce..e63d5ff9c41f 100644
--- a/sound/soc/s3c24xx/s3c24xx_simtec.h
+++ b/sound/soc/s3c24xx/s3c24xx_simtec.h
@@ -7,10 +7,10 @@
* published by the Free Software Foundation.
*/
-extern void simtec_audio_init(struct snd_soc_codec *codec);
+extern void simtec_audio_init(struct snd_soc_pcm_runtime *rtd);
extern int simtec_audio_core_probe(struct platform_device *pdev,
- struct snd_soc_device *socdev);
+ struct snd_soc_card *card);
extern int simtec_audio_remove(struct platform_device *pdev);
diff --git a/sound/soc/s3c24xx/s3c24xx_simtec_hermes.c b/sound/soc/s3c24xx/s3c24xx_simtec_hermes.c
index bdf8951af8e3..f88453735ae2 100644
--- a/sound/soc/s3c24xx/s3c24xx_simtec_hermes.c
+++ b/sound/soc/s3c24xx/s3c24xx_simtec_hermes.c
@@ -73,8 +73,10 @@ static const struct snd_soc_dapm_route base_map[] = {
* Attach our controls and configure the necessary codec
* mappings for our sound card instance.
*/
-static int simtec_hermes_init(struct snd_soc_codec *codec)
+static int simtec_hermes_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
snd_soc_dapm_new_controls(codec, dapm_widgets,
ARRAY_SIZE(dapm_widgets));
@@ -85,42 +87,33 @@ static int simtec_hermes_init(struct snd_soc_codec *codec)
snd_soc_dapm_enable_pin(codec, "Line Out");
snd_soc_dapm_enable_pin(codec, "Mic Jack");
- simtec_audio_init(codec);
+ simtec_audio_init(rtd);
snd_soc_dapm_sync(codec);
return 0;
}
-static struct aic3x_setup_data codec_setup = {
-};
-
static struct snd_soc_dai_link simtec_dai_aic33 = {
.name = "tlv320aic33",
.stream_name = "TLV320AIC33",
- .cpu_dai = &s3c24xx_i2s_dai,
- .codec_dai = &aic3x_dai,
+ .codec_name = "tlv320aic3x-codec.0-0x1a",
+ .cpu_dai_name = "s3c24xx-i2s",
+ .codec_dai_name = "tlv320aic3x-hifi",
+ .platform_name = "s3c24xx-pcm-audio",
.init = simtec_hermes_init,
};
/* simtec audio machine driver */
static struct snd_soc_card snd_soc_machine_simtec_aic33 = {
.name = "Simtec-Hermes",
- .platform = &s3c24xx_soc_platform,
.dai_link = &simtec_dai_aic33,
.num_links = 1,
};
-/* simtec audio subsystem */
-static struct snd_soc_device simtec_snd_devdata_aic33 = {
- .card = &snd_soc_machine_simtec_aic33,
- .codec_dev = &soc_codec_dev_aic3x,
- .codec_data = &codec_setup,
-};
-
static int __devinit simtec_audio_hermes_probe(struct platform_device *pd)
{
dev_info(&pd->dev, "probing....\n");
- return simtec_audio_core_probe(pd, &simtec_snd_devdata_aic33);
+ return simtec_audio_core_probe(pd, &snd_soc_machine_simtec_aic33);
}
static struct platform_driver simtec_audio_hermes_platdrv = {
diff --git a/sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c b/sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c
index 185c0acb5ce6..c0967593510d 100644
--- a/sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c
+++ b/sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c
@@ -62,8 +62,10 @@ static const struct snd_soc_dapm_route base_map[] = {
* Attach our controls and configure the necessary codec
* mappings for our sound card instance.
*/
-static int simtec_tlv320aic23_init(struct snd_soc_codec *codec)
+static int simtec_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
snd_soc_dapm_new_controls(codec, dapm_widgets,
ARRAY_SIZE(dapm_widgets));
@@ -74,7 +76,7 @@ static int simtec_tlv320aic23_init(struct snd_soc_codec *codec)
snd_soc_dapm_enable_pin(codec, "Line Out");
snd_soc_dapm_enable_pin(codec, "Mic Jack");
- simtec_audio_init(codec);
+ simtec_audio_init(rtd);
snd_soc_dapm_sync(codec);
return 0;
@@ -83,28 +85,23 @@ static int simtec_tlv320aic23_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link simtec_dai_aic23 = {
.name = "tlv320aic23",
.stream_name = "TLV320AIC23",
- .cpu_dai = &s3c24xx_i2s_dai,
- .codec_dai = &tlv320aic23_dai,
+ .codec_name = "tlv320aic3x-codec.0-0x1a",
+ .cpu_dai_name = "s3c24xx-i2s",
+ .codec_dai_name = "tlv320aic3x-hifi",
+ .platform_name = "s3c24xx-pcm-audio",
.init = simtec_tlv320aic23_init,
};
/* simtec audio machine driver */
static struct snd_soc_card snd_soc_machine_simtec_aic23 = {
.name = "Simtec",
- .platform = &s3c24xx_soc_platform,
.dai_link = &simtec_dai_aic23,
.num_links = 1,
};
-/* simtec audio subsystem */
-static struct snd_soc_device simtec_snd_devdata_aic23 = {
- .card = &snd_soc_machine_simtec_aic23,
- .codec_dev = &soc_codec_dev_tlv320aic23,
-};
-
static int __devinit simtec_audio_tlv320aic23_probe(struct platform_device *pd)
{
- return simtec_audio_core_probe(pd, &simtec_snd_devdata_aic23);
+ return simtec_audio_core_probe(pd, &snd_soc_machine_simtec_aic23);
}
static struct platform_driver simtec_audio_tlv320aic23_platdrv = {
diff --git a/sound/soc/s3c24xx/s3c24xx_uda134x.c b/sound/soc/s3c24xx/s3c24xx_uda134x.c
index 052d59659c29..bd48ffbde880 100644
--- a/sound/soc/s3c24xx/s3c24xx_uda134x.c
+++ b/sound/soc/s3c24xx/s3c24xx_uda134x.c
@@ -133,8 +133,8 @@ static int s3c24xx_uda134x_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
unsigned int clk = 0;
int ret = 0;
int clk_source, fs_mode;
@@ -227,14 +227,15 @@ static struct snd_soc_ops s3c24xx_uda134x_ops = {
static struct snd_soc_dai_link s3c24xx_uda134x_dai_link = {
.name = "UDA134X",
.stream_name = "UDA134X",
- .codec_dai = &uda134x_dai,
- .cpu_dai = &s3c24xx_i2s_dai,
+ .codec_name = "uda134x-hifi",
+ .codec_dai_name = "uda134x-hifi",
+ .cpu_dai_name = "s3c24xx-i2s",
.ops = &s3c24xx_uda134x_ops,
+ .platform_name = "s3c24xx-pcm-audio",
};
static struct snd_soc_card snd_soc_s3c24xx_uda134x = {
.name = "S3C24XX_UDA134X",
- .platform = &s3c24xx_soc_platform,
.dai_link = &s3c24xx_uda134x_dai_link,
.num_links = 1,
};
@@ -256,6 +257,7 @@ static void setmode(int v)
gpio_set_value(s3c24xx_uda134x_l3_pins->l3_mode, v > 0);
}
+/* FIXME - This must be codec platform data but in which board file ?? */
static struct uda134x_platform_data s3c24xx_uda134x = {
.l3 = {
.setdat = setdat,
@@ -270,12 +272,6 @@ static struct uda134x_platform_data s3c24xx_uda134x = {
},
};
-static struct snd_soc_device s3c24xx_uda134x_snd_devdata = {
- .card = &snd_soc_s3c24xx_uda134x,
- .codec_dev = &soc_codec_dev_uda134x,
- .codec_data = &s3c24xx_uda134x,
-};
-
static int s3c24xx_uda134x_setup_pin(int pin, char *fun)
{
if (gpio_request(pin, "s3c24xx_uda134x") < 0) {
@@ -325,8 +321,7 @@ static int s3c24xx_uda134x_probe(struct platform_device *pdev)
}
platform_set_drvdata(s3c24xx_uda134x_snd_device,
- &s3c24xx_uda134x_snd_devdata);
- s3c24xx_uda134x_snd_devdata.dev = &s3c24xx_uda134x_snd_device->dev;
+ &snd_soc_s3c24xx_uda134x);
ret = platform_device_add(s3c24xx_uda134x_snd_device);
if (ret) {
printk(KERN_ERR "S3C24XX_UDA134X SoC Audio: Unable to add\n");
diff --git a/sound/soc/s3c24xx/s3c64xx-i2s-v4.c b/sound/soc/s3c24xx/s3c64xx-i2s-v4.c
index 06db130030a1..a9628472ebfe 100644
--- a/sound/soc/s3c24xx/s3c64xx-i2s-v4.c
+++ b/sound/soc/s3c24xx/s3c64xx-i2s-v4.c
@@ -16,9 +16,7 @@
#include <sound/soc.h>
#include <sound/pcm_params.h>
-#include <mach/gpio-bank-c.h>
-#include <mach/gpio-bank-h.h>
-#include <plat/gpio-cfg.h>
+#include <plat/audio.h>
#include <mach/map.h>
#include <mach/dma.h>
@@ -39,34 +37,23 @@ static struct s3c_dma_params s3c64xx_i2sv4_pcm_stereo_out;
static struct s3c_dma_params s3c64xx_i2sv4_pcm_stereo_in;
static struct s3c_i2sv2_info s3c64xx_i2sv4;
-struct snd_soc_dai s3c64xx_i2s_v4_dai;
-EXPORT_SYMBOL_GPL(s3c64xx_i2s_v4_dai);
-
-static inline struct s3c_i2sv2_info *to_info(struct snd_soc_dai *cpu_dai)
+static int s3c64xx_i2sv4_probe(struct snd_soc_dai *dai)
{
- return cpu_dai->private_data;
-}
+ struct s3c_i2sv2_info *i2s = &s3c64xx_i2sv4;
+ int ret = 0;
-static int s3c64xx_i2sv4_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
-{
- /* configure GPIO for i2s port */
- s3c_gpio_cfgpin(S3C64XX_GPC(4), S3C64XX_GPC4_I2S_V40_DO0);
- s3c_gpio_cfgpin(S3C64XX_GPC(5), S3C64XX_GPC5_I2S_V40_DO1);
- s3c_gpio_cfgpin(S3C64XX_GPC(7), S3C64XX_GPC7_I2S_V40_DO2);
- s3c_gpio_cfgpin(S3C64XX_GPH(6), S3C64XX_GPH6_I2S_V40_BCLK);
- s3c_gpio_cfgpin(S3C64XX_GPH(7), S3C64XX_GPH7_I2S_V40_CDCLK);
- s3c_gpio_cfgpin(S3C64XX_GPH(8), S3C64XX_GPH8_I2S_V40_LRCLK);
- s3c_gpio_cfgpin(S3C64XX_GPH(9), S3C64XX_GPH9_I2S_V40_DI);
+ snd_soc_dai_set_drvdata(dai, i2s);
- return 0;
+ ret = s3c_i2sv2_probe(dai, i2s, i2s->base);
+
+ return ret;
}
static int s3c_i2sv4_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *cpu_dai)
{
- struct s3c_i2sv2_info *i2s = to_info(cpu_dai);
+ struct s3c_i2sv2_info *i2s = snd_soc_dai_get_drvdata(cpu_dai);
struct s3c_dma_params *dma_data;
u32 iismod;
@@ -104,51 +91,79 @@ static struct snd_soc_dai_ops s3c64xx_i2sv4_dai_ops = {
.hw_params = s3c_i2sv4_hw_params,
};
+static struct snd_soc_dai_driver s3c64xx_i2s_v4_dai = {
+ .symmetric_rates = 1,
+ .playback = {
+ .channels_min = 2,
+ .channels_max = 2,
+ .rates = S3C64XX_I2S_RATES,
+ .formats = S3C64XX_I2S_FMTS,
+ },
+ .capture = {
+ .channels_min = 2,
+ .channels_max = 2,
+ .rates = S3C64XX_I2S_RATES,
+ .formats = S3C64XX_I2S_FMTS,
+ },
+ .probe = s3c64xx_i2sv4_probe,
+ .ops = &s3c64xx_i2sv4_dai_ops,
+};
+
static __devinit int s3c64xx_i2sv4_dev_probe(struct platform_device *pdev)
{
+ struct s3c_audio_pdata *i2s_pdata;
struct s3c_i2sv2_info *i2s;
- struct snd_soc_dai *dai;
+ struct resource *res;
int ret;
i2s = &s3c64xx_i2sv4;
- dai = &s3c64xx_i2s_v4_dai;
-
- if (dai->dev) {
- dev_dbg(dai->dev, "%s: \
- I2Sv4 instance already registered!\n", __func__);
- return -EBUSY;
- }
-
- dai->dev = &pdev->dev;
- dai->name = "s3c64xx-i2s-v4";
- dai->id = 0;
- dai->symmetric_rates = 1;
- dai->playback.channels_min = 2;
- dai->playback.channels_max = 2;
- dai->playback.rates = S3C64XX_I2S_RATES;
- dai->playback.formats = S3C64XX_I2S_FMTS;
- dai->capture.channels_min = 2;
- dai->capture.channels_max = 2;
- dai->capture.rates = S3C64XX_I2S_RATES;
- dai->capture.formats = S3C64XX_I2S_FMTS;
- dai->probe = s3c64xx_i2sv4_probe;
- dai->ops = &s3c64xx_i2sv4_dai_ops;
i2s->feature |= S3C_FEATURE_CDCLKCON;
i2s->dma_capture = &s3c64xx_i2sv4_pcm_stereo_in;
i2s->dma_playback = &s3c64xx_i2sv4_pcm_stereo_out;
- i2s->dma_capture->channel = DMACH_HSI_I2SV40_RX;
- i2s->dma_capture->dma_addr = S3C64XX_PA_IISV4 + S3C2412_IISRXD;
- i2s->dma_playback->channel = DMACH_HSI_I2SV40_TX;
- i2s->dma_playback->dma_addr = S3C64XX_PA_IISV4 + S3C2412_IISTXD;
+ res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+ if (!res) {
+ dev_err(&pdev->dev, "Unable to get I2S-TX dma resource\n");
+ return -ENXIO;
+ }
+ i2s->dma_playback->channel = res->start;
+
+ res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
+ if (!res) {
+ dev_err(&pdev->dev, "Unable to get I2S-RX dma resource\n");
+ return -ENXIO;
+ }
+ i2s->dma_capture->channel = res->start;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+ dev_err(&pdev->dev, "Unable to get I2S SFR address\n");
+ return -ENXIO;
+ }
+
+ if (!request_mem_region(res->start, resource_size(res),
+ "s3c64xx-i2s-v4")) {
+ dev_err(&pdev->dev, "Unable to request SFR region\n");
+ return -EBUSY;
+ }
+ i2s->dma_capture->dma_addr = res->start + S3C2412_IISRXD;
+ i2s->dma_playback->dma_addr = res->start + S3C2412_IISTXD;
i2s->dma_capture->client = &s3c64xx_dma_client_in;
i2s->dma_capture->dma_size = 4;
i2s->dma_playback->client = &s3c64xx_dma_client_out;
i2s->dma_playback->dma_size = 4;
+ i2s->base = res->start;
+
+ i2s_pdata = pdev->dev.platform_data;
+ if (i2s_pdata && i2s_pdata->cfg_gpio && i2s_pdata->cfg_gpio(pdev)) {
+ dev_err(&pdev->dev, "Unable to configure gpio\n");
+ return -EINVAL;
+ }
+
i2s->iis_cclk = clk_get(&pdev->dev, "audio-bus");
if (IS_ERR(i2s->iis_cclk)) {
dev_err(&pdev->dev, "failed to get audio-bus\n");
@@ -158,19 +173,13 @@ static __devinit int s3c64xx_i2sv4_dev_probe(struct platform_device *pdev)
clk_enable(i2s->iis_cclk);
- ret = s3c_i2sv2_probe(pdev, dai, i2s, 0);
- if (ret)
- goto err_clk;
-
- ret = s3c_i2sv2_register_dai(dai);
+ ret = s3c_i2sv2_register_dai(&pdev->dev, pdev->id, &s3c64xx_i2s_v4_dai);
if (ret != 0)
goto err_i2sv2;
return 0;
err_i2sv2:
- /* Not implemented for I2Sv2 core yet */
-err_clk:
clk_put(i2s->iis_cclk);
err:
return ret;
@@ -178,7 +187,18 @@ err:
static __devexit int s3c64xx_i2sv4_dev_remove(struct platform_device *pdev)
{
- dev_err(&pdev->dev, "Device removal not yet supported\n");
+ struct s3c_i2sv2_info *i2s = &s3c64xx_i2sv4;
+ struct resource *res;
+
+ snd_soc_unregister_dai(&pdev->dev);
+ clk_put(i2s->iis_cclk);
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (res)
+ release_mem_region(res->start, resource_size(res));
+ else
+ dev_warn(&pdev->dev, "Unable to get I2S SFR address\n");
+
return 0;
}
@@ -207,3 +227,4 @@ module_exit(s3c64xx_i2sv4_exit);
MODULE_AUTHOR("Jaswinder Singh, <jassi.brar@samsung.com>");
MODULE_DESCRIPTION("S3C64XX I2Sv4 SoC Interface");
MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:s3c64xx-iis-v4");
diff --git a/sound/soc/s3c24xx/s3c64xx-i2s.c b/sound/soc/s3c24xx/s3c64xx-i2s.c
index 1d85cb85a7d2..ae7acb6c4f1d 100644
--- a/sound/soc/s3c24xx/s3c64xx-i2s.c
+++ b/sound/soc/s3c24xx/s3c64xx-i2s.c
@@ -12,15 +12,15 @@
* published by the Free Software Foundation.
*/
+#include <linux/module.h>
#include <linux/clk.h>
#include <linux/gpio.h>
#include <linux/io.h>
+#include <linux/slab.h>
#include <sound/soc.h>
-#include <mach/gpio-bank-d.h>
-#include <mach/gpio-bank-e.h>
-#include <plat/gpio-cfg.h>
+#include <plat/audio.h>
#include <mach/map.h>
#include <mach/dma.h>
@@ -46,45 +46,107 @@ static struct s3c_dma_params s3c64xx_i2s_pcm_stereo_out[MAX_I2SV3];
static struct s3c_dma_params s3c64xx_i2s_pcm_stereo_in[MAX_I2SV3];
static struct s3c_i2sv2_info s3c64xx_i2s[MAX_I2SV3];
-struct snd_soc_dai s3c64xx_i2s_dai[MAX_I2SV3];
-EXPORT_SYMBOL_GPL(s3c64xx_i2s_dai);
-
-static inline struct s3c_i2sv2_info *to_info(struct snd_soc_dai *cpu_dai)
+struct clk *s3c64xx_i2s_get_clock(struct snd_soc_dai *dai)
{
- return cpu_dai->private_data;
+ struct s3c_i2sv2_info *i2s = snd_soc_dai_get_drvdata(dai);
+ u32 iismod = readl(i2s->regs + S3C2412_IISMOD);
+
+ if (iismod & S3C2412_IISMOD_IMS_SYSMUX)
+ return i2s->iis_cclk;
+ else
+ return i2s->iis_pclk;
}
+EXPORT_SYMBOL_GPL(s3c64xx_i2s_get_clock);
-static int s3c64xx_i2s_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int s3c64xx_i2s_probe(struct snd_soc_dai *dai)
{
- /* configure GPIO for i2s port */
- switch (dai->id) {
- case 0:
- s3c_gpio_cfgpin(S3C64XX_GPD(0), S3C64XX_GPD0_I2S0_CLK);
- s3c_gpio_cfgpin(S3C64XX_GPD(1), S3C64XX_GPD1_I2S0_CDCLK);
- s3c_gpio_cfgpin(S3C64XX_GPD(2), S3C64XX_GPD2_I2S0_LRCLK);
- s3c_gpio_cfgpin(S3C64XX_GPD(3), S3C64XX_GPD3_I2S0_DI);
- s3c_gpio_cfgpin(S3C64XX_GPD(4), S3C64XX_GPD4_I2S0_D0);
- break;
- case 1:
- s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C64XX_GPE0_I2S1_CLK);
- s3c_gpio_cfgpin(S3C64XX_GPE(1), S3C64XX_GPE1_I2S1_CDCLK);
- s3c_gpio_cfgpin(S3C64XX_GPE(2), S3C64XX_GPE2_I2S1_LRCLK);
- s3c_gpio_cfgpin(S3C64XX_GPE(3), S3C64XX_GPE3_I2S1_DI);
- s3c_gpio_cfgpin(S3C64XX_GPE(4), S3C64XX_GPE4_I2S1_D0);
+ struct s3c_i2sv2_info *i2s;
+ int ret;
+
+ if (dai->id >= MAX_I2SV3) {
+ dev_err(dai->dev, "id %d out of range\n", dai->id);
+ return -EINVAL;
+ }
+
+ i2s = &s3c64xx_i2s[dai->id];
+ snd_soc_dai_set_drvdata(dai, i2s);
+
+ i2s->iis_cclk = clk_get(dai->dev, "audio-bus");
+ if (IS_ERR(i2s->iis_cclk)) {
+ dev_err(dai->dev, "failed to get audio-bus\n");
+ ret = PTR_ERR(i2s->iis_cclk);
+ goto err;
}
+ clk_enable(i2s->iis_cclk);
+
+ ret = s3c_i2sv2_probe(dai, i2s, i2s->base);
+ if (ret)
+ goto err_clk;
+
return 0;
+
+err_clk:
+ clk_disable(i2s->iis_cclk);
+ clk_put(i2s->iis_cclk);
+err:
+ kfree(i2s);
+ return ret;
}
+static int s3c64xx_i2s_remove(struct snd_soc_dai *dai)
+{
+ struct s3c_i2sv2_info *i2s = snd_soc_dai_get_drvdata(dai);
+
+ clk_disable(i2s->iis_cclk);
+ clk_put(i2s->iis_cclk);
+ kfree(i2s);
+ return 0;
+}
static struct snd_soc_dai_ops s3c64xx_i2s_dai_ops;
+static struct snd_soc_dai_driver s3c64xx_i2s_dai[MAX_I2SV3] = {
+{
+ .name = "s3c64xx-i2s-0",
+ .probe = s3c64xx_i2s_probe,
+ .remove = s3c64xx_i2s_remove,
+ .playback = {
+ .channels_min = 2,
+ .channels_max = 2,
+ .rates = S3C64XX_I2S_RATES,
+ .formats = S3C64XX_I2S_FMTS,},
+ .capture = {
+ .channels_min = 2,
+ .channels_max = 2,
+ .rates = S3C64XX_I2S_RATES,
+ .formats = S3C64XX_I2S_FMTS,},
+ .ops = &s3c64xx_i2s_dai_ops,
+ .symmetric_rates = 1,
+}, {
+ .name = "s3c64xx-i2s-1",
+ .probe = s3c64xx_i2s_probe,
+ .remove = s3c64xx_i2s_remove,
+ .playback = {
+ .channels_min = 2,
+ .channels_max = 2,
+ .rates = S3C64XX_I2S_RATES,
+ .formats = S3C64XX_I2S_FMTS,},
+ .capture = {
+ .channels_min = 2,
+ .channels_max = 2,
+ .rates = S3C64XX_I2S_RATES,
+ .formats = S3C64XX_I2S_FMTS,},
+ .ops = &s3c64xx_i2s_dai_ops,
+ .symmetric_rates = 1,
+},};
+
static __devinit int s3c64xx_iis_dev_probe(struct platform_device *pdev)
{
+ struct s3c_audio_pdata *i2s_pdata;
struct s3c_i2sv2_info *i2s;
- struct snd_soc_dai *dai;
- int ret;
+ struct resource *res;
+ int i, ret;
if (pdev->id >= MAX_I2SV3) {
dev_err(&pdev->dev, "id %d out of range\n", pdev->id);
@@ -92,74 +154,63 @@ static __devinit int s3c64xx_iis_dev_probe(struct platform_device *pdev)
}
i2s = &s3c64xx_i2s[pdev->id];
- dai = &s3c64xx_i2s_dai[pdev->id];
- dai->dev = &pdev->dev;
- dai->name = "s3c64xx-i2s";
- dai->id = pdev->id;
- dai->symmetric_rates = 1;
- dai->playback.channels_min = 2;
- dai->playback.channels_max = 2;
- dai->playback.rates = S3C64XX_I2S_RATES;
- dai->playback.formats = S3C64XX_I2S_FMTS;
- dai->capture.channels_min = 2;
- dai->capture.channels_max = 2;
- dai->capture.rates = S3C64XX_I2S_RATES;
- dai->capture.formats = S3C64XX_I2S_FMTS;
- dai->probe = s3c64xx_i2s_probe;
- dai->ops = &s3c64xx_i2s_dai_ops;
-
- i2s->feature |= S3C_FEATURE_CDCLKCON;
i2s->dma_capture = &s3c64xx_i2s_pcm_stereo_in[pdev->id];
i2s->dma_playback = &s3c64xx_i2s_pcm_stereo_out[pdev->id];
- if (pdev->id == 0) {
- i2s->dma_capture->channel = DMACH_I2S0_IN;
- i2s->dma_capture->dma_addr = S3C64XX_PA_IIS0 + S3C2412_IISRXD;
- i2s->dma_playback->channel = DMACH_I2S0_OUT;
- i2s->dma_playback->dma_addr = S3C64XX_PA_IIS0 + S3C2412_IISTXD;
- } else {
- i2s->dma_capture->channel = DMACH_I2S1_IN;
- i2s->dma_capture->dma_addr = S3C64XX_PA_IIS1 + S3C2412_IISRXD;
- i2s->dma_playback->channel = DMACH_I2S1_OUT;
- i2s->dma_playback->dma_addr = S3C64XX_PA_IIS1 + S3C2412_IISTXD;
+ res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+ if (!res) {
+ dev_err(&pdev->dev, "Unable to get I2S-TX dma resource\n");
+ return -ENXIO;
+ }
+ i2s->dma_playback->channel = res->start;
+
+ res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
+ if (!res) {
+ dev_err(&pdev->dev, "Unable to get I2S-RX dma resource\n");
+ return -ENXIO;
+ }
+ i2s->dma_capture->channel = res->start;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+ dev_err(&pdev->dev, "Unable to get I2S SFR address\n");
+ return -ENXIO;
}
+ if (!request_mem_region(res->start, resource_size(res),
+ "s3c64xx-i2s")) {
+ dev_err(&pdev->dev, "Unable to request SFR region\n");
+ return -EBUSY;
+ }
+ i2s->base = res->start;
+
+ i2s_pdata = pdev->dev.platform_data;
+ if (i2s_pdata && i2s_pdata->cfg_gpio && i2s_pdata->cfg_gpio(pdev)) {
+ dev_err(&pdev->dev, "Unable to configure gpio\n");
+ return -EINVAL;
+ }
+ i2s->dma_capture->dma_addr = res->start + S3C2412_IISRXD;
+ i2s->dma_playback->dma_addr = res->start + S3C2412_IISTXD;
+
i2s->dma_capture->client = &s3c64xx_dma_client_in;
i2s->dma_capture->dma_size = 4;
i2s->dma_playback->client = &s3c64xx_dma_client_out;
i2s->dma_playback->dma_size = 4;
- i2s->iis_cclk = clk_get(&pdev->dev, "audio-bus");
- if (IS_ERR(i2s->iis_cclk)) {
- dev_err(&pdev->dev, "failed to get audio-bus\n");
- ret = PTR_ERR(i2s->iis_cclk);
- goto err;
+ for (i = 0; i < ARRAY_SIZE(s3c64xx_i2s_dai); i++) {
+ ret = s3c_i2sv2_register_dai(&pdev->dev, i,
+ &s3c64xx_i2s_dai[i]);
+ if (ret != 0)
+ return ret;
}
- clk_enable(i2s->iis_cclk);
-
- ret = s3c_i2sv2_probe(pdev, dai, i2s, 0);
- if (ret)
- goto err_clk;
-
- ret = s3c_i2sv2_register_dai(dai);
- if (ret != 0)
- goto err_i2sv2;
-
return 0;
-
-err_i2sv2:
- /* Not implemented for I2Sv2 core yet */
-err_clk:
- clk_put(i2s->iis_cclk);
-err:
- return ret;
}
static __devexit int s3c64xx_iis_dev_remove(struct platform_device *pdev)
{
- dev_err(&pdev->dev, "Device removal not yet supported\n");
+ snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(s3c64xx_i2s_dai));
return 0;
}
@@ -188,3 +239,4 @@ module_exit(s3c64xx_i2s_exit);
MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
MODULE_DESCRIPTION("S3C64XX I2S SoC Interface");
MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:s3c64xx-iis");
diff --git a/sound/soc/s3c24xx/s3c64xx-i2s.h b/sound/soc/s3c24xx/s3c64xx-i2s.h
index 7a40f43d1d51..19bd444bf8a6 100644
--- a/sound/soc/s3c24xx/s3c64xx-i2s.h
+++ b/sound/soc/s3c24xx/s3c64xx-i2s.h
@@ -36,7 +36,5 @@ struct clk;
(SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |\
SNDRV_PCM_FMTBIT_S24_LE)
-extern struct snd_soc_dai s3c64xx_i2s_dai[];
-extern struct snd_soc_dai s3c64xx_i2s_v4_dai;
#endif /* __SND_SOC_S3C24XX_S3C64XX_I2S_H */
diff --git a/sound/soc/s3c24xx/smartq_wm8987.c b/sound/soc/s3c24xx/smartq_wm8987.c
index b480348140b0..dd20ca7f4681 100644
--- a/sound/soc/s3c24xx/smartq_wm8987.c
+++ b/sound/soc/s3c24xx/smartq_wm8987.c
@@ -211,8 +211,10 @@ static struct snd_soc_dai_link smartq_dai[] = {
{
.name = "wm8987",
.stream_name = "SmartQ Hi-Fi",
- .cpu_dai = &s3c64xx_i2s_dai[0],
- .codec_dai = &wm8750_dai,
+ .cpu_dai_name = "s3c64xx-i2s.0",
+ .codec_dai_name = "wm8750-hifi",
+ .platform_name = "s3c24xx-pcm-audio",
+ .codec_name = "wm8750-codec.0-0x1a",
.init = smartq_wm8987_init,
.ops = &smartq_hifi_ops,
},
@@ -220,16 +222,10 @@ static struct snd_soc_dai_link smartq_dai[] = {
static struct snd_soc_card snd_soc_smartq = {
.name = "SmartQ",
- .platform = &s3c24xx_soc_platform,
.dai_link = smartq_dai,
.num_links = ARRAY_SIZE(smartq_dai),
};
-static struct snd_soc_device smartq_snd_devdata = {
- .card = &snd_soc_smartq,
- .codec_dev = &soc_codec_dev_wm8750,
-};
-
static struct platform_device *smartq_snd_device;
static int __init smartq_init(void)
@@ -245,8 +241,7 @@ static int __init smartq_init(void)
if (!smartq_snd_device)
return -ENOMEM;
- platform_set_drvdata(smartq_snd_device, &smartq_snd_devdata);
- smartq_snd_devdata.dev = &smartq_snd_device->dev;
+ platform_set_drvdata(smartq_snd_device, &snd_soc_smartq);
ret = platform_device_add(smartq_snd_device);
if (ret) {
diff --git a/sound/soc/s3c24xx/smdk2443_wm9710.c b/sound/soc/s3c24xx/smdk2443_wm9710.c
index 362258835e8d..66f9e222220b 100644
--- a/sound/soc/s3c24xx/smdk2443_wm9710.c
+++ b/sound/soc/s3c24xx/smdk2443_wm9710.c
@@ -19,7 +19,6 @@
#include <sound/soc.h>
#include <sound/soc-dapm.h>
-#include "../codecs/ac97.h"
#include "s3c-dma.h"
#include "s3c-ac97.h"
@@ -29,23 +28,19 @@ static struct snd_soc_dai_link smdk2443_dai[] = {
{
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &s3c_ac97_dai[S3C_AC97_DAI_PCM],
- .codec_dai = &ac97_dai,
+ .cpu_dai_name = "s3c-ac97-dai",
+ .codec_dai_name = "ac97-hifi",
+ .codec_name = "ac97-codec",
+ .platform_name = "s3c24xx-pcm-audio",
},
};
static struct snd_soc_card smdk2443 = {
.name = "SMDK2443",
- .platform = &s3c24xx_soc_platform,
.dai_link = smdk2443_dai,
.num_links = ARRAY_SIZE(smdk2443_dai),
};
-static struct snd_soc_device smdk2443_snd_ac97_devdata = {
- .card = &smdk2443,
- .codec_dev = &soc_codec_dev_ac97,
-};
-
static struct platform_device *smdk2443_snd_ac97_device;
static int __init smdk2443_init(void)
@@ -56,9 +51,7 @@ static int __init smdk2443_init(void)
if (!smdk2443_snd_ac97_device)
return -ENOMEM;
- platform_set_drvdata(smdk2443_snd_ac97_device,
- &smdk2443_snd_ac97_devdata);
- smdk2443_snd_ac97_devdata.dev = &smdk2443_snd_ac97_device->dev;
+ platform_set_drvdata(smdk2443_snd_ac97_device, &smdk2443);
ret = platform_device_add(smdk2443_snd_ac97_device);
if (ret)
diff --git a/sound/soc/s3c24xx/smdk64xx_wm8580.c b/sound/soc/s3c24xx/smdk64xx_wm8580.c
index 07e8e51d10d6..91367f7bfec3 100644
--- a/sound/soc/s3c24xx/smdk64xx_wm8580.c
+++ b/sound/soc/s3c24xx/smdk64xx_wm8580.c
@@ -22,6 +22,12 @@
#include "s3c-dma.h"
#include "s3c64xx-i2s.h"
+/*
+ * Default CFG switch settings to use this driver:
+ *
+ * SMDK6410: Set CFG1 1-3 Off, CFG2 1-4 On
+ */
+
/* SMDK64XX has a 12MHZ crystal attached to WM8580 */
#define SMDK64XX_WM8580_FREQ 12000000
@@ -29,8 +35,8 @@ static int smdk64xx_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
unsigned int pll_out;
int bfs, rfs, ret;
@@ -107,14 +113,13 @@ static int smdk64xx_hw_params(struct snd_pcm_substream *substream,
if (ret < 0)
return ret;
- /* Explicitly set WM8580-DAC to source from MCLK */
- ret = snd_soc_dai_set_clkdiv(codec_dai, WM8580_DAC_CLKSEL,
- WM8580_CLKSRC_MCLK);
+ ret = snd_soc_dai_set_pll(codec_dai, WM8580_PLLA, 0,
+ SMDK64XX_WM8580_FREQ, pll_out);
if (ret < 0)
return ret;
- ret = snd_soc_dai_set_pll(codec_dai, WM8580_PLLA, 0,
- SMDK64XX_WM8580_FREQ, pll_out);
+ ret = snd_soc_dai_set_sysclk(codec_dai, WM8580_CLKSRC_PLLA,
+ pll_out, SND_SOC_CLOCK_IN);
if (ret < 0)
return ret;
@@ -138,9 +143,9 @@ static struct snd_soc_ops smdk64xx_ops = {
/* SMDK64xx Playback widgets */
static const struct snd_soc_dapm_widget wm8580_dapm_widgets_pbk[] = {
- SND_SOC_DAPM_HP("Front-L/R", NULL),
- SND_SOC_DAPM_HP("Center/Sub", NULL),
- SND_SOC_DAPM_HP("Rear-L/R", NULL),
+ SND_SOC_DAPM_HP("Front", NULL),
+ SND_SOC_DAPM_HP("Center+Sub", NULL),
+ SND_SOC_DAPM_HP("Rear", NULL),
};
/* SMDK64xx Capture widgets */
@@ -162,20 +167,22 @@ static const struct snd_soc_dapm_route audio_map_tx[] = {
/* SMDK-PAIFRX connections */
static const struct snd_soc_dapm_route audio_map_rx[] = {
/* Front Left/Right are fed VOUT1L/R */
- {"Front-L/R", NULL, "VOUT1L"},
- {"Front-L/R", NULL, "VOUT1R"},
+ {"Front", NULL, "VOUT1L"},
+ {"Front", NULL, "VOUT1R"},
/* Center/Sub are fed VOUT2L/R */
- {"Center/Sub", NULL, "VOUT2L"},
- {"Center/Sub", NULL, "VOUT2R"},
+ {"Center+Sub", NULL, "VOUT2L"},
+ {"Center+Sub", NULL, "VOUT2R"},
/* Rear Left/Right are fed VOUT3L/R */
- {"Rear-L/R", NULL, "VOUT3L"},
- {"Rear-L/R", NULL, "VOUT3R"},
+ {"Rear", NULL, "VOUT3L"},
+ {"Rear", NULL, "VOUT3R"},
};
-static int smdk64xx_wm8580_init_paiftx(struct snd_soc_codec *codec)
+static int smdk64xx_wm8580_init_paiftx(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
/* Add smdk64xx specific Capture widgets */
snd_soc_dapm_new_controls(codec, wm8580_dapm_widgets_cpt,
ARRAY_SIZE(wm8580_dapm_widgets_cpt));
@@ -194,8 +201,10 @@ static int smdk64xx_wm8580_init_paiftx(struct snd_soc_codec *codec)
return 0;
}
-static int smdk64xx_wm8580_init_paifrx(struct snd_soc_codec *codec)
+static int smdk64xx_wm8580_init_paifrx(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
/* Add smdk64xx specific Playback widgets */
snd_soc_dapm_new_controls(codec, wm8580_dapm_widgets_pbk,
ARRAY_SIZE(wm8580_dapm_widgets_pbk));
@@ -213,16 +222,20 @@ static struct snd_soc_dai_link smdk64xx_dai[] = {
{ /* Primary Playback i/f */
.name = "WM8580 PAIF RX",
.stream_name = "Playback",
- .cpu_dai = &s3c64xx_i2s_v4_dai,
- .codec_dai = &wm8580_dai[WM8580_DAI_PAIFRX],
+ .cpu_dai_name = "s3c64xx-iis-v4",
+ .codec_dai_name = "wm8580-hifi-playback",
+ .platform_name = "s3c24xx-pcm-audio",
+ .codec_name = "wm8580-codec.0-001b",
.init = smdk64xx_wm8580_init_paifrx,
.ops = &smdk64xx_ops,
},
{ /* Primary Capture i/f */
.name = "WM8580 PAIF TX",
.stream_name = "Capture",
- .cpu_dai = &s3c64xx_i2s_v4_dai,
- .codec_dai = &wm8580_dai[WM8580_DAI_PAIFTX],
+ .cpu_dai_name = "s3c64xx-iis-v4",
+ .codec_dai_name = "wm8580-hifi-capture",
+ .platform_name = "s3c24xx-pcm-audio",
+ .codec_name = "wm8580-codec.0-001b",
.init = smdk64xx_wm8580_init_paiftx,
.ops = &smdk64xx_ops,
},
@@ -230,16 +243,10 @@ static struct snd_soc_dai_link smdk64xx_dai[] = {
static struct snd_soc_card smdk64xx = {
.name = "smdk64xx",
- .platform = &s3c24xx_soc_platform,
.dai_link = smdk64xx_dai,
.num_links = ARRAY_SIZE(smdk64xx_dai),
};
-static struct snd_soc_device smdk64xx_snd_devdata = {
- .card = &smdk64xx,
- .codec_dev = &soc_codec_dev_wm8580,
-};
-
static struct platform_device *smdk64xx_snd_device;
static int __init smdk64xx_audio_init(void)
@@ -250,8 +257,7 @@ static int __init smdk64xx_audio_init(void)
if (!smdk64xx_snd_device)
return -ENOMEM;
- platform_set_drvdata(smdk64xx_snd_device, &smdk64xx_snd_devdata);
- smdk64xx_snd_devdata.dev = &smdk64xx_snd_device->dev;
+ platform_set_drvdata(smdk64xx_snd_device, &smdk64xx);
ret = platform_device_add(smdk64xx_snd_device);
if (ret)
diff --git a/sound/soc/s3c24xx/smdk_wm9713.c b/sound/soc/s3c24xx/smdk_wm9713.c
index 5527b9e88c98..90108a7a0a8e 100644
--- a/sound/soc/s3c24xx/smdk_wm9713.c
+++ b/sound/soc/s3c24xx/smdk_wm9713.c
@@ -46,40 +46,50 @@ static struct snd_soc_card smdk;
static struct snd_soc_dai_link smdk_dai = {
.name = "AC97",
.stream_name = "AC97 PCM",
- .cpu_dai = &s3c_ac97_dai[S3C_AC97_DAI_PCM],
- .codec_dai = &wm9713_dai[WM9713_DAI_AC97_HIFI],
+ .platform_name = "s3c24xx-pcm-audio",
+ .cpu_dai_name = "s3c-ac97-dai",
+ .codec_dai_name = "wm9713-hifi",
+ .codec_name = "wm9713-codec",
};
static struct snd_soc_card smdk = {
.name = "SMDK",
- .platform = &s3c24xx_soc_platform,
.dai_link = &smdk_dai,
.num_links = 1,
};
-static struct snd_soc_device smdk_snd_ac97_devdata = {
- .card = &smdk,
- .codec_dev = &soc_codec_dev_wm9713,
-};
-
+static struct platform_device *smdk_snd_wm9713_device;
static struct platform_device *smdk_snd_ac97_device;
static int __init smdk_init(void)
{
int ret;
- smdk_snd_ac97_device = platform_device_alloc("soc-audio", -1);
- if (!smdk_snd_ac97_device)
+ smdk_snd_wm9713_device = platform_device_alloc("wm9713-codec", -1);
+ if (!smdk_snd_wm9713_device)
return -ENOMEM;
- platform_set_drvdata(smdk_snd_ac97_device,
- &smdk_snd_ac97_devdata);
- smdk_snd_ac97_devdata.dev = &smdk_snd_ac97_device->dev;
+ ret = platform_device_add(smdk_snd_wm9713_device);
+ if (ret)
+ goto err;
+
+ smdk_snd_ac97_device = platform_device_alloc("soc-audio", -1);
+ if (!smdk_snd_ac97_device) {
+ ret = -ENOMEM;
+ goto err;
+ }
+
+ platform_set_drvdata(smdk_snd_ac97_device, &smdk);
ret = platform_device_add(smdk_snd_ac97_device);
- if (ret)
+ if (ret) {
platform_device_put(smdk_snd_ac97_device);
+ goto err;
+ }
+ return 0;
+err:
+ platform_device_put(smdk_snd_wm9713_device);
return ret;
}
diff --git a/sound/soc/s6000/s6000-i2s.c b/sound/soc/s6000/s6000-i2s.c
index 59e3fa7bcb05..8778faa174a6 100644
--- a/sound/soc/s6000/s6000-i2s.c
+++ b/sound/soc/s6000/s6000-i2s.c
@@ -140,7 +140,7 @@ static void s6000_i2s_stop_channel(struct s6000_i2s_dev *dev, int channel)
static void s6000_i2s_start(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct s6000_i2s_dev *dev = rtd->dai->cpu_dai->private_data;
+ struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(rtd->cpu_dai);
int channel;
channel = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
@@ -152,7 +152,7 @@ static void s6000_i2s_start(struct snd_pcm_substream *substream)
static void s6000_i2s_stop(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct s6000_i2s_dev *dev = rtd->dai->cpu_dai->private_data;
+ struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(rtd->cpu_dai);
int channel;
channel = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
@@ -194,7 +194,7 @@ static unsigned int s6000_i2s_int_sources(struct s6000_i2s_dev *dev)
static unsigned int s6000_i2s_check_xrun(struct snd_soc_dai *cpu_dai)
{
- struct s6000_i2s_dev *dev = cpu_dai->private_data;
+ struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
unsigned int errors;
unsigned int ret;
@@ -232,7 +232,7 @@ static void s6000_i2s_wait_disabled(struct s6000_i2s_dev *dev)
static int s6000_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai,
unsigned int fmt)
{
- struct s6000_i2s_dev *dev = cpu_dai->private_data;
+ struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
u32 w;
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
@@ -273,7 +273,7 @@ static int s6000_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai,
static int s6000_i2s_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div)
{
- struct s6000_i2s_dev *dev = dai->private_data;
+ struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
if (!div || (div & 1) || div > (S6_I2S_DIV_MASK + 1) * 2)
return -EINVAL;
@@ -287,7 +287,7 @@ static int s6000_i2s_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
- struct s6000_i2s_dev *dev = dai->private_data;
+ struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
int interf;
u32 w = 0;
@@ -326,15 +326,17 @@ static int s6000_i2s_hw_params(struct snd_pcm_substream *substream,
return 0;
}
-static int s6000_i2s_dai_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int s6000_i2s_dai_probe(struct snd_soc_dai *dai)
{
- struct s6000_i2s_dev *dev = dai->private_data;
- struct s6000_snd_platform_data *pdata = pdev->dev.platform_data;
+ struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
+ struct s6000_snd_platform_data *pdata = dai->dev->platform_data;
if (!pdata)
return -EINVAL;
+ dai->capture_dma_data = &dev->dma_params;
+ dai->playback_dma_data = &dev->dma_params;
+
dev->wide = pdata->wide;
dev->channel_in = pdata->channel_in;
dev->channel_out = pdata->channel_out;
@@ -352,10 +354,10 @@ static int s6000_i2s_dai_probe(struct platform_device *pdev,
dev->channel_in = 0;
dev->channel_out = 1;
- dai->capture.channels_min = 2 * dev->lines_in;
- dai->capture.channels_max = dai->capture.channels_min;
- dai->playback.channels_min = 2 * dev->lines_out;
- dai->playback.channels_max = dai->playback.channels_min;
+ dai->driver->capture.channels_min = 2 * dev->lines_in;
+ dai->driver->capture.channels_max = dai->driver->capture.channels_min;
+ dai->driver->playback.channels_min = 2 * dev->lines_out;
+ dai->driver->playback.channels_max = dai->driver->playback.channels_min;
for (i = 0; i < dev->lines_out; i++)
s6_i2s_write_reg(dev, S6_I2S_DATA_CFG(i), S6_I2S_OUT);
@@ -372,10 +374,10 @@ static int s6000_i2s_dai_probe(struct platform_device *pdev,
if (dev->lines_in > 1 || dev->lines_out > 1)
return -EINVAL;
- dai->capture.channels_min = 2 * dev->lines_in;
- dai->capture.channels_max = 8 * dev->lines_in;
- dai->playback.channels_min = 2 * dev->lines_out;
- dai->playback.channels_max = 8 * dev->lines_out;
+ dai->driver->capture.channels_min = 2 * dev->lines_in;
+ dai->driver->capture.channels_max = 8 * dev->lines_in;
+ dai->driver->playback.channels_min = 2 * dev->lines_out;
+ dai->driver->playback.channels_max = 8 * dev->lines_out;
if (dev->lines_in)
cfg[dev->channel_in] = S6_I2S_IN;
@@ -413,9 +415,7 @@ static struct snd_soc_dai_ops s6000_i2s_dai_ops = {
.hw_params = s6000_i2s_hw_params,
};
-struct snd_soc_dai s6000_i2s_dai = {
- .name = "s6000-i2s",
- .id = 0,
+static struct snd_soc_dai_driver s6000_i2s_dai = {
.probe = s6000_i2s_dai_probe,
.playback = {
.channels_min = 2,
@@ -435,7 +435,6 @@ struct snd_soc_dai s6000_i2s_dai = {
},
.ops = &s6000_i2s_dai_ops,
}
-EXPORT_SYMBOL_GPL(s6000_i2s_dai);
static int __devinit s6000_i2s_probe(struct platform_device *pdev)
{
@@ -513,11 +512,7 @@ static int __devinit s6000_i2s_probe(struct platform_device *pdev)
ret = -ENOMEM;
goto err_release_dma2;
}
-
- s6000_i2s_dai.dev = &pdev->dev;
- s6000_i2s_dai.private_data = dev;
- s6000_i2s_dai.capture.dma_data = &dev->dma_params;
- s6000_i2s_dai.playback.dma_data = &dev->dma_params;
+ dev_set_drvdata(&pdev->dev, dev);
dev->sifbase = sifmem->start;
dev->scbbase = mmio;
@@ -548,7 +543,7 @@ static int __devinit s6000_i2s_probe(struct platform_device *pdev)
S6_I2S_INT_UNDERRUN |
S6_I2S_INT_OVERRUN);
- ret = snd_soc_register_dai(&s6000_i2s_dai);
+ ret = snd_soc_register_dai(&pdev->dev, &s6000_i2s_dai);
if (ret)
goto err_release_dev;
@@ -573,17 +568,16 @@ err_release_none:
static void __devexit s6000_i2s_remove(struct platform_device *pdev)
{
- struct s6000_i2s_dev *dev = s6000_i2s_dai.private_data;
+ struct s6000_i2s_dev *dev = dev_get_drvdata(&pdev->dev);
struct resource *region;
void __iomem *mmio = dev->scbbase;
- snd_soc_unregister_dai(&s6000_i2s_dai);
+ snd_soc_unregister_dai(&pdev->dev);
s6000_i2s_stop_channel(dev, 0);
s6000_i2s_stop_channel(dev, 1);
s6_i2s_write_reg(dev, S6_I2S_INTERRUPT_ENABLE, 0);
- s6000_i2s_dai.private_data = 0;
kfree(dev);
region = platform_get_resource(pdev, IORESOURCE_DMA, 0);
diff --git a/sound/soc/s6000/s6000-i2s.h b/sound/soc/s6000/s6000-i2s.h
index 2375fdfe6dba..86aa1921c89e 100644
--- a/sound/soc/s6000/s6000-i2s.h
+++ b/sound/soc/s6000/s6000-i2s.h
@@ -12,8 +12,6 @@
#ifndef _S6000_I2S_H
#define _S6000_I2S_H
-extern struct snd_soc_dai s6000_i2s_dai;
-
struct s6000_snd_platform_data {
int lines_in;
int lines_out;
diff --git a/sound/soc/s6000/s6000-pcm.c b/sound/soc/s6000/s6000-pcm.c
index 9c7f7f00cebb..271fd222bf19 100644
--- a/sound/soc/s6000/s6000-pcm.c
+++ b/sound/soc/s6000/s6000-pcm.c
@@ -65,7 +65,7 @@ static void s6000_pcm_enqueue_dma(struct snd_pcm_substream *substream)
dma_addr_t dma_pos;
dma_addr_t src, dst;
- par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+ par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
period_size = snd_pcm_lib_period_bytes(substream);
dma_offset = prtd->period * period_size;
@@ -103,23 +103,25 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data)
{
struct snd_pcm *pcm = data;
struct snd_soc_pcm_runtime *runtime = pcm->private_data;
- struct s6000_pcm_dma_params *params =
- snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
struct s6000_runtime_data *prtd;
unsigned int has_xrun;
int i, ret = IRQ_NONE;
- u32 channel[2] = {
- [SNDRV_PCM_STREAM_PLAYBACK] = params->dma_out,
- [SNDRV_PCM_STREAM_CAPTURE] = params->dma_in
- };
-
- has_xrun = params->check_xrun(runtime->dai->cpu_dai);
- for (i = 0; i < ARRAY_SIZE(channel); ++i) {
+ for (i = 0; i < 2; ++i) {
struct snd_pcm_substream *substream = pcm->streams[i].substream;
+ struct s6000_pcm_dma_params *params =
+ snd_soc_dai_get_dma_data(runtime->cpu_dai, substream);
+ u32 channel;
unsigned int pending;
- if (!channel[i])
+ if (substream == SNDRV_PCM_STREAM_PLAYBACK)
+ channel = params->dma_out;
+ else
+ channel = params->dma_in;
+
+ has_xrun = params->check_xrun(runtime->cpu_dai);
+
+ if (!channel)
continue;
if (unlikely(has_xrun & (1 << i)) &&
@@ -130,8 +132,8 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data)
ret = IRQ_HANDLED;
}
- pending = s6dmac_int_sources(DMA_MASK_DMAC(channel[i]),
- DMA_INDEX_CHNL(channel[i]));
+ pending = s6dmac_int_sources(DMA_MASK_DMAC(channel),
+ DMA_INDEX_CHNL(channel));
if (pending & 1) {
ret = IRQ_HANDLED;
@@ -139,10 +141,10 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data)
snd_pcm_running(substream))) {
snd_pcm_period_elapsed(substream);
dev_dbg(pcm->dev, "period elapsed %x %x\n",
- s6dmac_cur_src(DMA_MASK_DMAC(channel[i]),
- DMA_INDEX_CHNL(channel[i])),
- s6dmac_cur_dst(DMA_MASK_DMAC(channel[i]),
- DMA_INDEX_CHNL(channel[i])));
+ s6dmac_cur_src(DMA_MASK_DMAC(channel),
+ DMA_INDEX_CHNL(channel)),
+ s6dmac_cur_dst(DMA_MASK_DMAC(channel),
+ DMA_INDEX_CHNL(channel)));
prtd = substream->runtime->private_data;
spin_lock(&prtd->lock);
s6000_pcm_enqueue_dma(substream);
@@ -154,16 +156,16 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data)
if (pending & (1 << 3))
printk(KERN_WARNING
"s6000-pcm: DMA %x Underflow\n",
- channel[i]);
+ channel);
if (pending & (1 << 4))
printk(KERN_WARNING
"s6000-pcm: DMA %x Overflow\n",
- channel[i]);
+ channel);
if (pending & 0x1e0)
printk(KERN_WARNING
"s6000-pcm: DMA %x Master Error "
"(mask %x)\n",
- channel[i], pending >> 5);
+ channel, pending >> 5);
}
}
@@ -180,7 +182,7 @@ static int s6000_pcm_start(struct snd_pcm_substream *substream)
int srcinc;
u32 dma;
- par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+ par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
spin_lock_irqsave(&prtd->lock, flags);
@@ -221,7 +223,7 @@ static int s6000_pcm_stop(struct snd_pcm_substream *substream)
unsigned long flags;
u32 channel;
- par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+ par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
channel = par->dma_out;
@@ -246,7 +248,7 @@ static int s6000_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
struct s6000_pcm_dma_params *par;
int ret;
- par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+ par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
ret = par->trigger(substream, cmd, 0);
if (ret < 0)
@@ -291,7 +293,7 @@ static snd_pcm_uframes_t s6000_pcm_pointer(struct snd_pcm_substream *substream)
unsigned int offset;
dma_addr_t count;
- par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+ par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
spin_lock_irqsave(&prtd->lock, flags);
@@ -321,7 +323,7 @@ static int s6000_pcm_open(struct snd_pcm_substream *substream)
struct s6000_runtime_data *prtd;
int ret;
- par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+ par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
snd_soc_set_runtime_hwparams(substream, &s6000_pcm_hardware);
ret = snd_pcm_hw_constraint_step(runtime, 0,
@@ -385,7 +387,7 @@ static int s6000_pcm_hw_params(struct snd_pcm_substream *substream,
return ret;
}
- par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+ par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
if (par->same_rate) {
spin_lock(&par->lock);
@@ -407,7 +409,7 @@ static int s6000_pcm_hw_free(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
struct s6000_pcm_dma_params *par =
- snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+ snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
spin_lock(&par->lock);
par->in_use &= ~(1 << substream->stream);
@@ -433,7 +435,7 @@ static void s6000_pcm_free(struct snd_pcm *pcm)
{
struct snd_soc_pcm_runtime *runtime = pcm->private_data;
struct s6000_pcm_dma_params *params =
- snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+ snd_soc_dai_get_dma_data(runtime->cpu_dai, pcm->streams[0].substream);
free_irq(params->irq, pcm);
snd_pcm_lib_preallocate_free_for_all(pcm);
@@ -448,7 +450,8 @@ static int s6000_pcm_new(struct snd_card *card,
struct s6000_pcm_dma_params *params;
int res;
- params = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+ params = snd_soc_dai_get_dma_data(runtime->cpu_dai,
+ pcm->streams[0].substream);
if (!card->dev->dma_mask)
card->dev->dma_mask = &s6000_pcm_dmamask;
@@ -490,25 +493,44 @@ static int s6000_pcm_new(struct snd_card *card,
return 0;
}
-struct snd_soc_platform s6000_soc_platform = {
- .name = "s6000-audio",
- .pcm_ops = &s6000_pcm_ops,
+static struct snd_soc_platform_driver s6000_soc_platform = {
+ .ops = &s6000_pcm_ops,
.pcm_new = s6000_pcm_new,
.pcm_free = s6000_pcm_free,
};
-EXPORT_SYMBOL_GPL(s6000_soc_platform);
-static int __init s6000_pcm_init(void)
+static int __devinit s6000_soc_platform_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_platform(&pdev->dev, &s6000_soc_platform);
+}
+
+static int __devexit s6000_soc_platform_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver s6000_pcm_driver = {
+ .driver = {
+ .name = "s6000-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = s6000_soc_platform_probe,
+ .remove = __devexit_p(s6000_soc_platform_remove),
+};
+
+static int __init snd_s6000_pcm_init(void)
{
- return snd_soc_register_platform(&s6000_soc_platform);
+ return platform_driver_register(&s6000_pcm_driver);
}
-module_init(s6000_pcm_init);
+module_init(snd_s6000_pcm_init);
-static void __exit s6000_pcm_exit(void)
+static void __exit snd_s6000_pcm_exit(void)
{
- snd_soc_unregister_platform(&s6000_soc_platform);
+ platform_driver_unregister(&s6000_pcm_driver);
}
-module_exit(s6000_pcm_exit);
+module_exit(snd_s6000_pcm_exit);
MODULE_AUTHOR("Daniel Gloeckner");
MODULE_DESCRIPTION("Stretch s6000 family PCM DMA module");
diff --git a/sound/soc/s6000/s6000-pcm.h b/sound/soc/s6000/s6000-pcm.h
index 96f23f6f52bf..09d9b883e58b 100644
--- a/sound/soc/s6000/s6000-pcm.h
+++ b/sound/soc/s6000/s6000-pcm.h
@@ -30,6 +30,4 @@ struct s6000_pcm_dma_params {
int rate;
};
-extern struct snd_soc_platform s6000_soc_platform;
-
#endif
diff --git a/sound/soc/s6000/s6105-ipcam.c b/sound/soc/s6000/s6105-ipcam.c
index c1b40ac22c05..96c05e137538 100644
--- a/sound/soc/s6000/s6105-ipcam.c
+++ b/sound/soc/s6000/s6105-ipcam.c
@@ -32,8 +32,8 @@ static int s6105_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret = 0;
/* set codec DAI configuration */
@@ -134,8 +134,10 @@ static const struct snd_kcontrol_new audio_out_mux = {
};
/* Logic for a aic3x as connected on the s6105 ip camera ref design */
-static int s6105_aic3x_init(struct snd_soc_codec *codec)
+static int s6105_aic3x_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
/* Add s6105 specific widgets */
snd_soc_dapm_new_controls(codec, aic3x_dapm_widgets,
ARRAY_SIZE(aic3x_dapm_widgets));
@@ -165,7 +167,7 @@ static int s6105_aic3x_init(struct snd_soc_codec *codec)
snd_soc_dapm_sync(codec);
- snd_ctl_add(codec->card, snd_ctl_new1(&audio_out_mux, codec));
+ snd_ctl_add(codec->snd_card, snd_ctl_new1(&audio_out_mux, codec));
return 0;
}
@@ -174,8 +176,10 @@ static int s6105_aic3x_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link s6105_dai = {
.name = "TLV320AIC31",
.stream_name = "AIC31",
- .cpu_dai = &s6000_i2s_dai,
- .codec_dai = &aic3x_dai,
+ .cpu_dai_name = "s6000-i2s",
+ .codec_dai_name = "tlv320aic3x-hifi",
+ .platform_name = "s6000-pcm-audio",
+ .codec_name = "tlv320aic3x-codec.0-001a",
.init = s6105_aic3x_init,
.ops = &s6105_ops,
};
@@ -183,22 +187,10 @@ static struct snd_soc_dai_link s6105_dai = {
/* s6105 audio machine driver */
static struct snd_soc_card snd_soc_card_s6105 = {
.name = "Stretch IP Camera",
- .platform = &s6000_soc_platform,
.dai_link = &s6105_dai,
.num_links = 1,
};
-/* s6105 audio private data */
-static struct aic3x_setup_data s6105_aic3x_setup = {
-};
-
-/* s6105 audio subsystem */
-static struct snd_soc_device s6105_snd_devdata = {
- .card = &snd_soc_card_s6105,
- .codec_dev = &soc_codec_dev_aic3x,
- .codec_data = &s6105_aic3x_setup,
-};
-
static struct s6000_snd_platform_data __initdata s6105_snd_data = {
.wide = 0,
.channel_in = 0,
@@ -227,8 +219,7 @@ static int __init s6105_init(void)
if (!s6105_snd_device)
return -ENOMEM;
- platform_set_drvdata(s6105_snd_device, &s6105_snd_devdata);
- s6105_snd_devdata.dev = &s6105_snd_device->dev;
+ platform_set_drvdata(s6105_snd_device, &snd_soc_card_s6105);
platform_device_add_data(s6105_snd_device, &s6105_snd_data,
sizeof(s6105_snd_data));
diff --git a/sound/soc/sh/dma-sh7760.c b/sound/soc/sh/dma-sh7760.c
index 0d8bdf07729c..c326d29992fe 100644
--- a/sound/soc/sh/dma-sh7760.c
+++ b/sound/soc/sh/dma-sh7760.c
@@ -137,7 +137,7 @@ static void camelot_rxdma(void *data)
static int camelot_pcm_open(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct camelot_pcm *cam = &cam_pcm_data[rtd->dai->cpu_dai->id];
+ struct camelot_pcm *cam = &cam_pcm_data[rtd->cpu_dai->id];
int recv = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0:1;
int ret, dmairq;
@@ -150,7 +150,7 @@ static int camelot_pcm_open(struct snd_pcm_substream *substream)
ret = dmabrg_request_irq(dmairq, camelot_rxdma, cam);
if (unlikely(ret)) {
pr_debug("audio unit %d irqs already taken!\n",
- rtd->dai->cpu_dai->id);
+ rtd->cpu_dai->id);
return -EBUSY;
}
(void)dmabrg_request_irq(dmairq + 1,camelot_rxdma, cam);
@@ -159,7 +159,7 @@ static int camelot_pcm_open(struct snd_pcm_substream *substream)
ret = dmabrg_request_irq(dmairq, camelot_txdma, cam);
if (unlikely(ret)) {
pr_debug("audio unit %d irqs already taken!\n",
- rtd->dai->cpu_dai->id);
+ rtd->cpu_dai->id);
return -EBUSY;
}
(void)dmabrg_request_irq(dmairq + 1, camelot_txdma, cam);
@@ -170,7 +170,7 @@ static int camelot_pcm_open(struct snd_pcm_substream *substream)
static int camelot_pcm_close(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct camelot_pcm *cam = &cam_pcm_data[rtd->dai->cpu_dai->id];
+ struct camelot_pcm *cam = &cam_pcm_data[rtd->cpu_dai->id];
int recv = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0:1;
int dmairq;
@@ -191,7 +191,7 @@ static int camelot_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *hw_params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct camelot_pcm *cam = &cam_pcm_data[rtd->dai->cpu_dai->id];
+ struct camelot_pcm *cam = &cam_pcm_data[rtd->cpu_dai->id];
int recv = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0:1;
int ret;
@@ -219,7 +219,7 @@ static int camelot_prepare(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct camelot_pcm *cam = &cam_pcm_data[rtd->dai->cpu_dai->id];
+ struct camelot_pcm *cam = &cam_pcm_data[rtd->cpu_dai->id];
pr_debug("PCM data: addr 0x%08ulx len %d\n",
(u32)runtime->dma_addr, runtime->dma_bytes);
@@ -266,7 +266,7 @@ static inline void dmabrg_rec_dma_stop(struct camelot_pcm *cam)
static int camelot_trigger(struct snd_pcm_substream *substream, int cmd)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct camelot_pcm *cam = &cam_pcm_data[rtd->dai->cpu_dai->id];
+ struct camelot_pcm *cam = &cam_pcm_data[rtd->cpu_dai->id];
int recv = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0:1;
switch (cmd) {
@@ -293,7 +293,7 @@ static snd_pcm_uframes_t camelot_pos(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct camelot_pcm *cam = &cam_pcm_data[rtd->dai->cpu_dai->id];
+ struct camelot_pcm *cam = &cam_pcm_data[rtd->cpu_dai->id];
int recv = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0:1;
unsigned long pos;
@@ -342,25 +342,44 @@ static int camelot_pcm_new(struct snd_card *card,
return 0;
}
-struct snd_soc_platform sh7760_soc_platform = {
- .name = "sh7760-pcm",
+static struct snd_soc_platform sh7760_soc_platform = {
.pcm_ops = &camelot_pcm_ops,
.pcm_new = camelot_pcm_new,
.pcm_free = camelot_pcm_free,
};
-EXPORT_SYMBOL_GPL(sh7760_soc_platform);
-static int __init sh7760_soc_platform_init(void)
+static int __devinit sh7760_soc_platform_probe(struct platform_device *pdev)
{
- return snd_soc_register_platform(&sh7760_soc_platform);
+ return snd_soc_register_platform(&pdev->dev, &sh7760_soc_platform);
}
-module_init(sh7760_soc_platform_init);
-static void __exit sh7760_soc_platform_exit(void)
+static int __devexit sh7760_soc_platform_remove(struct platform_device *pdev)
{
- snd_soc_unregister_platform(&sh7760_soc_platform);
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
+}
+
+static struct platform_driver sh7760_pcm_driver = {
+ .driver = {
+ .name = "sh7760-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = sh7760_soc_platform_probe,
+ .remove = __devexit_p(sh7760_soc_platform_remove),
+};
+
+static int __init snd_sh7760_pcm_init(void)
+{
+ return platform_driver_register(&sh7760_pcm_driver);
+}
+module_init(snd_sh7760_pcm_init);
+
+static void __exit snd_sh7760_pcm_exit(void)
+{
+ platform_driver_unregister(&sh7760_pcm_driver);
}
-module_exit(sh7760_soc_platform_exit);
+module_exit(snd_sh7760_pcm_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("SH7760 Audio DMA (DMABRG) driver");
diff --git a/sound/soc/sh/fsi-ak4642.c b/sound/soc/sh/fsi-ak4642.c
index dad575a22622..9e107a9c4010 100644
--- a/sound/soc/sh/fsi-ak4642.c
+++ b/sound/soc/sh/fsi-ak4642.c
@@ -11,17 +11,17 @@
#include <linux/platform_device.h>
#include <sound/sh_fsi.h>
-#include <../sound/soc/codecs/ak4642.h>
-static int fsi_ak4642_dai_init(struct snd_soc_codec *codec)
+static int fsi_ak4642_dai_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_dai *dai = rtd->codec_dai;
int ret;
- ret = snd_soc_dai_set_fmt(&ak4642_dai, SND_SOC_DAIFMT_CBM_CFM);
+ ret = snd_soc_dai_set_fmt(dai, SND_SOC_DAIFMT_CBM_CFM);
if (ret < 0)
return ret;
- ret = snd_soc_dai_set_sysclk(&ak4642_dai, 0, 11289600, 0);
+ ret = snd_soc_dai_set_sysclk(dai, 0, 11289600, 0);
return ret;
}
@@ -29,24 +29,20 @@ static int fsi_ak4642_dai_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link fsi_dai_link = {
.name = "AK4642",
.stream_name = "AK4642",
- .cpu_dai = &fsi_soc_dai[FSI_PORT_A],
- .codec_dai = &ak4642_dai,
+ .cpu_dai_name = "fsia-dai", /* fsi A */
+ .codec_dai_name = "ak4642-hifi",
+ .platform_name = "fsi-pcm-audio",
+ .codec_name = "ak4642-codec.0-0012",
.init = fsi_ak4642_dai_init,
.ops = NULL,
};
static struct snd_soc_card fsi_soc_card = {
.name = "FSI",
- .platform = &fsi_soc_platform,
.dai_link = &fsi_dai_link,
.num_links = 1,
};
-static struct snd_soc_device fsi_snd_devdata = {
- .card = &fsi_soc_card,
- .codec_dev = &soc_codec_dev_ak4642,
-};
-
static struct platform_device *fsi_snd_device;
static int __init fsi_ak4642_init(void)
@@ -57,9 +53,7 @@ static int __init fsi_ak4642_init(void)
if (!fsi_snd_device)
goto out;
- platform_set_drvdata(fsi_snd_device,
- &fsi_snd_devdata);
- fsi_snd_devdata.dev = &fsi_snd_device->dev;
+ platform_set_drvdata(fsi_snd_device, &fsi_soc_card);
ret = platform_device_add(fsi_snd_device);
if (ret)
diff --git a/sound/soc/sh/fsi-da7210.c b/sound/soc/sh/fsi-da7210.c
index 121bbb07bb03..4f9298f45215 100644
--- a/sound/soc/sh/fsi-da7210.c
+++ b/sound/soc/sh/fsi-da7210.c
@@ -12,11 +12,12 @@
#include <linux/platform_device.h>
#include <sound/sh_fsi.h>
-#include "../codecs/da7210.h"
-static int fsi_da7210_init(struct snd_soc_codec *codec)
+static int fsi_da7210_init(struct snd_soc_pcm_runtime *rtd)
{
- return snd_soc_dai_set_fmt(&da7210_dai,
+ struct snd_soc_dai *dai = rtd->codec_dai;
+
+ return snd_soc_dai_set_fmt(dai,
SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBM_CFM);
}
@@ -24,23 +25,19 @@ static int fsi_da7210_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link fsi_da7210_dai = {
.name = "DA7210",
.stream_name = "DA7210",
- .cpu_dai = &fsi_soc_dai[FSI_PORT_B],
- .codec_dai = &da7210_dai,
+ .cpu_dai_name = "fsib-dai", /* FSI B */
+ .codec_dai_name = "da7210-hifi",
+ .platform_name = "fsi-pcm-audio",
+ .codec_name = "da7210-codec.0-001a",
.init = fsi_da7210_init,
};
static struct snd_soc_card fsi_soc_card = {
.name = "FSI",
- .platform = &fsi_soc_platform,
.dai_link = &fsi_da7210_dai,
.num_links = 1,
};
-static struct snd_soc_device fsi_da7210_snd_devdata = {
- .card = &fsi_soc_card,
- .codec_dev = &soc_codec_dev_da7210,
-};
-
static struct platform_device *fsi_da7210_snd_device;
static int __init fsi_da7210_sound_init(void)
@@ -51,8 +48,7 @@ static int __init fsi_da7210_sound_init(void)
if (!fsi_da7210_snd_device)
return -ENOMEM;
- platform_set_drvdata(fsi_da7210_snd_device, &fsi_da7210_snd_devdata);
- fsi_da7210_snd_devdata.dev = &fsi_da7210_snd_device->dev;
+ platform_set_drvdata(fsi_da7210_snd_device, &fsi_soc_card);
ret = platform_device_add(fsi_da7210_snd_device);
if (ret)
platform_device_put(fsi_da7210_snd_device);
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c
index 58c6bec642de..abc6d8309609 100644
--- a/sound/soc/sh/fsi.c
+++ b/sound/soc/sh/fsi.c
@@ -271,16 +271,19 @@ static int fsi_is_port_a(struct fsi_priv *fsi)
static struct snd_soc_dai *fsi_get_dai(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai_link *machine = rtd->dai;
- return machine->cpu_dai;
+ return rtd->cpu_dai;
}
static struct fsi_priv *fsi_get_priv(struct snd_pcm_substream *substream)
{
struct snd_soc_dai *dai = fsi_get_dai(substream);
+ struct fsi_master *master = snd_soc_dai_get_drvdata(dai);
- return dai->private_data;
+ if (dai->id == 0)
+ return &master->fsia;
+ else
+ return &master->fsib;
}
static u32 fsi_get_info_flags(struct fsi_priv *fsi)
@@ -1025,10 +1028,9 @@ static int fsi_pcm_new(struct snd_card *card,
************************************************************************/
-struct snd_soc_dai fsi_soc_dai[] = {
+static struct snd_soc_dai_driver fsi_soc_dai[] = {
{
- .name = "FSIA",
- .id = 0,
+ .name = "fsia-dai",
.playback = {
.rates = FSI_RATES,
.formats = FSI_FMTS,
@@ -1044,8 +1046,7 @@ struct snd_soc_dai fsi_soc_dai[] = {
.ops = &fsi_dai_ops,
},
{
- .name = "FSIB",
- .id = 1,
+ .name = "fsib-dai",
.playback = {
.rates = FSI_RATES,
.formats = FSI_FMTS,
@@ -1061,15 +1062,12 @@ struct snd_soc_dai fsi_soc_dai[] = {
.ops = &fsi_dai_ops,
},
};
-EXPORT_SYMBOL_GPL(fsi_soc_dai);
-struct snd_soc_platform fsi_soc_platform = {
- .name = "fsi-pcm",
- .pcm_ops = &fsi_pcm_ops,
+static struct snd_soc_platform_driver fsi_soc_platform = {
+ .ops = &fsi_pcm_ops,
.pcm_new = fsi_pcm_new,
.pcm_free = fsi_pcm_free,
};
-EXPORT_SYMBOL_GPL(fsi_soc_platform);
/************************************************************************
@@ -1132,11 +1130,7 @@ static int fsi_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev);
pm_runtime_resume(&pdev->dev);
-
- fsi_soc_dai[0].dev = &pdev->dev;
- fsi_soc_dai[0].private_data = &master->fsia;
- fsi_soc_dai[1].dev = &pdev->dev;
- fsi_soc_dai[1].private_data = &master->fsib;
+ dev_set_drvdata(&pdev->dev, master);
fsi_soft_all_reset(master);
@@ -1147,13 +1141,13 @@ static int fsi_probe(struct platform_device *pdev)
goto exit_iounmap;
}
- ret = snd_soc_register_platform(&fsi_soc_platform);
+ ret = snd_soc_register_platform(&pdev->dev, &fsi_soc_platform);
if (ret < 0) {
dev_err(&pdev->dev, "cannot snd soc register\n");
goto exit_free_irq;
}
- return snd_soc_register_dais(fsi_soc_dai, ARRAY_SIZE(fsi_soc_dai));
+ return snd_soc_register_dais(&pdev->dev, fsi_soc_dai, ARRAY_SIZE(fsi_soc_dai));
exit_free_irq:
free_irq(irq, master);
@@ -1171,10 +1165,10 @@ static int fsi_remove(struct platform_device *pdev)
{
struct fsi_master *master;
- master = fsi_get_master(fsi_soc_dai[0].private_data);
+ master = dev_get_drvdata(&pdev->dev);
- snd_soc_unregister_dais(fsi_soc_dai, ARRAY_SIZE(fsi_soc_dai));
- snd_soc_unregister_platform(&fsi_soc_platform);
+ snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(fsi_soc_dai));
+ snd_soc_unregister_platform(&pdev->dev);
pm_runtime_disable(&pdev->dev);
@@ -1183,11 +1177,6 @@ static int fsi_remove(struct platform_device *pdev)
iounmap(master->base);
kfree(master);
- fsi_soc_dai[0].dev = NULL;
- fsi_soc_dai[0].private_data = NULL;
- fsi_soc_dai[1].dev = NULL;
- fsi_soc_dai[1].private_data = NULL;
-
return 0;
}
@@ -1233,7 +1222,7 @@ static struct platform_device_id fsi_id_table[] = {
static struct platform_driver fsi_driver = {
.driver = {
- .name = "sh_fsi",
+ .name = "fsi-pcm-audio",
.pm = &fsi_pm_ops,
},
.probe = fsi_probe,
diff --git a/sound/soc/sh/hac.c b/sound/soc/sh/hac.c
index 41db75af3c69..c87e3ff28a0a 100644
--- a/sound/soc/sh/hac.c
+++ b/sound/soc/sh/hac.c
@@ -239,8 +239,7 @@ static int hac_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct hac_priv *hac = &hac_cpu_data[rtd->dai->cpu_dai->id];
+ struct hac_priv *hac = &hac_cpu_data[dai->id];
int d = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1;
switch (params->msbits) {
@@ -271,10 +270,9 @@ static struct snd_soc_dai_ops hac_dai_ops = {
.hw_params = hac_hw_params,
};
-struct snd_soc_dai sh4_hac_dai[] = {
+static struct snd_soc_dai_driver sh4_hac_dai[] = {
{
- .name = "HAC0",
- .id = 0,
+ .name = "hac-dai.0",
.ac97_control = 1,
.playback = {
.rates = AC97_RATES,
@@ -292,8 +290,7 @@ struct snd_soc_dai sh4_hac_dai[] = {
},
#ifdef CONFIG_CPU_SUBTYPE_SH7760
{
- .name = "HAC1",
- .ac97_control = 1,
+ .name = "hac-dai.1",
.id = 1,
.playback = {
.rates = AC97_RATES,
@@ -312,19 +309,40 @@ struct snd_soc_dai sh4_hac_dai[] = {
},
#endif
};
-EXPORT_SYMBOL_GPL(sh4_hac_dai);
-static int __init sh4_hac_init(void)
+static int __devinit hac_soc_platform_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_dais(&pdev->dev, sh4_hac_dai,
+ ARRAY_SIZE(sh4_hac_dai));
+}
+
+static int __devexit hac_soc_platform_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(sh4_hac_dai));
+ return 0;
+}
+
+static struct platform_driver hac_pcm_driver = {
+ .driver = {
+ .name = "hac-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = hac_soc_platform_probe,
+ .remove = __devexit_p(hac_soc_platform_remove),
+};
+
+static int __init sh4_hac_pcm_init(void)
{
- return snd_soc_register_dais(sh4_hac_dai, ARRAY_SIZE(sh4_hac_dai));
+ return platform_driver_register(&hac_pcm_driver);
}
-module_init(sh4_hac_init);
+module_init(sh4_hac_pcm_init);
-static void __exit sh4_hac_exit(void)
+static void __exit sh4_hac_pcm_exit(void)
{
- snd_soc_unregister_dais(sh4_hac_dai, ARRAY_SIZE(sh4_hac_dai));
+ platform_driver_unregister(&hac_pcm_driver);
}
-module_exit(sh4_hac_exit);
+module_exit(sh4_hac_pcm_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("SuperH onchip HAC (AC97) audio driver");
diff --git a/sound/soc/sh/migor.c b/sound/soc/sh/migor.c
index b823a5c9b9bc..866d78fb8398 100644
--- a/sound/soc/sh/migor.c
+++ b/sound/soc/sh/migor.c
@@ -50,7 +50,7 @@ static int migor_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
int ret;
unsigned int rate = params_rate(params);
@@ -68,7 +68,7 @@ static int migor_hw_params(struct snd_pcm_substream *substream,
if (ret < 0)
return ret;
- ret = snd_soc_dai_set_fmt(rtd->dai->cpu_dai, SND_SOC_DAIFMT_NB_IF |
+ ret = snd_soc_dai_set_fmt(rtd->cpu_dai, SND_SOC_DAIFMT_NB_IF |
SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS);
if (ret < 0)
return ret;
@@ -81,7 +81,7 @@ static int migor_hw_params(struct snd_pcm_substream *substream,
clk_set_rate(&siumckb_clk, codec_freq);
dev_dbg(codec_dai->dev, "%s: configure %luHz\n", __func__, codec_freq);
- ret = snd_soc_dai_set_sysclk(rtd->dai->cpu_dai, SIU_CLKB_EXT,
+ ret = snd_soc_dai_set_sysclk(rtd->cpu_dai, SIU_CLKB_EXT,
codec_freq / 2, SND_SOC_CLOCK_IN);
if (!ret)
@@ -93,7 +93,7 @@ static int migor_hw_params(struct snd_pcm_substream *substream,
static int migor_hw_free(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
if (use_count) {
use_count--;
@@ -136,8 +136,10 @@ static const struct snd_soc_dapm_route audio_map[] = {
{ "Mic Bias", NULL, "External Microphone" },
};
-static int migor_dai_init(struct snd_soc_codec *codec)
+static int migor_dai_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_codec *codec = rtd->codec;
+
snd_soc_dapm_new_controls(codec, migor_dapm_widgets,
ARRAY_SIZE(migor_dapm_widgets));
@@ -150,8 +152,10 @@ static int migor_dai_init(struct snd_soc_codec *codec)
static struct snd_soc_dai_link migor_dai = {
.name = "wm8978",
.stream_name = "WM8978",
- .cpu_dai = &siu_i2s_dai,
- .codec_dai = &wm8978_dai,
+ .cpu_dai_name = "siu-i2s-dai",
+ .codec_dai_name = "wm8978-hifi",
+ .platform_name = "siu-pcm-audio",
+ .codec_name = "wm8978-codec.0-001a",
.ops = &migor_dai_ops,
.init = migor_dai_init,
};
@@ -159,17 +163,10 @@ static struct snd_soc_dai_link migor_dai = {
/* migor audio machine driver */
static struct snd_soc_card snd_soc_migor = {
.name = "Migo-R",
- .platform = &siu_platform,
.dai_link = &migor_dai,
.num_links = 1,
};
-/* migor audio subsystem */
-static struct snd_soc_device migor_snd_devdata = {
- .card = &snd_soc_migor,
- .codec_dev = &soc_codec_dev_wm8978,
-};
-
static struct platform_device *migor_snd_device;
static int __init migor_init(void)
@@ -187,9 +184,7 @@ static int __init migor_init(void)
goto epdevalloc;
}
- platform_set_drvdata(migor_snd_device, &migor_snd_devdata);
-
- migor_snd_devdata.dev = &migor_snd_device->dev;
+ platform_set_drvdata(migor_snd_device, &snd_soc_migor);
ret = platform_device_add(migor_snd_device);
if (ret)
diff --git a/sound/soc/sh/sh7760-ac97.c b/sound/soc/sh/sh7760-ac97.c
index ce7f95b59de3..b897f7b96d89 100644
--- a/sound/soc/sh/sh7760-ac97.c
+++ b/sound/soc/sh/sh7760-ac97.c
@@ -15,41 +15,35 @@
#include <sound/soc-dapm.h>
#include <asm/io.h>
-#include "../codecs/ac97.h"
-
#define IPSEL 0xFE400034
/* platform specific structs can be declared here */
-extern struct snd_soc_dai sh4_hac_dai[2];
-extern struct snd_soc_platform sh7760_soc_platform;
+extern struct snd_soc_dai_driver sh4_hac_dai[2];
+extern struct snd_soc_platform_driver sh7760_soc_platform;
-static int machine_init(struct snd_soc_codec *codec)
+static int machine_init(struct snd_soc_pcm_runtime *rtd)
{
- snd_soc_dapm_sync(codec);
+ snd_soc_dapm_sync(rtd->codec);
return 0;
}
static struct snd_soc_dai_link sh7760_ac97_dai = {
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &sh4_hac_dai[0], /* HAC0 */
- .codec_dai = &ac97_dai,
+ .cpu_dai_name = "hac-dai.0", /* HAC0 */
+ .codec_dai_name = "ac97-hifi",
+ .platform_name = "sh7760-pcm-audio",
+ .codec_name = "ac97-codec",
.init = machine_init,
.ops = NULL,
};
static struct snd_soc_card sh7760_ac97_soc_machine = {
.name = "SH7760 AC97",
- .platform = &sh7760_soc_platform,
.dai_link = &sh7760_ac97_dai,
.num_links = 1,
};
-static struct snd_soc_device sh7760_ac97_snd_devdata = {
- .card = &sh7760_ac97_soc_machine,
- .codec_dev = &soc_codec_dev_ac97,
-};
-
static struct platform_device *sh7760_ac97_snd_device;
static int __init sh7760_ac97_init(void)
@@ -67,8 +61,7 @@ static int __init sh7760_ac97_init(void)
goto out;
platform_set_drvdata(sh7760_ac97_snd_device,
- &sh7760_ac97_snd_devdata);
- sh7760_ac97_snd_devdata.dev = &sh7760_ac97_snd_device->dev;
+ &sh7760_ac97_soc_machine);
ret = platform_device_add(sh7760_ac97_snd_device);
if (ret)
diff --git a/sound/soc/sh/siu.h b/sound/soc/sh/siu.h
index 492b1cae24cc..aa239ff7310d 100644
--- a/sound/soc/sh/siu.h
+++ b/sound/soc/sh/siu.h
@@ -181,8 +181,9 @@ static inline u32 siu_read32(u32 __iomem *addr)
#define SIU_BRGBSEL (0x108 / sizeof(u32))
#define SIU_BRRB (0x10c / sizeof(u32))
-extern struct snd_soc_platform siu_platform;
-extern struct snd_soc_dai siu_i2s_dai;
+extern struct snd_soc_platform_driver siu_platform;
+extern struct snd_soc_dai_driver siu_i2s_dai;
+extern struct siu_info *siu_i2s_data;
int siu_init_port(int port, struct siu_port **port_info, struct snd_card *card);
void siu_free_port(struct siu_port *port_info);
diff --git a/sound/soc/sh/siu_dai.c b/sound/soc/sh/siu_dai.c
index eeed5edd722b..827940a8e248 100644
--- a/sound/soc/sh/siu_dai.c
+++ b/sound/soc/sh/siu_dai.c
@@ -71,6 +71,9 @@ struct port_flag {
struct format_flag capture;
};
+struct siu_info *siu_i2s_data = NULL;
+EXPORT_SYMBOL_GPL(siu_i2s_data);
+
static struct port_flag siu_flags[SIU_PORT_NUM] = {
[SIU_PORT_A] = {
.playback = {
@@ -104,13 +107,13 @@ static struct port_flag siu_flags[SIU_PORT_NUM] = {
static void siu_dai_start(struct siu_port *port_info)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
u32 __iomem *base = info->reg;
dev_dbg(port_info->pcm->card->dev, "%s\n", __func__);
/* Turn on SIU clock */
- pm_runtime_get_sync(siu_i2s_dai.dev);
+ pm_runtime_get_sync(port_info->pcm->card->dev);
/* Issue software reset to siu */
siu_write32(base + SIU_SRCTL, 0);
@@ -148,21 +151,21 @@ static void siu_dai_start(struct siu_port *port_info)
siu_write32(base + SIU_SBDVCB, port_info->capture.volume);
}
-static void siu_dai_stop(void)
+static void siu_dai_stop(struct siu_port *port_info)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
u32 __iomem *base = info->reg;
/* SIU software reset */
siu_write32(base + SIU_SRCTL, 0);
/* Turn off SIU clock */
- pm_runtime_put_sync(siu_i2s_dai.dev);
+ pm_runtime_put_sync(port_info->pcm->card->dev);
}
static void siu_dai_spbAselect(struct siu_port *port_info)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
struct siu_firmware *fw = &info->fw;
u32 *ydef = fw->yram0;
u32 idx;
@@ -187,7 +190,7 @@ static void siu_dai_spbAselect(struct siu_port *port_info)
static void siu_dai_spbBselect(struct siu_port *port_info)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
struct siu_firmware *fw = &info->fw;
u32 *ydef = fw->yram0;
u32 idx;
@@ -207,7 +210,7 @@ static void siu_dai_spbBselect(struct siu_port *port_info)
static void siu_dai_open(struct siu_stream *siu_stream)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
u32 __iomem *base = info->reg;
u32 srctl, ifctl;
@@ -238,7 +241,7 @@ static void siu_dai_open(struct siu_stream *siu_stream)
*/
static void siu_dai_pcmdatapack(struct siu_stream *siu_stream)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
u32 __iomem *base = info->reg;
u32 dpak;
@@ -258,7 +261,7 @@ static void siu_dai_pcmdatapack(struct siu_stream *siu_stream)
static int siu_dai_spbstart(struct siu_port *port_info)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
u32 __iomem *base = info->reg;
struct siu_firmware *fw = &info->fw;
u32 *ydef = fw->yram0;
@@ -323,7 +326,7 @@ static int siu_dai_spbstart(struct siu_port *port_info)
static void siu_dai_spbstop(struct siu_port *port_info)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
u32 __iomem *base = info->reg;
siu_write32(base + SIU_SBACTIV, 0);
@@ -402,7 +405,7 @@ static int siu_dai_put_volume(struct snd_kcontrol *kctrl,
{
struct siu_port *port_info = snd_kcontrol_chip(kctrl);
struct device *dev = port_info->pcm->card->dev;
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
u32 __iomem *base = info->reg;
u32 new_vol;
u32 cur_vol;
@@ -510,7 +513,7 @@ void siu_free_port(struct siu_port *port_info)
static int siu_dai_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = snd_soc_dai_get_drvdata(dai);
struct snd_pcm_runtime *rt = substream->runtime;
struct siu_port *port_info = siu_port_info(substream);
int ret;
@@ -532,7 +535,7 @@ static int siu_dai_startup(struct snd_pcm_substream *substream,
static void siu_dai_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = snd_soc_dai_get_drvdata(dai);
struct siu_port *port_info = siu_port_info(substream);
dev_dbg(substream->pcm->card->dev, "%s: port=%d@%p\n", __func__,
@@ -548,7 +551,7 @@ static void siu_dai_shutdown(struct snd_pcm_substream *substream,
/* during stmread or stmwrite ? */
BUG_ON(port_info->playback.rw_flg || port_info->capture.rw_flg);
siu_dai_spbstop(port_info);
- siu_dai_stop();
+ siu_dai_stop(port_info);
}
}
@@ -556,7 +559,7 @@ static void siu_dai_shutdown(struct snd_pcm_substream *substream,
static int siu_dai_prepare(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = snd_soc_dai_get_drvdata(dai);
struct snd_pcm_runtime *rt = substream->runtime;
struct siu_port *port_info = siu_port_info(substream);
struct siu_stream *siu_stream;
@@ -605,7 +608,7 @@ fail:
static int siu_dai_set_fmt(struct snd_soc_dai *dai,
unsigned int fmt)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = snd_soc_dai_get_drvdata(dai);
u32 __iomem *base = info->reg;
u32 ifctl;
@@ -671,11 +674,11 @@ static int siu_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
return -EINVAL;
}
- siu_clk = clk_get(siu_i2s_dai.dev, siu_name);
+ siu_clk = clk_get(dai->dev, siu_name);
if (IS_ERR(siu_clk))
return PTR_ERR(siu_clk);
- parent_clk = clk_get(siu_i2s_dai.dev, parent_name);
+ parent_clk = clk_get(dai->dev, parent_name);
if (!IS_ERR(parent_clk)) {
ret = clk_set_parent(siu_clk, parent_clk);
if (!ret)
@@ -696,9 +699,8 @@ static struct snd_soc_dai_ops siu_dai_ops = {
.set_fmt = siu_dai_set_fmt,
};
-struct snd_soc_dai siu_i2s_dai = {
- .name = "sh-siu",
- .id = 0,
+static struct snd_soc_dai_driver siu_i2s_dai = {
+ .name = "sui-i2s-dai",
.playback = {
.channels_min = 2,
.channels_max = 2,
@@ -713,7 +715,6 @@ struct snd_soc_dai siu_i2s_dai = {
},
.ops = &siu_dai_ops,
};
-EXPORT_SYMBOL_GPL(siu_i2s_dai);
static int __devinit siu_probe(struct platform_device *pdev)
{
@@ -725,6 +726,7 @@ static int __devinit siu_probe(struct platform_device *pdev)
info = kmalloc(sizeof(*info), GFP_KERNEL);
if (!info)
return -ENOMEM;
+ siu_i2s_data = info;
ret = request_firmware(&fw_entry, "siu_spb.bin", &pdev->dev);
if (ret)
@@ -767,14 +769,14 @@ static int __devinit siu_probe(struct platform_device *pdev)
if (!info->reg)
goto emapreg;
- siu_i2s_dai.dev = &pdev->dev;
- siu_i2s_dai.private_data = info;
+ dev_set_drvdata(&pdev->dev, info);
- ret = snd_soc_register_dais(&siu_i2s_dai, 1);
+ /* register using ARRAY version so we can keep dai name */
+ ret = snd_soc_register_dais(&pdev->dev, &siu_i2s_dai, 1);
if (ret < 0)
goto edaiinit;
- ret = snd_soc_register_platform(&siu_platform);
+ ret = snd_soc_register_platform(&pdev->dev, &siu_platform);
if (ret < 0)
goto esocregp;
@@ -783,7 +785,7 @@ static int __devinit siu_probe(struct platform_device *pdev)
return ret;
esocregp:
- snd_soc_unregister_dais(&siu_i2s_dai, 1);
+ snd_soc_unregister_dai(&pdev->dev);
edaiinit:
iounmap(info->reg);
emapreg:
@@ -804,13 +806,13 @@ ereqfw:
static int __devexit siu_remove(struct platform_device *pdev)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = dev_get_drvdata(&pdev->dev);
struct resource *res;
pm_runtime_disable(&pdev->dev);
- snd_soc_unregister_platform(&siu_platform);
- snd_soc_unregister_dais(&siu_i2s_dai, 1);
+ snd_soc_unregister_platform(&pdev->dev);
+ snd_soc_unregister_dai(&pdev->dev);
iounmap(info->reg);
iounmap(info->yram);
@@ -826,7 +828,7 @@ static int __devexit siu_remove(struct platform_device *pdev)
static struct platform_driver siu_driver = {
.driver = {
- .name = "sh_siu",
+ .name = "siu-pcm-audio",
},
.probe = siu_probe,
.remove = __devexit_p(siu_remove),
diff --git a/sound/soc/sh/siu_pcm.c b/sound/soc/sh/siu_pcm.c
index 36170be15aa7..d8c6139f2a29 100644
--- a/sound/soc/sh/siu_pcm.c
+++ b/sound/soc/sh/siu_pcm.c
@@ -48,7 +48,7 @@ struct siu_port *siu_ports[SIU_PORT_NUM];
/* transfersize is number of u32 dma transfers per period */
static int siu_pcm_stmwrite_stop(struct siu_port *port_info)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
u32 __iomem *base = info->reg;
struct siu_stream *siu_stream = &port_info->playback;
u32 stfifo;
@@ -114,7 +114,7 @@ static void siu_dma_tx_complete(void *arg)
static int siu_pcm_wr_set(struct siu_port *port_info,
dma_addr_t buff, u32 size)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
u32 __iomem *base = info->reg;
struct siu_stream *siu_stream = &port_info->playback;
struct snd_pcm_substream *substream = siu_stream->substream;
@@ -127,6 +127,7 @@ static int siu_pcm_wr_set(struct siu_port *port_info,
sg_init_table(&sg, 1);
sg_set_page(&sg, pfn_to_page(PFN_DOWN(buff)),
size, offset_in_page(buff));
+ sg_dma_len(&sg) = size;
sg_dma_address(&sg) = buff;
desc = siu_stream->chan->device->device_prep_slave_sg(siu_stream->chan,
@@ -161,7 +162,7 @@ static int siu_pcm_wr_set(struct siu_port *port_info,
static int siu_pcm_rd_set(struct siu_port *port_info,
dma_addr_t buff, size_t size)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
u32 __iomem *base = info->reg;
struct siu_stream *siu_stream = &port_info->capture;
struct snd_pcm_substream *substream = siu_stream->substream;
@@ -176,6 +177,7 @@ static int siu_pcm_rd_set(struct siu_port *port_info,
sg_init_table(&sg, 1);
sg_set_page(&sg, pfn_to_page(PFN_DOWN(buff)),
size, offset_in_page(buff));
+ sg_dma_len(&sg) = size;
sg_dma_address(&sg) = buff;
desc = siu_stream->chan->device->device_prep_slave_sg(siu_stream->chan,
@@ -270,7 +272,7 @@ static int siu_pcm_stmread_start(struct siu_port *port_info)
static int siu_pcm_stmread_stop(struct siu_port *port_info)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
u32 __iomem *base = info->reg;
struct siu_stream *siu_stream = &port_info->capture;
struct device *dev = siu_stream->substream->pcm->card->dev;
@@ -294,7 +296,7 @@ static int siu_pcm_stmread_stop(struct siu_port *port_info)
static int siu_pcm_hw_params(struct snd_pcm_substream *ss,
struct snd_pcm_hw_params *hw_params)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
struct device *dev = ss->pcm->card->dev;
int ret;
@@ -309,7 +311,7 @@ static int siu_pcm_hw_params(struct snd_pcm_substream *ss,
static int siu_pcm_hw_free(struct snd_pcm_substream *ss)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
struct siu_port *port_info = siu_port_info(ss);
struct device *dev = ss->pcm->card->dev;
struct siu_stream *siu_stream;
@@ -340,11 +342,12 @@ static bool filter(struct dma_chan *chan, void *slave)
static int siu_pcm_open(struct snd_pcm_substream *ss)
{
/* Playback / Capture */
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct snd_soc_pcm_runtime *rtd = ss->private_data;
+ struct siu_platform *pdata = snd_soc_platform_get_drvdata(rtd->platform);
+ struct siu_info *info = siu_i2s_data;
struct siu_port *port_info = siu_port_info(ss);
struct siu_stream *siu_stream;
u32 port = info->port_id;
- struct siu_platform *pdata = siu_i2s_dai.dev->platform_data;
struct device *dev = ss->pcm->card->dev;
dma_cap_mask_t mask;
struct sh_dmae_slave *param;
@@ -381,7 +384,7 @@ static int siu_pcm_open(struct snd_pcm_substream *ss)
static int siu_pcm_close(struct snd_pcm_substream *ss)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
struct device *dev = ss->pcm->card->dev;
struct siu_port *port_info = siu_port_info(ss);
struct siu_stream *siu_stream;
@@ -403,7 +406,7 @@ static int siu_pcm_close(struct snd_pcm_substream *ss)
static int siu_pcm_prepare(struct snd_pcm_substream *ss)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
struct siu_port *port_info = siu_port_info(ss);
struct device *dev = ss->pcm->card->dev;
struct snd_pcm_runtime *rt = ss->runtime;
@@ -449,7 +452,7 @@ static int siu_pcm_prepare(struct snd_pcm_substream *ss)
static int siu_pcm_trigger(struct snd_pcm_substream *ss, int cmd)
{
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
struct device *dev = ss->pcm->card->dev;
struct siu_port *port_info = siu_port_info(ss);
int ret;
@@ -492,7 +495,7 @@ static int siu_pcm_trigger(struct snd_pcm_substream *ss, int cmd)
static snd_pcm_uframes_t siu_pcm_pointer_dma(struct snd_pcm_substream *ss)
{
struct device *dev = ss->pcm->card->dev;
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
u32 __iomem *base = info->reg;
struct siu_port *port_info = siu_port_info(ss);
struct snd_pcm_runtime *rt = ss->runtime;
@@ -528,7 +531,7 @@ static int siu_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
struct snd_pcm *pcm)
{
/* card->dev == socdev->dev, see snd_soc_new_pcms() */
- struct siu_info *info = siu_i2s_dai.private_data;
+ struct siu_info *info = siu_i2s_data;
struct platform_device *pdev = to_platform_device(card->dev);
int ret;
int i;
@@ -605,9 +608,8 @@ static struct snd_pcm_ops siu_pcm_ops = {
.pointer = siu_pcm_pointer_dma,
};
-struct snd_soc_platform siu_platform = {
- .name = "siu-audio",
- .pcm_ops = &siu_pcm_ops,
+struct snd_soc_platform_driver siu_platform = {
+ .ops = &siu_pcm_ops,
.pcm_new = siu_pcm_new,
.pcm_free = siu_pcm_free,
};
diff --git a/sound/soc/sh/ssi.c b/sound/soc/sh/ssi.c
index b378096cadb1..40bbdf1591dc 100644
--- a/sound/soc/sh/ssi.c
+++ b/sound/soc/sh/ssi.c
@@ -92,8 +92,7 @@ struct ssi_priv {
static int ssi_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct ssi_priv *ssi = &ssi_cpu_data[rtd->dai->cpu_dai->id];
+ struct ssi_priv *ssi = &ssi_cpu_data[dai->id];
if (ssi->inuse) {
pr_debug("ssi: already in use!\n");
return -EBUSY;
@@ -105,8 +104,7 @@ static int ssi_startup(struct snd_pcm_substream *substream,
static void ssi_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct ssi_priv *ssi = &ssi_cpu_data[rtd->dai->cpu_dai->id];
+ struct ssi_priv *ssi = &ssi_cpu_data[dai->id];
ssi->inuse = 0;
}
@@ -114,8 +112,7 @@ static void ssi_shutdown(struct snd_pcm_substream *substream,
static int ssi_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct ssi_priv *ssi = &ssi_cpu_data[rtd->dai->cpu_dai->id];
+ struct ssi_priv *ssi = &ssi_cpu_data[dai->id];
switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
@@ -135,8 +132,7 @@ static int ssi_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct ssi_priv *ssi = &ssi_cpu_data[rtd->dai->cpu_dai->id];
+ struct ssi_priv *ssi = &ssi_cpu_data[dai->id];
unsigned long ssicr = SSIREG(SSICR);
unsigned int bits, channels, swl, recv, i;
@@ -346,10 +342,9 @@ static struct snd_soc_dai_ops ssi_dai_ops = {
.set_fmt = ssi_set_fmt,
};
-struct snd_soc_dai sh4_ssi_dai[] = {
+struct snd_soc_dai_driver sh4_ssi_dai[] = {
{
- .name = "SSI0",
- .id = 0,
+ .name = "ssi-dai.0",
.playback = {
.rates = SSI_RATES,
.formats = SSI_FMTS,
@@ -366,8 +361,7 @@ struct snd_soc_dai sh4_ssi_dai[] = {
},
#ifdef CONFIG_CPU_SUBTYPE_SH7760
{
- .name = "SSI1",
- .id = 1,
+ .name = "ssi-dai.1",
.playback = {
.rates = SSI_RATES,
.formats = SSI_FMTS,
@@ -384,19 +378,40 @@ struct snd_soc_dai sh4_ssi_dai[] = {
},
#endif
};
-EXPORT_SYMBOL_GPL(sh4_ssi_dai);
-static int __init sh4_ssi_init(void)
+static int __devinit sh4_soc_dai_probe(struct platform_device *pdev)
+{
+ return snd_soc_register_dais(&pdev->dev, sh4_ssi_dai,
+ ARRAY_SIZE(sh4_ssi_dai));
+}
+
+static int __devexit sh4_soc_dai_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_dai(&pdev->dev, ARRAY_SIZE(sh4_ssi_dai));
+ return 0;
+}
+
+static struct platform_driver sh4_ssi_driver = {
+ .driver = {
+ .name = "sh4-ssi-dai",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = sh4_soc_dai_probe,
+ .remove = __devexit_p(sh4_soc_dai_remove),
+};
+
+static int __init snd_sh4_ssi_init(void)
{
- return snd_soc_register_dais(sh4_ssi_dai, ARRAY_SIZE(sh4_ssi_dai));
+ return platform_driver_register(&sh4_ssi_driver);
}
-module_init(sh4_ssi_init);
+module_init(snd_sh4_ssi_init);
-static void __exit sh4_ssi_exit(void)
+static void __exit snd_sh4_ssi_exit(void)
{
- snd_soc_unregister_dais(sh4_ssi_dai, ARRAY_SIZE(sh4_ssi_dai));
+ platform_driver_unregister(&sh4_ssi_driver);
}
-module_exit(sh4_ssi_exit);
+module_exit(snd_sh4_ssi_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("SuperH onchip SSI (I2S) audio driver");
diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c
index adbc68ce9050..12281111f100 100644
--- a/sound/soc/soc-cache.c
+++ b/sound/soc/soc-cache.c
@@ -19,7 +19,7 @@ static unsigned int snd_soc_4_12_read(struct snd_soc_codec *codec,
unsigned int reg)
{
u16 *cache = codec->reg_cache;
- if (reg >= codec->reg_cache_size)
+ if (reg >= codec->driver->reg_cache_size)
return -1;
return cache[reg];
}
@@ -31,12 +31,12 @@ static int snd_soc_4_12_write(struct snd_soc_codec *codec, unsigned int reg,
u8 data[2];
int ret;
- BUG_ON(codec->volatile_register);
+ BUG_ON(codec->driver->volatile_register);
data[0] = (reg << 4) | ((value >> 8) & 0x000f);
data[1] = value & 0x00ff;
- if (reg < codec->reg_cache_size)
+ if (reg < codec->driver->reg_cache_size)
cache[reg] = value;
if (codec->cache_only) {
@@ -89,7 +89,7 @@ static unsigned int snd_soc_7_9_read(struct snd_soc_codec *codec,
unsigned int reg)
{
u16 *cache = codec->reg_cache;
- if (reg >= codec->reg_cache_size)
+ if (reg >= codec->driver->reg_cache_size)
return -1;
return cache[reg];
}
@@ -101,12 +101,12 @@ static int snd_soc_7_9_write(struct snd_soc_codec *codec, unsigned int reg,
u8 data[2];
int ret;
- BUG_ON(codec->volatile_register);
+ BUG_ON(codec->driver->volatile_register);
data[0] = (reg << 1) | ((value >> 8) & 0x0001);
data[1] = value & 0x00ff;
- if (reg < codec->reg_cache_size)
+ if (reg < codec->driver->reg_cache_size)
cache[reg] = value;
if (codec->cache_only) {
@@ -161,13 +161,13 @@ static int snd_soc_8_8_write(struct snd_soc_codec *codec, unsigned int reg,
u8 *cache = codec->reg_cache;
u8 data[2];
- BUG_ON(codec->volatile_register);
+ BUG_ON(codec->driver->volatile_register);
reg &= 0xff;
data[0] = reg;
data[1] = value & 0xff;
- if (reg < codec->reg_cache_size)
+ if (reg < codec->driver->reg_cache_size)
cache[reg] = value;
if (codec->cache_only) {
@@ -188,7 +188,7 @@ static unsigned int snd_soc_8_8_read(struct snd_soc_codec *codec,
{
u8 *cache = codec->reg_cache;
reg &= 0xff;
- if (reg >= codec->reg_cache_size)
+ if (reg >= codec->driver->reg_cache_size)
return -1;
return cache[reg];
}
@@ -224,7 +224,7 @@ static unsigned int snd_soc_8_16_read(struct snd_soc_codec *codec,
{
u16 *cache = codec->reg_cache;
- if (reg >= codec->reg_cache_size ||
+ if (reg >= codec->driver->reg_cache_size ||
snd_soc_codec_volatile_register(codec, reg)) {
if (codec->cache_only)
return -EINVAL;
@@ -343,7 +343,7 @@ static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec,
u8 *cache = codec->reg_cache;
reg &= 0xff;
- if (reg >= codec->reg_cache_size)
+ if (reg >= codec->driver->reg_cache_size)
return -1;
return cache[reg];
}
@@ -355,14 +355,14 @@ static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg,
u8 data[3];
int ret;
- BUG_ON(codec->volatile_register);
+ BUG_ON(codec->driver->volatile_register);
data[0] = (reg >> 8) & 0xff;
data[1] = reg & 0xff;
data[2] = value;
reg &= 0xff;
- if (reg < codec->reg_cache_size)
+ if (reg < codec->driver->reg_cache_size)
cache[reg] = value;
if (codec->cache_only) {
@@ -451,7 +451,7 @@ static unsigned int snd_soc_16_16_read(struct snd_soc_codec *codec,
{
u16 *cache = codec->reg_cache;
- if (reg >= codec->reg_cache_size ||
+ if (reg >= codec->driver->reg_cache_size ||
snd_soc_codec_volatile_register(codec, reg)) {
if (codec->cache_only)
return -EINVAL;
@@ -474,7 +474,7 @@ static int snd_soc_16_16_write(struct snd_soc_codec *codec, unsigned int reg,
data[2] = (value >> 8) & 0xff;
data[3] = value & 0xff;
- if (reg < codec->reg_cache_size)
+ if (reg < codec->driver->reg_cache_size)
cache[reg] = value;
if (codec->cache_only) {
@@ -571,8 +571,8 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
return -EINVAL;
}
- codec->write = io_types[i].write;
- codec->read = io_types[i].read;
+ codec->driver->write = io_types[i].write;
+ codec->driver->read = io_types[i].read;
switch (control) {
case SND_SOC_CUSTOM:
@@ -584,11 +584,19 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
#endif
if (io_types[i].i2c_read)
codec->hw_read = io_types[i].i2c_read;
+
+ codec->control_data = container_of(codec->dev,
+ struct i2c_client,
+ dev);
break;
case SND_SOC_SPI:
if (io_types[i].spi_write)
codec->hw_write = io_types[i].spi_write;
+
+ codec->control_data = container_of(codec->dev,
+ struct spi_device,
+ dev);
break;
}
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 844ae8221a3a..3d480eb3555f 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -3,6 +3,8 @@
*
* Copyright 2005 Wolfson Microelectronics PLC.
* Copyright 2005 Openedhand Ltd.
+ * Copyright (C) 2010 Slimlogic Ltd.
+ * Copyright (C) 2010 Texas Instruments Inc.
*
* Author: Liam Girdwood <lrg@slimlogic.co.uk>
* with code, comments and ideas from :-
@@ -37,6 +39,8 @@
#include <sound/soc-dapm.h>
#include <sound/initval.h>
+#define NAME_SIZE 32
+
static DEFINE_MUTEX(pcm_mutex);
static DECLARE_WAIT_QUEUE_HEAD(soc_pm_waitq);
@@ -52,6 +56,7 @@ static LIST_HEAD(codec_list);
static int snd_soc_register_card(struct snd_soc_card *card);
static int snd_soc_unregister_card(struct snd_soc_card *card);
+static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num);
/*
* This is a timeout to do a DAPM powerdown after a stream is closed().
@@ -86,30 +91,30 @@ static ssize_t soc_codec_reg_show(struct snd_soc_codec *codec, char *buf)
{
int ret, i, step = 1, count = 0;
- if (!codec->reg_cache_size)
+ if (!codec->driver->reg_cache_size)
return 0;
- if (codec->reg_cache_step)
- step = codec->reg_cache_step;
+ if (codec->driver->reg_cache_step)
+ step = codec->driver->reg_cache_step;
count += sprintf(buf, "%s registers\n", codec->name);
- for (i = 0; i < codec->reg_cache_size; i += step) {
- if (codec->readable_register && !codec->readable_register(i))
+ for (i = 0; i < codec->driver->reg_cache_size; i += step) {
+ if (codec->driver->readable_register && !codec->driver->readable_register(i))
continue;
count += sprintf(buf + count, "%2x: ", i);
if (count >= PAGE_SIZE - 1)
break;
- if (codec->display_register) {
- count += codec->display_register(codec, buf + count,
+ if (codec->driver->display_register) {
+ count += codec->driver->display_register(codec, buf + count,
PAGE_SIZE - count, i);
} else {
/* If the read fails it's almost certainly due to
* the register being volatile and the device being
* powered off.
*/
- ret = codec->read(codec, i);
+ ret = codec->driver->read(codec, i);
if (ret >= 0)
count += snprintf(buf + count,
PAGE_SIZE - count,
@@ -137,8 +142,10 @@ static ssize_t soc_codec_reg_show(struct snd_soc_codec *codec, char *buf)
static ssize_t codec_reg_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
- struct snd_soc_device *devdata = dev_get_drvdata(dev);
- return soc_codec_reg_show(devdata->card->codec, buf);
+ struct snd_soc_pcm_runtime *rtd =
+ container_of(dev, struct snd_soc_pcm_runtime, dev);
+
+ return soc_codec_reg_show(rtd->codec, buf);
}
static DEVICE_ATTR(codec_reg, 0444, codec_reg_show, NULL);
@@ -146,20 +153,20 @@ static DEVICE_ATTR(codec_reg, 0444, codec_reg_show, NULL);
static ssize_t pmdown_time_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
- struct snd_soc_device *socdev = dev_get_drvdata(dev);
- struct snd_soc_card *card = socdev->card;
+ struct snd_soc_pcm_runtime *rtd =
+ container_of(dev, struct snd_soc_pcm_runtime, dev);
- return sprintf(buf, "%ld\n", card->pmdown_time);
+ return sprintf(buf, "%ld\n", rtd->pmdown_time);
}
static ssize_t pmdown_time_set(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
- struct snd_soc_device *socdev = dev_get_drvdata(dev);
- struct snd_soc_card *card = socdev->card;
+ struct snd_soc_pcm_runtime *rtd =
+ container_of(dev, struct snd_soc_pcm_runtime, dev);
- strict_strtol(buf, 10, &card->pmdown_time);
+ strict_strtol(buf, 10, &rtd->pmdown_time);
return count;
}
@@ -203,19 +210,19 @@ static ssize_t codec_reg_write_file(struct file *file,
return -EFAULT;
buf[buf_size] = 0;
- if (codec->reg_cache_step)
- step = codec->reg_cache_step;
+ if (codec->driver->reg_cache_step)
+ step = codec->driver->reg_cache_step;
while (*start == ' ')
start++;
reg = simple_strtoul(start, &start, 16);
- if ((reg >= codec->reg_cache_size) || (reg % step))
+ if ((reg >= codec->driver->reg_cache_size) || (reg % step))
return -EINVAL;
while (*start == ' ')
start++;
if (strict_strtoul(start, 16, &value))
return -EINVAL;
- codec->write(codec, reg, value);
+ codec->driver->write(codec, reg, value);
return buf_size;
}
@@ -227,16 +234,7 @@ static const struct file_operations codec_reg_fops = {
static void soc_init_codec_debugfs(struct snd_soc_codec *codec)
{
- char codec_root[128];
-
- if (codec->dev)
- snprintf(codec_root, sizeof(codec_root),
- "%s.%s", codec->name, dev_name(codec->dev));
- else
- snprintf(codec_root, sizeof(codec_root),
- "%s", codec->name);
-
- codec->debugfs_codec_root = debugfs_create_dir(codec_root,
+ codec->debugfs_codec_root = debugfs_create_dir(codec->name ,
debugfs_root);
if (!codec->debugfs_codec_root) {
printk(KERN_WARNING
@@ -305,7 +303,7 @@ static int soc_ac97_dev_register(struct snd_soc_codec *codec)
codec->ac97->dev.release = soc_ac97_device_release;
dev_set_name(&codec->ac97->dev, "%d-%d:%s",
- codec->card->number, 0, codec->name);
+ codec->card->snd_card->number, 0, codec->name);
err = device_register(&codec->ac97->dev);
if (err < 0) {
snd_printk(KERN_ERR "Can't register ac97 bus\n");
@@ -319,24 +317,21 @@ static int soc_ac97_dev_register(struct snd_soc_codec *codec)
static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_dai_link *machine = rtd->dai;
- struct snd_soc_dai *cpu_dai = machine->cpu_dai;
- struct snd_soc_dai *codec_dai = machine->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
int ret;
- if (codec_dai->symmetric_rates || cpu_dai->symmetric_rates ||
- machine->symmetric_rates) {
- dev_dbg(card->dev, "Symmetry forces %dHz rate\n",
- machine->rate);
+ if (codec_dai->driver->symmetric_rates || cpu_dai->driver->symmetric_rates ||
+ rtd->dai_link->symmetric_rates) {
+ dev_dbg(&rtd->dev, "Symmetry forces %dHz rate\n",
+ rtd->rate);
ret = snd_pcm_hw_constraint_minmax(substream->runtime,
SNDRV_PCM_HW_PARAM_RATE,
- machine->rate,
- machine->rate);
+ rtd->rate,
+ rtd->rate);
if (ret < 0) {
- dev_err(card->dev,
+ dev_err(&rtd->dev,
"Unable to apply rate symmetry constraint: %d\n", ret);
return ret;
}
@@ -353,20 +348,19 @@ static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream)
static int soc_pcm_open(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_card *card = socdev->card;
struct snd_pcm_runtime *runtime = substream->runtime;
- struct snd_soc_dai_link *machine = rtd->dai;
- struct snd_soc_platform *platform = card->platform;
- struct snd_soc_dai *cpu_dai = machine->cpu_dai;
- struct snd_soc_dai *codec_dai = machine->codec_dai;
+ struct snd_soc_platform *platform = rtd->platform;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai_driver *cpu_dai_drv = cpu_dai->driver;
+ struct snd_soc_dai_driver *codec_dai_drv = codec_dai->driver;
int ret = 0;
mutex_lock(&pcm_mutex);
/* startup the audio subsystem */
- if (cpu_dai->ops->startup) {
- ret = cpu_dai->ops->startup(substream, cpu_dai);
+ if (cpu_dai->driver->ops->startup) {
+ ret = cpu_dai->driver->ops->startup(substream, cpu_dai);
if (ret < 0) {
printk(KERN_ERR "asoc: can't open interface %s\n",
cpu_dai->name);
@@ -374,16 +368,16 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
}
}
- if (platform->pcm_ops->open) {
- ret = platform->pcm_ops->open(substream);
+ if (platform->driver->ops->open) {
+ ret = platform->driver->ops->open(substream);
if (ret < 0) {
printk(KERN_ERR "asoc: can't open platform %s\n", platform->name);
goto platform_err;
}
}
- if (codec_dai->ops->startup) {
- ret = codec_dai->ops->startup(substream, codec_dai);
+ if (codec_dai->driver->ops->startup) {
+ ret = codec_dai->driver->ops->startup(substream, codec_dai);
if (ret < 0) {
printk(KERN_ERR "asoc: can't open codec %s\n",
codec_dai->name);
@@ -391,10 +385,10 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
}
}
- if (machine->ops && machine->ops->startup) {
- ret = machine->ops->startup(substream);
+ if (rtd->dai_link->ops && rtd->dai_link->ops->startup) {
+ ret = rtd->dai_link->ops->startup(substream);
if (ret < 0) {
- printk(KERN_ERR "asoc: %s startup failed\n", machine->name);
+ printk(KERN_ERR "asoc: %s startup failed\n", rtd->dai_link->name);
goto machine_err;
}
}
@@ -402,50 +396,50 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
/* Check that the codec and cpu DAI's are compatible */
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
runtime->hw.rate_min =
- max(codec_dai->playback.rate_min,
- cpu_dai->playback.rate_min);
+ max(codec_dai_drv->playback.rate_min,
+ cpu_dai_drv->playback.rate_min);
runtime->hw.rate_max =
- min(codec_dai->playback.rate_max,
- cpu_dai->playback.rate_max);
+ min(codec_dai_drv->playback.rate_max,
+ cpu_dai_drv->playback.rate_max);
runtime->hw.channels_min =
- max(codec_dai->playback.channels_min,
- cpu_dai->playback.channels_min);
+ max(codec_dai_drv->playback.channels_min,
+ cpu_dai_drv->playback.channels_min);
runtime->hw.channels_max =
- min(codec_dai->playback.channels_max,
- cpu_dai->playback.channels_max);
+ min(codec_dai_drv->playback.channels_max,
+ cpu_dai_drv->playback.channels_max);
runtime->hw.formats =
- codec_dai->playback.formats & cpu_dai->playback.formats;
+ codec_dai_drv->playback.formats & cpu_dai_drv->playback.formats;
runtime->hw.rates =
- codec_dai->playback.rates & cpu_dai->playback.rates;
- if (codec_dai->playback.rates
+ codec_dai_drv->playback.rates & cpu_dai_drv->playback.rates;
+ if (codec_dai_drv->playback.rates
& (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))
- runtime->hw.rates |= cpu_dai->playback.rates;
- if (cpu_dai->playback.rates
+ runtime->hw.rates |= cpu_dai_drv->playback.rates;
+ if (cpu_dai_drv->playback.rates
& (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))
- runtime->hw.rates |= codec_dai->playback.rates;
+ runtime->hw.rates |= codec_dai_drv->playback.rates;
} else {
runtime->hw.rate_min =
- max(codec_dai->capture.rate_min,
- cpu_dai->capture.rate_min);
+ max(codec_dai_drv->capture.rate_min,
+ cpu_dai_drv->capture.rate_min);
runtime->hw.rate_max =
- min(codec_dai->capture.rate_max,
- cpu_dai->capture.rate_max);
+ min(codec_dai_drv->capture.rate_max,
+ cpu_dai_drv->capture.rate_max);
runtime->hw.channels_min =
- max(codec_dai->capture.channels_min,
- cpu_dai->capture.channels_min);
+ max(codec_dai_drv->capture.channels_min,
+ cpu_dai_drv->capture.channels_min);
runtime->hw.channels_max =
- min(codec_dai->capture.channels_max,
- cpu_dai->capture.channels_max);
+ min(codec_dai_drv->capture.channels_max,
+ cpu_dai_drv->capture.channels_max);
runtime->hw.formats =
- codec_dai->capture.formats & cpu_dai->capture.formats;
+ codec_dai_drv->capture.formats & cpu_dai_drv->capture.formats;
runtime->hw.rates =
- codec_dai->capture.rates & cpu_dai->capture.rates;
- if (codec_dai->capture.rates
+ codec_dai_drv->capture.rates & cpu_dai_drv->capture.rates;
+ if (codec_dai_drv->capture.rates
& (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))
- runtime->hw.rates |= cpu_dai->capture.rates;
- if (cpu_dai->capture.rates
+ runtime->hw.rates |= cpu_dai_drv->capture.rates;
+ if (cpu_dai_drv->capture.rates
& (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))
- runtime->hw.rates |= codec_dai->capture.rates;
+ runtime->hw.rates |= codec_dai_drv->capture.rates;
}
snd_pcm_limit_hw_rates(runtime);
@@ -461,7 +455,7 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
}
if (!runtime->hw.channels_min || !runtime->hw.channels_max) {
printk(KERN_ERR "asoc: %s <-> %s No matching channels\n",
- codec_dai->name, cpu_dai->name);
+ codec_dai->name, cpu_dai->name);
goto config_err;
}
@@ -472,7 +466,8 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
goto config_err;
}
- pr_debug("asoc: %s <-> %s info:\n", codec_dai->name, cpu_dai->name);
+ pr_debug("asoc: %s <-> %s info:\n",
+ codec_dai->name, cpu_dai->name);
pr_debug("asoc: rate mask 0x%x\n", runtime->hw.rates);
pr_debug("asoc: min ch %d max ch %d\n", runtime->hw.channels_min,
runtime->hw.channels_max);
@@ -480,33 +475,33 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
runtime->hw.rate_max);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
- cpu_dai->playback.active++;
- codec_dai->playback.active++;
+ cpu_dai->playback_active++;
+ codec_dai->playback_active++;
} else {
- cpu_dai->capture.active++;
- codec_dai->capture.active++;
+ cpu_dai->capture_active++;
+ codec_dai->capture_active++;
}
cpu_dai->active++;
codec_dai->active++;
- card->codec->active++;
+ rtd->codec->active++;
mutex_unlock(&pcm_mutex);
return 0;
config_err:
- if (machine->ops && machine->ops->shutdown)
- machine->ops->shutdown(substream);
+ if (rtd->dai_link->ops && rtd->dai_link->ops->shutdown)
+ rtd->dai_link->ops->shutdown(substream);
machine_err:
- if (codec_dai->ops->shutdown)
- codec_dai->ops->shutdown(substream, codec_dai);
+ if (codec_dai->driver->ops->shutdown)
+ codec_dai->driver->ops->shutdown(substream, codec_dai);
codec_dai_err:
- if (platform->pcm_ops->close)
- platform->pcm_ops->close(substream);
+ if (platform->driver->ops->close)
+ platform->driver->ops->close(substream);
platform_err:
- if (cpu_dai->ops->shutdown)
- cpu_dai->ops->shutdown(substream, cpu_dai);
+ if (cpu_dai->driver->ops->shutdown)
+ cpu_dai->driver->ops->shutdown(substream, cpu_dai);
out:
mutex_unlock(&pcm_mutex);
return ret;
@@ -519,29 +514,25 @@ out:
*/
static void close_delayed_work(struct work_struct *work)
{
- struct snd_soc_card *card = container_of(work, struct snd_soc_card,
- delayed_work.work);
- struct snd_soc_codec *codec = card->codec;
- struct snd_soc_dai *codec_dai;
- int i;
+ struct snd_soc_pcm_runtime *rtd =
+ container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
mutex_lock(&pcm_mutex);
- for (i = 0; i < codec->num_dai; i++) {
- codec_dai = &codec->dai[i];
-
- pr_debug("pop wq checking: %s status: %s waiting: %s\n",
- codec_dai->playback.stream_name,
- codec_dai->playback.active ? "active" : "inactive",
- codec_dai->pop_wait ? "yes" : "no");
-
- /* are we waiting on this codec DAI stream */
- if (codec_dai->pop_wait == 1) {
- codec_dai->pop_wait = 0;
- snd_soc_dapm_stream_event(codec,
- codec_dai->playback.stream_name,
- SND_SOC_DAPM_STREAM_STOP);
- }
+
+ pr_debug("pop wq checking: %s status: %s waiting: %s\n",
+ codec_dai->driver->playback.stream_name,
+ codec_dai->playback_active ? "active" : "inactive",
+ codec_dai->pop_wait ? "yes" : "no");
+
+ /* are we waiting on this codec DAI stream */
+ if (codec_dai->pop_wait == 1) {
+ codec_dai->pop_wait = 0;
+ snd_soc_dapm_stream_event(rtd,
+ codec_dai->driver->playback.stream_name,
+ SND_SOC_DAPM_STREAM_STOP);
}
+
mutex_unlock(&pcm_mutex);
}
@@ -553,22 +544,19 @@ static void close_delayed_work(struct work_struct *work)
static int soc_codec_close(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_dai_link *machine = rtd->dai;
- struct snd_soc_platform *platform = card->platform;
- struct snd_soc_dai *cpu_dai = machine->cpu_dai;
- struct snd_soc_dai *codec_dai = machine->codec_dai;
- struct snd_soc_codec *codec = card->codec;
+ struct snd_soc_platform *platform = rtd->platform;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_codec *codec = rtd->codec;
mutex_lock(&pcm_mutex);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
- cpu_dai->playback.active--;
- codec_dai->playback.active--;
+ cpu_dai->playback_active--;
+ codec_dai->playback_active--;
} else {
- cpu_dai->capture.active--;
- codec_dai->capture.active--;
+ cpu_dai->capture_active--;
+ codec_dai->capture_active--;
}
cpu_dai->active--;
@@ -581,27 +569,28 @@ static int soc_codec_close(struct snd_pcm_substream *substream)
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
snd_soc_dai_digital_mute(codec_dai, 1);
- if (cpu_dai->ops->shutdown)
- cpu_dai->ops->shutdown(substream, cpu_dai);
+ if (cpu_dai->driver->ops->shutdown)
+ cpu_dai->driver->ops->shutdown(substream, cpu_dai);
- if (codec_dai->ops->shutdown)
- codec_dai->ops->shutdown(substream, codec_dai);
+ if (codec_dai->driver->ops->shutdown)
+ codec_dai->driver->ops->shutdown(substream, codec_dai);
- if (machine->ops && machine->ops->shutdown)
- machine->ops->shutdown(substream);
+ if (rtd->dai_link->ops && rtd->dai_link->ops->shutdown)
+ rtd->dai_link->ops->shutdown(substream);
- if (platform->pcm_ops->close)
- platform->pcm_ops->close(substream);
+ if (platform->driver->ops->close)
+ platform->driver->ops->close(substream);
+ cpu_dai->runtime = NULL;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
/* start delayed pop wq here for playback streams */
codec_dai->pop_wait = 1;
- schedule_delayed_work(&card->delayed_work,
- msecs_to_jiffies(card->pmdown_time));
+ schedule_delayed_work(&rtd->delayed_work,
+ msecs_to_jiffies(rtd->pmdown_time));
} else {
/* capture streams can be powered down now */
- snd_soc_dapm_stream_event(codec,
- codec_dai->capture.stream_name,
+ snd_soc_dapm_stream_event(rtd,
+ codec_dai->driver->capture.stream_name,
SND_SOC_DAPM_STREAM_STOP);
}
@@ -617,43 +606,39 @@ static int soc_codec_close(struct snd_pcm_substream *substream)
static int soc_pcm_prepare(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_dai_link *machine = rtd->dai;
- struct snd_soc_platform *platform = card->platform;
- struct snd_soc_dai *cpu_dai = machine->cpu_dai;
- struct snd_soc_dai *codec_dai = machine->codec_dai;
- struct snd_soc_codec *codec = card->codec;
+ struct snd_soc_platform *platform = rtd->platform;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
int ret = 0;
mutex_lock(&pcm_mutex);
- if (machine->ops && machine->ops->prepare) {
- ret = machine->ops->prepare(substream);
+ if (rtd->dai_link->ops && rtd->dai_link->ops->prepare) {
+ ret = rtd->dai_link->ops->prepare(substream);
if (ret < 0) {
printk(KERN_ERR "asoc: machine prepare error\n");
goto out;
}
}
- if (platform->pcm_ops->prepare) {
- ret = platform->pcm_ops->prepare(substream);
+ if (platform->driver->ops->prepare) {
+ ret = platform->driver->ops->prepare(substream);
if (ret < 0) {
printk(KERN_ERR "asoc: platform prepare error\n");
goto out;
}
}
- if (codec_dai->ops->prepare) {
- ret = codec_dai->ops->prepare(substream, codec_dai);
+ if (codec_dai->driver->ops->prepare) {
+ ret = codec_dai->driver->ops->prepare(substream, codec_dai);
if (ret < 0) {
printk(KERN_ERR "asoc: codec DAI prepare error\n");
goto out;
}
}
- if (cpu_dai->ops->prepare) {
- ret = cpu_dai->ops->prepare(substream, cpu_dai);
+ if (cpu_dai->driver->ops->prepare) {
+ ret = cpu_dai->driver->ops->prepare(substream, cpu_dai);
if (ret < 0) {
printk(KERN_ERR "asoc: cpu DAI prepare error\n");
goto out;
@@ -664,16 +649,16 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream)
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
codec_dai->pop_wait) {
codec_dai->pop_wait = 0;
- cancel_delayed_work(&card->delayed_work);
+ cancel_delayed_work(&rtd->delayed_work);
}
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
- snd_soc_dapm_stream_event(codec,
- codec_dai->playback.stream_name,
+ snd_soc_dapm_stream_event(rtd,
+ codec_dai->driver->playback.stream_name,
SND_SOC_DAPM_STREAM_START);
else
- snd_soc_dapm_stream_event(codec,
- codec_dai->capture.stream_name,
+ snd_soc_dapm_stream_event(rtd,
+ codec_dai->driver->capture.stream_name,
SND_SOC_DAPM_STREAM_START);
snd_soc_dai_digital_mute(codec_dai, 0);
@@ -692,26 +677,23 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_dai_link *machine = rtd->dai;
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_platform *platform = card->platform;
- struct snd_soc_dai *cpu_dai = machine->cpu_dai;
- struct snd_soc_dai *codec_dai = machine->codec_dai;
+ struct snd_soc_platform *platform = rtd->platform;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
int ret = 0;
mutex_lock(&pcm_mutex);
- if (machine->ops && machine->ops->hw_params) {
- ret = machine->ops->hw_params(substream, params);
+ if (rtd->dai_link->ops && rtd->dai_link->ops->hw_params) {
+ ret = rtd->dai_link->ops->hw_params(substream, params);
if (ret < 0) {
printk(KERN_ERR "asoc: machine hw_params failed\n");
goto out;
}
}
- if (codec_dai->ops->hw_params) {
- ret = codec_dai->ops->hw_params(substream, params, codec_dai);
+ if (codec_dai->driver->ops->hw_params) {
+ ret = codec_dai->driver->ops->hw_params(substream, params, codec_dai);
if (ret < 0) {
printk(KERN_ERR "asoc: can't set codec %s hw params\n",
codec_dai->name);
@@ -719,8 +701,8 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
}
}
- if (cpu_dai->ops->hw_params) {
- ret = cpu_dai->ops->hw_params(substream, params, cpu_dai);
+ if (cpu_dai->driver->ops->hw_params) {
+ ret = cpu_dai->driver->ops->hw_params(substream, params, cpu_dai);
if (ret < 0) {
printk(KERN_ERR "asoc: interface %s hw params failed\n",
cpu_dai->name);
@@ -728,8 +710,8 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
}
}
- if (platform->pcm_ops->hw_params) {
- ret = platform->pcm_ops->hw_params(substream, params);
+ if (platform->driver->ops->hw_params) {
+ ret = platform->driver->ops->hw_params(substream, params);
if (ret < 0) {
printk(KERN_ERR "asoc: platform %s hw params failed\n",
platform->name);
@@ -737,23 +719,23 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
}
}
- machine->rate = params_rate(params);
+ rtd->rate = params_rate(params);
out:
mutex_unlock(&pcm_mutex);
return ret;
platform_err:
- if (cpu_dai->ops->hw_free)
- cpu_dai->ops->hw_free(substream, cpu_dai);
+ if (cpu_dai->driver->ops->hw_free)
+ cpu_dai->driver->ops->hw_free(substream, cpu_dai);
interface_err:
- if (codec_dai->ops->hw_free)
- codec_dai->ops->hw_free(substream, codec_dai);
+ if (codec_dai->driver->ops->hw_free)
+ codec_dai->driver->ops->hw_free(substream, codec_dai);
codec_err:
- if (machine->ops && machine->ops->hw_free)
- machine->ops->hw_free(substream);
+ if (rtd->dai_link->ops && rtd->dai_link->ops->hw_free)
+ rtd->dai_link->ops->hw_free(substream);
mutex_unlock(&pcm_mutex);
return ret;
@@ -765,13 +747,10 @@ codec_err:
static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_dai_link *machine = rtd->dai;
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_platform *platform = card->platform;
- struct snd_soc_dai *cpu_dai = machine->cpu_dai;
- struct snd_soc_dai *codec_dai = machine->codec_dai;
- struct snd_soc_codec *codec = card->codec;
+ struct snd_soc_platform *platform = rtd->platform;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_codec *codec = rtd->codec;
mutex_lock(&pcm_mutex);
@@ -780,19 +759,19 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
snd_soc_dai_digital_mute(codec_dai, 1);
/* free any machine hw params */
- if (machine->ops && machine->ops->hw_free)
- machine->ops->hw_free(substream);
+ if (rtd->dai_link->ops && rtd->dai_link->ops->hw_free)
+ rtd->dai_link->ops->hw_free(substream);
/* free any DMA resources */
- if (platform->pcm_ops->hw_free)
- platform->pcm_ops->hw_free(substream);
+ if (platform->driver->ops->hw_free)
+ platform->driver->ops->hw_free(substream);
/* now free hw params for the DAI's */
- if (codec_dai->ops->hw_free)
- codec_dai->ops->hw_free(substream, codec_dai);
+ if (codec_dai->driver->ops->hw_free)
+ codec_dai->driver->ops->hw_free(substream, codec_dai);
- if (cpu_dai->ops->hw_free)
- cpu_dai->ops->hw_free(substream, cpu_dai);
+ if (cpu_dai->driver->ops->hw_free)
+ cpu_dai->driver->ops->hw_free(substream, cpu_dai);
mutex_unlock(&pcm_mutex);
return 0;
@@ -801,28 +780,25 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_card *card= socdev->card;
- struct snd_soc_dai_link *machine = rtd->dai;
- struct snd_soc_platform *platform = card->platform;
- struct snd_soc_dai *cpu_dai = machine->cpu_dai;
- struct snd_soc_dai *codec_dai = machine->codec_dai;
+ struct snd_soc_platform *platform = rtd->platform;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
int ret;
- if (codec_dai->ops->trigger) {
- ret = codec_dai->ops->trigger(substream, cmd, codec_dai);
+ if (codec_dai->driver->ops->trigger) {
+ ret = codec_dai->driver->ops->trigger(substream, cmd, codec_dai);
if (ret < 0)
return ret;
}
- if (platform->pcm_ops->trigger) {
- ret = platform->pcm_ops->trigger(substream, cmd);
+ if (platform->driver->ops->trigger) {
+ ret = platform->driver->ops->trigger(substream, cmd);
if (ret < 0)
return ret;
}
- if (cpu_dai->ops->trigger) {
- ret = cpu_dai->ops->trigger(substream, cmd, cpu_dai);
+ if (cpu_dai->driver->ops->trigger) {
+ ret = cpu_dai->driver->ops->trigger(substream, cmd, cpu_dai);
if (ret < 0)
return ret;
}
@@ -837,27 +813,24 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_platform *platform = card->platform;
- struct snd_soc_dai_link *machine = rtd->dai;
- struct snd_soc_dai *cpu_dai = machine->cpu_dai;
- struct snd_soc_dai *codec_dai = machine->codec_dai;
+ struct snd_soc_platform *platform = rtd->platform;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
struct snd_pcm_runtime *runtime = substream->runtime;
snd_pcm_uframes_t offset = 0;
snd_pcm_sframes_t delay = 0;
- if (platform->pcm_ops->pointer)
- offset = platform->pcm_ops->pointer(substream);
+ if (platform->driver->ops->pointer)
+ offset = platform->driver->ops->pointer(substream);
- if (cpu_dai->ops->delay)
- delay += cpu_dai->ops->delay(substream, cpu_dai);
+ if (cpu_dai->driver->ops->delay)
+ delay += cpu_dai->driver->ops->delay(substream, cpu_dai);
- if (codec_dai->ops->delay)
- delay += codec_dai->ops->delay(substream, codec_dai);
+ if (codec_dai->driver->ops->delay)
+ delay += codec_dai->driver->ops->delay(substream, codec_dai);
- if (platform->delay)
- delay += platform->delay(substream, codec_dai);
+ if (platform->driver->delay)
+ delay += platform->driver->delay(substream, codec_dai);
runtime->delay = delay;
@@ -880,104 +853,111 @@ static struct snd_pcm_ops soc_pcm_ops = {
static int soc_suspend(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_platform *platform = card->platform;
- struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
- struct snd_soc_codec *codec = card->codec;
+ struct snd_soc_card *card = platform_get_drvdata(pdev);
int i;
/* If the initialization of this soc device failed, there is no codec
* associated with it. Just bail out in this case.
*/
- if (!codec)
+ if (list_empty(&card->codec_dev_list))
return 0;
/* Due to the resume being scheduled into a workqueue we could
* suspend before that's finished - wait for it to complete.
*/
- snd_power_lock(codec->card);
- snd_power_wait(codec->card, SNDRV_CTL_POWER_D0);
- snd_power_unlock(codec->card);
+ snd_power_lock(card->snd_card);
+ snd_power_wait(card->snd_card, SNDRV_CTL_POWER_D0);
+ snd_power_unlock(card->snd_card);
/* we're going to block userspace touching us until resume completes */
- snd_power_change_state(codec->card, SNDRV_CTL_POWER_D3hot);
+ snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D3hot);
/* mute any active DAC's */
- for (i = 0; i < card->num_links; i++) {
- struct snd_soc_dai *dai = card->dai_link[i].codec_dai;
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_dai *dai = card->rtd[i].codec_dai;
+ struct snd_soc_dai_driver *drv = dai->driver;
- if (card->dai_link[i].ignore_suspend)
+ if (card->rtd[i].dai_link->ignore_suspend)
continue;
- if (dai->ops->digital_mute && dai->playback.active)
- dai->ops->digital_mute(dai, 1);
+ if (drv->ops->digital_mute && dai->playback_active)
+ drv->ops->digital_mute(dai, 1);
}
/* suspend all pcms */
- for (i = 0; i < card->num_links; i++) {
- if (card->dai_link[i].ignore_suspend)
+ for (i = 0; i < card->num_rtd; i++) {
+ if (card->rtd[i].dai_link->ignore_suspend)
continue;
- snd_pcm_suspend_all(card->dai_link[i].pcm);
+ snd_pcm_suspend_all(card->rtd[i].pcm);
}
if (card->suspend_pre)
card->suspend_pre(pdev, PMSG_SUSPEND);
- for (i = 0; i < card->num_links; i++) {
- struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
+ struct snd_soc_platform *platform = card->rtd[i].platform;
- if (card->dai_link[i].ignore_suspend)
+ if (card->rtd[i].dai_link->ignore_suspend)
continue;
- if (cpu_dai->suspend && !cpu_dai->ac97_control)
- cpu_dai->suspend(cpu_dai);
- if (platform->suspend)
- platform->suspend(&card->dai_link[i]);
+ if (cpu_dai->driver->suspend && !cpu_dai->driver->ac97_control)
+ cpu_dai->driver->suspend(cpu_dai);
+ if (platform->driver->suspend && !platform->suspended) {
+ platform->driver->suspend(cpu_dai);
+ platform->suspended = 1;
+ }
}
/* close any waiting streams and save state */
- run_delayed_work(&card->delayed_work);
- codec->suspend_bias_level = codec->bias_level;
+ for (i = 0; i < card->num_rtd; i++) {
+ run_delayed_work(&card->rtd[i].delayed_work);
+ card->rtd[i].codec->suspend_bias_level = card->rtd[i].codec->bias_level;
+ }
- for (i = 0; i < codec->num_dai; i++) {
- char *stream = codec->dai[i].playback.stream_name;
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_dai_driver *driver = card->rtd[i].codec_dai->driver;
- if (card->dai_link[i].ignore_suspend)
+ if (card->rtd[i].dai_link->ignore_suspend)
continue;
- if (stream != NULL)
- snd_soc_dapm_stream_event(codec, stream,
+ if (driver->playback.stream_name != NULL)
+ snd_soc_dapm_stream_event(&card->rtd[i], driver->playback.stream_name,
SND_SOC_DAPM_STREAM_SUSPEND);
- stream = codec->dai[i].capture.stream_name;
- if (stream != NULL)
- snd_soc_dapm_stream_event(codec, stream,
+
+ if (driver->capture.stream_name != NULL)
+ snd_soc_dapm_stream_event(&card->rtd[i], driver->capture.stream_name,
SND_SOC_DAPM_STREAM_SUSPEND);
}
- /* If there are paths active then the CODEC will be held with
- * bias _ON and should not be suspended. */
- if (codec_dev->suspend) {
- switch (codec->bias_level) {
- case SND_SOC_BIAS_STANDBY:
- case SND_SOC_BIAS_OFF:
- codec_dev->suspend(pdev, PMSG_SUSPEND);
- break;
- default:
- dev_dbg(socdev->dev, "CODEC is on over suspend\n");
- break;
+ /* suspend all CODECs */
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_codec *codec = card->rtd[i].codec;
+ /* If there are paths active then the CODEC will be held with
+ * bias _ON and should not be suspended. */
+ if (!codec->suspended && codec->driver->suspend) {
+ switch (codec->bias_level) {
+ case SND_SOC_BIAS_STANDBY:
+ case SND_SOC_BIAS_OFF:
+ codec->driver->suspend(codec, PMSG_SUSPEND);
+ codec->suspended = 1;
+ break;
+ default:
+ dev_dbg(codec->dev, "CODEC is on over suspend\n");
+ break;
+ }
}
}
- for (i = 0; i < card->num_links; i++) {
- struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
- if (card->dai_link[i].ignore_suspend)
+ if (card->rtd[i].dai_link->ignore_suspend)
continue;
- if (cpu_dai->suspend && cpu_dai->ac97_control)
- cpu_dai->suspend(cpu_dai);
+ if (cpu_dai->driver->suspend && cpu_dai->driver->ac97_control)
+ cpu_dai->driver->suspend(cpu_dai);
}
if (card->suspend_post)
@@ -991,127 +971,127 @@ static int soc_suspend(struct device *dev)
*/
static void soc_resume_deferred(struct work_struct *work)
{
- struct snd_soc_card *card = container_of(work,
- struct snd_soc_card,
- deferred_resume_work);
- struct snd_soc_device *socdev = card->socdev;
- struct snd_soc_platform *platform = card->platform;
- struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
- struct snd_soc_codec *codec = card->codec;
- struct platform_device *pdev = to_platform_device(socdev->dev);
+ struct snd_soc_card *card =
+ container_of(work, struct snd_soc_card, deferred_resume_work);
+ struct platform_device *pdev = to_platform_device(card->dev);
int i;
/* our power state is still SNDRV_CTL_POWER_D3hot from suspend time,
* so userspace apps are blocked from touching us
*/
- dev_dbg(socdev->dev, "starting resume work\n");
+ dev_dbg(card->dev, "starting resume work\n");
/* Bring us up into D2 so that DAPM starts enabling things */
- snd_power_change_state(codec->card, SNDRV_CTL_POWER_D2);
+ snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D2);
if (card->resume_pre)
card->resume_pre(pdev);
- for (i = 0; i < card->num_links; i++) {
- struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
+ /* resume AC97 DAIs */
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
- if (card->dai_link[i].ignore_suspend)
+ if (card->rtd[i].dai_link->ignore_suspend)
continue;
- if (cpu_dai->resume && cpu_dai->ac97_control)
- cpu_dai->resume(cpu_dai);
- }
-
- /* If the CODEC was idle over suspend then it will have been
- * left with bias OFF or STANDBY and suspended so we must now
- * resume. Otherwise the suspend was suppressed.
- */
- if (codec_dev->resume) {
- switch (codec->bias_level) {
- case SND_SOC_BIAS_STANDBY:
- case SND_SOC_BIAS_OFF:
- codec_dev->resume(pdev);
- break;
- default:
- dev_dbg(socdev->dev, "CODEC was on over suspend\n");
- break;
+ if (cpu_dai->driver->resume && cpu_dai->driver->ac97_control)
+ cpu_dai->driver->resume(cpu_dai);
+ }
+
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_codec *codec = card->rtd[i].codec;
+ /* If the CODEC was idle over suspend then it will have been
+ * left with bias OFF or STANDBY and suspended so we must now
+ * resume. Otherwise the suspend was suppressed.
+ */
+ if (codec->driver->resume && codec->suspended) {
+ switch (codec->bias_level) {
+ case SND_SOC_BIAS_STANDBY:
+ case SND_SOC_BIAS_OFF:
+ codec->driver->resume(codec);
+ codec->suspended = 0;
+ break;
+ default:
+ dev_dbg(codec->dev, "CODEC was on over suspend\n");
+ break;
+ }
}
}
- for (i = 0; i < codec->num_dai; i++) {
- char *stream = codec->dai[i].playback.stream_name;
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_dai_driver *driver = card->rtd[i].codec_dai->driver;
- if (card->dai_link[i].ignore_suspend)
+ if (card->rtd[i].dai_link->ignore_suspend)
continue;
- if (stream != NULL)
- snd_soc_dapm_stream_event(codec, stream,
+ if (driver->playback.stream_name != NULL)
+ snd_soc_dapm_stream_event(&card->rtd[i], driver->playback.stream_name,
SND_SOC_DAPM_STREAM_RESUME);
- stream = codec->dai[i].capture.stream_name;
- if (stream != NULL)
- snd_soc_dapm_stream_event(codec, stream,
+
+ if (driver->capture.stream_name != NULL)
+ snd_soc_dapm_stream_event(&card->rtd[i], driver->capture.stream_name,
SND_SOC_DAPM_STREAM_RESUME);
}
/* unmute any active DACs */
- for (i = 0; i < card->num_links; i++) {
- struct snd_soc_dai *dai = card->dai_link[i].codec_dai;
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_dai *dai = card->rtd[i].codec_dai;
+ struct snd_soc_dai_driver *drv = dai->driver;
- if (card->dai_link[i].ignore_suspend)
+ if (card->rtd[i].dai_link->ignore_suspend)
continue;
- if (dai->ops->digital_mute && dai->playback.active)
- dai->ops->digital_mute(dai, 0);
+ if (drv->ops->digital_mute && dai->playback_active)
+ drv->ops->digital_mute(dai, 0);
}
- for (i = 0; i < card->num_links; i++) {
- struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
+ struct snd_soc_platform *platform = card->rtd[i].platform;
- if (card->dai_link[i].ignore_suspend)
+ if (card->rtd[i].dai_link->ignore_suspend)
continue;
- if (cpu_dai->resume && !cpu_dai->ac97_control)
- cpu_dai->resume(cpu_dai);
- if (platform->resume)
- platform->resume(&card->dai_link[i]);
+ if (cpu_dai->driver->resume && !cpu_dai->driver->ac97_control)
+ cpu_dai->driver->resume(cpu_dai);
+ if (platform->driver->resume && platform->suspended) {
+ platform->driver->resume(cpu_dai);
+ platform->suspended = 0;
+ }
}
if (card->resume_post)
card->resume_post(pdev);
- dev_dbg(socdev->dev, "resume work completed\n");
+ dev_dbg(card->dev, "resume work completed\n");
/* userspace can access us now we are back as we were before */
- snd_power_change_state(codec->card, SNDRV_CTL_POWER_D0);
+ snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D0);
}
/* powers up audio subsystem after a suspend */
static int soc_resume(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_dai *cpu_dai = card->dai_link[0].cpu_dai;
-
- /* If the initialization of this soc device failed, there is no codec
- * associated with it. Just bail out in this case.
- */
- if (!card->codec)
- return 0;
+ struct snd_soc_card *card = platform_get_drvdata(pdev);
+ int i;
/* AC97 devices might have other drivers hanging off them so
* need to resume immediately. Other drivers don't have that
* problem and may take a substantial amount of time to resume
* due to I/O costs and anti-pop so handle them out of line.
*/
- if (cpu_dai->ac97_control) {
- dev_dbg(socdev->dev, "Resuming AC97 immediately\n");
- soc_resume_deferred(&card->deferred_resume_work);
- } else {
- dev_dbg(socdev->dev, "Scheduling resume work\n");
- if (!schedule_work(&card->deferred_resume_work))
- dev_err(socdev->dev, "resume work item may be lost\n");
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
+ if (cpu_dai->driver->ac97_control) {
+ dev_dbg(dev, "Resuming AC97 immediately\n");
+ soc_resume_deferred(&card->deferred_resume_work);
+ } else {
+ dev_dbg(dev, "Scheduling resume work\n");
+ if (!schedule_work(&card->deferred_resume_work))
+ dev_err(dev, "resume work item may be lost\n");
+ }
}
return 0;
@@ -1124,198 +1104,430 @@ static int soc_resume(struct device *dev)
static struct snd_soc_dai_ops null_dai_ops = {
};
-static void snd_soc_instantiate_card(struct snd_soc_card *card)
+static int soc_bind_dai_link(struct snd_soc_card *card, int num)
{
- struct platform_device *pdev = container_of(card->dev,
- struct platform_device,
- dev);
- struct snd_soc_codec_device *codec_dev = card->socdev->codec_dev;
+ struct snd_soc_dai_link *dai_link = &card->dai_link[num];
+ struct snd_soc_pcm_runtime *rtd = &card->rtd[num];
struct snd_soc_codec *codec;
struct snd_soc_platform *platform;
- struct snd_soc_dai *dai;
- int i, found, ret, ac97;
+ struct snd_soc_dai *codec_dai, *cpu_dai;
- if (card->instantiated)
- return;
+ if (rtd->complete)
+ return 1;
+ dev_dbg(card->dev, "binding %s at idx %d\n", dai_link->name, num);
- found = 0;
- list_for_each_entry(platform, &platform_list, list)
- if (card->platform == platform) {
- found = 1;
- break;
+ /* do we already have the CPU DAI for this link ? */
+ if (rtd->cpu_dai) {
+ goto find_codec;
+ }
+ /* no, then find CPU DAI from registered DAIs*/
+ list_for_each_entry(cpu_dai, &dai_list, list) {
+ if (!strcmp(cpu_dai->name, dai_link->cpu_dai_name)) {
+
+ if (!try_module_get(cpu_dai->dev->driver->owner))
+ return -ENODEV;
+
+ rtd->cpu_dai = cpu_dai;
+ goto find_codec;
}
- if (!found) {
- dev_dbg(card->dev, "Platform %s not registered\n",
- card->platform->name);
- return;
}
+ dev_dbg(card->dev, "CPU DAI %s not registered\n",
+ dai_link->cpu_dai_name);
- ac97 = 0;
- for (i = 0; i < card->num_links; i++) {
- found = 0;
- list_for_each_entry(dai, &dai_list, list)
- if (card->dai_link[i].cpu_dai == dai) {
- found = 1;
- break;
+find_codec:
+ /* do we already have the CODEC for this link ? */
+ if (rtd->codec) {
+ goto find_platform;
+ }
+
+ /* no, then find CODEC from registered CODECs*/
+ list_for_each_entry(codec, &codec_list, list) {
+ if (!strcmp(codec->name, dai_link->codec_name)) {
+ rtd->codec = codec;
+
+ if (!try_module_get(codec->dev->driver->owner))
+ return -ENODEV;
+
+ /* CODEC found, so find CODEC DAI from registered DAIs from this CODEC*/
+ list_for_each_entry(codec_dai, &dai_list, list) {
+ if (codec->dev == codec_dai->dev &&
+ !strcmp(codec_dai->name, dai_link->codec_dai_name)) {
+ rtd->codec_dai = codec_dai;
+ goto find_platform;
+ }
}
- if (!found) {
- dev_dbg(card->dev, "DAI %s not registered\n",
- card->dai_link[i].cpu_dai->name);
- return;
+ dev_dbg(card->dev, "CODEC DAI %s not registered\n",
+ dai_link->codec_dai_name);
+
+ goto find_platform;
}
+ }
+ dev_dbg(card->dev, "CODEC %s not registered\n",
+ dai_link->codec_name);
- if (card->dai_link[i].cpu_dai->ac97_control)
- ac97 = 1;
+find_platform:
+ /* do we already have the CODEC DAI for this link ? */
+ if (rtd->platform) {
+ goto out;
}
+ /* no, then find CPU DAI from registered DAIs*/
+ list_for_each_entry(platform, &platform_list, list) {
+ if (!strcmp(platform->name, dai_link->platform_name)) {
- for (i = 0; i < card->num_links; i++) {
- if (!card->dai_link[i].codec_dai->ops)
- card->dai_link[i].codec_dai->ops = &null_dai_ops;
+ if (!try_module_get(platform->dev->driver->owner))
+ return -ENODEV;
+
+ rtd->platform = platform;
+ goto out;
+ }
}
- /* If we have AC97 in the system then don't wait for the
- * codec. This will need revisiting if we have to handle
- * systems with mixed AC97 and non-AC97 parts. Only check for
- * DAIs currently; we can't do this per link since some AC97
- * codecs have non-AC97 DAIs.
- */
- if (!ac97)
- for (i = 0; i < card->num_links; i++) {
- found = 0;
- list_for_each_entry(dai, &dai_list, list)
- if (card->dai_link[i].codec_dai == dai) {
- found = 1;
- break;
- }
- if (!found) {
- dev_dbg(card->dev, "DAI %s not registered\n",
- card->dai_link[i].codec_dai->name);
- return;
- }
+ dev_dbg(card->dev, "platform %s not registered\n",
+ dai_link->platform_name);
+ return 0;
+
+out:
+ /* mark rtd as complete if we found all 4 of our client devices */
+ if (rtd->codec && rtd->codec_dai && rtd->platform && rtd->cpu_dai) {
+ rtd->complete = 1;
+ card->num_rtd++;
+ }
+ return 1;
+}
+
+static void soc_remove_dai_link(struct snd_soc_card *card, int num)
+{
+ struct snd_soc_pcm_runtime *rtd = &card->rtd[num];
+ struct snd_soc_codec *codec = rtd->codec;
+ struct snd_soc_platform *platform = rtd->platform;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai, *cpu_dai = rtd->cpu_dai;
+ int err;
+
+ /* unregister the rtd device */
+ if (rtd->dev_registered) {
+ device_remove_file(&rtd->dev, &dev_attr_pmdown_time);
+ device_unregister(&rtd->dev);
+ rtd->dev_registered = 0;
+ }
+
+ /* remove the CODEC DAI */
+ if (codec_dai && codec_dai->probed) {
+ if (codec_dai->driver->remove) {
+ err = codec_dai->driver->remove(codec_dai);
+ if (err < 0)
+ printk(KERN_ERR "asoc: failed to remove %s\n", codec_dai->name);
}
+ codec_dai->probed = 0;
+ list_del(&codec_dai->card_list);
+ }
- /* Note that we do not current check for codec components */
+ /* remove the platform */
+ if (platform && platform->probed) {
+ if (platform->driver->remove) {
+ err = platform->driver->remove(platform);
+ if (err < 0)
+ printk(KERN_ERR "asoc: failed to remove %s\n", platform->name);
+ }
+ platform->probed = 0;
+ list_del(&platform->card_list);
+ module_put(platform->dev->driver->owner);
+ }
- dev_dbg(card->dev, "All components present, instantiating\n");
+ /* remove the CODEC */
+ if (codec && codec->probed) {
+ if (codec->driver->remove) {
+ err = codec->driver->remove(codec);
+ if (err < 0)
+ printk(KERN_ERR "asoc: failed to remove %s\n", codec->name);
+ }
- /* Found everything, bring it up */
- card->pmdown_time = pmdown_time;
+ /* Make sure all DAPM widgets are freed */
+ snd_soc_dapm_free(codec);
- if (card->probe) {
- ret = card->probe(pdev);
- if (ret < 0)
- return;
+ soc_cleanup_codec_debugfs(codec);
+ device_remove_file(&rtd->dev, &dev_attr_codec_reg);
+ codec->probed = 0;
+ list_del(&codec->card_list);
+ module_put(codec->dev->driver->owner);
}
- for (i = 0; i < card->num_links; i++) {
- struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
- if (cpu_dai->probe) {
- ret = cpu_dai->probe(pdev, cpu_dai);
- if (ret < 0)
- goto cpu_dai_err;
+ /* remove the cpu_dai */
+ if (cpu_dai && cpu_dai->probed) {
+ if (cpu_dai->driver->remove) {
+ err = cpu_dai->driver->remove(cpu_dai);
+ if (err < 0)
+ printk(KERN_ERR "asoc: failed to remove %s\n", cpu_dai->name);
}
+ cpu_dai->probed = 0;
+ list_del(&cpu_dai->card_list);
+ module_put(cpu_dai->dev->driver->owner);
}
+}
- if (codec_dev->probe) {
- ret = codec_dev->probe(pdev);
- if (ret < 0)
- goto cpu_dai_err;
+static void rtd_release(struct device *dev) {}
+
+static int soc_probe_dai_link(struct snd_soc_card *card, int num)
+{
+ struct snd_soc_dai_link *dai_link = &card->dai_link[num];
+ struct snd_soc_pcm_runtime *rtd = &card->rtd[num];
+ struct snd_soc_codec *codec = rtd->codec;
+ struct snd_soc_platform *platform = rtd->platform;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai, *cpu_dai = rtd->cpu_dai;
+ int ret;
+
+ dev_dbg(card->dev, "probe %s dai link %d\n", card->name, num);
+
+ /* config components */
+ codec_dai->codec = codec;
+ codec->card = card;
+ cpu_dai->platform = platform;
+ rtd->card = card;
+ rtd->dev.parent = card->dev;
+ codec_dai->card = card;
+ cpu_dai->card = card;
+
+ /* set default power off timeout */
+ rtd->pmdown_time = pmdown_time;
+
+ /* probe the cpu_dai */
+ if (!cpu_dai->probed) {
+ if (cpu_dai->driver->probe) {
+ ret = cpu_dai->driver->probe(cpu_dai);
+ if (ret < 0) {
+ printk(KERN_ERR "asoc: failed to probe CPU DAI %s\n",
+ cpu_dai->name);
+ return ret;
+ }
+ }
+ cpu_dai->probed = 1;
+ /* mark cpu_dai as probed and add to card cpu_dai list */
+ list_add(&cpu_dai->card_list, &card->dai_dev_list);
}
- codec = card->codec;
- if (platform->probe) {
- ret = platform->probe(pdev);
- if (ret < 0)
- goto platform_err;
+ /* probe the CODEC */
+ if (!codec->probed) {
+ if (codec->driver->probe) {
+ ret = codec->driver->probe(codec);
+ if (ret < 0) {
+ printk(KERN_ERR "asoc: failed to probe CODEC %s\n",
+ codec->name);
+ return ret;
+ }
+ }
+
+ soc_init_codec_debugfs(codec);
+
+ /* mark codec as probed and add to card codec list */
+ codec->probed = 1;
+ list_add(&codec->card_list, &card->codec_dev_list);
}
- /* DAPM stream work */
- INIT_DELAYED_WORK(&card->delayed_work, close_delayed_work);
-#ifdef CONFIG_PM
- /* deferred resume work */
- INIT_WORK(&card->deferred_resume_work, soc_resume_deferred);
-#endif
+ /* probe the platform */
+ if (!platform->probed) {
+ if (platform->driver->probe) {
+ ret = platform->driver->probe(platform);
+ if (ret < 0) {
+ printk(KERN_ERR "asoc: failed to probe platform %s\n",
+ platform->name);
+ return ret;
+ }
+ }
+ /* mark platform as probed and add to card platform list */
+ platform->probed = 1;
+ list_add(&platform->card_list, &card->platform_dev_list);
+ }
- for (i = 0; i < card->num_links; i++) {
- if (card->dai_link[i].init) {
- ret = card->dai_link[i].init(codec);
+ /* probe the CODEC DAI */
+ if (!codec_dai->probed) {
+ if (codec_dai->driver->probe) {
+ ret = codec_dai->driver->probe(codec_dai);
if (ret < 0) {
- printk(KERN_ERR "asoc: failed to init %s\n",
- card->dai_link[i].stream_name);
- continue;
+ printk(KERN_ERR "asoc: failed to probe CODEC DAI %s\n",
+ codec_dai->name);
+ return ret;
}
}
- if (card->dai_link[i].codec_dai->ac97_control)
- ac97 = 1;
+
+ /* mark cpu_dai as probed and add to card cpu_dai list */
+ codec_dai->probed = 1;
+ list_add(&codec_dai->card_list, &card->dai_dev_list);
}
- snprintf(codec->card->shortname, sizeof(codec->card->shortname),
- "%s", card->name);
- snprintf(codec->card->longname, sizeof(codec->card->longname),
- "%s (%s)", card->name, codec->name);
+ /* DAPM dai link stream work */
+ INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
+
+ /* now that all clients have probed, initialise the DAI link */
+ if (dai_link->init) {
+ ret = dai_link->init(rtd);
+ if (ret < 0) {
+ printk(KERN_ERR "asoc: failed to init %s\n", dai_link->stream_name);
+ return ret;
+ }
+ }
/* Make sure all DAPM widgets are instantiated */
snd_soc_dapm_new_widgets(codec);
+ snd_soc_dapm_sync(codec);
- ret = snd_card_register(codec->card);
+ /* register the rtd device */
+ rtd->dev.init_name = rtd->dai_link->stream_name;
+ rtd->dev.release = rtd_release;
+ rtd->dev.init_name = dai_link->name;
+ ret = device_register(&rtd->dev);
if (ret < 0) {
- printk(KERN_ERR "asoc: failed to register soundcard for %s\n",
- codec->name);
- goto card_err;
+ printk(KERN_ERR "asoc: failed to register DAI runtime device %d\n", ret);
+ return ret;
}
- mutex_lock(&codec->mutex);
+ rtd->dev_registered = 1;
+ ret = device_create_file(&rtd->dev, &dev_attr_pmdown_time);
+ if (ret < 0)
+ printk(KERN_WARNING "asoc: failed to add pmdown_time sysfs\n");
+
+ /* add DAPM sysfs entries for this codec */
+ ret = snd_soc_dapm_sys_add(&rtd->dev);
+ if (ret < 0)
+ printk(KERN_WARNING "asoc: failed to add codec dapm sysfs entries\n");
+
+ /* add codec sysfs entries */
+ ret = device_create_file(&rtd->dev, &dev_attr_codec_reg);
+ if (ret < 0)
+ printk(KERN_WARNING "asoc: failed to add codec sysfs files\n");
+
+ /* create the pcm */
+ ret = soc_new_pcm(rtd, num);
+ if (ret < 0) {
+ printk(KERN_ERR "asoc: can't create pcm %s\n", dai_link->stream_name);
+ return ret;
+ }
+
+ /* add platform data for AC97 devices */
+ if (rtd->codec_dai->driver->ac97_control)
+ snd_ac97_dev_add_pdata(codec->ac97, rtd->cpu_dai->ac97_pdata);
+
+ return 0;
+}
+
#ifdef CONFIG_SND_SOC_AC97_BUS
+static int soc_register_ac97_dai_link(struct snd_soc_pcm_runtime *rtd)
+{
+ int ret;
+
/* Only instantiate AC97 if not already done by the adaptor
* for the generic AC97 subsystem.
*/
- if (ac97 && strcmp(codec->name, "AC97") != 0) {
- ret = soc_ac97_dev_register(codec);
+ if (rtd->codec_dai->driver->ac97_control && !rtd->codec->ac97_registered) {
+
+ ret = soc_ac97_dev_register(rtd->codec);
if (ret < 0) {
printk(KERN_ERR "asoc: AC97 device register failed\n");
- snd_card_free(codec->card);
- mutex_unlock(&codec->mutex);
- goto card_err;
+ return ret;
}
+
+ rtd->codec->ac97_registered = 1;
+ }
+ return 0;
+}
+
+static void soc_unregister_ac97_dai_link(struct snd_soc_codec *codec)
+{
+ if (codec->ac97_registered) {
+ soc_ac97_dev_unregister(codec);
+ codec->ac97_registered = 0;
}
+}
#endif
- ret = snd_soc_dapm_sys_add(card->socdev->dev);
- if (ret < 0)
- printk(KERN_WARNING "asoc: failed to add dapm sysfs entries\n");
+static void snd_soc_instantiate_card(struct snd_soc_card *card)
+{
+ struct platform_device *pdev = to_platform_device(card->dev);
+ int ret, i;
- ret = device_create_file(card->socdev->dev, &dev_attr_pmdown_time);
- if (ret < 0)
- printk(KERN_WARNING "asoc: failed to add pmdown_time sysfs\n");
+ mutex_lock(&card->mutex);
- ret = device_create_file(card->socdev->dev, &dev_attr_codec_reg);
- if (ret < 0)
- printk(KERN_WARNING "asoc: failed to add codec sysfs files\n");
+ if (card->instantiated) {
+ mutex_unlock(&card->mutex);
+ return;
+ }
- soc_init_codec_debugfs(codec);
- mutex_unlock(&codec->mutex);
+ /* bind DAIs */
+ for (i = 0; i < card->num_links; i++)
+ soc_bind_dai_link(card, i);
- card->instantiated = 1;
+ /* bind completed ? */
+ if (card->num_rtd != card->num_links) {
+ mutex_unlock(&card->mutex);
+ return;
+ }
- return;
+ /* card bind complete so register a sound card */
+ ret = snd_card_create(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
+ card->owner, 0, &card->snd_card);
+ if (ret < 0) {
+ printk(KERN_ERR "asoc: can't create sound card for card %s\n",
+ card->name);
+ mutex_unlock(&card->mutex);
+ return;
+ }
+ card->snd_card->dev = card->dev;
+
+#ifdef CONFIG_PM
+ /* deferred resume work */
+ INIT_WORK(&card->deferred_resume_work, soc_resume_deferred);
+#endif
-card_err:
- if (platform->remove)
- platform->remove(pdev);
+ /* initialise the sound card only once */
+ if (card->probe) {
+ ret = card->probe(pdev);
+ if (ret < 0)
+ goto card_probe_error;
+ }
-platform_err:
- if (codec_dev->remove)
- codec_dev->remove(pdev);
+ for (i = 0; i < card->num_links; i++) {
+ ret = soc_probe_dai_link(card, i);
+ if (ret < 0) {
+ printk(KERN_ERR "asoc: failed to instanciate card %s\n", card->name);
+ goto probe_dai_err;
+ }
+ }
-cpu_dai_err:
- for (i--; i >= 0; i--) {
- struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
- if (cpu_dai->remove)
- cpu_dai->remove(pdev, cpu_dai);
+ snprintf(card->snd_card->shortname, sizeof(card->snd_card->shortname),
+ "%s", card->name);
+ snprintf(card->snd_card->longname, sizeof(card->snd_card->longname),
+ "%s", card->name);
+
+ ret = snd_card_register(card->snd_card);
+ if (ret < 0) {
+ printk(KERN_ERR "asoc: failed to register soundcard for %s\n", card->name);
+ goto probe_dai_err;
}
+#ifdef CONFIG_SND_SOC_AC97_BUS
+ /* register any AC97 codecs */
+ for (i = 0; i < card->num_rtd; i++) {
+ ret = soc_register_ac97_dai_link(&card->rtd[i]);
+ if (ret < 0) {
+ printk(KERN_ERR "asoc: failed to register AC97 %s\n", card->name);
+ goto probe_dai_err;
+ }
+ }
+#endif
+
+ card->instantiated = 1;
+ mutex_unlock(&card->mutex);
+ return;
+
+probe_dai_err:
+ for (i = 0; i < card->num_links; i++)
+ soc_remove_dai_link(card, i);
+
+card_probe_error:
if (card->remove)
card->remove(pdev);
+
+ snd_card_free(card->snd_card);
+
+ mutex_unlock(&card->mutex);
}
/*
@@ -1332,15 +1544,15 @@ static void snd_soc_instantiate_cards(void)
/* probes a new socdev */
static int soc_probe(struct platform_device *pdev)
{
+ struct snd_soc_card *card = platform_get_drvdata(pdev);
int ret = 0;
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_card *card = socdev->card;
-
- /* Bodge while we push things out of socdev */
- card->socdev = socdev;
/* Bodge while we unpick instantiation */
card->dev = &pdev->dev;
+ INIT_LIST_HEAD(&card->dai_dev_list);
+ INIT_LIST_HEAD(&card->codec_dev_list);
+ INIT_LIST_HEAD(&card->platform_dev_list);
+
ret = snd_soc_register_card(card);
if (ret != 0) {
dev_err(&pdev->dev, "Failed to register card\n");
@@ -1353,50 +1565,49 @@ static int soc_probe(struct platform_device *pdev)
/* removes a socdev */
static int soc_remove(struct platform_device *pdev)
{
+ struct snd_soc_card *card = platform_get_drvdata(pdev);
int i;
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_platform *platform = card->platform;
- struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
- if (card->instantiated) {
- run_delayed_work(&card->delayed_work);
-
- if (platform->remove)
- platform->remove(pdev);
-
- if (codec_dev->remove)
- codec_dev->remove(pdev);
+ if (card->instantiated) {
- for (i = 0; i < card->num_links; i++) {
- struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
- if (cpu_dai->remove)
- cpu_dai->remove(pdev, cpu_dai);
+ /* make sure any delayed work runs */
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
+ run_delayed_work(&rtd->delayed_work);
}
+ /* remove and free each DAI */
+ for (i = 0; i < card->num_rtd; i++)
+ soc_remove_dai_link(card, i);
+
+ /* remove the card */
if (card->remove)
card->remove(pdev);
- }
+ kfree(card->rtd);
+ snd_card_free(card->snd_card);
+ }
snd_soc_unregister_card(card);
-
return 0;
}
static int soc_poweroff(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_card *card = socdev->card;
+ struct snd_soc_card *card = platform_get_drvdata(pdev);
+ int i;
if (!card->instantiated)
return 0;
/* Flush out pmdown_time work - we actually do want to run it
* now, we're shutting down so no imminent restart. */
- run_delayed_work(&card->delayed_work);
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
+ run_delayed_work(&rtd->delayed_work);
+ }
- snd_soc_dapm_shutdown(socdev);
+ snd_soc_dapm_shutdown(card);
return 0;
}
@@ -1419,53 +1630,42 @@ static struct platform_driver soc_driver = {
};
/* create a new pcm */
-static int soc_new_pcm(struct snd_soc_device *socdev,
- struct snd_soc_dai_link *dai_link, int num)
-{
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_codec *codec = card->codec;
- struct snd_soc_platform *platform = card->platform;
- struct snd_soc_dai *codec_dai = dai_link->codec_dai;
- struct snd_soc_dai *cpu_dai = dai_link->cpu_dai;
- struct snd_soc_pcm_runtime *rtd;
+static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
+{
+ struct snd_soc_codec *codec = rtd->codec;
+ struct snd_soc_platform *platform = rtd->platform;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
struct snd_pcm *pcm;
char new_name[64];
int ret = 0, playback = 0, capture = 0;
- rtd = kzalloc(sizeof(struct snd_soc_pcm_runtime), GFP_KERNEL);
- if (rtd == NULL)
- return -ENOMEM;
-
- rtd->dai = dai_link;
- rtd->socdev = socdev;
- codec_dai->codec = card->codec;
-
/* check client and interface hw capabilities */
snprintf(new_name, sizeof(new_name), "%s %s-%d",
- dai_link->stream_name, codec_dai->name, num);
+ rtd->dai_link->stream_name, codec_dai->name, num);
- if (codec_dai->playback.channels_min)
+ if (codec_dai->driver->playback.channels_min)
playback = 1;
- if (codec_dai->capture.channels_min)
+ if (codec_dai->driver->capture.channels_min)
capture = 1;
- ret = snd_pcm_new(codec->card, new_name, codec->pcm_devs++, playback,
- capture, &pcm);
+ dev_dbg(rtd->card->dev, "registered pcm #%d %s\n",num,new_name);
+ ret = snd_pcm_new(rtd->card->snd_card, new_name,
+ num, playback, capture, &pcm);
if (ret < 0) {
- printk(KERN_ERR "asoc: can't create pcm for codec %s\n",
- codec->name);
- kfree(rtd);
+ printk(KERN_ERR "asoc: can't create pcm for codec %s\n", codec->name);
return ret;
}
- dai_link->pcm = pcm;
+ rtd->pcm = pcm;
pcm->private_data = rtd;
- soc_pcm_ops.mmap = platform->pcm_ops->mmap;
- soc_pcm_ops.ioctl = platform->pcm_ops->ioctl;
- soc_pcm_ops.copy = platform->pcm_ops->copy;
- soc_pcm_ops.silence = platform->pcm_ops->silence;
- soc_pcm_ops.ack = platform->pcm_ops->ack;
- soc_pcm_ops.page = platform->pcm_ops->page;
+ soc_pcm_ops.mmap = platform->driver->ops->mmap;
+ soc_pcm_ops.pointer = platform->driver->ops->pointer;
+ soc_pcm_ops.ioctl = platform->driver->ops->ioctl;
+ soc_pcm_ops.copy = platform->driver->ops->copy;
+ soc_pcm_ops.silence = platform->driver->ops->silence;
+ soc_pcm_ops.ack = platform->driver->ops->ack;
+ soc_pcm_ops.page = platform->driver->ops->page;
if (playback)
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &soc_pcm_ops);
@@ -1473,14 +1673,13 @@ static int soc_new_pcm(struct snd_soc_device *socdev,
if (capture)
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &soc_pcm_ops);
- ret = platform->pcm_new(codec->card, codec_dai, pcm);
+ ret = platform->driver->pcm_new(rtd->card->snd_card, codec_dai, pcm);
if (ret < 0) {
printk(KERN_ERR "asoc: platform pcm constructor failed\n");
- kfree(rtd);
return ret;
}
- pcm->private_free = platform->pcm_free;
+ pcm->private_free = platform->driver->pcm_free;
printk(KERN_INFO "asoc: %s <-> %s mapping ok\n", codec_dai->name,
cpu_dai->name);
return ret;
@@ -1496,8 +1695,8 @@ static int soc_new_pcm(struct snd_soc_device *socdev,
*/
int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg)
{
- if (codec->volatile_register)
- return codec->volatile_register(reg);
+ if (codec->driver->volatile_register)
+ return codec->driver->volatile_register(reg);
else
return 0;
}
@@ -1532,7 +1731,6 @@ int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
codec->ac97->bus->ops = ops;
codec->ac97->num = num;
- codec->dev = &codec->ac97->dev;
mutex_unlock(&codec->mutex);
return 0;
}
@@ -1547,6 +1745,9 @@ EXPORT_SYMBOL_GPL(snd_soc_new_ac97_codec);
void snd_soc_free_ac97_codec(struct snd_soc_codec *codec)
{
mutex_lock(&codec->mutex);
+#ifdef CONFIG_SND_SOC_AC97_BUS
+ soc_unregister_ac97_dai_link(codec);
+#endif
kfree(codec->ac97->bus);
kfree(codec->ac97);
codec->ac97 = NULL;
@@ -1633,95 +1834,6 @@ int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg,
EXPORT_SYMBOL_GPL(snd_soc_test_bits);
/**
- * snd_soc_new_pcms - create new sound card and pcms
- * @socdev: the SoC audio device
- * @idx: ALSA card index
- * @xid: card identification
- *
- * Create a new sound card based upon the codec and interface pcms.
- *
- * Returns 0 for success, else error.
- */
-int snd_soc_new_pcms(struct snd_soc_device *socdev, int idx, const char *xid)
-{
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_codec *codec = card->codec;
- int ret, i;
-
- mutex_lock(&codec->mutex);
-
- /* register a sound card */
- ret = snd_card_create(idx, xid, codec->owner, 0, &codec->card);
- if (ret < 0) {
- printk(KERN_ERR "asoc: can't create sound card for codec %s\n",
- codec->name);
- mutex_unlock(&codec->mutex);
- return ret;
- }
-
- codec->socdev = socdev;
- codec->card->dev = socdev->dev;
- codec->card->private_data = codec;
- strncpy(codec->card->driver, codec->name, sizeof(codec->card->driver));
-
- /* create the pcms */
- for (i = 0; i < card->num_links; i++) {
- ret = soc_new_pcm(socdev, &card->dai_link[i], i);
- if (ret < 0) {
- printk(KERN_ERR "asoc: can't create pcm %s\n",
- card->dai_link[i].stream_name);
- mutex_unlock(&codec->mutex);
- return ret;
- }
- /* Check for codec->ac97 to handle the ac97.c fun */
- if (card->dai_link[i].codec_dai->ac97_control && codec->ac97) {
- snd_ac97_dev_add_pdata(codec->ac97,
- card->dai_link[i].cpu_dai->ac97_pdata);
- }
- }
-
- mutex_unlock(&codec->mutex);
- return ret;
-}
-EXPORT_SYMBOL_GPL(snd_soc_new_pcms);
-
-/**
- * snd_soc_free_pcms - free sound card and pcms
- * @socdev: the SoC audio device
- *
- * Frees sound card and pcms associated with the socdev.
- * Also unregister the codec if it is an AC97 device.
- */
-void snd_soc_free_pcms(struct snd_soc_device *socdev)
-{
- struct snd_soc_codec *codec = socdev->card->codec;
-#ifdef CONFIG_SND_SOC_AC97_BUS
- struct snd_soc_dai *codec_dai;
- int i;
-#endif
-
- mutex_lock(&codec->mutex);
- soc_cleanup_codec_debugfs(codec);
-#ifdef CONFIG_SND_SOC_AC97_BUS
- for (i = 0; i < codec->num_dai; i++) {
- codec_dai = &codec->dai[i];
- if (codec_dai->ac97_control && codec->ac97 &&
- strcmp(codec->name, "AC97") != 0) {
- soc_ac97_dev_unregister(codec);
- goto free_card;
- }
- }
-free_card:
-#endif
-
- if (codec->card)
- snd_card_free(codec->card);
- device_remove_file(socdev->dev, &dev_attr_codec_reg);
- mutex_unlock(&codec->mutex);
-}
-EXPORT_SYMBOL_GPL(snd_soc_free_pcms);
-
-/**
* snd_soc_set_runtime_hwparams - set the runtime hardware parameters
* @substream: the pcm substream
* @hw: the hardware parameters
@@ -1782,7 +1894,7 @@ EXPORT_SYMBOL_GPL(snd_soc_cnew);
int snd_soc_add_controls(struct snd_soc_codec *codec,
const struct snd_kcontrol_new *controls, int num_controls)
{
- struct snd_card *card = codec->card;
+ struct snd_card *card = codec->card->snd_card;
int err, i;
for (i = 0; i < num_controls; i++) {
@@ -2337,7 +2449,7 @@ EXPORT_SYMBOL_GPL(snd_soc_put_volsw_s8);
int snd_soc_limit_volume(struct snd_soc_codec *codec,
const char *name, int max)
{
- struct snd_card *card = codec->card;
+ struct snd_card *card = codec->card->snd_card;
struct snd_kcontrol *kctl;
struct soc_mixer_control *mc;
int found = 0;
@@ -2469,8 +2581,8 @@ EXPORT_SYMBOL_GPL(snd_soc_put_volsw_2r_sx);
int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
unsigned int freq, int dir)
{
- if (dai->ops && dai->ops->set_sysclk)
- return dai->ops->set_sysclk(dai, clk_id, freq, dir);
+ if (dai->driver && dai->driver->ops->set_sysclk)
+ return dai->driver->ops->set_sysclk(dai, clk_id, freq, dir);
else
return -EINVAL;
}
@@ -2489,8 +2601,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk);
int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,
int div_id, int div)
{
- if (dai->ops && dai->ops->set_clkdiv)
- return dai->ops->set_clkdiv(dai, div_id, div);
+ if (dai->driver && dai->driver->ops->set_clkdiv)
+ return dai->driver->ops->set_clkdiv(dai, div_id, div);
else
return -EINVAL;
}
@@ -2509,8 +2621,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_clkdiv);
int snd_soc_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source,
unsigned int freq_in, unsigned int freq_out)
{
- if (dai->ops && dai->ops->set_pll)
- return dai->ops->set_pll(dai, pll_id, source,
+ if (dai->driver && dai->driver->ops->set_pll)
+ return dai->driver->ops->set_pll(dai, pll_id, source,
freq_in, freq_out);
else
return -EINVAL;
@@ -2526,8 +2638,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_pll);
*/
int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
{
- if (dai->ops && dai->ops->set_fmt)
- return dai->ops->set_fmt(dai, fmt);
+ if (dai->driver && dai->driver->ops->set_fmt)
+ return dai->driver->ops->set_fmt(dai, fmt);
else
return -EINVAL;
}
@@ -2547,8 +2659,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt);
int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
{
- if (dai->ops && dai->ops->set_tdm_slot)
- return dai->ops->set_tdm_slot(dai, tx_mask, rx_mask,
+ if (dai->driver && dai->driver->ops->set_tdm_slot)
+ return dai->driver->ops->set_tdm_slot(dai, tx_mask, rx_mask,
slots, slot_width);
else
return -EINVAL;
@@ -2571,8 +2683,8 @@ int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,
unsigned int tx_num, unsigned int *tx_slot,
unsigned int rx_num, unsigned int *rx_slot)
{
- if (dai->ops && dai->ops->set_channel_map)
- return dai->ops->set_channel_map(dai, tx_num, tx_slot,
+ if (dai->driver && dai->driver->ops->set_channel_map)
+ return dai->driver->ops->set_channel_map(dai, tx_num, tx_slot,
rx_num, rx_slot);
else
return -EINVAL;
@@ -2588,8 +2700,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_channel_map);
*/
int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate)
{
- if (dai->ops && dai->ops->set_tristate)
- return dai->ops->set_tristate(dai, tristate);
+ if (dai->driver && dai->driver->ops->set_tristate)
+ return dai->driver->ops->set_tristate(dai, tristate);
else
return -EINVAL;
}
@@ -2604,8 +2716,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_tristate);
*/
int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute)
{
- if (dai->ops && dai->ops->digital_mute)
- return dai->ops->digital_mute(dai, mute);
+ if (dai->driver && dai->driver->ops->digital_mute)
+ return dai->driver->ops->digital_mute(dai, mute);
else
return -EINVAL;
}
@@ -2622,11 +2734,22 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute);
*/
static int snd_soc_register_card(struct snd_soc_card *card)
{
+ int i;
+
if (!card->name || !card->dev)
return -EINVAL;
+ card->rtd = kzalloc(sizeof(struct snd_soc_pcm_runtime) * card->num_links,
+ GFP_KERNEL);
+ if (card->rtd == NULL)
+ return -ENOMEM;
+
+ for (i = 0; i < card->num_links; i++)
+ card->rtd[i].dai_link = &card->dai_link[i];
+
INIT_LIST_HEAD(&card->list);
card->instantiated = 0;
+ mutex_init(&card->mutex);
mutex_lock(&client_mutex);
list_add(&card->list, &card_list);
@@ -2652,30 +2775,97 @@ static int snd_soc_unregister_card(struct snd_soc_card *card)
mutex_lock(&client_mutex);
list_del(&card->list);
mutex_unlock(&client_mutex);
-
dev_dbg(card->dev, "Unregistered card '%s'\n", card->name);
return 0;
}
+/*
+ * Simplify DAI link configuration by removing ".-1" from device names
+ * and sanitizing names.
+ */
+static inline char *fmt_single_name(struct device *dev, int *id)
+{
+ char *found, name[NAME_SIZE];
+ int id1, id2;
+
+ if (dev_name(dev) == NULL)
+ return NULL;
+
+ strncpy(name, dev_name(dev), NAME_SIZE);
+
+ /* are we a "%s.%d" name (platform and SPI components) */
+ found = strstr(name, dev->driver->name);
+ if (found) {
+ /* get ID */
+ if (sscanf(&found[strlen(dev->driver->name)], ".%d", id) == 1) {
+
+ /* discard ID from name if ID == -1 */
+ if (*id == -1)
+ found[strlen(dev->driver->name)] = '\0';
+ }
+
+ } else {
+ /* I2C component devices are named "bus-addr" */
+ if (sscanf(name, "%x-%x", &id1, &id2) == 2) {
+ char tmp[NAME_SIZE];
+
+ /* create unique ID number from I2C addr and bus */
+ *id = ((id1 && 0xffff) << 16) + id2;
+
+ /* sanitize component name for DAI link creation */
+ snprintf(tmp, NAME_SIZE, "%s.%s", dev->driver->name, name);
+ strncpy(name, tmp, NAME_SIZE);
+ } else
+ *id = 0;
+ }
+
+ return kstrdup(name, GFP_KERNEL);
+}
+
+/*
+ * Simplify DAI link naming for single devices with multiple DAIs by removing
+ * any ".-1" and using the DAI name (instead of device name).
+ */
+static inline char *fmt_multiple_name(struct device *dev,
+ struct snd_soc_dai_driver *dai_drv)
+{
+ if (dai_drv->name == NULL) {
+ printk(KERN_ERR "asoc: error - multiple DAI %s registered with no name\n",
+ dev_name(dev));
+ return NULL;
+ }
+
+ return kstrdup(dai_drv->name, GFP_KERNEL);
+}
+
/**
* snd_soc_register_dai - Register a DAI with the ASoC core
*
* @dai: DAI to register
*/
-int snd_soc_register_dai(struct snd_soc_dai *dai)
+int snd_soc_register_dai(struct device *dev,
+ struct snd_soc_dai_driver *dai_drv)
{
- if (!dai->name)
- return -EINVAL;
+ struct snd_soc_dai *dai;
+
+ dev_dbg(dev, "dai register %s\n", dev_name(dev));
- /* The device should become mandatory over time */
- if (!dai->dev)
- printk(KERN_WARNING "No device for DAI %s\n", dai->name);
+ dai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL);
+ if (dai == NULL)
+ return -ENOMEM;
- if (!dai->ops)
- dai->ops = &null_dai_ops;
+ /* create DAI component name */
+ dai->name = fmt_single_name(dev, &dai->id);
+ if (dai->name == NULL) {
+ kfree(dai);
+ return -ENOMEM;
+ }
- INIT_LIST_HEAD(&dai->list);
+ dai->dev = dev;
+ dai->driver = dai_drv;
+ if (!dai->driver->ops)
+ dai->driver->ops = &null_dai_ops;
mutex_lock(&client_mutex);
list_add(&dai->list, &dai_list);
@@ -2693,13 +2883,24 @@ EXPORT_SYMBOL_GPL(snd_soc_register_dai);
*
* @dai: DAI to unregister
*/
-void snd_soc_unregister_dai(struct snd_soc_dai *dai)
+void snd_soc_unregister_dai(struct device *dev)
{
+ struct snd_soc_dai *dai;
+
+ list_for_each_entry(dai, &dai_list, list) {
+ if (dev == dai->dev)
+ goto found;
+ }
+ return;
+
+found:
mutex_lock(&client_mutex);
list_del(&dai->list);
mutex_unlock(&client_mutex);
pr_debug("Unregistered DAI '%s'\n", dai->name);
+ kfree(dai->name);
+ kfree(dai);
}
EXPORT_SYMBOL_GPL(snd_soc_unregister_dai);
@@ -2709,21 +2910,47 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_dai);
* @dai: Array of DAIs to register
* @count: Number of DAIs
*/
-int snd_soc_register_dais(struct snd_soc_dai *dai, size_t count)
+int snd_soc_register_dais(struct device *dev,
+ struct snd_soc_dai_driver *dai_drv, size_t count)
{
- int i, ret;
+ struct snd_soc_dai *dai;
+ int i, ret = 0;
+
+ dev_dbg(dev, "dai register %s #%d\n", dev_name(dev), count);
for (i = 0; i < count; i++) {
- ret = snd_soc_register_dai(&dai[i]);
- if (ret != 0)
+
+ dai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL);
+ if (dai == NULL)
+ return -ENOMEM;
+
+ /* create DAI component name */
+ dai->name = fmt_multiple_name(dev, &dai_drv[i]);
+ if (dai->name == NULL) {
+ kfree(dai);
+ ret = -EINVAL;
goto err;
+ }
+
+ dai->dev = dev;
+ dai->id = i;
+ dai->driver = &dai_drv[i];
+ if (!dai->driver->ops)
+ dai->driver->ops = &null_dai_ops;
+
+ mutex_lock(&client_mutex);
+ list_add(&dai->list, &dai_list);
+ mutex_unlock(&client_mutex);
+
+ pr_debug("Registered DAI '%s'\n", dai->name);
}
+ snd_soc_instantiate_cards();
return 0;
err:
for (i--; i >= 0; i--)
- snd_soc_unregister_dai(&dai[i]);
+ snd_soc_unregister_dai(dev);
return ret;
}
@@ -2735,12 +2962,12 @@ EXPORT_SYMBOL_GPL(snd_soc_register_dais);
* @dai: Array of DAIs to unregister
* @count: Number of DAIs
*/
-void snd_soc_unregister_dais(struct snd_soc_dai *dai, size_t count)
+void snd_soc_unregister_dais(struct device *dev, size_t count)
{
int i;
for (i = 0; i < count; i++)
- snd_soc_unregister_dai(&dai[i]);
+ snd_soc_unregister_dai(dev);
}
EXPORT_SYMBOL_GPL(snd_soc_unregister_dais);
@@ -2749,12 +2976,26 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_dais);
*
* @platform: platform to register
*/
-int snd_soc_register_platform(struct snd_soc_platform *platform)
+int snd_soc_register_platform(struct device *dev,
+ struct snd_soc_platform_driver *platform_drv)
{
- if (!platform->name)
- return -EINVAL;
+ struct snd_soc_platform *platform;
+
+ dev_dbg(dev, "platform register %s\n", dev_name(dev));
+
+ platform = kzalloc(sizeof(struct snd_soc_platform), GFP_KERNEL);
+ if (platform == NULL)
+ return -ENOMEM;
+
+ /* create platform component name */
+ platform->name = fmt_single_name(dev, &platform->id);
+ if (platform->name == NULL) {
+ kfree(platform);
+ return -ENOMEM;
+ }
- INIT_LIST_HEAD(&platform->list);
+ platform->dev = dev;
+ platform->driver = platform_drv;
mutex_lock(&client_mutex);
list_add(&platform->list, &platform_list);
@@ -2772,13 +3013,24 @@ EXPORT_SYMBOL_GPL(snd_soc_register_platform);
*
* @platform: platform to unregister
*/
-void snd_soc_unregister_platform(struct snd_soc_platform *platform)
+void snd_soc_unregister_platform(struct device *dev)
{
+ struct snd_soc_platform *platform;
+
+ list_for_each_entry(platform, &platform_list, list) {
+ if (dev == platform->dev)
+ goto found;
+ }
+ return;
+
+found:
mutex_lock(&client_mutex);
list_del(&platform->list);
mutex_unlock(&client_mutex);
pr_debug("Unregistered platform '%s'\n", platform->name);
+ kfree(platform->name);
+ kfree(platform);
}
EXPORT_SYMBOL_GPL(snd_soc_unregister_platform);
@@ -2820,32 +3072,78 @@ static void fixup_codec_formats(struct snd_soc_pcm_stream *stream)
*
* @codec: codec to register
*/
-int snd_soc_register_codec(struct snd_soc_codec *codec)
+int snd_soc_register_codec(struct device *dev,
+ struct snd_soc_codec_driver *codec_drv,
+ struct snd_soc_dai_driver *dai_drv, int num_dai)
{
- int i;
+ struct snd_soc_codec *codec;
+ int ret, i;
- if (!codec->name)
- return -EINVAL;
+ dev_dbg(dev, "codec register %s\n", dev_name(dev));
+
+ codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
+ if (codec == NULL)
+ return -ENOMEM;
- /* The device should become mandatory over time */
- if (!codec->dev)
- printk(KERN_WARNING "No device for codec %s\n", codec->name);
+ /* create CODEC component name */
+ codec->name = fmt_single_name(dev, &codec->id);
+ if (codec->name == NULL) {
+ kfree(codec);
+ return -ENOMEM;
+ }
+
+ /* allocate CODEC register cache */
+ if (codec_drv->reg_cache_size && codec_drv->reg_word_size) {
- INIT_LIST_HEAD(&codec->list);
+ if (codec_drv->reg_cache_default)
+ codec->reg_cache = kmemdup(codec_drv->reg_cache_default,
+ codec_drv->reg_cache_size * codec_drv->reg_word_size, GFP_KERNEL);
+ else
+ codec->reg_cache = kzalloc(codec_drv->reg_cache_size *
+ codec_drv->reg_word_size, GFP_KERNEL);
- for (i = 0; i < codec->num_dai; i++) {
- fixup_codec_formats(&codec->dai[i].playback);
- fixup_codec_formats(&codec->dai[i].capture);
+ if (codec->reg_cache == NULL) {
+ kfree(codec->name);
+ kfree(codec);
+ return -ENOMEM;
+ }
}
+ codec->dev = dev;
+ codec->driver = codec_drv;
+ codec->bias_level = SND_SOC_BIAS_OFF;
+ codec->num_dai = num_dai;
+ mutex_init(&codec->mutex);
+ INIT_LIST_HEAD(&codec->dapm_widgets);
+ INIT_LIST_HEAD(&codec->dapm_paths);
+
+ for (i = 0; i < num_dai; i++) {
+ fixup_codec_formats(&dai_drv[i].playback);
+ fixup_codec_formats(&dai_drv[i].capture);
+ }
+
+ /* register DAIs */
+ ret = snd_soc_register_dais(dev, dai_drv, num_dai);
+ if (ret < 0)
+ goto error;
+
mutex_lock(&client_mutex);
list_add(&codec->list, &codec_list);
snd_soc_instantiate_cards();
mutex_unlock(&client_mutex);
pr_debug("Registered codec '%s'\n", codec->name);
-
return 0;
+
+error:
+ for (i--; i >= 0; i--)
+ snd_soc_unregister_dai(dev);
+
+ if (codec->reg_cache)
+ kfree(codec->reg_cache);
+ kfree(codec->name);
+ kfree(codec);
+ return ret;
}
EXPORT_SYMBOL_GPL(snd_soc_register_codec);
@@ -2854,13 +3152,30 @@ EXPORT_SYMBOL_GPL(snd_soc_register_codec);
*
* @codec: codec to unregister
*/
-void snd_soc_unregister_codec(struct snd_soc_codec *codec)
+void snd_soc_unregister_codec(struct device *dev)
{
+ struct snd_soc_codec *codec;
+ int i;
+
+ list_for_each_entry(codec, &codec_list, list) {
+ if (dev == codec->dev)
+ goto found;
+ }
+ return;
+
+found:
+ for (i = 0; i < codec->num_dai; i++)
+ snd_soc_unregister_dai(dev);
+
mutex_lock(&client_mutex);
list_del(&codec->list);
mutex_unlock(&client_mutex);
pr_debug("Unregistered codec '%s'\n", codec->name);
+
+ if (codec->reg_cache)
+ kfree(codec->reg_cache);
+ kfree(codec);
}
EXPORT_SYMBOL_GPL(snd_soc_unregister_codec);
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 03cb7c05ebec..035cab85cb66 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -112,43 +112,41 @@ static inline struct snd_soc_dapm_widget *dapm_cnew_widget(
/**
* snd_soc_dapm_set_bias_level - set the bias level for the system
- * @socdev: audio device
+ * @card: audio device
* @level: level to configure
*
* Configure the bias (power) levels for the SoC audio device.
*
* Returns 0 for success else error.
*/
-static int snd_soc_dapm_set_bias_level(struct snd_soc_device *socdev,
- enum snd_soc_bias_level level)
+static int snd_soc_dapm_set_bias_level(struct snd_soc_card *card,
+ struct snd_soc_codec *codec, enum snd_soc_bias_level level)
{
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_codec *codec = socdev->card->codec;
int ret = 0;
switch (level) {
case SND_SOC_BIAS_ON:
- dev_dbg(socdev->dev, "Setting full bias\n");
+ dev_dbg(codec->dev, "Setting full bias\n");
break;
case SND_SOC_BIAS_PREPARE:
- dev_dbg(socdev->dev, "Setting bias prepare\n");
+ dev_dbg(codec->dev, "Setting bias prepare\n");
break;
case SND_SOC_BIAS_STANDBY:
- dev_dbg(socdev->dev, "Setting standby bias\n");
+ dev_dbg(codec->dev, "Setting standby bias\n");
break;
case SND_SOC_BIAS_OFF:
- dev_dbg(socdev->dev, "Setting bias off\n");
+ dev_dbg(codec->dev, "Setting bias off\n");
break;
default:
- dev_err(socdev->dev, "Setting invalid bias %d\n", level);
+ dev_err(codec->dev, "Setting invalid bias %d\n", level);
return -EINVAL;
}
- if (card->set_bias_level)
+ if (card && card->set_bias_level)
ret = card->set_bias_level(card, level);
if (ret == 0) {
- if (codec->set_bias_level)
- ret = codec->set_bias_level(codec, level);
+ if (codec->driver->set_bias_level)
+ ret = codec->driver->set_bias_level(codec, level);
else
codec->bias_level = level;
}
@@ -370,7 +368,7 @@ static int dapm_new_mixer(struct snd_soc_codec *codec,
path->kcontrol = snd_soc_cnew(&w->kcontrols[i], w,
path->long_name);
- ret = snd_ctl_add(codec->card, path->kcontrol);
+ ret = snd_ctl_add(codec->card->snd_card, path->kcontrol);
if (ret < 0) {
printk(KERN_ERR "asoc: failed to add dapm kcontrol %s: %d\n",
path->long_name,
@@ -398,7 +396,7 @@ static int dapm_new_mux(struct snd_soc_codec *codec,
}
kcontrol = snd_soc_cnew(&w->kcontrols[0], w, w->name);
- ret = snd_ctl_add(codec->card, kcontrol);
+ ret = snd_ctl_add(codec->card->snd_card, kcontrol);
if (ret < 0)
goto err;
@@ -437,9 +435,9 @@ static inline void dapm_clear_walk(struct snd_soc_codec *codec)
*/
static int snd_soc_dapm_suspend_check(struct snd_soc_dapm_widget *widget)
{
- struct snd_soc_codec *codec = widget->codec;
+ int level = snd_power_get_state(widget->codec->card->snd_card);
- switch (snd_power_get_state(codec->card)) {
+ switch (level) {
case SNDRV_CTL_POWER_D3hot:
case SNDRV_CTL_POWER_D3cold:
if (widget->ignore_suspend)
@@ -893,7 +891,7 @@ static void dapm_seq_run(struct snd_soc_codec *codec, struct list_head *list,
*/
static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
{
- struct snd_soc_device *socdev = codec->socdev;
+ struct snd_soc_card *card = codec->card;
struct snd_soc_dapm_widget *w;
LIST_HEAD(up_list);
LIST_HEAD(down_list);
@@ -966,7 +964,7 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
}
if (sys_power && codec->bias_level == SND_SOC_BIAS_OFF) {
- ret = snd_soc_dapm_set_bias_level(socdev,
+ ret = snd_soc_dapm_set_bias_level(card, codec,
SND_SOC_BIAS_STANDBY);
if (ret != 0)
pr_err("Failed to turn on bias: %d\n", ret);
@@ -975,8 +973,7 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
/* If we're changing to all on or all off then prepare */
if ((sys_power && codec->bias_level == SND_SOC_BIAS_STANDBY) ||
(!sys_power && codec->bias_level == SND_SOC_BIAS_ON)) {
- ret = snd_soc_dapm_set_bias_level(socdev,
- SND_SOC_BIAS_PREPARE);
+ ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_PREPARE);
if (ret != 0)
pr_err("Failed to prepare bias: %d\n", ret);
}
@@ -989,8 +986,7 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
/* If we just powered the last thing off drop to standby bias */
if (codec->bias_level == SND_SOC_BIAS_PREPARE && !sys_power) {
- ret = snd_soc_dapm_set_bias_level(socdev,
- SND_SOC_BIAS_STANDBY);
+ ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_STANDBY);
if (ret != 0)
pr_err("Failed to apply standby bias: %d\n", ret);
}
@@ -998,15 +994,14 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
/* If we're in standby and can support bias off then do that */
if (codec->bias_level == SND_SOC_BIAS_STANDBY &&
codec->idle_bias_off) {
- ret = snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_OFF);
+ ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_OFF);
if (ret != 0)
pr_err("Failed to turn off bias: %d\n", ret);
}
/* If we just powered up then move to active bias */
if (codec->bias_level == SND_SOC_BIAS_PREPARE && sys_power) {
- ret = snd_soc_dapm_set_bias_level(socdev,
- SND_SOC_BIAS_ON);
+ ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_ON);
if (ret != 0)
pr_err("Failed to apply active bias: %d\n", ret);
}
@@ -1188,8 +1183,9 @@ static int dapm_mixer_update_power(struct snd_soc_dapm_widget *widget,
static ssize_t dapm_widget_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
- struct snd_soc_device *devdata = dev_get_drvdata(dev);
- struct snd_soc_codec *codec = devdata->card->codec;
+ struct snd_soc_pcm_runtime *rtd =
+ container_of(dev, struct snd_soc_pcm_runtime, dev);
+ struct snd_soc_codec *codec =rtd->codec;
struct snd_soc_dapm_widget *w;
int count = 0;
char *state = "not set";
@@ -1998,9 +1994,10 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_new_controls);
*
* Returns 0 for success else error.
*/
-int snd_soc_dapm_stream_event(struct snd_soc_codec *codec,
- char *stream, int event)
+int snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd,
+ const char *stream, int event)
{
+ struct snd_soc_codec *codec = rtd->codec;
struct snd_soc_dapm_widget *w;
if (stream == NULL)
@@ -2168,25 +2165,19 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend);
/**
* snd_soc_dapm_free - free dapm resources
- * @socdev: SoC device
+ * @card: SoC device
*
* Free all dapm widgets and resources.
*/
-void snd_soc_dapm_free(struct snd_soc_device *socdev)
+void snd_soc_dapm_free(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = socdev->card->codec;
-
- snd_soc_dapm_sys_remove(socdev->dev);
+ snd_soc_dapm_sys_remove(codec->dev);
dapm_free_widgets(codec);
}
EXPORT_SYMBOL_GPL(snd_soc_dapm_free);
-/*
- * snd_soc_dapm_shutdown - callback for system shutdown
- */
-void snd_soc_dapm_shutdown(struct snd_soc_device *socdev)
+static void soc_dapm_shutdown_codec(struct snd_soc_codec *codec)
{
- struct snd_soc_codec *codec = socdev->card->codec;
struct snd_soc_dapm_widget *w;
LIST_HEAD(down_list);
int powerdown = 0;
@@ -2203,12 +2194,23 @@ void snd_soc_dapm_shutdown(struct snd_soc_device *socdev)
* standby.
*/
if (powerdown) {
- snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_PREPARE);
+ snd_soc_dapm_set_bias_level(NULL, codec, SND_SOC_BIAS_PREPARE);
dapm_seq_run(codec, &down_list, 0, dapm_down_seq);
- snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_STANDBY);
+ snd_soc_dapm_set_bias_level(NULL, codec, SND_SOC_BIAS_STANDBY);
}
+}
+
+/*
+ * snd_soc_dapm_shutdown - callback for system shutdown
+ */
+void snd_soc_dapm_shutdown(struct snd_soc_card *card)
+{
+ struct snd_soc_codec *codec;
+
+ list_for_each_entry(codec, &card->codec_dev_list, list)
+ soc_dapm_shutdown_codec(codec);
- snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_OFF);
+ snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_OFF);
}
/* Module information */
diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c
index 29159e1781d0..8862770aa221 100644
--- a/sound/soc/soc-jack.c
+++ b/sound/soc/soc-jack.c
@@ -32,14 +32,14 @@
* Returns zero if successful, or a negative error code on failure.
* On success jack will be initialised.
*/
-int snd_soc_jack_new(struct snd_soc_card *card, const char *id, int type,
+int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type,
struct snd_soc_jack *jack)
{
- jack->card = card;
+ jack->codec = codec;
INIT_LIST_HEAD(&jack->pins);
BLOCKING_INIT_NOTIFIER_HEAD(&jack->notifier);
- return snd_jack_new(card->codec->card, id, type, &jack->jack);
+ return snd_jack_new(codec->card->snd_card, id, type, &jack->jack);
}
EXPORT_SYMBOL_GPL(snd_soc_jack_new);
@@ -67,7 +67,7 @@ void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask)
if (!jack)
return;
- codec = jack->card->codec;
+ codec = jack->codec;
mutex_lock(&codec->mutex);
@@ -268,7 +268,7 @@ int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
ret = request_irq(gpio_to_irq(gpios[i].gpio),
gpio_handler,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
- jack->card->dev->driver->name,
+ jack->codec->dev->driver->name,
&gpios[i]);
if (ret)
goto err;
diff --git a/sound/soc/txx9/txx9aclc-ac97.c b/sound/soc/txx9/txx9aclc-ac97.c
index 0ec20b68e8cb..743d07b82c06 100644
--- a/sound/soc/txx9/txx9aclc-ac97.c
+++ b/sound/soc/txx9/txx9aclc-ac97.c
@@ -36,13 +36,11 @@
static DECLARE_WAIT_QUEUE_HEAD(ac97_waitq);
-/* REVISIT: How to find txx9aclc_soc_device from snd_ac97? */
-static struct txx9aclc_soc_device *txx9aclc_soc_dev;
+/* REVISIT: How to find txx9aclc_drvdata from snd_ac97? */
+static struct txx9aclc_plat_drvdata *txx9aclc_drvdata;
-static int txx9aclc_regready(struct txx9aclc_soc_device *dev)
+static int txx9aclc_regready(struct txx9aclc_plat_drvdata *drvdata)
{
- struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev);
-
return __raw_readl(drvdata->base + ACINTSTS) & ACINT_REGACCRDY;
}
@@ -50,8 +48,7 @@ static int txx9aclc_regready(struct txx9aclc_soc_device *dev)
static unsigned short txx9aclc_ac97_read(struct snd_ac97 *ac97,
unsigned short reg)
{
- struct txx9aclc_soc_device *dev = txx9aclc_soc_dev;
- struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev);
+ struct txx9aclc_plat_drvdata *drvdata = txx9aclc_drvdata;
void __iomem *base = drvdata->base;
u32 dat;
@@ -61,15 +58,15 @@ static unsigned short txx9aclc_ac97_read(struct snd_ac97 *ac97,
dat = (reg << ACREGACC_REG_SHIFT) | ACREGACC_READ;
__raw_writel(dat, base + ACREGACC);
__raw_writel(ACINT_REGACCRDY, base + ACINTEN);
- if (!wait_event_timeout(ac97_waitq, txx9aclc_regready(dev), HZ)) {
+ if (!wait_event_timeout(ac97_waitq, txx9aclc_regready(txx9aclc_drvdata), HZ)) {
__raw_writel(ACINT_REGACCRDY, base + ACINTDIS);
- dev_err(dev->soc_dev.dev, "ac97 read timeout (reg %#x)\n", reg);
+ printk(KERN_ERR "ac97 read timeout (reg %#x)\n", reg);
dat = 0xffff;
goto done;
}
dat = __raw_readl(base + ACREGACC);
if (((dat >> ACREGACC_REG_SHIFT) & 0xff) != reg) {
- dev_err(dev->soc_dev.dev, "reg mismatch %x with %x\n",
+ printk(KERN_ERR "reg mismatch %x with %x\n",
dat, reg);
dat = 0xffff;
goto done;
@@ -84,16 +81,15 @@ done:
static void txx9aclc_ac97_write(struct snd_ac97 *ac97, unsigned short reg,
unsigned short val)
{
- struct txx9aclc_soc_device *dev = txx9aclc_soc_dev;
- struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev);
+ struct txx9aclc_plat_drvdata *drvdata = txx9aclc_drvdata;
void __iomem *base = drvdata->base;
__raw_writel(((reg | (ac97->num << 7)) << ACREGACC_REG_SHIFT) |
(val << ACREGACC_DAT_SHIFT),
base + ACREGACC);
__raw_writel(ACINT_REGACCRDY, base + ACINTEN);
- if (!wait_event_timeout(ac97_waitq, txx9aclc_regready(dev), HZ)) {
- dev_err(dev->soc_dev.dev,
+ if (!wait_event_timeout(ac97_waitq, txx9aclc_regready(txx9aclc_drvdata), HZ)) {
+ printk(KERN_ERR
"ac97 write timeout (reg %#x)\n", reg);
}
__raw_writel(ACINT_REGACCRDY, base + ACINTDIS);
@@ -101,8 +97,7 @@ static void txx9aclc_ac97_write(struct snd_ac97 *ac97, unsigned short reg,
static void txx9aclc_ac97_cold_reset(struct snd_ac97 *ac97)
{
- struct txx9aclc_soc_device *dev = txx9aclc_soc_dev;
- struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev);
+ struct txx9aclc_plat_drvdata *drvdata = txx9aclc_drvdata;
void __iomem *base = drvdata->base;
u32 ready = ACINT_CODECRDY(ac97->num) | ACINT_REGACCRDY;
@@ -141,31 +136,23 @@ static irqreturn_t txx9aclc_ac97_irq(int irq, void *dev_id)
return IRQ_HANDLED;
}
-static int txx9aclc_ac97_probe(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int txx9aclc_ac97_probe(struct snd_soc_dai *dai)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct txx9aclc_soc_device *dev =
- container_of(socdev, struct txx9aclc_soc_device, soc_dev);
-
- dev->aclc_pdev = to_platform_device(dai->dev);
- txx9aclc_soc_dev = dev;
+ txx9aclc_drvdata = snd_soc_dai_get_drvdata(dai);
return 0;
}
-static void txx9aclc_ac97_remove(struct platform_device *pdev,
- struct snd_soc_dai *dai)
+static int txx9aclc_ac97_remove(struct snd_soc_dai *dai)
{
- struct platform_device *aclc_pdev = to_platform_device(dai->dev);
- struct txx9aclc_plat_drvdata *drvdata = platform_get_drvdata(aclc_pdev);
+ struct txx9aclc_plat_drvdata *drvdata = snd_soc_dai_get_drvdata(dai);
/* disable AC-link */
__raw_writel(ACCTL_ENLINK, drvdata->base + ACCTLDIS);
- txx9aclc_soc_dev = NULL;
+ txx9aclc_drvdata = NULL;
+ return 0;
}
-struct snd_soc_dai txx9aclc_ac97_dai = {
- .name = "txx9aclc_ac97",
+static struct snd_soc_dai_driver txx9aclc_ac97_dai = {
.ac97_control = 1,
.probe = txx9aclc_ac97_probe,
.remove = txx9aclc_ac97_remove,
@@ -182,7 +169,6 @@ struct snd_soc_dai txx9aclc_ac97_dai = {
.channels_max = 2,
},
};
-EXPORT_SYMBOL_GPL(txx9aclc_ac97_dai);
static int __devinit txx9aclc_ac97_dev_probe(struct platform_device *pdev)
{
@@ -219,13 +205,12 @@ static int __devinit txx9aclc_ac97_dev_probe(struct platform_device *pdev)
if (err < 0)
return err;
- txx9aclc_ac97_dai.dev = &pdev->dev;
- return snd_soc_register_dai(&txx9aclc_ac97_dai);
+ return snd_soc_register_dai(&pdev->dev, &txx9aclc_ac97_dai);
}
static int __devexit txx9aclc_ac97_dev_remove(struct platform_device *pdev)
{
- snd_soc_unregister_dai(&txx9aclc_ac97_dai);
+ snd_soc_unregister_dai(&pdev->dev);
return 0;
}
diff --git a/sound/soc/txx9/txx9aclc-generic.c b/sound/soc/txx9/txx9aclc-generic.c
index 95b17f731aec..6770e7166be4 100644
--- a/sound/soc/txx9/txx9aclc-generic.c
+++ b/sound/soc/txx9/txx9aclc-generic.c
@@ -19,54 +19,44 @@
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/soc.h>
-#include "../codecs/ac97.h"
#include "txx9aclc.h"
static struct snd_soc_dai_link txx9aclc_generic_dai = {
.name = "AC97",
.stream_name = "AC97 HiFi",
- .cpu_dai = &txx9aclc_ac97_dai,
- .codec_dai = &ac97_dai,
+ .cpu_dai_name = "txx9aclc-ac97",
+ .codec_dai_name = "ac97-hifi",
+ .platform_name = "txx9aclc-pcm-audio",
+ .codec_name = "ac97-codec",
};
static struct snd_soc_card txx9aclc_generic_card = {
.name = "Generic TXx9 ACLC Audio",
- .platform = &txx9aclc_soc_platform,
.dai_link = &txx9aclc_generic_dai,
.num_links = 1,
};
-static struct txx9aclc_soc_device txx9aclc_generic_soc_device = {
- .soc_dev = {
- .card = &txx9aclc_generic_card,
- .codec_dev = &soc_codec_dev_ac97,
- },
-};
+static struct platform_device *soc_pdev;
static int __init txx9aclc_generic_probe(struct platform_device *pdev)
{
- struct txx9aclc_soc_device *dev = &txx9aclc_generic_soc_device;
- struct platform_device *soc_pdev;
int ret;
soc_pdev = platform_device_alloc("soc-audio", -1);
if (!soc_pdev)
return -ENOMEM;
- platform_set_drvdata(soc_pdev, &dev->soc_dev);
- dev->soc_dev.dev = &soc_pdev->dev;
+ platform_set_drvdata(soc_pdev, &txx9aclc_generic_card);
ret = platform_device_add(soc_pdev);
if (ret) {
platform_device_put(soc_pdev);
return ret;
}
- platform_set_drvdata(pdev, soc_pdev);
+
return 0;
}
static int __exit txx9aclc_generic_remove(struct platform_device *pdev)
{
- struct platform_device *soc_pdev = platform_get_drvdata(pdev);
-
platform_device_unregister(soc_pdev);
return 0;
}
diff --git a/sound/soc/txx9/txx9aclc.c b/sound/soc/txx9/txx9aclc.c
index 0e3452303ea6..f4aa4e03c888 100644
--- a/sound/soc/txx9/txx9aclc.c
+++ b/sound/soc/txx9/txx9aclc.c
@@ -22,6 +22,16 @@
#include <sound/soc.h>
#include "txx9aclc.h"
+static struct txx9aclc_soc_device {
+ struct txx9aclc_dmadata dmadata[2];
+} txx9aclc_soc_device;
+
+/* REVISIT: How to find txx9aclc_drvdata from snd_ac97? */
+static struct txx9aclc_plat_drvdata *txx9aclc_drvdata;
+
+static int txx9aclc_dma_init(struct txx9aclc_soc_device *dev,
+ struct txx9aclc_dmadata *dmadata);
+
static const struct snd_pcm_hardware txx9aclc_pcm_hardware = {
/*
* REVISIT: SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID
@@ -46,7 +56,6 @@ static int txx9aclc_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
- struct snd_soc_device *socdev = rtd->socdev;
struct snd_pcm_runtime *runtime = substream->runtime;
struct txx9aclc_dmadata *dmadata = runtime->private_data;
int ret;
@@ -55,13 +64,13 @@ static int txx9aclc_pcm_hw_params(struct snd_pcm_substream *substream,
if (ret < 0)
return ret;
- dev_dbg(socdev->dev,
+ dev_dbg(rtd->platform->dev,
"runtime->dma_area = %#lx dma_addr = %#lx dma_bytes = %zd "
"runtime->min_align %ld\n",
(unsigned long)runtime->dma_area,
(unsigned long)runtime->dma_addr, runtime->dma_bytes,
runtime->min_align);
- dev_dbg(socdev->dev,
+ dev_dbg(rtd->platform->dev,
"periods %d period_bytes %d stream %d\n",
params_periods(params), params_period_bytes(params),
substream->stream);
@@ -152,11 +161,7 @@ static void txx9aclc_dma_tasklet(unsigned long data)
spin_lock_irqsave(&dmadata->dma_lock, flags);
if (dmadata->frag_count < 0) {
- struct txx9aclc_soc_device *dev =
- container_of(dmadata, struct txx9aclc_soc_device,
- dmadata[substream->stream]);
- struct txx9aclc_plat_drvdata *drvdata =
- txx9aclc_get_plat_drvdata(dev);
+ struct txx9aclc_plat_drvdata *drvdata = txx9aclc_drvdata;
void __iomem *base = drvdata->base;
spin_unlock_irqrestore(&dmadata->dma_lock, flags);
@@ -202,10 +207,7 @@ static void txx9aclc_dma_tasklet(unsigned long data)
static int txx9aclc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
{
struct txx9aclc_dmadata *dmadata = substream->runtime->private_data;
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct txx9aclc_soc_device *dev =
- container_of(rtd->socdev, struct txx9aclc_soc_device, soc_dev);
- struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev);
+ struct txx9aclc_plat_drvdata *drvdata =txx9aclc_drvdata;
void __iomem *base = drvdata->base;
unsigned long flags;
int ret = 0;
@@ -244,9 +246,7 @@ txx9aclc_pcm_pointer(struct snd_pcm_substream *substream)
static int txx9aclc_pcm_open(struct snd_pcm_substream *substream)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct txx9aclc_soc_device *dev =
- container_of(rtd->socdev, struct txx9aclc_soc_device, soc_dev);
+ struct txx9aclc_soc_device *dev = &txx9aclc_soc_device;
struct txx9aclc_dmadata *dmadata = &dev->dmadata[substream->stream];
int ret;
@@ -291,8 +291,38 @@ static void txx9aclc_pcm_free_dma_buffers(struct snd_pcm *pcm)
static int txx9aclc_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
struct snd_pcm *pcm)
{
+ struct platform_device *pdev = to_platform_device(dai->platform->dev);
+ struct txx9aclc_soc_device *dev;
+ struct resource *r;
+ int i;
+ int ret;
+
+ /* at this point onwards the AC97 component has probed and this will be valid */
+ dev = snd_soc_dai_get_drvdata(dai);
+
+ dev->dmadata[0].stream = SNDRV_PCM_STREAM_PLAYBACK;
+ dev->dmadata[1].stream = SNDRV_PCM_STREAM_CAPTURE;
+ for (i = 0; i < 2; i++) {
+ r = platform_get_resource(pdev, IORESOURCE_DMA, i);
+ if (!r) {
+ ret = -EBUSY;
+ goto exit;
+ }
+ dev->dmadata[i].dma_res = r;
+ ret = txx9aclc_dma_init(dev, &dev->dmadata[i]);
+ if (ret)
+ goto exit;
+ }
return snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
card->dev, 64 * 1024, 4 * 1024 * 1024);
+
+exit:
+ for (i = 0; i < 2; i++) {
+ if (dev->dmadata[i].dma_chan)
+ dma_release_channel(dev->dmadata[i].dma_chan);
+ dev->dmadata[i].dma_chan = NULL;
+ }
+ return ret;
}
static bool filter(struct dma_chan *chan, void *param)
@@ -314,7 +344,7 @@ static bool filter(struct dma_chan *chan, void *param)
static int txx9aclc_dma_init(struct txx9aclc_soc_device *dev,
struct txx9aclc_dmadata *dmadata)
{
- struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev);
+ struct txx9aclc_plat_drvdata *drvdata =txx9aclc_drvdata;
struct txx9dmac_slave *ds = &dmadata->dma_slave;
dma_cap_mask_t mask;
@@ -334,7 +364,7 @@ static int txx9aclc_dma_init(struct txx9aclc_soc_device *dev,
dma_cap_set(DMA_SLAVE, mask);
dmadata->dma_chan = dma_request_channel(mask, filter, dmadata);
if (!dmadata->dma_chan) {
- dev_err(dev->soc_dev.dev,
+ printk(KERN_ERR
"DMA channel for %s is not available\n",
dmadata->stream == SNDRV_PCM_STREAM_PLAYBACK ?
"playback" : "capture");
@@ -345,45 +375,16 @@ static int txx9aclc_dma_init(struct txx9aclc_soc_device *dev,
return 0;
}
-static int txx9aclc_pcm_probe(struct platform_device *pdev)
+static int txx9aclc_pcm_probe(struct snd_soc_platform *platform)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct txx9aclc_soc_device *dev =
- container_of(socdev, struct txx9aclc_soc_device, soc_dev);
- struct resource *r;
- int i;
- int ret;
-
- dev->dmadata[0].stream = SNDRV_PCM_STREAM_PLAYBACK;
- dev->dmadata[1].stream = SNDRV_PCM_STREAM_CAPTURE;
- for (i = 0; i < 2; i++) {
- r = platform_get_resource(dev->aclc_pdev, IORESOURCE_DMA, i);
- if (!r) {
- ret = -EBUSY;
- goto exit;
- }
- dev->dmadata[i].dma_res = r;
- ret = txx9aclc_dma_init(dev, &dev->dmadata[i]);
- if (ret)
- goto exit;
- }
+ snd_soc_platform_set_drvdata(platform, &txx9aclc_soc_device);
return 0;
-
-exit:
- for (i = 0; i < 2; i++) {
- if (dev->dmadata[i].dma_chan)
- dma_release_channel(dev->dmadata[i].dma_chan);
- dev->dmadata[i].dma_chan = NULL;
- }
- return ret;
}
-static int txx9aclc_pcm_remove(struct platform_device *pdev)
+static int txx9aclc_pcm_remove(struct snd_soc_platform *platform)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct txx9aclc_soc_device *dev =
- container_of(socdev, struct txx9aclc_soc_device, soc_dev);
- struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev);
+ struct txx9aclc_soc_device *dev = snd_soc_platform_get_drvdata(platform);
+ struct txx9aclc_plat_drvdata *drvdata = txx9aclc_drvdata;
void __iomem *base = drvdata->base;
int i;
@@ -406,28 +407,46 @@ static int txx9aclc_pcm_remove(struct platform_device *pdev)
return 0;
}
-struct snd_soc_platform txx9aclc_soc_platform = {
- .name = "txx9aclc-audio",
+static struct snd_soc_platform_driver txx9aclc_soc_platform = {
.probe = txx9aclc_pcm_probe,
.remove = txx9aclc_pcm_remove,
- .pcm_ops = &txx9aclc_pcm_ops,
+ .ops = &txx9aclc_pcm_ops,
.pcm_new = txx9aclc_pcm_new,
.pcm_free = txx9aclc_pcm_free_dma_buffers,
};
-EXPORT_SYMBOL_GPL(txx9aclc_soc_platform);
-static int __init txx9aclc_soc_platform_init(void)
+static int __devinit txx9aclc_soc_platform_probe(struct platform_device *pdev)
{
- return snd_soc_register_platform(&txx9aclc_soc_platform);
+ return snd_soc_register_platform(&pdev->dev, &txx9aclc_soc_platform);
}
-static void __exit txx9aclc_soc_platform_exit(void)
+static int __devexit txx9aclc_soc_platform_remove(struct platform_device *pdev)
{
- snd_soc_unregister_platform(&txx9aclc_soc_platform);
+ snd_soc_unregister_platform(&pdev->dev);
+ return 0;
}
-module_init(txx9aclc_soc_platform_init);
-module_exit(txx9aclc_soc_platform_exit);
+static struct platform_driver txx9aclc_pcm_driver = {
+ .driver = {
+ .name = "txx9aclc-pcm-audio",
+ .owner = THIS_MODULE,
+ },
+
+ .probe = txx9aclc_soc_platform_probe,
+ .remove = __devexit_p(txx9aclc_soc_platform_remove),
+};
+
+static int __init snd_txx9aclc_pcm_init(void)
+{
+ return platform_driver_register(&txx9aclc_pcm_driver);
+}
+module_init(snd_txx9aclc_pcm_init);
+
+static void __exit snd_txx9aclc_pcm_exit(void)
+{
+ platform_driver_unregister(&txx9aclc_pcm_driver);
+}
+module_exit(snd_txx9aclc_pcm_exit);
MODULE_AUTHOR("Atsushi Nemoto <anemo@mba.ocn.ne.jp>");
MODULE_DESCRIPTION("TXx9 ACLC Audio DMA driver");
diff --git a/sound/soc/txx9/txx9aclc.h b/sound/soc/txx9/txx9aclc.h
index 6769aab41b33..9c2de84fec3b 100644
--- a/sound/soc/txx9/txx9aclc.h
+++ b/sound/soc/txx9/txx9aclc.h
@@ -65,19 +65,10 @@ struct txx9aclc_plat_drvdata {
u64 physbase;
};
-struct txx9aclc_soc_device {
- struct snd_soc_device soc_dev;
- struct platform_device *aclc_pdev; /* for ioresources, drvdata */
- struct txx9aclc_dmadata dmadata[2];
-};
-
static inline struct txx9aclc_plat_drvdata *txx9aclc_get_plat_drvdata(
- struct txx9aclc_soc_device *sdev)
+ struct snd_soc_dai *dai)
{
- return platform_get_drvdata(sdev->aclc_pdev);
+ return dev_get_drvdata(dai->dev);
}
-extern struct snd_soc_platform txx9aclc_soc_platform;
-extern struct snd_soc_dai txx9aclc_ac97_dai;
-
#endif /* __TXX9ACLC_H */
diff --git a/tools/perf/util/ui/browsers/annotate.c b/tools/perf/util/ui/browsers/annotate.c
index 55ff792459ac..a90273e63f4f 100644
--- a/tools/perf/util/ui/browsers/annotate.c
+++ b/tools/perf/util/ui/browsers/annotate.c
@@ -146,6 +146,7 @@ static int annotate_browser__run(struct annotate_browser *self,
return -1;
newtFormAddHotKey(self->b.form, NEWT_KEY_LEFT);
+ newtFormAddHotKey(self->b.form, NEWT_KEY_RIGHT);
nd = self->curr_hot;
if (nd) {
@@ -178,7 +179,7 @@ static int annotate_browser__run(struct annotate_browser *self,
}
out:
ui_browser__hide(&self->b);
- return 0;
+ return es->u.key;
}
int hist_entry__tui_annotate(struct hist_entry *self)