]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'staging/staging-next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Tue, 13 Dec 2011 05:59:11 +0000 (16:59 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Tue, 13 Dec 2011 05:59:11 +0000 (16:59 +1100)
Conflicts:
drivers/hid/hid-hyperv.c
drivers/staging/hv/Kconfig
drivers/staging/hv/Makefile
drivers/staging/iio/adc/ad799x_core.c

68 files changed:
1  2 
MAINTAINERS
drivers/net/Kconfig
drivers/net/Makefile
drivers/staging/cxt1e1/libsbew.h
drivers/staging/frontier/tranzport.c
drivers/staging/iio/accel/adis16201_core.c
drivers/staging/iio/accel/adis16203_core.c
drivers/staging/iio/accel/adis16204_core.c
drivers/staging/iio/accel/adis16209_core.c
drivers/staging/iio/accel/adis16220_core.c
drivers/staging/iio/accel/adis16240_core.c
drivers/staging/iio/accel/kxsd9.c
drivers/staging/iio/accel/lis3l02dq_core.c
drivers/staging/iio/accel/sca3000_core.c
drivers/staging/iio/adc/ad7192.c
drivers/staging/iio/adc/ad7280a.c
drivers/staging/iio/adc/ad7291.c
drivers/staging/iio/adc/ad7298_core.c
drivers/staging/iio/adc/ad7476_core.c
drivers/staging/iio/adc/ad7606_spi.c
drivers/staging/iio/adc/ad7780.c
drivers/staging/iio/adc/ad7793.c
drivers/staging/iio/adc/ad7816.c
drivers/staging/iio/adc/ad7887_core.c
drivers/staging/iio/adc/ad799x_core.c
drivers/staging/iio/adc/adt7310.c
drivers/staging/iio/adc/adt7410.c
drivers/staging/iio/adc/max1363_core.c
drivers/staging/iio/addac/adt7316-spi.c
drivers/staging/iio/cdc/ad7150.c
drivers/staging/iio/cdc/ad7152.c
drivers/staging/iio/cdc/ad7746.c
drivers/staging/iio/dac/ad5064.c
drivers/staging/iio/dac/ad5360.c
drivers/staging/iio/dac/ad5446.c
drivers/staging/iio/dac/ad5504.c
drivers/staging/iio/dac/ad5624r_spi.c
drivers/staging/iio/dac/ad5686.c
drivers/staging/iio/dac/ad5791.c
drivers/staging/iio/dds/ad5930.c
drivers/staging/iio/dds/ad9832.c
drivers/staging/iio/dds/ad9834.c
drivers/staging/iio/dds/ad9850.c
drivers/staging/iio/dds/ad9852.c
drivers/staging/iio/dds/ad9910.c
drivers/staging/iio/dds/ad9951.c
drivers/staging/iio/gyro/adis16080_core.c
drivers/staging/iio/gyro/adis16130_core.c
drivers/staging/iio/gyro/adis16260_core.c
drivers/staging/iio/gyro/adxrs450_core.c
drivers/staging/iio/impedance-analyzer/ad5933.c
drivers/staging/iio/imu/adis16400_core.c
drivers/staging/iio/industrialio-trigger.c
drivers/staging/iio/light/isl29018.c
drivers/staging/iio/light/tsl2563.c
drivers/staging/iio/light/tsl2583.c
drivers/staging/iio/magnetometer/ak8975.c
drivers/staging/iio/magnetometer/hmc5843.c
drivers/staging/iio/meter/ade7753.c
drivers/staging/iio/meter/ade7754.c
drivers/staging/iio/meter/ade7758_core.c
drivers/staging/iio/meter/ade7759.c
drivers/staging/iio/meter/ade7854-spi.c
drivers/staging/iio/resolver/ad2s1200.c
drivers/staging/iio/resolver/ad2s1210.c
drivers/staging/iio/resolver/ad2s90.c
drivers/staging/sep/sep_driver.c
drivers/staging/vt6656/main_usb.c

diff --combined MAINTAINERS
index 31527a197d158520e9ebaaaea8da57e3168d17f2,d6c09f3dcaabd97f13336b936556b9e63268a7c4..ded1b76856a0d05fe9ea01ef21b2203cb0e27b87
@@@ -542,7 -542,6 +542,7 @@@ F: sound/soc/codecs/adau
  F:    sound/soc/codecs/adav*
  F:    sound/soc/codecs/ad1*
  F:    sound/soc/codecs/ssm*
 +F:    sound/soc/codecs/sigmadsp.*
  
  ANALOG DEVICES INC ASOC DRIVERS
  L:    uclinux-dist-devel@blackfin.uclinux.org
@@@ -750,7 -749,6 +750,7 @@@ M: Barry Song <baohua.song@csr.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/mach-prima2/
 +F:    drivers/dma/sirf-dma*
  
  ARM/EBSA110 MACHINE SUPPORT
  M:    Russell King <linux@arm.linux.org.uk>
@@@ -1663,14 -1661,6 +1663,14 @@@ T:    git git://git.alsa-project.org/alsa-
  S:    Maintained
  F:    sound/pci/oxygen/
  
 +C6X ARCHITECTURE
 +M:    Mark Salter <msalter@redhat.com>
 +M:    Aurelien Jacquiot <a-jacquiot@ti.com>
 +L:    linux-c6x-dev@linux-c6x.org
 +W:    http://www.linux-c6x.org/wiki/index.php/Main_Page
 +S:    Maintained
 +F:    arch/c6x/
 +
  CACHEFILES: FS-CACHE BACKEND FOR CACHING ON MOUNTED FILESYSTEMS
  M:    David Howells <dhowells@redhat.com>
  L:    linux-cachefs@redhat.com
@@@ -2847,14 -2837,6 +2847,14 @@@ L:    platform-driver-x86@vger.kernel.or
  S:    Maintained
  F:    drivers/platform/x86/fujitsu-laptop.c
  
 +FUJITSU M-5MO LS CAMERA ISP DRIVER
 +M:    Kyungmin Park <kyungmin.park@samsung.com>
 +M:    Heungjun Kim <riverful.kim@samsung.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/media/video/m5mols/
 +F:    include/media/m5mols.h
 +
  FUSE: FILESYSTEM IN USERSPACE
  M:    Miklos Szeredi <miklos@szeredi.hu>
  L:    fuse-devel@lists.sourceforge.net
@@@ -2938,7 -2920,6 +2938,7 @@@ F:      include/linux/gigaset_dev.
  
  GPIO SUBSYSTEM
  M:    Grant Likely <grant.likely@secretlab.ca>
 +M:    Linus Walleij <linus.walleij@stericsson.com>
  S:    Maintained
  T:    git git://git.secretlab.ca/git/linux-2.6.git
  F:    Documentation/gpio.txt
@@@ -3120,7 -3101,6 +3120,7 @@@ F:      include/linux/hid
  
  HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS
  M:    Thomas Gleixner <tglx@linutronix.de>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
  S:    Maintained
  F:    Documentation/timers/
  F:    kernel/hrtimer.c
@@@ -3208,16 -3188,6 +3208,16 @@@ M:    William Irwin <wli@holomorphy.com
  S:    Maintained
  F:    fs/hugetlbfs/
  
 +Hyper-V CORE AND DRIVERS
 +M:    K. Y. Srinivasan <kys@microsoft.com>
 +M:    Haiyang Zhang <haiyangz@microsoft.com>
 +L:    devel@linuxdriverproject.org
 +S:    Maintained
 +F:    drivers/hv/
 +F:    drivers/hid/hid-hyperv.c
 +F:    drivers/net/hyperv/
 +F:    drivers/staging/hv/
 +
  I2C/SMBUS STUB DRIVER
  M:    "Mark M. Hoffman" <mhoffman@lightlink.com>
  L:    linux-i2c@vger.kernel.org
@@@ -3613,7 -3583,8 +3613,7 @@@ F:      net/netfilter/ipvs
  IPWIRELESS DRIVER
  M:    Jiri Kosina <jkosina@suse.cz>
  M:    David Sterba <dsterba@suse.cz>
 -S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/ipwireless_cs.git
 +S:    Odd Fixes
  F:    drivers/tty/ipwireless/
  
  IPX NETWORK LAYER
@@@ -3639,7 -3610,7 +3639,7 @@@ F:      net/irda
  IRQ SUBSYSTEM
  M:    Thomas Gleixner <tglx@linutronix.de>
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git irq/core
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
  F:    kernel/irq/
  
  ISAPNP
@@@ -3808,6 -3779,7 +3808,6 @@@ S:      Odd Fixe
  
  KERNEL NFSD, SUNRPC, AND LOCKD SERVERS
  M:    "J. Bruce Fields" <bfields@fieldses.org>
 -M:    Neil Brown <neilb@suse.de>
  L:    linux-nfs@vger.kernel.org
  W:    http://nfs.sourceforge.net/
  S:    Supported
@@@ -4039,7 -4011,7 +4039,7 @@@ M:      Josh Boyer <jwboyer@gmail.com
  M:    Matt Porter <mporter@kernel.crashing.org>
  W:    http://www.penguinppc.org/
  L:    linuxppc-dev@lists.ozlabs.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jwboyer/powerpc-4xx.git
 +T:    git git://git.infradead.org/users/jwboyer/powerpc-4xx.git
  S:    Maintained
  F:    arch/powerpc/platforms/40x/
  F:    arch/powerpc/platforms/44x/
@@@ -4126,7 -4098,7 +4126,7 @@@ F:      drivers/hwmon/lm90.
  LOCKDEP AND LOCKSTAT
  M:    Peter Zijlstra <peterz@infradead.org>
  M:    Ingo Molnar <mingo@redhat.com>
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/peterz/linux-2.6-lockdep.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core/locking
  S:    Maintained
  F:    Documentation/lockdep*.txt
  F:    Documentation/lockstat.txt
@@@ -4143,7 -4115,6 +4143,7 @@@ F:      fs/partitions/ldm.
  
  LogFS
  M:    Joern Engel <joern@logfs.org>
 +M:    Prasad Joshi <prasadjoshi.linux@gmail.com>
  L:    logfs@logfs.org
  W:    logfs.org
  S:    Maintained
@@@ -4181,6 -4152,13 +4181,13 @@@ W:    http://ltp.sourceforge.net
  T:    git git://ltp.git.sourceforge.net/gitroot/ltp/ltp-dev
  S:    Maintained
  
+ LTTng (Linux Trace Toolkit Next Generation)
+ M:    Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ L:    lttng-dev@lists.lttng.org (moderated for non-subscribers)
+ W:    http://lttng.org
+ S:    Maintained
+ F:    drivers/staging/lttng/
  M32R ARCHITECTURE
  M:    Hirokazu Takata <takata@linux-m32r.org>
  L:    linux-m32r@ml.linux-m32r.org (moderated for non-subscribers)
@@@ -4309,9 -4287,7 +4316,9 @@@ T:      git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  F:    Documentation/dvb/
  F:    Documentation/video4linux/
 +F:    Documentation/DocBook/media/
  F:    drivers/media/
 +F:    drivers/staging/media/
  F:    include/media/
  F:    include/linux/dvb/
  F:    include/linux/videodev*.h
@@@ -4883,14 -4859,6 +4890,14 @@@ S:    Maintaine
  T:    git git://openrisc.net/~jonas/linux
  F:    arch/openrisc
  
 +OPENVSWITCH
 +M:    Jesse Gross <jesse@nicira.com>
 +L:    dev@openvswitch.org
 +W:    http://openvswitch.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git
 +S:    Maintained
 +F:    net/openvswitch/
 +
  OPL4 DRIVER
  M:    Clemens Ladisch <clemens@ladisch.de>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
@@@ -5125,7 -5093,6 +5132,7 @@@ M:      Peter Zijlstra <a.p.zijlstra@chello.
  M:    Paul Mackerras <paulus@samba.org>
  M:    Ingo Molnar <mingo@elte.hu>
  M:    Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
  S:    Supported
  F:    kernel/events/*
  F:    include/linux/perf_event.h
@@@ -5205,7 -5172,6 +5212,7 @@@ F:      drivers/scsi/pm8001
  
  POSIX CLOCKS and TIMERS
  M:    Thomas Gleixner <tglx@linutronix.de>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
  S:    Supported
  F:    fs/timerfd.c
  F:    include/linux/timer*
@@@ -5721,7 -5687,6 +5728,7 @@@ F:      drivers/dma/dw_dmac.
  TIMEKEEPING, NTP
  M:    John Stultz <johnstul@us.ibm.com>
  M:    Thomas Gleixner <tglx@linutronix.de>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
  S:    Supported
  F:    include/linux/clocksource.h
  F:    include/linux/time.h
@@@ -5746,7 -5711,6 +5753,7 @@@ F:      drivers/watchdog/sc1200wdt.
  SCHEDULER
  M:    Ingo Molnar <mingo@elte.hu>
  M:    Peter Zijlstra <peterz@infradead.org>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core
  S:    Maintained
  F:    kernel/sched*
  F:    include/linux/sched.h
@@@ -6295,7 -6259,7 +6302,7 @@@ F:      arch/alpha/kernel/srm_env.
  
  STABLE BRANCH
  M:    Greg Kroah-Hartman <greg@kroah.com>
 -L:    stable@kernel.org
 +L:    stable@vger.kernel.org
  S:    Maintained
  
  STAGING SUBSYSTEM
@@@ -6356,6 -6320,12 +6363,6 @@@ M:     David Täht <d@teklibre.com
  S:    Odd Fixes
  F:    drivers/staging/frontier/
  
 -STAGING - HYPER-V (MICROSOFT)
 -M:    Hank Janssen <hjanssen@microsoft.com>
 -M:    Haiyang Zhang <haiyangz@microsoft.com>
 -S:    Odd Fixes
 -F:    drivers/staging/hv/
 -
  STAGING - INDUSTRIAL IO
  M:    Jonathan Cameron <jic23@cam.ac.uk>
  L:    linux-iio@vger.kernel.org
@@@ -6531,13 -6501,6 +6538,13 @@@ W:    http://tcp-lp-mod.sourceforge.net
  S:    Maintained
  F:    net/ipv4/tcp_lp.c
  
 +TEAM DRIVER
 +M:    Jiri Pirko <jpirko@redhat.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    drivers/net/team/
 +F:    include/linux/if_team.h
 +
  TEGRA SUPPORT
  M:    Colin Cross <ccross@android.com>
  M:    Olof Johansson <olof@lixom.net>
@@@ -6675,7 -6638,7 +6682,7 @@@ TRACIN
  M:    Steven Rostedt <rostedt@goodmis.org>
  M:    Frederic Weisbecker <fweisbec@gmail.com>
  M:    Ingo Molnar <mingo@redhat.com>
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git perf/core
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
  S:    Maintained
  F:    Documentation/trace/ftrace.txt
  F:    arch/*/*/*/ftrace.h
@@@ -7425,7 -7388,7 +7432,7 @@@ M:      Thomas Gleixner <tglx@linutronix.de
  M:    Ingo Molnar <mingo@redhat.com>
  M:    "H. Peter Anvin" <hpa@zytor.com>
  M:    x86@kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
  S:    Maintained
  F:    Documentation/x86/
  F:    arch/x86/
diff --combined drivers/net/Kconfig
index 9845afb37cc80a785cc3fe137ed6d0e729ccb589,99aa7faf5553ef7082696c9855fefeb8c74c61cc..b98285446a5a22cbe0b2d799ea7575211f68e905
@@@ -125,8 -125,6 +125,8 @@@ config IF
          'ifb1' etc.
          Look at the iproute2 documentation directory for usage etc
  
 +source "drivers/net/team/Kconfig"
 +
  config MACVLAN
        tristate "MAC-VLAN support (EXPERIMENTAL)"
        depends on EXPERIMENTAL
@@@ -243,8 -241,6 +243,8 @@@ source "drivers/atm/Kconfig
  
  source "drivers/net/caif/Kconfig"
  
 +source "drivers/net/dsa/Kconfig"
 +
  source "drivers/net/ethernet/Kconfig"
  
  source "drivers/net/fddi/Kconfig"
@@@ -342,4 -338,6 +342,6 @@@ config VMXNET
          To compile this driver as a module, choose M here: the
          module will be called vmxnet3.
  
+ source "drivers/net/hyperv/Kconfig"
  endif # NETDEVICES
diff --combined drivers/net/Makefile
index 1988881853ab8437b7776493df00e063588e5f59,a81192b902ed536149f2c66d0296251c13148ac4..a6b8ce11a22fefae4c132df38643df78dad7d7d7
@@@ -17,7 -17,6 +17,7 @@@ obj-$(CONFIG_NET) += Space.o loopback.
  obj-$(CONFIG_NETCONSOLE) += netconsole.o
  obj-$(CONFIG_PHYLIB) += phy/
  obj-$(CONFIG_RIONET) += rionet.o
 +obj-$(CONFIG_NET_TEAM) += team/
  obj-$(CONFIG_TUN) += tun.o
  obj-$(CONFIG_VETH) += veth.o
  obj-$(CONFIG_VIRTIO_NET) += virtio_net.o
@@@ -30,7 -29,6 +30,7 @@@ obj-$(CONFIG_DEV_APPLETALK) += appletal
  obj-$(CONFIG_CAIF) += caif/
  obj-$(CONFIG_CAN) += can/
  obj-$(CONFIG_ETRAX_ETHERNET) += cris/
 +obj-$(CONFIG_NET_DSA) += dsa/
  obj-$(CONFIG_ETHERNET) += ethernet/
  obj-$(CONFIG_FDDI) += fddi/
  obj-$(CONFIG_HIPPI) += hippi/
@@@ -68,3 -66,5 +68,5 @@@ obj-$(CONFIG_USB_USBNET)        += usb
  obj-$(CONFIG_USB_ZD1201)        += usb/
  obj-$(CONFIG_USB_IPHETH)        += usb/
  obj-$(CONFIG_USB_CDC_PHONET)   += usb/
+ obj-$(CONFIG_HYPERV_NET) += hyperv/
index ae8f06d05bed3d52669f2bcc546e94f8320148bf,c515e19e963b4a811e30cc6fe976729e5312eeca..4254c0426db99ba74379f2661f61b9859f9e126c
@@@ -1,7 -1,3 +1,3 @@@
- /*
-  * $Id: libsbew.h,v 2.1 2005/10/27 18:54:19 rickd PMCC4_3_1B $
-  */
  #ifndef _INC_LIBSBEW_H_
  #define _INC_LIBSBEW_H_
  
   * For further information, contact via email: support@sbei.com
   * SBE, Inc.  San Ramon, California  U.S.A.
   *-----------------------------------------------------------------------------
-  * RCS info:
-  * RCS revision: $Revision: 2.1 $
-  * Last changed on $Date: 2005/10/27 18:54:19 $
-  * Changed by $Author: rickd $
-  *-----------------------------------------------------------------------------
-  * $Log: libsbew.h,v $
-  * Revision 2.1  2005/10/27 18:54:19  rickd
-  * Add E1PLAIN support.
-  *
-  * Revision 2.0  2005/09/28 00:10:08  rickd
-  * Customized for PMCC4 comet-per-port design.
-  *
-  * Revision 1.15  2005/03/29 00:51:31  rickd
-  * File imported from C1T3 port, Revision 1.15
-  *-----------------------------------------------------------------------------
   */
  
- #ifndef __KERNEL__
- #include <sys/types.h>
- #endif
- #ifdef __cplusplus
- extern      "C"
- {
- #endif
  /********************************/
  /**  set driver logging level  **/
  /********************************/
@@@ -323,7 -295,7 +295,7 @@@ struct sbecom_port_para
  #define CFG_CH_DINV_TX      0x02
  
  
 -/* Posssible resettable chipsets/functions */
 +/* Possible resettable chipsets/functions */
  #define RESET_DEV_TEMUX     1
  #define RESET_DEV_TECT3     RESET_DEV_TEMUX
  #define RESET_DEV_PLL       2
      extern int  wancfg_set_tsioc (wcfg_t *, struct wanc1t3_ts_param *);
  #endif
  
- #ifdef __cplusplus
- }
- #endif
  #endif                          /*** _INC_LIBSBEW_H_ ***/
index c263284ddc0e74f6aa4cb8183ffe7811c24542cb,0e7b4d6bb80765d2613ee053200caed287c30f7f..cf47a5d191fcd72df627907c7ce02e52e5f87195
@@@ -199,7 -199,7 +199,7 @@@ static void usb_tranzport_abort_transfe
                struct usb_interface *intf = to_usb_interface(dev);     \
                struct usb_tranzport *t = usb_get_intfdata(intf);       \
                unsigned long temp;     \
-               if (strict_strtoul(buf, 10, &temp))     \
+               if (kstrtoul(buf, 10, &temp))   \
                        return -EINVAL; \
                t->value = temp;        \
                return count;   \
@@@ -971,4 -971,29 +971,4 @@@ static struct usb_driver usb_tranzport_
        .id_table = usb_tranzport_table,
  };
  
 -/**
 - *    usb_tranzport_init
 - */
 -static int __init usb_tranzport_init(void)
 -{
 -      int retval;
 -
 -      /* register this driver with the USB subsystem */
 -      retval = usb_register(&usb_tranzport_driver);
 -      if (retval)
 -              err("usb_register failed for the " __FILE__
 -                      " driver. Error number %d\n", retval);
 -      return retval;
 -}
 -/**
 - *    usb_tranzport_exit
 - */
 -
 -static void __exit usb_tranzport_exit(void)
 -{
 -      /* deregister this driver with the USB subsystem */
 -      usb_deregister(&usb_tranzport_driver);
 -}
 -
 -module_init(usb_tranzport_init);
 -module_exit(usb_tranzport_exit);
 +module_usb_driver(usb_tranzport_driver);
index 97f747eac6470aa1e907037b2a59c3ea6bba5da4,ed97da240b0e85f97217435720e5840244d21ee3..d439e45d07fa99bb8b893001d9419b88d2a2ad4c
@@@ -17,7 -17,7 +17,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  
  #include "adis16201.h"
  
@@@ -322,8 -322,7 +322,7 @@@ static int adis16201_read_raw(struct ii
                *val = val16;
                mutex_unlock(&indio_dev->mlock);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        *val = 0;
                        return -EINVAL;
                }
                break;
-       case (1 << IIO_CHAN_INFO_OFFSET_SEPARATE):
+       case IIO_CHAN_INFO_OFFSET:
                *val = 25;
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                switch (chan->type) {
                case IIO_ACCEL:
                        bits = 12;
@@@ -388,7 -387,7 +387,7 @@@ static int adis16201_write_raw(struct i
        s16 val16;
        u8 addr;
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                switch (chan->type) {
                case IIO_ACCEL:
                        bits = 12;
  
  static struct iio_chan_spec adis16201_channels[] = {
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, "supply", 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 in_supply, ADIS16201_SCAN_SUPPLY,
                 IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_TEMP, 0, 1, 0, NULL, 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE) |
-                (1 << IIO_CHAN_INFO_OFFSET_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
+                IIO_CHAN_INFO_OFFSET_SEPARATE_BIT,
                 temp, ADIS16201_SCAN_TEMP,
                 IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_X,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED) |
-                (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT |
+                IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
                 accel_x, ADIS16201_SCAN_ACC_X,
                 IIO_ST('s', 14, 16, 0), 0),
        IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_Y,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED) |
-                (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT |
+                IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
                 accel_y, ADIS16201_SCAN_ACC_Y,
                 IIO_ST('s', 14, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 1, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 in_aux, ADIS16201_SCAN_AUX_ADC,
                 IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_INCLI, 1, 0, 0, NULL, 0, IIO_MOD_X,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED) |
-                (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT |
+                IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
                 incli_x, ADIS16201_SCAN_INCLI_X,
                 IIO_ST('s', 14, 16, 0), 0),
        IIO_CHAN(IIO_INCLI, 1, 0, 0, NULL, 0, IIO_MOD_Y,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED) |
-                (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT |
+                IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
                 incli_y, ADIS16201_SCAN_INCLI_Y,
                 IIO_ST('s', 14, 16, 0), 0),
        IIO_CHAN_SOFT_TIMESTAMP(7)
@@@ -549,8 -548,20 +548,9 @@@ static struct spi_driver adis16201_driv
        .probe = adis16201_probe,
        .remove = __devexit_p(adis16201_remove),
  };
 -
 -static __init int adis16201_init(void)
 -{
 -      return spi_register_driver(&adis16201_driver);
 -}
 -module_init(adis16201_init);
 -
 -static __exit void adis16201_exit(void)
 -{
 -      spi_unregister_driver(&adis16201_driver);
 -}
 -module_exit(adis16201_exit);
 +module_spi_driver(adis16201_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices ADIS16201 Programmable Digital Vibration Sensor driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:adis16201");
index a6d6d27f3c97ba3b90ed1ed00e844fbe89148bd9,41fe930c16c28eb528e4feabce556d56b9a7229e..1a5140f9e3f4ec10b9f2f5f0488949c9eeac13d8
@@@ -17,7 -17,7 +17,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  
  #include "adis16203.h"
  
@@@ -329,8 -329,7 +329,7 @@@ static int adis16203_read_raw(struct ii
                *val = val16;
                mutex_unlock(&indio_dev->mlock);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        *val = 0;
                default:
                        return -EINVAL;
                }
-       case (1 << IIO_CHAN_INFO_OFFSET_SEPARATE):
+       case IIO_CHAN_INFO_OFFSET:
                *val = 25;
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                bits = 14;
                mutex_lock(&indio_dev->mlock);
                addr = adis16203_addresses[chan->address][1];
  
  static struct iio_chan_spec adis16203_channels[] = {
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, "supply", 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 in_supply, ADIS16203_SCAN_SUPPLY,
                 IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 1, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 in_aux, ADIS16203_SCAN_AUX_ADC,
                 IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_INCLI, 1, 0, 0, NULL, 0, IIO_MOD_X,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED) |
-                (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT |
+                IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
                 incli_x, ADIS16203_SCAN_INCLI_X,
                 IIO_ST('s', 14, 16, 0), 0),
        /* Fixme: Not what it appears to be - see data sheet */
        IIO_CHAN(IIO_INCLI, 1, 0, 0, NULL, 0, IIO_MOD_Y,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 incli_y, ADIS16203_SCAN_INCLI_Y,
                 IIO_ST('s', 14, 16, 0), 0),
        IIO_CHAN(IIO_TEMP, 0, 1, 0, NULL, 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE) |
-                (1 << IIO_CHAN_INFO_OFFSET_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
+                IIO_CHAN_INFO_OFFSET_SEPARATE_BIT,
                 temp, ADIS16203_SCAN_TEMP,
                 IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN_SOFT_TIMESTAMP(5),
@@@ -504,8 -503,20 +503,9 @@@ static struct spi_driver adis16203_driv
        .probe = adis16203_probe,
        .remove = __devexit_p(adis16203_remove),
  };
 -
 -static __init int adis16203_init(void)
 -{
 -      return spi_register_driver(&adis16203_driver);
 -}
 -module_init(adis16203_init);
 -
 -static __exit void adis16203_exit(void)
 -{
 -      spi_unregister_driver(&adis16203_driver);
 -}
 -module_exit(adis16203_exit);
 +module_spi_driver(adis16203_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices ADIS16203 Programmable Digital Vibration Sensor driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:adis16203");
index 7ac5b4c533d8bedf8c85130a0a7108b2e24456cf,fcab806f68f5522166c7d432fcf7db62554e346f..fa89364b841e763c81ca223b4adb8f5be20f123c
@@@ -20,7 -20,7 +20,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  
  #include "adis16204.h"
  
@@@ -366,7 -366,7 +366,7 @@@ static int adis16204_read_raw(struct ii
                *val = val16;
                mutex_unlock(&indio_dev->mlock);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
+       case IIO_CHAN_INFO_SCALE:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        *val = 0;
                        return -EINVAL;
                }
                break;
-       case (1 << IIO_CHAN_INFO_OFFSET_SEPARATE):
+       case IIO_CHAN_INFO_OFFSET:
                *val = 25;
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
-       case (1 << IIO_CHAN_INFO_PEAK_SEPARATE):
-               if (mask == (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE)) {
+       case IIO_CHAN_INFO_CALIBBIAS:
+       case IIO_CHAN_INFO_PEAK:
+               if (mask == IIO_CHAN_INFO_CALIBBIAS) {
                        bits = 12;
                        addrind = 1;
                } else { /* PEAK_SEPARATE */
@@@ -428,7 -428,7 +428,7 @@@ static int adis16204_write_raw(struct i
        s16 val16;
        u8 addr;
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                switch (chan->type) {
                case IIO_ACCEL:
                        bits = 12;
  
  static struct iio_chan_spec adis16204_channels[] = {
        IIO_CHAN(IIO_VOLTAGE, 0, 0, 0, "supply", 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 in_supply, ADIS16204_SCAN_SUPPLY,
                 IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 1, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 in_aux, ADIS16204_SCAN_AUX_ADC,
                 IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_TEMP, 0, 1, 0, NULL, 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE) |
-                (1 << IIO_CHAN_INFO_OFFSET_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
+                IIO_CHAN_INFO_OFFSET_SEPARATE_BIT,
                 temp, ADIS16204_SCAN_TEMP,
                 IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_X,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE) |
-                (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-                (1 << IIO_CHAN_INFO_PEAK_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
+                IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+                IIO_CHAN_INFO_PEAK_SEPARATE_BIT,
                 accel_x, ADIS16204_SCAN_ACC_X,
                 IIO_ST('s', 14, 16, 0), 0),
        IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_Y,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE) |
-                (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-                (1 << IIO_CHAN_INFO_PEAK_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
+                IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+                IIO_CHAN_INFO_PEAK_SEPARATE_BIT,
                 accel_y, ADIS16204_SCAN_ACC_Y,
                 IIO_ST('s', 14, 16, 0), 0),
        IIO_CHAN_SOFT_TIMESTAMP(5),
@@@ -577,8 -577,20 +577,9 @@@ static struct spi_driver adis16204_driv
        .probe = adis16204_probe,
        .remove = __devexit_p(adis16204_remove),
  };
 -
 -static __init int adis16204_init(void)
 -{
 -      return spi_register_driver(&adis16204_driver);
 -}
 -module_init(adis16204_init);
 -
 -static __exit void adis16204_exit(void)
 -{
 -      spi_unregister_driver(&adis16204_driver);
 -}
 -module_exit(adis16204_exit);
 +module_spi_driver(adis16204_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("ADIS16204 High-g Digital Impact Sensor and Recorder");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:adis16204");
index c03afbf5bbdc8b8f26f815d15896a73ce3ed7ffd,4ad33ecbc44d0765b2ccde2bcfc849df8c3db2ec..a98715f6bd6d9a2b196a0d6409f49d41f4e7f4e3
@@@ -18,7 -18,7 +18,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  
  #include "adis16209.h"
  
@@@ -304,7 -304,7 +304,7 @@@ static int adis16209_write_raw(struct i
        s16 val16;
        u8 addr;
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                switch (chan->type) {
                case IIO_ACCEL:
                case IIO_INCLI:
@@@ -355,8 -355,7 +355,7 @@@ static int adis16209_read_raw(struct ii
                *val = val16;
                mutex_unlock(&indio_dev->mlock);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        *val = 0;
                        return -EINVAL;
                }
                break;
-       case (1 << IIO_CHAN_INFO_OFFSET_SEPARATE):
+       case IIO_CHAN_INFO_OFFSET:
                *val = 25;
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                switch (chan->type) {
                case IIO_ACCEL:
                        bits = 14;
  
  static struct iio_chan_spec adis16209_channels[] = {
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 in_supply, ADIS16209_SCAN_SUPPLY,
                 IIO_ST('u', 14, 16, 0), 0),
        IIO_CHAN(IIO_TEMP, 0, 1, 0, NULL, 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE) |
-                (1 << IIO_CHAN_INFO_OFFSET_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
+                IIO_CHAN_INFO_OFFSET_SEPARATE_BIT,
                 temp, ADIS16209_SCAN_TEMP,
                 IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_X,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED) |
-                (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT |
+                IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
                 accel_x, ADIS16209_SCAN_ACC_X,
                 IIO_ST('s', 14, 16, 0), 0),
        IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_Y,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED) |
-                (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT |
+                IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
                 accel_y, ADIS16209_SCAN_ACC_Y,
                 IIO_ST('s', 14, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 1, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 in_aux, ADIS16209_SCAN_AUX_ADC,
                 IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_INCLI, 1, 0, 0, NULL, 0, IIO_MOD_X,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 incli_x, ADIS16209_SCAN_INCLI_X,
                 IIO_ST('s', 14, 16, 0), 0),
        IIO_CHAN(IIO_INCLI, 1, 0, 0, NULL, 0, IIO_MOD_Y,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 incli_y, ADIS16209_SCAN_INCLI_Y,
                 IIO_ST('s', 14, 16, 0), 0),
        IIO_CHAN(IIO_ROT, 0, 1, 0, NULL, 0, IIO_MOD_X,
@@@ -553,8 -552,20 +552,9 @@@ static struct spi_driver adis16209_driv
        .probe = adis16209_probe,
        .remove = __devexit_p(adis16209_remove),
  };
 -
 -static __init int adis16209_init(void)
 -{
 -      return spi_register_driver(&adis16209_driver);
 -}
 -module_init(adis16209_init);
 -
 -static __exit void adis16209_exit(void)
 -{
 -      spi_unregister_driver(&adis16209_driver);
 -}
 -module_exit(adis16209_exit);
 +module_spi_driver(adis16209_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices ADIS16209 Digital Vibration Sensor driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:adis16209");
index 73298e7849e63a2848c01e3872fef9e6dd014aac,d0587e237f2ee4ff18121470aa7f6394a8c20abc..51a852d45482f8f13fa0de8897e5d8d7c3b7b25e
@@@ -167,9 -167,9 +167,9 @@@ static ssize_t adis16220_write_16bit(st
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
        int ret;
-       long val;
+       u16 val;
  
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou16(buf, 10, &val);
        if (ret)
                goto error_ret;
        ret = adis16220_spi_write_reg_16(indio_dev, this_attr->address, val);
@@@ -510,17 -510,17 +510,17 @@@ static int adis16220_read_raw(struct ii
        case 0:
                addrind = 0;
                break;
-       case (1 << IIO_CHAN_INFO_OFFSET_SEPARATE):
+       case IIO_CHAN_INFO_OFFSET:
                if (chan->type == IIO_TEMP) {
                        *val = 25;
                        return IIO_VAL_INT;
                }
                addrind = 1;
                break;
-       case (1 << IIO_CHAN_INFO_PEAK_SEPARATE):
+       case IIO_CHAN_INFO_PEAK:
                addrind = 2;
                break;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
+       case IIO_CHAN_INFO_SCALE:
                *val = 0;
                switch (chan->type) {
                case IIO_TEMP:
@@@ -575,27 -575,27 +575,27 @@@ static const struct iio_chan_spec adis1
                .indexed = 1,
                .channel = 0,
                .extend_name = "supply",
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .address = in_supply,
        }, {
                .type = IIO_ACCEL,
-               .info_mask = (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |
-                            (1 << IIO_CHAN_INFO_SCALE_SEPARATE) |
-                            (1 << IIO_CHAN_INFO_PEAK_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |
+                            IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
+                            IIO_CHAN_INFO_PEAK_SEPARATE_BIT,
                .address = accel,
        }, {
                .type = IIO_TEMP,
                .indexed = 1,
                .channel = 0,
-               .info_mask = (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |
-                            (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |
+                            IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .address = temp,
        }, {
                .type = IIO_VOLTAGE,
                .indexed = 1,
                .channel = 1,
-               .info_mask = (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |
-                            (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |
+                            IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .address = in_1,
        }, {
                .type = IIO_VOLTAGE,
@@@ -708,8 -708,20 +708,9 @@@ static struct spi_driver adis16220_driv
        .probe = adis16220_probe,
        .remove = __devexit_p(adis16220_remove),
  };
 -
 -static __init int adis16220_init(void)
 -{
 -      return spi_register_driver(&adis16220_driver);
 -}
 -module_init(adis16220_init);
 -
 -static __exit void adis16220_exit(void)
 -{
 -      spi_unregister_driver(&adis16220_driver);
 -}
 -module_exit(adis16220_exit);
 +module_spi_driver(adis16220_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices ADIS16220 Digital Vibration Sensor");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:adis16220");
index 88881b9919ef832fc0778d00aa4f1f5fbdccd05d,4298c4065c9f1b58b37ca32936ac0cf49c4e4b44..17f77fef7f2b2adc1b8a90fd067dd4bab28e6816
@@@ -21,7 -21,7 +21,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  
  #include "adis16240.h"
  
@@@ -389,8 -389,7 +389,7 @@@ static int adis16240_read_raw(struct ii
                *val = val16;
                mutex_unlock(&indio_dev->mlock);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        *val = 0;
                        return -EINVAL;
                }
                break;
-       case (1 << IIO_CHAN_INFO_PEAK_SCALE_SHARED):
+       case IIO_CHAN_INFO_PEAK_SCALE:
                *val = 6;
                *val2 = 629295;
                return IIO_VAL_INT_PLUS_MICRO;
-       case (1 << IIO_CHAN_INFO_OFFSET_SEPARATE):
+       case IIO_CHAN_INFO_OFFSET:
                *val = 25;
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                bits = 10;
                mutex_lock(&indio_dev->mlock);
                addr = adis16240_addresses[chan->address][1];
                *val = val16;
                mutex_unlock(&indio_dev->mlock);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_PEAK_SEPARATE):
+       case IIO_CHAN_INFO_PEAK:
                bits = 10;
                mutex_lock(&indio_dev->mlock);
                addr = adis16240_addresses[chan->address][2];
@@@ -460,7 -459,7 +459,7 @@@ static int adis16240_write_raw(struct i
        s16 val16;
        u8 addr;
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                val16 = val & ((1 << bits) - 1);
                addr = adis16240_addresses[chan->address][1];
                return adis16240_spi_write_reg_16(indio_dev, addr, val16);
  
  static struct iio_chan_spec adis16240_channels[] = {
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, "supply", 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 in_supply, ADIS16240_SCAN_SUPPLY,
                 IIO_ST('u', 10, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 1, 0,
                 in_aux, ADIS16240_SCAN_AUX_ADC,
                 IIO_ST('u', 10, 16, 0), 0),
        IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_X,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED) |
-                (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT |
+                IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
                 accel_x, ADIS16240_SCAN_ACC_X,
                 IIO_ST('s', 10, 16, 0), 0),
        IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_Y,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED) |
-                (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT |
+                IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
                 accel_y, ADIS16240_SCAN_ACC_Y,
                 IIO_ST('s', 10, 16, 0), 0),
        IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_Z,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED) |
-                (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT |
+                IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
                 accel_z, ADIS16240_SCAN_ACC_Z,
                 IIO_ST('s', 10, 16, 0), 0),
        IIO_CHAN(IIO_TEMP, 0, 1, 0, NULL, 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 temp, ADIS16240_SCAN_TEMP,
                 IIO_ST('u', 10, 16, 0), 0),
        IIO_CHAN_SOFT_TIMESTAMP(6)
@@@ -606,8 -605,20 +605,9 @@@ static struct spi_driver adis16240_driv
        .probe = adis16240_probe,
        .remove = __devexit_p(adis16240_remove),
  };
 -
 -static __init int adis16240_init(void)
 -{
 -      return spi_register_driver(&adis16240_driver);
 -}
 -module_init(adis16240_init);
 -
 -static __exit void adis16240_exit(void)
 -{
 -      spi_unregister_driver(&adis16240_driver);
 -}
 -module_exit(adis16240_exit);
 +module_spi_driver(adis16240_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices Programmable Impact Sensor and Recorder");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:adis16240");
index cfce21c2eddc4d0116deb4aa6f46377d4915a47a,5a543fa55c93a8c713beeee289c5e213d0bf5b7d..d13d7215ff6e410aaa11602519ecc61acbed82b7
@@@ -140,7 -140,7 +140,7 @@@ static int kxsd9_write_raw(struct iio_d
  {
        int ret = -EINVAL;
  
-       if (mask == (1 << IIO_CHAN_INFO_SCALE_SHARED)) {
+       if (mask == IIO_CHAN_INFO_SCALE) {
                /* Check no integer component */
                if (val)
                        return -EINVAL;
@@@ -164,7 -164,7 +164,7 @@@ static int kxsd9_read_raw(struct iio_de
                        goto error_ret;
                *val = ret;
                break;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                ret = spi_w8r8(st->us, KXSD9_READ(KXSD9_REG_CTRL_C));
                if (ret)
                        goto error_ret;
@@@ -181,7 -181,7 +181,7 @@@ error_ret
                .type = IIO_ACCEL,                                      \
                .modified = 1,                                          \
                .channel2 = IIO_MOD_##axis,                             \
-               .info_mask = 1 << IIO_CHAN_INFO_SCALE_SHARED,           \
+               .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,            \
                .address = KXSD9_REG_##axis,                            \
        }
  
@@@ -268,8 -268,10 +268,10 @@@ static int __devexit kxsd9_remove(struc
  }
  
  static const struct spi_device_id kxsd9_id[] = {
-       {"kxsd9", 0}
+       {"kxsd9", 0},
+       { },
  };
+ MODULE_DEVICE_TABLE(spi, kxsd9_id);
  
  static struct spi_driver kxsd9_driver = {
        .driver = {
        .remove = __devexit_p(kxsd9_remove),
        .id_table = kxsd9_id,
  };
 -
 -static __init int kxsd9_spi_init(void)
 -{
 -      return spi_register_driver(&kxsd9_driver);
 -}
 -module_init(kxsd9_spi_init);
 -
 -static __exit void kxsd9_spi_exit(void)
 -{
 -      spi_unregister_driver(&kxsd9_driver);
 -}
 -module_exit(kxsd9_spi_exit);
 +module_spi_driver(kxsd9_driver);
  
  MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");
  MODULE_DESCRIPTION("Kionix KXSD9 SPI driver");
index 6877521ec173667fe82ff9dd88bb12b93321a585,3d99f8b65a85cdeb61ebbbc06f032f40527bbdce..376da5137967a7ab2567ccf6ac9e2bf0a55e8522
@@@ -25,7 -25,8 +25,8 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../events.h"
+ #include "../buffer.h"
  
  #include "lis3l02dq.h"
  
@@@ -226,14 -227,14 +227,14 @@@ static int lis3l02dq_write_raw(struct i
        u8 uval;
        s8 sval;
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                if (val > 255 || val < -256)
                        return -EINVAL;
                sval = val;
                reg = lis3l02dq_axis_map[LIS3L02DQ_BIAS][chan->address];
                ret = lis3l02dq_spi_write_reg_8(indio_dev, reg, sval);
                break;
-       case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
+       case IIO_CHAN_INFO_CALIBSCALE:
                if (val & ~0xFF)
                        return -EINVAL;
                uval = val;
@@@ -259,23 -260,20 +260,20 @@@ static int lis3l02dq_read_raw(struct ii
        case 0:
                /* Take the iio_dev status lock */
                mutex_lock(&indio_dev->mlock);
-               if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED)
-                       ret = lis3l02dq_read_accel_from_buffer(indio_dev->
-                                                              buffer,
-                                                              chan->scan_index,
-                                                              val);
-               else {
+               if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
+                       ret = -EBUSY;
+               } else {
                        reg = lis3l02dq_axis_map
                                [LIS3L02DQ_ACCEL][chan->address];
                        ret = lis3l02dq_read_reg_s16(indio_dev, reg, val);
                }
                mutex_unlock(&indio_dev->mlock);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                *val = 0;
                *val2 = 9580;
                return IIO_VAL_INT_PLUS_MICRO;
-       case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
+       case IIO_CHAN_INFO_CALIBSCALE:
                reg = lis3l02dq_axis_map[LIS3L02DQ_GAIN][chan->address];
                ret = lis3l02dq_spi_read_reg_8(indio_dev, reg, &utemp);
                if (ret)
                *val = utemp;
                return IIO_VAL_INT;
  
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                reg = lis3l02dq_axis_map[LIS3L02DQ_BIAS][chan->address];
                ret = lis3l02dq_spi_read_reg_8(indio_dev, reg, (u8 *)&stemp);
                /* to match with what previous code does */
@@@ -331,11 -329,11 +329,11 @@@ static ssize_t lis3l02dq_write_frequenc
                                         size_t len)
  {
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       long val;
+       unsigned long val;
        int ret;
        u8 t;
  
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtoul(buf, 10, &val);
        if (ret)
                return ret;
  
@@@ -515,9 -513,9 +513,9 @@@ static irqreturn_t lis3l02dq_event_hand
  }
  
  #define LIS3L02DQ_INFO_MASK                           \
-       ((1 << IIO_CHAN_INFO_SCALE_SHARED) |            \
-        (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) |     \
-        (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE))
+       (IIO_CHAN_INFO_SCALE_SHARED_BIT |               \
+        IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT |        \
+        IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT)
  
  #define LIS3L02DQ_EVENT_MASK                                  \
        (IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING) |    \
@@@ -534,7 -532,7 +532,7 @@@ static struct iio_chan_spec lis3l02dq_c
  };
  
  
- static ssize_t lis3l02dq_read_event_config(struct iio_dev *indio_dev,
+ static int lis3l02dq_read_event_config(struct iio_dev *indio_dev,
                                           u64 event_code)
  {
  
@@@ -804,8 -802,20 +802,9 @@@ static struct spi_driver lis3l02dq_driv
        .probe = lis3l02dq_probe,
        .remove = __devexit_p(lis3l02dq_remove),
  };
 -
 -static __init int lis3l02dq_init(void)
 -{
 -      return spi_register_driver(&lis3l02dq_driver);
 -}
 -module_init(lis3l02dq_init);
 -
 -static __exit void lis3l02dq_exit(void)
 -{
 -      spi_unregister_driver(&lis3l02dq_driver);
 -}
 -module_exit(lis3l02dq_exit);
 +module_spi_driver(lis3l02dq_driver);
  
  MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");
  MODULE_DESCRIPTION("ST LIS3L02DQ Accelerometer SPI driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:lis3l02dq");
index 6c359074a06df0f7dd44e3e1fdab4501f24cb092,1f30108fdb558dc18c1eba583ebad5472bf18b05..49764fb7181c690d31e6d2e3021d88860483448a
@@@ -20,7 -20,8 +20,8 @@@
  #include <linux/module.h>
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../events.h"
+ #include "../buffer.h"
  
  #include "sca3000.h"
  
@@@ -381,13 -382,17 +382,17 @@@ sca3000_store_measurement_mode(struct d
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
        struct sca3000_state *st = iio_priv(indio_dev);
        int ret;
-       int mask = 0x03;
-       long val;
+       u8 mask = 0x03;
+       u8 val;
  
        mutex_lock(&st->lock);
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou8(buf, 10, &val);
        if (ret)
                goto error_ret;
+       if (val > 3) {
+               ret = -EINVAL;
+               goto error_ret;
+       }
        ret = sca3000_read_data_short(st, SCA3000_REG_ADDR_MODE, 1);
        if (ret)
                goto error_ret;
@@@ -424,7 -429,7 +429,7 @@@ static IIO_DEVICE_ATTR(measurement_mode
  static IIO_DEVICE_ATTR(revision, S_IRUGO, sca3000_show_rev, NULL, 0);
  
  #define SCA3000_INFO_MASK                     \
-       (1 << IIO_CHAN_INFO_SCALE_SHARED)
+       IIO_CHAN_INFO_SCALE_SHARED_BIT
  #define SCA3000_EVENT_MASK                                    \
        (IIO_EV_BIT(IIO_EV_TYPE_MAG, IIO_EV_DIR_RISING))
  
@@@ -474,7 -479,7 +479,7 @@@ static int sca3000_read_raw(struct iio_
                        (sizeof(*val)*8 - 13);
                mutex_unlock(&st->lock);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                *val = 0;
                if (chan->type == IIO_ACCEL)
                        *val2 = st->info->scale;
@@@ -1161,9 -1166,9 +1166,9 @@@ static int __devinit sca3000_probe(stru
        if (ret < 0)
                goto error_unregister_dev;
        if (indio_dev->buffer) {
-               iio_scan_mask_set(indio_dev->buffer, 0);
-               iio_scan_mask_set(indio_dev->buffer, 1);
-               iio_scan_mask_set(indio_dev->buffer, 2);
+               iio_scan_mask_set(indio_dev, indio_dev->buffer, 0);
+               iio_scan_mask_set(indio_dev, indio_dev->buffer, 1);
+               iio_scan_mask_set(indio_dev, indio_dev->buffer, 2);
        }
  
        if (spi->irq) {
@@@ -1240,6 -1245,7 +1245,7 @@@ static const struct spi_device_id sca30
        {"sca3000_e05", e05},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, sca3000_id);
  
  static struct spi_driver sca3000_driver = {
        .driver = {
        .remove = __devexit_p(sca3000_remove),
        .id_table = sca3000_id,
  };
 -
 -static __init int sca3000_init(void)
 -{
 -      return spi_register_driver(&sca3000_driver);
 -}
 -module_init(sca3000_init);
 -
 -static __exit void sca3000_exit(void)
 -{
 -      spi_unregister_driver(&sca3000_driver);
 -}
 -module_exit(sca3000_exit);
 +module_spi_driver(sca3000_driver);
  
  MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");
  MODULE_DESCRIPTION("VTI SCA3000 Series Accelerometers SPI driver");
index a6a4a4e1f183045339462aade27637874c12ffbd,66cc507ab4d246ebb5e07f460bddb5cfd883a5c7..f8193b6067e0176d397c9bf1a8513e3f7373e58b
@@@ -19,7 -19,7 +19,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  #include "../ring_sw.h"
  #include "../trigger.h"
  #include "../trigger_consumer.h"
@@@ -453,25 -453,6 +453,6 @@@ out
        return ret;
  }
  
- static int ad7192_scan_from_ring(struct ad7192_state *st, unsigned ch, int *val)
- {
-       struct iio_buffer *ring = iio_priv_to_dev(st)->buffer;
-       int ret;
-       s64 dat64[2];
-       u32 *dat32 = (u32 *)dat64;
-       if (!(test_bit(ch, ring->scan_mask)))
-               return  -EBUSY;
-       ret = ring->access->read_last(ring, (u8 *) &dat64);
-       if (ret)
-               return ret;
-       *val = *dat32;
-       return 0;
- }
  static int ad7192_ring_preenable(struct iio_dev *indio_dev)
  {
        struct ad7192_state *st = iio_priv(indio_dev);
        size_t d_size;
        unsigned channel;
  
-       if (!ring->scan_count)
+       if (bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
                return -EINVAL;
  
-       channel = find_first_bit(ring->scan_mask, indio_dev->masklength);
+       channel = find_first_bit(indio_dev->active_scan_mask,
+                                indio_dev->masklength);
  
-       d_size = ring->scan_count *
+       d_size = bitmap_weight(indio_dev->active_scan_mask,
+                              indio_dev->masklength) *
                 indio_dev->channels[0].scan_type.storagebits / 8;
  
        if (ring->scan_timestamp) {
@@@ -544,7 -527,7 +527,7 @@@ static irqreturn_t ad7192_trigger_handl
        s64 dat64[2];
        s32 *dat32 = (s32 *)dat64;
  
-       if (ring->scan_count)
+       if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
                __ad7192_read_reg(st, 1, 1, AD7192_REG_DATA,
                                  dat32,
                                  indio_dev->channels[0].scan_type.realbits/8);
@@@ -592,7 -575,7 +575,7 @@@ static int ad7192_register_ring_funcs_a
        }
  
        /* Ring buffer functions - here trigger setup related */
-       indio_dev->buffer->setup_ops = &ad7192_ring_setup_ops;
+       indio_dev->setup_ops = &ad7192_ring_setup_ops;
  
        /* Flag that polled ring buffering is possible */
        indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
@@@ -795,7 -778,7 +778,7 @@@ static ssize_t ad7192_set(struct devic
                return -EBUSY;
        }
  
-       switch (this_attr->address) {
+       switch ((u32) this_attr->address) {
        case AD7192_REG_GPOCON:
                if (val)
                        st->gpocon |= AD7192_GPOCON_BPDSW;
@@@ -873,8 -856,7 +856,7 @@@ static int ad7192_read_raw(struct iio_d
        case 0:
                mutex_lock(&indio_dev->mlock);
                if (iio_buffer_enabled(indio_dev))
-                       ret = ad7192_scan_from_ring(st,
-                                       chan->scan_index, &smpl);
+                       ret = -EBUSY;
                else
                        ret = ad7192_read(st, chan->address,
                                        chan->scan_type.realbits / 8, &smpl);
                }
                return IIO_VAL_INT;
  
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
-               mutex_lock(&indio_dev->mlock);
-               *val = st->scale_avail[AD7192_CONF_GAIN(st->conf)][0];
-               *val2 = st->scale_avail[AD7192_CONF_GAIN(st->conf)][1];
-               mutex_unlock(&indio_dev->mlock);
-               return IIO_VAL_INT_PLUS_NANO;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
-               *val =  1000;
-               return IIO_VAL_INT;
+       case IIO_CHAN_INFO_SCALE:
+               switch (chan->type) {
+               case IIO_VOLTAGE:
+                       mutex_lock(&indio_dev->mlock);
+                       *val = st->scale_avail[AD7192_CONF_GAIN(st->conf)][0];
+                       *val2 = st->scale_avail[AD7192_CONF_GAIN(st->conf)][1];
+                       mutex_unlock(&indio_dev->mlock);
+                       return IIO_VAL_INT_PLUS_NANO;
+               case IIO_TEMP:
+                       *val =  1000;
+                       return IIO_VAL_INT;
+               default:
+                       return -EINVAL;
+               }
        }
  
        return -EINVAL;
@@@ -935,7 -919,7 +919,7 @@@ static int ad7192_write_raw(struct iio_
        }
  
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                ret = -EINVAL;
                for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++)
                        if (val2 == st->scale_avail[i][1]) {
@@@ -992,7 -976,7 +976,7 @@@ static const struct iio_info ad7192_inf
          .extend_name = _name,                                         \
          .channel = _chan,                                             \
          .channel2 = _chan2,                                           \
-         .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),               \
+         .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,          \
          .address = _address,                                          \
          .scan_index = _si,                                            \
          .scan_type =  IIO_ST('s', 24, 32, 0)}
        { .type = IIO_VOLTAGE,                                          \
          .indexed = 1,                                                 \
          .channel = _chan,                                             \
-         .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),               \
+         .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,          \
          .address = _address,                                          \
          .scan_index = _si,                                            \
          .scan_type =  IIO_ST('s', 24, 32, 0)}
        { .type = IIO_TEMP,                                             \
          .indexed = 1,                                                 \
          .channel = _chan,                                             \
-         .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),             \
+         .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,                \
          .address = _address,                                          \
          .scan_index = _si,                                            \
          .scan_type =  IIO_ST('s', 24, 32, 0)}
@@@ -1151,6 -1135,7 +1135,7 @@@ static const struct spi_device_id ad719
        {"ad7195", ID_AD7195},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad7192_id);
  
  static struct spi_driver ad7192_driver = {
        .driver = {
        .remove         = __devexit_p(ad7192_remove),
        .id_table       = ad7192_id,
  };
 -
 -static int __init ad7192_init(void)
 -{
 -      return spi_register_driver(&ad7192_driver);
 -}
 -module_init(ad7192_init);
 -
 -static void __exit ad7192_exit(void)
 -{
 -      spi_unregister_driver(&ad7192_driver);
 -}
 -module_exit(ad7192_exit);
 +module_spi_driver(ad7192_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD7190, AD7192, AD7195 ADC");
index dbaeae81e8733c3115e3220a12fbedae8c6b4594,941db3a555020e3ef98c515357525f485bc546fb..7dbd6812c24061407044b45edd9bebdcaff536dc
@@@ -18,6 -18,7 +18,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
+ #include "../events.h"
  
  #include "ad7280a.h"
  
@@@ -455,10 -456,10 +456,10 @@@ static ssize_t ad7280_store_balance_tim
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
        struct ad7280_state *st = iio_priv(indio_dev);
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-       long val;
+       unsigned long val;
        int ret;
  
-       ret = strict_strtoul(buf, 10, &val);
+       ret = kstrtoul(buf, 10, &val);
        if (ret)
                return ret;
  
@@@ -487,8 -488,8 +488,8 @@@ static int ad7280_channel_init(struct a
  {
        int dev, ch, cnt;
  
-       st->channels = kzalloc(sizeof(*st->channels) *
-                               ((st->slave_num + 1) * 12 + 2), GFP_KERNEL);
+       st->channels = kcalloc((st->slave_num + 1) * 12 + 2,
+                              sizeof(*st->channels), GFP_KERNEL);
        if (st->channels == NULL)
                return -ENOMEM;
  
                        }
                        st->channels[cnt].indexed = 1;
                        st->channels[cnt].info_mask =
-                               (1 << IIO_CHAN_INFO_SCALE_SHARED);
+                               IIO_CHAN_INFO_SCALE_SHARED_BIT;
                        st->channels[cnt].address =
                                AD7280A_DEVADDR(dev) << 8 | ch;
                        st->channels[cnt].scan_index = cnt;
        st->channels[cnt].channel2 = dev * 6;
        st->channels[cnt].address = AD7280A_ALL_CELLS;
        st->channels[cnt].indexed = 1;
-       st->channels[cnt].info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED);
+       st->channels[cnt].info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT;
        st->channels[cnt].scan_index = cnt;
        st->channels[cnt].scan_type.sign = 'u';
        st->channels[cnt].scan_type.realbits = 32;
@@@ -600,7 -601,7 +601,7 @@@ static ssize_t ad7280_read_channel_conf
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
        unsigned val;
  
-       switch (this_attr->address) {
+       switch ((u32) this_attr->address) {
        case AD7280A_CELL_OVERVOLTAGE:
                val = 1000 + (st->cell_threshhigh * 1568) / 100;
                break;
@@@ -636,7 -637,7 +637,7 @@@ static ssize_t ad7280_write_channel_con
        if (ret)
                return ret;
  
-       switch (this_attr->address) {
+       switch ((u32) this_attr->address) {
        case AD7280A_CELL_OVERVOLTAGE:
        case AD7280A_CELL_UNDERVOLTAGE:
                val = ((val - 1000) * 100) / 1568; /* LSB 15.68mV */
        val = clamp(val, 0L, 0xFFL);
  
        mutex_lock(&indio_dev->mlock);
-       switch (this_attr->address) {
+       switch ((u32) this_attr->address) {
        case AD7280A_CELL_OVERVOLTAGE:
                st->cell_threshhigh = val;
                break;
@@@ -682,13 -683,13 +683,13 @@@ static irqreturn_t ad7280_event_handler
        unsigned *channels;
        int i, ret;
  
-       channels = kzalloc(sizeof(*channels) * st->scan_cnt, GFP_KERNEL);
+       channels = kcalloc(st->scan_cnt, sizeof(*channels), GFP_KERNEL);
        if (channels == NULL)
                return IRQ_HANDLED;
  
        ret = ad7280_read_all_channels(st, st->scan_cnt, channels);
        if (ret < 0)
-               return IRQ_HANDLED;
+               goto out;
  
        for (i = 0; i < st->scan_cnt; i++) {
                if (((channels[i] >> 23) & 0xF) <= AD7280A_CELL_VOLTAGE_6) {
                }
        }
  
+ out:
        kfree(channels);
  
        return IRQ_HANDLED;
@@@ -801,7 -803,7 +803,7 @@@ static int ad7280_read_raw(struct iio_d
                *val = ret;
  
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                if ((chan->address & 0xFF) <= AD7280A_CELL_VOLTAGE_6)
                        scale_uv = (4000 * 1000) >> AD7280A_BITS;
                else
@@@ -968,18 -970,29 +970,18 @@@ static const struct spi_device_id ad728
        {"ad7280a", 0},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad7280_id);
  
  static struct spi_driver ad7280_driver = {
        .driver = {
                .name   = "ad7280",
-               .bus    = &spi_bus_type,
                .owner  = THIS_MODULE,
        },
        .probe          = ad7280_probe,
        .remove         = __devexit_p(ad7280_remove),
        .id_table       = ad7280_id,
  };
 -
 -static int __init ad7280_init(void)
 -{
 -      return spi_register_driver(&ad7280_driver);
 -}
 -module_init(ad7280_init);
 -
 -static void __exit ad7280_exit(void)
 -{
 -      spi_unregister_driver(&ad7280_driver);
 -}
 -module_exit(ad7280_exit);
 +module_spi_driver(ad7280_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD7280A");
index aa44a52a7adbaf6632921da62d86c562218c566f,c4977a78b4295a878161c923bbf1bb25319c517c..0a13616e3db91e1ebabb8dba315bb576e2f4bb92
@@@ -19,6 -19,7 +19,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
+ #include "../events.h"
  
  /*
   * Simplified handling
@@@ -500,7 -501,7 +501,7 @@@ static int ad7291_read_raw(struct iio_d
                default:
                        return -EINVAL;
                }
-       case (1 << IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE):
+       case IIO_CHAN_INFO_AVERAGE_RAW:
                ret = i2c_smbus_read_word_data(chip->client,
                                               AD7291_T_AVERAGE);
                        if (ret < 0)
                                AD7291_VALUE_MASK) << 4) >> 4;
                        *val = signval;
                        return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
-               scale_uv = (chip->int_vref_mv * 1000) >> AD7291_BITS;
-               *val =  scale_uv / 1000;
-               *val2 = (scale_uv % 1000) * 1000;
-               return IIO_VAL_INT_PLUS_MICRO;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
-               /*
-               * One LSB of the ADC corresponds to 0.25 deg C.
-               * The temperature reading is in 12-bit twos complement format
-               */
-               *val = 250;
-               return IIO_VAL_INT;
+       case IIO_CHAN_INFO_SCALE:
+               switch (chan->type) {
+               case IIO_VOLTAGE:
+                       scale_uv = (chip->int_vref_mv * 1000) >> AD7291_BITS;
+                       *val =  scale_uv / 1000;
+                       *val2 = (scale_uv % 1000) * 1000;
+                       return IIO_VAL_INT_PLUS_MICRO;
+               case IIO_TEMP:
+                       /*
+                        * One LSB of the ADC corresponds to 0.25 deg C.
+                        * The temperature reading is in 12-bit twos
+                        * complement format
+                        */
+                       *val = 250;
+                       return IIO_VAL_INT;
+               default:
+                       return -EINVAL;
+               }
        default:
                return -EINVAL;
        }
  #define AD7291_VOLTAGE_CHAN(_chan)                                    \
  {                                                                     \
        .type = IIO_VOLTAGE,                                            \
-       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),                 \
+       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,                    \
        .indexed = 1,                                                   \
        .channel = _chan,                                               \
        .event_mask = IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING)|\
@@@ -547,8 -554,8 +554,8 @@@ static const struct iio_chan_spec ad729
        AD7291_VOLTAGE_CHAN(7),
        {
                .type = IIO_TEMP,
-               .info_mask = (1 << IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE) |
-                               (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE_BIT |
+                               IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .indexed = 1,
                .channel = 0,
                .event_mask =
@@@ -700,8 -707,20 +707,8 @@@ static struct i2c_driver ad7291_driver 
        .remove = __devexit_p(ad7291_remove),
        .id_table = ad7291_id,
  };
 -
 -static __init int ad7291_init(void)
 -{
 -      return i2c_add_driver(&ad7291_driver);
 -}
 -
 -static __exit void ad7291_exit(void)
 -{
 -      i2c_del_driver(&ad7291_driver);
 -}
 +module_i2c_driver(ad7291_driver);
  
  MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
  MODULE_DESCRIPTION("Analog Devices AD7291 ADC driver");
  MODULE_LICENSE("GPL v2");
 -
 -module_init(ad7291_init);
 -module_exit(ad7291_exit);
index a799bd1922dccdcb7900a30895dce5f9c2cd5b54,a8341f2ce914c310b3f2915ad8761dcda36a512c..8dd6aa9cf9287e2b6dc5f7d8537c43665c35eae2
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  
  #include "ad7298.h"
  
  static struct iio_chan_spec ad7298_channels[] = {
        IIO_CHAN(IIO_TEMP, 0, 1, 0, NULL, 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 9, AD7298_CH_TEMP, IIO_ST('s', 32, 32, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 0, 0, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 1, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 1, 1, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 2, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 2, 2, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 3, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 3, 3, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 4, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 4, 4, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 5, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 5, 5, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 6, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 6, 6, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 7, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 7, 7, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN_SOFT_TIMESTAMP(8),
  };
@@@ -69,27 -69,28 +69,28 @@@ static int ad7298_scan_direct(struct ad
  static int ad7298_scan_temp(struct ad7298_state *st, int *val)
  {
        int tmp, ret;
+       __be16 buf;
  
-       tmp = cpu_to_be16(AD7298_WRITE | AD7298_TSENSE |
+       buf = cpu_to_be16(AD7298_WRITE | AD7298_TSENSE |
                          AD7298_TAVG | st->ext_ref);
  
-       ret = spi_write(st->spi, (u8 *)&tmp, 2);
+       ret = spi_write(st->spi, (u8 *)&buf, 2);
        if (ret)
                return ret;
  
-       tmp = 0;
+       buf = cpu_to_be16(0);
  
-       ret = spi_write(st->spi, (u8 *)&tmp, 2);
+       ret = spi_write(st->spi, (u8 *)&buf, 2);
        if (ret)
                return ret;
  
        usleep_range(101, 1000); /* sleep > 100us */
  
-       ret = spi_read(st->spi, (u8 *)&tmp, 2);
+       ret = spi_read(st->spi, (u8 *)&buf, 2);
        if (ret)
                return ret;
  
-       tmp = be16_to_cpu(tmp) & RES_MASK(AD7298_BITS);
+       tmp = be16_to_cpu(buf) & RES_MASK(AD7298_BITS);
  
        /*
         * One LSB of the ADC corresponds to 0.25 deg C.
@@@ -122,12 -123,8 +123,8 @@@ static int ad7298_read_raw(struct iio_d
        switch (m) {
        case 0:
                mutex_lock(&indio_dev->mlock);
-               if (iio_buffer_enabled(indio_dev)) {
-                       if (chan->address == AD7298_CH_TEMP)
-                               ret = -ENODEV;
-                       else
-                               ret = ad7298_scan_from_ring(indio_dev,
-                                                           chan->address);
+               if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
+                       ret = -EBUSY;
                } else {
                        if (chan->address == AD7298_CH_TEMP)
                                ret = ad7298_scan_temp(st, val);
                        *val = ret & RES_MASK(AD7298_BITS);
  
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
-               scale_uv = (st->int_vref_mv * 1000) >> AD7298_BITS;
-               *val =  scale_uv / 1000;
-               *val2 = (scale_uv % 1000) * 1000;
-               return IIO_VAL_INT_PLUS_MICRO;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
-               *val =  1;
-               *val2 = 0;
-               return IIO_VAL_INT_PLUS_MICRO;
+       case IIO_CHAN_INFO_SCALE:
+               switch (chan->type) {
+               case IIO_VOLTAGE:
+                       scale_uv = (st->int_vref_mv * 1000) >> AD7298_BITS;
+                       *val =  scale_uv / 1000;
+                       *val2 = (scale_uv % 1000) * 1000;
+                       return IIO_VAL_INT_PLUS_MICRO;
+               case IIO_TEMP:
+                       *val =  1;
+                       *val2 = 0;
+                       return IIO_VAL_INT_PLUS_MICRO;
+               default:
+                       return -EINVAL;
+               }
        }
        return -EINVAL;
  }
@@@ -265,20 -267,30 +267,19 @@@ static const struct spi_device_id ad729
        {"ad7298", 0},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad7298_id);
  
  static struct spi_driver ad7298_driver = {
        .driver = {
                .name   = "ad7298",
-               .bus    = &spi_bus_type,
                .owner  = THIS_MODULE,
        },
        .probe          = ad7298_probe,
        .remove         = __devexit_p(ad7298_remove),
        .id_table       = ad7298_id,
  };
 -
 -static int __init ad7298_init(void)
 -{
 -      return spi_register_driver(&ad7298_driver);
 -}
 -module_init(ad7298_init);
 -
 -static void __exit ad7298_exit(void)
 -{
 -      spi_unregister_driver(&ad7298_driver);
 -}
 -module_exit(ad7298_exit);
 +module_spi_driver(ad7298_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD7298 ADC");
  MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("spi:ad7298");
index 0b5852030ab665842c5d6829bc584600da112a87,be0297903c62e81ca9bf658d5182008097eb8f89..0c064d1c3927d0c764f4b6b65afccfb7fb5e009b
@@@ -17,7 -17,7 +17,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  
  #include "ad7476.h"
  
@@@ -46,7 -46,7 +46,7 @@@ static int ad7476_read_raw(struct iio_d
        case 0:
                mutex_lock(&indio_dev->mlock);
                if (iio_buffer_enabled(indio_dev))
-                       ret = ad7476_scan_from_ring(indio_dev);
+                       ret = -EBUSY;
                else
                        ret = ad7476_scan_direct(st);
                mutex_unlock(&indio_dev->mlock);
@@@ -56,7 -56,7 +56,7 @@@
                *val = (ret >> st->chip_info->channel[0].scan_type.shift) &
                        RES_MASK(st->chip_info->channel[0].scan_type.realbits);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                scale_uv = (st->int_vref_mv * 1000)
                        >> st->chip_info->channel[0].scan_type.realbits;
                *val =  scale_uv/1000;
  static const struct ad7476_chip_info ad7476_chip_info_tbl[] = {
        [ID_AD7466] = {
                .channel[0] = IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 0, 0,
-                                      (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                                      IIO_CHAN_INFO_SCALE_SHARED_BIT,
                                       0, 0, IIO_ST('u', 12, 16, 0), 0),
                .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
        },
        [ID_AD7467] = {
                .channel[0] = IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 0, 0,
-                                      (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                                      IIO_CHAN_INFO_SCALE_SHARED_BIT,
                                       0, 0, IIO_ST('u', 10, 16, 2), 0),
                .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
        },
        [ID_AD7468] = {
                .channel[0] = IIO_CHAN(IIO_VOLTAGE, 0, 1 , 0, NULL, 0, 0,
-                                      (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                                      IIO_CHAN_INFO_SCALE_SHARED_BIT,
                                       0, 0, IIO_ST('u', 8, 16, 4), 0),
                .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
        },
        [ID_AD7475] = {
                .channel[0] = IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 0, 0,
-                                      (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                                      IIO_CHAN_INFO_SCALE_SHARED_BIT,
                                       0, 0, IIO_ST('u', 12, 16, 0), 0),
                .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
        },
        [ID_AD7476] = {
                .channel[0] = IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 0, 0,
-                                      (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                                      IIO_CHAN_INFO_SCALE_SHARED_BIT,
                                       0, 0, IIO_ST('u', 12, 16, 0), 0),
                .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
        },
        [ID_AD7477] = {
                .channel[0] = IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 0, 0,
-                                      (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                                      IIO_CHAN_INFO_SCALE_SHARED_BIT,
                                       0, 0, IIO_ST('u', 10, 16, 2), 0),
                .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
        },
        [ID_AD7478] = {
                .channel[0] = IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 0, 0,
-                                      (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                                      IIO_CHAN_INFO_SCALE_SHARED_BIT,
                                       0, 0, IIO_ST('u', 8, 16, 4), 0),
                .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
        },
        [ID_AD7495] = {
                .channel[0] = IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 0, 0,
-                                      (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                                      IIO_CHAN_INFO_SCALE_SHARED_BIT,
                                       0, 0, IIO_ST('u', 12, 16, 0), 0),
                .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
                .int_vref_mv = 2500,
@@@ -237,20 -237,30 +237,19 @@@ static const struct spi_device_id ad747
        {"ad7495", ID_AD7495},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad7476_id);
  
  static struct spi_driver ad7476_driver = {
        .driver = {
                .name   = "ad7476",
-               .bus    = &spi_bus_type,
                .owner  = THIS_MODULE,
        },
        .probe          = ad7476_probe,
        .remove         = __devexit_p(ad7476_remove),
        .id_table       = ad7476_id,
  };
 -
 -static int __init ad7476_init(void)
 -{
 -      return spi_register_driver(&ad7476_driver);
 -}
 -module_init(ad7476_init);
 -
 -static void __exit ad7476_exit(void)
 -{
 -      spi_unregister_driver(&ad7476_driver);
 -}
 -module_exit(ad7476_exit);
 +module_spi_driver(ad7476_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD7475/6/7/8(A) AD7466/7/8 ADC");
  MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("spi:ad7476");
index b984bd2048b6eca3cdce2d69296163a14e74d5dc,98e6e49a2874c1010d58bfe3f16978d60744aace..237f1c44d296ce942b8e0c4cdcdc6fb079b3cc14
@@@ -97,11 -97,11 +97,11 @@@ static const struct spi_device_id ad760
        {"ad7606-4", ID_AD7606_4},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad7606_id);
  
  static struct spi_driver ad7606_driver = {
        .driver = {
                .name = "ad7606",
-               .bus = &spi_bus_type,
                .owner = THIS_MODULE,
                .pm    = AD7606_SPI_PM_OPS,
        },
        .remove = __devexit_p(ad7606_spi_remove),
        .id_table = ad7606_id,
  };
 -
 -static int __init ad7606_spi_init(void)
 -{
 -      return spi_register_driver(&ad7606_driver);
 -}
 -module_init(ad7606_spi_init);
 -
 -static void __exit ad7606_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad7606_driver);
 -}
 -module_exit(ad7606_spi_exit);
 +module_spi_driver(ad7606_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD7606 ADC");
  MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("spi:ad7606_spi");
index ec90261cbc3ccb8e3ea3f884e7d2e11c63176f01,5665deeadce7f7c503fc8ded59e00ec0b11d5c67..a13e58c814e66f19b5c1a66eb8454100371ca77b
@@@ -114,7 -114,7 +114,7 @@@ static int ad7780_read_raw(struct iio_d
                        *val *= 128;
  
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                scale_uv = (st->int_vref_mv * 100000)
                        >> (channel.scan_type.realbits - 1);
                *val =  scale_uv / 100000;
  static const struct ad7780_chip_info ad7780_chip_info_tbl[] = {
        [ID_AD7780] = {
                .channel = IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 0, 0,
-                                   (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                                   IIO_CHAN_INFO_SCALE_SHARED_BIT,
                                    0, 0, IIO_ST('s', 24, 32, 8), 0),
        },
        [ID_AD7781] = {
                .channel = IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 0, 0,
-                                   (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                                   IIO_CHAN_INFO_SCALE_SHARED_BIT,
                                    0, 0, IIO_ST('s', 20, 32, 12), 0),
        },
  };
@@@ -272,18 -272,29 +272,18 @@@ static const struct spi_device_id ad778
        {"ad7781", ID_AD7781},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad7780_id);
  
  static struct spi_driver ad7780_driver = {
        .driver = {
                .name   = "ad7780",
-               .bus    = &spi_bus_type,
                .owner  = THIS_MODULE,
        },
        .probe          = ad7780_probe,
        .remove         = __devexit_p(ad7780_remove),
        .id_table       = ad7780_id,
  };
 -
 -static int __init ad7780_init(void)
 -{
 -      return spi_register_driver(&ad7780_driver);
 -}
 -module_init(ad7780_init);
 -
 -static void __exit ad7780_exit(void)
 -{
 -      spi_unregister_driver(&ad7780_driver);
 -}
 -module_exit(ad7780_exit);
 +module_spi_driver(ad7780_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD7780/1 ADC");
index 1c5588e88cdfd75726e4fd9e53399d30b3caec5f,4047c5d205e19a6a4fb9336e12c7fdf0715eed66..38262e59193411cb2a85b49dd4953400dd862953
@@@ -20,7 -20,7 +20,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  #include "../ring_sw.h"
  #include "../trigger.h"
  #include "../trigger_consumer.h"
@@@ -316,25 -316,6 +316,6 @@@ out
        return ret;
  }
  
- static int ad7793_scan_from_ring(struct ad7793_state *st, unsigned ch, int *val)
- {
-       struct iio_buffer *ring = iio_priv_to_dev(st)->buffer;
-       int ret;
-       s64 dat64[2];
-       u32 *dat32 = (u32 *)dat64;
-       if (!(test_bit(ch, ring->scan_mask)))
-               return  -EBUSY;
-       ret = ring->access->read_last(ring, (u8 *) &dat64);
-       if (ret)
-               return ret;
-       *val = *dat32;
-       return 0;
- }
  static int ad7793_ring_preenable(struct iio_dev *indio_dev)
  {
        struct ad7793_state *st = iio_priv(indio_dev);
        size_t d_size;
        unsigned channel;
  
-       if (!ring->scan_count)
+       if (bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
                return -EINVAL;
  
-       channel = find_first_bit(ring->scan_mask,
+       channel = find_first_bit(indio_dev->active_scan_mask,
                                 indio_dev->masklength);
  
-       d_size = ring->scan_count *
-                indio_dev->channels[0].scan_type.storagebits / 8;
+       d_size = bitmap_weight(indio_dev->active_scan_mask,
+                              indio_dev->masklength) *
+               indio_dev->channels[0].scan_type.storagebits / 8;
  
        if (ring->scan_timestamp) {
                d_size += sizeof(s64);
@@@ -411,7 -393,7 +393,7 @@@ static irqreturn_t ad7793_trigger_handl
        s64 dat64[2];
        s32 *dat32 = (s32 *)dat64;
  
-       if (ring->scan_count)
+       if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
                __ad7793_read_reg(st, 1, 1, AD7793_REG_DATA,
                                  dat32,
                                  indio_dev->channels[0].scan_type.realbits/8);
@@@ -459,7 -441,7 +441,7 @@@ static int ad7793_register_ring_funcs_a
        }
  
        /* Ring buffer functions - here trigger setup related */
-       indio_dev->buffer->setup_ops = &ad7793_ring_setup_ops;
+       indio_dev->setup_ops = &ad7793_ring_setup_ops;
  
        /* Flag that polled ring buffering is possible */
        indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
@@@ -649,8 -631,7 +631,7 @@@ static int ad7793_read_raw(struct iio_d
        case 0:
                mutex_lock(&indio_dev->mlock);
                if (iio_buffer_enabled(indio_dev))
-                       ret = ad7793_scan_from_ring(st,
-                                       chan->scan_index, &smpl);
+                       ret = -EBUSY;
                else
                        ret = ad7793_read(st, chan->address,
                                        chan->scan_type.realbits / 8, &smpl);
  
                return IIO_VAL_INT;
  
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
-               *val = st->scale_avail[(st->conf >> 8) & 0x7][0];
-               *val2 = st->scale_avail[(st->conf >> 8) & 0x7][1];
-               return IIO_VAL_INT_PLUS_NANO;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
+       case IIO_CHAN_INFO_SCALE:
                switch (chan->type) {
                case IIO_VOLTAGE:
-                       /* 1170mV / 2^23 * 6 */
-                       scale_uv = (1170ULL * 100000000ULL * 6ULL)
-                               >> (chan->scan_type.realbits -
-                               (unipolar ? 0 : 1));
+                       if (chan->differential) {
+                               *val = st->
+                                       scale_avail[(st->conf >> 8) & 0x7][0];
+                               *val2 = st->
+                                       scale_avail[(st->conf >> 8) & 0x7][1];
+                               return IIO_VAL_INT_PLUS_NANO;
+                       } else {
+                               /* 1170mV / 2^23 * 6 */
+                               scale_uv = (1170ULL * 100000000ULL * 6ULL)
+                                       >> (chan->scan_type.realbits -
+                                           (unipolar ? 0 : 1));
+                       }
                        break;
                case IIO_TEMP:
                        /* Always uses unity gain and internal ref */
@@@ -716,7 -699,7 +699,7 @@@ static int ad7793_write_raw(struct iio_
        }
  
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                ret = -EINVAL;
                for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++)
                        if (val2 == st->scale_avail[i][1]) {
@@@ -775,7 -758,7 +758,7 @@@ static const struct ad7793_chip_info ad
                        .channel = 0,
                        .channel2 = 0,
                        .address = AD7793_CH_AIN1P_AIN1M,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                        .scan_index = 0,
                        .scan_type = IIO_ST('s', 24, 32, 0)
                },
                        .channel = 1,
                        .channel2 = 1,
                        .address = AD7793_CH_AIN2P_AIN2M,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                        .scan_index = 1,
                        .scan_type = IIO_ST('s', 24, 32, 0)
                },
                        .channel = 2,
                        .channel2 = 2,
                        .address = AD7793_CH_AIN3P_AIN3M,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                        .scan_index = 2,
                        .scan_type = IIO_ST('s', 24, 32, 0)
                },
                        .channel = 2,
                        .channel2 = 2,
                        .address = AD7793_CH_AIN1M_AIN1M,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                        .scan_index = 2,
                        .scan_type = IIO_ST('s', 24, 32, 0)
                },
                        .indexed = 1,
                        .channel = 0,
                        .address = AD7793_CH_TEMP,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                        .scan_index = 4,
                        .scan_type = IIO_ST('s', 24, 32, 0),
                },
                        .indexed = 1,
                        .channel = 4,
                        .address = AD7793_CH_AVDD_MONITOR,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                        .scan_index = 5,
                        .scan_type = IIO_ST('s', 24, 32, 0),
                },
                        .channel = 0,
                        .channel2 = 0,
                        .address = AD7793_CH_AIN1P_AIN1M,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                        .scan_index = 0,
                        .scan_type = IIO_ST('s', 16, 32, 0)
                },
                        .channel = 1,
                        .channel2 = 1,
                        .address = AD7793_CH_AIN2P_AIN2M,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                        .scan_index = 1,
                        .scan_type = IIO_ST('s', 16, 32, 0)
                },
                        .channel = 2,
                        .channel2 = 2,
                        .address = AD7793_CH_AIN3P_AIN3M,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                        .scan_index = 2,
                        .scan_type = IIO_ST('s', 16, 32, 0)
                },
                        .channel = 2,
                        .channel2 = 2,
                        .address = AD7793_CH_AIN1M_AIN1M,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                        .scan_index = 2,
                        .scan_type = IIO_ST('s', 16, 32, 0)
                },
                        .indexed = 1,
                        .channel = 0,
                        .address = AD7793_CH_TEMP,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                        .scan_index = 4,
                        .scan_type = IIO_ST('s', 16, 32, 0),
                },
                        .indexed = 1,
                        .channel = 4,
                        .address = AD7793_CH_AVDD_MONITOR,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                        .scan_index = 5,
                        .scan_type = IIO_ST('s', 16, 32, 0),
                },
@@@ -1034,18 -1017,29 +1017,18 @@@ static const struct spi_device_id ad779
        {"ad7793", ID_AD7793},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad7793_id);
  
  static struct spi_driver ad7793_driver = {
        .driver = {
                .name   = "ad7793",
-               .bus    = &spi_bus_type,
                .owner  = THIS_MODULE,
        },
        .probe          = ad7793_probe,
        .remove         = __devexit_p(ad7793_remove),
        .id_table       = ad7793_id,
  };
 -
 -static int __init ad7793_init(void)
 -{
 -      return spi_register_driver(&ad7793_driver);
 -}
 -module_init(ad7793_init);
 -
 -static void __exit ad7793_exit(void)
 -{
 -      spi_unregister_driver(&ad7793_driver);
 -}
 -module_exit(ad7793_exit);
 +module_spi_driver(ad7793_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD7792/3 ADC");
index acbf9363132b1723c043bb6e1ddaee5aedeaa4a1,a38a1a931a661206e0c75853b8d21c530e6bfb0b..52b720e2b03a422ef86a85bc20224b712a3613b7
@@@ -18,6 -18,7 +18,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
+ #include "../events.h"
  
  /*
   * AD7816 config masks
@@@ -459,16 -460,27 +460,15 @@@ MODULE_DEVICE_TABLE(spi, ad7816_id)
  static struct spi_driver ad7816_driver = {
        .driver = {
                .name = "ad7816",
-               .bus = &spi_bus_type,
                .owner = THIS_MODULE,
        },
        .probe = ad7816_probe,
        .remove = __devexit_p(ad7816_remove),
        .id_table = ad7816_id,
  };
 -
 -static __init int ad7816_init(void)
 -{
 -      return spi_register_driver(&ad7816_driver);
 -}
 -
 -static __exit void ad7816_exit(void)
 -{
 -      spi_unregister_driver(&ad7816_driver);
 -}
 +module_spi_driver(ad7816_driver);
  
  MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
  MODULE_DESCRIPTION("Analog Devices AD7816/7/8 digital"
                        " temperature sensor driver");
  MODULE_LICENSE("GPL v2");
 -
 -module_init(ad7816_init);
 -module_exit(ad7816_exit);
index 91b8fb09d92bd39989a7288d8d1d4b46534a7eff,db7e91fbdc70498ab4734876bd217a79d663aa38..e9bbc3eed15d9a72af9f05fd4f25a8ecc980c528
@@@ -17,7 -17,7 +17,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  
  
  #include "ad7887.h"
@@@ -45,7 -45,7 +45,7 @@@ static int ad7887_read_raw(struct iio_d
        case 0:
                mutex_lock(&indio_dev->mlock);
                if (iio_buffer_enabled(indio_dev))
-                       ret = ad7887_scan_from_ring(st, 1 << chan->address);
+                       ret = -EBUSY;
                else
                        ret = ad7887_scan_direct(st, chan->address);
                mutex_unlock(&indio_dev->mlock);
@@@ -55,7 -55,7 +55,7 @@@
                *val = (ret >> st->chip_info->channel[0].scan_type.shift) &
                        RES_MASK(st->chip_info->channel[0].scan_type.realbits);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                scale_uv = (st->int_vref_mv * 1000)
                        >> st->chip_info->channel[0].scan_type.realbits;
                *val =  scale_uv/1000;
@@@ -75,7 -75,7 +75,7 @@@ static const struct ad7887_chip_info ad
                        .type = IIO_VOLTAGE,
                        .indexed = 1,
                        .channel = 1,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                        .address = 1,
                        .scan_index = 1,
                        .scan_type = IIO_ST('u', 12, 16, 0),
@@@ -84,7 -84,7 +84,7 @@@
                        .type = IIO_VOLTAGE,
                        .indexed = 1,
                        .channel = 0,
-                       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                        .address = 0,
                        .scan_index = 0,
                        .scan_type = IIO_ST('u', 12, 16, 0),
@@@ -246,20 -246,30 +246,19 @@@ static const struct spi_device_id ad788
        {"ad7887", ID_AD7887},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad7887_id);
  
  static struct spi_driver ad7887_driver = {
        .driver = {
                .name   = "ad7887",
-               .bus    = &spi_bus_type,
                .owner  = THIS_MODULE,
        },
        .probe          = ad7887_probe,
        .remove         = __devexit_p(ad7887_remove),
        .id_table       = ad7887_id,
  };
 -
 -static int __init ad7887_init(void)
 -{
 -      return spi_register_driver(&ad7887_driver);
 -}
 -module_init(ad7887_init);
 -
 -static void __exit ad7887_exit(void)
 -{
 -      spi_unregister_driver(&ad7887_driver);
 -}
 -module_exit(ad7887_exit);
 +module_spi_driver(ad7887_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD7887 ADC");
  MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("spi:ad7887");
index c0d2f886ea2c23dcf7e2b11bb341750f54392394,815e6b9a8d4beab58b1037b26e8667785c0e0f16..d5b581d8bc2bf11a7c08d9b045e60825f6cfed8d
@@@ -35,7 -35,8 +35,8 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../events.h"
+ #include "../buffer.h"
  
  #include "ad799x.h"
  
@@@ -150,8 -151,7 +151,7 @@@ static int ad799x_read_raw(struct iio_d
        case 0:
                mutex_lock(&indio_dev->mlock);
                if (iio_buffer_enabled(indio_dev))
-                       ret = ad799x_single_channel_from_ring(indio_dev,
-                                                             chan->scan_index);
+                       ret = -EBUSY;
                else
                        ret = ad799x_scan_direct(st, chan->scan_index);
                mutex_unlock(&indio_dev->mlock);
                *val = (ret >> chan->scan_type.shift) &
                        RES_MASK(chan->scan_type.realbits);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                scale_uv = (st->int_vref_mv * 1000) >> chan->scan_type.realbits;
                *val =  scale_uv / 1000;
                *val2 = (scale_uv % 1000) * 1000;
@@@ -929,9 -929,20 +929,8 @@@ static struct i2c_driver ad799x_driver 
        .remove = __devexit_p(ad799x_remove),
        .id_table = ad799x_id,
  };
 -
 -static __init int ad799x_init(void)
 -{
 -      return i2c_add_driver(&ad799x_driver);
 -}
 -
 -static __exit void ad799x_exit(void)
 -{
 -      i2c_del_driver(&ad799x_driver);
 -}
 +module_i2c_driver(ad799x_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD799x ADC");
  MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("i2c:ad799x");
 -
 -module_init(ad799x_init);
 -module_exit(ad799x_exit);
index bc307f3b024e4ed71146463854f797e7e31687b7,ea9fd43460c8412d54086d1ccd51fa9256192eef..eec2f325d5494dfaa52c4b32bd4b6aa46d7214a1
@@@ -17,7 -17,7 +17,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
+ #include "../events.h"
  /*
   * ADT7310 registers definition
   */
@@@ -877,16 -877,27 +877,15 @@@ MODULE_DEVICE_TABLE(spi, adt7310_id)
  static struct spi_driver adt7310_driver = {
        .driver = {
                .name = "adt7310",
-               .bus = &spi_bus_type,
                .owner = THIS_MODULE,
        },
        .probe = adt7310_probe,
        .remove = __devexit_p(adt7310_remove),
        .id_table = adt7310_id,
  };
 -
 -static __init int adt7310_init(void)
 -{
 -      return spi_register_driver(&adt7310_driver);
 -}
 -
 -static __exit void adt7310_exit(void)
 -{
 -      spi_unregister_driver(&adt7310_driver);
 -}
 +module_spi_driver(adt7310_driver);
  
  MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
  MODULE_DESCRIPTION("Analog Devices ADT7310 digital"
                        " temperature sensor driver");
  MODULE_LICENSE("GPL v2");
 -
 -module_init(adt7310_init);
 -module_exit(adt7310_exit);
index 3481cf6f757423d74f0c6a6c389114f73b8a6fc0,16467a7ef4a4ea949ff3983ddb9311e65e215943..c62248ceb37a2d4af88806d347e699a2181f494f
@@@ -17,6 -17,7 +17,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
+ #include "../events.h"
  
  /*
   * ADT7410 registers definition
@@@ -844,9 -845,21 +845,9 @@@ static struct i2c_driver adt7410_drive
        .remove = __devexit_p(adt7410_remove),
        .id_table = adt7410_id,
  };
 -
 -static __init int adt7410_init(void)
 -{
 -      return i2c_add_driver(&adt7410_driver);
 -}
 -
 -static __exit void adt7410_exit(void)
 -{
 -      i2c_del_driver(&adt7410_driver);
 -}
 +module_i2c_driver(adt7410_driver);
  
  MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
  MODULE_DESCRIPTION("Analog Devices ADT7410 digital"
                        " temperature sensor driver");
  MODULE_LICENSE("GPL v2");
 -
 -module_init(adt7410_init);
 -module_exit(adt7410_exit);
index 3f28f1ab52a24995813b267470eee440e6a6852d,1ce89efb1b9b26b9d369ce93ca3b3bbc71447f18..b92cb4af18ce4a3364945c02fd0ebfed4a62aa86
@@@ -34,7 -34,8 +34,8 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../events.h"
+ #include "../buffer.h"
  
  #include "max1363.h"
  
@@@ -147,7 -148,8 +148,8 @@@ static const struct max1363_mode max136
  };
  
  const struct max1363_mode
- *max1363_match_mode(unsigned long *mask, const struct max1363_chip_info *ci)
+ *max1363_match_mode(const unsigned long *mask,
+ const struct max1363_chip_info *ci)
  {
        int i;
        if (mask)
@@@ -189,7 -191,6 +191,6 @@@ static int max1363_read_single_chan(str
        int ret = 0;
        s32 data;
        char rxbuf[2];
-       const unsigned long *mask;
        struct max1363_state *st = iio_priv(indio_dev);
        struct i2c_client *client = st->client;
  
         * If monitor mode is enabled, the method for reading a single
         * channel will have to be rather different and has not yet
         * been implemented.
+        *
+        * Also, cannot read directly if buffered capture enabled.
         */
-       if (st->monitor_on) {
+       if (st->monitor_on || iio_buffer_enabled(indio_dev)) {
                ret = -EBUSY;
                goto error_ret;
        }
  
-       /* If ring buffer capture is occurring, query the buffer */
-       if (iio_buffer_enabled(indio_dev)) {
-               mask = max1363_mode_table[chan->address].modemask;
-               data = max1363_single_channel_from_ring(mask, st);
+       /* Check to see if current scan mode is correct */
+       if (st->current_mode != &max1363_mode_table[chan->address]) {
+               /* Update scan mode if needed */
+               st->current_mode = &max1363_mode_table[chan->address];
+               ret = max1363_set_scan_mode(st);
+               if (ret < 0)
+                       goto error_ret;
+       }
+       if (st->chip_info->bits != 8) {
+               /* Get reading */
+               data = i2c_master_recv(client, rxbuf, 2);
                if (data < 0) {
                        ret = data;
                        goto error_ret;
                }
+               data = (s32)(rxbuf[1]) | ((s32)(rxbuf[0] & 0x0F)) << 8;
        } else {
-               /* Check to see if current scan mode is correct */
-               if (st->current_mode != &max1363_mode_table[chan->address]) {
-                       /* Update scan mode if needed */
-                       st->current_mode = &max1363_mode_table[chan->address];
-                       ret = max1363_set_scan_mode(st);
-                       if (ret < 0)
-                               goto error_ret;
-               }
-               if (st->chip_info->bits != 8) {
-                       /* Get reading */
-                       data = i2c_master_recv(client, rxbuf, 2);
-                       if (data < 0) {
-                               ret = data;
-                               goto error_ret;
-                       }
-                       data = (s32)(rxbuf[1]) | ((s32)(rxbuf[0] & 0x0F)) << 8;
-               } else {
-                       /* Get reading */
-                       data = i2c_master_recv(client, rxbuf, 1);
-                       if (data < 0) {
-                               ret = data;
-                               goto error_ret;
-                       }
-                       data = rxbuf[0];
+               /* Get reading */
+               data = i2c_master_recv(client, rxbuf, 1);
+               if (data < 0) {
+                       ret = data;
+                       goto error_ret;
                }
+               data = rxbuf[0];
        }
        *val = data;
  error_ret:
@@@ -260,7 -253,7 +253,7 @@@ static int max1363_read_raw(struct iio_
                if (ret < 0)
                        return ret;
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                if ((1 << (st->chip_info->bits + 1)) >
                    st->chip_info->int_vref_mv) {
                        *val = 0;
@@@ -288,7 -281,7 +281,7 @@@ static const enum max1363_modes max1363
  #define MAX1363_EV_M                                          \
        (IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING)      \
         | IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING))
- #define MAX1363_INFO_MASK (1 << IIO_CHAN_INFO_SCALE_SHARED)
+ #define MAX1363_INFO_MASK IIO_CHAN_INFO_SCALE_SHARED_BIT
  #define MAX1363_CHAN_U(num, addr, si, bits, evmask)                   \
        {                                                               \
                .type = IIO_VOLTAGE,                                    \
                .channel = num,                                         \
                .address = addr,                                        \
                .info_mask = MAX1363_INFO_MASK,                         \
-               .scan_type = IIO_ST('u', bits, (bits > 8) ? 16 : 8, 0), \
+               .datasheet_name = "AIN"#num,                            \
+               .scan_type = {                                          \
+                       .sign = 'u',                                    \
+                       .realbits = bits,                               \
+                       .storagebits = (bits > 8) ? 16 : 8,             \
+                       .endianness = IIO_BE,                           \
+               },                                                      \
                .scan_index = si,                                       \
                .event_mask = evmask,                                   \
        }
                .channel2 = num2,                                       \
                .address = addr,                                        \
                .info_mask = MAX1363_INFO_MASK,                         \
-               .scan_type = IIO_ST('u', bits, (bits > 8) ? 16 : 8, 0), \
+               .datasheet_name = "AIN"#num"-AIN"#num2,                 \
+               .scan_type = {                                          \
+                       .sign = 's',                                    \
+                       .realbits = bits,                               \
+                       .storagebits = (bits > 8) ? 16 : 8,             \
+                       .endianness = IIO_BE,                           \
+               },                                                      \
                .scan_index = si,                                       \
                .event_mask = evmask,                                   \
        }
@@@ -833,6 -838,7 +838,7 @@@ static const struct iio_info max1363_in
        .read_event_config = &max1363_read_event_config,
        .write_event_config = &max1363_write_event_config,
        .read_raw = &max1363_read_raw,
+       .update_scan_mode = &max1363_update_scan_mode,
        .driver_module = THIS_MODULE,
        .event_attrs = &max1363_event_attribute_group,
  };
@@@ -1410,8 -1416,20 +1416,8 @@@ static struct i2c_driver max1363_drive
        .remove = max1363_remove,
        .id_table = max1363_id,
  };
 -
 -static __init int max1363_init(void)
 -{
 -      return i2c_add_driver(&max1363_driver);
 -}
 -
 -static __exit void max1363_exit(void)
 -{
 -      i2c_del_driver(&max1363_driver);
 -}
 +module_i2c_driver(max1363_driver);
  
  MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");
  MODULE_DESCRIPTION("Maxim 1363 ADC");
  MODULE_LICENSE("GPL v2");
 -
 -module_init(max1363_init);
 -module_exit(max1363_exit);
index 1e93c7b7aed93667bab409b8e11994c6950fcffb,1f75e1bf992a35b835c04f22928844d1617a557c..1ea3cd06299de93af117900c7e91fc40fbbefc25
@@@ -151,7 -151,6 +151,6 @@@ static int adt7316_spi_resume(struct sp
  static struct spi_driver adt7316_driver = {
        .driver = {
                .name = "adt7316",
-               .bus = &spi_bus_type,
                .owner = THIS_MODULE,
        },
        .probe = adt7316_spi_probe,
        .resume = adt7316_spi_resume,
        .id_table = adt7316_spi_id,
  };
 -
 -static __init int adt7316_spi_init(void)
 -{
 -      return spi_register_driver(&adt7316_driver);
 -}
 -
 -static __exit void adt7316_spi_exit(void)
 -{
 -      spi_unregister_driver(&adt7316_driver);
 -}
 +module_spi_driver(adt7316_driver);
  
  MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
  MODULE_DESCRIPTION("SPI bus driver for Analog Devices ADT7316/7/8 and"
                        "ADT7516/7/9 digital temperature sensor, ADC and DAC");
  MODULE_LICENSE("GPL v2");
 -
 -module_init(adt7316_spi_init);
 -module_exit(adt7316_spi_exit);
index 47181875e11326101a2aca920cc863ac06cba7ea,6bcdb147928c45743c73748d5cdaa9ee53f8561f..b73007dcf4b31c1376ed8798ab1eec81f3cc4542
@@@ -15,7 -15,7 +15,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
+ #include "../events.h"
  /*
   * AD7150 registers definition
   */
@@@ -111,7 -111,7 +111,7 @@@ static int ad7150_read_raw(struct iio_d
                        return ret;
                *val = swab16(ret);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE):
+       case IIO_CHAN_INFO_AVERAGE_RAW:
                ret = i2c_smbus_read_word_data(chip->client,
                                        ad7150_addresses[chan->channel][1]);
                if (ret < 0)
@@@ -429,7 -429,7 +429,7 @@@ static const struct iio_chan_spec ad715
                .type = IIO_CAPACITANCE,
                .indexed = 1,
                .channel = 0,
-               .info_mask = (1 << IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE_BIT,
                .event_mask =
                IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING) |
                IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING) |
                .type = IIO_CAPACITANCE,
                .indexed = 1,
                .channel = 1,
-               .info_mask = (1 << IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE_BIT,
                .event_mask =
                IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING) |
                IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING) |
@@@ -657,8 -657,20 +657,8 @@@ static struct i2c_driver ad7150_driver 
        .remove = __devexit_p(ad7150_remove),
        .id_table = ad7150_id,
  };
 -
 -static __init int ad7150_init(void)
 -{
 -      return i2c_add_driver(&ad7150_driver);
 -}
 -
 -static __exit void ad7150_exit(void)
 -{
 -      i2c_del_driver(&ad7150_driver);
 -}
 +module_i2c_driver(ad7150_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices AD7150/1/6 capacitive sensor driver");
  MODULE_LICENSE("GPL v2");
 -
 -module_init(ad7150_init);
 -module_exit(ad7150_exit);
index 152d3be6d97dfde3d6554c8303f07d7c2f9e936c,29b2dc6e4f85f8a385f88c23fd557b924fc1ea9c..fdb83c35e6dd6a6219e86ea653ae5fff6c81e252
@@@ -259,7 -259,7 +259,7 @@@ static int ad7152_write_raw(struct iio_
        mutex_lock(&indio_dev->mlock);
  
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
+       case IIO_CHAN_INFO_CALIBSCALE:
                if (val != 1) {
                        ret = -EINVAL;
                        goto out;
                ret = 0;
                break;
  
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                if ((val < 0) | (val > 0xFFFF)) {
                        ret = -EINVAL;
                        goto out;
  
                ret = 0;
                break;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
+       case IIO_CHAN_INFO_SCALE:
                if (val != 0) {
                        ret = -EINVAL;
                        goto out;
@@@ -372,7 -372,7 +372,7 @@@ static int ad7152_read_raw(struct iio_d
  
                ret = IIO_VAL_INT;
                break;
-       case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
+       case IIO_CHAN_INFO_CALIBSCALE:
  
                ret = i2c_smbus_read_word_data(chip->client,
                                ad7152_addresses[chan->channel][AD7152_GAIN]);
  
                ret = IIO_VAL_INT_PLUS_MICRO;
                break;
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                ret = i2c_smbus_read_word_data(chip->client,
                                ad7152_addresses[chan->channel][AD7152_OFFS]);
                if (ret < 0)
  
                ret = IIO_VAL_INT;
                break;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
+       case IIO_CHAN_INFO_SCALE:
                ret = i2c_smbus_read_byte_data(chip->client,
                                ad7152_addresses[chan->channel][AD7152_SETUP]);
                if (ret < 0)
@@@ -416,7 -416,7 +416,7 @@@ static int ad7152_write_raw_get_fmt(str
                               long mask)
  {
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
+       case IIO_CHAN_INFO_SCALE:
                return IIO_VAL_INT_PLUS_NANO;
        default:
                return IIO_VAL_INT_PLUS_MICRO;
@@@ -436,34 -436,34 +436,34 @@@ static const struct iio_chan_spec ad715
                .type = IIO_CAPACITANCE,
                .indexed = 1,
                .channel = 0,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) |
-               (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT |
+               IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
        }, {
                .type = IIO_CAPACITANCE,
                .differential = 1,
                .indexed = 1,
                .channel = 0,
                .channel2 = 2,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) |
-               (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT |
+               IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
        }, {
                .type = IIO_CAPACITANCE,
                .indexed = 1,
                .channel = 1,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) |
-               (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT |
+               IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
        }, {
                .type = IIO_CAPACITANCE,
                .differential = 1,
                .indexed = 1,
                .channel = 1,
                .channel2 = 3,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) |
-               (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT |
+               IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
        }
  };
  /*
@@@ -540,8 -540,20 +540,8 @@@ static struct i2c_driver ad7152_driver 
        .remove = __devexit_p(ad7152_remove),
        .id_table = ad7152_id,
  };
 -
 -static __init int ad7152_init(void)
 -{
 -      return i2c_add_driver(&ad7152_driver);
 -}
 -
 -static __exit void ad7152_exit(void)
 -{
 -      i2c_del_driver(&ad7152_driver);
 -}
 +module_i2c_driver(ad7152_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices AD7152/3 capacitive sensor driver");
  MODULE_LICENSE("GPL v2");
 -
 -module_init(ad7152_init);
 -module_exit(ad7152_exit);
index 9df590891a692a1fc348adb0db51c1f06154d3e7,de8f844dc9fc493655855a3523ebb15e718befff..40b8512cbc322b74891b5d8963e3d058494444d2
@@@ -123,7 -123,7 +123,7 @@@ static const struct iio_chan_spec ad774
                .type = IIO_VOLTAGE,
                .indexed = 1,
                .channel = 0,
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                .address = AD7746_REG_VT_DATA_HIGH << 8 |
                        AD7746_VTSETUP_VTMD_EXT_VIN,
        },
                .indexed = 1,
                .channel = 1,
                .extend_name = "supply",
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                .address = AD7746_REG_VT_DATA_HIGH << 8 |
                        AD7746_VTSETUP_VTMD_VDD_MON,
        },
                .type = IIO_CAPACITANCE,
                .indexed = 1,
                .channel = 0,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) |
-               (1 << IIO_CHAN_INFO_CALIBBIAS_SHARED) |
-               (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT |
+               IIO_CHAN_INFO_CALIBBIAS_SHARED_BIT |
+               IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                .address = AD7746_REG_CAP_DATA_HIGH << 8,
        },
        [CIN1_DIFF] = {
                .indexed = 1,
                .channel = 0,
                .channel2 = 2,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) |
-               (1 << IIO_CHAN_INFO_CALIBBIAS_SHARED) |
-               (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT |
+               IIO_CHAN_INFO_CALIBBIAS_SHARED_BIT |
+               IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                .address = AD7746_REG_CAP_DATA_HIGH << 8 |
                        AD7746_CAPSETUP_CAPDIFF
        },
                .type = IIO_CAPACITANCE,
                .indexed = 1,
                .channel = 1,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) |
-               (1 << IIO_CHAN_INFO_CALIBBIAS_SHARED) |
-               (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT |
+               IIO_CHAN_INFO_CALIBBIAS_SHARED_BIT |
+               IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                .address = AD7746_REG_CAP_DATA_HIGH << 8 |
                        AD7746_CAPSETUP_CIN2,
        },
                .indexed = 1,
                .channel = 1,
                .channel2 = 3,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) |
-               (1 << IIO_CHAN_INFO_CALIBBIAS_SHARED) |
-               (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT |
+               IIO_CHAN_INFO_CALIBBIAS_SHARED_BIT |
+               IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                .address = AD7746_REG_CAP_DATA_HIGH << 8 |
                        AD7746_CAPSETUP_CAPDIFF | AD7746_CAPSETUP_CIN2,
        }
@@@ -477,7 -477,7 +477,7 @@@ static int ad7746_write_raw(struct iio_
        mutex_lock(&indio_dev->mlock);
  
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
+       case IIO_CHAN_INFO_CALIBSCALE:
                if (val != 1) {
                        ret = -EINVAL;
                        goto out;
  
                ret = 0;
                break;
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SHARED):
+       case IIO_CHAN_INFO_CALIBBIAS:
                if ((val < 0) | (val > 0xFFFF)) {
                        ret = -EINVAL;
                        goto out;
  
                ret = 0;
                break;
-       case (1 << IIO_CHAN_INFO_OFFSET_SEPARATE):
+       case IIO_CHAN_INFO_OFFSET:
                if ((val < 0) | (val > 43008000)) { /* 21pF */
                        ret = -EINVAL;
                        goto out;
@@@ -612,7 -612,7 +612,7 @@@ static int ad7746_read_raw(struct iio_d
  
                ret = IIO_VAL_INT;
                break;
-       case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
+       case IIO_CHAN_INFO_CALIBSCALE:
                switch (chan->type) {
                case IIO_CAPACITANCE:
                        reg = AD7746_REG_CAP_GAINH;
  
                ret = IIO_VAL_INT_PLUS_MICRO;
                break;
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SHARED):
+       case IIO_CHAN_INFO_CALIBBIAS:
                ret = i2c_smbus_read_word_data(chip->client,
                                               AD7746_REG_CAP_OFFH);
                if (ret < 0)
  
                ret = IIO_VAL_INT;
                break;
-       case (1 << IIO_CHAN_INFO_OFFSET_SEPARATE):
+       case IIO_CHAN_INFO_OFFSET:
                *val = AD7746_CAPDAC_DACP(chip->capdac[chan->channel]
                        [chan->differential]) * 338646;
  
                ret = IIO_VAL_INT;
                break;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                switch (chan->type) {
                case IIO_CAPACITANCE:
                        /* 8.192pf / 2^24 */
@@@ -788,8 -788,20 +788,8 @@@ static struct i2c_driver ad7746_driver 
        .remove = __devexit_p(ad7746_remove),
        .id_table = ad7746_id,
  };
 -
 -static __init int ad7746_init(void)
 -{
 -      return i2c_add_driver(&ad7746_driver);
 -}
 -
 -static __exit void ad7746_exit(void)
 -{
 -      i2c_del_driver(&ad7746_driver);
 -}
 +module_i2c_driver(ad7746_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD7746/5/7 capacitive sensor driver");
  MODULE_LICENSE("GPL v2");
 -
 -module_init(ad7746_init);
 -module_exit(ad7746_exit);
index 39cfe6cb02a2b6046a1cd3f3325a6031213cc445,867e4ab1ff63eaa436d4f6c7f5df3e003ca3a8f9..049a855039c2b8e1c1ca9c1f122eee316236767a
@@@ -91,7 -91,7 +91,7 @@@ enum ad5064_type 
        .indexed = 1,                                           \
        .output = 1,                                            \
        .channel = (chan),                                      \
-       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),       \
+       .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,  \
        .address = AD5064_ADDR_DAC(chan),                       \
        .scan_type = IIO_ST('u', (bits), 16, 20 - (bits))       \
  }
@@@ -280,14 -280,14 +280,14 @@@ static int ad5064_read_raw(struct iio_d
                           long m)
  {
        struct ad5064_state *st = iio_priv(indio_dev);
-       unsigned long scale_uv;
        unsigned int vref;
+       int scale_uv;
  
        switch (m) {
        case 0:
                *val = st->dac_cache[chan->channel];
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
+       case IIO_CHAN_INFO_SCALE:
                vref = st->chip_info->shared_vref ? 0 : chan->channel;
                scale_uv = regulator_get_voltage(st->vref_reg[vref].consumer);
                if (scale_uv < 0)
@@@ -445,7 -445,18 +445,7 @@@ static struct spi_driver ad5064_driver 
        .remove = __devexit_p(ad5064_remove),
        .id_table = ad5064_id,
  };
 -
 -static __init int ad5064_spi_init(void)
 -{
 -      return spi_register_driver(&ad5064_driver);
 -}
 -module_init(ad5064_spi_init);
 -
 -static __exit void ad5064_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad5064_driver);
 -}
 -module_exit(ad5064_spi_exit);
 +module_spi_driver(ad5064_driver);
  
  MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
  MODULE_DESCRIPTION("Analog Devices AD5064/64-1/44/24 DAC");
index bc0459e32d0471f95ca269e32fe6237df5a9604e,012d7147e496e6e3dd5b4dc90d5528300ffaef07..710b256affcc623d36e41ac76c229cbc809c4db0
@@@ -103,10 -103,10 +103,10 @@@ enum ad5360_type 
        .type = IIO_VOLTAGE,                                    \
        .indexed = 1,                                           \
        .output = 1,                                            \
-       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE) |      \
-               (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |          \
-               (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) |      \
-               (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE),        \
+       .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT | \
+               IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |             \
+               IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT | \
+               IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,   \
        .scan_type = IIO_ST('u', (bits), 16, 16 - (bits))       \
  }
  
@@@ -326,21 -326,21 +326,21 @@@ static int ad5360_write_raw(struct iio_
                return ad5360_write(indio_dev, AD5360_CMD_WRITE_DATA,
                                 chan->address, val, chan->scan_type.shift);
  
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                if (val >= max_val || val < 0)
                        return -EINVAL;
  
                return ad5360_write(indio_dev, AD5360_CMD_WRITE_OFFSET,
                                 chan->address, val, chan->scan_type.shift);
  
-       case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
+       case IIO_CHAN_INFO_CALIBSCALE:
                if (val >= max_val || val < 0)
                        return -EINVAL;
  
                return ad5360_write(indio_dev, AD5360_CMD_WRITE_GAIN,
                                 chan->address, val, chan->scan_type.shift);
  
-       case (1 << IIO_CHAN_INFO_OFFSET_SEPARATE):
+       case IIO_CHAN_INFO_OFFSET:
                if (val <= -max_val || val > 0)
                        return -EINVAL;
  
@@@ -371,8 -371,8 +371,8 @@@ static int ad5360_read_raw(struct iio_d
                           long m)
  {
        struct ad5360_state *st = iio_priv(indio_dev);
-       unsigned long scale_uv;
        unsigned int ofs_index;
+       int scale_uv;
        int ret;
  
        switch (m) {
                        return ret;
                *val = ret >> chan->scan_type.shift;
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
+       case IIO_CHAN_INFO_SCALE:
                /* vout = 4 * vref * dac_code */
                scale_uv = ad5360_get_channel_vref(st, chan->channel) * 4 * 100;
                if (scale_uv < 0)
                *val =  scale_uv / 100000;
                *val2 = (scale_uv % 100000) * 10;
                return IIO_VAL_INT_PLUS_MICRO;
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                ret = ad5360_read(indio_dev, AD5360_READBACK_OFFSET,
                        chan->address);
                if (ret < 0)
                        return ret;
                *val = ret;
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
+       case IIO_CHAN_INFO_CALIBSCALE:
                ret = ad5360_read(indio_dev, AD5360_READBACK_GAIN,
                        chan->address);
                if (ret < 0)
                        return ret;
                *val = ret;
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_OFFSET_SEPARATE):
+       case IIO_CHAN_INFO_OFFSET:
                ofs_index = ad5360_get_channel_vref_index(st, chan->channel);
                ret = ad5360_read(indio_dev, AD5360_READBACK_SF,
                        AD5360_REG_SF_OFS(ofs_index));
@@@ -563,7 -563,18 +563,7 @@@ static struct spi_driver ad5360_driver 
        .remove = __devexit_p(ad5360_remove),
        .id_table = ad5360_ids,
  };
 -
 -static __init int ad5360_spi_init(void)
 -{
 -      return spi_register_driver(&ad5360_driver);
 -}
 -module_init(ad5360_spi_init);
 -
 -static __exit void ad5360_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad5360_driver);
 -}
 -module_exit(ad5360_spi_exit);
 +module_spi_driver(ad5360_driver);
  
  MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
  MODULE_DESCRIPTION("Analog Devices AD5360/61/62/63/70/71/72/73 DAC");
index ac3bc5f52dccbbbad81a958592296b24c12f3d29,bfd88fa43515f0a8e9953cadfc8eb991f4ee565b..6c53f801fabc12cbcaa14a839bc0ec85f7902e5e
  
  static void ad5446_store_sample(struct ad5446_state *st, unsigned val)
  {
-       st->data.d16 = cpu_to_be16(AD5446_LOAD |
-                                       (val << st->chip_info->left_shift));
+       st->data.d16 = cpu_to_be16(AD5446_LOAD | val);
  }
  
  static void ad5542_store_sample(struct ad5446_state *st, unsigned val)
  {
-       st->data.d16 = cpu_to_be16(val << st->chip_info->left_shift);
+       st->data.d16 = cpu_to_be16(val);
  }
  
  static void ad5620_store_sample(struct ad5446_state *st, unsigned val)
  {
-       st->data.d16 = cpu_to_be16(AD5620_LOAD |
-                                       (val << st->chip_info->left_shift));
+       st->data.d16 = cpu_to_be16(AD5620_LOAD | val);
  }
  
  static void ad5660_store_sample(struct ad5446_state *st, unsigned val)
@@@ -63,50 -61,6 +61,6 @@@ static void ad5660_store_pwr_down(struc
        st->data.d24[2] = val & 0xFF;
  }
  
- static ssize_t ad5446_write(struct device *dev,
-               struct device_attribute *attr,
-               const char *buf,
-               size_t len)
- {
-       struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct ad5446_state *st = iio_priv(indio_dev);
-       int ret;
-       long val;
-       ret = strict_strtol(buf, 10, &val);
-       if (ret)
-               goto error_ret;
-       if (val > RES_MASK(st->chip_info->bits)) {
-               ret = -EINVAL;
-               goto error_ret;
-       }
-       mutex_lock(&indio_dev->mlock);
-       st->cached_val = val;
-       st->chip_info->store_sample(st, val);
-       ret = spi_sync(st->spi, &st->msg);
-       mutex_unlock(&indio_dev->mlock);
- error_ret:
-       return ret ? ret : len;
- }
- static IIO_DEV_ATTR_OUT_RAW(0, ad5446_write, 0);
- static ssize_t ad5446_show_scale(struct device *dev,
-                               struct device_attribute *attr,
-                               char *buf)
- {
-       struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct ad5446_state *st = iio_priv(indio_dev);
-       /* Corresponds to Vref / 2^(bits) */
-       unsigned int scale_uv = (st->vref_mv * 1000) >> st->chip_info->bits;
-       return sprintf(buf, "%d.%03d\n", scale_uv / 1000, scale_uv % 1000);
- }
- static IIO_DEVICE_ATTR(out_voltage_scale, S_IRUGO, ad5446_show_scale, NULL, 0);
  static ssize_t ad5446_write_powerdown_mode(struct device *dev,
                                       struct device_attribute *attr,
                                       const char *buf, size_t len)
@@@ -189,8 -143,6 +143,6 @@@ static IIO_DEVICE_ATTR(out_voltage0_pow
                        ad5446_write_dac_powerdown, 0);
  
  static struct attribute *ad5446_attributes[] = {
-       &iio_dev_attr_out_voltage0_raw.dev_attr.attr,
-       &iio_dev_attr_out_voltage_scale.dev_attr.attr,
        &iio_dev_attr_out_voltage0_powerdown.dev_attr.attr,
        &iio_dev_attr_out_voltage_powerdown_mode.dev_attr.attr,
        &iio_const_attr_out_voltage_powerdown_mode_available.dev_attr.attr,
@@@ -223,121 -175,148 +175,148 @@@ static const struct attribute_group ad5
        .is_visible = ad5446_attr_is_visible,
  };
  
+ #define AD5446_CHANNEL(bits, storage, shift) { \
+       .type = IIO_VOLTAGE, \
+       .indexed = 1, \
+       .output = 1, \
+       .channel = 0, \
+       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT, \
+       .scan_type = IIO_ST('u', (bits), (storage), (shift)) \
+ }
  static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
        [ID_AD5444] = {
-               .bits = 12,
-               .storagebits = 16,
-               .left_shift = 2,
+               .channel = AD5446_CHANNEL(12, 16, 2),
                .store_sample = ad5446_store_sample,
        },
        [ID_AD5446] = {
-               .bits = 14,
-               .storagebits = 16,
-               .left_shift = 0,
+               .channel = AD5446_CHANNEL(14, 16, 0),
                .store_sample = ad5446_store_sample,
        },
        [ID_AD5541A] = {
-               .bits = 16,
-               .storagebits = 16,
-               .left_shift = 0,
+               .channel = AD5446_CHANNEL(16, 16, 0),
                .store_sample = ad5542_store_sample,
        },
        [ID_AD5542A] = {
-               .bits = 16,
-               .storagebits = 16,
-               .left_shift = 0,
+               .channel = AD5446_CHANNEL(16, 16, 0),
                .store_sample = ad5542_store_sample,
        },
        [ID_AD5543] = {
-               .bits = 16,
-               .storagebits = 16,
-               .left_shift = 0,
+               .channel = AD5446_CHANNEL(16, 16, 0),
                .store_sample = ad5542_store_sample,
        },
        [ID_AD5512A] = {
-               .bits = 12,
-               .storagebits = 16,
-               .left_shift = 4,
+               .channel = AD5446_CHANNEL(12, 16, 4),
                .store_sample = ad5542_store_sample,
        },
        [ID_AD5553] = {
-               .bits = 14,
-               .storagebits = 16,
-               .left_shift = 0,
+               .channel = AD5446_CHANNEL(14, 16, 0),
                .store_sample = ad5542_store_sample,
        },
        [ID_AD5601] = {
-               .bits = 8,
-               .storagebits = 16,
-               .left_shift = 6,
+               .channel = AD5446_CHANNEL(8, 16, 6),
                .store_sample = ad5542_store_sample,
                .store_pwr_down = ad5620_store_pwr_down,
        },
        [ID_AD5611] = {
-               .bits = 10,
-               .storagebits = 16,
-               .left_shift = 4,
+               .channel = AD5446_CHANNEL(10, 16, 4),
                .store_sample = ad5542_store_sample,
                .store_pwr_down = ad5620_store_pwr_down,
        },
        [ID_AD5621] = {
-               .bits = 12,
-               .storagebits = 16,
-               .left_shift = 2,
+               .channel = AD5446_CHANNEL(12, 16, 2),
                .store_sample = ad5542_store_sample,
                .store_pwr_down = ad5620_store_pwr_down,
        },
        [ID_AD5620_2500] = {
-               .bits = 12,
-               .storagebits = 16,
-               .left_shift = 2,
+               .channel = AD5446_CHANNEL(12, 16, 2),
                .int_vref_mv = 2500,
                .store_sample = ad5620_store_sample,
                .store_pwr_down = ad5620_store_pwr_down,
        },
        [ID_AD5620_1250] = {
-               .bits = 12,
-               .storagebits = 16,
-               .left_shift = 2,
+               .channel = AD5446_CHANNEL(12, 16, 2),
                .int_vref_mv = 1250,
                .store_sample = ad5620_store_sample,
                .store_pwr_down = ad5620_store_pwr_down,
        },
        [ID_AD5640_2500] = {
-               .bits = 14,
-               .storagebits = 16,
-               .left_shift = 0,
+               .channel = AD5446_CHANNEL(14, 16, 0),
                .int_vref_mv = 2500,
                .store_sample = ad5620_store_sample,
                .store_pwr_down = ad5620_store_pwr_down,
        },
        [ID_AD5640_1250] = {
-               .bits = 14,
-               .storagebits = 16,
-               .left_shift = 0,
+               .channel = AD5446_CHANNEL(14, 16, 0),
                .int_vref_mv = 1250,
                .store_sample = ad5620_store_sample,
                .store_pwr_down = ad5620_store_pwr_down,
        },
        [ID_AD5660_2500] = {
-               .bits = 16,
-               .storagebits = 24,
-               .left_shift = 0,
+               .channel = AD5446_CHANNEL(16, 16, 0),
                .int_vref_mv = 2500,
                .store_sample = ad5660_store_sample,
                .store_pwr_down = ad5660_store_pwr_down,
        },
        [ID_AD5660_1250] = {
-               .bits = 16,
-               .storagebits = 24,
-               .left_shift = 0,
+               .channel = AD5446_CHANNEL(16, 16, 0),
                .int_vref_mv = 1250,
                .store_sample = ad5660_store_sample,
                .store_pwr_down = ad5660_store_pwr_down,
        },
  };
  
+ static int ad5446_read_raw(struct iio_dev *indio_dev,
+                          struct iio_chan_spec const *chan,
+                          int *val,
+                          int *val2,
+                          long m)
+ {
+       struct ad5446_state *st = iio_priv(indio_dev);
+       unsigned long scale_uv;
+       switch (m) {
+       case IIO_CHAN_INFO_SCALE:
+               scale_uv = (st->vref_mv * 1000) >> chan->scan_type.realbits;
+               *val =  scale_uv / 1000;
+               *val2 = (scale_uv % 1000) * 1000;
+               return IIO_VAL_INT_PLUS_MICRO;
+       }
+       return -EINVAL;
+ }
+ static int ad5446_write_raw(struct iio_dev *indio_dev,
+                              struct iio_chan_spec const *chan,
+                              int val,
+                              int val2,
+                              long mask)
+ {
+       struct ad5446_state *st = iio_priv(indio_dev);
+       int ret;
+       switch (mask) {
+       case 0:
+               if (val >= (1 << chan->scan_type.realbits) || val < 0)
+                       return -EINVAL;
+               val <<= chan->scan_type.shift;
+               mutex_lock(&indio_dev->mlock);
+               st->cached_val = val;
+               st->chip_info->store_sample(st, val);
+               ret = spi_sync(st->spi, &st->msg);
+               mutex_unlock(&indio_dev->mlock);
+               break;
+       default:
+               ret = -EINVAL;
+       }
+       return ret;
+ }
  static const struct iio_info ad5446_info = {
+       .read_raw = ad5446_read_raw,
+       .write_raw = ad5446_write_raw,
        .attrs = &ad5446_attribute_group,
        .driver_module = THIS_MODULE,
  };
@@@ -376,11 -355,13 +355,13 @@@ static int __devinit ad5446_probe(struc
        indio_dev->name = spi_get_device_id(spi)->name;
        indio_dev->info = &ad5446_info;
        indio_dev->modes = INDIO_DIRECT_MODE;
+       indio_dev->channels = &st->chip_info->channel;
+       indio_dev->num_channels = 1;
  
        /* Setup default message */
  
        st->xfer.tx_buf = &st->data;
-       st->xfer.len = st->chip_info->storagebits / 8;
+       st->xfer.len = st->chip_info->channel.scan_type.storagebits / 8;
  
        spi_message_init(&st->msg);
        spi_message_add_tail(&st->xfer, &st->msg);
@@@ -454,20 -435,30 +435,19 @@@ static const struct spi_device_id ad544
        {"ad5660-1250", ID_AD5660_1250},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad5446_id);
  
  static struct spi_driver ad5446_driver = {
        .driver = {
                .name   = "ad5446",
-               .bus    = &spi_bus_type,
                .owner  = THIS_MODULE,
        },
        .probe          = ad5446_probe,
        .remove         = __devexit_p(ad5446_remove),
        .id_table       = ad5446_id,
  };
 -
 -static int __init ad5446_init(void)
 -{
 -      return spi_register_driver(&ad5446_driver);
 -}
 -module_init(ad5446_init);
 -
 -static void __exit ad5446_exit(void)
 -{
 -      spi_unregister_driver(&ad5446_driver);
 -}
 -module_exit(ad5446_exit);
 +module_spi_driver(ad5446_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD5444/AD5446 DAC");
  MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("spi:ad5446");
index 57539ce8e6cfae4f0982fd9bcb73af101f5e285e,f20a5dcd3e7d0e6879064ddc5bc299ddb8183cdc..bc17205fe722dabbd56ca65be45b95728337a292
  
  #include "../iio.h"
  #include "../sysfs.h"
+ #include "../events.h"
  #include "dac.h"
  #include "ad5504.h"
  
+ #define AD5504_CHANNEL(_chan) { \
+       .type = IIO_VOLTAGE, \
+       .indexed = 1, \
+       .output = 1, \
+       .channel = (_chan), \
+       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT, \
+       .address = AD5504_ADDR_DAC(_chan), \
+       .scan_type = IIO_ST('u', 12, 16, 0), \
+ }
+ static const struct iio_chan_spec ad5504_channels[] = {
+       AD5504_CHANNEL(0),
+       AD5504_CHANNEL(1),
+       AD5504_CHANNEL(2),
+       AD5504_CHANNEL(3),
+ };
  static int ad5504_spi_write(struct spi_device *spi, u8 addr, u16 val)
  {
        u16 tmp = cpu_to_be16(AD5504_CMD_WRITE |
        return spi_write(spi, (u8 *)&tmp, 2);
  }
  
- static int ad5504_spi_read(struct spi_device *spi, u8 addr, u16 *val)
+ static int ad5504_spi_read(struct spi_device *spi, u8 addr)
  {
        u16 tmp = cpu_to_be16(AD5504_CMD_READ | AD5504_ADDR(addr));
+       u16 val;
        int ret;
        struct spi_transfer     t = {
                        .tx_buf         = &tmp,
-                       .rx_buf         = val,
+                       .rx_buf         = &val,
                        .len            = 2,
                };
        struct spi_message      m;
        spi_message_add_tail(&t, &m);
        ret = spi_sync(spi, &m);
  
-       *val = be16_to_cpu(*val) & AD5504_RES_MASK;
+       if (ret < 0)
+               return ret;
  
-       return ret;
+       return be16_to_cpu(val) & AD5504_RES_MASK;
  }
  
- static ssize_t ad5504_write_dac(struct device *dev,
-                                struct device_attribute *attr,
-                                const char *buf, size_t len)
+ static int ad5504_read_raw(struct iio_dev *indio_dev,
+                          struct iio_chan_spec const *chan,
+                          int *val,
+                          int *val2,
+                          long m)
  {
-       struct iio_dev *indio_dev = dev_get_drvdata(dev);
        struct ad5504_state *st = iio_priv(indio_dev);
-       struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-       long readin;
+       unsigned long scale_uv;
        int ret;
  
-       ret = strict_strtol(buf, 10, &readin);
-       if (ret)
-               return ret;
+       switch (m) {
+       case 0:
+               ret = ad5504_spi_read(st->spi, chan->address);
+               if (ret < 0)
+                       return ret;
  
-       ret = ad5504_spi_write(st->spi, this_attr->address, readin);
-       return ret ? ret : len;
+               *val = ret;
+               return IIO_VAL_INT;
+       case IIO_CHAN_INFO_SCALE:
+               scale_uv = (st->vref_mv * 1000) >> chan->scan_type.realbits;
+               *val =  scale_uv / 1000;
+               *val2 = (scale_uv % 1000) * 1000;
+               return IIO_VAL_INT_PLUS_MICRO;
+       }
+       return -EINVAL;
  }
  
- static ssize_t ad5504_read_dac(struct device *dev,
-                                          struct device_attribute *attr,
-                                          char *buf)
+ static int ad5504_write_raw(struct iio_dev *indio_dev,
+                              struct iio_chan_spec const *chan,
+                              int val,
+                              int val2,
+                              long mask)
  {
-       struct iio_dev *indio_dev = dev_get_drvdata(dev);
        struct ad5504_state *st = iio_priv(indio_dev);
-       struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
        int ret;
-       u16 val;
  
-       ret = ad5504_spi_read(st->spi, this_attr->address, &val);
-       if (ret)
-               return ret;
+       switch (mask) {
+       case 0:
+               if (val >= (1 << chan->scan_type.realbits) || val < 0)
+                       return -EINVAL;
  
-       return sprintf(buf, "%d\n", val);
+               return ad5504_spi_write(st->spi, chan->address, val);
+       default:
+               ret = -EINVAL;
+       }
+       return -EINVAL;
  }
  
  static ssize_t ad5504_read_powerdown_mode(struct device *dev,
@@@ -157,32 -193,6 +193,6 @@@ static ssize_t ad5504_write_dac_powerdo
        return ret ? ret : len;
  }
  
- static ssize_t ad5504_show_scale(struct device *dev,
-                               struct device_attribute *attr,
-                               char *buf)
- {
-       struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct ad5504_state *st = iio_priv(indio_dev);
-       /* Corresponds to Vref / 2^(bits) */
-       unsigned int scale_uv = (st->vref_mv * 1000) >> AD5505_BITS;
-       return sprintf(buf, "%d.%03d\n", scale_uv / 1000, scale_uv % 1000);
- }
- static IIO_DEVICE_ATTR(out_voltage_scale, S_IRUGO, ad5504_show_scale, NULL, 0);
- #define IIO_DEV_ATTR_OUT_RW_RAW(_num, _show, _store, _addr)           \
-       IIO_DEVICE_ATTR(out_voltage##_num##_raw,                        \
-                       S_IRUGO | S_IWUSR, _show, _store, _addr)
- static IIO_DEV_ATTR_OUT_RW_RAW(0, ad5504_read_dac,
-       ad5504_write_dac, AD5504_ADDR_DAC0);
- static IIO_DEV_ATTR_OUT_RW_RAW(1, ad5504_read_dac,
-       ad5504_write_dac, AD5504_ADDR_DAC1);
- static IIO_DEV_ATTR_OUT_RW_RAW(2, ad5504_read_dac,
-       ad5504_write_dac, AD5504_ADDR_DAC2);
- static IIO_DEV_ATTR_OUT_RW_RAW(3, ad5504_read_dac,
-       ad5504_write_dac, AD5504_ADDR_DAC3);
  static IIO_DEVICE_ATTR(out_voltage_powerdown_mode, S_IRUGO |
                        S_IWUSR, ad5504_read_powerdown_mode,
                        ad5504_write_powerdown_mode, 0);
@@@ -203,17 -213,12 +213,12 @@@ static IIO_DEV_ATTR_DAC_POWERDOWN(3, ad
                                   ad5504_write_dac_powerdown, 3);
  
  static struct attribute *ad5504_attributes[] = {
-       &iio_dev_attr_out_voltage0_raw.dev_attr.attr,
-       &iio_dev_attr_out_voltage1_raw.dev_attr.attr,
-       &iio_dev_attr_out_voltage2_raw.dev_attr.attr,
-       &iio_dev_attr_out_voltage3_raw.dev_attr.attr,
        &iio_dev_attr_out_voltage0_powerdown.dev_attr.attr,
        &iio_dev_attr_out_voltage1_powerdown.dev_attr.attr,
        &iio_dev_attr_out_voltage2_powerdown.dev_attr.attr,
        &iio_dev_attr_out_voltage3_powerdown.dev_attr.attr,
        &iio_dev_attr_out_voltage_powerdown_mode.dev_attr.attr,
        &iio_const_attr_out_voltage_powerdown_mode_available.dev_attr.attr,
-       &iio_dev_attr_out_voltage_scale.dev_attr.attr,
        NULL,
  };
  
@@@ -222,11 -227,9 +227,9 @@@ static const struct attribute_group ad5
  };
  
  static struct attribute *ad5501_attributes[] = {
-       &iio_dev_attr_out_voltage0_raw.dev_attr.attr,
        &iio_dev_attr_out_voltage0_powerdown.dev_attr.attr,
        &iio_dev_attr_out_voltage_powerdown_mode.dev_attr.attr,
        &iio_const_attr_out_voltage_powerdown_mode_available.dev_attr.attr,
-       &iio_dev_attr_out_voltage_scale.dev_attr.attr,
        NULL,
  };
  
@@@ -261,12 -264,16 +264,16 @@@ static irqreturn_t ad5504_event_handler
  }
  
  static const struct iio_info ad5504_info = {
+       .write_raw = ad5504_write_raw,
+       .read_raw = ad5504_read_raw,
        .attrs = &ad5504_attribute_group,
        .event_attrs = &ad5504_ev_attribute_group,
        .driver_module = THIS_MODULE,
  };
  
  static const struct iio_info ad5501_info = {
+       .write_raw = ad5504_write_raw,
+       .read_raw = ad5504_read_raw,
        .attrs = &ad5501_attribute_group,
        .event_attrs = &ad5504_ev_attribute_group,
        .driver_module = THIS_MODULE,
@@@ -307,10 -314,14 +314,14 @@@ static int __devinit ad5504_probe(struc
        st->spi = spi;
        indio_dev->dev.parent = &spi->dev;
        indio_dev->name = spi_get_device_id(st->spi)->name;
-       if (spi_get_device_id(st->spi)->driver_data == ID_AD5501)
+       if (spi_get_device_id(st->spi)->driver_data == ID_AD5501) {
                indio_dev->info = &ad5501_info;
-       else
+               indio_dev->num_channels = 1;
+       } else {
                indio_dev->info = &ad5504_info;
+               indio_dev->num_channels = 4;
+       }
+       indio_dev->channels = ad5504_channels;
        indio_dev->modes = INDIO_DIRECT_MODE;
  
        if (spi->irq) {
@@@ -367,6 -378,7 +378,7 @@@ static const struct spi_device_id ad550
        {"ad5501", ID_AD5501},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad5504_id);
  
  static struct spi_driver ad5504_driver = {
        .driver = {
        .remove = __devexit_p(ad5504_remove),
        .id_table = ad5504_id,
  };
 -
 -static __init int ad5504_spi_init(void)
 -{
 -      return spi_register_driver(&ad5504_driver);
 -}
 -module_init(ad5504_spi_init);
 -
 -static __exit void ad5504_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad5504_driver);
 -}
 -module_exit(ad5504_spi_exit);
 +module_spi_driver(ad5504_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD5501/AD5501 DAC");
index 6e05f0dbae0b9e037c16ff0b631373af57206e18,6cb00e14422f3f692c747bc044ec252a444c04b6..10c7484366efd96bf07d0ac4ac43b2854a81238e
  #include "dac.h"
  #include "ad5624r.h"
  
+ #define AD5624R_CHANNEL(_chan, _bits) { \
+       .type = IIO_VOLTAGE, \
+       .indexed = 1, \
+       .output = 1, \
+       .channel = (_chan), \
+       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT, \
+       .address = (_chan), \
+       .scan_type = IIO_ST('u', (_bits), 16, 16 - (_bits)), \
+ }
+ #define DECLARE_AD5624R_CHANNELS(_name, _bits) \
+       const struct iio_chan_spec _name##_channels[] = { \
+               AD5624R_CHANNEL(0, _bits), \
+               AD5624R_CHANNEL(1, _bits), \
+               AD5624R_CHANNEL(2, _bits), \
+               AD5624R_CHANNEL(3, _bits), \
+ }
+ static DECLARE_AD5624R_CHANNELS(ad5624r, 12);
+ static DECLARE_AD5624R_CHANNELS(ad5644r, 14);
+ static DECLARE_AD5624R_CHANNELS(ad5664r, 16);
  static const struct ad5624r_chip_info ad5624r_chip_info_tbl[] = {
        [ID_AD5624R3] = {
-               .bits = 12,
-               .int_vref_mv = 1250,
-       },
-       [ID_AD5644R3] = {
-               .bits = 14,
-               .int_vref_mv = 1250,
-       },
-       [ID_AD5664R3] = {
-               .bits = 16,
+               .channels = ad5624r_channels,
                .int_vref_mv = 1250,
        },
        [ID_AD5624R5] = {
-               .bits = 12,
+               .channels = ad5624r_channels,
                .int_vref_mv = 2500,
        },
+       [ID_AD5644R3] = {
+               .channels = ad5644r_channels,
+               .int_vref_mv = 1250,
+       },
        [ID_AD5644R5] = {
-               .bits = 14,
+               .channels = ad5644r_channels,
                .int_vref_mv = 2500,
        },
+       [ID_AD5664R3] = {
+               .channels = ad5664r_channels,
+               .int_vref_mv = 1250,
+       },
        [ID_AD5664R5] = {
-               .bits = 16,
+               .channels = ad5664r_channels,
                .int_vref_mv = 2500,
        },
  };
@@@ -70,24 -92,49 +92,49 @@@ static int ad5624r_spi_write(struct spi
        return spi_write(spi, msg, 3);
  }
  
- static ssize_t ad5624r_write_dac(struct device *dev,
-                                struct device_attribute *attr,
-                                const char *buf, size_t len)
+ static int ad5624r_read_raw(struct iio_dev *indio_dev,
+                          struct iio_chan_spec const *chan,
+                          int *val,
+                          int *val2,
+                          long m)
  {
-       long readin;
-       int ret;
-       struct iio_dev *indio_dev = dev_get_drvdata(dev);
        struct ad5624r_state *st = iio_priv(indio_dev);
-       struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
+       unsigned long scale_uv;
  
-       ret = strict_strtol(buf, 10, &readin);
-       if (ret)
-               return ret;
+       switch (m) {
+       case IIO_CHAN_INFO_SCALE:
+               scale_uv = (st->vref_mv * 1000) >> chan->scan_type.realbits;
+               *val =  scale_uv / 1000;
+               *val2 = (scale_uv % 1000) * 1000;
+               return IIO_VAL_INT_PLUS_MICRO;
  
-       ret = ad5624r_spi_write(st->us, AD5624R_CMD_WRITE_INPUT_N_UPDATE_N,
-                               this_attr->address, readin,
-                               st->chip_info->bits);
-       return ret ? ret : len;
+       }
+       return -EINVAL;
+ }
+ static int ad5624r_write_raw(struct iio_dev *indio_dev,
+                              struct iio_chan_spec const *chan,
+                              int val,
+                              int val2,
+                              long mask)
+ {
+       struct ad5624r_state *st = iio_priv(indio_dev);
+       int ret;
+       switch (mask) {
+       case 0:
+               if (val >= (1 << chan->scan_type.realbits) || val < 0)
+                       return -EINVAL;
+               return ad5624r_spi_write(st->us,
+                               AD5624R_CMD_WRITE_INPUT_N_UPDATE_N,
+                               chan->address, val,
+                               chan->scan_type.shift);
+       default:
+               ret = -EINVAL;
+       }
+       return -EINVAL;
  }
  
  static ssize_t ad5624r_read_powerdown_mode(struct device *dev,
@@@ -161,24 -208,6 +208,6 @@@ static ssize_t ad5624r_write_dac_powerd
        return ret ? ret : len;
  }
  
- static ssize_t ad5624r_show_scale(struct device *dev,
-                               struct device_attribute *attr,
-                               char *buf)
- {
-       struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct ad5624r_state *st = iio_priv(indio_dev);
-       /* Corresponds to Vref / 2^(bits) */
-       unsigned int scale_uv = (st->vref_mv * 1000) >> st->chip_info->bits;
-       return sprintf(buf, "%d.%03d\n", scale_uv / 1000, scale_uv % 1000);
- }
- static IIO_DEVICE_ATTR(out_voltage_scale, S_IRUGO, ad5624r_show_scale, NULL, 0);
- static IIO_DEV_ATTR_OUT_RAW(0, ad5624r_write_dac, AD5624R_ADDR_DAC0);
- static IIO_DEV_ATTR_OUT_RAW(1, ad5624r_write_dac, AD5624R_ADDR_DAC1);
- static IIO_DEV_ATTR_OUT_RAW(2, ad5624r_write_dac, AD5624R_ADDR_DAC2);
- static IIO_DEV_ATTR_OUT_RAW(3, ad5624r_write_dac, AD5624R_ADDR_DAC3);
  static IIO_DEVICE_ATTR(out_voltage_powerdown_mode, S_IRUGO |
                        S_IWUSR, ad5624r_read_powerdown_mode,
                        ad5624r_write_powerdown_mode, 0);
@@@ -200,17 -229,12 +229,12 @@@ static IIO_DEV_ATTR_DAC_POWERDOWN(3, ad
                                   ad5624r_write_dac_powerdown, 3);
  
  static struct attribute *ad5624r_attributes[] = {
-       &iio_dev_attr_out_voltage0_raw.dev_attr.attr,
-       &iio_dev_attr_out_voltage1_raw.dev_attr.attr,
-       &iio_dev_attr_out_voltage2_raw.dev_attr.attr,
-       &iio_dev_attr_out_voltage3_raw.dev_attr.attr,
        &iio_dev_attr_out_voltage0_powerdown.dev_attr.attr,
        &iio_dev_attr_out_voltage1_powerdown.dev_attr.attr,
        &iio_dev_attr_out_voltage2_powerdown.dev_attr.attr,
        &iio_dev_attr_out_voltage3_powerdown.dev_attr.attr,
        &iio_dev_attr_out_voltage_powerdown_mode.dev_attr.attr,
        &iio_const_attr_out_voltage_powerdown_mode_available.dev_attr.attr,
-       &iio_dev_attr_out_voltage_scale.dev_attr.attr,
        NULL,
  };
  
@@@ -219,6 -243,8 +243,8 @@@ static const struct attribute_group ad5
  };
  
  static const struct iio_info ad5624r_info = {
+       .write_raw = ad5624r_write_raw,
+       .read_raw = ad5624r_read_raw,
        .attrs = &ad5624r_attribute_group,
        .driver_module = THIS_MODULE,
  };
@@@ -259,6 -285,8 +285,8 @@@ static int __devinit ad5624r_probe(stru
        indio_dev->name = spi_get_device_id(spi)->name;
        indio_dev->info = &ad5624r_info;
        indio_dev->modes = INDIO_DIRECT_MODE;
+       indio_dev->channels = st->chip_info->channels;
+       indio_dev->num_channels = AD5624R_DAC_CHANNELS;
  
        ret = ad5624r_spi_write(spi, AD5624R_CMD_INTERNAL_REFER_SETUP, 0,
                                !!voltage_uv, 16);
@@@ -307,6 -335,7 +335,7 @@@ static const struct spi_device_id ad562
        {"ad5664r5", ID_AD5664R5},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad5624r_id);
  
  static struct spi_driver ad5624r_driver = {
        .driver = {
        .remove = __devexit_p(ad5624r_remove),
        .id_table = ad5624r_id,
  };
 -
 -static __init int ad5624r_spi_init(void)
 -{
 -      return spi_register_driver(&ad5624r_driver);
 -}
 -module_init(ad5624r_spi_init);
 -
 -static __exit void ad5624r_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad5624r_driver);
 -}
 -module_exit(ad5624r_spi_exit);
 +module_spi_driver(ad5624r_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices AD5624/44/64R DAC spi driver");
index e72db2fbfedf77bd4896bc8a5adb2dae12b2cc99,bbaa9281308fcdb46cb588af8ea04d55759c4076..ce2d6193dd893997380eb1567a0d4a4b8ae83db1
@@@ -99,7 -99,7 +99,7 @@@ enum ad5686_supported_device_ids 
                .indexed = 1,                                   \
                .output = 1,                                    \
                .channel = chan,                                \
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED), \
+               .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,    \
                .address = AD5686_ADDR_DAC(chan),                       \
                .scan_type = IIO_ST('u', bits, 16, shift)       \
  }
@@@ -306,7 -306,7 +306,7 @@@ static int ad5686_read_raw(struct iio_d
                *val = ret;
                return IIO_VAL_INT;
                break;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                scale_uv = (st->vref_mv * 100000)
                        >> (chan->scan_type.realbits);
                *val =  scale_uv / 100000;
@@@ -437,6 -437,7 +437,7 @@@ static const struct spi_device_id ad568
        {"ad5686", ID_AD5686},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad5686_id);
  
  static struct spi_driver ad5686_driver = {
        .driver = {
        .remove = __devexit_p(ad5686_remove),
        .id_table = ad5686_id,
  };
 -
 -static __init int ad5686_spi_init(void)
 -{
 -      return spi_register_driver(&ad5686_driver);
 -}
 -module_init(ad5686_spi_init);
 -
 -static __exit void ad5686_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad5686_driver);
 -}
 -module_exit(ad5686_spi_exit);
 +module_spi_driver(ad5686_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD5686/85/84 DAC");
index 4a80fd8222311f0ac7791fb2446e9137a9876b68,e919025f138a62535648a33230b9ebfeb7374be7..ac45636a8d72e2dcf4c9e37a7b54b23922da5bed
@@@ -1,5 -1,6 +1,6 @@@
  /*
-  * AD5760, AD5780, AD5781, AD5791 Voltage Output Digital to Analog Converter
+  * AD5760, AD5780, AD5781, AD5790, AD5791 Voltage Output Digital to Analog
+  * Converter
   *
   * Copyright 2011 Analog Devices Inc.
   *
@@@ -77,8 -78,8 +78,8 @@@ static int ad5791_spi_read(struct spi_d
        .indexed = 1,                                   \
        .address = AD5791_ADDR_DAC0,                    \
        .channel = 0,                                   \
-       .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED) | \
-               (1 << IIO_CHAN_INFO_OFFSET_SHARED),     \
+       .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT | \
+               IIO_CHAN_INFO_OFFSET_SHARED_BIT,        \
        .scan_type = IIO_ST('u', bits, 24, shift)       \
  }
  
@@@ -237,11 -238,11 +238,11 @@@ static int ad5791_read_raw(struct iio_d
                *val &= AD5791_DAC_MASK;
                *val >>= chan->scan_type.shift;
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                *val = 0;
                *val2 = (((u64)st->vref_mv) * 1000000ULL) >> chan->scan_type.realbits;
                return IIO_VAL_INT_PLUS_MICRO;
-       case (1 << IIO_CHAN_INFO_OFFSET_SHARED):
+       case IIO_CHAN_INFO_OFFSET:
                val64 = (((u64)st->vref_neg_mv) << chan->scan_type.realbits);
                do_div(val64, st->vref_mv);
                *val = -val64;
@@@ -397,9 -398,11 +398,11 @@@ static const struct spi_device_id ad579
        {"ad5760", ID_AD5760},
        {"ad5780", ID_AD5780},
        {"ad5781", ID_AD5781},
+       {"ad5790", ID_AD5791},
        {"ad5791", ID_AD5791},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad5791_id);
  
  static struct spi_driver ad5791_driver = {
        .driver = {
        .remove = __devexit_p(ad5791_remove),
        .id_table = ad5791_id,
  };
 -
 -static __init int ad5791_spi_init(void)
 -{
 -      return spi_register_driver(&ad5791_driver);
 -}
 -module_init(ad5791_spi_init);
 -
 -static __exit void ad5791_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad5791_driver);
 -}
 -module_exit(ad5791_spi_exit);
 +module_spi_driver(ad5791_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
- MODULE_DESCRIPTION("Analog Devices AD5760/AD5780/AD5781/AD5791 DAC");
+ MODULE_DESCRIPTION("Analog Devices AD5760/AD5780/AD5781/AD5790/AD5791 DAC");
  MODULE_LICENSE("GPL v2");
index 4a360d044a36eb5bc45814b7ed04d727d96e7070,40807d25855cd18fd5cf20411a9c4f6a216cc1ca..9c32d1beae2583e07ef5b3ed05c56b43347d0e3f
@@@ -143,8 -143,20 +143,9 @@@ static struct spi_driver ad5930_driver 
        .probe = ad5930_probe,
        .remove = __devexit_p(ad5930_remove),
  };
 -
 -static __init int ad5930_spi_init(void)
 -{
 -      return spi_register_driver(&ad5930_driver);
 -}
 -module_init(ad5930_spi_init);
 -
 -static __exit void ad5930_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad5930_driver);
 -}
 -module_exit(ad5930_spi_exit);
 +module_spi_driver(ad5930_driver);
  
  MODULE_AUTHOR("Cliff Cai");
  MODULE_DESCRIPTION("Analog Devices ad5930 driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:" DRV_NAME);
index cc32fd65b8b3bfc03dee806d8aca261bd0ad88a7,d612d3d55ca7fa1439b29bdf467ab926aa391292..2ccf25dd928946ce0ab8441cfd9fb3884aaf3624
@@@ -88,7 -88,7 +88,7 @@@ static ssize_t ad9832_write(struct devi
                goto error_ret;
  
        mutex_lock(&indio_dev->mlock);
-       switch (this_attr->address) {
+       switch ((u32) this_attr->address) {
        case AD9832_FREQ0HM:
        case AD9832_FREQ1HM:
                ret = ad9832_write_frequency(st, this_attr->address, val);
@@@ -344,20 -344,30 +344,19 @@@ static const struct spi_device_id ad983
        {"ad9835", 0},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad9832_id);
  
  static struct spi_driver ad9832_driver = {
        .driver = {
                .name   = "ad9832",
-               .bus    = &spi_bus_type,
                .owner  = THIS_MODULE,
        },
        .probe          = ad9832_probe,
        .remove         = __devexit_p(ad9832_remove),
        .id_table       = ad9832_id,
  };
 -
 -static int __init ad9832_init(void)
 -{
 -      return spi_register_driver(&ad9832_driver);
 -}
 -module_init(ad9832_init);
 -
 -static void __exit ad9832_exit(void)
 -{
 -      spi_unregister_driver(&ad9832_driver);
 -}
 -module_exit(ad9832_exit);
 +module_spi_driver(ad9832_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD9832/AD9835 DDS");
  MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("spi:ad9832");
index 2b31e3524826b9ab92072d2173aafc5fa73523c4,59a28134d86932e4b0a3acdcaf0dfc1dd893fb9c..b8b1a46c40c2d0558f62a7f2702aaa516375ac6a
@@@ -77,7 -77,7 +77,7 @@@ static ssize_t ad9834_write(struct devi
                goto error_ret;
  
        mutex_lock(&indio_dev->mlock);
-       switch (this_attr->address) {
+       switch ((u32) this_attr->address) {
        case AD9834_REG_FREQ0:
        case AD9834_REG_FREQ1:
                ret = ad9834_write_frequency(st, this_attr->address, val);
@@@ -153,7 -153,7 +153,7 @@@ static ssize_t ad9834_store_wavetype(st
  
        mutex_lock(&indio_dev->mlock);
  
-       switch (this_attr->address) {
+       switch ((u32) this_attr->address) {
        case 0:
                if (sysfs_streq(buf, "sine")) {
                        st->control &= ~AD9834_MODE;
@@@ -435,20 -435,30 +435,19 @@@ static const struct spi_device_id ad983
        {"ad9838", ID_AD9838},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad9834_id);
  
  static struct spi_driver ad9834_driver = {
        .driver = {
                .name   = "ad9834",
-               .bus    = &spi_bus_type,
                .owner  = THIS_MODULE,
        },
        .probe          = ad9834_probe,
        .remove         = __devexit_p(ad9834_remove),
        .id_table       = ad9834_id,
  };
 -
 -static int __init ad9834_init(void)
 -{
 -      return spi_register_driver(&ad9834_driver);
 -}
 -module_init(ad9834_init);
 -
 -static void __exit ad9834_exit(void)
 -{
 -      spi_unregister_driver(&ad9834_driver);
 -}
 -module_exit(ad9834_exit);
 +module_spi_driver(ad9834_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD9833/AD9834/AD9837/AD9838 DDS");
  MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("spi:ad9834");
index f9c96afcb99686e92f1338190a984846d261b875,159f6f274fae2565783434574481a7f2543843b5..f4f731bb219115b7833a68db1973ecb295a8e28d
@@@ -129,8 -129,20 +129,9 @@@ static struct spi_driver ad9850_driver 
        .probe = ad9850_probe,
        .remove = __devexit_p(ad9850_remove),
  };
 -
 -static __init int ad9850_spi_init(void)
 -{
 -      return spi_register_driver(&ad9850_driver);
 -}
 -module_init(ad9850_spi_init);
 -
 -static __exit void ad9850_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad9850_driver);
 -}
 -module_exit(ad9850_spi_exit);
 +module_spi_driver(ad9850_driver);
  
  MODULE_AUTHOR("Cliff Cai");
  MODULE_DESCRIPTION("Analog Devices ad9850 driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:" DRV_NAME);
index 9fc73fdc9c3b09a521a97c3a31e0ac07d1f9b424,5a338d2d06f71ce4e8c9ac160a11bd7e647507e3..554266c615a811a4fd6d4bc1de30a4b6521bf292
@@@ -280,8 -280,20 +280,9 @@@ static struct spi_driver ad9852_driver 
        .probe = ad9852_probe,
        .remove = __devexit_p(ad9852_remove),
  };
 -
 -static __init int ad9852_spi_init(void)
 -{
 -      return spi_register_driver(&ad9852_driver);
 -}
 -module_init(ad9852_spi_init);
 -
 -static __exit void ad9852_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad9852_driver);
 -}
 -module_exit(ad9852_spi_exit);
 +module_spi_driver(ad9852_driver);
  
  MODULE_AUTHOR("Cliff Cai");
  MODULE_DESCRIPTION("Analog Devices ad9852 driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:" DRV_NAME);
index 57046b03121fe41c96fe8dd5ab6418cecf12688d,a87ba8481cdffe1f437c577b7d5b069b296cab54..3985766d6f872ecf6313d91861aa9b821eaee8b2
@@@ -413,8 -413,20 +413,9 @@@ static struct spi_driver ad9910_driver 
        .probe = ad9910_probe,
        .remove = __devexit_p(ad9910_remove),
  };
 -
 -static __init int ad9910_spi_init(void)
 -{
 -      return spi_register_driver(&ad9910_driver);
 -}
 -module_init(ad9910_spi_init);
 -
 -static __exit void ad9910_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad9910_driver);
 -}
 -module_exit(ad9910_spi_exit);
 +module_spi_driver(ad9910_driver);
  
  MODULE_AUTHOR("Cliff Cai");
  MODULE_DESCRIPTION("Analog Devices ad9910 driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:" DRV_NAME);
index d29130e9acdf25aca1b137b1157e743f69e33e7f,42aea15592661c7a011b9894085adff77d887c10..4d150048002a53ef1bdd3e377844956091d21794
@@@ -224,8 -224,20 +224,9 @@@ static struct spi_driver ad9951_driver 
        .probe = ad9951_probe,
        .remove = __devexit_p(ad9951_remove),
  };
 -
 -static __init int ad9951_spi_init(void)
 -{
 -      return spi_register_driver(&ad9951_driver);
 -}
 -module_init(ad9951_spi_init);
 -
 -static __exit void ad9951_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad9951_driver);
 -}
 -module_exit(ad9951_spi_exit);
 +module_spi_driver(ad9951_driver);
  
  MODULE_AUTHOR("Cliff Cai");
  MODULE_DESCRIPTION("Analog Devices ad9951 driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:" DRV_NAME);
index 9405f2d368eecde63df86c02874919d846bc2f6e,ed37ef6df3b24f6e3cef439778192a6b1337cf95..1815490db8b4f7fecc4c542ccffbb7eb3422df98
@@@ -189,8 -189,20 +189,9 @@@ static struct spi_driver adis16080_driv
        .probe = adis16080_probe,
        .remove = __devexit_p(adis16080_remove),
  };
 -
 -static __init int adis16080_init(void)
 -{
 -      return spi_register_driver(&adis16080_driver);
 -}
 -module_init(adis16080_init);
 -
 -static __exit void adis16080_exit(void)
 -{
 -      spi_unregister_driver(&adis16080_driver);
 -}
 -module_exit(adis16080_exit);
 +module_spi_driver(adis16080_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices ADIS16080/100 Yaw Rate Gyroscope Driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:adis16080");
index c9aaca9631f465ae1d36a87bac3c614d8ebcccf7,8c2dd44e45c2f4fd076ea90481cbb46a7d63c382..947eb86f05d8e493282f73b04483218eb3a59050
@@@ -168,8 -168,20 +168,9 @@@ static struct spi_driver adis16130_driv
        .probe = adis16130_probe,
        .remove = __devexit_p(adis16130_remove),
  };
 -
 -static __init int adis16130_init(void)
 -{
 -      return spi_register_driver(&adis16130_driver);
 -}
 -module_init(adis16130_init);
 -
 -static __exit void adis16130_exit(void)
 -{
 -      spi_unregister_driver(&adis16130_driver);
 -}
 -module_exit(adis16130_exit);
 +module_spi_driver(adis16130_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices ADIS16130 High Precision Angular Rate");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:adis16130");
index 886dddf867ef59cf6407ff59875d2dbee1b96197,871f76bb3c382db281fae9de3e1e8c59f669de29..8f6af47e9559fb1484b272132ad6a668153bd7b5
@@@ -20,7 -20,7 +20,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  
  #include "adis16260.h"
  
@@@ -390,9 -390,9 +390,9 @@@ enum adis16260_channel 
  #define ADIS16260_GYRO_CHANNEL_SET(axis, mod)                         \
        struct iio_chan_spec adis16260_channels_##axis[] = {            \
                IIO_CHAN(IIO_ANGL_VEL, 1, 0, 0, NULL, 0, mod,           \
-                        (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |      \
-                        (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) |     \
-                        (1 << IIO_CHAN_INFO_SCALE_SEPARATE),           \
+                        IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT | \
+                        IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT |        \
+                        IIO_CHAN_INFO_SCALE_SEPARATE_BIT,              \
                         gyro, ADIS16260_SCAN_GYRO,                     \
                         IIO_ST('s', 14, 16, 0), 0),                    \
                IIO_CHAN(IIO_ANGL, 1, 0, 0, NULL, 0, mod,               \
                         angle, ADIS16260_SCAN_ANGL,                    \
                         IIO_ST('u', 14, 16, 0), 0),                    \
                IIO_CHAN(IIO_TEMP, 0, 1, 0, NULL, 0, 0,                 \
-                        (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |         \
-                        (1 << IIO_CHAN_INFO_SCALE_SEPARATE),           \
+                        IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |            \
+                        IIO_CHAN_INFO_SCALE_SEPARATE_BIT,              \
                         temp, ADIS16260_SCAN_TEMP,                     \
                         IIO_ST('u', 12, 16, 0), 0),                    \
                IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, "supply", 0, 0,          \
-                        (1 << IIO_CHAN_INFO_SCALE_SEPARATE),           \
+                        IIO_CHAN_INFO_SCALE_SEPARATE_BIT,              \
                         in_supply, ADIS16260_SCAN_SUPPLY,              \
                         IIO_ST('u', 12, 16, 0), 0),                    \
                IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 1, 0,              \
-                        (1 << IIO_CHAN_INFO_SCALE_SEPARATE),           \
+                        IIO_CHAN_INFO_SCALE_SEPARATE_BIT,              \
                         in_aux, ADIS16260_SCAN_AUX_ADC,                \
                         IIO_ST('u', 12, 16, 0), 0),                    \
                IIO_CHAN_SOFT_TIMESTAMP(5)                              \
@@@ -464,8 -464,7 +464,7 @@@ static int adis16260_read_raw(struct ii
                *val = val16;
                mutex_unlock(&indio_dev->mlock);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                switch (chan->type) {
                case IIO_ANGL_VEL:
                        *val = 0;
                        return -EINVAL;
                }
                break;
-       case (1 << IIO_CHAN_INFO_OFFSET_SEPARATE):
+       case IIO_CHAN_INFO_OFFSET:
                *val = 25;
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                switch (chan->type) {
                case IIO_ANGL_VEL:
                        bits = 12;
                *val = val16;
                mutex_unlock(&indio_dev->mlock);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
+       case IIO_CHAN_INFO_CALIBSCALE:
                switch (chan->type) {
                case IIO_ANGL_VEL:
                        bits = 12;
@@@ -544,11 -543,11 +543,11 @@@ static int adis16260_write_raw(struct i
        s16 val16;
        u8 addr;
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                val16 = val & ((1 << bits) - 1);
                addr = adis16260_addresses[chan->address][1];
                return adis16260_spi_write_reg_16(indio_dev, addr, val16);
-       case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
+       case IIO_CHAN_INFO_CALIBSCALE:
                val16 = val & ((1 << bits) - 1);
                addr = adis16260_addresses[chan->address][2];
                return adis16260_spi_write_reg_16(indio_dev, addr, val16);
@@@ -633,11 -632,16 +632,16 @@@ static int __devinit adis16260_probe(st
        }
        if (indio_dev->buffer) {
                /* Set default scan mode */
-               iio_scan_mask_set(indio_dev->buffer, ADIS16260_SCAN_SUPPLY);
-               iio_scan_mask_set(indio_dev->buffer, ADIS16260_SCAN_GYRO);
-               iio_scan_mask_set(indio_dev->buffer, ADIS16260_SCAN_AUX_ADC);
-               iio_scan_mask_set(indio_dev->buffer, ADIS16260_SCAN_TEMP);
-               iio_scan_mask_set(indio_dev->buffer, ADIS16260_SCAN_ANGL);
+               iio_scan_mask_set(indio_dev, indio_dev->buffer,
+                                 ADIS16260_SCAN_SUPPLY);
+               iio_scan_mask_set(indio_dev, indio_dev->buffer,
+                                 ADIS16260_SCAN_GYRO);
+               iio_scan_mask_set(indio_dev, indio_dev->buffer,
+                                 ADIS16260_SCAN_AUX_ADC);
+               iio_scan_mask_set(indio_dev, indio_dev->buffer,
+                                 ADIS16260_SCAN_TEMP);
+               iio_scan_mask_set(indio_dev, indio_dev->buffer,
+                                 ADIS16260_SCAN_ANGL);
        }
        if (spi->irq) {
                ret = adis16260_probe_trigger(indio_dev);
@@@ -701,6 -705,7 +705,7 @@@ static const struct spi_device_id adis1
        {"adis16251", 1},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, adis16260_id);
  
  static struct spi_driver adis16260_driver = {
        .driver = {
        .remove = __devexit_p(adis16260_remove),
        .id_table = adis16260_id,
  };
 -
 -static __init int adis16260_init(void)
 -{
 -      return spi_register_driver(&adis16260_driver);
 -}
 -module_init(adis16260_init);
 -
 -static __exit void adis16260_exit(void)
 -{
 -      spi_unregister_driver(&adis16260_driver);
 -}
 -module_exit(adis16260_exit);
 +module_spi_driver(adis16260_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices ADIS16260/5 Digital Gyroscope Sensor");
index 70fd468b685077ee665d4e2f55d185120a44389c,e832aeabd8798965e675cca02c4778e471712ba9..0754eebda712fe7e285e5c65ebc0739941d17ee5
@@@ -243,7 -243,7 +243,7 @@@ static int adxrs450_write_raw(struct ii
  {
        int ret;
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                ret = adxrs450_spi_write_reg_16(indio_dev,
                                                ADXRS450_DNC1,
                                                val & 0x3FF);
@@@ -287,7 -287,7 +287,7 @@@ static int adxrs450_read_raw(struct iio
                        break;
                }
                break;
-       case (1 << IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SEPARATE):
+       case IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW:
                ret = adxrs450_spi_read_reg_16(indio_dev, ADXRS450_QUAD1, &t);
                if (ret)
                        break;
@@@ -307,8 -307,8 +307,8 @@@ static const struct iio_chan_spec adxrs
                .type = IIO_ANGL_VEL,
                .modified = 1,
                .channel2 = IIO_MOD_Z,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SEPARATE)
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SEPARATE_BIT,
        }, {
                .type = IIO_TEMP,
                .indexed = 1,
@@@ -381,8 -381,20 +381,9 @@@ static struct spi_driver adxrs450_drive
        .probe = adxrs450_probe,
        .remove = __devexit_p(adxrs450_remove),
  };
 -
 -static __init int adxrs450_init(void)
 -{
 -      return spi_register_driver(&adxrs450_driver);
 -}
 -module_init(adxrs450_init);
 -
 -static __exit void adxrs450_exit(void)
 -{
 -      spi_unregister_driver(&adxrs450_driver);
 -}
 -module_exit(adxrs450_exit);
 +module_spi_driver(adxrs450_driver);
  
  MODULE_AUTHOR("Cliff Cai <cliff.cai@xxxxxxxxxx>");
  MODULE_DESCRIPTION("Analog Devices ADXRS450 Gyroscope SPI driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:adxrs450");
index 454d131455dea337b1f12661f581187fa952188e,f02d1c06b4541362c644e08ecef5b37ea0e05abc..9a2ca55625f407317f52364634cd3cd288ca5867
@@@ -21,7 -21,7 +21,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  #include "../ring_sw.h"
  
  #include "ad5933.h"
@@@ -113,10 -113,10 +113,10 @@@ static struct iio_chan_spec ad5933_chan
                 0, AD5933_REG_TEMP_DATA, IIO_ST('s', 14, 16, 0), 0),
        /* Ring Channels */
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, "real_raw", 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 AD5933_REG_REAL_DATA, 0, IIO_ST('s', 16, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, "imag_raw", 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 AD5933_REG_IMAG_DATA, 1, IIO_ST('s', 16, 16, 0), 0),
  };
  
@@@ -329,7 -329,7 +329,7 @@@ static ssize_t ad5933_show(struct devic
        int ret = 0, len = 0;
  
        mutex_lock(&indio_dev->mlock);
-       switch (this_attr->address) {
+       switch ((u32) this_attr->address) {
        case AD5933_OUT_RANGE:
                len = sprintf(buf, "%d\n",
                              st->range_avail[(st->ctrl_hb >> 1) & 0x3]);
@@@ -380,7 -380,7 +380,7 @@@ static ssize_t ad5933_store(struct devi
        }
  
        mutex_lock(&indio_dev->mlock);
-       switch (this_attr->address) {
+       switch ((u32) this_attr->address) {
        case AD5933_OUT_RANGE:
                for (i = 0; i < 4; i++)
                        if (val == st->range_avail[i]) {
@@@ -537,14 -537,14 +537,14 @@@ static const struct iio_info ad5933_inf
  static int ad5933_ring_preenable(struct iio_dev *indio_dev)
  {
        struct ad5933_state *st = iio_priv(indio_dev);
-       struct iio_buffer *ring = indio_dev->buffer;
        size_t d_size;
        int ret;
  
-       if (!ring->scan_count)
+       if (bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
                return -EINVAL;
  
-       d_size = ring->scan_count *
+       d_size = bitmap_weight(indio_dev->active_scan_mask,
+                              indio_dev->masklength) *
                 ad5933_channels[1].scan_type.storagebits / 8;
  
        if (indio_dev->buffer->access->set_bytes_per_datum)
@@@ -611,7 -611,7 +611,7 @@@ static int ad5933_register_ring_funcs_a
        indio_dev->buffer->access = &ring_sw_access_funcs;
  
        /* Ring buffer functions - here trigger setup related */
-       indio_dev->buffer->setup_ops = &ad5933_ring_setup_ops;
+       indio_dev->setup_ops = &ad5933_ring_setup_ops;
  
        indio_dev->modes |= INDIO_BUFFER_HARDWARE;
  
@@@ -640,12 -640,14 +640,14 @@@ static void ad5933_work(struct work_str
        ad5933_i2c_read(st->client, AD5933_REG_STATUS, 1, &status);
  
        if (status & AD5933_STAT_DATA_VALID) {
+               int scan_count = bitmap_weight(indio_dev->active_scan_mask,
+                                              indio_dev->masklength);
                ad5933_i2c_read(st->client,
-                               test_bit(1, ring->scan_mask) ?
+                               test_bit(1, indio_dev->active_scan_mask) ?
                                AD5933_REG_REAL_DATA : AD5933_REG_IMAG_DATA,
-                               ring->scan_count * 2, (u8 *)buf);
+                               scan_count * 2, (u8 *)buf);
  
-               if (ring->scan_count == 2) {
+               if (scan_count == 2) {
                        buf[0] = be16_to_cpu(buf[0]);
                        buf[1] = be16_to_cpu(buf[1]);
                } else {
@@@ -734,8 -736,8 +736,8 @@@ static int __devinit ad5933_probe(struc
                goto error_unreg_ring;
  
        /* enable both REAL and IMAG channels by default */
-       iio_scan_mask_set(indio_dev->buffer, 0);
-       iio_scan_mask_set(indio_dev->buffer, 1);
+       iio_scan_mask_set(indio_dev, indio_dev->buffer, 0);
+       iio_scan_mask_set(indio_dev, indio_dev->buffer, 1);
  
        ret = ad5933_setup(st);
        if (ret)
@@@ -796,7 -798,18 +798,7 @@@ static struct i2c_driver ad5933_driver 
        .remove = __devexit_p(ad5933_remove),
        .id_table = ad5933_id,
  };
 -
 -static __init int ad5933_init(void)
 -{
 -      return i2c_add_driver(&ad5933_driver);
 -}
 -module_init(ad5933_init);
 -
 -static __exit void ad5933_exit(void)
 -{
 -      i2c_del_driver(&ad5933_driver);
 -}
 -module_exit(ad5933_exit);
 +module_i2c_driver(ad5933_driver);
  
  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  MODULE_DESCRIPTION("Analog Devices AD5933 Impedance Conv. Network Analyzer");
index efc0f652900803c4a13b15dd868b766ddeba4fbf,de12f9acfd269d64d334913e6bba3a5f29cf8792..e73ad7818d85ea76c399339be5cc481aa2d32c73
@@@ -28,7 -28,7 +28,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  #include "adis16400.h"
  
  enum adis16400_chip_variant {
@@@ -161,25 -161,65 +161,65 @@@ error_ret
        return ret;
  }
  
+ static int adis16400_get_freq(struct iio_dev *indio_dev)
+ {
+       u16 t;
+       int sps, ret;
+       ret = adis16400_spi_read_reg_16(indio_dev, ADIS16400_SMPL_PRD, &t);
+       if (ret < 0)
+               return ret;
+       sps =  (t & ADIS16400_SMPL_PRD_TIME_BASE) ? 53 : 1638;
+       sps /= (t & ADIS16400_SMPL_PRD_DIV_MASK) + 1;
+       return sps;
+ }
  static ssize_t adis16400_read_frequency(struct device *dev,
                struct device_attribute *attr,
                char *buf)
  {
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
        int ret, len = 0;
-       u16 t;
-       int sps;
-       ret = adis16400_spi_read_reg_16(indio_dev,
-                       ADIS16400_SMPL_PRD,
-                       &t);
-       if (ret)
+       ret = adis16400_get_freq(indio_dev);
+       if (ret < 0)
                return ret;
-       sps =  (t & ADIS16400_SMPL_PRD_TIME_BASE) ? 53 : 1638;
-       sps /= (t & ADIS16400_SMPL_PRD_DIV_MASK) + 1;
-       len = sprintf(buf, "%d SPS\n", sps);
+       len = sprintf(buf, "%d SPS\n", ret);
        return len;
  }
  
+ static const unsigned adis16400_3db_divisors[] = {
+       [0] = 2, /* Special case */
+       [1] = 5,
+       [2] = 10,
+       [3] = 50,
+       [4] = 200,
+ };
+ static int adis16400_set_filter(struct iio_dev *indio_dev, int sps, int val)
+ {
+       int i, ret;
+       u16 val16;
+       for (i = ARRAY_SIZE(adis16400_3db_divisors) - 1; i >= 0; i--)
+               if (sps/adis16400_3db_divisors[i] > val)
+                       break;
+       if (i == -1)
+               ret = -EINVAL;
+       else {
+               ret = adis16400_spi_read_reg_16(indio_dev,
+                                               ADIS16400_SENS_AVG,
+                                               &val16);
+               if (ret < 0)
+                       goto error_ret;
+               ret = adis16400_spi_write_reg_16(indio_dev,
+                                                ADIS16400_SENS_AVG,
+                                                (val16 & ~0x03) | i);
+       }
+ error_ret:
+       return ret;
+ }
  static ssize_t adis16400_write_frequency(struct device *dev,
                struct device_attribute *attr,
                const char *buf,
                        ADIS16400_SMPL_PRD,
                        t);
  
+       /* Also update the filter */
        mutex_unlock(&indio_dev->mlock);
  
        return ret ? ret : len;
@@@ -455,22 -496,39 +496,39 @@@ static u8 adis16400_addresses[17][2] = 
        [incli_y] = { ADIS16300_ROLL_OUT }
  };
  
  static int adis16400_write_raw(struct iio_dev *indio_dev,
                               struct iio_chan_spec const *chan,
                               int val,
                               int val2,
                               long mask)
  {
-       int ret;
+       struct adis16400_state *st = iio_priv(indio_dev);
+       int ret, sps;
  
        switch (mask) {
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                mutex_lock(&indio_dev->mlock);
                ret = adis16400_spi_write_reg_16(indio_dev,
                                adis16400_addresses[chan->address][1],
                                val);
                mutex_unlock(&indio_dev->mlock);
                return ret;
+       case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
+               /* Need to cache values so we can update if the frequency
+                  changes */
+               mutex_lock(&indio_dev->mlock);
+               st->filt_int = val;
+               /* Work out update to current value */
+               sps = adis16400_get_freq(indio_dev);
+               if (sps < 0) {
+                       mutex_unlock(&indio_dev->mlock);
+                       return sps;
+               }
+               ret = adis16400_set_filter(indio_dev, sps, val);
+               mutex_unlock(&indio_dev->mlock);
+               return ret;
        default:
                return -EINVAL;
        }
@@@ -504,8 -562,7 +562,7 @@@ static int adis16400_read_raw(struct ii
                *val = val16;
                mutex_unlock(&indio_dev->mlock);
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
+       case IIO_CHAN_INFO_SCALE:
                switch (chan->type) {
                case IIO_ANGL_VEL:
                        *val = 0;
                default:
                        return -EINVAL;
                }
-       case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
+       case IIO_CHAN_INFO_CALIBBIAS:
                mutex_lock(&indio_dev->mlock);
                ret = adis16400_spi_read_reg_16(indio_dev,
                                adis16400_addresses[chan->address][1],
                val16 = ((val16 & 0xFFF) << 4) >> 4;
                *val = val16;
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_OFFSET_SEPARATE):
+       case IIO_CHAN_INFO_OFFSET:
                /* currently only temperature */
                *val = 198;
                *val2 = 160000;
                return IIO_VAL_INT_PLUS_MICRO;
+       case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
+               mutex_lock(&indio_dev->mlock);
+               /* Need both the number of taps and the sampling frequency */
+               ret = adis16400_spi_read_reg_16(indio_dev,
+                                               ADIS16400_SENS_AVG,
+                                               &val16);
+               if (ret < 0) {
+                       mutex_unlock(&indio_dev->mlock);
+                       return ret;
+               }
+               ret = adis16400_get_freq(indio_dev);
+               if (ret > 0)
+                       *val = ret/adis16400_3db_divisors[val16 & 0x03];
+               *val2 = 0;
+               mutex_unlock(&indio_dev->mlock);
+               if (ret < 0)
+                       return ret;
+               return IIO_VAL_INT_PLUS_MICRO;
        default:
                return -EINVAL;
        }
@@@ -560,7 -635,7 +635,7 @@@ static struct iio_chan_spec adis16400_c
                .indexed = 1,
                .channel = 0,
                .extend_name = "supply",
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .address = in_supply,
                .scan_index = ADIS16400_SCAN_SUPPLY,
                .scan_type = IIO_ST('u', 14, 16, 0)
                .type = IIO_ANGL_VEL,
                .modified = 1,
                .channel2 = IIO_MOD_X,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = gyro_x,
                .scan_index = ADIS16400_SCAN_GYRO_X,
                .scan_type = IIO_ST('s', 14, 16, 0)
                .type = IIO_ANGL_VEL,
                .modified = 1,
                .channel2 = IIO_MOD_Y,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = gyro_y,
                .scan_index = ADIS16400_SCAN_GYRO_Y,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ANGL_VEL,
                .modified = 1,
                .channel2 = IIO_MOD_Z,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = gyro_z,
                .scan_index = ADIS16400_SCAN_GYRO_Z,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ACCEL,
                .modified = 1,
                .channel2 = IIO_MOD_X,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = accel_x,
                .scan_index = ADIS16400_SCAN_ACC_X,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ACCEL,
                .modified = 1,
                .channel2 = IIO_MOD_Y,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = accel_y,
                .scan_index = ADIS16400_SCAN_ACC_Y,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ACCEL,
                .modified = 1,
                .channel2 = IIO_MOD_Z,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = accel_z,
                .scan_index = ADIS16400_SCAN_ACC_Z,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_MAGN,
                .modified = 1,
                .channel2 = IIO_MOD_X,
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = magn_x,
                .scan_index = ADIS16400_SCAN_MAGN_X,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_MAGN,
                .modified = 1,
                .channel2 = IIO_MOD_Y,
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = magn_y,
                .scan_index = ADIS16400_SCAN_MAGN_Y,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_MAGN,
                .modified = 1,
                .channel2 = IIO_MOD_Z,
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = magn_z,
                .scan_index = ADIS16400_SCAN_MAGN_Z,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_TEMP,
                .indexed = 1,
                .channel = 0,
-               .info_mask = (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .address = temp,
                .scan_index = ADIS16400_SCAN_TEMP,
                .scan_type = IIO_ST('s', 12, 16, 0),
                .type = IIO_VOLTAGE,
                .indexed = 1,
                .channel = 1,
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .address = in1,
                .scan_index = ADIS16400_SCAN_ADC_0,
                .scan_type = IIO_ST('s', 12, 16, 0),
@@@ -669,7 -753,7 +753,7 @@@ static struct iio_chan_spec adis16350_c
                .indexed = 1,
                .channel = 0,
                .extend_name = "supply",
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .address = in_supply,
                .scan_index = ADIS16400_SCAN_SUPPLY,
                .scan_type = IIO_ST('u', 12, 16, 0)
                .type = IIO_ANGL_VEL,
                .modified = 1,
                .channel2 = IIO_MOD_X,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = gyro_x,
                .scan_index = ADIS16400_SCAN_GYRO_X,
                .scan_type = IIO_ST('s', 14, 16, 0)
                .type = IIO_ANGL_VEL,
                .modified = 1,
                .channel2 = IIO_MOD_Y,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = gyro_y,
                .scan_index = ADIS16400_SCAN_GYRO_Y,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ANGL_VEL,
                .modified = 1,
                .channel2 = IIO_MOD_Z,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = gyro_z,
                .scan_index = ADIS16400_SCAN_GYRO_Z,
                .scan_type = IIO_ST('s', 14, 16, 0),
        .type = IIO_ACCEL,
                .modified = 1,
                .channel2 = IIO_MOD_X,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = accel_x,
                .scan_index = ADIS16400_SCAN_ACC_X,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ACCEL,
                .modified = 1,
                .channel2 = IIO_MOD_Y,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = accel_y,
                .scan_index = ADIS16400_SCAN_ACC_Y,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ACCEL,
                .modified = 1,
                .channel2 = IIO_MOD_Z,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = accel_z,
                .scan_index = ADIS16400_SCAN_ACC_Z,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .indexed = 1,
                .channel = 0,
                .extend_name = "x",
-               .info_mask = (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = temp0,
                .scan_index = ADIS16350_SCAN_TEMP_X,
                .scan_type = IIO_ST('s', 12, 16, 0),
                .indexed = 1,
                .channel = 1,
                .extend_name = "y",
-               .info_mask = (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = temp1,
                .scan_index = ADIS16350_SCAN_TEMP_Y,
                .scan_type = IIO_ST('s', 12, 16, 0),
                .indexed = 1,
                .channel = 2,
                .extend_name = "z",
-               .info_mask = (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .address = temp2,
                .scan_index = ADIS16350_SCAN_TEMP_Z,
                .scan_type = IIO_ST('s', 12, 16, 0),
                .type = IIO_VOLTAGE,
                .indexed = 1,
                .channel = 1,
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .address = in1,
                .scan_index = ADIS16350_SCAN_ADC_0,
                .scan_type = IIO_ST('s', 12, 16, 0),
@@@ -775,7 -867,7 +867,7 @@@ static struct iio_chan_spec adis16300_c
                .indexed = 1,
                .channel = 0,
                .extend_name = "supply",
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .address = in_supply,
                .scan_index = ADIS16400_SCAN_SUPPLY,
                .scan_type = IIO_ST('u', 12, 16, 0)
                .type = IIO_ANGL_VEL,
                .modified = 1,
                .channel2 = IIO_MOD_X,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = gyro_x,
                .scan_index = ADIS16400_SCAN_GYRO_X,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ACCEL,
                .modified = 1,
                .channel2 = IIO_MOD_X,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = accel_x,
                .scan_index = ADIS16400_SCAN_ACC_X,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ACCEL,
                .modified = 1,
                .channel2 = IIO_MOD_Y,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = accel_y,
                .scan_index = ADIS16400_SCAN_ACC_Y,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ACCEL,
                .modified = 1,
                .channel2 = IIO_MOD_Z,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = accel_z,
                .scan_index = ADIS16400_SCAN_ACC_Z,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_TEMP,
                .indexed = 1,
                .channel = 0,
-               .info_mask = (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .address = temp,
                .scan_index = ADIS16400_SCAN_TEMP,
                .scan_type = IIO_ST('s', 12, 16, 0),
                .type = IIO_VOLTAGE,
                .indexed = 1,
                .channel = 1,
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                .address = in1,
                .scan_index = ADIS16350_SCAN_ADC_0,
                .scan_type = IIO_ST('s', 12, 16, 0),
                .type = IIO_INCLI,
                .modified = 1,
                .channel2 = IIO_MOD_X,
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                .address = incli_x,
                .scan_index = ADIS16300_SCAN_INCLI_X,
                .scan_type = IIO_ST('s', 13, 16, 0),
                .type = IIO_INCLI,
                .modified = 1,
                .channel2 = IIO_MOD_Y,
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,
                .address = incli_y,
                .scan_index = ADIS16300_SCAN_INCLI_Y,
                .scan_type = IIO_ST('s', 13, 16, 0),
@@@ -857,8 -953,9 +953,9 @@@ static const struct iio_chan_spec adis1
                .type = IIO_ANGL_VEL,
                .modified = 1,
                .channel2 = IIO_MOD_X,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = gyro_x,
                .scan_index = ADIS16400_SCAN_GYRO_X,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ANGL_VEL,
                .modified = 1,
                .channel2 = IIO_MOD_Y,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = gyro_y,
                .scan_index = ADIS16400_SCAN_GYRO_Y,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ANGL_VEL,
                .modified = 1,
                .channel2 = IIO_MOD_Z,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = gyro_z,
                .scan_index = ADIS16400_SCAN_GYRO_Z,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ACCEL,
                .modified = 1,
                .channel2 = IIO_MOD_X,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = accel_x,
                .scan_index = ADIS16400_SCAN_ACC_X,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ACCEL,
                .modified = 1,
                .channel2 = IIO_MOD_Y,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = accel_y,
                .scan_index = ADIS16400_SCAN_ACC_Y,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_ACCEL,
                .modified = 1,
                .channel2 = IIO_MOD_Z,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT |
+               IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT,
                .address = accel_z,
                .scan_index = ADIS16400_SCAN_ACC_Z,
                .scan_type = IIO_ST('s', 14, 16, 0),
                .type = IIO_TEMP,
                .indexed = 1,
                .channel = 0,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) |
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               .info_mask = IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                .address = accel_z,
                .scan_index = ADIS16400_SCAN_ACC_Z,
                .scan_type = IIO_ST('s', 14, 16, 0),
@@@ -1118,6 -1220,7 +1220,7 @@@ static const struct spi_device_id adis1
        {"adis16405", ADIS16400},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, adis16400_id);
  
  static struct spi_driver adis16400_driver = {
        .driver = {
        .probe = adis16400_probe,
        .remove = __devexit_p(adis16400_remove),
  };
 -
 -static __init int adis16400_init(void)
 -{
 -      return spi_register_driver(&adis16400_driver);
 -}
 -module_init(adis16400_init);
 -
 -static __exit void adis16400_exit(void)
 -{
 -      spi_unregister_driver(&adis16400_driver);
 -}
 -module_exit(adis16400_exit);
 +module_spi_driver(adis16400_driver);
  
  MODULE_AUTHOR("Manuel Stahl <manuel.stahl@iis.fraunhofer.de>");
  MODULE_DESCRIPTION("Analog Devices ADIS16400/5 IMU SPI driver");
index 68a4d4e8c63526122e8c6da7a979d55b1c57ecdc,20dc8e87d1cd7a30b8fdb4f51830d02b99cac6bd..47ecadd4818d5427771c302585edff8909a9e777
@@@ -159,13 -159,12 +159,12 @@@ EXPORT_SYMBOL(iio_trigger_generic_data_
  void iio_trigger_poll_chained(struct iio_trigger *trig, s64 time)
  {
        int i;
-       if (!trig->use_count) {
+       if (!trig->use_count)
                for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++)
                        if (trig->subirqs[i].enabled) {
                                trig->use_count++;
                                handle_nested_irq(trig->subirq_base + i);
                        }
-       }
  }
  EXPORT_SYMBOL(iio_trigger_poll_chained);
  
@@@ -173,10 -172,9 +172,9 @@@ void iio_trigger_notify_done(struct iio
  {
        trig->use_count--;
        if (trig->use_count == 0 && trig->ops && trig->ops->try_reenable)
-               if (trig->ops->try_reenable(trig)) {
+               if (trig->ops->try_reenable(trig))
                        /* Missed and interrupt so launch new poll now */
                        iio_trigger_poll(trig, 0);
-               }
  }
  EXPORT_SYMBOL(iio_trigger_notify_done);
  
@@@ -222,8 -220,16 +220,16 @@@ static int iio_trigger_attach_poll_func
        ret = request_threaded_irq(pf->irq, pf->h, pf->thread,
                                   pf->type, pf->name,
                                   pf);
-       if (trig->ops && trig->ops->set_trigger_state && notinuse)
+       if (ret < 0) {
+               module_put(pf->indio_dev->info->driver_module);
+               return ret;
+       }
+       if (trig->ops && trig->ops->set_trigger_state && notinuse) {
                ret = trig->ops->set_trigger_state(trig, true);
+               if (ret < 0)
+                       module_put(pf->indio_dev->info->driver_module);
+       }
  
        return ret;
  }
@@@ -295,7 -301,7 +301,7 @@@ void iio_dealloc_pollfunc(struct iio_po
  EXPORT_SYMBOL_GPL(iio_dealloc_pollfunc);
  
  /**
 - * iio_trigger_read_currrent() - trigger consumer sysfs query which trigger
 + * iio_trigger_read_current() - trigger consumer sysfs query which trigger
   *
   * For trigger consumers the current_trigger interface allows the trigger
   * used by the device to be queried.
@@@ -336,6 -342,8 +342,8 @@@ static ssize_t iio_trigger_write_curren
        mutex_unlock(&indio_dev->mlock);
  
        trig = iio_trigger_find_by_name(buf, len);
+       if (oldtrig == trig)
+               return len;
  
        if (trig && indio_dev->info->validate_trigger) {
                ret = indio_dev->info->validate_trigger(indio_dev, trig);
@@@ -473,12 -481,10 +481,10 @@@ void iio_free_trigger(struct iio_trigge
  }
  EXPORT_SYMBOL(iio_free_trigger);
  
int iio_device_register_trigger_consumer(struct iio_dev *indio_dev)
void iio_device_register_trigger_consumer(struct iio_dev *indio_dev)
  {
        indio_dev->groups[indio_dev->groupcounter++] =
                &iio_trigger_consumer_attr_group;
-       return 0;
  }
  
  void iio_device_unregister_trigger_consumer(struct iio_dev *indio_dev)
  
  int iio_triggered_buffer_postenable(struct iio_dev *indio_dev)
  {
-       return indio_dev->trig
-               ? iio_trigger_attach_poll_func(indio_dev->trig,
-                                              indio_dev->pollfunc)
-               : 0;
+       return iio_trigger_attach_poll_func(indio_dev->trig,
+                                           indio_dev->pollfunc);
  }
  EXPORT_SYMBOL(iio_triggered_buffer_postenable);
  
  int iio_triggered_buffer_predisable(struct iio_dev *indio_dev)
  {
-       return indio_dev->trig
-               ? iio_trigger_dettach_poll_func(indio_dev->trig,
-                                               indio_dev->pollfunc)
-               : 0;
+       return iio_trigger_dettach_poll_func(indio_dev->trig,
+                                            indio_dev->pollfunc);
  }
  EXPORT_SYMBOL(iio_triggered_buffer_predisable);
index 47638362224b1a129b2b7f9b263f56b04d0bb267,f0c733a2826a09ae4366d8d19ce2019f00ebb38a..849d6a564afa956002a6b18610042d25abdcbd9a
@@@ -362,8 -362,7 +362,7 @@@ static int isl29018_write_raw(struct ii
        int ret = -EINVAL;
  
        mutex_lock(&chip->lock);
-       if (mask == (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) &&
-           chan->type == IIO_LIGHT) {
+       if (mask == IIO_CHAN_INFO_CALIBSCALE && chan->type == IIO_LIGHT) {
                chip->lux_scale = val;
                ret = 0;
        }
@@@ -402,7 -401,7 +401,7 @@@ static int isl29018_read_raw(struct iio
                if (!ret)
                        ret = IIO_VAL_INT;
                break;
-       case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
+       case IIO_CHAN_INFO_CALIBSCALE:
                if (chan->type == IIO_LIGHT) {
                        *val = chip->lux_scale;
                        ret = IIO_VAL_INT;
@@@ -421,7 -420,7 +420,7 @@@ static const struct iio_chan_spec isl29
                .indexed = 1,
                .channel = 0,
                .processed_val = IIO_PROCESSED,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT,
        }, {
                .type = IIO_INTENSITY,
                .modified = 1,
@@@ -603,7 -602,19 +602,7 @@@ static struct i2c_driver isl29018_drive
        .remove  = __devexit_p(isl29018_remove),
        .id_table = isl29018_id,
  };
 -
 -static int __init isl29018_init(void)
 -{
 -      return i2c_add_driver(&isl29018_driver);
 -}
 -
 -static void __exit isl29018_exit(void)
 -{
 -      i2c_del_driver(&isl29018_driver);
 -}
 -
 -module_init(isl29018_init);
 -module_exit(isl29018_exit);
 +module_i2c_driver(isl29018_driver);
  
  MODULE_DESCRIPTION("ISL29018 Ambient Light Sensor driver");
  MODULE_LICENSE("GPL");
index 1942db13b03baee860fae08ea87ba7ba3a19cda7,9199ea62aef60e4c81fbf1fc6696fb48f3e94837..ffca85e81ef55cdacbcd3ac872d5b33bd0dc3462
@@@ -37,6 -37,7 +37,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
+ #include "../events.h"
  #include "tsl2563.h"
  
  /* Use this many bits for fraction part. */
@@@ -226,6 -227,8 +227,8 @@@ static int tsl2563_read_id(struct tsl25
        if (ret < 0)
                return ret;
  
+       *id = ret;
        return 0;
  }
  
@@@ -510,7 -513,7 +513,7 @@@ static int tsl2563_read_raw(struct iio_
                }
                break;
  
-       case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
+       case IIO_CHAN_INFO_CALIBSCALE:
                if (chan->channel == 0)
                        *val = calib_to_sysfs(chip->calib0);
                else
@@@ -536,7 -539,7 +539,7 @@@ static const struct iio_chan_spec tsl25
                .type = IIO_INTENSITY,
                .modified = 1,
                .channel2 = IIO_MOD_LIGHT_BOTH,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE),
+               .info_mask = IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT,
                .event_mask = (IIO_EV_BIT(IIO_EV_TYPE_THRESH,
                                          IIO_EV_DIR_RISING) |
                               IIO_EV_BIT(IIO_EV_TYPE_THRESH,
        }, {
                .type = IIO_INTENSITY,
                .modified = 1,
-               .channel2 = IIO_MOD_LIGHT_BOTH,
-               .info_mask = (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE),
+               .channel2 = IIO_MOD_LIGHT_IR,
+               .info_mask = IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT,
        }
  };
  
@@@ -866,8 -869,20 +869,8 @@@ static struct i2c_driver tsl2563_i2c_dr
        .remove         = __devexit_p(tsl2563_remove),
        .id_table       = tsl2563_id,
  };
 -
 -static int __init tsl2563_init(void)
 -{
 -      return i2c_add_driver(&tsl2563_i2c_driver);
 -}
 -
 -static void __exit tsl2563_exit(void)
 -{
 -      i2c_del_driver(&tsl2563_i2c_driver);
 -}
 +module_i2c_driver(tsl2563_i2c_driver);
  
  MODULE_AUTHOR("Nokia Corporation");
  MODULE_DESCRIPTION("tsl2563 light sensor driver");
  MODULE_LICENSE("GPL");
 -
 -module_init(tsl2563_init);
 -module_exit(tsl2563_exit);
index 3836f73a52966b6ddde984cac4557ff944af0c75,25f4c1dd5bf2665b72fa8d3a3b6badf3b39a068c..5b6455a238d8b3c62bd9078bf90758f86f3c848f
@@@ -194,6 -194,7 +194,7 @@@ static int taos_get_lux(struct iio_dev 
  {
        u16 ch0, ch1; /* separated ch0/ch1 data from device */
        u32 lux; /* raw lux calculated from device data */
+       u64 lux64;
        u32 ratio;
        u8 buf[5];
        struct taos_lux *p;
                lux = (lux + (chip->als_time_scale >> 1)) /
                        chip->als_time_scale;
  
-       /* adjust for active gain scale */
-       lux >>= 13; /* tables have factor of 8192 builtin for accuracy */
-       lux = (lux * chip->taos_settings.als_gain_trim + 500) / 1000;
+       /* Adjust for active gain scale.
+        * The taos_device_lux tables above have a factor of 8192 built in,
+        * so we need to shift right.
+        * User-specified gain provides a multiplier.
+        * Apply user-specified gain before shifting right to retain precision.
+        * Use 64 bits to avoid overflow on multiplication.
+        * Then go back to 32 bits before division to avoid using div_u64().
+        */
+       lux64 = lux;
+       lux64 = lux64 * chip->taos_settings.als_gain_trim;
+       lux64 >>= 13;
+       lux = lux64;
+       lux = (lux + 500) / 1000;
        if (lux > TSL258X_LUX_CALC_OVER_FLOW) { /* check for overflow */
  return_max:
                lux = TSL258X_LUX_CALC_OVER_FLOW;
@@@ -933,7 -944,19 +944,7 @@@ static struct i2c_driver taos_driver = 
        .probe = taos_probe,
        .remove = __devexit_p(taos_remove),
  };
 -
 -static int __init taos_init(void)
 -{
 -      return i2c_add_driver(&taos_driver);
 -}
 -
 -static void __exit taos_exit(void)
 -{
 -      i2c_del_driver(&taos_driver);
 -}
 -
 -module_init(taos_init);
 -module_exit(taos_exit);
 +module_i2c_driver(taos_driver);
  
  MODULE_AUTHOR("J. August Brenner<jbrenner@taosinc.com>");
  MODULE_DESCRIPTION("TAOS tsl2583 ambient light sensor driver");
index db31d6d0e5b6b1ab2f2e7be87faa9c54429626c3,a2c4d005803d1e85616d17c049a19f6d05d4f8b8..3158f12cb051fef997c872e7ad6278856c641c54
@@@ -431,7 -431,7 +431,7 @@@ static int ak8975_read_raw(struct iio_d
        switch (mask) {
        case 0:
                return ak8975_read_axis(indio_dev, chan->address, val);
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
+       case IIO_CHAN_INFO_SCALE:
                *val = data->raw_to_gauss[chan->address];
                return IIO_VAL_INT;
        }
                .type = IIO_MAGN,                                       \
                .modified = 1,                                          \
                .channel2 = IIO_MOD_##axis,                             \
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SEPARATE),       \
+               .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT,  \
                .address = index,                                       \
        }
  
@@@ -572,7 -572,19 +572,7 @@@ static struct i2c_driver ak8975_driver 
        .remove         = __devexit_p(ak8975_remove),
        .id_table       = ak8975_id,
  };
 -
 -static int __init ak8975_init(void)
 -{
 -      return i2c_add_driver(&ak8975_driver);
 -}
 -
 -static void __exit ak8975_exit(void)
 -{
 -      i2c_del_driver(&ak8975_driver);
 -}
 -
 -module_init(ak8975_init);
 -module_exit(ak8975_exit);
 +module_i2c_driver(ak8975_driver);
  
  MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
  MODULE_DESCRIPTION("AK8975 magnetometer driver");
index 7bb1bc605136e366623964e5b6f5937ea24a0c8c,b492a0c0b8db239589e805daf4eb2a24b1e846db..f2e85a9cf196e948f291adf9fc58bf78b8ff3fba
@@@ -463,7 -463,7 +463,7 @@@ static int hmc5843_read_raw(struct iio_
                return hmc5843_read_measurement(indio_dev,
                                                chan->address,
                                                val);
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
+       case IIO_CHAN_INFO_SCALE:
                *val = 0;
                *val2 = hmc5843_regval_to_nanoscale[data->range];
                return IIO_VAL_INT_PLUS_NANO;
                .type = IIO_MAGN,                                       \
                .modified = 1,                                          \
                .channel2 = IIO_MOD_##axis,                             \
-               .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED),         \
+               .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT,            \
                .address = add                                          \
        }
  
@@@ -605,6 -605,7 +605,7 @@@ static const struct i2c_device_id hmc58
        { "hmc5843", 0 },
        { }
  };
+ MODULE_DEVICE_TABLE(i2c, hmc5843_id);
  
  static struct i2c_driver hmc5843_driver = {
        .driver = {
        .suspend        = hmc5843_suspend,
        .resume         = hmc5843_resume,
  };
 -
 -static int __init hmc5843_init(void)
 -{
 -      return i2c_add_driver(&hmc5843_driver);
 -}
 -
 -static void __exit hmc5843_exit(void)
 -{
 -      i2c_del_driver(&hmc5843_driver);
 -}
 +module_i2c_driver(hmc5843_driver);
  
  MODULE_AUTHOR("Shubhrajyoti Datta <shubhrajyoti@ti.com");
  MODULE_DESCRIPTION("HMC5843 driver");
  MODULE_LICENSE("GPL");
 -
 -module_init(hmc5843_init);
 -module_exit(hmc5843_exit);
index 4c7b0cbf49fa3647786b03da30b98ebffa2f9458,62a879ce509bc150fa69c998744bab8a8ca2b98a..57baac6c0d40dc64d4b66552858a0950ee44efd2
@@@ -577,8 -577,20 +577,9 @@@ static struct spi_driver ade7753_drive
        .probe = ade7753_probe,
        .remove = __devexit_p(ade7753_remove),
  };
 -
 -static __init int ade7753_init(void)
 -{
 -      return spi_register_driver(&ade7753_driver);
 -}
 -module_init(ade7753_init);
 -
 -static __exit void ade7753_exit(void)
 -{
 -      spi_unregister_driver(&ade7753_driver);
 -}
 -module_exit(ade7753_exit);
 +module_spi_driver(ade7753_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices ADE7753/6 Single-Phase Multifunction Meter");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:ade7753");
index 15c98cde76d1df866aa9366e4a8d007e091e7adf,0111edb1e2af7e77055f78f307d7a1600cad48dd..8d81c92007e9012f1e2fc3e0cad267b531dd3cbe
@@@ -600,8 -600,20 +600,9 @@@ static struct spi_driver ade7754_drive
        .probe = ade7754_probe,
        .remove = __devexit_p(ade7754_remove),
  };
 -
 -static __init int ade7754_init(void)
 -{
 -      return spi_register_driver(&ade7754_driver);
 -}
 -module_init(ade7754_init);
 -
 -static __exit void ade7754_exit(void)
 -{
 -      spi_unregister_driver(&ade7754_driver);
 -}
 -module_exit(ade7754_exit);
 +module_spi_driver(ade7754_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices ADE7754 Polyphase Multifunction Energy Metering IC Driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:ad7754");
index 39338bcb187238dc6bb5b59968ce152ee41e19cb,9dc881f59bd894f38ecd3947d858b2aa5ca73f9c..dcb20294dfe8382705d1432c00a252fc6d439500
@@@ -20,7 -20,7 +20,7 @@@
  
  #include "../iio.h"
  #include "../sysfs.h"
- #include "../buffer_generic.h"
+ #include "../buffer.h"
  #include "meter.h"
  #include "ade7758.h"
  
@@@ -663,63 -663,63 +663,63 @@@ static const struct attribute_group ade
  
  static struct iio_chan_spec ade7758_channels[] = {
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, "raw", 0, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_A, AD7758_VOLTAGE),
                0, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_CURRENT, 0, 1, 0, "raw", 0, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_A, AD7758_CURRENT),
                1, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_POWER, 0, 1, 0, "apparent_raw", 0, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_A, AD7758_APP_PWR),
                2, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_POWER, 0, 1, 0, "active_raw", 0, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_A, AD7758_ACT_PWR),
                3, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_POWER, 0, 1, 0, "reactive_raw", 0, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_A, AD7758_REACT_PWR),
                4, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, "raw", 1, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_B, AD7758_VOLTAGE),
                5, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_CURRENT, 0, 1, 0, "raw", 1, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_B, AD7758_CURRENT),
                6, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_POWER, 0, 1, 0, "apparent_raw", 1, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_B, AD7758_APP_PWR),
                7, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_POWER, 0, 1, 0, "active_raw", 1, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_B, AD7758_ACT_PWR),
                8, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_POWER, 0, 1, 0, "reactive_raw", 1, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_B, AD7758_REACT_PWR),
                9, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, "raw", 2, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_C, AD7758_VOLTAGE),
                10, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_CURRENT, 0, 1, 0, "raw", 2, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_C, AD7758_CURRENT),
                11, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_POWER, 0, 1, 0, "apparent_raw", 2, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_C, AD7758_APP_PWR),
                12, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_POWER, 0, 1, 0, "active_raw", 2, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_C, AD7758_ACT_PWR),
                13, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN(IIO_POWER, 0, 1, 0, "reactive_raw", 2, 0,
-               (1 << IIO_CHAN_INFO_SCALE_SHARED),
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,
                AD7758_WT(AD7758_PHASE_C, AD7758_REACT_PWR),
                14, IIO_ST('s', 24, 32, 0), 0),
        IIO_CHAN_SOFT_TIMESTAMP(15),
@@@ -746,12 -746,12 +746,12 @@@ static int __devinit ade7758_probe(stru
        spi_set_drvdata(spi, indio_dev);
  
        /* Allocate the comms buffers */
-       st->rx = kzalloc(sizeof(*st->rx)*ADE7758_MAX_RX, GFP_KERNEL);
+       st->rx = kcalloc(ADE7758_MAX_RX, sizeof(*st->rx), GFP_KERNEL);
        if (st->rx == NULL) {
                ret = -ENOMEM;
                goto error_free_dev;
        }
-       st->tx = kzalloc(sizeof(*st->tx)*ADE7758_MAX_TX, GFP_KERNEL);
+       st->tx = kcalloc(ADE7758_MAX_TX, sizeof(*st->tx), GFP_KERNEL);
        if (st->tx == NULL) {
                ret = -ENOMEM;
                goto error_free_rx;
@@@ -843,6 -843,7 +843,7 @@@ static const struct spi_device_id ade77
        {"ade7758", 0},
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ade7758_id);
  
  static struct spi_driver ade7758_driver = {
        .driver = {
        .remove = __devexit_p(ade7758_remove),
        .id_table = ade7758_id,
  };
 -
 -static __init int ade7758_init(void)
 -{
 -      return spi_register_driver(&ade7758_driver);
 -}
 -module_init(ade7758_init);
 -
 -static __exit void ade7758_exit(void)
 -{
 -      spi_unregister_driver(&ade7758_driver);
 -}
 -module_exit(ade7758_exit);
 +module_spi_driver(ade7758_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices ADE7758 Polyphase Multifunction Energy Metering IC Driver");
index cfa2a5eff1224a440eba57e4473a8906e078170f,e7fcc7df87ee13d83c3a7488bf7c0fec32401540..0beab478dcd9490a64d98b8676988771ed65063c
@@@ -521,8 -521,20 +521,9 @@@ static struct spi_driver ade7759_drive
        .probe = ade7759_probe,
        .remove = __devexit_p(ade7759_remove),
  };
 -
 -static __init int ade7759_init(void)
 -{
 -      return spi_register_driver(&ade7759_driver);
 -}
 -module_init(ade7759_init);
 -
 -static __exit void ade7759_exit(void)
 -{
 -      spi_unregister_driver(&ade7759_driver);
 -}
 -module_exit(ade7759_exit);
 +module_spi_driver(ade7759_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices ADE7759 Active Energy Metering IC Driver");
  MODULE_LICENSE("GPL v2");
+ MODULE_ALIAS("spi:ad7759");
index c485a79aeec39a02e286233fb7da0fdfc6d7d710,50bc5d4153fa66a2135cb100c4dad54846c7c296..81121862c1bd405c66da08131fe678a53647765d
@@@ -343,6 -343,7 +343,7 @@@ static const struct spi_device_id ade78
        { "ade7878", 0 },
        { }
  };
+ MODULE_DEVICE_TABLE(spi, ade7854_id);
  
  static struct spi_driver ade7854_driver = {
        .driver = {
        .remove = __devexit_p(ade7854_spi_remove),
        .id_table = ade7854_id,
  };
 -
 -static __init int ade7854_init(void)
 -{
 -      return spi_register_driver(&ade7854_driver);
 -}
 -module_init(ade7854_init);
 -
 -static __exit void ade7854_exit(void)
 -{
 -      spi_unregister_driver(&ade7854_driver);
 -}
 -module_exit(ade7854_exit);
 +module_spi_driver(ade7854_driver);
  
  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices ADE7854/58/68/78 SPI Driver");
index 1c6a02bfd45d223523f81827c83460ddd86ee15d,fda07d4736aef825dea86937564df2acfbdbdda2..d8ce854c1897113562f94f1e047e9178bb2eb0a8
@@@ -160,6 -160,7 +160,7 @@@ static const struct spi_device_id ad2s1
        { "ad2s1205" },
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad2s1200_id);
  
  static struct spi_driver ad2s1200_driver = {
        .driver = {
        .remove = __devexit_p(ad2s1200_remove),
        .id_table = ad2s1200_id,
  };
 -
 -static __init int ad2s1200_spi_init(void)
 -{
 -      return spi_register_driver(&ad2s1200_driver);
 -}
 -module_init(ad2s1200_spi_init);
 -
 -static __exit void ad2s1200_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad2s1200_driver);
 -}
 -module_exit(ad2s1200_spi_exit);
 +module_spi_driver(ad2s1200_driver);
  
  MODULE_AUTHOR("Graff Yang <graff.yang@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices AD2S1200/1205 Resolver to Digital SPI driver");
index ff1b3316d016aab9d299998c9d026d02f7141af8,8996c98f832ad9e1b6b9845d59ce8291c21c06ac..c439fcf72be7e91e663c8661cc0a340c2bb54b32
@@@ -749,6 -749,7 +749,7 @@@ static const struct spi_device_id ad2s1
        { "ad2s1210" },
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad2s1210_id);
  
  static struct spi_driver ad2s1210_driver = {
        .driver = {
        .remove = __devexit_p(ad2s1210_remove),
        .id_table = ad2s1210_id,
  };
 -
 -static __init int ad2s1210_spi_init(void)
 -{
 -      return spi_register_driver(&ad2s1210_driver);
 -}
 -module_init(ad2s1210_spi_init);
 -
 -static __exit void ad2s1210_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad2s1210_driver);
 -}
 -module_exit(ad2s1210_spi_exit);
 +module_spi_driver(ad2s1210_driver);
  
  MODULE_AUTHOR("Graff Yang <graff.yang@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices AD2S1210 Resolver to Digital SPI driver");
index 6d0794389e7441dbd2ed8dff4dcc62e3c5ade897,b988b9272d00a5ad7826837ef9ea7870176a5730..2a86f582ddf1065e71744ddc2e4be322cd104851
@@@ -109,6 -109,7 +109,7 @@@ static const struct spi_device_id ad2s9
        { "ad2s90" },
        {}
  };
+ MODULE_DEVICE_TABLE(spi, ad2s90_id);
  
  static struct spi_driver ad2s90_driver = {
        .driver = {
        .remove = __devexit_p(ad2s90_remove),
        .id_table = ad2s90_id,
  };
 -
 -static __init int ad2s90_spi_init(void)
 -{
 -      return spi_register_driver(&ad2s90_driver);
 -}
 -module_init(ad2s90_spi_init);
 -
 -static __exit void ad2s90_spi_exit(void)
 -{
 -      spi_unregister_driver(&ad2s90_driver);
 -}
 -module_exit(ad2s90_spi_exit);
 +module_spi_driver(ad2s90_driver);
  
  MODULE_AUTHOR("Graff Yang <graff.yang@gmail.com>");
  MODULE_DESCRIPTION("Analog Devices AD2S90 Resolver to Digital SPI driver");
index f47571ea745d7bf929c46fcc61d181421fa475dd,e624e28749029f16c9fa83b542d21099d1918b24..6b3d156d41407327137fd1a9977b16693b2a8172
@@@ -1235,7 -1235,7 +1235,7 @@@ static void sep_build_lli_table(struct 
        /* Counter of lli array entry */
        u32 array_counter;
  
 -      /* Init currrent table data size and lli array entry counter */
 +      /* Init current table data size and lli array entry counter */
        curr_table_data_size = 0;
        array_counter = 0;
        *num_table_entries_ptr = 1;
@@@ -2120,6 -2120,8 +2120,8 @@@ static int sep_prepare_input_output_dma
                        }
                }
                if (tail_size) {
+                       if (tail_size > sizeof(dcb_table_ptr->tail_data))
+                               return -EINVAL;
                        if (is_kva == true) {
                                memcpy(dcb_table_ptr->tail_data,
                                        (void *)(app_in_address + data_in_size -
index 541f9aa8ef6d6ad8f59d4fd2c3f84ee68ca86068,173217bd792c775feee98a9ca2c60d562c38036c..6a708f4476519a6acf6161818a09e880340a438f
@@@ -900,7 -900,7 +900,7 @@@ static BOOL device_alloc_bufs(PSDevice 
      }
  
      // allocate rcb mem
-     pDevice->pRCBMem = kmalloc((sizeof(RCB) * pDevice->cbRD), GFP_KERNEL);
+       pDevice->pRCBMem = kzalloc((sizeof(RCB) * pDevice->cbRD), GFP_KERNEL);
      if (pDevice->pRCBMem == NULL) {
          DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : alloc rx usb context failed\n", pDevice->dev->name);
          goto free_tx;
      pDevice->FirstRecvMngList = NULL;
      pDevice->LastRecvMngList = NULL;
      pDevice->NumRecvFreeList = 0;
-     memset(pDevice->pRCBMem, 0, (sizeof(RCB) * pDevice->cbRD));
      pRCB = (PRCB) pDevice->pRCBMem;
  
      for (ii = 0; ii < pDevice->cbRD; ii++) {
@@@ -1618,15 -1617,8 +1617,8 @@@ static int  device_ioctl(struct net_dev
                break;
  
        case SIOCSIWNWID:
-         rc = -EOPNOTSUPP;
-               break;
        case SIOCGIWNWID:     //0x8b03  support
-       #ifdef  WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
-           rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
-       #else
-         rc = -EOPNOTSUPP;
-       #endif
+               rc = -EOPNOTSUPP;
                break;
  
                // Set frequency/channel
@@@ -2103,4 -2095,16 +2095,4 @@@ static struct usb_driver vt6656_driver 
  #endif /* CONFIG_PM */
  };
  
 -static int __init vt6656_init_module(void)
 -{
 -    printk(KERN_NOTICE DEVICE_FULL_DRV_NAM " " DEVICE_VERSION);
 -    return usb_register(&vt6656_driver);
 -}
 -
 -static void __exit vt6656_cleanup_module(void)
 -{
 -      usb_deregister(&vt6656_driver);
 -}
 -
 -module_init(vt6656_init_module);
 -module_exit(vt6656_cleanup_module);
 +module_usb_driver(vt6656_driver);