Merge 3.12-rc2 into staging-next.
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 25 Sep 2013 15:59:04 +0000 (08:59 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 25 Sep 2013 15:59:04 +0000 (08:59 -0700)
This resolves the merge problem with two iio drivers that Stephen
Rothwell pointed out.

Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
264 files changed:
Documentation/ABI/testing/sysfs-bus-iio
Documentation/devicetree/bindings/iio/light/gp2ap020a00f.txt [new file with mode: 0644]
MAINTAINERS
drivers/iio/accel/bma180.c
drivers/iio/accel/hid-sensor-accel-3d.c
drivers/iio/accel/st_accel_core.c
drivers/iio/adc/Kconfig
drivers/iio/adc/Makefile
drivers/iio/adc/ad7266.c
drivers/iio/adc/ad7298.c
drivers/iio/adc/ad7476.c
drivers/iio/adc/ad7887.c
drivers/iio/adc/ad7923.c
drivers/iio/adc/ad_sigma_delta.c
drivers/iio/adc/at91_adc.c
drivers/iio/adc/max1363.c
drivers/iio/adc/mcp3422.c [new file with mode: 0644]
drivers/iio/adc/ti_am335x_adc.c
drivers/iio/buffer_cb.c
drivers/iio/common/st_sensors/st_sensors_buffer.c
drivers/iio/common/st_sensors/st_sensors_core.c
drivers/iio/dac/ad5064.c
drivers/iio/dac/ad5380.c
drivers/iio/dac/ad5446.c
drivers/iio/dac/ad5504.c
drivers/iio/dac/ad5624r_spi.c
drivers/iio/dac/ad5686.c
drivers/iio/dac/ad5755.c
drivers/iio/dac/ad5791.c
drivers/iio/dac/ad7303.c
drivers/iio/dac/mcp4725.c
drivers/iio/frequency/adf4350.c
drivers/iio/gyro/adis16130.c
drivers/iio/gyro/adis16260.c
drivers/iio/gyro/adxrs450.c
drivers/iio/gyro/hid-sensor-gyro-3d.c
drivers/iio/gyro/itg3200_buffer.c
drivers/iio/gyro/st_gyro_core.c
drivers/iio/iio_core.h
drivers/iio/imu/adis16400_buffer.c
drivers/iio/imu/adis_buffer.c
drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c
drivers/iio/industrialio-buffer.c
drivers/iio/industrialio-core.c
drivers/iio/industrialio-event.c
drivers/iio/kfifo_buf.c
drivers/iio/light/Kconfig
drivers/iio/light/Makefile
drivers/iio/light/adjd_s311.c
drivers/iio/light/gp2ap020a00f.c [new file with mode: 0644]
drivers/iio/light/hid-sensor-als.c
drivers/iio/light/tcs3472.c [new file with mode: 0644]
drivers/iio/light/tsl4531.c [new file with mode: 0644]
drivers/iio/magnetometer/hid-sensor-magn-3d.c
drivers/iio/magnetometer/st_magn_core.c
drivers/iio/pressure/st_pressure.h
drivers/iio/pressure/st_pressure_core.c
drivers/iio/pressure/st_pressure_i2c.c
drivers/iio/temperature/tmp006.c
drivers/input/touchscreen/ti_am335x_tsc.c
drivers/staging/android/Kconfig
drivers/staging/android/alarm-dev.c
drivers/staging/android/ashmem.c
drivers/staging/android/binder.c
drivers/staging/android/timed_output.h
drivers/staging/bcm/InterfaceMisc.c
drivers/staging/bcm/nvm.c
drivers/staging/comedi/comedidev.h
drivers/staging/comedi/drivers.c
drivers/staging/comedi/drivers/8255.c
drivers/staging/comedi/drivers/addi-data/addi_common.c
drivers/staging/comedi/drivers/addi-data/hwdrv_apci1564.c
drivers/staging/comedi/drivers/addi-data/hwdrv_apci3120.c
drivers/staging/comedi/drivers/addi-data/hwdrv_apci3200.c
drivers/staging/comedi/drivers/addi_apci_1516.c
drivers/staging/comedi/drivers/addi_apci_16xx.c
drivers/staging/comedi/drivers/addi_apci_2032.c
drivers/staging/comedi/drivers/addi_apci_2200.c
drivers/staging/comedi/drivers/addi_apci_3120.c
drivers/staging/comedi/drivers/addi_apci_3501.c
drivers/staging/comedi/drivers/addi_apci_3xxx.c
drivers/staging/comedi/drivers/adl_pci6208.c
drivers/staging/comedi/drivers/adl_pci7x3x.c
drivers/staging/comedi/drivers/adl_pci9111.c
drivers/staging/comedi/drivers/adl_pci9118.c
drivers/staging/comedi/drivers/adq12b.c
drivers/staging/comedi/drivers/adv_pci1710.c
drivers/staging/comedi/drivers/adv_pci1723.c
drivers/staging/comedi/drivers/adv_pci_dio.c
drivers/staging/comedi/drivers/aio_iiro_16.c
drivers/staging/comedi/drivers/amplc_dio200_common.c
drivers/staging/comedi/drivers/amplc_pc263.c
drivers/staging/comedi/drivers/amplc_pci263.c
drivers/staging/comedi/drivers/cb_das16_cs.c
drivers/staging/comedi/drivers/cb_pcidas64.c
drivers/staging/comedi/drivers/comedi_parport.c
drivers/staging/comedi/drivers/contec_pci_dio.c
drivers/staging/comedi/drivers/das08.c
drivers/staging/comedi/drivers/das08.h
drivers/staging/comedi/drivers/das16.c
drivers/staging/comedi/drivers/das16m1.c
drivers/staging/comedi/drivers/das1800.c
drivers/staging/comedi/drivers/das800.c
drivers/staging/comedi/drivers/dmm32at.c
drivers/staging/comedi/drivers/dt2801.c
drivers/staging/comedi/drivers/dt2811.c
drivers/staging/comedi/drivers/dt2817.c
drivers/staging/comedi/drivers/dt282x.c
drivers/staging/comedi/drivers/dt3000.c
drivers/staging/comedi/drivers/dt9812.c
drivers/staging/comedi/drivers/dyna_pci10xx.c
drivers/staging/comedi/drivers/icp_multi.c
drivers/staging/comedi/drivers/ii_pci20kc.c
drivers/staging/comedi/drivers/me4000.c
drivers/staging/comedi/drivers/me_daq.c
drivers/staging/comedi/drivers/multiq3.c
drivers/staging/comedi/drivers/ni_6527.c
drivers/staging/comedi/drivers/ni_660x.c
drivers/staging/comedi/drivers/ni_670x.c
drivers/staging/comedi/drivers/ni_at_a2150.c
drivers/staging/comedi/drivers/ni_at_ao.c
drivers/staging/comedi/drivers/ni_atmio16d.c
drivers/staging/comedi/drivers/ni_daq_700.c
drivers/staging/comedi/drivers/ni_labpc.c
drivers/staging/comedi/drivers/ni_mio_common.c
drivers/staging/comedi/drivers/ni_pcidio.c
drivers/staging/comedi/drivers/pcl711.c
drivers/staging/comedi/drivers/pcl726.c
drivers/staging/comedi/drivers/pcl730.c
drivers/staging/comedi/drivers/pcl812.c
drivers/staging/comedi/drivers/pcl818.c
drivers/staging/comedi/drivers/pcmad.c
drivers/staging/comedi/drivers/quatech_daqp_cs.c
drivers/staging/comedi/drivers/rtd520.c
drivers/staging/comedi/drivers/rti800.c
drivers/staging/comedi/drivers/s526.c
drivers/staging/comedi/drivers/s626.c
drivers/staging/comedi/drivers/skel.c
drivers/staging/comedi/drivers/ssv_dnp.c
drivers/staging/comedi/drivers/usbdux.c
drivers/staging/comedi/drivers/usbduxsigma.c
drivers/staging/comedi/drivers/vmk80xx.c
drivers/staging/dgap/dgap_downld.h
drivers/staging/dgap/dgap_driver.c
drivers/staging/dgap/dgap_driver.h
drivers/staging/dgap/dgap_fep5.h
drivers/staging/dgap/dgap_kcompat.h
drivers/staging/dgap/dgap_parse.c
drivers/staging/dgap/dgap_sysfs.c
drivers/staging/dgap/dgap_tty.c
drivers/staging/dgap/digi.h
drivers/staging/dgap/downld.c
drivers/staging/dgnc/dgnc_cls.c
drivers/staging/dgnc/dgnc_driver.c
drivers/staging/dgnc/dgnc_driver.h
drivers/staging/dgnc/dgnc_mgmt.c
drivers/staging/dgnc/dgnc_neo.c
drivers/staging/dgnc/dgnc_neo.h
drivers/staging/dgnc/dgnc_sysfs.c
drivers/staging/dgnc/dgnc_sysfs.h
drivers/staging/dgnc/dgnc_tty.c
drivers/staging/dgnc/dgnc_tty.h
drivers/staging/dgnc/digi.h
drivers/staging/dgrp/dgrp_sysfs.c
drivers/staging/dwc2/core.c
drivers/staging/dwc2/hcd_queue.c
drivers/staging/et131x/Module.symvers [new file with mode: 0644]
drivers/staging/et131x/README
drivers/staging/et131x/et131x.c
drivers/staging/fwserial/fwserial.c
drivers/staging/iio/accel/lis3l02dq_ring.c
drivers/staging/iio/accel/sca3000_core.c
drivers/staging/iio/accel/sca3000_ring.c
drivers/staging/iio/adc/ad7192.c
drivers/staging/iio/adc/ad7280a.c
drivers/staging/iio/adc/ad7291.c
drivers/staging/iio/adc/ad7606_core.c
drivers/staging/iio/adc/ad7606_ring.c
drivers/staging/iio/adc/ad7780.c
drivers/staging/iio/adc/ad7816.c
drivers/staging/iio/adc/ad799x_core.c
drivers/staging/iio/adc/ad799x_ring.c
drivers/staging/iio/adc/lpc32xx_adc.c
drivers/staging/iio/adc/mxs-lradc.c
drivers/staging/iio/addac/adt7316.c
drivers/staging/iio/frequency/ad5930.c
drivers/staging/iio/frequency/ad9832.c
drivers/staging/iio/frequency/ad9834.c
drivers/staging/iio/frequency/ad9850.c
drivers/staging/iio/frequency/ad9852.c
drivers/staging/iio/frequency/ad9910.c
drivers/staging/iio/frequency/ad9951.c
drivers/staging/iio/iio_simple_dummy.c
drivers/staging/iio/iio_simple_dummy_buffer.c
drivers/staging/iio/impedance-analyzer/ad5933.c
drivers/staging/iio/light/isl29018.c
drivers/staging/iio/light/tsl2583.c
drivers/staging/iio/light/tsl2x7x_core.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/ade7758_ring.c
drivers/staging/iio/meter/ade7759.c
drivers/staging/iio/meter/ade7854-i2c.c
drivers/staging/iio/meter/ade7854-spi.c
drivers/staging/iio/meter/ade7854.c
drivers/staging/iio/resolver/ad2s1200.c
drivers/staging/iio/resolver/ad2s1210.c
drivers/staging/iio/resolver/ad2s90.c
drivers/staging/iio/trigger/iio-trig-bfin-timer.c
drivers/staging/iio/trigger/iio-trig-periodic-rtc.c
drivers/staging/lustre/lustre/Kconfig
drivers/staging/lustre/lustre/lvfs/fsfilt.c
drivers/staging/lustre/lustre/lvfs/lvfs_lib.c
drivers/staging/lustre/lustre/ptlrpc/sec_bulk.c
drivers/staging/rtl8188eu/core/rtw_br_ext.c
drivers/staging/rtl8188eu/core/rtw_efuse.c
drivers/staging/rtl8188eu/core/rtw_recv.c
drivers/staging/rtl8188eu/core/rtw_sta_mgt.c
drivers/staging/rtl8188eu/core/rtw_wlan_util.c
drivers/staging/rtl8188eu/core/rtw_xmit.c
drivers/staging/rtl8188eu/hal/HalPhyRf_8188e.c
drivers/staging/rtl8188eu/hal/rtl8188e_hal_init.c
drivers/staging/rtl8188eu/hal/usb_ops_linux.c
drivers/staging/rtl8188eu/include/Hal8188EPhyCfg.h
drivers/staging/rtl8188eu/include/HalPhyRf_8188e.h
drivers/staging/rtl8188eu/include/odm.h
drivers/staging/rtl8188eu/include/odm_HWConfig.h
drivers/staging/rtl8188eu/include/rtw_recv.h
drivers/staging/rtl8188eu/os_dep/ioctl_linux.c
drivers/staging/rtl8188eu/os_dep/osdep_service.c
drivers/staging/rtl8188eu/os_dep/recv_linux.c
drivers/staging/rtl8188eu/os_dep/usb_intf.c
drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c
drivers/staging/rtl8192e/rtllib_rx.c
drivers/staging/rtl8712/usb_intf.c
drivers/staging/silicom/bpctl_mod.c
drivers/staging/slicoss/slicoss.c
drivers/staging/speakup/Kconfig
drivers/staging/speakup/kobjects.c
drivers/staging/vt6655/bssdb.c
drivers/staging/vt6655/dpc.c
drivers/staging/vt6655/iwctl.c
drivers/staging/vt6655/key.c
drivers/staging/vt6655/vntwifi.c
drivers/staging/vt6655/wctl.c
drivers/staging/vt6655/wmgr.c
drivers/staging/vt6655/wpactl.c
drivers/staging/vt6656/bssdb.c
drivers/staging/vt6656/dpc.c
drivers/staging/vt6656/iwctl.c
drivers/staging/vt6656/key.c
drivers/staging/vt6656/wctl.c
drivers/staging/vt6656/wmgr.c
drivers/staging/vt6656/wpactl.c
drivers/staging/wlan-ng/cfg80211.c
drivers/staging/wlan-ng/hfa384x_usb.c
include/linux/iio/buffer.h
include/linux/iio/common/st_sensors.h
include/linux/iio/consumer.h
include/linux/iio/iio.h
include/linux/iio/sysfs.h
include/linux/mfd/ti_am335x_tscadc.h

index 39c8de0e53d00924630c789e27c9e6c10af5e960..ab1047c20495efb9c9e3b934950d69a9fba06071 100644 (file)
@@ -811,3 +811,14 @@ Description:
                Writing '1' stores the current device configuration into
                on-chip EEPROM. After power-up or chip reset the device will
                automatically load the saved configuration.
+
+What:          /sys/.../iio:deviceX/in_intensity_red_integration_time
+What:          /sys/.../iio:deviceX/in_intensity_green_integration_time
+What:          /sys/.../iio:deviceX/in_intensity_blue_integration_time
+What:          /sys/.../iio:deviceX/in_intensity_clear_integration_time
+What:          /sys/.../iio:deviceX/in_illuminance_integration_time
+KernelVersion: 3.12
+Contact:       linux-iio@vger.kernel.org
+Description:
+               This attribute is used to get/set the integration time in
+               seconds.
diff --git a/Documentation/devicetree/bindings/iio/light/gp2ap020a00f.txt b/Documentation/devicetree/bindings/iio/light/gp2ap020a00f.txt
new file mode 100644 (file)
index 0000000..9231c82
--- /dev/null
@@ -0,0 +1,21 @@
+* Sharp GP2AP020A00F I2C Proximity/ALS sensor
+
+The proximity detector sensor requires power supply
+for its built-in led. It is also defined by this binding.
+
+Required properties:
+
+  - compatible : should be "sharp,gp2ap020a00f"
+  - reg : the I2C slave address of the light sensor
+  - interrupts : interrupt specifier for the sole interrupt generated
+                by the device
+  - vled-supply : VLED power supply, as covered in ../regulator/regulator.txt
+
+Example:
+
+gp2ap020a00f@39 {
+       compatible = "sharp,gp2ap020a00f";
+       reg = <0x39>;
+       interrupts = <2 0>;
+       vled-supply = <...>;
+};
index e61c2e83fc2b3b1f7570cff0cc6dc12d87aa8059..e8ee569fdce5b77eef43d131bbf468706bee9e61 100644 (file)
@@ -4195,7 +4195,7 @@ S:        Maintained
 F:     drivers/media/rc/iguanair.c
 
 IIO SUBSYSTEM AND DRIVERS
-M:     Jonathan Cameron <jic23@cam.ac.uk>
+M:     Jonathan Cameron <jic23@kernel.org>
 L:     linux-iio@vger.kernel.org
 S:     Maintained
 F:     drivers/iio/
@@ -7947,7 +7947,7 @@ S:        Maintained
 F:     drivers/staging/media/go7007/
 
 STAGING - INDUSTRIAL IO
-M:     Jonathan Cameron <jic23@cam.ac.uk>
+M:     Jonathan Cameron <jic23@kernel.org>
 L:     linux-iio@vger.kernel.org
 S:     Odd Fixes
 F:     drivers/staging/iio/
index 81e3dc260993124981d45cacb9e472e9221d7b8a..28b39283bccffaad1fdd13950aaa62dabd2d7248 100644 (file)
@@ -471,13 +471,10 @@ static irqreturn_t bma180_trigger_handler(int irq, void *p)
        struct iio_poll_func *pf = p;
        struct iio_dev *indio_dev = pf->indio_dev;
        struct bma180_data *data = iio_priv(indio_dev);
+       int64_t time_ns = iio_get_time_ns();
        int bit, ret, i = 0;
 
        mutex_lock(&data->mutex);
-       if (indio_dev->scan_timestamp) {
-               ret = indio_dev->scan_bytes / sizeof(s64) - 1;
-               ((s64 *)data->buff)[ret] = iio_get_time_ns();
-       }
 
        for_each_set_bit(bit, indio_dev->buffer->scan_mask,
                         indio_dev->masklength) {
@@ -490,7 +487,7 @@ static irqreturn_t bma180_trigger_handler(int irq, void *p)
        }
        mutex_unlock(&data->mutex);
 
-       iio_push_to_buffers(indio_dev, (u8 *)data->buff);
+       iio_push_to_buffers_with_timestamp(indio_dev, data->buff, time_ns);
 err:
        iio_trigger_notify_done(indio_dev->trig);
 
index 46d22f3fb1a9bb0c3fb2259b6399fd1642d107d7..dcda17395c4e68f31f3382cd0c393a5845b025c5 100644 (file)
@@ -182,10 +182,11 @@ static const struct iio_info accel_3d_info = {
 };
 
 /* Function to push data to buffer */
-static void hid_sensor_push_data(struct iio_dev *indio_dev, u8 *data, int len)
+static void hid_sensor_push_data(struct iio_dev *indio_dev, const void *data,
+       int len)
 {
        dev_dbg(&indio_dev->dev, "hid_sensor_push_data\n");
-       iio_push_to_buffers(indio_dev, (u8 *)data);
+       iio_push_to_buffers(indio_dev, data);
 }
 
 /* Callback handler to send event after all samples are received and captured */
@@ -200,7 +201,7 @@ static int accel_3d_proc_event(struct hid_sensor_hub_device *hsdev,
                                accel_state->common_attributes.data_ready);
        if (accel_state->common_attributes.data_ready)
                hid_sensor_push_data(indio_dev,
-                               (u8 *)accel_state->accel_val,
+                               accel_state->accel_val,
                                sizeof(accel_state->accel_val));
 
        return 0;
index 1458343f6f3fac94f5aa882df1e88d2d9ac37ad1..38caedc76b98f20520f9be751fabc15e90b03793 100644 (file)
@@ -452,8 +452,9 @@ static const struct iio_trigger_ops st_accel_trigger_ops = {
 int st_accel_common_probe(struct iio_dev *indio_dev,
                                struct st_sensors_platform_data *plat_data)
 {
-       int err;
        struct st_sensor_data *adata = iio_priv(indio_dev);
+       int irq = adata->get_irq_data_ready(indio_dev);
+       int err;
 
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->info = &accel_info;
@@ -461,7 +462,7 @@ int st_accel_common_probe(struct iio_dev *indio_dev,
        err = st_sensors_check_device_support(indio_dev,
                                ARRAY_SIZE(st_accel_sensors), st_accel_sensors);
        if (err < 0)
-               goto st_accel_common_probe_error;
+               return err;
 
        adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS;
        adata->multiread_bit = adata->sensor->multi_read_bit;
@@ -478,13 +479,13 @@ int st_accel_common_probe(struct iio_dev *indio_dev,
 
        err = st_sensors_init_sensor(indio_dev, plat_data);
        if (err < 0)
-               goto st_accel_common_probe_error;
+               return err;
 
-       if (adata->get_irq_data_ready(indio_dev) > 0) {
-               err = st_accel_allocate_ring(indio_dev);
-               if (err < 0)
-                       goto st_accel_common_probe_error;
+       err = st_accel_allocate_ring(indio_dev);
+       if (err < 0)
+               return err;
 
+       if (irq > 0) {
                err = st_sensors_allocate_trigger(indio_dev,
                                                 ST_ACCEL_TRIGGER_OPS);
                if (err < 0)
@@ -495,15 +496,14 @@ int st_accel_common_probe(struct iio_dev *indio_dev,
        if (err)
                goto st_accel_device_register_error;
 
-       return err;
+       return 0;
 
 st_accel_device_register_error:
-       if (adata->get_irq_data_ready(indio_dev) > 0)
+       if (irq > 0)
                st_sensors_deallocate_trigger(indio_dev);
 st_accel_probe_trigger_error:
-       if (adata->get_irq_data_ready(indio_dev) > 0)
-               st_accel_deallocate_ring(indio_dev);
-st_accel_common_probe_error:
+       st_accel_deallocate_ring(indio_dev);
+
        return err;
 }
 EXPORT_SYMBOL(st_accel_common_probe);
@@ -513,10 +513,10 @@ void st_accel_common_remove(struct iio_dev *indio_dev)
        struct st_sensor_data *adata = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-       if (adata->get_irq_data_ready(indio_dev) > 0) {
+       if (adata->get_irq_data_ready(indio_dev) > 0)
                st_sensors_deallocate_trigger(indio_dev);
-               st_accel_deallocate_ring(indio_dev);
-       }
+
+       st_accel_deallocate_ring(indio_dev);
 }
 EXPORT_SYMBOL(st_accel_common_remove);
 
index 09371cbc9dc123d1a1c929d109202a2a6be68f91..8b885188b83920215624e28564a35095cb7c9b76 100644 (file)
@@ -145,6 +145,16 @@ config MCP320X
          This driver can also be built as a module. If so, the module will be
          called mcp320x.
 
+config MCP3422
+       tristate "Microchip Technology MCP3422/3/4 driver"
+       depends on I2C
+       help
+         Say yes here to build support for Microchip Technology's MCP3422,
+         MCP3423 or MCP3424 analog to digital converters.
+
+         This driver can also be built as a module. If so, the module will be
+         called mcp3422.
+
 config NAU7802
        tristate "Nuvoton NAU7802 ADC driver"
        depends on I2C
@@ -167,6 +177,7 @@ config TI_ADC081C
 config TI_AM335X_ADC
        tristate "TI's AM335X ADC driver"
        depends on MFD_TI_AM335X_TSCADC
+       select IIO_KFIFO_BUF
        help
          Say yes here to build support for Texas Instruments ADC
          driver which is also a MFD client.
index 33656ef7d1f60fbd8b16c0c4bf5fa61ef2cc2506..ba9a10a24cd03ee4d80f4bc2e0a9fd56b106d908 100644 (file)
@@ -16,6 +16,7 @@ obj-$(CONFIG_EXYNOS_ADC) += exynos_adc.o
 obj-$(CONFIG_LP8788_ADC) += lp8788_adc.o
 obj-$(CONFIG_MAX1363) += max1363.o
 obj-$(CONFIG_MCP320X) += mcp320x.o
+obj-$(CONFIG_MCP3422) += mcp3422.o
 obj-$(CONFIG_NAU7802) += nau7802.o
 obj-$(CONFIG_TI_ADC081C) += ti-adc081c.o
 obj-$(CONFIG_TI_AM335X_ADC) += ti_am335x_adc.o
index 371731df1634b97a471f51fd67f1a8fbbddef091..656aa3e102f288ffa0cba17086f695dbb011e1e9 100644 (file)
@@ -96,9 +96,8 @@ static irqreturn_t ad7266_trigger_handler(int irq, void *p)
 
        ret = spi_read(st->spi, st->data, 4);
        if (ret == 0) {
-               if (indio_dev->scan_timestamp)
-                       ((s64 *)st->data)[1] = pf->timestamp;
-               iio_push_to_buffers(indio_dev, (u8 *)st->data);
+               iio_push_to_buffers_with_timestamp(indio_dev, st->data,
+                           pf->timestamp);
        }
 
        iio_trigger_notify_done(indio_dev->trig);
@@ -293,7 +292,7 @@ static const struct iio_info ad7266_info = {
        .driver_module = THIS_MODULE,
 };
 
-static unsigned long ad7266_available_scan_masks[] = {
+static const unsigned long ad7266_available_scan_masks[] = {
        0x003,
        0x00c,
        0x030,
@@ -303,14 +302,14 @@ static unsigned long ad7266_available_scan_masks[] = {
        0x000,
 };
 
-static unsigned long ad7266_available_scan_masks_diff[] = {
+static const unsigned long ad7266_available_scan_masks_diff[] = {
        0x003,
        0x00c,
        0x030,
        0x000,
 };
 
-static unsigned long ad7266_available_scan_masks_fixed[] = {
+static const unsigned long ad7266_available_scan_masks_fixed[] = {
        0x003,
        0x000,
 };
@@ -318,7 +317,7 @@ static unsigned long ad7266_available_scan_masks_fixed[] = {
 struct ad7266_chan_info {
        const struct iio_chan_spec *channels;
        unsigned int num_channels;
-       unsigned long *scan_masks;
+       const unsigned long *scan_masks;
 };
 
 #define AD7266_CHAN_INFO_INDEX(_differential, _signed, _fixed) \
index 85d1481c312f67b1d84208f9003e04c0a9ee6891..2a3b65c74af9aa32543dc4d248216f31646a1c08 100644 (file)
@@ -159,20 +159,14 @@ static irqreturn_t ad7298_trigger_handler(int irq, void *p)
        struct iio_poll_func *pf = p;
        struct iio_dev *indio_dev = pf->indio_dev;
        struct ad7298_state *st = iio_priv(indio_dev);
-       s64 time_ns = 0;
        int b_sent;
 
        b_sent = spi_sync(st->spi, &st->ring_msg);
        if (b_sent)
                goto done;
 
-       if (indio_dev->scan_timestamp) {
-               time_ns = iio_get_time_ns();
-               memcpy((u8 *)st->rx_buf + indio_dev->scan_bytes - sizeof(s64),
-                       &time_ns, sizeof(time_ns));
-       }
-
-       iio_push_to_buffers(indio_dev, (u8 *)st->rx_buf);
+       iio_push_to_buffers_with_timestamp(indio_dev, st->rx_buf,
+               iio_get_time_ns());
 
 done:
        iio_trigger_notify_done(indio_dev->trig);
index 6d2b1d8d1a1f001dbec29f88633ba90fffe15e90..8d808b9de90975e8aa68fa7967401a9df49869d0 100644 (file)
@@ -64,19 +64,14 @@ static irqreturn_t ad7476_trigger_handler(int irq, void  *p)
        struct iio_poll_func *pf = p;
        struct iio_dev *indio_dev = pf->indio_dev;
        struct ad7476_state *st = iio_priv(indio_dev);
-       s64 time_ns;
        int b_sent;
 
        b_sent = spi_sync(st->spi, &st->msg);
        if (b_sent < 0)
                goto done;
 
-       time_ns = iio_get_time_ns();
-
-       if (indio_dev->scan_timestamp)
-               ((s64 *)st->data)[1] = time_ns;
-
-       iio_push_to_buffers(indio_dev, st->data);
+       iio_push_to_buffers_with_timestamp(indio_dev, st->data,
+               iio_get_time_ns());
 done:
        iio_trigger_notify_done(indio_dev->trig);
 
index 9dd077b78759047ae39fde5a8d0a2b589b487b22..faedd0e165f6e85dbf495b4a32b232d3f26ab907 100644 (file)
@@ -121,20 +121,14 @@ static irqreturn_t ad7887_trigger_handler(int irq, void *p)
        struct iio_poll_func *pf = p;
        struct iio_dev *indio_dev = pf->indio_dev;
        struct ad7887_state *st = iio_priv(indio_dev);
-       s64 time_ns;
        int b_sent;
 
        b_sent = spi_sync(st->spi, st->ring_msg);
        if (b_sent)
                goto done;
 
-       time_ns = iio_get_time_ns();
-
-       if (indio_dev->scan_timestamp)
-               memcpy(st->data + indio_dev->scan_bytes - sizeof(s64),
-                      &time_ns, sizeof(time_ns));
-
-       iio_push_to_buffers(indio_dev, st->data);
+       iio_push_to_buffers_with_timestamp(indio_dev, st->data,
+               iio_get_time_ns());
 done:
        iio_trigger_notify_done(indio_dev->trig);
 
index 4108dbb28c3d8edfa1b2e20134cf65e38951d55d..28732c28e8197a688c27d1d665458fae24c8a97f 100644 (file)
@@ -174,20 +174,14 @@ static irqreturn_t ad7923_trigger_handler(int irq, void *p)
        struct iio_poll_func *pf = p;
        struct iio_dev *indio_dev = pf->indio_dev;
        struct ad7923_state *st = iio_priv(indio_dev);
-       s64 time_ns = 0;
        int b_sent;
 
        b_sent = spi_sync(st->spi, &st->ring_msg);
        if (b_sent)
                goto done;
 
-       if (indio_dev->scan_timestamp) {
-               time_ns = iio_get_time_ns();
-               memcpy((u8 *)st->rx_buf + indio_dev->scan_bytes - sizeof(s64),
-                       &time_ns, sizeof(time_ns));
-       }
-
-       iio_push_to_buffers(indio_dev, (u8 *)st->rx_buf);
+       iio_push_to_buffers_with_timestamp(indio_dev, st->rx_buf,
+               iio_get_time_ns());
 
 done:
        iio_trigger_notify_done(indio_dev->trig);
index f0d6335ae08760d418f56ced0eaec227772fa1ce..2b59112747633b0a9f8cec683d6f94336fc06efd 100644 (file)
@@ -368,10 +368,6 @@ static irqreturn_t ad_sd_trigger_handler(int irq, void *p)
 
        memset(data, 0x00, 16);
 
-       /* Guaranteed to be aligned with 8 byte boundary */
-       if (indio_dev->scan_timestamp)
-               ((s64 *)data)[1] = pf->timestamp;
-
        reg_size = indio_dev->channels[0].scan_type.realbits +
                        indio_dev->channels[0].scan_type.shift;
        reg_size = DIV_ROUND_UP(reg_size, 8);
@@ -391,7 +387,7 @@ static irqreturn_t ad_sd_trigger_handler(int irq, void *p)
                break;
        }
 
-       iio_push_to_buffers(indio_dev, (uint8_t *)data);
+       iio_push_to_buffers_with_timestamp(indio_dev, data, pf->timestamp);
 
        iio_trigger_notify_done(indio_dev->trig);
        sigma_delta->irq_dis = false;
index 0f16b553e063f602e4e83104382827bb55cc72b2..78121949d6efe38fa29127dc7e73e3c1c3fe8979 100644 (file)
@@ -83,13 +83,7 @@ static irqreturn_t at91_adc_trigger_handler(int irq, void *p)
                j++;
        }
 
-       if (idev->scan_timestamp) {
-               s64 *timestamp = (s64 *)((u8 *)st->buffer +
-                                       ALIGN(j, sizeof(s64)));
-               *timestamp = pf->timestamp;
-       }
-
-       iio_push_to_buffers(idev, (u8 *)st->buffer);
+       iio_push_to_buffers_with_timestamp(idev, st->buffer, pf->timestamp);
 
        iio_trigger_notify_done(idev->trig);
 
@@ -279,7 +273,7 @@ static int at91_adc_trigger_init(struct iio_dev *idev)
        int i, ret;
 
        st->trig = devm_kzalloc(&idev->dev,
-                               st->trigger_number * sizeof(st->trig),
+                               st->trigger_number * sizeof(*st->trig),
                                GFP_KERNEL);
 
        if (st->trig == NULL) {
index 4fb35d1d74943b72a77e9a5affe4f8f751382b22..b4bc166d57b0a85b7fdc8ca167d804452d51f30f 100644 (file)
@@ -1436,7 +1436,6 @@ static irqreturn_t max1363_trigger_handler(int irq, void *p)
        struct iio_poll_func *pf = p;
        struct iio_dev *indio_dev = pf->indio_dev;
        struct max1363_state *st = iio_priv(indio_dev);
-       s64 time_ns;
        __u8 *rxbuf;
        int b_sent;
        size_t d_size;
@@ -1470,11 +1469,7 @@ static irqreturn_t max1363_trigger_handler(int irq, void *p)
        if (b_sent < 0)
                goto done_free;
 
-       time_ns = iio_get_time_ns();
-
-       if (indio_dev->scan_timestamp)
-               memcpy(rxbuf + d_size - sizeof(s64), &time_ns, sizeof(time_ns));
-       iio_push_to_buffers(indio_dev, rxbuf);
+       iio_push_to_buffers_with_timestamp(indio_dev, rxbuf, iio_get_time_ns());
 
 done_free:
        kfree(rxbuf);
@@ -1484,12 +1479,6 @@ done:
        return IRQ_HANDLED;
 }
 
-static const struct iio_buffer_setup_ops max1363_buffered_setup_ops = {
-       .postenable = &iio_triggered_buffer_postenable,
-       .preenable = &iio_sw_buffer_preenable,
-       .predisable = &iio_triggered_buffer_predisable,
-};
-
 static int max1363_probe(struct i2c_client *client,
                         const struct i2c_device_id *id)
 {
@@ -1559,7 +1548,7 @@ static int max1363_probe(struct i2c_client *client,
                goto error_disable_reg;
 
        ret = iio_triggered_buffer_setup(indio_dev, NULL,
-               &max1363_trigger_handler, &max1363_buffered_setup_ops);
+               &max1363_trigger_handler, NULL);
        if (ret)
                goto error_disable_reg;
 
diff --git a/drivers/iio/adc/mcp3422.c b/drivers/iio/adc/mcp3422.c
new file mode 100644 (file)
index 0000000..bc93f53
--- /dev/null
@@ -0,0 +1,409 @@
+/*
+ * mcp3422.c - driver for the Microchip mcp3422/3/4 chip family
+ *
+ * Copyright (C) 2013, Angelo Compagnucci
+ * Author: Angelo Compagnucci <angelo.compagnucci@gmail.com>
+ *
+ * Datasheet: http://ww1.microchip.com/downloads/en/devicedoc/22088b.pdf
+ *
+ * This driver exports the value of analog input voltage to sysfs, the
+ * voltage unit is nV.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/sysfs.h>
+
+#include <linux/iio/iio.h>
+#include <linux/iio/sysfs.h>
+
+/* Masks */
+#define MCP3422_CHANNEL_MASK   0x60
+#define MCP3422_PGA_MASK       0x03
+#define MCP3422_SRATE_MASK     0x0C
+#define MCP3422_SRATE_240      0x0
+#define MCP3422_SRATE_60       0x1
+#define MCP3422_SRATE_15       0x2
+#define MCP3422_SRATE_3        0x3
+#define MCP3422_PGA_1  0
+#define MCP3422_PGA_2  1
+#define MCP3422_PGA_4  2
+#define MCP3422_PGA_8  3
+#define MCP3422_CONT_SAMPLING  0x10
+
+#define MCP3422_CHANNEL(config)        (((config) & MCP3422_CHANNEL_MASK) >> 5)
+#define MCP3422_PGA(config)    ((config) & MCP3422_PGA_MASK)
+#define MCP3422_SAMPLE_RATE(config)    (((config) & MCP3422_SRATE_MASK) >> 2)
+
+#define MCP3422_CHANNEL_VALUE(value) (((value) << 5) & MCP3422_CHANNEL_MASK)
+#define MCP3422_PGA_VALUE(value) ((value) & MCP3422_PGA_MASK)
+#define MCP3422_SAMPLE_RATE_VALUE(value) ((value << 2) & MCP3422_SRATE_MASK)
+
+#define MCP3422_CHAN(_index) \
+       { \
+               .type = IIO_VOLTAGE, \
+               .indexed = 1, \
+               .channel = _index, \
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) \
+                               | BIT(IIO_CHAN_INFO_SCALE), \
+               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
+       }
+
+/* LSB is in nV to eliminate floating point */
+static const u32 rates_to_lsb[] = {1000000, 250000, 62500, 15625};
+
+/*
+ *  scales calculated as:
+ *  rates_to_lsb[sample_rate] / (1 << pga);
+ *  pga is 1 for 0, 2
+ */
+
+static const int mcp3422_scales[4][4] = {
+       { 1000000, 250000, 62500, 15625 },
+       { 500000 , 125000, 31250, 7812 },
+       { 250000 , 62500 , 15625, 3906 },
+       { 125000 , 31250 , 7812 , 1953 } };
+
+/* Constant msleep times for data acquisitions */
+static const int mcp3422_read_times[4] = {
+       [MCP3422_SRATE_240] = 1000 / 240,
+       [MCP3422_SRATE_60] = 1000 / 60,
+       [MCP3422_SRATE_15] = 1000 / 15,
+       [MCP3422_SRATE_3] = 1000 / 3 };
+
+/* sample rates to integer conversion table */
+static const int mcp3422_sample_rates[4] = {
+       [MCP3422_SRATE_240] = 240,
+       [MCP3422_SRATE_60] = 60,
+       [MCP3422_SRATE_15] = 15,
+       [MCP3422_SRATE_3] = 3 };
+
+/* sample rates to sign extension table */
+static const int mcp3422_sign_extend[4] = {
+       [MCP3422_SRATE_240] = 12,
+       [MCP3422_SRATE_60] = 14,
+       [MCP3422_SRATE_15] = 16,
+       [MCP3422_SRATE_3] = 18 };
+
+/* Client data (each client gets its own) */
+struct mcp3422 {
+       struct i2c_client *i2c;
+       u8 config;
+       u8 pga[4];
+       struct mutex lock;
+};
+
+static int mcp3422_update_config(struct mcp3422 *adc, u8 newconfig)
+{
+       int ret;
+
+       mutex_lock(&adc->lock);
+
+       ret = i2c_master_send(adc->i2c, &newconfig, 1);
+       if (ret > 0) {
+               adc->config = newconfig;
+               ret = 0;
+       }
+
+       mutex_unlock(&adc->lock);
+
+       return ret;
+}
+
+static int mcp3422_read(struct mcp3422 *adc, int *value, u8 *config)
+{
+       int ret = 0;
+       u8 sample_rate = MCP3422_SAMPLE_RATE(adc->config);
+       u8 buf[4] = {0, 0, 0, 0};
+       u32 temp;
+
+       if (sample_rate == MCP3422_SRATE_3) {
+               ret = i2c_master_recv(adc->i2c, buf, 4);
+               temp = buf[0] << 16 | buf[1] << 8 | buf[2];
+               *config = buf[3];
+       } else {
+               ret = i2c_master_recv(adc->i2c, buf, 3);
+               temp = buf[0] << 8 | buf[1];
+               *config = buf[2];
+       }
+
+       *value = sign_extend32(temp, mcp3422_sign_extend[sample_rate]);
+
+       return ret;
+}
+
+static int mcp3422_read_channel(struct mcp3422 *adc,
+                               struct iio_chan_spec const *channel, int *value)
+{
+       int ret;
+       u8 config;
+       u8 req_channel = channel->channel;
+
+       if (req_channel != MCP3422_CHANNEL(adc->config)) {
+               config = adc->config;
+               config &= ~MCP3422_CHANNEL_MASK;
+               config |= MCP3422_CHANNEL_VALUE(req_channel);
+               config &= ~MCP3422_PGA_MASK;
+               config |= MCP3422_PGA_VALUE(adc->pga[req_channel]);
+               ret = mcp3422_update_config(adc, config);
+               if (ret < 0)
+                       return ret;
+               msleep(mcp3422_read_times[MCP3422_SAMPLE_RATE(adc->config)]);
+       }
+
+       return mcp3422_read(adc, value, &config);
+}
+
+static int mcp3422_read_raw(struct iio_dev *iio,
+                       struct iio_chan_spec const *channel, int *val1,
+                       int *val2, long mask)
+{
+       struct mcp3422 *adc = iio_priv(iio);
+       int err;
+
+       u8 sample_rate = MCP3422_SAMPLE_RATE(adc->config);
+       u8 pga           = MCP3422_PGA(adc->config);
+
+       switch (mask) {
+       case IIO_CHAN_INFO_RAW:
+               err = mcp3422_read_channel(adc, channel, val1);
+               if (err < 0)
+                       return -EINVAL;
+               return IIO_VAL_INT;
+
+       case IIO_CHAN_INFO_SCALE:
+
+               *val1 = 0;
+               *val2 = mcp3422_scales[sample_rate][pga];
+               return IIO_VAL_INT_PLUS_NANO;
+
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               *val1 = mcp3422_sample_rates[MCP3422_SAMPLE_RATE(adc->config)];
+               return IIO_VAL_INT;
+
+       default:
+               break;
+       }
+
+       return -EINVAL;
+}
+
+static int mcp3422_write_raw(struct iio_dev *iio,
+                       struct iio_chan_spec const *channel, int val1,
+                       int val2, long mask)
+{
+       struct mcp3422 *adc = iio_priv(iio);
+       u8 temp;
+       u8 config = adc->config;
+       u8 req_channel = channel->channel;
+       u8 sample_rate = MCP3422_SAMPLE_RATE(config);
+       u8 i;
+
+       switch (mask) {
+       case IIO_CHAN_INFO_SCALE:
+               if (val1 != 0)
+                       return -EINVAL;
+
+               for (i = 0; i < ARRAY_SIZE(mcp3422_scales[0]); i++) {
+                       if (val2 == mcp3422_scales[sample_rate][i]) {
+                               adc->pga[req_channel] = i;
+
+                               config &= ~MCP3422_CHANNEL_MASK;
+                               config |= MCP3422_CHANNEL_VALUE(req_channel);
+                               config &= ~MCP3422_PGA_MASK;
+                               config |= MCP3422_PGA_VALUE(adc->pga[req_channel]);
+
+                               return mcp3422_update_config(adc, config);
+                       }
+               }
+               return -EINVAL;
+
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               switch (val1) {
+               case 240:
+                       temp = MCP3422_SRATE_240;
+                       break;
+               case 60:
+                       temp = MCP3422_SRATE_60;
+                       break;
+               case 15:
+                       temp = MCP3422_SRATE_15;
+                       break;
+               case 3:
+                       temp = MCP3422_SRATE_3;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+
+               config &= ~MCP3422_CHANNEL_MASK;
+               config |= MCP3422_CHANNEL_VALUE(req_channel);
+               config &= ~MCP3422_SRATE_MASK;
+               config |= MCP3422_SAMPLE_RATE_VALUE(temp);
+
+               return mcp3422_update_config(adc, config);
+
+       default:
+               break;
+       }
+
+       return -EINVAL;
+}
+
+static int mcp3422_write_raw_get_fmt(struct iio_dev *indio_dev,
+               struct iio_chan_spec const *chan, long mask)
+{
+       switch (mask) {
+       case IIO_CHAN_INFO_SCALE:
+               return IIO_VAL_INT_PLUS_NANO;
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               return IIO_VAL_INT_PLUS_MICRO;
+       default:
+               return -EINVAL;
+       }
+}
+
+static ssize_t mcp3422_show_scales(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mcp3422 *adc = iio_priv(dev_to_iio_dev(dev));
+       u8 sample_rate = MCP3422_SAMPLE_RATE(adc->config);
+
+       return sprintf(buf, "0.%09u 0.%09u 0.%09u 0.%09u\n",
+               mcp3422_scales[sample_rate][0],
+               mcp3422_scales[sample_rate][1],
+               mcp3422_scales[sample_rate][2],
+               mcp3422_scales[sample_rate][3]);
+}
+
+static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("240 60 15 3");
+static IIO_DEVICE_ATTR(in_voltage_scale_available, S_IRUGO,
+               mcp3422_show_scales, NULL, 0);
+
+static struct attribute *mcp3422_attributes[] = {
+       &iio_const_attr_sampling_frequency_available.dev_attr.attr,
+       &iio_dev_attr_in_voltage_scale_available.dev_attr.attr,
+       NULL,
+};
+
+static const struct attribute_group mcp3422_attribute_group = {
+       .attrs = mcp3422_attributes,
+};
+
+static const struct iio_chan_spec mcp3422_channels[] = {
+       MCP3422_CHAN(0),
+       MCP3422_CHAN(1),
+};
+
+static const struct iio_chan_spec mcp3424_channels[] = {
+       MCP3422_CHAN(0),
+       MCP3422_CHAN(1),
+       MCP3422_CHAN(2),
+       MCP3422_CHAN(3),
+};
+
+static const struct iio_info mcp3422_info = {
+       .read_raw = mcp3422_read_raw,
+       .write_raw = mcp3422_write_raw,
+       .write_raw_get_fmt = mcp3422_write_raw_get_fmt,
+       .attrs = &mcp3422_attribute_group,
+       .driver_module = THIS_MODULE,
+};
+
+static int mcp3422_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
+{
+       struct iio_dev *indio_dev;
+       struct mcp3422 *adc;
+       int err;
+       u8 config;
+
+       if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
+               return -ENODEV;
+
+       indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*adc));
+       if (!indio_dev)
+               return -ENOMEM;
+
+       adc = iio_priv(indio_dev);
+       adc->i2c = client;
+
+       mutex_init(&adc->lock);
+
+       indio_dev->dev.parent = &client->dev;
+       indio_dev->name = dev_name(&client->dev);
+       indio_dev->modes = INDIO_DIRECT_MODE;
+       indio_dev->info = &mcp3422_info;
+
+       switch ((unsigned int)(id->driver_data)) {
+       case 2:
+       case 3:
+               indio_dev->channels = mcp3422_channels;
+               indio_dev->num_channels = ARRAY_SIZE(mcp3422_channels);
+               break;
+       case 4:
+               indio_dev->channels = mcp3424_channels;
+               indio_dev->num_channels = ARRAY_SIZE(mcp3424_channels);
+               break;
+       }
+
+       /* meaningful default configuration */
+       config = (MCP3422_CONT_SAMPLING
+               | MCP3422_CHANNEL_VALUE(1)
+               | MCP3422_PGA_VALUE(MCP3422_PGA_1)
+               | MCP3422_SAMPLE_RATE_VALUE(MCP3422_SRATE_240));
+       mcp3422_update_config(adc, config);
+
+       err = iio_device_register(indio_dev);
+       if (err < 0)
+               return err;
+
+       i2c_set_clientdata(client, indio_dev);
+
+       return 0;
+}
+
+static int mcp3422_remove(struct i2c_client *client)
+{
+       iio_device_unregister(i2c_get_clientdata(client));
+       return 0;
+}
+
+static const struct i2c_device_id mcp3422_id[] = {
+       { "mcp3422", 2 },
+       { "mcp3423", 3 },
+       { "mcp3424", 4 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, mcp3422_id);
+
+#ifdef CONFIG_OF
+static const struct of_device_id mcp3422_of_match[] = {
+       { .compatible = "mcp3422" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, mcp3422_of_match);
+#endif
+
+static struct i2c_driver mcp3422_driver = {
+       .driver = {
+               .name = "mcp3422",
+               .owner = THIS_MODULE,
+               .of_match_table = of_match_ptr(mcp3422_of_match),
+       },
+       .probe = mcp3422_probe,
+       .remove = mcp3422_remove,
+       .id_table = mcp3422_id,
+};
+module_i2c_driver(mcp3422_driver);
+
+MODULE_AUTHOR("Angelo Compagnucci <angelo.compagnucci@gmail.com>");
+MODULE_DESCRIPTION("Microchip mcp3422/3/4 driver");
+MODULE_LICENSE("GPL v2");
index a952538a1a8b5be11078744f1463d45067dee567..8fb5429e39aec41a1c37cc12816ece904a7c6168 100644 (file)
 #include <linux/iio/driver.h>
 
 #include <linux/mfd/ti_am335x_tscadc.h>
+#include <linux/iio/buffer.h>
+#include <linux/iio/kfifo_buf.h>
 
 struct tiadc_device {
        struct ti_tscadc_dev *mfd_tscadc;
        int channels;
        u8 channel_line[8];
        u8 channel_step[8];
+       int buffer_en_ch_steps;
+       u16 data[8];
 };
 
 static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg)
@@ -56,8 +60,14 @@ static u32 get_adc_step_mask(struct tiadc_device *adc_dev)
        return step_en;
 }
 
-static void tiadc_step_config(struct tiadc_device *adc_dev)
+static u32 get_adc_step_bit(struct tiadc_device *adc_dev, int chan)
 {
+       return 1 << adc_dev->channel_step[chan];
+}
+
+static void tiadc_step_config(struct iio_dev *indio_dev)
+{
+       struct tiadc_device *adc_dev = iio_priv(indio_dev);
        unsigned int stepconfig;
        int i, steps;
 
@@ -72,7 +82,11 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
         */
 
        steps = TOTAL_STEPS - adc_dev->channels;
-       stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
+       if (iio_buffer_enabled(indio_dev))
+               stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1
+                                       | STEPCONFIG_MODE_SWCNT;
+       else
+               stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
 
        for (i = 0; i < adc_dev->channels; i++) {
                int chan;
@@ -85,9 +99,175 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
                adc_dev->channel_step[i] = steps;
                steps++;
        }
+}
+
+static irqreturn_t tiadc_irq_h(int irq, void *private)
+{
+       struct iio_dev *indio_dev = private;
+       struct tiadc_device *adc_dev = iio_priv(indio_dev);
+       unsigned int status, config;
+       status = tiadc_readl(adc_dev, REG_IRQSTATUS);
+
+       /*
+        * ADC and touchscreen share the IRQ line.
+        * FIFO0 interrupts are used by TSC. Handle FIFO1 IRQs here only
+        */
+       if (status & IRQENB_FIFO1OVRRUN) {
+               /* FIFO Overrun. Clear flag. Disable/Enable ADC to recover */
+               config = tiadc_readl(adc_dev, REG_CTRL);
+               config &= ~(CNTRLREG_TSCSSENB);
+               tiadc_writel(adc_dev, REG_CTRL, config);
+               tiadc_writel(adc_dev, REG_IRQSTATUS, IRQENB_FIFO1OVRRUN
+                               | IRQENB_FIFO1UNDRFLW | IRQENB_FIFO1THRES);
+               tiadc_writel(adc_dev, REG_CTRL, (config | CNTRLREG_TSCSSENB));
+               return IRQ_HANDLED;
+       } else if (status & IRQENB_FIFO1THRES) {
+               /* Disable irq and wake worker thread */
+               tiadc_writel(adc_dev, REG_IRQCLR, IRQENB_FIFO1THRES);
+               return IRQ_WAKE_THREAD;
+       }
+
+       return IRQ_NONE;
+}
+
+static irqreturn_t tiadc_worker_h(int irq, void *private)
+{
+       struct iio_dev *indio_dev = private;
+       struct tiadc_device *adc_dev = iio_priv(indio_dev);
+       int i, k, fifo1count, read;
+       u16 *data = adc_dev->data;
+
+       fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
+       for (k = 0; k < fifo1count; k = k + i) {
+               for (i = 0; i < (indio_dev->scan_bytes)/2; i++) {
+                       read = tiadc_readl(adc_dev, REG_FIFO1);
+                       data[i] = read & FIFOREAD_DATA_MASK;
+               }
+               iio_push_to_buffers(indio_dev, (u8 *) data);
+       }
+
+       tiadc_writel(adc_dev, REG_IRQSTATUS, IRQENB_FIFO1THRES);
+       tiadc_writel(adc_dev, REG_IRQENABLE, IRQENB_FIFO1THRES);
+
+       return IRQ_HANDLED;
+}
+
+static int tiadc_buffer_preenable(struct iio_dev *indio_dev)
+{
+       struct tiadc_device *adc_dev = iio_priv(indio_dev);
+       int i, fifo1count, read;
+
+       tiadc_writel(adc_dev, REG_IRQCLR, (IRQENB_FIFO1THRES |
+                               IRQENB_FIFO1OVRRUN |
+                               IRQENB_FIFO1UNDRFLW));
+
+       /* Flush FIFO. Needed in corner cases in simultaneous tsc/adc use */
+       fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
+       for (i = 0; i < fifo1count; i++)
+               read = tiadc_readl(adc_dev, REG_FIFO1);
+
+       return iio_sw_buffer_preenable(indio_dev);
+}
+
+static int tiadc_buffer_postenable(struct iio_dev *indio_dev)
+{
+       struct tiadc_device *adc_dev = iio_priv(indio_dev);
+       struct iio_buffer *buffer = indio_dev->buffer;
+       unsigned int enb = 0;
+       u8 bit;
+
+       tiadc_step_config(indio_dev);
+       for_each_set_bit(bit, buffer->scan_mask, adc_dev->channels)
+               enb |= (get_adc_step_bit(adc_dev, bit) << 1);
+       adc_dev->buffer_en_ch_steps = enb;
+
+       am335x_tsc_se_set(adc_dev->mfd_tscadc, enb);
+
+       tiadc_writel(adc_dev,  REG_IRQSTATUS, IRQENB_FIFO1THRES
+                               | IRQENB_FIFO1OVRRUN | IRQENB_FIFO1UNDRFLW);
+       tiadc_writel(adc_dev,  REG_IRQENABLE, IRQENB_FIFO1THRES
+                               | IRQENB_FIFO1OVRRUN);
+
+       return 0;
+}
+
+static int tiadc_buffer_predisable(struct iio_dev *indio_dev)
+{
+       struct tiadc_device *adc_dev = iio_priv(indio_dev);
+       int fifo1count, i, read;
+
+       tiadc_writel(adc_dev, REG_IRQCLR, (IRQENB_FIFO1THRES |
+                               IRQENB_FIFO1OVRRUN | IRQENB_FIFO1UNDRFLW));
+       am335x_tsc_se_clr(adc_dev->mfd_tscadc, adc_dev->buffer_en_ch_steps);
+
+       /* Flush FIFO of leftover data in the time it takes to disable adc */
+       fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
+       for (i = 0; i < fifo1count; i++)
+               read = tiadc_readl(adc_dev, REG_FIFO1);
+
+       return 0;
+}
+
+static int tiadc_buffer_postdisable(struct iio_dev *indio_dev)
+{
+       tiadc_step_config(indio_dev);
 
+       return 0;
 }
 
+static const struct iio_buffer_setup_ops tiadc_buffer_setup_ops = {
+       .preenable = &tiadc_buffer_preenable,
+       .postenable = &tiadc_buffer_postenable,
+       .predisable = &tiadc_buffer_predisable,
+       .postdisable = &tiadc_buffer_postdisable,
+};
+
+static int tiadc_iio_buffered_hardware_setup(struct iio_dev *indio_dev,
+       irqreturn_t (*pollfunc_bh)(int irq, void *p),
+       irqreturn_t (*pollfunc_th)(int irq, void *p),
+       int irq,
+       unsigned long flags,
+       const struct iio_buffer_setup_ops *setup_ops)
+{
+       int ret;
+
+       indio_dev->buffer = iio_kfifo_allocate(indio_dev);
+       if (!indio_dev->buffer)
+               return -ENOMEM;
+
+       ret = request_threaded_irq(irq, pollfunc_th, pollfunc_bh,
+                               flags, indio_dev->name, indio_dev);
+       if (ret)
+               goto error_kfifo_free;
+
+       indio_dev->setup_ops = setup_ops;
+       indio_dev->modes |= INDIO_BUFFER_HARDWARE;
+
+       ret = iio_buffer_register(indio_dev,
+                                 indio_dev->channels,
+                                 indio_dev->num_channels);
+       if (ret)
+               goto error_free_irq;
+
+       return 0;
+
+error_free_irq:
+       free_irq(irq, indio_dev);
+error_kfifo_free:
+       iio_kfifo_free(indio_dev->buffer);
+       return ret;
+}
+
+static void tiadc_iio_buffered_hardware_remove(struct iio_dev *indio_dev)
+{
+       struct tiadc_device *adc_dev = iio_priv(indio_dev);
+
+       free_irq(adc_dev->mfd_tscadc->irq, indio_dev);
+       iio_kfifo_free(indio_dev->buffer);
+       iio_buffer_unregister(indio_dev);
+}
+
+
 static const char * const chan_name_ain[] = {
        "AIN0",
        "AIN1",
@@ -120,9 +300,10 @@ static int tiadc_channel_init(struct iio_dev *indio_dev, int channels)
                chan->channel = adc_dev->channel_line[i];
                chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
                chan->datasheet_name = chan_name_ain[chan->channel];
+               chan->scan_index = i;
                chan->scan_type.sign = 'u';
                chan->scan_type.realbits = 12;
-               chan->scan_type.storagebits = 32;
+               chan->scan_type.storagebits = 16;
        }
 
        indio_dev->channels = chan_array;
@@ -142,11 +323,14 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
        struct tiadc_device *adc_dev = iio_priv(indio_dev);
        int i, map_val;
        unsigned int fifo1count, read, stepid;
-       u32 step = UINT_MAX;
        bool found = false;
        u32 step_en;
        unsigned long timeout = jiffies + usecs_to_jiffies
                                (IDLE_TIMEOUT * adc_dev->channels);
+
+       if (iio_buffer_enabled(indio_dev))
+               return -EBUSY;
+
        step_en = get_adc_step_mask(adc_dev);
        am335x_tsc_se_set(adc_dev->mfd_tscadc, step_en);
 
@@ -168,15 +352,6 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
         * Hence we need to flush out this data.
         */
 
-       for (i = 0; i < ARRAY_SIZE(adc_dev->channel_step); i++) {
-               if (chan->channel == adc_dev->channel_line[i]) {
-                       step = adc_dev->channel_step[i];
-                       break;
-               }
-       }
-       if (WARN_ON_ONCE(step == UINT_MAX))
-               return -EINVAL;
-
        fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
        for (i = 0; i < fifo1count; i++) {
                read = tiadc_readl(adc_dev, REG_FIFO1);
@@ -186,7 +361,7 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
                if (stepid == map_val) {
                        read = read & FIFOREAD_DATA_MASK;
                        found = true;
-                       *val = read;
+                       *val = (u16) read;
                }
        }
 
@@ -237,20 +412,33 @@ static int tiadc_probe(struct platform_device *pdev)
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->info = &tiadc_info;
 
-       tiadc_step_config(adc_dev);
+       tiadc_step_config(indio_dev);
+       tiadc_writel(adc_dev, REG_FIFO1THR, FIFO1_THRESHOLD);
 
        err = tiadc_channel_init(indio_dev, adc_dev->channels);
        if (err < 0)
                return err;
 
-       err = iio_device_register(indio_dev);
+       err = tiadc_iio_buffered_hardware_setup(indio_dev,
+               &tiadc_worker_h,
+               &tiadc_irq_h,
+               adc_dev->mfd_tscadc->irq,
+               IRQF_SHARED,
+               &tiadc_buffer_setup_ops);
+
        if (err)
                goto err_free_channels;
 
+       err = iio_device_register(indio_dev);
+       if (err)
+               goto err_buffer_unregister;
+
        platform_set_drvdata(pdev, indio_dev);
 
        return 0;
 
+err_buffer_unregister:
+       tiadc_iio_buffered_hardware_remove(indio_dev);
 err_free_channels:
        tiadc_channels_remove(indio_dev);
        return err;
@@ -263,6 +451,7 @@ static int tiadc_remove(struct platform_device *pdev)
        u32 step_en;
 
        iio_device_unregister(indio_dev);
+       tiadc_iio_buffered_hardware_remove(indio_dev);
        tiadc_channels_remove(indio_dev);
 
        step_en = get_adc_step_mask(adc_dev);
@@ -301,7 +490,7 @@ static int tiadc_resume(struct device *dev)
        restore &= ~(CNTRLREG_POWERDOWN);
        tiadc_writel(adc_dev, REG_CTRL, restore);
 
-       tiadc_step_config(adc_dev);
+       tiadc_step_config(indio_dev);
 
        return 0;
 }
index 415f3c6efd7293087cc1d5fa9313e9de308e6245..841fec1e78b2f486be2ffaab2b1ceae8e3ce2bc3 100644 (file)
@@ -7,12 +7,12 @@
 
 struct iio_cb_buffer {
        struct iio_buffer buffer;
-       int (*cb)(u8 *data, void *private);
+       int (*cb)(const void *data, void *private);
        void *private;
        struct iio_channel *channels;
 };
 
-static int iio_buffer_cb_store_to(struct iio_buffer *buffer, u8 *data)
+static int iio_buffer_cb_store_to(struct iio_buffer *buffer, const void *data)
 {
        struct iio_cb_buffer *cb_buff = container_of(buffer,
                                                     struct iio_cb_buffer,
@@ -21,12 +21,12 @@ static int iio_buffer_cb_store_to(struct iio_buffer *buffer, u8 *data)
        return cb_buff->cb(data, cb_buff->private);
 }
 
-static struct iio_buffer_access_funcs iio_cb_access = {
+static const struct iio_buffer_access_funcs iio_cb_access = {
        .store_to = &iio_buffer_cb_store_to,
 };
 
 struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev,
-                                            int (*cb)(u8 *data,
+                                            int (*cb)(const void *data,
                                                       void *private),
                                             void *private)
 {
index 71a2c5f63b9ced2361c5fb94f255cc3c6430ba23..1665c8e4b62b245c4301a93143b1912ec140466d 100644 (file)
@@ -113,11 +113,8 @@ irqreturn_t st_sensors_trigger_handler(int irq, void *p)
        if (len < 0)
                goto st_sensors_get_buffer_element_error;
 
-       if (indio_dev->scan_timestamp)
-               *(s64 *)((u8 *)sdata->buffer_data +
-                               ALIGN(len, sizeof(s64))) = pf->timestamp;
-
-       iio_push_to_buffers(indio_dev, sdata->buffer_data);
+       iio_push_to_buffers_with_timestamp(indio_dev, sdata->buffer_data,
+               pf->timestamp);
 
 st_sensors_get_buffer_element_error:
        iio_trigger_notify_done(indio_dev->trig);
index 965ee22d3ac80ef1ae98d26da17d3a44528b43db..7ba1ef27021323ec82ccb8a2cb3242795bfb0116 100644 (file)
@@ -198,21 +198,17 @@ int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable)
 }
 EXPORT_SYMBOL(st_sensors_set_axis_enable);
 
-int st_sensors_init_sensor(struct iio_dev *indio_dev,
-                                       struct st_sensors_platform_data *pdata)
+static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
+                                      struct st_sensors_platform_data *pdata)
 {
-       int err;
        struct st_sensor_data *sdata = iio_priv(indio_dev);
 
-       mutex_init(&sdata->tb.buf_lock);
-
        switch (pdata->drdy_int_pin) {
        case 1:
                if (sdata->sensor->drdy_irq.mask_int1 == 0) {
                        dev_err(&indio_dev->dev,
                                        "DRDY on INT1 not available.\n");
-                       err = -EINVAL;
-                       goto init_error;
+                       return -EINVAL;
                }
                sdata->drdy_int_pin = 1;
                break;
@@ -220,39 +216,53 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev,
                if (sdata->sensor->drdy_irq.mask_int2 == 0) {
                        dev_err(&indio_dev->dev,
                                        "DRDY on INT2 not available.\n");
-                       err = -EINVAL;
-                       goto init_error;
+                       return -EINVAL;
                }
                sdata->drdy_int_pin = 2;
                break;
        default:
                dev_err(&indio_dev->dev, "DRDY on pdata not valid.\n");
-               err = -EINVAL;
-               goto init_error;
+               return -EINVAL;
        }
 
+       return 0;
+}
+
+int st_sensors_init_sensor(struct iio_dev *indio_dev,
+                                       struct st_sensors_platform_data *pdata)
+{
+       struct st_sensor_data *sdata = iio_priv(indio_dev);
+       int err = 0;
+
+       mutex_init(&sdata->tb.buf_lock);
+
+       if (pdata)
+               err = st_sensors_set_drdy_int_pin(indio_dev, pdata);
+
        err = st_sensors_set_enable(indio_dev, false);
        if (err < 0)
-               goto init_error;
+               return err;
 
-       err = st_sensors_set_fullscale(indio_dev,
-                                               sdata->current_fullscale->num);
-       if (err < 0)
-               goto init_error;
+       if (sdata->current_fullscale) {
+               err = st_sensors_set_fullscale(indio_dev,
+                                              sdata->current_fullscale->num);
+               if (err < 0)
+                       return err;
+       } else
+               dev_info(&indio_dev->dev, "Full-scale not possible\n");
 
        err = st_sensors_set_odr(indio_dev, sdata->odr);
        if (err < 0)
-               goto init_error;
+               return err;
 
        /* set BDU */
        err = st_sensors_write_data_with_mask(indio_dev,
                        sdata->sensor->bdu.addr, sdata->sensor->bdu.mask, true);
        if (err < 0)
-               goto init_error;
+               return err;
 
        err = st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
 
-init_error:
        return err;
 }
 EXPORT_SYMBOL(st_sensors_init_sensor);
@@ -263,6 +273,9 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
        u8 drdy_mask;
        struct st_sensor_data *sdata = iio_priv(indio_dev);
 
+       if (!sdata->sensor->drdy_irq.addr)
+               return 0;
+
        /* Enable/Disable the interrupt generator 1. */
        if (sdata->sensor->drdy_irq.ig1.en_addr > 0) {
                err = st_sensors_write_data_with_mask(indio_dev,
@@ -318,10 +331,8 @@ static int st_sensors_read_axis_data(struct iio_dev *indio_dev,
        unsigned int byte_for_channel = ch->scan_type.storagebits >> 3;
 
        outdata = kmalloc(byte_for_channel, GFP_KERNEL);
-       if (!outdata) {
-               err = -EINVAL;
-               goto st_sensors_read_axis_data_error;
-       }
+       if (!outdata)
+               return -ENOMEM;
 
        err = sdata->tf->read_multiple_byte(&sdata->tb, sdata->dev,
                                ch->address, byte_for_channel,
@@ -336,7 +347,7 @@ static int st_sensors_read_axis_data(struct iio_dev *indio_dev,
 
 st_sensors_free_memory:
        kfree(outdata);
-st_sensors_read_axis_data_error:
+
        return err;
 }
 
@@ -349,28 +360,25 @@ int st_sensors_read_info_raw(struct iio_dev *indio_dev,
        mutex_lock(&indio_dev->mlock);
        if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
                err = -EBUSY;
-               goto read_error;
+               goto out;
        } else {
                err = st_sensors_set_enable(indio_dev, true);
                if (err < 0)
-                       goto read_error;
+                       goto out;
 
                msleep((sdata->sensor->bootime * 1000) / sdata->odr);
                err = st_sensors_read_axis_data(indio_dev, ch, val);
                if (err < 0)
-                       goto read_error;
+                       goto out;
 
                *val = *val >> ch->scan_type.shift;
 
                err = st_sensors_set_enable(indio_dev, false);
        }
+out:
        mutex_unlock(&indio_dev->mlock);
 
        return err;
-
-read_error:
-       mutex_unlock(&indio_dev->mlock);
-       return err;
 }
 EXPORT_SYMBOL(st_sensors_read_info_raw);
 
index a3a52be4852cb39fb3791b64f53cdbc285e87158..b18e8c4347c2f4476235bb70e3f166c32608b9c1 100644 (file)
@@ -285,8 +285,9 @@ static const struct iio_chan_spec_ext_info ad5064_ext_info[] = {
                .name = "powerdown",
                .read = ad5064_read_dac_powerdown,
                .write = ad5064_write_dac_powerdown,
+               .shared = IIO_SEPARATE,
        },
-       IIO_ENUM("powerdown_mode", false, &ad5064_powerdown_mode_enum),
+       IIO_ENUM("powerdown_mode", IIO_SEPARATE, &ad5064_powerdown_mode_enum),
        IIO_ENUM_AVAILABLE("powerdown_mode", &ad5064_powerdown_mode_enum),
        { },
 };
index 1c44ae3920e25b463bd907a3057a153fac3ba95f..4c791e66e0d7ca3a3f43698964d2413a20d3b2b2 100644 (file)
@@ -247,8 +247,10 @@ static struct iio_chan_spec_ext_info ad5380_ext_info[] = {
                .name = "powerdown",
                .read = ad5380_read_dac_powerdown,
                .write = ad5380_write_dac_powerdown,
+               .shared = IIO_SEPARATE,
        },
-       IIO_ENUM("powerdown_mode", true, &ad5380_powerdown_mode_enum),
+       IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE,
+                &ad5380_powerdown_mode_enum),
        IIO_ENUM_AVAILABLE("powerdown_mode", &ad5380_powerdown_mode_enum),
        { },
 };
index 96e9ed4c2d0167f1274ecbc6307a28d4594dbf10..6dcb6d93f0e4d4d2e9ea8112286e130f273055cf 100644 (file)
@@ -132,8 +132,9 @@ static const struct iio_chan_spec_ext_info ad5446_ext_info_powerdown[] = {
                .name = "powerdown",
                .read = ad5446_read_dac_powerdown,
                .write = ad5446_write_dac_powerdown,
+               .shared = IIO_SEPARATE,
        },
-       IIO_ENUM("powerdown_mode", false, &ad5446_powerdown_mode_enum),
+       IIO_ENUM("powerdown_mode", IIO_SEPARATE, &ad5446_powerdown_mode_enum),
        IIO_ENUM_AVAILABLE("powerdown_mode", &ad5446_powerdown_mode_enum),
        { },
 };
index caffb16bc05c0ce34b9fa6c65ebfd433ec57bf8f..31f4ff29f914d4ef30555e1db0a0e1abdfa3d222 100644 (file)
@@ -248,8 +248,10 @@ static const struct iio_chan_spec_ext_info ad5504_ext_info[] = {
                .name = "powerdown",
                .read = ad5504_read_dac_powerdown,
                .write = ad5504_write_dac_powerdown,
+               .shared = IIO_SEPARATE,
        },
-       IIO_ENUM("powerdown_mode", true, &ad5504_powerdown_mode_enum),
+       IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE,
+                &ad5504_powerdown_mode_enum),
        IIO_ENUM_AVAILABLE("powerdown_mode", &ad5504_powerdown_mode_enum),
        { },
 };
index 714af757cd561cc291d88d04c9d00dc2cab8ed1a..dbb1289cc7a6b2a6e168ef32504e5466f2ebc3cb 100644 (file)
@@ -163,8 +163,10 @@ static const struct iio_chan_spec_ext_info ad5624r_ext_info[] = {
                .name = "powerdown",
                .read = ad5624r_read_dac_powerdown,
                .write = ad5624r_write_dac_powerdown,
+               .shared = IIO_SEPARATE,
        },
-       IIO_ENUM("powerdown_mode", true, &ad5624r_powerdown_mode_enum),
+       IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE,
+                &ad5624r_powerdown_mode_enum),
        IIO_ENUM_AVAILABLE("powerdown_mode", &ad5624r_powerdown_mode_enum),
        { },
 };
index 57825ead7db2eec071cf7d593bfbcb642bfa9784..f472b48445f6f122074a57ee2fd4478c60580cc9 100644 (file)
@@ -213,7 +213,6 @@ static int ad5686_read_raw(struct iio_dev *indio_dev,
                        return ret;
                *val = ret;
                return IIO_VAL_INT;
-               break;
        case IIO_CHAN_INFO_SCALE:
                scale_uv = (st->vref_mv * 100000)
                        >> (chan->scan_type.realbits);
@@ -265,8 +264,9 @@ static const struct iio_chan_spec_ext_info ad5686_ext_info[] = {
                .name = "powerdown",
                .read = ad5686_read_dac_powerdown,
                .write = ad5686_write_dac_powerdown,
+               .shared = IIO_SEPARATE,
        },
-       IIO_ENUM("powerdown_mode", false, &ad5686_powerdown_mode_enum),
+       IIO_ENUM("powerdown_mode", IIO_SEPARATE, &ad5686_powerdown_mode_enum),
        IIO_ENUM_AVAILABLE("powerdown_mode", &ad5686_powerdown_mode_enum),
        { },
 };
index 36a4361aece12b771169a541e993eead076c602a..f305a0c83418e817b10f92428f7f3dc73b2f2497 100644 (file)
@@ -386,6 +386,7 @@ static const struct iio_chan_spec_ext_info ad5755_ext_info[] = {
                .name = "powerdown",
                .read = ad5755_read_powerdown,
                .write = ad5755_write_powerdown,
+               .shared = IIO_SEPARATE,
        },
        { },
 };
index ce7458963309aa4fd08a82c8d9274d02090d2174..3cee89be68c3ac672dc697ea82c843446d71e323 100644 (file)
@@ -287,11 +287,12 @@ static int ad5791_read_raw(struct iio_dev *indio_dev,
 static const struct iio_chan_spec_ext_info ad5791_ext_info[] = {
        {
                .name = "powerdown",
-               .shared = true,
+               .shared = IIO_SHARED_BY_TYPE,
                .read = ad5791_read_dac_powerdown,
                .write = ad5791_write_dac_powerdown,
        },
-       IIO_ENUM("powerdown_mode", true, &ad5791_powerdown_mode_enum),
+       IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE,
+                &ad5791_powerdown_mode_enum),
        IIO_ENUM_AVAILABLE("powerdown_mode", &ad5791_powerdown_mode_enum),
        { },
 };
index ed2d276477bd9970aeede225b93b7cc56c8ab40e..d0505fd22ef46c467d99f6b7e9dca18b9a4a688d 100644 (file)
@@ -169,6 +169,7 @@ static const struct iio_chan_spec_ext_info ad7303_ext_info[] = {
                .name = "powerdown",
                .read = ad7303_read_dac_powerdown,
                .write = ad7303_write_dac_powerdown,
+               .shared = IIO_SEPARATE,
        },
        { },
 };
index 1397b6e0e414c25835aebd829dc2bede15dedee3..7a42d85269bb524853a0c638e6bc650489179dba 100644 (file)
@@ -195,8 +195,9 @@ static const struct iio_chan_spec_ext_info mcp4725_ext_info[] = {
                .name = "powerdown",
                .read = mcp4725_read_powerdown,
                .write = mcp4725_write_powerdown,
+               .shared = IIO_SEPARATE,
        },
-       IIO_ENUM("powerdown_mode", false, &mcp4725_powerdown_mode_enum),
+       IIO_ENUM("powerdown_mode", IIO_SEPARATE, &mcp4725_powerdown_mode_enum),
        IIO_ENUM_AVAILABLE("powerdown_mode", &mcp4725_powerdown_mode_enum),
        { },
 };
index a7b30be86ae06cb7ae59a077aa45ee4e58f52051..85152547aa8ba7c75945a91dffe6a34cf27a45d3 100644 (file)
@@ -351,6 +351,7 @@ static ssize_t adf4350_read(struct iio_dev *indio_dev,
        .read = adf4350_read, \
        .write = adf4350_write, \
        .private = _ident, \
+       .shared = IIO_SEPARATE, \
 }
 
 static const struct iio_chan_spec_ext_info adf4350_ext_info[] = {
index ac66fc184042e4aa7e23545555321521a032df31..9155cf6cf287f078ce7947f12ec7812642406e75 100644 (file)
@@ -103,7 +103,6 @@ static int adis16130_read_raw(struct iio_dev *indio_dev,
                default:
                        return -EINVAL;
                }
-               break;
        case IIO_CHAN_INFO_OFFSET:
                switch (chan->type) {
                case IIO_ANGL_VEL:
@@ -115,7 +114,6 @@ static int adis16130_read_raw(struct iio_dev *indio_dev,
                default:
                        return -EINVAL;
                }
-               break;
        }
 
        return -EINVAL;
index 06541162fc0213676467d3028f9ae1dde70cb848..22b6fb80fa1a7a99d3003d15e44fd63ac07f10b2 100644 (file)
@@ -239,7 +239,6 @@ static int adis16260_read_raw(struct iio_dev *indio_dev,
                default:
                        return -EINVAL;
                }
-               break;
        case IIO_CHAN_INFO_OFFSET:
                *val = 250000 / 1453; /* 25 C = 0x00 */
                return IIO_VAL_INT;
index 6dab2995f0f26ebc5111b75281722ea029ee3c8c..c1f40efbf6394e3f41da0037de93483d81ffb26f 100644 (file)
@@ -354,7 +354,6 @@ static int adxrs450_read_raw(struct iio_dev *indio_dev,
                default:
                        return -EINVAL;
                }
-               break;
        case IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW:
                ret = adxrs450_spi_read_reg_16(indio_dev, ADXRS450_QUAD1, &t);
                if (ret)
index c688d974d3e3ec3d858a4f07e6dabf592866a395..ea01c6bcfb56825979efc7bfc588eeb9e429e059 100644 (file)
@@ -182,10 +182,11 @@ static const struct iio_info gyro_3d_info = {
 };
 
 /* Function to push data to buffer */
-static void hid_sensor_push_data(struct iio_dev *indio_dev, u8 *data, int len)
+static void hid_sensor_push_data(struct iio_dev *indio_dev, const void *data,
+       int len)
 {
        dev_dbg(&indio_dev->dev, "hid_sensor_push_data\n");
-       iio_push_to_buffers(indio_dev, (u8 *)data);
+       iio_push_to_buffers(indio_dev, data);
 }
 
 /* Callback handler to send event after all samples are received and captured */
@@ -200,7 +201,7 @@ static int gyro_3d_proc_event(struct hid_sensor_hub_device *hsdev,
                                gyro_state->common_attributes.data_ready);
        if (gyro_state->common_attributes.data_ready)
                hid_sensor_push_data(indio_dev,
-                               (u8 *)gyro_state->gyro_val,
+                               gyro_state->gyro_val,
                                sizeof(gyro_state->gyro_val));
 
        return 0;
index 6c43af9bb0a4474097f2def7ec15d973a7238b47..e3b3c5084070d808ca88939e3f13257472ba3e55 100644 (file)
@@ -55,11 +55,8 @@ static irqreturn_t itg3200_trigger_handler(int irq, void *p)
        if (ret < 0)
                goto error_ret;
 
-       if (indio_dev->scan_timestamp)
-               memcpy(buf + indio_dev->scan_bytes - sizeof(s64),
-                               &pf->timestamp, sizeof(pf->timestamp));
+       iio_push_to_buffers_with_timestamp(indio_dev, buf, pf->timestamp);
 
-       iio_push_to_buffers(indio_dev, (u8 *)buf);
        iio_trigger_notify_done(indio_dev->trig);
 
 error_ret:
index e13c2b0bf3d1ae27de590555d349b6b31632f112..d53d91adfb557b0e575a17030221c6e01b2b7d38 100644 (file)
@@ -305,8 +305,9 @@ static const struct iio_trigger_ops st_gyro_trigger_ops = {
 int st_gyro_common_probe(struct iio_dev *indio_dev,
                                        struct st_sensors_platform_data *pdata)
 {
-       int err;
        struct st_sensor_data *gdata = iio_priv(indio_dev);
+       int irq = gdata->get_irq_data_ready(indio_dev);
+       int err;
 
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->info = &gyro_info;
@@ -314,7 +315,7 @@ int st_gyro_common_probe(struct iio_dev *indio_dev,
        err = st_sensors_check_device_support(indio_dev,
                                ARRAY_SIZE(st_gyro_sensors), st_gyro_sensors);
        if (err < 0)
-               goto st_gyro_common_probe_error;
+               return err;
 
        gdata->num_data_channels = ST_GYRO_NUMBER_DATA_CHANNELS;
        gdata->multiread_bit = gdata->sensor->multi_read_bit;
@@ -327,13 +328,13 @@ int st_gyro_common_probe(struct iio_dev *indio_dev,
 
        err = st_sensors_init_sensor(indio_dev, pdata);
        if (err < 0)
-               goto st_gyro_common_probe_error;
+               return err;
 
-       if (gdata->get_irq_data_ready(indio_dev) > 0) {
-               err = st_gyro_allocate_ring(indio_dev);
-               if (err < 0)
-                       goto st_gyro_common_probe_error;
+       err = st_gyro_allocate_ring(indio_dev);
+       if (err < 0)
+               return err;
 
+       if (irq > 0) {
                err = st_sensors_allocate_trigger(indio_dev,
                                                  ST_GYRO_TRIGGER_OPS);
                if (err < 0)
@@ -344,15 +345,14 @@ int st_gyro_common_probe(struct iio_dev *indio_dev,
        if (err)
                goto st_gyro_device_register_error;
 
-       return err;
+       return 0;
 
 st_gyro_device_register_error:
-       if (gdata->get_irq_data_ready(indio_dev) > 0)
+       if (irq > 0)
                st_sensors_deallocate_trigger(indio_dev);
 st_gyro_probe_trigger_error:
-       if (gdata->get_irq_data_ready(indio_dev) > 0)
-               st_gyro_deallocate_ring(indio_dev);
-st_gyro_common_probe_error:
+       st_gyro_deallocate_ring(indio_dev);
+
        return err;
 }
 EXPORT_SYMBOL(st_gyro_common_probe);
@@ -362,10 +362,10 @@ void st_gyro_common_remove(struct iio_dev *indio_dev)
        struct st_sensor_data *gdata = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-       if (gdata->get_irq_data_ready(indio_dev) > 0) {
+       if (gdata->get_irq_data_ready(indio_dev) > 0)
                st_sensors_deallocate_trigger(indio_dev);
-               st_gyro_deallocate_ring(indio_dev);
-       }
+
+       st_gyro_deallocate_ring(indio_dev);
 }
 EXPORT_SYMBOL(st_gyro_common_remove);
 
index 9b32253b824be454bf2f6c46bf02acb022b3be46..9209f47b273a214e738ec73eeaf47448bd9af4de 100644 (file)
@@ -30,7 +30,7 @@ int __iio_add_chan_devattr(const char *postfix,
                                                const char *buf,
                                                size_t len),
                           u64 mask,
-                          bool generic,
+                          enum iio_shared_by shared_by,
                           struct device *dev,
                           struct list_head *attr_list);
 
index 054c01d6e73cf147845ea3da748fcb05068a3505..f2cf829e5df104ea35b64a0493c4975493826bcb 100644 (file)
@@ -82,13 +82,8 @@ irqreturn_t adis16400_trigger_handler(int irq, void *p)
                spi_setup(st->adis.spi);
        }
 
-       /* Guaranteed to be aligned with 8 byte boundary */
-       if (indio_dev->scan_timestamp) {
-               void *b = adis->buffer + indio_dev->scan_bytes - sizeof(s64);
-               *(s64 *)b = pf->timestamp;
-       }
-
-       iio_push_to_buffers(indio_dev, adis->buffer);
+       iio_push_to_buffers_with_timestamp(indio_dev, adis->buffer,
+               pf->timestamp);
 
        iio_trigger_notify_done(indio_dev->trig);
 
index 99d8e0b0dd34243168a750794df130ee77d8fe37..cb32b593f1c55c023046d97cfc41263ea3818d89 100644 (file)
@@ -102,13 +102,8 @@ static irqreturn_t adis_trigger_handler(int irq, void *p)
                mutex_unlock(&adis->txrx_lock);
        }
 
-       /* Guaranteed to be aligned with 8 byte boundary */
-       if (indio_dev->scan_timestamp) {
-               void *b = adis->buffer + indio_dev->scan_bytes - sizeof(s64);
-               *(s64 *)b = pf->timestamp;
-       }
-
-       iio_push_to_buffers(indio_dev, adis->buffer);
+       iio_push_to_buffers_with_timestamp(indio_dev, adis->buffer,
+               pf->timestamp);
 
        iio_trigger_notify_done(indio_dev->trig);
 
index 7da0832f187b8d320cd8618eb3379b2015bee927..429517117eff43d92b86238a284635c8b3b4b8f9 100644 (file)
@@ -124,7 +124,6 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p)
        u8 data[INV_MPU6050_OUTPUT_DATA_SIZE];
        u16 fifo_count;
        s64 timestamp;
-       u64 *tmp;
 
        mutex_lock(&indio_dev->mlock);
        if (!(st->chip_config.accl_fifo_enable |
@@ -170,9 +169,8 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p)
                if (0 == result)
                        timestamp = 0;
 
-               tmp = (u64 *)data;
-               tmp[DIV_ROUND_UP(bytes_per_datum, 8)] = timestamp;
-               result = iio_push_to_buffers(indio_dev, data);
+               result = iio_push_to_buffers_with_timestamp(indio_dev, data,
+                       timestamp);
                if (result)
                        goto flush_fifo;
                fifo_count -= bytes_per_datum;
index 2710f7245c3b5472b0e924bd22a94f6bc1212b6f..e9f389b9da690b616b04587b9e91a6304ddefffb 100644 (file)
@@ -31,16 +31,9 @@ static const char * const iio_endian_prefix[] = {
        [IIO_LE] = "le",
 };
 
-static bool iio_buffer_is_active(struct iio_dev *indio_dev,
-                                struct iio_buffer *buf)
+static bool iio_buffer_is_active(struct iio_buffer *buf)
 {
-       struct list_head *p;
-
-       list_for_each(p, &indio_dev->buffer_list)
-               if (p == &buf->buffer_list)
-                       return true;
-
-       return false;
+       return !list_empty(&buf->buffer_list);
 }
 
 /**
@@ -79,6 +72,7 @@ unsigned int iio_buffer_poll(struct file *filp,
 void iio_buffer_init(struct iio_buffer *buffer)
 {
        INIT_LIST_HEAD(&buffer->demux_list);
+       INIT_LIST_HEAD(&buffer->buffer_list);
        init_waitqueue_head(&buffer->pollq);
 }
 EXPORT_SYMBOL(iio_buffer_init);
@@ -146,7 +140,7 @@ static ssize_t iio_scan_el_store(struct device *dev,
        if (ret < 0)
                return ret;
        mutex_lock(&indio_dev->mlock);
-       if (iio_buffer_is_active(indio_dev, indio_dev->buffer)) {
+       if (iio_buffer_is_active(indio_dev->buffer)) {
                ret = -EBUSY;
                goto error_ret;
        }
@@ -192,7 +186,7 @@ static ssize_t iio_scan_el_ts_store(struct device *dev,
                return ret;
 
        mutex_lock(&indio_dev->mlock);
-       if (iio_buffer_is_active(indio_dev, indio_dev->buffer)) {
+       if (iio_buffer_is_active(indio_dev->buffer)) {
                ret = -EBUSY;
                goto error_ret;
        }
@@ -214,7 +208,7 @@ static int iio_buffer_add_channel_sysfs(struct iio_dev *indio_dev,
                                     &iio_show_scan_index,
                                     NULL,
                                     0,
-                                    0,
+                                    IIO_SEPARATE,
                                     &indio_dev->dev,
                                     &buffer->scan_el_dev_attr_list);
        if (ret)
@@ -249,6 +243,8 @@ static int iio_buffer_add_channel_sysfs(struct iio_dev *indio_dev,
                                             0,
                                             &indio_dev->dev,
                                             &buffer->scan_el_dev_attr_list);
+       if (ret)
+               goto error_ret;
        attrcount++;
        ret = attrcount;
 error_ret:
@@ -396,7 +392,7 @@ ssize_t iio_buffer_write_length(struct device *dev,
                        return len;
 
        mutex_lock(&indio_dev->mlock);
-       if (iio_buffer_is_active(indio_dev, indio_dev->buffer)) {
+       if (iio_buffer_is_active(indio_dev->buffer)) {
                ret = -EBUSY;
        } else {
                if (buffer->access->set_length)
@@ -414,13 +410,11 @@ ssize_t iio_buffer_show_enable(struct device *dev,
                               char *buf)
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       return sprintf(buf, "%d\n",
-                      iio_buffer_is_active(indio_dev,
-                                           indio_dev->buffer));
+       return sprintf(buf, "%d\n", iio_buffer_is_active(indio_dev->buffer));
 }
 EXPORT_SYMBOL(iio_buffer_show_enable);
 
-/* note NULL used as error indicator as it doesn't make sense. */
+/* Note NULL used as error indicator as it doesn't make sense. */
 static const unsigned long *iio_scan_mask_match(const unsigned long *av_masks,
                                          unsigned int masklength,
                                          const unsigned long *mask)
@@ -435,8 +429,8 @@ static const unsigned long *iio_scan_mask_match(const unsigned long *av_masks,
        return NULL;
 }
 
-static int iio_compute_scan_bytes(struct iio_dev *indio_dev, const long *mask,
-                                 bool timestamp)
+static int iio_compute_scan_bytes(struct iio_dev *indio_dev,
+                               const unsigned long *mask, bool timestamp)
 {
        const struct iio_chan_spec *ch;
        unsigned bytes = 0;
@@ -509,7 +503,7 @@ int iio_update_buffers(struct iio_dev *indio_dev,
                indio_dev->active_scan_mask = NULL;
 
        if (remove_buffer)
-               list_del(&remove_buffer->buffer_list);
+               list_del_init(&remove_buffer->buffer_list);
        if (insert_buffer)
                list_add(&insert_buffer->buffer_list, &indio_dev->buffer_list);
 
@@ -521,7 +515,7 @@ int iio_update_buffers(struct iio_dev *indio_dev,
                return 0;
        }
 
-       /* What scan mask do we actually have ?*/
+       /* What scan mask do we actually have*/
        compound_mask = kcalloc(BITS_TO_LONGS(indio_dev->masklength),
                                sizeof(long), GFP_KERNEL);
        if (compound_mask == NULL) {
@@ -546,7 +540,7 @@ int iio_update_buffers(struct iio_dev *indio_dev,
                         * Roll back.
                         * Note can only occur when adding a buffer.
                         */
-                       list_del(&insert_buffer->buffer_list);
+                       list_del_init(&insert_buffer->buffer_list);
                        if (old_mask) {
                                indio_dev->active_scan_mask = old_mask;
                                success = -EINVAL;
@@ -594,7 +588,7 @@ int iio_update_buffers(struct iio_dev *indio_dev,
                        goto error_run_postdisable;
                }
        }
-       /* Definitely possible for devices to support both of these.*/
+       /* Definitely possible for devices to support both of these. */
        if (indio_dev->modes & INDIO_BUFFER_TRIGGERED) {
                if (!indio_dev->trig) {
                        printk(KERN_INFO "Buffer not started: no trigger\n");
@@ -605,7 +599,7 @@ int iio_update_buffers(struct iio_dev *indio_dev,
                indio_dev->currentmode = INDIO_BUFFER_TRIGGERED;
        } else if (indio_dev->modes & INDIO_BUFFER_HARDWARE) {
                indio_dev->currentmode = INDIO_BUFFER_HARDWARE;
-       } else { /* should never be reached */
+       } else { /* Should never be reached */
                ret = -EINVAL;
                goto error_run_postdisable;
        }
@@ -637,7 +631,7 @@ error_run_postdisable:
 error_remove_inserted:
 
        if (insert_buffer)
-               list_del(&insert_buffer->buffer_list);
+               list_del_init(&insert_buffer->buffer_list);
        indio_dev->active_scan_mask = old_mask;
        kfree(compound_mask);
 error_ret:
@@ -654,7 +648,6 @@ ssize_t iio_buffer_store_enable(struct device *dev,
        int ret;
        bool requested_state;
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_buffer *pbuf = indio_dev->buffer;
        bool inlist;
 
        ret = strtobool(buf, &requested_state);
@@ -664,7 +657,7 @@ ssize_t iio_buffer_store_enable(struct device *dev,
        mutex_lock(&indio_dev->mlock);
 
        /* Find out if it is in the list */
-       inlist = iio_buffer_is_active(indio_dev, pbuf);
+       inlist = iio_buffer_is_active(indio_dev->buffer);
        /* Already in desired state */
        if (inlist == requested_state)
                goto done;
@@ -729,6 +722,7 @@ static bool iio_validate_scan_mask(struct iio_dev *indio_dev,
 
 /**
  * iio_scan_mask_set() - set particular bit in the scan mask
+ * @indio_dev: the iio device
  * @buffer: the buffer whose scan mask we are interested in
  * @bit: the bit to be set.
  *
@@ -749,7 +743,7 @@ int iio_scan_mask_set(struct iio_dev *indio_dev,
        if (trialmask == NULL)
                return -ENOMEM;
        if (!indio_dev->masklength) {
-               WARN_ON("trying to set scanmask prior to registering buffer\n");
+               WARN_ON("Trying to set scanmask prior to registering buffer\n");
                goto err_invalid_mask;
        }
        bitmap_copy(trialmask, buffer->scan_mask, indio_dev->masklength);
@@ -804,8 +798,8 @@ struct iio_demux_table {
        struct list_head l;
 };
 
-static unsigned char *iio_demux(struct iio_buffer *buffer,
-                                unsigned char *datain)
+static const void *iio_demux(struct iio_buffer *buffer,
+                                const void *datain)
 {
        struct iio_demux_table *t;
 
@@ -818,9 +812,9 @@ static unsigned char *iio_demux(struct iio_buffer *buffer,
        return buffer->demux_bounce;
 }
 
-static int iio_push_to_buffer(struct iio_buffer *buffer, unsigned char *data)
+static int iio_push_to_buffer(struct iio_buffer *buffer, const void *data)
 {
-       unsigned char *dataout = iio_demux(buffer, data);
+       const void *dataout = iio_demux(buffer, data);
 
        return buffer->access->store_to(buffer, dataout);
 }
@@ -835,7 +829,7 @@ static void iio_buffer_demux_free(struct iio_buffer *buffer)
 }
 
 
-int iio_push_to_buffers(struct iio_dev *indio_dev, unsigned char *data)
+int iio_push_to_buffers(struct iio_dev *indio_dev, const void *data)
 {
        int ret;
        struct iio_buffer *buf;
index 8e84cd522e4970af8603e10a157657b9ab14102e..863aa010ce5ae964400e034771ad6b837ff18a5d 100644 (file)
@@ -101,6 +101,7 @@ static const char * const iio_chan_info_postfix[] = {
        [IIO_CHAN_INFO_PHASE] = "phase",
        [IIO_CHAN_INFO_HARDWAREGAIN] = "hardwaregain",
        [IIO_CHAN_INFO_HYSTERESIS] = "hysteresis",
+       [IIO_CHAN_INFO_INT_TIME] = "integration_time",
 };
 
 const struct iio_chan_spec
@@ -516,14 +517,15 @@ int __iio_device_attr_init(struct device_attribute *dev_attr,
                                                struct device_attribute *attr,
                                                const char *buf,
                                                size_t len),
-                          bool generic)
+                          enum iio_shared_by shared_by)
 {
-       int ret;
-       char *name_format, *full_postfix;
+       int ret = 0;
+       char *name_format = NULL;
+       char *full_postfix;
        sysfs_attr_init(&dev_attr->attr);
 
        /* Build up postfix of <extend_name>_<modifier>_postfix */
-       if (chan->modified && !generic) {
+       if (chan->modified && (shared_by == IIO_SEPARATE)) {
                if (chan->extend_name)
                        full_postfix = kasprintf(GFP_KERNEL, "%s_%s_%s",
                                                 iio_modifier_names[chan
@@ -544,53 +546,78 @@ int __iio_device_attr_init(struct device_attribute *dev_attr,
                                                 chan->extend_name,
                                                 postfix);
        }
-       if (full_postfix == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       if (full_postfix == NULL)
+               return -ENOMEM;
 
        if (chan->differential) { /* Differential can not have modifier */
-               if (generic)
+               switch (shared_by) {
+               case IIO_SHARED_BY_ALL:
+                       name_format = kasprintf(GFP_KERNEL, "%s", full_postfix);
+                       break;
+               case IIO_SHARED_BY_DIR:
+                       name_format = kasprintf(GFP_KERNEL, "%s_%s",
+                                               iio_direction[chan->output],
+                                               full_postfix);
+                       break;
+               case IIO_SHARED_BY_TYPE:
                        name_format
                                = kasprintf(GFP_KERNEL, "%s_%s-%s_%s",
                                            iio_direction[chan->output],
                                            iio_chan_type_name_spec[chan->type],
                                            iio_chan_type_name_spec[chan->type],
                                            full_postfix);
-               else if (chan->indexed)
+                       break;
+               case IIO_SEPARATE:
+                       if (!chan->indexed) {
+                               WARN_ON("Differential channels must be indexed\n");
+                               ret = -EINVAL;
+                               goto error_free_full_postfix;
+                       }
                        name_format
-                               = kasprintf(GFP_KERNEL, "%s_%s%d-%s%d_%s",
+                               = kasprintf(GFP_KERNEL,
+                                           "%s_%s%d-%s%d_%s",
                                            iio_direction[chan->output],
                                            iio_chan_type_name_spec[chan->type],
                                            chan->channel,
                                            iio_chan_type_name_spec[chan->type],
                                            chan->channel2,
                                            full_postfix);
-               else {
-                       WARN_ON("Differential channels must be indexed\n");
-                       ret = -EINVAL;
-                       goto error_free_full_postfix;
+                       break;
                }
        } else { /* Single ended */
-               if (generic)
-                       name_format
-                               = kasprintf(GFP_KERNEL, "%s_%s_%s",
-                                           iio_direction[chan->output],
-                                           iio_chan_type_name_spec[chan->type],
-                                           full_postfix);
-               else if (chan->indexed)
-                       name_format
-                               = kasprintf(GFP_KERNEL, "%s_%s%d_%s",
-                                           iio_direction[chan->output],
-                                           iio_chan_type_name_spec[chan->type],
-                                           chan->channel,
-                                           full_postfix);
-               else
+               switch (shared_by) {
+               case IIO_SHARED_BY_ALL:
+                       name_format = kasprintf(GFP_KERNEL, "%s", full_postfix);
+                       break;
+               case IIO_SHARED_BY_DIR:
+                       name_format = kasprintf(GFP_KERNEL, "%s_%s",
+                                               iio_direction[chan->output],
+                                               full_postfix);
+                       break;
+               case IIO_SHARED_BY_TYPE:
                        name_format
                                = kasprintf(GFP_KERNEL, "%s_%s_%s",
                                            iio_direction[chan->output],
                                            iio_chan_type_name_spec[chan->type],
                                            full_postfix);
+                       break;
+
+               case IIO_SEPARATE:
+                       if (chan->indexed)
+                               name_format
+                                       = kasprintf(GFP_KERNEL, "%s_%s%d_%s",
+                                                   iio_direction[chan->output],
+                                                   iio_chan_type_name_spec[chan->type],
+                                                   chan->channel,
+                                                   full_postfix);
+                       else
+                               name_format
+                                       = kasprintf(GFP_KERNEL, "%s_%s_%s",
+                                                   iio_direction[chan->output],
+                                                   iio_chan_type_name_spec[chan->type],
+                                                   full_postfix);
+                       break;
+               }
        }
        if (name_format == NULL) {
                ret = -ENOMEM;
@@ -614,16 +641,11 @@ int __iio_device_attr_init(struct device_attribute *dev_attr,
                dev_attr->attr.mode |= S_IWUSR;
                dev_attr->store = writefunc;
        }
-       kfree(name_format);
-       kfree(full_postfix);
-
-       return 0;
-
 error_free_name_format:
        kfree(name_format);
 error_free_full_postfix:
        kfree(full_postfix);
-error_ret:
+
        return ret;
 }
 
@@ -642,7 +664,7 @@ int __iio_add_chan_devattr(const char *postfix,
                                                const char *buf,
                                                size_t len),
                           u64 mask,
-                          bool generic,
+                          enum iio_shared_by shared_by,
                           struct device *dev,
                           struct list_head *attr_list)
 {
@@ -656,7 +678,7 @@ int __iio_add_chan_devattr(const char *postfix,
        }
        ret = __iio_device_attr_init(&iio_attr->dev_attr,
                                     postfix, chan,
-                                    readfunc, writefunc, generic);
+                                    readfunc, writefunc, shared_by);
        if (ret)
                goto error_iio_dev_attr_free;
        iio_attr->c = chan;
@@ -664,7 +686,7 @@ int __iio_add_chan_devattr(const char *postfix,
        list_for_each_entry(t, attr_list, l)
                if (strcmp(t->dev_attr.attr.name,
                           iio_attr->dev_attr.attr.name) == 0) {
-                       if (!generic)
+                       if (shared_by == IIO_SEPARATE)
                                dev_err(dev, "tried to double register : %s\n",
                                        t->dev_attr.attr.name);
                        ret = -EBUSY;
@@ -682,46 +704,68 @@ error_ret:
        return ret;
 }
 
-static int iio_device_add_channel_sysfs(struct iio_dev *indio_dev,
-                                       struct iio_chan_spec const *chan)
+static int iio_device_add_info_mask_type(struct iio_dev *indio_dev,
+                                        struct iio_chan_spec const *chan,
+                                        enum iio_shared_by shared_by,
+                                        const long *infomask)
 {
-       int ret, attrcount = 0;
-       int i;
-       const struct iio_chan_spec_ext_info *ext_info;
+       int i, ret, attrcount = 0;
 
-       if (chan->channel < 0)
-               return 0;
-       for_each_set_bit(i, &chan->info_mask_separate, sizeof(long)*8) {
+       for_each_set_bit(i, infomask, sizeof(infomask)*8) {
                ret = __iio_add_chan_devattr(iio_chan_info_postfix[i],
                                             chan,
                                             &iio_read_channel_info,
                                             &iio_write_channel_info,
                                             i,
-                                            0,
+                                            shared_by,
                                             &indio_dev->dev,
                                             &indio_dev->channel_attr_list);
-               if (ret < 0)
-                       goto error_ret;
-               attrcount++;
-       }
-       for_each_set_bit(i, &chan->info_mask_shared_by_type, sizeof(long)*8) {
-               ret = __iio_add_chan_devattr(iio_chan_info_postfix[i],
-                                            chan,
-                                            &iio_read_channel_info,
-                                            &iio_write_channel_info,
-                                            i,
-                                            1,
-                                            &indio_dev->dev,
-                                            &indio_dev->channel_attr_list);
-               if (ret == -EBUSY) {
-                       ret = 0;
+               if ((ret == -EBUSY) && (shared_by != IIO_SEPARATE))
                        continue;
-               } else if (ret < 0) {
-                       goto error_ret;
-               }
+               else if (ret < 0)
+                       return ret;
                attrcount++;
        }
 
+       return attrcount;
+}
+
+static int iio_device_add_channel_sysfs(struct iio_dev *indio_dev,
+                                       struct iio_chan_spec const *chan)
+{
+       int ret, attrcount = 0;
+       const struct iio_chan_spec_ext_info *ext_info;
+
+       if (chan->channel < 0)
+               return 0;
+       ret = iio_device_add_info_mask_type(indio_dev, chan,
+                                           IIO_SEPARATE,
+                                           &chan->info_mask_separate);
+       if (ret < 0)
+               return ret;
+       attrcount += ret;
+
+       ret = iio_device_add_info_mask_type(indio_dev, chan,
+                                           IIO_SHARED_BY_TYPE,
+                                           &chan->info_mask_shared_by_type);
+       if (ret < 0)
+               return ret;
+       attrcount += ret;
+
+       ret = iio_device_add_info_mask_type(indio_dev, chan,
+                                           IIO_SHARED_BY_DIR,
+                                           &chan->info_mask_shared_by_dir);
+       if (ret < 0)
+               return ret;
+       attrcount += ret;
+
+       ret = iio_device_add_info_mask_type(indio_dev, chan,
+                                           IIO_SHARED_BY_ALL,
+                                           &chan->info_mask_shared_by_all);
+       if (ret < 0)
+               return ret;
+       attrcount += ret;
+
        if (chan->ext_info) {
                unsigned int i = 0;
                for (ext_info = chan->ext_info; ext_info->name; ext_info++) {
@@ -740,15 +784,13 @@ static int iio_device_add_channel_sysfs(struct iio_dev *indio_dev,
                                continue;
 
                        if (ret)
-                               goto error_ret;
+                               return ret;
 
                        attrcount++;
                }
        }
 
-       ret = attrcount;
-error_ret:
-       return ret;
+       return attrcount;
 }
 
 static void iio_device_remove_and_free_read_attr(struct iio_dev *indio_dev,
index 6be65ef5faa9b6e46716857af7ed67d8eb7ea004..36f0c8e0eb3dcfd7243ec9c60115ab270502536c 100644 (file)
@@ -166,7 +166,7 @@ int iio_event_getfd(struct iio_dev *indio_dev)
        iio_device_get(indio_dev);
 
        fd = anon_inode_getfd("iio:event", &iio_event_chrdev_fileops,
-                               indio_dev, O_RDONLY);
+                               indio_dev, O_RDONLY | O_CLOEXEC);
        if (fd < 0) {
                spin_lock_irq(&ev_int->wait.lock);
                __clear_bit(IIO_BUSY_BIT_POS, &ev_int->flags);
index a923c78d5cb48f40b2b661933b329f4ddb420c64..538d4616e48ff33a5b5ad84e5dcc0ac7b6e390f4 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/mutex.h>
 #include <linux/iio/kfifo_buf.h>
 #include <linux/sched.h>
+#include <linux/poll.h>
 
 struct iio_kfifo {
        struct iio_buffer buffer;
@@ -94,7 +95,7 @@ static int iio_set_length_kfifo(struct iio_buffer *r, int length)
 }
 
 static int iio_store_to_kfifo(struct iio_buffer *r,
-                             u8 *data)
+                             const void *data)
 {
        int ret;
        struct iio_kfifo *kf = iio_to_kfifo(r);
@@ -102,7 +103,7 @@ static int iio_store_to_kfifo(struct iio_buffer *r,
        if (ret != 1)
                return -EBUSY;
        r->stufftoread = true;
-       wake_up_interruptible(&r->pollq);
+       wake_up_interruptible_poll(&r->pollq, POLLIN | POLLRDNORM);
 
        return 0;
 }
index bf9fa0d7aff9c26d0b4caf22bf25881de868c93d..0a25ae6b132ec5c0fd26a46fb1f89df403ae08c7 100644 (file)
@@ -27,6 +27,18 @@ config APDS9300
         To compile this driver as a module, choose M here: the
         module will be called apds9300.
 
+config GP2AP020A00F
+       tristate "Sharp GP2AP020A00F Proximity/ALS sensor"
+       depends on I2C
+       select IIO_BUFFER
+       select IIO_TRIGGERED_BUFFER
+       help
+         Say Y here if you have a Sharp GP2AP020A00F proximity/ALS combo-chip
+         hooked to an I2C bus.
+
+         To compile this driver as a module, choose M here: the
+         module will be called gp2ap020a00f.
+
 config HID_SENSOR_ALS
        depends on HID_SENSOR_HUB
        select IIO_BUFFER
@@ -55,6 +67,16 @@ config SENSORS_LM3533
          changes. The ALS-control output values can be set per zone for the
          three current output channels.
 
+config TCS3472
+       tristate "TAOS TCS3472 color light-to-digital converter"
+       depends on I2C
+       help
+        If you say yes here you get support for the TAOS TCS3472
+        family of color light-to-digital converters with IR filter.
+
+        This driver can also be built as a module.  If so, the module
+        will be called tcs3472.
+
 config SENSORS_TSL2563
        tristate "TAOS TSL2560, TSL2561, TSL2562 and TSL2563 ambient light sensors"
        depends on I2C
@@ -65,6 +87,16 @@ config SENSORS_TSL2563
         This driver can also be built as a module.  If so, the module
         will be called tsl2563.
 
+config TSL4531
+       tristate "TAOS TSL4531 ambient light sensors"
+       depends on I2C
+       help
+        Say Y here if you want to build a driver for the TAOS TSL4531 family
+        of ambient light sensors with direct lux output.
+
+        To compile this driver as a module, choose M here: the
+        module will be called tsl4531.
+
 config VCNL4000
        tristate "VCNL4000 combined ALS and proximity sensor"
        depends on I2C
index 354ee9ab2379a92ba73a486d399e0b243c594ea1..cef590f2ff00462010e7054074a7d066a583a265 100644 (file)
@@ -5,7 +5,10 @@
 # When adding new entries keep the list in alphabetical order
 obj-$(CONFIG_ADJD_S311)                += adjd_s311.o
 obj-$(CONFIG_APDS9300)         += apds9300.o
+obj-$(CONFIG_GP2AP020A00F)     += gp2ap020a00f.o
 obj-$(CONFIG_HID_SENSOR_ALS)   += hid-sensor-als.o
 obj-$(CONFIG_SENSORS_LM3533)   += lm3533-als.o
 obj-$(CONFIG_SENSORS_TSL2563)  += tsl2563.o
+obj-$(CONFIG_TCS3472)          += tcs3472.o
+obj-$(CONFIG_TSL4531)          += tsl4531.o
 obj-$(CONFIG_VCNL4000)         += vcnl4000.o
index 23cff798598aad0cf0f3078de05804d6a07541b5..83d15c5baf646cd61de0ecf4b87fa054b1df0f49 100644 (file)
@@ -114,43 +114,6 @@ static int adjd_s311_read_data(struct iio_dev *indio_dev, u8 reg, int *val)
        return 0;
 }
 
-static ssize_t adjd_s311_read_int_time(struct iio_dev *indio_dev,
-       uintptr_t private, const struct iio_chan_spec *chan, char *buf)
-{
-       struct adjd_s311_data *data = iio_priv(indio_dev);
-       s32 ret;
-
-       ret = i2c_smbus_read_word_data(data->client,
-               ADJD_S311_INT_REG(chan->address));
-       if (ret < 0)
-               return ret;
-
-       return sprintf(buf, "%d\n", ret & ADJD_S311_INT_MASK);
-}
-
-static ssize_t adjd_s311_write_int_time(struct iio_dev *indio_dev,
-        uintptr_t private, const struct iio_chan_spec *chan, const char *buf,
-        size_t len)
-{
-       struct adjd_s311_data *data = iio_priv(indio_dev);
-       unsigned long int_time;
-       int ret;
-
-       ret = kstrtoul(buf, 10, &int_time);
-       if (ret)
-               return ret;
-
-       if (int_time > ADJD_S311_INT_MASK)
-               return -EINVAL;
-
-       ret = i2c_smbus_write_word_data(data->client,
-               ADJD_S311_INT_REG(chan->address), int_time);
-       if (ret < 0)
-               return ret;
-
-       return len;
-}
-
 static irqreturn_t adjd_s311_trigger_handler(int irq, void *p)
 {
        struct iio_poll_func *pf = p;
@@ -175,10 +138,7 @@ static irqreturn_t adjd_s311_trigger_handler(int irq, void *p)
                len += 2;
        }
 
-       if (indio_dev->scan_timestamp)
-               *(s64 *)((u8 *)data->buffer + ALIGN(len, sizeof(s64)))
-                       = time_ns;
-       iio_push_to_buffers(indio_dev, (u8 *)data->buffer);
+       iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, time_ns);
 
 done:
        iio_trigger_notify_done(indio_dev->trig);
@@ -186,25 +146,16 @@ done:
        return IRQ_HANDLED;
 }
 
-static const struct iio_chan_spec_ext_info adjd_s311_ext_info[] = {
-       {
-               .name = "integration_time",
-               .read = adjd_s311_read_int_time,
-               .write = adjd_s311_write_int_time,
-       },
-       { }
-};
-
 #define ADJD_S311_CHANNEL(_color, _scan_idx) { \
        .type = IIO_INTENSITY, \
        .modified = 1, \
        .address = (IDX_##_color), \
        .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
-               BIT(IIO_CHAN_INFO_HARDWAREGAIN), \
+               BIT(IIO_CHAN_INFO_HARDWAREGAIN) | \
+               BIT(IIO_CHAN_INFO_INT_TIME), \
        .channel2 = (IIO_MOD_LIGHT_##_color), \
        .scan_index = (_scan_idx), \
        .scan_type = IIO_ST('u', 10, 16, 0), \
-       .ext_info = adjd_s311_ext_info, \
 }
 
 static const struct iio_chan_spec adjd_s311_channels[] = {
@@ -236,6 +187,18 @@ static int adjd_s311_read_raw(struct iio_dev *indio_dev,
                        return ret;
                *val = ret & ADJD_S311_CAP_MASK;
                return IIO_VAL_INT;
+       case IIO_CHAN_INFO_INT_TIME:
+               ret = i2c_smbus_read_word_data(data->client,
+                       ADJD_S311_INT_REG(chan->address));
+               if (ret < 0)
+                       return ret;
+               *val = 0;
+               /*
+                * not documented, based on measurement:
+                * 4095 LSBs correspond to roughly 4 ms
+                */
+               *val2 = ret & ADJD_S311_INT_MASK;
+               return IIO_VAL_INT_PLUS_MICRO;
        }
        return -EINVAL;
 }
@@ -245,16 +208,20 @@ static int adjd_s311_write_raw(struct iio_dev *indio_dev,
                               int val, int val2, long mask)
 {
        struct adjd_s311_data *data = iio_priv(indio_dev);
-       int ret;
 
        switch (mask) {
        case IIO_CHAN_INFO_HARDWAREGAIN:
                if (val < 0 || val > ADJD_S311_CAP_MASK)
                        return -EINVAL;
 
-               ret = i2c_smbus_write_byte_data(data->client,
+               return i2c_smbus_write_byte_data(data->client,
                        ADJD_S311_CAP_REG(chan->address), val);
-               return ret;
+       case IIO_CHAN_INFO_INT_TIME:
+               if (val != 0 || val2 < 0 || val2 > ADJD_S311_INT_MASK)
+                       return -EINVAL;
+
+               return i2c_smbus_write_word_data(data->client,
+                       ADJD_S311_INT_REG(chan->address), val2);
        }
        return -EINVAL;
 }
diff --git a/drivers/iio/light/gp2ap020a00f.c b/drivers/iio/light/gp2ap020a00f.c
new file mode 100644 (file)
index 0000000..b1e4615
--- /dev/null
@@ -0,0 +1,1617 @@
+/*
+ * Copyright (C) 2013 Samsung Electronics Co., Ltd.
+ * Author: Jacek Anaszewski <j.anaszewski@samsung.com>
+ *
+ * IIO features supported by the driver:
+ *
+ * Read-only raw channels:
+ *   - illiminance_clear [lux]
+ *   - illiminance_ir
+ *   - proximity
+ *
+ * Triggered buffer:
+ *   - illiminance_clear
+ *   - illiminance_ir
+ *   - proximity
+ *
+ * Events:
+ *   - illuminance_clear (rising and falling)
+ *   - proximity (rising and falling)
+ *     - both falling and rising thresholds for the proximity events
+ *       must be set to the values greater than 0.
+ *
+ * The driver supports triggered buffers for all the three
+ * channels as well as high and low threshold events for the
+ * illuminance_clear and proxmimity channels. Triggers
+ * can be enabled simultaneously with both illuminance_clear
+ * events. Proximity events cannot be enabled simultaneously
+ * with any triggers or illuminance events. Enabling/disabling
+ * one of the proximity events automatically enables/disables
+ * the other one.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2, as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/debugfs.h>
+#include <linux/delay.h>
+#include <linux/i2c.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/irq_work.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
+#include <linux/slab.h>
+#include <linux/iio/buffer.h>
+#include <linux/iio/events.h>
+#include <linux/iio/iio.h>
+#include <linux/iio/sysfs.h>
+#include <linux/iio/trigger.h>
+#include <linux/iio/trigger_consumer.h>
+#include <linux/iio/triggered_buffer.h>
+
+#define GP2A_I2C_NAME "gp2ap020a00f"
+
+/* Registers */
+#define GP2AP020A00F_OP_REG    0x00 /* Basic operations */
+#define GP2AP020A00F_ALS_REG   0x01 /* ALS related settings */
+#define GP2AP020A00F_PS_REG    0x02 /* PS related settings */
+#define GP2AP020A00F_LED_REG   0x03 /* LED reg */
+#define GP2AP020A00F_TL_L_REG  0x04 /* ALS: Threshold low LSB */
+#define GP2AP020A00F_TL_H_REG  0x05 /* ALS: Threshold low MSB */
+#define GP2AP020A00F_TH_L_REG  0x06 /* ALS: Threshold high LSB */
+#define GP2AP020A00F_TH_H_REG  0x07 /* ALS: Threshold high MSB */
+#define GP2AP020A00F_PL_L_REG  0x08 /* PS: Threshold low LSB */
+#define GP2AP020A00F_PL_H_REG  0x09 /* PS: Threshold low MSB */
+#define GP2AP020A00F_PH_L_REG  0x0a /* PS: Threshold high LSB */
+#define GP2AP020A00F_PH_H_REG  0x0b /* PS: Threshold high MSB */
+#define GP2AP020A00F_D0_L_REG  0x0c /* ALS result: Clear/Illuminance LSB */
+#define GP2AP020A00F_D0_H_REG  0x0d /* ALS result: Clear/Illuminance MSB */
+#define GP2AP020A00F_D1_L_REG  0x0e /* ALS result: IR LSB */
+#define GP2AP020A00F_D1_H_REG  0x0f /* ALS result: IR LSB */
+#define GP2AP020A00F_D2_L_REG  0x10 /* PS result LSB */
+#define GP2AP020A00F_D2_H_REG  0x11 /* PS result MSB */
+#define GP2AP020A00F_NUM_REGS  0x12 /* Number of registers */
+
+/* OP_REG bits */
+#define GP2AP020A00F_OP3_MASK          0x80 /* Software shutdown */
+#define GP2AP020A00F_OP3_SHUTDOWN      0x00
+#define GP2AP020A00F_OP3_OPERATION     0x80
+#define GP2AP020A00F_OP2_MASK          0x40 /* Auto shutdown/Continuous mode */
+#define GP2AP020A00F_OP2_AUTO_SHUTDOWN 0x00
+#define GP2AP020A00F_OP2_CONT_OPERATION        0x40
+#define GP2AP020A00F_OP_MASK           0x30 /* Operating mode selection  */
+#define GP2AP020A00F_OP_ALS_AND_PS     0x00
+#define GP2AP020A00F_OP_ALS            0x10
+#define GP2AP020A00F_OP_PS             0x20
+#define GP2AP020A00F_OP_DEBUG          0x30
+#define GP2AP020A00F_PROX_MASK         0x08 /* PS: detection/non-detection */
+#define GP2AP020A00F_PROX_NON_DETECT   0x00
+#define GP2AP020A00F_PROX_DETECT       0x08
+#define GP2AP020A00F_FLAG_P            0x04 /* PS: interrupt result  */
+#define GP2AP020A00F_FLAG_A            0x02 /* ALS: interrupt result  */
+#define GP2AP020A00F_TYPE_MASK         0x01 /* Output data type selection */
+#define GP2AP020A00F_TYPE_MANUAL_CALC  0x00
+#define GP2AP020A00F_TYPE_AUTO_CALC    0x01
+
+/* ALS_REG bits */
+#define GP2AP020A00F_PRST_MASK         0xc0 /* Number of measurement cycles */
+#define GP2AP020A00F_PRST_ONCE         0x00
+#define GP2AP020A00F_PRST_4_CYCLES     0x40
+#define GP2AP020A00F_PRST_8_CYCLES     0x80
+#define GP2AP020A00F_PRST_16_CYCLES    0xc0
+#define GP2AP020A00F_RES_A_MASK                0x38 /* ALS: Resolution */
+#define GP2AP020A00F_RES_A_800ms       0x00
+#define GP2AP020A00F_RES_A_400ms       0x08
+#define GP2AP020A00F_RES_A_200ms       0x10
+#define GP2AP020A00F_RES_A_100ms       0x18
+#define GP2AP020A00F_RES_A_25ms                0x20
+#define GP2AP020A00F_RES_A_6_25ms      0x28
+#define GP2AP020A00F_RES_A_1_56ms      0x30
+#define GP2AP020A00F_RES_A_0_39ms      0x38
+#define GP2AP020A00F_RANGE_A_MASK      0x07 /* ALS: Max measurable range */
+#define GP2AP020A00F_RANGE_A_x1                0x00
+#define GP2AP020A00F_RANGE_A_x2                0x01
+#define GP2AP020A00F_RANGE_A_x4                0x02
+#define GP2AP020A00F_RANGE_A_x8                0x03
+#define GP2AP020A00F_RANGE_A_x16       0x04
+#define GP2AP020A00F_RANGE_A_x32       0x05
+#define GP2AP020A00F_RANGE_A_x64       0x06
+#define GP2AP020A00F_RANGE_A_x128      0x07
+
+/* PS_REG bits */
+#define GP2AP020A00F_ALC_MASK          0x80 /* Auto light cancel */
+#define GP2AP020A00F_ALC_ON            0x80
+#define GP2AP020A00F_ALC_OFF           0x00
+#define GP2AP020A00F_INTTYPE_MASK      0x40 /* Interrupt type setting */
+#define GP2AP020A00F_INTTYPE_LEVEL     0x00
+#define GP2AP020A00F_INTTYPE_PULSE     0x40
+#define GP2AP020A00F_RES_P_MASK                0x38 /* PS: Resolution */
+#define GP2AP020A00F_RES_P_800ms_x2    0x00
+#define GP2AP020A00F_RES_P_400ms_x2    0x08
+#define GP2AP020A00F_RES_P_200ms_x2    0x10
+#define GP2AP020A00F_RES_P_100ms_x2    0x18
+#define GP2AP020A00F_RES_P_25ms_x2     0x20
+#define GP2AP020A00F_RES_P_6_25ms_x2   0x28
+#define GP2AP020A00F_RES_P_1_56ms_x2   0x30
+#define GP2AP020A00F_RES_P_0_39ms_x2   0x38
+#define GP2AP020A00F_RANGE_P_MASK      0x07 /* PS: Max measurable range */
+#define GP2AP020A00F_RANGE_P_x1                0x00
+#define GP2AP020A00F_RANGE_P_x2                0x01
+#define GP2AP020A00F_RANGE_P_x4                0x02
+#define GP2AP020A00F_RANGE_P_x8                0x03
+#define GP2AP020A00F_RANGE_P_x16       0x04
+#define GP2AP020A00F_RANGE_P_x32       0x05
+#define GP2AP020A00F_RANGE_P_x64       0x06
+#define GP2AP020A00F_RANGE_P_x128      0x07
+
+/* LED reg bits */
+#define GP2AP020A00F_INTVAL_MASK       0xc0 /* Intermittent operating */
+#define GP2AP020A00F_INTVAL_0          0x00
+#define GP2AP020A00F_INTVAL_4          0x40
+#define GP2AP020A00F_INTVAL_8          0x80
+#define GP2AP020A00F_INTVAL_16         0xc0
+#define GP2AP020A00F_IS_MASK           0x30 /* ILED drive peak current */
+#define GP2AP020A00F_IS_13_8mA         0x00
+#define GP2AP020A00F_IS_27_5mA         0x10
+#define GP2AP020A00F_IS_55mA           0x20
+#define GP2AP020A00F_IS_110mA          0x30
+#define GP2AP020A00F_PIN_MASK          0x0c /* INT terminal setting */
+#define GP2AP020A00F_PIN_ALS_OR_PS     0x00
+#define GP2AP020A00F_PIN_ALS           0x04
+#define GP2AP020A00F_PIN_PS            0x08
+#define GP2AP020A00F_PIN_PS_DETECT     0x0c
+#define GP2AP020A00F_FREQ_MASK         0x02 /* LED modulation frequency */
+#define GP2AP020A00F_FREQ_327_5kHz     0x00
+#define GP2AP020A00F_FREQ_81_8kHz      0x02
+#define GP2AP020A00F_RST               0x01 /* Software reset */
+
+#define GP2AP020A00F_SCAN_MODE_LIGHT_CLEAR     0
+#define GP2AP020A00F_SCAN_MODE_LIGHT_IR                1
+#define GP2AP020A00F_SCAN_MODE_PROXIMITY       2
+#define GP2AP020A00F_CHAN_TIMESTAMP            3
+
+#define GP2AP020A00F_DATA_READY_TIMEOUT                msecs_to_jiffies(1000)
+#define GP2AP020A00F_DATA_REG(chan)            (GP2AP020A00F_D0_L_REG + \
+                                                       (chan) * 2)
+#define GP2AP020A00F_THRESH_REG(th_val_id)     (GP2AP020A00F_TL_L_REG + \
+                                                       (th_val_id) * 2)
+#define GP2AP020A00F_THRESH_VAL_ID(reg_addr)   ((reg_addr - 4) / 2)
+
+#define GP2AP020A00F_SUBTRACT_MODE     0
+#define GP2AP020A00F_ADD_MODE          1
+
+#define GP2AP020A00F_MAX_CHANNELS      3
+
+enum gp2ap020a00f_opmode {
+       GP2AP020A00F_OPMODE_READ_RAW_CLEAR,
+       GP2AP020A00F_OPMODE_READ_RAW_IR,
+       GP2AP020A00F_OPMODE_READ_RAW_PROXIMITY,
+       GP2AP020A00F_OPMODE_ALS,
+       GP2AP020A00F_OPMODE_PS,
+       GP2AP020A00F_OPMODE_ALS_AND_PS,
+       GP2AP020A00F_OPMODE_PROX_DETECT,
+       GP2AP020A00F_OPMODE_SHUTDOWN,
+       GP2AP020A00F_NUM_OPMODES,
+};
+
+enum gp2ap020a00f_cmd {
+       GP2AP020A00F_CMD_READ_RAW_CLEAR,
+       GP2AP020A00F_CMD_READ_RAW_IR,
+       GP2AP020A00F_CMD_READ_RAW_PROXIMITY,
+       GP2AP020A00F_CMD_TRIGGER_CLEAR_EN,
+       GP2AP020A00F_CMD_TRIGGER_CLEAR_DIS,
+       GP2AP020A00F_CMD_TRIGGER_IR_EN,
+       GP2AP020A00F_CMD_TRIGGER_IR_DIS,
+       GP2AP020A00F_CMD_TRIGGER_PROX_EN,
+       GP2AP020A00F_CMD_TRIGGER_PROX_DIS,
+       GP2AP020A00F_CMD_ALS_HIGH_EV_EN,
+       GP2AP020A00F_CMD_ALS_HIGH_EV_DIS,
+       GP2AP020A00F_CMD_ALS_LOW_EV_EN,
+       GP2AP020A00F_CMD_ALS_LOW_EV_DIS,
+       GP2AP020A00F_CMD_PROX_HIGH_EV_EN,
+       GP2AP020A00F_CMD_PROX_HIGH_EV_DIS,
+       GP2AP020A00F_CMD_PROX_LOW_EV_EN,
+       GP2AP020A00F_CMD_PROX_LOW_EV_DIS,
+};
+
+enum gp2ap020a00f_flags {
+       GP2AP020A00F_FLAG_ALS_CLEAR_TRIGGER,
+       GP2AP020A00F_FLAG_ALS_IR_TRIGGER,
+       GP2AP020A00F_FLAG_PROX_TRIGGER,
+       GP2AP020A00F_FLAG_PROX_RISING_EV,
+       GP2AP020A00F_FLAG_PROX_FALLING_EV,
+       GP2AP020A00F_FLAG_ALS_RISING_EV,
+       GP2AP020A00F_FLAG_ALS_FALLING_EV,
+       GP2AP020A00F_FLAG_LUX_MODE_HI,
+       GP2AP020A00F_FLAG_DATA_READY,
+};
+
+enum gp2ap020a00f_thresh_val_id {
+       GP2AP020A00F_THRESH_TL,
+       GP2AP020A00F_THRESH_TH,
+       GP2AP020A00F_THRESH_PL,
+       GP2AP020A00F_THRESH_PH,
+};
+
+struct gp2ap020a00f_data {
+       const struct gp2ap020a00f_platform_data *pdata;
+       struct i2c_client *client;
+       struct mutex lock;
+       char *buffer;
+       struct regulator *vled_reg;
+       unsigned long flags;
+       enum gp2ap020a00f_opmode cur_opmode;
+       struct iio_trigger *trig;
+       struct regmap *regmap;
+       unsigned int thresh_val[4];
+       u8 debug_reg_addr;
+       struct irq_work work;
+       wait_queue_head_t data_ready_queue;
+};
+
+static const u8 gp2ap020a00f_reg_init_tab[] = {
+       [GP2AP020A00F_OP_REG] = GP2AP020A00F_OP3_SHUTDOWN,
+       [GP2AP020A00F_ALS_REG] = GP2AP020A00F_RES_A_25ms |
+                                GP2AP020A00F_RANGE_A_x8,
+       [GP2AP020A00F_PS_REG] = GP2AP020A00F_ALC_ON |
+                               GP2AP020A00F_RES_P_1_56ms_x2 |
+                               GP2AP020A00F_RANGE_P_x4,
+       [GP2AP020A00F_LED_REG] = GP2AP020A00F_INTVAL_0 |
+                                GP2AP020A00F_IS_110mA |
+                                GP2AP020A00F_FREQ_327_5kHz,
+       [GP2AP020A00F_TL_L_REG] = 0,
+       [GP2AP020A00F_TL_H_REG] = 0,
+       [GP2AP020A00F_TH_L_REG] = 0,
+       [GP2AP020A00F_TH_H_REG] = 0,
+       [GP2AP020A00F_PL_L_REG] = 0,
+       [GP2AP020A00F_PL_H_REG] = 0,
+       [GP2AP020A00F_PH_L_REG] = 0,
+       [GP2AP020A00F_PH_H_REG] = 0,
+};
+
+static bool gp2ap020a00f_is_volatile_reg(struct device *dev, unsigned int reg)
+{
+       switch (reg) {
+       case GP2AP020A00F_OP_REG:
+       case GP2AP020A00F_D0_L_REG:
+       case GP2AP020A00F_D0_H_REG:
+       case GP2AP020A00F_D1_L_REG:
+       case GP2AP020A00F_D1_H_REG:
+       case GP2AP020A00F_D2_L_REG:
+       case GP2AP020A00F_D2_H_REG:
+               return true;
+       default:
+               return false;
+       }
+}
+
+static const struct regmap_config gp2ap020a00f_regmap_config = {
+       .reg_bits = 8,
+       .val_bits = 8,
+
+       .max_register = GP2AP020A00F_D2_H_REG,
+       .cache_type = REGCACHE_RBTREE,
+
+       .volatile_reg = gp2ap020a00f_is_volatile_reg,
+};
+
+static const struct gp2ap020a00f_mutable_config_regs {
+       u8 op_reg;
+       u8 als_reg;
+       u8 ps_reg;
+       u8 led_reg;
+} opmode_regs_settings[GP2AP020A00F_NUM_OPMODES] = {
+       [GP2AP020A00F_OPMODE_READ_RAW_CLEAR] = {
+               GP2AP020A00F_OP_ALS | GP2AP020A00F_OP2_CONT_OPERATION
+               | GP2AP020A00F_OP3_OPERATION
+               | GP2AP020A00F_TYPE_AUTO_CALC,
+               GP2AP020A00F_PRST_ONCE,
+               GP2AP020A00F_INTTYPE_LEVEL,
+               GP2AP020A00F_PIN_ALS
+       },
+       [GP2AP020A00F_OPMODE_READ_RAW_IR] = {
+               GP2AP020A00F_OP_ALS | GP2AP020A00F_OP2_CONT_OPERATION
+               | GP2AP020A00F_OP3_OPERATION
+               | GP2AP020A00F_TYPE_MANUAL_CALC,
+               GP2AP020A00F_PRST_ONCE,
+               GP2AP020A00F_INTTYPE_LEVEL,
+               GP2AP020A00F_PIN_ALS
+       },
+       [GP2AP020A00F_OPMODE_READ_RAW_PROXIMITY] = {
+               GP2AP020A00F_OP_PS | GP2AP020A00F_OP2_CONT_OPERATION
+               | GP2AP020A00F_OP3_OPERATION
+               | GP2AP020A00F_TYPE_MANUAL_CALC,
+               GP2AP020A00F_PRST_ONCE,
+               GP2AP020A00F_INTTYPE_LEVEL,
+               GP2AP020A00F_PIN_PS
+       },
+       [GP2AP020A00F_OPMODE_PROX_DETECT] = {
+               GP2AP020A00F_OP_PS | GP2AP020A00F_OP2_CONT_OPERATION
+               | GP2AP020A00F_OP3_OPERATION
+               | GP2AP020A00F_TYPE_MANUAL_CALC,
+               GP2AP020A00F_PRST_4_CYCLES,
+               GP2AP020A00F_INTTYPE_PULSE,
+               GP2AP020A00F_PIN_PS_DETECT
+       },
+       [GP2AP020A00F_OPMODE_ALS] = {
+               GP2AP020A00F_OP_ALS | GP2AP020A00F_OP2_CONT_OPERATION
+               | GP2AP020A00F_OP3_OPERATION
+               | GP2AP020A00F_TYPE_AUTO_CALC,
+               GP2AP020A00F_PRST_ONCE,
+               GP2AP020A00F_INTTYPE_LEVEL,
+               GP2AP020A00F_PIN_ALS
+       },
+       [GP2AP020A00F_OPMODE_PS] = {
+               GP2AP020A00F_OP_PS | GP2AP020A00F_OP2_CONT_OPERATION
+               | GP2AP020A00F_OP3_OPERATION
+               | GP2AP020A00F_TYPE_MANUAL_CALC,
+               GP2AP020A00F_PRST_4_CYCLES,
+               GP2AP020A00F_INTTYPE_LEVEL,
+               GP2AP020A00F_PIN_PS
+       },
+       [GP2AP020A00F_OPMODE_ALS_AND_PS] = {
+               GP2AP020A00F_OP_ALS_AND_PS
+               | GP2AP020A00F_OP2_CONT_OPERATION
+               | GP2AP020A00F_OP3_OPERATION
+               | GP2AP020A00F_TYPE_AUTO_CALC,
+               GP2AP020A00F_PRST_4_CYCLES,
+               GP2AP020A00F_INTTYPE_LEVEL,
+               GP2AP020A00F_PIN_ALS_OR_PS
+       },
+       [GP2AP020A00F_OPMODE_SHUTDOWN] = { GP2AP020A00F_OP3_SHUTDOWN, },
+};
+
+static int gp2ap020a00f_set_operation_mode(struct gp2ap020a00f_data *data,
+                                       enum gp2ap020a00f_opmode op)
+{
+       unsigned int op_reg_val;
+       int err;
+
+       if (op != GP2AP020A00F_OPMODE_SHUTDOWN) {
+               err = regmap_read(data->regmap, GP2AP020A00F_OP_REG,
+                                       &op_reg_val);
+               if (err < 0)
+                       return err;
+               /*
+                * Shutdown the device if the operation being executed entails
+                * mode transition.
+                */
+               if ((opmode_regs_settings[op].op_reg & GP2AP020A00F_OP_MASK) !=
+                   (op_reg_val & GP2AP020A00F_OP_MASK)) {
+                       /* set shutdown mode */
+                       err = regmap_update_bits(data->regmap,
+                               GP2AP020A00F_OP_REG, GP2AP020A00F_OP3_MASK,
+                               GP2AP020A00F_OP3_SHUTDOWN);
+                       if (err < 0)
+                               return err;
+               }
+
+               err = regmap_update_bits(data->regmap, GP2AP020A00F_ALS_REG,
+                       GP2AP020A00F_PRST_MASK, opmode_regs_settings[op]
+                                                               .als_reg);
+               if (err < 0)
+                       return err;
+
+               err = regmap_update_bits(data->regmap, GP2AP020A00F_PS_REG,
+                       GP2AP020A00F_INTTYPE_MASK, opmode_regs_settings[op]
+                                                               .ps_reg);
+               if (err < 0)
+                       return err;
+
+               err = regmap_update_bits(data->regmap, GP2AP020A00F_LED_REG,
+                       GP2AP020A00F_PIN_MASK, opmode_regs_settings[op]
+                                                               .led_reg);
+               if (err < 0)
+                       return err;
+       }
+
+       /* Set OP_REG and apply operation mode (power on / off) */
+       err = regmap_update_bits(data->regmap,
+                                GP2AP020A00F_OP_REG,
+                                GP2AP020A00F_OP_MASK | GP2AP020A00F_OP2_MASK |
+                                GP2AP020A00F_OP3_MASK | GP2AP020A00F_TYPE_MASK,
+                                opmode_regs_settings[op].op_reg);
+       if (err < 0)
+               return err;
+
+       data->cur_opmode = op;
+
+       return 0;
+}
+
+static bool gp2ap020a00f_als_enabled(struct gp2ap020a00f_data *data)
+{
+       return test_bit(GP2AP020A00F_FLAG_ALS_CLEAR_TRIGGER, &data->flags) ||
+              test_bit(GP2AP020A00F_FLAG_ALS_IR_TRIGGER, &data->flags) ||
+              test_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &data->flags) ||
+              test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &data->flags);
+}
+
+static bool gp2ap020a00f_prox_detect_enabled(struct gp2ap020a00f_data *data)
+{
+       return test_bit(GP2AP020A00F_FLAG_PROX_RISING_EV, &data->flags) ||
+              test_bit(GP2AP020A00F_FLAG_PROX_FALLING_EV, &data->flags);
+}
+
+static int gp2ap020a00f_write_event_threshold(struct gp2ap020a00f_data *data,
+                               enum gp2ap020a00f_thresh_val_id th_val_id,
+                               bool enable)
+{
+       __le16 thresh_buf = 0;
+       unsigned int thresh_reg_val;
+
+       if (!enable)
+               thresh_reg_val = 0;
+       else if (test_bit(GP2AP020A00F_FLAG_LUX_MODE_HI, &data->flags) &&
+                th_val_id != GP2AP020A00F_THRESH_PL &&
+                th_val_id != GP2AP020A00F_THRESH_PH)
+               /*
+                * For the high lux mode ALS threshold has to be scaled down
+                * to allow for proper comparison with the output value.
+                */
+               thresh_reg_val = data->thresh_val[th_val_id] / 16;
+       else
+               thresh_reg_val = data->thresh_val[th_val_id] > 16000 ?
+                                       16000 :
+                                       data->thresh_val[th_val_id];
+
+       thresh_buf = cpu_to_le16(thresh_reg_val);
+
+       return regmap_bulk_write(data->regmap,
+                                GP2AP020A00F_THRESH_REG(th_val_id),
+                                (u8 *)&thresh_buf, 2);
+}
+
+static int gp2ap020a00f_alter_opmode(struct gp2ap020a00f_data *data,
+                       enum gp2ap020a00f_opmode diff_mode, int add_sub)
+{
+       enum gp2ap020a00f_opmode new_mode;
+
+       if (diff_mode != GP2AP020A00F_OPMODE_ALS &&
+           diff_mode != GP2AP020A00F_OPMODE_PS)
+               return -EINVAL;
+
+       if (add_sub == GP2AP020A00F_ADD_MODE) {
+               if (data->cur_opmode == GP2AP020A00F_OPMODE_SHUTDOWN)
+                       new_mode =  diff_mode;
+               else
+                       new_mode = GP2AP020A00F_OPMODE_ALS_AND_PS;
+       } else {
+               if (data->cur_opmode == GP2AP020A00F_OPMODE_ALS_AND_PS)
+                       new_mode = (diff_mode == GP2AP020A00F_OPMODE_ALS) ?
+                                       GP2AP020A00F_OPMODE_PS :
+                                       GP2AP020A00F_OPMODE_ALS;
+               else
+                       new_mode = GP2AP020A00F_OPMODE_SHUTDOWN;
+       }
+
+       return gp2ap020a00f_set_operation_mode(data, new_mode);
+}
+
+static int gp2ap020a00f_exec_cmd(struct gp2ap020a00f_data *data,
+                                       enum gp2ap020a00f_cmd cmd)
+{
+       int err = 0;
+
+       switch (cmd) {
+       case GP2AP020A00F_CMD_READ_RAW_CLEAR:
+               if (data->cur_opmode != GP2AP020A00F_OPMODE_SHUTDOWN)
+                       return -EBUSY;
+               err = gp2ap020a00f_set_operation_mode(data,
+                                       GP2AP020A00F_OPMODE_READ_RAW_CLEAR);
+               break;
+       case GP2AP020A00F_CMD_READ_RAW_IR:
+               if (data->cur_opmode != GP2AP020A00F_OPMODE_SHUTDOWN)
+                       return -EBUSY;
+               err = gp2ap020a00f_set_operation_mode(data,
+                                       GP2AP020A00F_OPMODE_READ_RAW_IR);
+               break;
+       case GP2AP020A00F_CMD_READ_RAW_PROXIMITY:
+               if (data->cur_opmode != GP2AP020A00F_OPMODE_SHUTDOWN)
+                       return -EBUSY;
+               err = gp2ap020a00f_set_operation_mode(data,
+                                       GP2AP020A00F_OPMODE_READ_RAW_PROXIMITY);
+               break;
+       case GP2AP020A00F_CMD_TRIGGER_CLEAR_EN:
+               if (data->cur_opmode == GP2AP020A00F_OPMODE_PROX_DETECT)
+                       return -EBUSY;
+               if (!gp2ap020a00f_als_enabled(data))
+                       err = gp2ap020a00f_alter_opmode(data,
+                                               GP2AP020A00F_OPMODE_ALS,
+                                               GP2AP020A00F_ADD_MODE);
+               set_bit(GP2AP020A00F_FLAG_ALS_CLEAR_TRIGGER, &data->flags);
+               break;
+       case GP2AP020A00F_CMD_TRIGGER_CLEAR_DIS:
+               clear_bit(GP2AP020A00F_FLAG_ALS_CLEAR_TRIGGER, &data->flags);
+               if (gp2ap020a00f_als_enabled(data))
+                       break;
+               err = gp2ap020a00f_alter_opmode(data,
+                                               GP2AP020A00F_OPMODE_ALS,
+                                               GP2AP020A00F_SUBTRACT_MODE);
+               break;
+       case GP2AP020A00F_CMD_TRIGGER_IR_EN:
+               if (data->cur_opmode == GP2AP020A00F_OPMODE_PROX_DETECT)
+                       return -EBUSY;
+               if (!gp2ap020a00f_als_enabled(data))
+                       err = gp2ap020a00f_alter_opmode(data,
+                                               GP2AP020A00F_OPMODE_ALS,
+                                               GP2AP020A00F_ADD_MODE);
+               set_bit(GP2AP020A00F_FLAG_ALS_IR_TRIGGER, &data->flags);
+               break;
+       case GP2AP020A00F_CMD_TRIGGER_IR_DIS:
+               clear_bit(GP2AP020A00F_FLAG_ALS_IR_TRIGGER, &data->flags);
+               if (gp2ap020a00f_als_enabled(data))
+                       break;
+               err = gp2ap020a00f_alter_opmode(data,
+                                               GP2AP020A00F_OPMODE_ALS,
+                                               GP2AP020A00F_SUBTRACT_MODE);
+               break;
+       case GP2AP020A00F_CMD_TRIGGER_PROX_EN:
+               if (data->cur_opmode == GP2AP020A00F_OPMODE_PROX_DETECT)
+                       return -EBUSY;
+               err = gp2ap020a00f_alter_opmode(data,
+                                               GP2AP020A00F_OPMODE_PS,
+                                               GP2AP020A00F_ADD_MODE);
+               set_bit(GP2AP020A00F_FLAG_PROX_TRIGGER, &data->flags);
+               break;
+       case GP2AP020A00F_CMD_TRIGGER_PROX_DIS:
+               clear_bit(GP2AP020A00F_FLAG_PROX_TRIGGER, &data->flags);
+               err = gp2ap020a00f_alter_opmode(data,
+                                               GP2AP020A00F_OPMODE_PS,
+                                               GP2AP020A00F_SUBTRACT_MODE);
+               break;
+       case GP2AP020A00F_CMD_ALS_HIGH_EV_EN:
+               if (test_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &data->flags))
+                       return 0;
+               if (data->cur_opmode == GP2AP020A00F_OPMODE_PROX_DETECT)
+                       return -EBUSY;
+               if (!gp2ap020a00f_als_enabled(data)) {
+                       err = gp2ap020a00f_alter_opmode(data,
+                                               GP2AP020A00F_OPMODE_ALS,
+                                               GP2AP020A00F_ADD_MODE);
+                       if (err < 0)
+                               return err;
+               }
+               set_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &data->flags);
+               err =  gp2ap020a00f_write_event_threshold(data,
+                                       GP2AP020A00F_THRESH_TH, true);
+               break;
+       case GP2AP020A00F_CMD_ALS_HIGH_EV_DIS:
+               if (!test_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &data->flags))
+                       return 0;
+               clear_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &data->flags);
+               if (!gp2ap020a00f_als_enabled(data)) {
+                       err = gp2ap020a00f_alter_opmode(data,
+                                               GP2AP020A00F_OPMODE_ALS,
+                                               GP2AP020A00F_SUBTRACT_MODE);
+                       if (err < 0)
+                               return err;
+               }
+               err =  gp2ap020a00f_write_event_threshold(data,
+                                       GP2AP020A00F_THRESH_TH, false);
+               break;
+       case GP2AP020A00F_CMD_ALS_LOW_EV_EN:
+               if (test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &data->flags))
+                       return 0;
+               if (data->cur_opmode == GP2AP020A00F_OPMODE_PROX_DETECT)
+                       return -EBUSY;
+               if (!gp2ap020a00f_als_enabled(data)) {
+                       err = gp2ap020a00f_alter_opmode(data,
+                                               GP2AP020A00F_OPMODE_ALS,
+                                               GP2AP020A00F_ADD_MODE);
+                       if (err < 0)
+                               return err;
+               }
+               set_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &data->flags);
+               err =  gp2ap020a00f_write_event_threshold(data,
+                                       GP2AP020A00F_THRESH_TL, true);
+               break;
+       case GP2AP020A00F_CMD_ALS_LOW_EV_DIS:
+               if (!test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &data->flags))
+                       return 0;
+               clear_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &data->flags);
+               if (!gp2ap020a00f_als_enabled(data)) {
+                       err = gp2ap020a00f_alter_opmode(data,
+                                               GP2AP020A00F_OPMODE_ALS,
+                                               GP2AP020A00F_SUBTRACT_MODE);
+                       if (err < 0)
+                               return err;
+               }
+               err =  gp2ap020a00f_write_event_threshold(data,
+                                       GP2AP020A00F_THRESH_TL, false);
+               break;
+       case GP2AP020A00F_CMD_PROX_HIGH_EV_EN:
+               if (test_bit(GP2AP020A00F_FLAG_PROX_RISING_EV, &data->flags))
+                       return 0;
+               if (gp2ap020a00f_als_enabled(data) ||
+                   data->cur_opmode == GP2AP020A00F_OPMODE_PS)
+                       return -EBUSY;
+               if (!gp2ap020a00f_prox_detect_enabled(data)) {
+                       err = gp2ap020a00f_set_operation_mode(data,
+                                       GP2AP020A00F_OPMODE_PROX_DETECT);
+                       if (err < 0)
+                               return err;
+               }
+               set_bit(GP2AP020A00F_FLAG_PROX_RISING_EV, &data->flags);
+               err =  gp2ap020a00f_write_event_threshold(data,
+                                       GP2AP020A00F_THRESH_PH, true);
+               break;
+       case GP2AP020A00F_CMD_PROX_HIGH_EV_DIS:
+               if (!test_bit(GP2AP020A00F_FLAG_PROX_RISING_EV, &data->flags))
+                       return 0;
+               clear_bit(GP2AP020A00F_FLAG_PROX_RISING_EV, &data->flags);
+               err = gp2ap020a00f_set_operation_mode(data,
+                                       GP2AP020A00F_OPMODE_SHUTDOWN);
+               if (err < 0)
+                       return err;
+               err =  gp2ap020a00f_write_event_threshold(data,
+                                       GP2AP020A00F_THRESH_PH, false);
+               break;
+       case GP2AP020A00F_CMD_PROX_LOW_EV_EN:
+               if (test_bit(GP2AP020A00F_FLAG_PROX_FALLING_EV, &data->flags))
+                       return 0;
+               if (gp2ap020a00f_als_enabled(data) ||
+                   data->cur_opmode == GP2AP020A00F_OPMODE_PS)
+                       return -EBUSY;
+               if (!gp2ap020a00f_prox_detect_enabled(data)) {
+                       err = gp2ap020a00f_set_operation_mode(data,
+                                       GP2AP020A00F_OPMODE_PROX_DETECT);
+                       if (err < 0)
+                               return err;
+               }
+               set_bit(GP2AP020A00F_FLAG_PROX_FALLING_EV, &data->flags);
+               err =  gp2ap020a00f_write_event_threshold(data,
+                                       GP2AP020A00F_THRESH_PL, true);
+               break;
+       case GP2AP020A00F_CMD_PROX_LOW_EV_DIS:
+               if (!test_bit(GP2AP020A00F_FLAG_PROX_FALLING_EV, &data->flags))
+                       return 0;
+               clear_bit(GP2AP020A00F_FLAG_PROX_FALLING_EV, &data->flags);
+               err = gp2ap020a00f_set_operation_mode(data,
+                                       GP2AP020A00F_OPMODE_SHUTDOWN);
+               if (err < 0)
+                       return err;
+               err =  gp2ap020a00f_write_event_threshold(data,
+                                       GP2AP020A00F_THRESH_PL, false);
+               break;
+       }
+
+       return err;
+}
+
+static int wait_conversion_complete_irq(struct gp2ap020a00f_data *data)
+{
+       int ret;
+
+       ret = wait_event_timeout(data->data_ready_queue,
+                                test_bit(GP2AP020A00F_FLAG_DATA_READY,
+                                         &data->flags),
+                                GP2AP020A00F_DATA_READY_TIMEOUT);
+       clear_bit(GP2AP020A00F_FLAG_DATA_READY, &data->flags);
+
+       return ret > 0 ? 0 : -ETIME;
+}
+
+static int gp2ap020a00f_read_output(struct gp2ap020a00f_data *data,
+                                       unsigned int output_reg, int *val)
+{
+       u8 reg_buf[2];
+       int err;
+
+       err = wait_conversion_complete_irq(data);
+       if (err < 0)
+               dev_dbg(&data->client->dev, "data ready timeout\n");
+
+       err = regmap_bulk_read(data->regmap, output_reg, reg_buf, 2);
+       if (err < 0)
+               return err;
+
+       *val = le16_to_cpup((__le16 *)reg_buf);
+
+       return err;
+}
+
+static bool gp2ap020a00f_adjust_lux_mode(struct gp2ap020a00f_data *data,
+                                int output_val)
+{
+       u8 new_range = 0xff;
+       int err;
+
+       if (!test_bit(GP2AP020A00F_FLAG_LUX_MODE_HI, &data->flags)) {
+               if (output_val > 16000) {
+                       set_bit(GP2AP020A00F_FLAG_LUX_MODE_HI, &data->flags);
+                       new_range = GP2AP020A00F_RANGE_A_x128;
+               }
+       } else {
+               if (output_val < 1000) {
+                       clear_bit(GP2AP020A00F_FLAG_LUX_MODE_HI, &data->flags);
+                       new_range = GP2AP020A00F_RANGE_A_x8;
+               }
+       }
+
+       if (new_range != 0xff) {
+               /* Clear als threshold registers to avoid spurious
+                * events caused by lux mode transition.
+                */
+               err =  gp2ap020a00f_write_event_threshold(data,
+                                       GP2AP020A00F_THRESH_TH, false);
+               if (err < 0) {
+                       dev_err(&data->client->dev,
+                               "Clearing als threshold register failed.\n");
+                       return false;
+               }
+
+               err =  gp2ap020a00f_write_event_threshold(data,
+                                       GP2AP020A00F_THRESH_TL, false);
+               if (err < 0) {
+                       dev_err(&data->client->dev,
+                               "Clearing als threshold register failed.\n");
+                       return false;
+               }
+
+               /* Change lux mode */
+               err = regmap_update_bits(data->regmap,
+                       GP2AP020A00F_OP_REG,
+                       GP2AP020A00F_OP3_MASK,
+                       GP2AP020A00F_OP3_SHUTDOWN);
+
+               if (err < 0) {
+                       dev_err(&data->client->dev,
+                               "Shutting down the device failed.\n");
+                       return false;
+               }
+
+               err = regmap_update_bits(data->regmap,
+                       GP2AP020A00F_ALS_REG,
+                       GP2AP020A00F_RANGE_A_MASK,
+                       new_range);
+
+               if (err < 0) {
+                       dev_err(&data->client->dev,
+                               "Adjusting device lux mode failed.\n");
+                       return false;
+               }
+
+               err = regmap_update_bits(data->regmap,
+                       GP2AP020A00F_OP_REG,
+                       GP2AP020A00F_OP3_MASK,
+                       GP2AP020A00F_OP3_OPERATION);
+
+               if (err < 0) {
+                       dev_err(&data->client->dev,
+                               "Powering up the device failed.\n");
+                       return false;
+               }
+
+               /* Adjust als threshold register values to the new lux mode */
+               if (test_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &data->flags)) {
+                       err =  gp2ap020a00f_write_event_threshold(data,
+                                       GP2AP020A00F_THRESH_TH, true);
+                       if (err < 0) {
+                               dev_err(&data->client->dev,
+                               "Adjusting als threshold value failed.\n");
+                               return false;
+                       }
+               }
+
+               if (test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &data->flags)) {
+                       err =  gp2ap020a00f_write_event_threshold(data,
+                                       GP2AP020A00F_THRESH_TL, true);
+                       if (err < 0) {
+                               dev_err(&data->client->dev,
+                               "Adjusting als threshold value failed.\n");
+                               return false;
+                       }
+               }
+
+               return true;
+       }
+
+       return false;
+}
+
+static void gp2ap020a00f_output_to_lux(struct gp2ap020a00f_data *data,
+                                               int *output_val)
+{
+       if (test_bit(GP2AP020A00F_FLAG_LUX_MODE_HI, &data->flags))
+               *output_val *= 16;
+}
+
+static void gp2ap020a00f_iio_trigger_work(struct irq_work *work)
+{
+       struct gp2ap020a00f_data *data =
+               container_of(work, struct gp2ap020a00f_data, work);
+
+       iio_trigger_poll(data->trig, 0);
+}
+
+static irqreturn_t gp2ap020a00f_prox_sensing_handler(int irq, void *data)
+{
+       struct iio_dev *indio_dev = data;
+       struct gp2ap020a00f_data *priv = iio_priv(indio_dev);
+       unsigned int op_reg_val;
+       int ret;
+
+       /* Read interrupt flags */
+       ret = regmap_read(priv->regmap, GP2AP020A00F_OP_REG, &op_reg_val);
+       if (ret < 0)
+               return IRQ_HANDLED;
+
+       if (gp2ap020a00f_prox_detect_enabled(priv)) {
+               if (op_reg_val & GP2AP020A00F_PROX_DETECT) {
+                       iio_push_event(indio_dev,
+                              IIO_UNMOD_EVENT_CODE(
+                                   IIO_PROXIMITY,
+                                   GP2AP020A00F_SCAN_MODE_PROXIMITY,
+                                   IIO_EV_TYPE_ROC,
+                                   IIO_EV_DIR_RISING),
+                              iio_get_time_ns());
+               } else {
+                       iio_push_event(indio_dev,
+                              IIO_UNMOD_EVENT_CODE(
+                                   IIO_PROXIMITY,
+                                   GP2AP020A00F_SCAN_MODE_PROXIMITY,
+                                   IIO_EV_TYPE_ROC,
+                                   IIO_EV_DIR_FALLING),
+                              iio_get_time_ns());
+               }
+       }
+
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t gp2ap020a00f_thresh_event_handler(int irq, void *data)
+{
+       struct iio_dev *indio_dev = data;
+       struct gp2ap020a00f_data *priv = iio_priv(indio_dev);
+       u8 op_reg_flags, d0_reg_buf[2];
+       unsigned int output_val, op_reg_val;
+       int thresh_val_id, ret;
+
+       /* Read interrupt flags */
+       ret = regmap_read(priv->regmap, GP2AP020A00F_OP_REG,
+                                                       &op_reg_val);
+       if (ret < 0)
+               goto done;
+
+       op_reg_flags = op_reg_val & (GP2AP020A00F_FLAG_A | GP2AP020A00F_FLAG_P
+                                       | GP2AP020A00F_PROX_DETECT);
+
+       op_reg_val &= (~GP2AP020A00F_FLAG_A & ~GP2AP020A00F_FLAG_P
+                                       & ~GP2AP020A00F_PROX_DETECT);
+
+       /* Clear interrupt flags (if not in INTTYPE_PULSE mode) */
+       if (priv->cur_opmode != GP2AP020A00F_OPMODE_PROX_DETECT) {
+               ret = regmap_write(priv->regmap, GP2AP020A00F_OP_REG,
+                                                               op_reg_val);
+               if (ret < 0)
+                       goto done;
+       }
+
+       if (op_reg_flags & GP2AP020A00F_FLAG_A) {
+               /* Check D0 register to assess if the lux mode
+                * transition is required.
+                */
+               ret = regmap_bulk_read(priv->regmap, GP2AP020A00F_D0_L_REG,
+                                                       d0_reg_buf, 2);
+               if (ret < 0)
+                       goto done;
+
+               output_val = le16_to_cpup((__le16 *)d0_reg_buf);
+
+               if (gp2ap020a00f_adjust_lux_mode(priv, output_val))
+                       goto done;
+
+               gp2ap020a00f_output_to_lux(priv, &output_val);
+
+               /*
+                * We need to check output value to distinguish
+                * between high and low ambient light threshold event.
+                */
+               if (test_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &priv->flags)) {
+                       thresh_val_id =
+                           GP2AP020A00F_THRESH_VAL_ID(GP2AP020A00F_TH_L_REG);
+                       if (output_val > priv->thresh_val[thresh_val_id])
+                               iio_push_event(indio_dev,
+                                      IIO_MOD_EVENT_CODE(
+                                           IIO_LIGHT,
+                                           GP2AP020A00F_SCAN_MODE_LIGHT_CLEAR,
+                                           IIO_MOD_LIGHT_CLEAR,
+                                           IIO_EV_TYPE_THRESH,
+                                           IIO_EV_DIR_RISING),
+                                      iio_get_time_ns());
+               }
+
+               if (test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &priv->flags)) {
+                       thresh_val_id =
+                           GP2AP020A00F_THRESH_VAL_ID(GP2AP020A00F_TL_L_REG);
+                       if (output_val < priv->thresh_val[thresh_val_id])
+                               iio_push_event(indio_dev,
+                                      IIO_MOD_EVENT_CODE(
+                                           IIO_LIGHT,
+                                           GP2AP020A00F_SCAN_MODE_LIGHT_CLEAR,
+                                           IIO_MOD_LIGHT_CLEAR,
+                                           IIO_EV_TYPE_THRESH,
+                                           IIO_EV_DIR_FALLING),
+                                      iio_get_time_ns());
+               }
+       }
+
+       if (priv->cur_opmode == GP2AP020A00F_OPMODE_READ_RAW_CLEAR ||
+           priv->cur_opmode == GP2AP020A00F_OPMODE_READ_RAW_IR ||
+           priv->cur_opmode == GP2AP020A00F_OPMODE_READ_RAW_PROXIMITY) {
+               set_bit(GP2AP020A00F_FLAG_DATA_READY, &priv->flags);
+               wake_up(&priv->data_ready_queue);
+               goto done;
+       }
+
+       if (test_bit(GP2AP020A00F_FLAG_ALS_CLEAR_TRIGGER, &priv->flags) ||
+           test_bit(GP2AP020A00F_FLAG_ALS_IR_TRIGGER, &priv->flags) ||
+           test_bit(GP2AP020A00F_FLAG_PROX_TRIGGER, &priv->flags))
+               /* This fires off the trigger. */
+               irq_work_queue(&priv->work);
+
+done:
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t gp2ap020a00f_trigger_handler(int irq, void *data)
+{
+       struct iio_poll_func *pf = data;
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct gp2ap020a00f_data *priv = iio_priv(indio_dev);
+       size_t d_size = 0;
+       __le32 light_lux;
+       int i, out_val, ret;
+
+       for_each_set_bit(i, indio_dev->active_scan_mask,
+               indio_dev->masklength) {
+               ret = regmap_bulk_read(priv->regmap,
+                               GP2AP020A00F_DATA_REG(i),
+                               &priv->buffer[d_size], 2);
+               if (ret < 0)
+                       goto done;
+
+               if (i == GP2AP020A00F_SCAN_MODE_LIGHT_CLEAR ||
+                   i == GP2AP020A00F_SCAN_MODE_LIGHT_IR) {
+                       out_val = le16_to_cpup((__le16 *)&priv->buffer[d_size]);
+                       gp2ap020a00f_output_to_lux(priv, &out_val);
+                       light_lux = cpu_to_le32(out_val);
+                       memcpy(&priv->buffer[d_size], (u8 *)&light_lux, 4);
+                       d_size += 4;
+               } else {
+                       d_size += 2;
+               }
+       }
+
+       iio_push_to_buffers_with_timestamp(indio_dev, priv->buffer,
+               pf->timestamp);
+done:
+       iio_trigger_notify_done(indio_dev->trig);
+
+       return IRQ_HANDLED;
+}
+
+static u8 gp2ap020a00f_get_reg_by_event_code(u64 event_code)
+{
+       int event_dir = IIO_EVENT_CODE_EXTRACT_DIR(event_code);
+
+       switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) {
+       case IIO_PROXIMITY:
+               if (event_dir == IIO_EV_DIR_RISING)
+                       return GP2AP020A00F_PH_L_REG;
+               else
+                       return GP2AP020A00F_PL_L_REG;
+       case IIO_LIGHT:
+               if (event_dir == IIO_EV_DIR_RISING)
+                       return GP2AP020A00F_TH_L_REG;
+               else
+                       return GP2AP020A00F_TL_L_REG;
+       }
+
+       return -EINVAL;
+}
+
+static int gp2ap020a00f_write_event_val(struct iio_dev *indio_dev,
+                                       u64 event_code, int val)
+{
+       struct gp2ap020a00f_data *data = iio_priv(indio_dev);
+       bool event_en = false;
+       u8 thresh_val_id;
+       u8 thresh_reg_l;
+       int err = 0;
+
+       mutex_lock(&data->lock);
+
+       thresh_reg_l = gp2ap020a00f_get_reg_by_event_code(event_code);
+       thresh_val_id = GP2AP020A00F_THRESH_VAL_ID(thresh_reg_l);
+
+       if (thresh_val_id > GP2AP020A00F_THRESH_PH) {
+               err = -EINVAL;
+               goto error_unlock;
+       }
+
+       switch (thresh_reg_l) {
+       case GP2AP020A00F_TH_L_REG:
+               event_en = test_bit(GP2AP020A00F_FLAG_ALS_RISING_EV,
+                                                       &data->flags);
+               break;
+       case GP2AP020A00F_TL_L_REG:
+               event_en = test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV,
+                                                       &data->flags);
+               break;
+       case GP2AP020A00F_PH_L_REG:
+               if (val == 0) {
+                       err = -EINVAL;
+                       goto error_unlock;
+               }
+               event_en = test_bit(GP2AP020A00F_FLAG_PROX_RISING_EV,
+                                                       &data->flags);
+               break;
+       case GP2AP020A00F_PL_L_REG:
+               if (val == 0) {
+                       err = -EINVAL;
+                       goto error_unlock;
+               }
+               event_en = test_bit(GP2AP020A00F_FLAG_PROX_FALLING_EV,
+                                                       &data->flags);
+               break;
+       }
+
+       data->thresh_val[thresh_val_id] = val;
+       err =  gp2ap020a00f_write_event_threshold(data, thresh_val_id,
+                                                       event_en);
+error_unlock:
+       mutex_unlock(&data->lock);
+
+       return err;
+}
+
+static int gp2ap020a00f_read_event_val(struct iio_dev *indio_dev,
+                                       u64 event_code, int *val)
+{
+       struct gp2ap020a00f_data *data = iio_priv(indio_dev);
+       u8 thresh_reg_l;
+       int err = 0;
+
+       mutex_lock(&data->lock);
+
+       thresh_reg_l = gp2ap020a00f_get_reg_by_event_code(event_code);
+
+       if (thresh_reg_l > GP2AP020A00F_PH_L_REG) {
+               err = -EINVAL;
+               goto error_unlock;
+       }
+
+       *val = data->thresh_val[GP2AP020A00F_THRESH_VAL_ID(thresh_reg_l)];
+
+error_unlock:
+       mutex_unlock(&data->lock);
+
+       return err;
+}
+
+static int gp2ap020a00f_write_prox_event_config(struct iio_dev *indio_dev,
+                                       u64 event_code, int state)
+{
+       struct gp2ap020a00f_data *data = iio_priv(indio_dev);
+       enum gp2ap020a00f_cmd cmd_high_ev, cmd_low_ev;
+       int err;
+
+       cmd_high_ev = state ? GP2AP020A00F_CMD_PROX_HIGH_EV_EN :
+                             GP2AP020A00F_CMD_PROX_HIGH_EV_DIS;
+       cmd_low_ev = state ? GP2AP020A00F_CMD_PROX_LOW_EV_EN :
+                            GP2AP020A00F_CMD_PROX_LOW_EV_DIS;
+
+       /*
+        * In order to enable proximity detection feature in the device
+        * both high and low threshold registers have to be written
+        * with different values, greater than zero.
+        */
+       if (state) {
+               if (data->thresh_val[GP2AP020A00F_THRESH_PL] == 0)
+                       return -EINVAL;
+
+               if (data->thresh_val[GP2AP020A00F_THRESH_PH] == 0)
+                       return -EINVAL;
+       }
+
+       err = gp2ap020a00f_exec_cmd(data, cmd_high_ev);
+       if (err < 0)
+               return err;
+
+       err = gp2ap020a00f_exec_cmd(data, cmd_low_ev);
+       if (err < 0)
+               return err;
+
+       free_irq(data->client->irq, indio_dev);
+
+       if (state)
+               err = request_threaded_irq(data->client->irq, NULL,
+                                          &gp2ap020a00f_prox_sensing_handler,
+                                          IRQF_TRIGGER_RISING |
+                                          IRQF_TRIGGER_FALLING |
+                                          IRQF_ONESHOT,
+                                          "gp2ap020a00f_prox_sensing",
+                                          indio_dev);
+       else {
+               err = request_threaded_irq(data->client->irq, NULL,
+                                          &gp2ap020a00f_thresh_event_handler,
+                                          IRQF_TRIGGER_FALLING |
+                                          IRQF_ONESHOT,
+                                          "gp2ap020a00f_thresh_event",
+                                          indio_dev);
+       }
+
+       return err;
+}
+
+static int gp2ap020a00f_write_event_config(struct iio_dev *indio_dev,
+                                       u64 event_code, int state)
+{
+       struct gp2ap020a00f_data *data = iio_priv(indio_dev);
+       enum gp2ap020a00f_cmd cmd;
+       int err;
+
+       mutex_lock(&data->lock);
+
+       switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) {
+       case IIO_PROXIMITY:
+               err = gp2ap020a00f_write_prox_event_config(indio_dev,
+                                       event_code, state);
+               break;
+       case IIO_LIGHT:
+               if (IIO_EVENT_CODE_EXTRACT_DIR(event_code)
+                                       == IIO_EV_DIR_RISING) {
+                       cmd = state ? GP2AP020A00F_CMD_ALS_HIGH_EV_EN :
+                                     GP2AP020A00F_CMD_ALS_HIGH_EV_DIS;
+                       err = gp2ap020a00f_exec_cmd(data, cmd);
+               } else {
+                       cmd = state ? GP2AP020A00F_CMD_ALS_LOW_EV_EN :
+                                     GP2AP020A00F_CMD_ALS_LOW_EV_DIS;
+                       err = gp2ap020a00f_exec_cmd(data, cmd);
+               }
+               break;
+       default:
+               err = -EINVAL;
+       }
+
+       mutex_unlock(&data->lock);
+
+       return err;
+}
+
+static int gp2ap020a00f_read_event_config(struct iio_dev *indio_dev,
+                                       u64 event_code)
+{
+       struct gp2ap020a00f_data *data = iio_priv(indio_dev);
+       int event_en = 0;
+
+       mutex_lock(&data->lock);
+
+       switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) {
+       case IIO_PROXIMITY:
+               if (IIO_EVENT_CODE_EXTRACT_DIR(event_code)
+                                       == IIO_EV_DIR_RISING)
+                       event_en = test_bit(GP2AP020A00F_FLAG_PROX_RISING_EV,
+                                                               &data->flags);
+               else
+                       event_en = test_bit(GP2AP020A00F_FLAG_PROX_FALLING_EV,
+                                                               &data->flags);
+               break;
+       case IIO_LIGHT:
+               if (IIO_EVENT_CODE_EXTRACT_DIR(event_code)
+                                       == IIO_EV_DIR_RISING)
+                       event_en = test_bit(GP2AP020A00F_FLAG_ALS_RISING_EV,
+                                                               &data->flags);
+               else
+                       event_en = test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV,
+                                                               &data->flags);
+               break;
+       }
+
+       mutex_unlock(&data->lock);
+
+       return event_en;
+}
+
+static int gp2ap020a00f_read_channel(struct gp2ap020a00f_data *data,
+                               struct iio_chan_spec const *chan, int *val)
+{
+       enum gp2ap020a00f_cmd cmd;
+       int err;
+
+       switch (chan->scan_index) {
+       case GP2AP020A00F_SCAN_MODE_LIGHT_CLEAR:
+               cmd = GP2AP020A00F_CMD_READ_RAW_CLEAR;
+               break;
+       case GP2AP020A00F_SCAN_MODE_LIGHT_IR:
+               cmd = GP2AP020A00F_CMD_READ_RAW_IR;
+               break;
+       case GP2AP020A00F_SCAN_MODE_PROXIMITY:
+               cmd = GP2AP020A00F_CMD_READ_RAW_PROXIMITY;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       err = gp2ap020a00f_exec_cmd(data, cmd);
+       if (err < 0) {
+               dev_err(&data->client->dev,
+                       "gp2ap020a00f_exec_cmd failed\n");
+               goto error_ret;
+       }
+
+       err = gp2ap020a00f_read_output(data, chan->address, val);
+       if (err < 0)
+               dev_err(&data->client->dev,
+                       "gp2ap020a00f_read_output failed\n");
+
+       err = gp2ap020a00f_set_operation_mode(data,
+                                       GP2AP020A00F_OPMODE_SHUTDOWN);
+       if (err < 0)
+               dev_err(&data->client->dev,
+                       "Failed to shut down the device.\n");
+
+       if (cmd == GP2AP020A00F_CMD_READ_RAW_CLEAR ||
+           cmd == GP2AP020A00F_CMD_READ_RAW_IR)
+               gp2ap020a00f_output_to_lux(data, val);
+
+error_ret:
+       return err;
+}
+
+static int gp2ap020a00f_read_raw(struct iio_dev *indio_dev,
+                          struct iio_chan_spec const *chan,
+                          int *val, int *val2,
+                          long mask)
+{
+       struct gp2ap020a00f_data *data = iio_priv(indio_dev);
+       int err = -EINVAL;
+
+       mutex_lock(&data->lock);
+
+       switch (mask) {
+       case IIO_CHAN_INFO_RAW:
+               if (iio_buffer_enabled(indio_dev)) {
+                       err = -EBUSY;
+                       goto error_unlock;
+               }
+
+               err = gp2ap020a00f_read_channel(data, chan, val);
+               break;
+       }
+
+error_unlock:
+       mutex_unlock(&data->lock);
+
+       return err < 0 ? err : IIO_VAL_INT;
+}
+
+static const struct iio_chan_spec gp2ap020a00f_channels[] = {
+       {
+               .type = IIO_LIGHT,
+               .channel2 = IIO_MOD_LIGHT_CLEAR,
+               .modified = 1,
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+               .scan_type = {
+                       .sign = 'u',
+                       .realbits = 24,
+                       .shift = 0,
+                       .storagebits = 32,
+                       .endianness = IIO_LE,
+               },
+               .scan_index = GP2AP020A00F_SCAN_MODE_LIGHT_CLEAR,
+               .address = GP2AP020A00F_D0_L_REG,
+               .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_LIGHT,
+               .channel2 = IIO_MOD_LIGHT_IR,
+               .modified = 1,
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+               .scan_type = {
+                       .sign = 'u',
+                       .realbits = 24,
+                       .shift = 0,
+                       .storagebits = 32,
+                       .endianness = IIO_LE,
+               },
+               .scan_index = GP2AP020A00F_SCAN_MODE_LIGHT_IR,
+               .address = GP2AP020A00F_D1_L_REG,
+       },
+       {
+               .type = IIO_PROXIMITY,
+               .modified = 0,
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+               .scan_type = {
+                       .sign = 'u',
+                       .realbits = 16,
+                       .shift = 0,
+                       .storagebits = 16,
+                       .endianness = IIO_LE,
+               },
+               .scan_index = GP2AP020A00F_SCAN_MODE_PROXIMITY,
+               .address = GP2AP020A00F_D2_L_REG,
+               .event_mask = IIO_EV_BIT(IIO_EV_TYPE_ROC,
+                                        IIO_EV_DIR_RISING) |
+                             IIO_EV_BIT(IIO_EV_TYPE_ROC,
+                                        IIO_EV_DIR_FALLING),
+       },
+       IIO_CHAN_SOFT_TIMESTAMP(GP2AP020A00F_CHAN_TIMESTAMP),
+};
+
+static const struct iio_info gp2ap020a00f_info = {
+       .read_raw = &gp2ap020a00f_read_raw,
+       .read_event_value = &gp2ap020a00f_read_event_val,
+       .read_event_config = &gp2ap020a00f_read_event_config,
+       .write_event_value = &gp2ap020a00f_write_event_val,
+       .write_event_config = &gp2ap020a00f_write_event_config,
+       .driver_module = THIS_MODULE,
+};
+
+static int gp2ap020a00f_buffer_postenable(struct iio_dev *indio_dev)
+{
+       struct gp2ap020a00f_data *data = iio_priv(indio_dev);
+       int i, err = 0;
+
+       mutex_lock(&data->lock);
+
+       /*
+        * Enable triggers according to the scan_mask. Enabling either
+        * LIGHT_CLEAR or LIGHT_IR scan mode results in enabling ALS
+        * module in the device, which generates samples in both D0 (clear)
+        * and D1 (ir) registers. As the two registers are bound to the
+        * two separate IIO channels they are treated in the driver logic
+        * as if they were controlled independently.
+        */
+       for_each_set_bit(i, indio_dev->active_scan_mask,
+               indio_dev->masklength) {
+               switch (i) {
+               case GP2AP020A00F_SCAN_MODE_LIGHT_CLEAR:
+                       err = gp2ap020a00f_exec_cmd(data,
+                                       GP2AP020A00F_CMD_TRIGGER_CLEAR_EN);
+                       break;
+               case GP2AP020A00F_SCAN_MODE_LIGHT_IR:
+                       err = gp2ap020a00f_exec_cmd(data,
+                                       GP2AP020A00F_CMD_TRIGGER_IR_EN);
+                       break;
+               case GP2AP020A00F_SCAN_MODE_PROXIMITY:
+                       err = gp2ap020a00f_exec_cmd(data,
+                                       GP2AP020A00F_CMD_TRIGGER_PROX_EN);
+                       break;
+               }
+       }
+
+       if (err < 0)
+               goto error_unlock;
+
+       data->buffer = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
+       if (!data->buffer) {
+               err = -ENOMEM;
+               goto error_unlock;
+       }
+
+       err = iio_triggered_buffer_postenable(indio_dev);
+
+error_unlock:
+       mutex_unlock(&data->lock);
+
+       return err;
+}
+
+static int gp2ap020a00f_buffer_predisable(struct iio_dev *indio_dev)
+{
+       struct gp2ap020a00f_data *data = iio_priv(indio_dev);
+       int i, err;
+
+       mutex_lock(&data->lock);
+
+       err = iio_triggered_buffer_predisable(indio_dev);
+       if (err < 0)
+               goto error_unlock;
+
+       for_each_set_bit(i, indio_dev->active_scan_mask,
+               indio_dev->masklength) {
+               switch (i) {
+               case GP2AP020A00F_SCAN_MODE_LIGHT_CLEAR:
+                       err = gp2ap020a00f_exec_cmd(data,
+                                       GP2AP020A00F_CMD_TRIGGER_CLEAR_DIS);
+                       break;
+               case GP2AP020A00F_SCAN_MODE_LIGHT_IR:
+                       err = gp2ap020a00f_exec_cmd(data,
+                                       GP2AP020A00F_CMD_TRIGGER_IR_DIS);
+                       break;
+               case GP2AP020A00F_SCAN_MODE_PROXIMITY:
+                       err = gp2ap020a00f_exec_cmd(data,
+                                       GP2AP020A00F_CMD_TRIGGER_PROX_DIS);
+                       break;
+               }
+       }
+
+       if (err == 0)
+               kfree(data->buffer);
+
+error_unlock:
+       mutex_unlock(&data->lock);
+
+       return err;
+}
+
+static const struct iio_buffer_setup_ops gp2ap020a00f_buffer_setup_ops = {
+       .preenable = &iio_sw_buffer_preenable,
+       .postenable = &gp2ap020a00f_buffer_postenable,
+       .predisable = &gp2ap020a00f_buffer_predisable,
+};
+
+static const struct iio_trigger_ops gp2ap020a00f_trigger_ops = {
+       .owner = THIS_MODULE,
+};
+
+static int gp2ap020a00f_probe(struct i2c_client *client,
+                               const struct i2c_device_id *id)
+{
+       struct gp2ap020a00f_data *data;
+       struct iio_dev *indio_dev;
+       struct regmap *regmap;
+       int err;
+
+       indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
+       if (!indio_dev)
+               return -ENOMEM;
+
+       data = iio_priv(indio_dev);
+
+       data->vled_reg = devm_regulator_get(&client->dev, "vled");
+       if (IS_ERR(data->vled_reg))
+               return PTR_ERR(data->vled_reg);
+
+       err = regulator_enable(data->vled_reg);
+       if (err)
+               return err;
+
+       regmap = devm_regmap_init_i2c(client, &gp2ap020a00f_regmap_config);
+       if (IS_ERR(regmap)) {
+               dev_err(&client->dev, "Regmap initialization failed.\n");
+               err = PTR_ERR(regmap);
+               goto error_regulator_disable;
+       }
+
+       /* Initialize device registers */
+       err = regmap_bulk_write(regmap, GP2AP020A00F_OP_REG,
+                       gp2ap020a00f_reg_init_tab,
+                       ARRAY_SIZE(gp2ap020a00f_reg_init_tab));
+
+       if (err < 0) {
+               dev_err(&client->dev, "Device initialization failed.\n");
+               goto error_regulator_disable;
+       }
+
+       i2c_set_clientdata(client, indio_dev);
+
+       data->client = client;
+       data->cur_opmode = GP2AP020A00F_OPMODE_SHUTDOWN;
+       data->regmap = regmap;
+       init_waitqueue_head(&data->data_ready_queue);
+
+       mutex_init(&data->lock);
+       indio_dev->dev.parent = &client->dev;
+       indio_dev->channels = gp2ap020a00f_channels;
+       indio_dev->num_channels = ARRAY_SIZE(gp2ap020a00f_channels);
+       indio_dev->info = &gp2ap020a00f_info;
+       indio_dev->name = id->name;
+       indio_dev->modes = INDIO_DIRECT_MODE;
+
+       /* Allocate buffer */
+       err = iio_triggered_buffer_setup(indio_dev, &iio_pollfunc_store_time,
+               &gp2ap020a00f_trigger_handler, &gp2ap020a00f_buffer_setup_ops);
+       if (err < 0)
+               goto error_regulator_disable;
+
+       /* Allocate trigger */
+       data->trig = devm_iio_trigger_alloc(&client->dev, "%s-trigger",
+                                                       indio_dev->name);
+       if (data->trig == NULL) {
+               err = -ENOMEM;
+               dev_err(&indio_dev->dev, "Failed to allocate iio trigger.\n");
+               goto error_uninit_buffer;
+       }
+
+       /* This needs to be requested here for read_raw calls to work. */
+       err = request_threaded_irq(client->irq, NULL,
+                                  &gp2ap020a00f_thresh_event_handler,
+                                  IRQF_TRIGGER_FALLING |
+                                  IRQF_ONESHOT,
+                                  "gp2ap020a00f_als_event",
+                                  indio_dev);
+       if (err < 0) {
+               dev_err(&client->dev, "Irq request failed.\n");
+               goto error_uninit_buffer;
+       }
+
+       data->trig->ops = &gp2ap020a00f_trigger_ops;
+       data->trig->dev.parent = &data->client->dev;
+
+       init_irq_work(&data->work, gp2ap020a00f_iio_trigger_work);
+
+       err = iio_trigger_register(data->trig);
+       if (err < 0) {
+               dev_err(&client->dev, "Failed to register iio trigger.\n");
+               goto error_free_irq;
+       }
+
+       err = iio_device_register(indio_dev);
+       if (err < 0)
+               goto error_trigger_unregister;
+
+       return 0;
+
+error_trigger_unregister:
+       iio_trigger_unregister(data->trig);
+error_free_irq:
+       free_irq(client->irq, indio_dev);
+error_uninit_buffer:
+       iio_triggered_buffer_cleanup(indio_dev);
+error_regulator_disable:
+       regulator_disable(data->vled_reg);
+
+       return err;
+}
+
+static int gp2ap020a00f_remove(struct i2c_client *client)
+{
+       struct iio_dev *indio_dev = i2c_get_clientdata(client);
+       struct gp2ap020a00f_data *data = iio_priv(indio_dev);
+       int err;
+
+       err = gp2ap020a00f_set_operation_mode(data,
+                                       GP2AP020A00F_OPMODE_SHUTDOWN);
+       if (err < 0)
+               dev_err(&indio_dev->dev, "Failed to power off the device.\n");
+
+       iio_device_unregister(indio_dev);
+       iio_trigger_unregister(data->trig);
+       free_irq(client->irq, indio_dev);
+       iio_triggered_buffer_cleanup(indio_dev);
+       regulator_disable(data->vled_reg);
+
+       return 0;
+}
+
+static const struct i2c_device_id gp2ap020a00f_id[] = {
+       { GP2A_I2C_NAME, 0 },
+       { }
+};
+
+MODULE_DEVICE_TABLE(i2c, gp2ap020a00f_id);
+
+#ifdef CONFIG_OF
+static const struct of_device_id gp2ap020a00f_of_match[] = {
+       { .compatible = "sharp,gp2ap020a00f" },
+       { }
+};
+#endif
+
+static struct i2c_driver gp2ap020a00f_driver = {
+       .driver = {
+               .name   = GP2A_I2C_NAME,
+               .of_match_table = of_match_ptr(gp2ap020a00f_of_match),
+               .owner  = THIS_MODULE,
+       },
+       .probe          = gp2ap020a00f_probe,
+       .remove         = gp2ap020a00f_remove,
+       .id_table       = gp2ap020a00f_id,
+};
+
+module_i2c_driver(gp2ap020a00f_driver);
+
+MODULE_AUTHOR("Jacek Anaszewski <j.anaszewski@samsung.com>");
+MODULE_DESCRIPTION("Sharp GP2AP020A00F Proximity/ALS sensor driver");
+MODULE_LICENSE("GPL v2");
index e59d00c3139c00c15f44e4ab14c844341d9663e5..fa6ae8cf89eaa9edfdfffe379939bc7cc8a491f0 100644 (file)
@@ -161,10 +161,11 @@ static const struct iio_info als_info = {
 };
 
 /* Function to push data to buffer */
-static void hid_sensor_push_data(struct iio_dev *indio_dev, u8 *data, int len)
+static void hid_sensor_push_data(struct iio_dev *indio_dev, const void *data,
+                                       int len)
 {
        dev_dbg(&indio_dev->dev, "hid_sensor_push_data\n");
-       iio_push_to_buffers(indio_dev, (u8 *)data);
+       iio_push_to_buffers(indio_dev, data);
 }
 
 /* Callback handler to send event after all samples are received and captured */
@@ -179,7 +180,7 @@ static int als_proc_event(struct hid_sensor_hub_device *hsdev,
                                als_state->common_attributes.data_ready);
        if (als_state->common_attributes.data_ready)
                hid_sensor_push_data(indio_dev,
-                               (u8 *)&als_state->illum,
+                               &als_state->illum,
                                sizeof(als_state->illum));
 
        return 0;
diff --git a/drivers/iio/light/tcs3472.c b/drivers/iio/light/tcs3472.c
new file mode 100644 (file)
index 0000000..45df220
--- /dev/null
@@ -0,0 +1,367 @@
+/*
+ * tcs3472.c - Support for TAOS TCS3472 color light-to-digital converter
+ *
+ * Copyright (c) 2013 Peter Meerwald <pmeerw@pmeerw.net>
+ *
+ * This file is subject to the terms and conditions of version 2 of
+ * the GNU General Public License.  See the file COPYING in the main
+ * directory of this archive for more details.
+ *
+ * Color light sensor with 16-bit channels for red, green, blue, clear);
+ * 7-bit I2C slave address 0x39 (TCS34721, TCS34723) or 0x29 (TCS34725,
+ * TCS34727)
+ *
+ * TODO: interrupt support, thresholds, wait time
+ */
+
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/delay.h>
+#include <linux/pm.h>
+
+#include <linux/iio/iio.h>
+#include <linux/iio/sysfs.h>
+#include <linux/iio/trigger_consumer.h>
+#include <linux/iio/buffer.h>
+#include <linux/iio/triggered_buffer.h>
+
+#define TCS3472_DRV_NAME "tcs3472"
+
+#define TCS3472_COMMAND BIT(7)
+#define TCS3472_AUTO_INCR BIT(5)
+
+#define TCS3472_ENABLE (TCS3472_COMMAND | 0x00)
+#define TCS3472_ATIME (TCS3472_COMMAND | 0x01)
+#define TCS3472_WTIME (TCS3472_COMMAND | 0x03)
+#define TCS3472_AILT (TCS3472_COMMAND | 0x04)
+#define TCS3472_AIHT (TCS3472_COMMAND | 0x06)
+#define TCS3472_PERS (TCS3472_COMMAND | 0x0c)
+#define TCS3472_CONFIG (TCS3472_COMMAND | 0x0d)
+#define TCS3472_CONTROL (TCS3472_COMMAND | 0x0f)
+#define TCS3472_ID (TCS3472_COMMAND | 0x12)
+#define TCS3472_STATUS (TCS3472_COMMAND | 0x13)
+#define TCS3472_CDATA (TCS3472_COMMAND | TCS3472_AUTO_INCR | 0x14)
+#define TCS3472_RDATA (TCS3472_COMMAND | TCS3472_AUTO_INCR | 0x16)
+#define TCS3472_GDATA (TCS3472_COMMAND | TCS3472_AUTO_INCR | 0x18)
+#define TCS3472_BDATA (TCS3472_COMMAND | TCS3472_AUTO_INCR | 0x1a)
+
+#define TCS3472_STATUS_AVALID BIT(0)
+#define TCS3472_ENABLE_AEN BIT(1)
+#define TCS3472_ENABLE_PON BIT(0)
+#define TCS3472_CONTROL_AGAIN_MASK (BIT(0) | BIT(1))
+
+struct tcs3472_data {
+       struct i2c_client *client;
+       u8 enable;
+       u8 control;
+       u8 atime;
+       u16 buffer[8]; /* 4 16-bit channels + 64-bit timestamp */
+};
+
+#define TCS3472_CHANNEL(_color, _si, _addr) { \
+       .type = IIO_INTENSITY, \
+       .modified = 1, \
+       .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
+       .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBSCALE) | \
+               BIT(IIO_CHAN_INFO_INT_TIME), \
+       .channel2 = IIO_MOD_LIGHT_##_color, \
+       .address = _addr, \
+       .scan_index = _si, \
+       .scan_type = IIO_ST('u', 16, 16, 0), \
+}
+
+static const int tcs3472_agains[] = { 1, 4, 16, 60 };
+
+static const struct iio_chan_spec tcs3472_channels[] = {
+       TCS3472_CHANNEL(CLEAR, 0, TCS3472_CDATA),
+       TCS3472_CHANNEL(RED, 1, TCS3472_RDATA),
+       TCS3472_CHANNEL(GREEN, 2, TCS3472_GDATA),
+       TCS3472_CHANNEL(BLUE, 3, TCS3472_BDATA),
+       IIO_CHAN_SOFT_TIMESTAMP(4),
+};
+
+static int tcs3472_req_data(struct tcs3472_data *data)
+{
+       int tries = 50;
+       int ret;
+
+       while (tries--) {
+               ret = i2c_smbus_read_byte_data(data->client, TCS3472_STATUS);
+               if (ret < 0)
+                       return ret;
+               if (ret & TCS3472_STATUS_AVALID)
+                       break;
+               msleep(20);
+       }
+
+       if (tries < 0) {
+               dev_err(&data->client->dev, "data not ready\n");
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static int tcs3472_read_raw(struct iio_dev *indio_dev,
+                          struct iio_chan_spec const *chan,
+                          int *val, int *val2, long mask)
+{
+       struct tcs3472_data *data = iio_priv(indio_dev);
+       int ret;
+
+       switch (mask) {
+       case IIO_CHAN_INFO_RAW:
+               ret = tcs3472_req_data(data);
+               if (ret < 0)
+                       return ret;
+               ret = i2c_smbus_read_word_data(data->client, chan->address);
+               if (ret < 0)
+                       return ret;
+               *val = ret;
+               return IIO_VAL_INT;
+       case IIO_CHAN_INFO_CALIBSCALE:
+               *val = tcs3472_agains[data->control &
+                       TCS3472_CONTROL_AGAIN_MASK];
+               return IIO_VAL_INT;
+       case IIO_CHAN_INFO_INT_TIME:
+               *val = 0;
+               *val2 = (256 - data->atime) * 2400;
+               return IIO_VAL_INT_PLUS_MICRO;
+       }
+       return -EINVAL;
+}
+
+static int tcs3472_write_raw(struct iio_dev *indio_dev,
+                              struct iio_chan_spec const *chan,
+                              int val, int val2, long mask)
+{
+       struct tcs3472_data *data = iio_priv(indio_dev);
+       int i;
+
+       switch (mask) {
+       case IIO_CHAN_INFO_CALIBSCALE:
+               if (val2 != 0)
+                       return -EINVAL;
+               for (i = 0; i < ARRAY_SIZE(tcs3472_agains); i++) {
+                       if (val == tcs3472_agains[i]) {
+                               data->control &= ~TCS3472_CONTROL_AGAIN_MASK;
+                               data->control |= i;
+                               return i2c_smbus_write_byte_data(
+                                       data->client, TCS3472_CONTROL,
+                                       data->control);
+                       }
+               }
+               return -EINVAL;
+       case IIO_CHAN_INFO_INT_TIME:
+               if (val != 0)
+                       return -EINVAL;
+               for (i = 0; i < 256; i++) {
+                       if (val2 == (256 - i) * 2400) {
+                               data->atime = i;
+                               return i2c_smbus_write_word_data(
+                                       data->client, TCS3472_ATIME,
+                                       data->atime);
+                       }
+
+               }
+               return -EINVAL;
+       }
+       return -EINVAL;
+}
+
+static irqreturn_t tcs3472_trigger_handler(int irq, void *p)
+{
+       struct iio_poll_func *pf = p;
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct tcs3472_data *data = iio_priv(indio_dev);
+       int len = 0;
+       int i, j = 0;
+
+       int ret = tcs3472_req_data(data);
+       if (ret < 0)
+               goto done;
+
+       for_each_set_bit(i, indio_dev->active_scan_mask,
+               indio_dev->masklength) {
+               ret = i2c_smbus_read_word_data(data->client,
+                       TCS3472_CDATA + 2*i);
+               if (ret < 0)
+                       goto done;
+
+               data->buffer[j++] = ret;
+               len += 2;
+       }
+
+       iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+               iio_get_time_ns());
+
+done:
+       iio_trigger_notify_done(indio_dev->trig);
+
+       return IRQ_HANDLED;
+}
+
+static ssize_t tcs3472_show_int_time_available(struct device *dev,
+                                       struct device_attribute *attr,
+                                       char *buf)
+{
+       size_t len = 0;
+       int i;
+
+       for (i = 1; i <= 256; i++)
+               len += scnprintf(buf + len, PAGE_SIZE - len, "0.%06d ",
+                       2400 * i);
+
+       /* replace trailing space by newline */
+       buf[len - 1] = '\n';
+
+       return len;
+}
+
+static IIO_CONST_ATTR(calibscale_available, "1 4 16 60");
+static IIO_DEV_ATTR_INT_TIME_AVAIL(tcs3472_show_int_time_available);
+
+static struct attribute *tcs3472_attributes[] = {
+       &iio_const_attr_calibscale_available.dev_attr.attr,
+       &iio_dev_attr_integration_time_available.dev_attr.attr,
+       NULL
+};
+
+static const struct attribute_group tcs3472_attribute_group = {
+       .attrs = tcs3472_attributes,
+};
+
+static const struct iio_info tcs3472_info = {
+       .read_raw = tcs3472_read_raw,
+       .write_raw = tcs3472_write_raw,
+       .attrs = &tcs3472_attribute_group,
+       .driver_module = THIS_MODULE,
+};
+
+static int tcs3472_probe(struct i2c_client *client,
+                          const struct i2c_device_id *id)
+{
+       struct tcs3472_data *data;
+       struct iio_dev *indio_dev;
+       int ret;
+
+       indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
+       if (indio_dev == NULL)
+               return -ENOMEM;
+
+       data = iio_priv(indio_dev);
+       i2c_set_clientdata(client, indio_dev);
+       data->client = client;
+
+       indio_dev->dev.parent = &client->dev;
+       indio_dev->info = &tcs3472_info;
+       indio_dev->name = TCS3472_DRV_NAME;
+       indio_dev->channels = tcs3472_channels;
+       indio_dev->num_channels = ARRAY_SIZE(tcs3472_channels);
+       indio_dev->modes = INDIO_DIRECT_MODE;
+
+       ret = i2c_smbus_read_byte_data(data->client, TCS3472_ID);
+       if (ret < 0)
+               return ret;
+
+       if (ret == 0x44)
+               dev_info(&client->dev, "TCS34721/34725 found\n");
+       else if (ret == 0x4d)
+               dev_info(&client->dev, "TCS34723/34727 found\n");
+       else
+               return -ENODEV;
+
+       ret = i2c_smbus_read_byte_data(data->client, TCS3472_CONTROL);
+       if (ret < 0)
+               return ret;
+       data->control = ret;
+
+       ret = i2c_smbus_read_byte_data(data->client, TCS3472_ATIME);
+       if (ret < 0)
+               return ret;
+       data->atime = ret;
+
+       ret = i2c_smbus_read_byte_data(data->client, TCS3472_ENABLE);
+       if (ret < 0)
+               return ret;
+
+       /* enable device */
+       data->enable = ret | TCS3472_ENABLE_PON | TCS3472_ENABLE_AEN;
+       ret = i2c_smbus_write_byte_data(data->client, TCS3472_ENABLE,
+               data->enable);
+       if (ret < 0)
+               return ret;
+
+       ret = iio_triggered_buffer_setup(indio_dev, NULL,
+               tcs3472_trigger_handler, NULL);
+       if (ret < 0)
+               return ret;
+
+       ret = iio_device_register(indio_dev);
+       if (ret < 0)
+               goto buffer_cleanup;
+
+       return 0;
+
+buffer_cleanup:
+       iio_triggered_buffer_cleanup(indio_dev);
+       return ret;
+}
+
+static int tcs3472_powerdown(struct tcs3472_data *data)
+{
+       return i2c_smbus_write_byte_data(data->client, TCS3472_ENABLE,
+               data->enable & ~(TCS3472_ENABLE_AEN | TCS3472_ENABLE_PON));
+}
+
+static int tcs3472_remove(struct i2c_client *client)
+{
+       struct iio_dev *indio_dev = i2c_get_clientdata(client);
+
+       iio_device_unregister(indio_dev);
+       iio_triggered_buffer_cleanup(indio_dev);
+       tcs3472_powerdown(iio_priv(indio_dev));
+
+       return 0;
+}
+
+#ifdef CONFIG_PM_SLEEP
+static int tcs3472_suspend(struct device *dev)
+{
+       struct tcs3472_data *data = iio_priv(i2c_get_clientdata(
+               to_i2c_client(dev)));
+       return tcs3472_powerdown(data);
+}
+
+static int tcs3472_resume(struct device *dev)
+{
+       struct tcs3472_data *data = iio_priv(i2c_get_clientdata(
+               to_i2c_client(dev)));
+       return i2c_smbus_write_byte_data(data->client, TCS3472_ENABLE,
+               data->enable | (TCS3472_ENABLE_AEN | TCS3472_ENABLE_PON));
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(tcs3472_pm_ops, tcs3472_suspend, tcs3472_resume);
+
+static const struct i2c_device_id tcs3472_id[] = {
+       { "tcs3472", 0 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, tcs3472_id);
+
+static struct i2c_driver tcs3472_driver = {
+       .driver = {
+               .name   = TCS3472_DRV_NAME,
+               .pm     = &tcs3472_pm_ops,
+               .owner  = THIS_MODULE,
+       },
+       .probe          = tcs3472_probe,
+       .remove         = tcs3472_remove,
+       .id_table       = tcs3472_id,
+};
+module_i2c_driver(tcs3472_driver);
+
+MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>");
+MODULE_DESCRIPTION("TCS3472 color light sensors driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/iio/light/tsl4531.c b/drivers/iio/light/tsl4531.c
new file mode 100644 (file)
index 0000000..a15006e
--- /dev/null
@@ -0,0 +1,258 @@
+/*
+ * tsl4531.c - Support for TAOS TSL4531 ambient light sensor
+ *
+ * Copyright 2013 Peter Meerwald <pmeerw@pmeerw.net>
+ *
+ * This file is subject to the terms and conditions of version 2 of
+ * the GNU General Public License.  See the file COPYING in the main
+ * directory of this archive for more details.
+ *
+ * IIO driver for the TSL4531x family
+ *   TSL45311/TSL45313: 7-bit I2C slave address 0x39
+ *   TSL45315/TSL45317: 7-bit I2C slave address 0x29
+ *
+ * TODO: single cycle measurement
+ */
+
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/err.h>
+#include <linux/delay.h>
+
+#include <linux/iio/iio.h>
+#include <linux/iio/sysfs.h>
+
+#define TSL4531_DRV_NAME "tsl4531"
+
+#define TCS3472_COMMAND BIT(7)
+
+#define TSL4531_CONTROL (TCS3472_COMMAND | 0x00)
+#define TSL4531_CONFIG (TCS3472_COMMAND | 0x01)
+#define TSL4531_DATA (TCS3472_COMMAND | 0x04)
+#define TSL4531_ID (TCS3472_COMMAND | 0x0a)
+
+/* operating modes in control register */
+#define TSL4531_MODE_POWERDOWN 0x00
+#define TSL4531_MODE_SINGLE_ADC 0x02
+#define TSL4531_MODE_NORMAL 0x03
+
+/* integration time control in config register */
+#define TSL4531_TCNTRL_400MS 0x00
+#define TSL4531_TCNTRL_200MS 0x01
+#define TSL4531_TCNTRL_100MS 0x02
+
+/* part number in id register */
+#define TSL45311_ID 0x8
+#define TSL45313_ID 0x9
+#define TSL45315_ID 0xa
+#define TSL45317_ID 0xb
+#define TSL4531_ID_SHIFT 4
+
+struct tsl4531_data {
+       struct i2c_client *client;
+       struct mutex lock;
+       int int_time;
+};
+
+static IIO_CONST_ATTR_INT_TIME_AVAIL("0.1 0.2 0.4");
+
+static struct attribute *tsl4531_attributes[] = {
+       &iio_const_attr_integration_time_available.dev_attr.attr,
+       NULL
+};
+
+static const struct attribute_group tsl4531_attribute_group = {
+       .attrs = tsl4531_attributes,
+};
+
+static const struct iio_chan_spec tsl4531_channels[] = {
+       {
+               .type = IIO_LIGHT,
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
+                       BIT(IIO_CHAN_INFO_SCALE) |
+                       BIT(IIO_CHAN_INFO_INT_TIME)
+       }
+};
+
+static int tsl4531_read_raw(struct iio_dev *indio_dev,
+                               struct iio_chan_spec const *chan,
+                               int *val, int *val2, long mask)
+{
+       struct tsl4531_data *data = iio_priv(indio_dev);
+       int ret;
+
+       switch (mask) {
+       case IIO_CHAN_INFO_RAW:
+               ret = i2c_smbus_read_word_data(data->client,
+                       TSL4531_DATA);
+               if (ret < 0)
+                       return ret;
+               *val = ret;
+               return IIO_VAL_INT;
+       case IIO_CHAN_INFO_SCALE:
+               /* 0.. 1x, 1 .. 2x, 2 .. 4x */
+               *val = 1 << data->int_time;
+               return IIO_VAL_INT;
+       case IIO_CHAN_INFO_INT_TIME:
+               if (data->int_time == 0)
+                       *val2 = 400000;
+               else if (data->int_time == 1)
+                       *val2 = 200000;
+               else if (data->int_time == 2)
+                       *val2 = 100000;
+               else
+                       return -EINVAL;
+               *val = 0;
+               return IIO_VAL_INT_PLUS_MICRO;
+       default:
+               return -EINVAL;
+       }
+}
+
+static int tsl4531_write_raw(struct iio_dev *indio_dev,
+                            struct iio_chan_spec const *chan,
+                            int val, int val2, long mask)
+{
+       struct tsl4531_data *data = iio_priv(indio_dev);
+       int int_time, ret;
+
+       switch (mask) {
+       case IIO_CHAN_INFO_INT_TIME:
+               if (val != 0)
+                       return -EINVAL;
+               if (val2 == 400000)
+                       int_time = 0;
+               else if (val2 == 200000)
+                       int_time = 1;
+               else if (val2 == 100000)
+                       int_time = 2;
+               else
+                       return -EINVAL;
+               mutex_lock(&data->lock);
+               ret = i2c_smbus_write_byte_data(data->client,
+                       TSL4531_CONFIG, int_time);
+               if (ret >= 0)
+                       data->int_time = int_time;
+               mutex_unlock(&data->lock);
+               return ret;
+       default:
+               return -EINVAL;
+       }
+}
+
+static const struct iio_info tsl4531_info = {
+       .read_raw = tsl4531_read_raw,
+       .write_raw = tsl4531_write_raw,
+       .attrs = &tsl4531_attribute_group,
+       .driver_module = THIS_MODULE,
+};
+
+static int tsl4531_check_id(struct i2c_client *client)
+{
+       int ret = i2c_smbus_read_byte_data(client, TSL4531_ID);
+       if (ret < 0)
+               return ret;
+
+       switch (ret >> TSL4531_ID_SHIFT) {
+       case TSL45311_ID:
+       case TSL45313_ID:
+       case TSL45315_ID:
+       case TSL45317_ID:
+               return 1;
+       default:
+               return 0;
+       }
+}
+
+static int tsl4531_probe(struct i2c_client *client,
+                         const struct i2c_device_id *id)
+{
+       struct tsl4531_data *data;
+       struct iio_dev *indio_dev;
+       int ret;
+
+       indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
+       if (!indio_dev)
+               return -ENOMEM;
+
+       data = iio_priv(indio_dev);
+       i2c_set_clientdata(client, indio_dev);
+       data->client = client;
+       mutex_init(&data->lock);
+
+       if (!tsl4531_check_id(client)) {
+               dev_err(&client->dev, "no TSL4531 sensor\n");
+               return -ENODEV;
+       }
+
+       ret = i2c_smbus_write_byte_data(data->client, TSL4531_CONTROL,
+               TSL4531_MODE_NORMAL);
+       if (ret < 0)
+               return ret;
+
+       ret = i2c_smbus_write_byte_data(data->client, TSL4531_CONFIG,
+               TSL4531_TCNTRL_400MS);
+       if (ret < 0)
+               return ret;
+
+       indio_dev->dev.parent = &client->dev;
+       indio_dev->info = &tsl4531_info;
+       indio_dev->channels = tsl4531_channels;
+       indio_dev->num_channels = ARRAY_SIZE(tsl4531_channels);
+       indio_dev->name = TSL4531_DRV_NAME;
+       indio_dev->modes = INDIO_DIRECT_MODE;
+
+       return iio_device_register(indio_dev);
+}
+
+static int tsl4531_powerdown(struct i2c_client *client)
+{
+       return i2c_smbus_write_byte_data(client, TSL4531_CONTROL,
+               TSL4531_MODE_POWERDOWN);
+}
+
+static int tsl4531_remove(struct i2c_client *client)
+{
+       iio_device_unregister(i2c_get_clientdata(client));
+       tsl4531_powerdown(client);
+
+       return 0;
+}
+
+#ifdef CONFIG_PM_SLEEP
+static int tsl4531_suspend(struct device *dev)
+{
+       return tsl4531_powerdown(to_i2c_client(dev));
+}
+
+static int tsl4531_resume(struct device *dev)
+{
+       return i2c_smbus_write_byte_data(to_i2c_client(dev), TSL4531_CONTROL,
+               TSL4531_MODE_NORMAL);
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(tsl4531_pm_ops, tsl4531_suspend, tsl4531_resume);
+
+static const struct i2c_device_id tsl4531_id[] = {
+       { "tsl4531", 0 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, tsl4531_id);
+
+static struct i2c_driver tsl4531_driver = {
+       .driver = {
+               .name   = TSL4531_DRV_NAME,
+               .pm     = &tsl4531_pm_ops,
+               .owner  = THIS_MODULE,
+       },
+       .probe  = tsl4531_probe,
+       .remove = tsl4531_remove,
+       .id_table = tsl4531_id,
+};
+
+module_i2c_driver(tsl4531_driver);
+
+MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>");
+MODULE_DESCRIPTION("TAOS TSL4531 ambient light sensors driver");
+MODULE_LICENSE("GPL");
index a98460b15e4b63fc791494c32b1594993a12b6d1..2634920562fb7263bad4ac9d8c6c75fe7a434b49 100644 (file)
@@ -183,10 +183,11 @@ static const struct iio_info magn_3d_info = {
 };
 
 /* Function to push data to buffer */
-static void hid_sensor_push_data(struct iio_dev *indio_dev, u8 *data, int len)
+static void hid_sensor_push_data(struct iio_dev *indio_dev, const void *data,
+       int len)
 {
        dev_dbg(&indio_dev->dev, "hid_sensor_push_data\n");
-       iio_push_to_buffers(indio_dev, (u8 *)data);
+       iio_push_to_buffers(indio_dev, data);
 }
 
 /* Callback handler to send event after all samples are received and captured */
@@ -201,7 +202,7 @@ static int magn_3d_proc_event(struct hid_sensor_hub_device *hsdev,
                                magn_state->common_attributes.data_ready);
        if (magn_state->common_attributes.data_ready)
                hid_sensor_push_data(indio_dev,
-                               (u8 *)magn_state->magn_val,
+                               magn_state->magn_val,
                                sizeof(magn_state->magn_val));
 
        return 0;
index e8d2849cc81d9110356691caaba587c80afff57e..82461eff995a93d534dfa0779d73724e1e1191a9 100644 (file)
@@ -348,8 +348,9 @@ static const struct iio_info magn_info = {
 int st_magn_common_probe(struct iio_dev *indio_dev,
                                        struct st_sensors_platform_data *pdata)
 {
-       int err;
        struct st_sensor_data *mdata = iio_priv(indio_dev);
+       int irq = mdata->get_irq_data_ready(indio_dev);
+       int err;
 
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->info = &magn_info;
@@ -357,7 +358,7 @@ int st_magn_common_probe(struct iio_dev *indio_dev,
        err = st_sensors_check_device_support(indio_dev,
                                ARRAY_SIZE(st_magn_sensors), st_magn_sensors);
        if (err < 0)
-               goto st_magn_common_probe_error;
+               return err;
 
        mdata->num_data_channels = ST_MAGN_NUMBER_DATA_CHANNELS;
        mdata->multiread_bit = mdata->sensor->multi_read_bit;
@@ -370,12 +371,13 @@ int st_magn_common_probe(struct iio_dev *indio_dev,
 
        err = st_sensors_init_sensor(indio_dev, pdata);
        if (err < 0)
-               goto st_magn_common_probe_error;
+               return err;
 
-       if (mdata->get_irq_data_ready(indio_dev) > 0) {
-               err = st_magn_allocate_ring(indio_dev);
-               if (err < 0)
-                       goto st_magn_common_probe_error;
+       err = st_magn_allocate_ring(indio_dev);
+       if (err < 0)
+               return err;
+
+       if (irq > 0) {
                err = st_sensors_allocate_trigger(indio_dev, NULL);
                if (err < 0)
                        goto st_magn_probe_trigger_error;
@@ -385,15 +387,14 @@ int st_magn_common_probe(struct iio_dev *indio_dev,
        if (err)
                goto st_magn_device_register_error;
 
-       return err;
+       return 0;
 
 st_magn_device_register_error:
-       if (mdata->get_irq_data_ready(indio_dev) > 0)
+       if (irq > 0)
                st_sensors_deallocate_trigger(indio_dev);
 st_magn_probe_trigger_error:
-       if (mdata->get_irq_data_ready(indio_dev) > 0)
-               st_magn_deallocate_ring(indio_dev);
-st_magn_common_probe_error:
+       st_magn_deallocate_ring(indio_dev);
+
        return err;
 }
 EXPORT_SYMBOL(st_magn_common_probe);
@@ -403,10 +404,10 @@ void st_magn_common_remove(struct iio_dev *indio_dev)
        struct st_sensor_data *mdata = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-       if (mdata->get_irq_data_ready(indio_dev) > 0) {
+       if (mdata->get_irq_data_ready(indio_dev) > 0)
                st_sensors_deallocate_trigger(indio_dev);
-               st_magn_deallocate_ring(indio_dev);
-       }
+
+       st_magn_deallocate_ring(indio_dev);
 }
 EXPORT_SYMBOL(st_magn_common_remove);
 
index b0b630688da665138a97e3afbf33c1f387dda323..049c21acf1f051bfea9067c45ad7eb543b6361b2 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/types.h>
 #include <linux/iio/common/st_sensors.h>
 
+#define LPS001WP_PRESS_DEV_NAME                "lps001wp"
 #define LPS331AP_PRESS_DEV_NAME                "lps331ap"
 
 /**
index ceebd3c27892b183f6f276b1dbdb4d7a6a5a9a74..2da411b6925bfc16fc07513f2d350f1001bd7e1c 100644 (file)
                                                 ST_PRESS_LSB_PER_CELSIUS)
 #define ST_PRESS_NUMBER_DATA_CHANNELS          1
 
-/* DEFAULT VALUE FOR SENSORS */
-#define ST_PRESS_DEFAULT_OUT_XL_ADDR           0x28
-#define ST_TEMP_DEFAULT_OUT_L_ADDR             0x2b
-
 /* FULLSCALE */
 #define ST_PRESS_FS_AVL_1260MB                 1260
 
-/* CUSTOM VALUES FOR SENSOR 1 */
-#define ST_PRESS_1_WAI_EXP                     0xbb
-#define ST_PRESS_1_ODR_ADDR                    0x20
-#define ST_PRESS_1_ODR_MASK                    0x70
-#define ST_PRESS_1_ODR_AVL_1HZ_VAL             0x01
-#define ST_PRESS_1_ODR_AVL_7HZ_VAL             0x05
-#define ST_PRESS_1_ODR_AVL_13HZ_VAL            0x06
-#define ST_PRESS_1_ODR_AVL_25HZ_VAL            0x07
-#define ST_PRESS_1_PW_ADDR                     0x20
-#define ST_PRESS_1_PW_MASK                     0x80
-#define ST_PRESS_1_FS_ADDR                     0x23
-#define ST_PRESS_1_FS_MASK                     0x30
-#define ST_PRESS_1_FS_AVL_1260_VAL             0x00
-#define ST_PRESS_1_FS_AVL_1260_GAIN            ST_PRESS_KPASCAL_NANO_SCALE
-#define ST_PRESS_1_FS_AVL_TEMP_GAIN            ST_PRESS_CELSIUS_NANO_SCALE
-#define ST_PRESS_1_BDU_ADDR                    0x20
-#define ST_PRESS_1_BDU_MASK                    0x04
-#define ST_PRESS_1_DRDY_IRQ_ADDR               0x22
-#define ST_PRESS_1_DRDY_IRQ_INT1_MASK          0x04
-#define ST_PRESS_1_DRDY_IRQ_INT2_MASK          0x20
-#define ST_PRESS_1_MULTIREAD_BIT               true
-#define ST_PRESS_1_TEMP_OFFSET                 42500
-
-static const struct iio_chan_spec st_press_channels[] = {
-       ST_SENSORS_LSM_CHANNELS(IIO_PRESSURE,
+/* CUSTOM VALUES FOR LPS331AP SENSOR */
+#define ST_PRESS_LPS331AP_WAI_EXP              0xbb
+#define ST_PRESS_LPS331AP_ODR_ADDR             0x20
+#define ST_PRESS_LPS331AP_ODR_MASK             0x70
+#define ST_PRESS_LPS331AP_ODR_AVL_1HZ_VAL      0x01
+#define ST_PRESS_LPS331AP_ODR_AVL_7HZ_VAL      0x05
+#define ST_PRESS_LPS331AP_ODR_AVL_13HZ_VAL     0x06
+#define ST_PRESS_LPS331AP_ODR_AVL_25HZ_VAL     0x07
+#define ST_PRESS_LPS331AP_PW_ADDR              0x20
+#define ST_PRESS_LPS331AP_PW_MASK              0x80
+#define ST_PRESS_LPS331AP_FS_ADDR              0x23
+#define ST_PRESS_LPS331AP_FS_MASK              0x30
+#define ST_PRESS_LPS331AP_FS_AVL_1260_VAL      0x00
+#define ST_PRESS_LPS331AP_FS_AVL_1260_GAIN     ST_PRESS_KPASCAL_NANO_SCALE
+#define ST_PRESS_LPS331AP_FS_AVL_TEMP_GAIN     ST_PRESS_CELSIUS_NANO_SCALE
+#define ST_PRESS_LPS331AP_BDU_ADDR             0x20
+#define ST_PRESS_LPS331AP_BDU_MASK             0x04
+#define ST_PRESS_LPS331AP_DRDY_IRQ_ADDR                0x22
+#define ST_PRESS_LPS331AP_DRDY_IRQ_INT1_MASK   0x04
+#define ST_PRESS_LPS331AP_DRDY_IRQ_INT2_MASK   0x20
+#define ST_PRESS_LPS331AP_MULTIREAD_BIT                true
+#define ST_PRESS_LPS331AP_TEMP_OFFSET          42500
+#define ST_PRESS_LPS331AP_OUT_XL_ADDR          0x28
+#define ST_TEMP_LPS331AP_OUT_L_ADDR            0x2b
+
+/* CUSTOM VALUES FOR LPS001WP SENSOR */
+#define ST_PRESS_LPS001WP_WAI_EXP              0xba
+#define ST_PRESS_LPS001WP_ODR_ADDR             0x20
+#define ST_PRESS_LPS001WP_ODR_MASK             0x30
+#define ST_PRESS_LPS001WP_ODR_AVL_1HZ_VAL      0x01
+#define ST_PRESS_LPS001WP_ODR_AVL_7HZ_VAL      0x02
+#define ST_PRESS_LPS001WP_ODR_AVL_13HZ_VAL     0x03
+#define ST_PRESS_LPS001WP_PW_ADDR              0x20
+#define ST_PRESS_LPS001WP_PW_MASK              0x40
+#define ST_PRESS_LPS001WP_BDU_ADDR             0x20
+#define ST_PRESS_LPS001WP_BDU_MASK             0x04
+#define ST_PRESS_LPS001WP_MULTIREAD_BIT                true
+#define ST_PRESS_LPS001WP_OUT_L_ADDR           0x28
+#define ST_TEMP_LPS001WP_OUT_L_ADDR            0x2a
+
+static const struct iio_chan_spec st_press_lps331ap_channels[] = {
+       {
+               .type = IIO_PRESSURE,
+               .channel2 = IIO_NO_MOD,
+               .address = ST_PRESS_LPS331AP_OUT_XL_ADDR,
+               .scan_index = ST_SENSORS_SCAN_X,
+               .scan_type = {
+                       .sign = 'u',
+                       .realbits = 24,
+                       .storagebits = 24,
+                       .endianness = IIO_LE,
+               },
+               .info_mask_separate =
                        BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
-                       ST_SENSORS_SCAN_X, 0, IIO_NO_MOD, 'u', IIO_LE, 24, 24,
-                       ST_PRESS_DEFAULT_OUT_XL_ADDR),
-       ST_SENSORS_LSM_CHANNELS(IIO_TEMP,
-                       BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE) |
-                                               BIT(IIO_CHAN_INFO_OFFSET),
-                       -1, 0, IIO_NO_MOD, 's', IIO_LE, 16, 16,
-                       ST_TEMP_DEFAULT_OUT_L_ADDR),
+               .modified = 0,
+       },
+       {
+               .type = IIO_TEMP,
+               .channel2 = IIO_NO_MOD,
+               .address = ST_TEMP_LPS331AP_OUT_L_ADDR,
+               .scan_index = -1,
+               .scan_type = {
+                       .sign = 'u',
+                       .realbits = 16,
+                       .storagebits = 16,
+                       .endianness = IIO_LE,
+               },
+               .info_mask_separate =
+                       BIT(IIO_CHAN_INFO_RAW) |
+                       BIT(IIO_CHAN_INFO_SCALE) |
+                       BIT(IIO_CHAN_INFO_OFFSET),
+               .modified = 0,
+       },
+       IIO_CHAN_SOFT_TIMESTAMP(1)
+};
+
+static const struct iio_chan_spec st_press_lps001wp_channels[] = {
+       {
+               .type = IIO_PRESSURE,
+               .channel2 = IIO_NO_MOD,
+               .address = ST_PRESS_LPS001WP_OUT_L_ADDR,
+               .scan_index = ST_SENSORS_SCAN_X,
+               .scan_type = {
+                       .sign = 'u',
+                       .realbits = 16,
+                       .storagebits = 16,
+                       .endianness = IIO_LE,
+               },
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+               .modified = 0,
+       },
+       {
+               .type = IIO_TEMP,
+               .channel2 = IIO_NO_MOD,
+               .address = ST_TEMP_LPS001WP_OUT_L_ADDR,
+               .scan_index = -1,
+               .scan_type = {
+                       .sign = 'u',
+                       .realbits = 16,
+                       .storagebits = 16,
+                       .endianness = IIO_LE,
+               },
+               .info_mask_separate =
+                       BIT(IIO_CHAN_INFO_RAW) |
+                       BIT(IIO_CHAN_INFO_OFFSET),
+               .modified = 0,
+       },
        IIO_CHAN_SOFT_TIMESTAMP(1)
 };
 
 static const struct st_sensors st_press_sensors[] = {
        {
-               .wai = ST_PRESS_1_WAI_EXP,
+               .wai = ST_PRESS_LPS331AP_WAI_EXP,
                .sensors_supported = {
                        [0] = LPS331AP_PRESS_DEV_NAME,
                },
-               .ch = (struct iio_chan_spec *)st_press_channels,
+               .ch = (struct iio_chan_spec *)st_press_lps331ap_channels,
+               .num_ch = ARRAY_SIZE(st_press_lps331ap_channels),
                .odr = {
-                       .addr = ST_PRESS_1_ODR_ADDR,
-                       .mask = ST_PRESS_1_ODR_MASK,
+                       .addr = ST_PRESS_LPS331AP_ODR_ADDR,
+                       .mask = ST_PRESS_LPS331AP_ODR_MASK,
                        .odr_avl = {
-                               { 1, ST_PRESS_1_ODR_AVL_1HZ_VAL, },
-                               { 7, ST_PRESS_1_ODR_AVL_7HZ_VAL, },
-                               { 13, ST_PRESS_1_ODR_AVL_13HZ_VAL, },
-                               { 25, ST_PRESS_1_ODR_AVL_25HZ_VAL, },
+                               { 1, ST_PRESS_LPS331AP_ODR_AVL_1HZ_VAL, },
+                               { 7, ST_PRESS_LPS331AP_ODR_AVL_7HZ_VAL, },
+                               { 13, ST_PRESS_LPS331AP_ODR_AVL_13HZ_VAL, },
+                               { 25, ST_PRESS_LPS331AP_ODR_AVL_25HZ_VAL, },
                        },
                },
                .pw = {
-                       .addr = ST_PRESS_1_PW_ADDR,
-                       .mask = ST_PRESS_1_PW_MASK,
+                       .addr = ST_PRESS_LPS331AP_PW_ADDR,
+                       .mask = ST_PRESS_LPS331AP_PW_MASK,
                        .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
                        .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
                },
                .fs = {
-                       .addr = ST_PRESS_1_FS_ADDR,
-                       .mask = ST_PRESS_1_FS_MASK,
+                       .addr = ST_PRESS_LPS331AP_FS_ADDR,
+                       .mask = ST_PRESS_LPS331AP_FS_MASK,
                        .fs_avl = {
                                [0] = {
                                        .num = ST_PRESS_FS_AVL_1260MB,
-                                       .value = ST_PRESS_1_FS_AVL_1260_VAL,
-                                       .gain = ST_PRESS_1_FS_AVL_1260_GAIN,
-                                       .gain2 = ST_PRESS_1_FS_AVL_TEMP_GAIN,
+                                       .value = ST_PRESS_LPS331AP_FS_AVL_1260_VAL,
+                                       .gain = ST_PRESS_LPS331AP_FS_AVL_1260_GAIN,
+                                       .gain2 = ST_PRESS_LPS331AP_FS_AVL_TEMP_GAIN,
                                },
                        },
                },
                .bdu = {
-                       .addr = ST_PRESS_1_BDU_ADDR,
-                       .mask = ST_PRESS_1_BDU_MASK,
+                       .addr = ST_PRESS_LPS331AP_BDU_ADDR,
+                       .mask = ST_PRESS_LPS331AP_BDU_MASK,
+               },
+               .drdy_irq = {
+                       .addr = ST_PRESS_LPS331AP_DRDY_IRQ_ADDR,
+                       .mask_int1 = ST_PRESS_LPS331AP_DRDY_IRQ_INT1_MASK,
+                       .mask_int2 = ST_PRESS_LPS331AP_DRDY_IRQ_INT2_MASK,
+               },
+               .multi_read_bit = ST_PRESS_LPS331AP_MULTIREAD_BIT,
+               .bootime = 2,
+       },
+       {
+               .wai = ST_PRESS_LPS001WP_WAI_EXP,
+               .sensors_supported = {
+                       [0] = LPS001WP_PRESS_DEV_NAME,
+               },
+               .ch = (struct iio_chan_spec *)st_press_lps001wp_channels,
+               .num_ch = ARRAY_SIZE(st_press_lps001wp_channels),
+               .odr = {
+                       .addr = ST_PRESS_LPS001WP_ODR_ADDR,
+                       .mask = ST_PRESS_LPS001WP_ODR_MASK,
+                       .odr_avl = {
+                               { 1, ST_PRESS_LPS001WP_ODR_AVL_1HZ_VAL, },
+                               { 7, ST_PRESS_LPS001WP_ODR_AVL_7HZ_VAL, },
+                               { 13, ST_PRESS_LPS001WP_ODR_AVL_13HZ_VAL, },
+                       },
+               },
+               .pw = {
+                       .addr = ST_PRESS_LPS001WP_PW_ADDR,
+                       .mask = ST_PRESS_LPS001WP_PW_MASK,
+                       .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
+                       .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
+               },
+               .fs = {
+                       .addr = 0,
+               },
+               .bdu = {
+                       .addr = ST_PRESS_LPS001WP_BDU_ADDR,
+                       .mask = ST_PRESS_LPS001WP_BDU_MASK,
                },
                .drdy_irq = {
-                       .addr = ST_PRESS_1_DRDY_IRQ_ADDR,
-                       .mask_int1 = ST_PRESS_1_DRDY_IRQ_INT1_MASK,
-                       .mask_int2 = ST_PRESS_1_DRDY_IRQ_INT2_MASK,
+                       .addr = 0,
                },
-               .multi_read_bit = ST_PRESS_1_MULTIREAD_BIT,
+               .multi_read_bit = ST_PRESS_LPS001WP_MULTIREAD_BIT,
                .bootime = 2,
        },
 };
@@ -210,41 +316,46 @@ static const struct iio_trigger_ops st_press_trigger_ops = {
 int st_press_common_probe(struct iio_dev *indio_dev,
                                struct st_sensors_platform_data *plat_data)
 {
-       int err;
        struct st_sensor_data *pdata = iio_priv(indio_dev);
+       int irq = pdata->get_irq_data_ready(indio_dev);
+       int err;
 
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->info = &press_info;
 
        err = st_sensors_check_device_support(indio_dev,
-                               ARRAY_SIZE(st_press_sensors), st_press_sensors);
+                                             ARRAY_SIZE(st_press_sensors),
+                                             st_press_sensors);
        if (err < 0)
-               goto st_press_common_probe_error;
+               return err;
 
        pdata->num_data_channels = ST_PRESS_NUMBER_DATA_CHANNELS;
-       pdata->multiread_bit = pdata->sensor->multi_read_bit;
-       indio_dev->channels = pdata->sensor->ch;
-       indio_dev->num_channels = ARRAY_SIZE(st_press_channels);
+       pdata->multiread_bit     = pdata->sensor->multi_read_bit;
+       indio_dev->channels      = pdata->sensor->ch;
+       indio_dev->num_channels  = pdata->sensor->num_ch;
+
+       if (pdata->sensor->fs.addr != 0)
+               pdata->current_fullscale = (struct st_sensor_fullscale_avl *)
+                       &pdata->sensor->fs.fs_avl[0];
 
-       pdata->current_fullscale = (struct st_sensor_fullscale_avl *)
-                                               &pdata->sensor->fs.fs_avl[0];
        pdata->odr = pdata->sensor->odr.odr_avl[0].hz;
 
-       if (!plat_data)
+       /* Some devices don't support a data ready pin. */
+       if (!plat_data && pdata->sensor->drdy_irq.addr)
                plat_data =
                        (struct st_sensors_platform_data *)&default_press_pdata;
 
        err = st_sensors_init_sensor(indio_dev, plat_data);
        if (err < 0)
-               goto st_press_common_probe_error;
+               return err;
 
-       if (pdata->get_irq_data_ready(indio_dev) > 0) {
-               err = st_press_allocate_ring(indio_dev);
-               if (err < 0)
-                       goto st_press_common_probe_error;
+       err = st_press_allocate_ring(indio_dev);
+       if (err < 0)
+               return err;
 
+       if (irq > 0) {
                err = st_sensors_allocate_trigger(indio_dev,
-                                                       ST_PRESS_TRIGGER_OPS);
+                                                 ST_PRESS_TRIGGER_OPS);
                if (err < 0)
                        goto st_press_probe_trigger_error;
        }
@@ -256,12 +367,11 @@ int st_press_common_probe(struct iio_dev *indio_dev,
        return err;
 
 st_press_device_register_error:
-       if (pdata->get_irq_data_ready(indio_dev) > 0)
+       if (irq > 0)
                st_sensors_deallocate_trigger(indio_dev);
 st_press_probe_trigger_error:
-       if (pdata->get_irq_data_ready(indio_dev) > 0)
-               st_press_deallocate_ring(indio_dev);
-st_press_common_probe_error:
+       st_press_deallocate_ring(indio_dev);
+
        return err;
 }
 EXPORT_SYMBOL(st_press_common_probe);
@@ -271,10 +381,10 @@ void st_press_common_remove(struct iio_dev *indio_dev)
        struct st_sensor_data *pdata = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-       if (pdata->get_irq_data_ready(indio_dev) > 0) {
+       if (pdata->get_irq_data_ready(indio_dev) > 0)
                st_sensors_deallocate_trigger(indio_dev);
-               st_press_deallocate_ring(indio_dev);
-       }
+
+       st_press_deallocate_ring(indio_dev);
 }
 EXPORT_SYMBOL(st_press_common_remove);
 
index 08aac5e6251dd11c770c240a81c38fd82773bc03..51eab7fcb1949894913048980895966792a5c4c9 100644 (file)
@@ -49,6 +49,7 @@ static int st_press_i2c_remove(struct i2c_client *client)
 }
 
 static const struct i2c_device_id st_press_id_table[] = {
+       { LPS001WP_PRESS_DEV_NAME },
        { LPS331AP_PRESS_DEV_NAME },
        {},
 };
index 6d63883da1ab0e56be798538e1d965b1032eacb7..84a0789c3d96882de6db6c161e62c2feee444bc0 100644 (file)
@@ -70,12 +70,16 @@ static int tmp006_read_measurement(struct tmp006_data *data, u8 reg)
        return i2c_smbus_read_word_swapped(data->client, reg);
 }
 
+static const int tmp006_freqs[5][2] = { {4, 0}, {2, 0}, {1, 0},
+                                       {0, 500000}, {0, 250000} };
+
 static int tmp006_read_raw(struct iio_dev *indio_dev,
                            struct iio_chan_spec const *channel, int *val,
                            int *val2, long mask)
 {
        struct tmp006_data *data = iio_priv(indio_dev);
        s32 ret;
+       int cr;
 
        switch (mask) {
        case IIO_CHAN_INFO_RAW:
@@ -106,6 +110,12 @@ static int tmp006_read_raw(struct iio_dev *indio_dev,
                        break;
                }
                return IIO_VAL_INT_PLUS_MICRO;
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               cr = (data->config & TMP006_CONFIG_CR_MASK)
+                       >> TMP006_CONFIG_CR_SHIFT;
+               *val = tmp006_freqs[cr][0];
+               *val2 = tmp006_freqs[cr][1];
+               return IIO_VAL_INT_PLUS_MICRO;
        default:
                break;
        }
@@ -113,48 +123,32 @@ static int tmp006_read_raw(struct iio_dev *indio_dev,
        return -EINVAL;
 }
 
-static const char * const tmp006_freqs[] = { "4", "2", "1", "0.5", "0.25" };
-
-static ssize_t tmp006_show_freq(struct device *dev,
-                               struct device_attribute *attr, char *buf)
-{
-       struct tmp006_data *data = iio_priv(dev_to_iio_dev(dev));
-       int cr = (data->config & TMP006_CONFIG_CR_MASK)
-               >> TMP006_CONFIG_CR_SHIFT;
-       return sprintf(buf, "%s\n", tmp006_freqs[cr]);
-}
-
-static ssize_t tmp006_store_freq(struct device *dev,
-                                struct device_attribute *attr,
-                                const char *buf, size_t len)
+static int tmp006_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_to_iio_dev(dev);
        struct tmp006_data *data = iio_priv(indio_dev);
        int i;
-       bool found = false;
 
        for (i = 0; i < ARRAY_SIZE(tmp006_freqs); i++)
-               if (sysfs_streq(buf, tmp006_freqs[i])) {
-                       found = true;
-                       break;
-               }
-       if (!found)
-               return -EINVAL;
+               if ((val == tmp006_freqs[i][0]) &&
+                   (val2 == tmp006_freqs[i][1])) {
+                       data->config &= ~TMP006_CONFIG_CR_MASK;
+                       data->config |= i << TMP006_CONFIG_CR_SHIFT;
 
-       data->config &= ~TMP006_CONFIG_CR_MASK;
-       data->config |= i << TMP006_CONFIG_CR_SHIFT;
+                       return i2c_smbus_write_word_swapped(data->client,
+                                                           TMP006_CONFIG,
+                                                           data->config);
 
-       return i2c_smbus_write_word_swapped(data->client, TMP006_CONFIG,
-               data->config);
+               }
+       return -EINVAL;
 }
 
-static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR,
-                       tmp006_show_freq, tmp006_store_freq);
-
 static IIO_CONST_ATTR(sampling_frequency_available, "4 2 1 0.5 0.25");
 
 static struct attribute *tmp006_attributes[] = {
-       &iio_dev_attr_sampling_frequency.dev_attr.attr,
        &iio_const_attr_sampling_frequency_available.dev_attr.attr,
        NULL
 };
@@ -168,16 +162,19 @@ static const struct iio_chan_spec tmp006_channels[] = {
                .type = IIO_VOLTAGE,
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
                        BIT(IIO_CHAN_INFO_SCALE),
+               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
        },
        {
                .type = IIO_TEMP,
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
                        BIT(IIO_CHAN_INFO_SCALE),
+               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
        }
 };
 
 static const struct iio_info tmp006_info = {
        .read_raw = tmp006_read_raw,
+       .write_raw = tmp006_write_raw,
        .attrs = &tmp006_attribute_group,
        .driver_module = THIS_MODULE,
 };
index e1c5300cacfc2044f83175dccffd864a8bd01fbc..24e625c0b5314217accaee7886f2d05e2652901d 100644 (file)
@@ -52,6 +52,7 @@ struct titsc {
        u32                     config_inp[4];
        u32                     bit_xp, bit_xn, bit_yp, bit_yn;
        u32                     inp_xp, inp_xn, inp_yp, inp_yn;
+       u32                     step_mask;
 };
 
 static unsigned int titsc_readl(struct titsc *ts, unsigned int reg)
@@ -196,7 +197,8 @@ static void titsc_step_config(struct titsc *ts_dev)
 
        /* The steps1 â€¦ end and bit 0 for TS_Charge */
        stepenable = (1 << (end_step + 2)) - 1;
-       am335x_tsc_se_set(ts_dev->mfd_tscadc, stepenable);
+       ts_dev->step_mask = stepenable;
+       am335x_tsc_se_set(ts_dev->mfd_tscadc, ts_dev->step_mask);
 }
 
 static void titsc_read_coordinates(struct titsc *ts_dev,
@@ -260,6 +262,10 @@ static irqreturn_t titsc_irq(int irq, void *dev)
        unsigned int fsm;
 
        status = titsc_readl(ts_dev, REG_IRQSTATUS);
+       /*
+        * ADC and touchscreen share the IRQ line.
+        * FIFO1 interrupts are used by ADC. Handle FIFO0 IRQs here only
+        */
        if (status & IRQENB_FIFO0THRES) {
 
                titsc_read_coordinates(ts_dev, &x, &y, &z1, &z2);
@@ -316,7 +322,7 @@ static irqreturn_t titsc_irq(int irq, void *dev)
 
        if (irqclr) {
                titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
-               am335x_tsc_se_update(ts_dev->mfd_tscadc);
+               am335x_tsc_se_set(ts_dev->mfd_tscadc, ts_dev->step_mask);
                return IRQ_HANDLED;
        }
        return IRQ_NONE;
@@ -389,7 +395,7 @@ static int titsc_probe(struct platform_device *pdev)
        }
 
        err = request_irq(ts_dev->irq, titsc_irq,
-                         0, pdev->dev.driver->name, ts_dev);
+                         IRQF_SHARED, pdev->dev.driver->name, ts_dev);
        if (err) {
                dev_err(&pdev->dev, "failed to allocate irq.\n");
                goto err_free_mem;
index c0c95be0f969de825119ce2a6ee535fd6668a63b..1e9ab6dfc90d446f84fdec75891a30683bb13927 100644 (file)
@@ -10,6 +10,7 @@ if ANDROID
 
 config ANDROID_BINDER_IPC
        bool "Android Binder IPC Driver"
+       depends on MMU
        default n
        ---help---
          Binder is used in Android for both communication between processes,
@@ -76,7 +77,7 @@ config SYNC
        bool "Synchronization framework"
        default n
        select ANON_INODES
-       help
+       ---help---
          This option enables the framework for synchronization between multiple
          drivers.  Sync implementations can take advantage of hardware
          synchronization built into devices like GPUs.
@@ -85,7 +86,7 @@ config SW_SYNC
        bool "Software synchronization objects"
        default n
        depends on SYNC
-       help
+       ---help---
          A sync object driver that uses a 32bit counter to coordinate
          syncrhronization.  Useful when there is no hardware primitive backing
          the synchronization.
@@ -94,7 +95,7 @@ config SW_SYNC_USER
        bool "Userspace API for SW_SYNC"
        default n
        depends on SW_SYNC
-       help
+       ---help---
          Provides a user space API to the sw sync object.
          *WARNING* improper use of this can result in deadlocking kernel
          drivers from userspace.
index 6dc27dac679d9133052b7aca2ad2ea06cf1d3486..647694f43dcf12fe9c30c300674f128569f79780 100644 (file)
@@ -60,7 +60,12 @@ struct devalarm {
 
 static struct devalarm alarms[ANDROID_ALARM_TYPE_COUNT];
 
-
+/**
+ * is_wakeup() - Checks to see if this alarm can wake the device
+ * @type:       The type of alarm being checked
+ *
+ * Return: 1 if this is a wakeup alarm, otherwise 0
+ */
 static int is_wakeup(enum android_alarm_type type)
 {
        return (type == ANDROID_ALARM_RTC_WAKEUP ||
@@ -76,7 +81,6 @@ static void devalarm_start(struct devalarm *alrm, ktime_t exp)
                hrtimer_start(&alrm->u.hrt, exp, HRTIMER_MODE_ABS);
 }
 
-
 static int devalarm_try_to_cancel(struct devalarm *alrm)
 {
        if (is_wakeup(alrm->type))
index 8e76ddca0999dd29e50d68f61d4f78c0ba6fbac3..db5325c88f1cb494a08d846e5f9a1d859fad00e4 100644 (file)
 #define ASHMEM_NAME_PREFIX_LEN (sizeof(ASHMEM_NAME_PREFIX) - 1)
 #define ASHMEM_FULL_NAME_LEN (ASHMEM_NAME_LEN + ASHMEM_NAME_PREFIX_LEN)
 
-/*
- * ashmem_area - anonymous shared memory area
- * Lifecycle: From our parent file's open() until its release()
- * Locking: Protected by `ashmem_mutex'
- * Big Note: Mappings do NOT pin this structure; it dies on close()
+/**
+ * struct ashmem_area - The anonymous shared memory area
+ * @name:              The optional name in /proc/pid/maps
+ * @unpinned_list:     The list of all ashmem areas
+ * @file:              The shmem-based backing file
+ * @size:              The size of the mapping, in bytes
+ * @prot_masks:                The allowed protection bits, as vm_flags
+ *
+ * The lifecycle of this structure is from our parent file's open() until
+ * its release(). It is also protected by 'ashmem_mutex'
+ *
+ * Warning: Mappings do NOT pin this structure; It dies on close()
  */
 struct ashmem_area {
-       char name[ASHMEM_FULL_NAME_LEN]; /* optional name in /proc/pid/maps */
-       struct list_head unpinned_list;  /* list of all ashmem areas */
-       struct file *file;               /* the shmem-based backing file */
-       size_t size;                     /* size of the mapping, in bytes */
-       unsigned long prot_mask;         /* allowed prot bits, as vm_flags */
+       char name[ASHMEM_FULL_NAME_LEN];
+       struct list_head unpinned_list;
+       struct file *file;
+       size_t size;
+       unsigned long prot_mask;
 };
 
-/*
- * ashmem_range - represents an interval of unpinned (evictable) pages
- * Lifecycle: From unpin to pin
- * Locking: Protected by `ashmem_mutex'
+/**
+ * struct ashmem_range - A range of unpinned/evictable pages
+ * @lru:                The entry in the LRU list
+ * @unpinned:           The entry in its area's unpinned list
+ * @asma:               The associated anonymous shared memory area.
+ * @pgstart:            The starting page (inclusive)
+ * @pgend:              The ending page (inclusive)
+ * @purged:             The purge status (ASHMEM_NOT or ASHMEM_WAS_PURGED)
+ *
+ * The lifecycle of this structure is from unpin to pin.
+ * It is protected by 'ashmem_mutex'
  */
 struct ashmem_range {
-       struct list_head lru;           /* entry in LRU list */
-       struct list_head unpinned;      /* entry in its area's unpinned list */
-       struct ashmem_area *asma;       /* associated area */
-       size_t pgstart;                 /* starting page, inclusive */
-       size_t pgend;                   /* ending page, inclusive */
-       unsigned int purged;            /* ASHMEM_NOT or ASHMEM_WAS_PURGED */
+       struct list_head lru;
+       struct list_head unpinned;
+       struct ashmem_area *asma;
+       size_t pgstart;
+       size_t pgend;
+       unsigned int purged;
 };
 
 /* LRU list of unpinned pages, protected by ashmem_mutex */
 static LIST_HEAD(ashmem_lru_list);
 
-/* Count of pages on our LRU list, protected by ashmem_mutex */
+/**
+ * long lru_count - The count of pages on our LRU list.
+ *
+ * This is protected by ashmem_mutex.
+ */
 static unsigned long lru_count;
 
-/*
+/**
  * ashmem_mutex - protects the list of and each individual ashmem_area
  *
  * Lock Ordering: ashmex_mutex -> i_mutex -> i_alloc_sem
@@ -105,28 +123,43 @@ static struct kmem_cache *ashmem_range_cachep __read_mostly;
 
 #define PROT_MASK              (PROT_EXEC | PROT_READ | PROT_WRITE)
 
+/**
+ * lru_add() - Adds a range of memory to the LRU list
+ * @range:     The memory range being added.
+ *
+ * The range is first added to the end (tail) of the LRU list.
+ * After this, the size of the range is added to @lru_count
+ */
 static inline void lru_add(struct ashmem_range *range)
 {
        list_add_tail(&range->lru, &ashmem_lru_list);
        lru_count += range_size(range);
 }
 
+/**
+ * lru_del() - Removes a range of memory from the LRU list
+ * @range:     The memory range being removed
+ *
+ * The range is first deleted from the LRU list.
+ * After this, the size of the range is removed from @lru_count
+ */
 static inline void lru_del(struct ashmem_range *range)
 {
        list_del(&range->lru);
        lru_count -= range_size(range);
 }
 
-/*
- * range_alloc - allocate and initialize a new ashmem_range structure
+/**
+ * range_alloc() - Allocates and initializes a new ashmem_range structure
+ * @asma:         The associated ashmem_area
+ * @prev_range:           The previous ashmem_range in the sorted asma->unpinned list
+ * @purged:       Initial purge status (ASMEM_NOT_PURGED or ASHMEM_WAS_PURGED)
+ * @start:        The starting page (inclusive)
+ * @end:          The ending page (inclusive)
  *
- * 'asma' - associated ashmem_area
- * 'prev_range' - the previous ashmem_range in the sorted asma->unpinned list
- * 'purged' - initial purge value (ASMEM_NOT_PURGED or ASHMEM_WAS_PURGED)
- * 'start' - starting page, inclusive
- * 'end' - ending page, inclusive
+ * This function is protected by ashmem_mutex.
  *
- * Caller must hold ashmem_mutex.
+ * Return: 0 if successful, or -ENOMEM if there is an error
  */
 static int range_alloc(struct ashmem_area *asma,
                       struct ashmem_range *prev_range, unsigned int purged,
@@ -151,6 +184,10 @@ static int range_alloc(struct ashmem_area *asma,
        return 0;
 }
 
+/**
+ * range_del() - Deletes and dealloctes an ashmem_range structure
+ * @range:      The associated ashmem_range that has previously been allocated
+ */
 static void range_del(struct ashmem_range *range)
 {
        list_del(&range->unpinned);
@@ -159,10 +196,17 @@ static void range_del(struct ashmem_range *range)
        kmem_cache_free(ashmem_range_cachep, range);
 }
 
-/*
- * range_shrink - shrinks a range
+/**
+ * range_shrink() - Shrinks an ashmem_range
+ * @range:         The associated ashmem_range being shrunk
+ * @start:         The starting byte of the new range
+ * @end:           The ending byte of the new range
  *
- * Caller must hold ashmem_mutex.
+ * This does not modify the data inside the existing range in any way - It
+ * simply shrinks the boundaries of the range.
+ *
+ * Theoretically, with a little tweaking, this could eventually be changed
+ * to range_resize, and expand the lru_count if the new range is larger.
  */
 static inline void range_shrink(struct ashmem_range *range,
                                size_t start, size_t end)
@@ -176,6 +220,16 @@ static inline void range_shrink(struct ashmem_range *range,
                lru_count -= pre - range_size(range);
 }
 
+/**
+ * ashmem_open() - Opens an Anonymous Shared Memory structure
+ * @inode:        The backing file's index node(?)
+ * @file:         The backing file
+ *
+ * Please note that the ashmem_area is not returned by this function - It is
+ * instead written to "file->private_data".
+ *
+ * Return: 0 if successful, or another code if unsuccessful.
+ */
 static int ashmem_open(struct inode *inode, struct file *file)
 {
        struct ashmem_area *asma;
@@ -197,6 +251,14 @@ static int ashmem_open(struct inode *inode, struct file *file)
        return 0;
 }
 
+/**
+ * ashmem_release() - Releases an Anonymous Shared Memory structure
+ * @ignored:         The backing file's Index Node(?) - It is ignored here.
+ * @file:            The backing file
+ *
+ * Return: 0 if successful. If it is anything else, go have a coffee and
+ * try again.
+ */
 static int ashmem_release(struct inode *ignored, struct file *file)
 {
        struct ashmem_area *asma = file->private_data;
@@ -214,6 +276,15 @@ static int ashmem_release(struct inode *ignored, struct file *file)
        return 0;
 }
 
+/**
+ * ashmem_read() - Reads a set of bytes from an Ashmem-enabled file
+ * @file:         The associated backing file.
+ * @buf:          The buffer of data being written to
+ * @len:          The number of bytes being read
+ * @pos:          The position of the first byte to read.
+ *
+ * Return: 0 if successful, or another return code if not.
+ */
 static ssize_t ashmem_read(struct file *file, char __user *buf,
                           size_t len, loff_t *pos)
 {
index 98ac020bf912fb8efd11872c3e992265734f510b..eaec1dab7fe489fbbc9d171a4acdf5f78d765df6 100644 (file)
@@ -1700,7 +1700,8 @@ err_no_context_mgr_node:
                thread->return_error = return_error;
 }
 
-int binder_thread_write(struct binder_proc *proc, struct binder_thread *thread,
+static int binder_thread_write(struct binder_proc *proc,
+                       struct binder_thread *thread,
                        void __user *buffer, size_t size, size_t *consumed)
 {
        uint32_t cmd;
@@ -1773,7 +1774,7 @@ int binder_thread_write(struct binder_proc *proc, struct binder_thread *thread,
                case BC_INCREFS_DONE:
                case BC_ACQUIRE_DONE: {
                        void __user *node_ptr;
-                       void *cookie;
+                       void __user *cookie;
                        struct binder_node *node;
 
                        if (get_user(node_ptr, (void * __user *)ptr))
@@ -2055,8 +2056,8 @@ int binder_thread_write(struct binder_proc *proc, struct binder_thread *thread,
        return 0;
 }
 
-void binder_stat_br(struct binder_proc *proc, struct binder_thread *thread,
-                   uint32_t cmd)
+static void binder_stat_br(struct binder_proc *proc,
+                          struct binder_thread *thread, uint32_t cmd)
 {
        trace_binder_return(cmd);
        if (_IOC_NR(cmd) < ARRAY_SIZE(binder_stats.br)) {
index ec907ab2ff5484fdfb87168b9f87ae9937582d3c..905c7cc9588e85998e6c918c09fb9f2a7884662d 100644 (file)
@@ -31,7 +31,7 @@ struct timed_output_dev {
        int             state;
 };
 
-extern int timed_output_dev_register(struct timed_output_dev *dev);
-extern void timed_output_dev_unregister(struct timed_output_dev *dev);
+int timed_output_dev_register(struct timed_output_dev *dev);
+void timed_output_dev_unregister(struct timed_output_dev *dev);
 
 #endif
index afca010f9db59b0ccc48820cedfabfa2163f2f31..d9fa2bb03e117c8d12e83ca649e8a701efa07441 100644 (file)
@@ -104,7 +104,7 @@ int BcmRDM(void *arg,
        void *buff,
        int len)
 {
-       return InterfaceRDM((struct bcm_interface_adapter*)arg, addr, buff, len);
+       return InterfaceRDM((struct bcm_interface_adapter *)arg, addr, buff, len);
 }
 
 int BcmWRM(void *arg,
index 91a5715964b93727a61ad263bd6745ed5e54ad32..1f5b62b4b5a189dead3f85bbbe4406918df5301e 100644 (file)
@@ -103,7 +103,7 @@ static UCHAR ReadEEPROMStatusRegister(struct bcm_mini_adapter *Adapter)
                }
                if (!(dwRetries%RETRIES_PER_DELAY))
                        udelay(1000);
-               uiStatus = 0 ;
+               uiStatus = 0;
        }
        return uiData;
 } /* ReadEEPROMStatusRegister */
@@ -1095,7 +1095,7 @@ static int BeceemFlashBulkWrite(struct bcm_mini_adapter *Adapter,
                                goto BeceemFlashBulkWrite_EXIT;
                        }
                        uiTemp = uiTemp - 1;
-                       index = index + 1 ;
+                       index = index + 1;
                }
        }
        Adapter->SelectedChip = RESET_CHIP_SELECT;
@@ -1276,7 +1276,7 @@ static int BeceemFlashBulkWriteStatus(struct bcm_mini_adapter *Adapter,
                                goto BeceemFlashBulkWriteStatus_EXIT;
                        }
                        uiTemp = uiTemp - 1;
-                       index = index + 1 ;
+                       index = index + 1;
                }
        }
 
@@ -2831,7 +2831,7 @@ int BcmGetSectionValEndOffset(struct bcm_mini_adapter *Adapter, enum bcm_flash2x
                SectEndOffset = INVALID_OFFSET;
        }
 
-       return SectEndOffset ;
+       return SectEndOffset;
 }
 
 /*
@@ -3358,7 +3358,7 @@ int BcmSetActiveSection(struct bcm_mini_adapter *Adapter, enum bcm_flash2x_secti
        /* struct bcm_dsd_header sDSD = {0};
         * struct bcm_iso_header sISO = {0};
         */
-       int HighestPriDSD = 0 ;
+       int HighestPriDSD = 0;
        int HighestPriISO = 0;
 
        Status = IsSectionWritable(Adapter, eFlash2xSectVal);
@@ -4450,7 +4450,7 @@ int WriteToFlashWithoutSectorErase(struct bcm_mini_adapter *Adapter,
                BcmDoChipSelect(Adapter, uiOffset);
                uiPartOffset = (uiOffset & (FLASH_PART_SIZE - 1)) + GetFlashBaseAddr(Adapter);
 
-               for (i = 0 ; i < uiNumBytes; i += Adapter->ulFlashWriteSize) {
+               for (i = 0; i < uiNumBytes; i += Adapter->ulFlashWriteSize) {
                        if (Adapter->ulFlashWriteSize == BYTE_WRITE_SUPPORT)
                                Status = flashByteWrite(Adapter, uiPartOffset, pcBuff);
                        else
index 2e19f659cd22ff828ceb056dc82bc644156e0913..1d8e61a822fdd25a71c98183098e1e363cec1813 100644 (file)
@@ -345,6 +345,8 @@ void comedi_buf_memcpy_from(struct comedi_async *async, unsigned int offset,
 int comedi_dio_insn_config(struct comedi_device *, struct comedi_subdevice *,
                           struct comedi_insn *, unsigned int *data,
                           unsigned int mask);
+unsigned int comedi_dio_update_state(struct comedi_subdevice *,
+                                    unsigned int *data);
 
 void *comedi_alloc_devpriv(struct comedi_device *, size_t);
 int comedi_alloc_subdevices(struct comedi_device *, int);
index 317a821b7906409a5fef8edd6a40b3360945300e..8f02bf66e20b2002b3b52655919a89f95c0fcad9 100644 (file)
@@ -190,6 +190,28 @@ int comedi_dio_insn_config(struct comedi_device *dev,
 }
 EXPORT_SYMBOL_GPL(comedi_dio_insn_config);
 
+/**
+ * comedi_dio_update_state() - update the internal state of DIO subdevices.
+ * @s: comedi_subdevice struct
+ * @data: the channel mask and bits to update
+ */
+unsigned int comedi_dio_update_state(struct comedi_subdevice *s,
+                                    unsigned int *data)
+{
+       unsigned int chanmask = (s->n_chan < 32) ? ((1 << s->n_chan) - 1)
+                                                : 0xffffffff;
+       unsigned int mask = data[0] & chanmask;
+       unsigned int bits = data[1];
+
+       if (mask) {
+               s->state &= ~mask;
+               s->state |= (bits & mask);
+       }
+
+       return mask;
+}
+EXPORT_SYMBOL_GPL(comedi_dio_update_state);
+
 static int insn_rw_emulate_bits(struct comedi_device *dev,
                                struct comedi_subdevice *s,
                                struct comedi_insn *insn, unsigned int *data)
@@ -285,6 +307,13 @@ static int __comedi_device_postconfig(struct comedi_device *dev)
                if (s->type == COMEDI_SUBD_UNUSED)
                        continue;
 
+               if (s->type == COMEDI_SUBD_DO) {
+                       if (s->n_chan < 32)
+                               s->io_bits = (1 << s->n_chan) - 1;
+                       else
+                               s->io_bits = 0xffffffff;
+               }
+
                if (s->len_chanlist == 0)
                        s->len_chanlist = 1;
 
index 2f070fdbbb1d3b206b6e17f5f10bea0ec6e3a02a..5737bb4c29abf02fd131f6d529f8e6905c86ba61 100644 (file)
@@ -126,30 +126,24 @@ EXPORT_SYMBOL_GPL(subdev_8255_interrupt);
 
 static int subdev_8255_insn(struct comedi_device *dev,
                            struct comedi_subdevice *s,
-                           struct comedi_insn *insn, unsigned int *data)
+                           struct comedi_insn *insn,
+                           unsigned int *data)
 {
        struct subdev_8255_private *spriv = s->private;
        unsigned long iobase = spriv->iobase;
        unsigned int mask;
-       unsigned int bits;
        unsigned int v;
 
-       mask = data[0];
-       bits = data[1];
-
+       mask = comedi_dio_update_state(s, data);
        if (mask) {
-               v = s->state;
-               v &= ~mask;
-               v |= (bits & mask);
-
                if (mask & 0xff)
-                       spriv->io(1, _8255_DATA, v & 0xff, iobase);
+                       spriv->io(1, _8255_DATA, s->state & 0xff, iobase);
                if (mask & 0xff00)
-                       spriv->io(1, _8255_DATA + 1, (v >> 8) & 0xff, iobase);
+                       spriv->io(1, _8255_DATA + 1, (s->state >> 8) & 0xff,
+                                 iobase);
                if (mask & 0xff0000)
-                       spriv->io(1, _8255_DATA + 2, (v >> 16) & 0xff, iobase);
-
-               s->state = v;
+                       spriv->io(1, _8255_DATA + 2, (s->state >> 16) & 0xff,
+                                 iobase);
        }
 
        v = spriv->io(0, _8255_DATA, 0, iobase);
@@ -288,9 +282,6 @@ int subdev_8255_init(struct comedi_device *dev, struct comedi_subdevice *s,
        s->insn_bits    = subdev_8255_insn;
        s->insn_config  = subdev_8255_insn_config;
 
-       s->state        = 0;
-       s->io_bits      = 0;
-
        subdev_8255_do_config(dev, s);
 
        return 0;
index 63dff7729ea893e8e76ce2fdcad61ca50ebb9d45..dc87df032203746418fa7274b36be42c38617d3a 100644 (file)
@@ -204,7 +204,6 @@ static int addi_auto_attach(struct comedi_device *dev,
                s->len_chanlist =
                        devpriv->s_EeParameters.i_NbrDiChannel;
                s->range_table = &range_digital;
-               s->io_bits = 0; /* all bits input */
                s->insn_config = this_board->di_config;
                s->insn_read = this_board->di_read;
                s->insn_write = this_board->di_write;
@@ -223,7 +222,6 @@ static int addi_auto_attach(struct comedi_device *dev,
                s->len_chanlist =
                        devpriv->s_EeParameters.i_NbrDoChannel;
                s->range_table = &range_digital;
-               s->io_bits = 0xf;       /* all bits output */
 
                /* insn_config - for digital output memory */
                s->insn_config = this_board->do_config;
index e3cc429403c08c35df09f02286a1079df039f0c9..84668544f52d79927fa0b664fad3aca6313bd361 100644 (file)
@@ -260,18 +260,13 @@ static int apci1564_do_insn_bits(struct comedi_device *dev,
                                 unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
 
        s->state = inl(devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP +
                        APCI1564_DIGITAL_OP_RW);
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outl(s->state, devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP +
                        APCI1564_DIGITAL_OP_RW);
-       }
 
        data[1] = s->state;
 
index 1449b92403e249ff2e1198dfdcc2dece751105ee..ac6e75d62e6129bf1cca8e817a64ac032c8080fb 100644 (file)
@@ -2175,21 +2175,16 @@ static int apci3120_do_insn_bits(struct comedi_device *dev,
                                 unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-       unsigned int val;
 
-       /* The do channels are bits 7:4 of the do register */
-       val = devpriv->b_DigitalOutputRegister >> 4;
-       if (mask) {
-               val &= ~mask;
-               val |= (bits & mask);
-               devpriv->b_DigitalOutputRegister = val << 4;
+       if (comedi_dio_update_state(s, data)) {
+               /* The do channels are bits 7:4 of the do register */
+               devpriv->b_DigitalOutputRegister = s->state << 4;
 
-               outb(val << 4, devpriv->iobase + APCI3120_DIGITAL_OUTPUT);
+               outb(devpriv->b_DigitalOutputRegister,
+                    devpriv->iobase + APCI3120_DIGITAL_OUTPUT);
        }
 
-       data[1] = val;
+       data[1] = s->state;
 
        return insn->n;
 }
index 32dce0329fd5a1ab10d8a0c64ff162c538858812..dc73d4d348ed4fa9eb94635e2614e18102939de5 100644 (file)
@@ -623,16 +623,11 @@ static int apci3200_do_insn_bits(struct comedi_device *dev,
                                 unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
 
        s->state = inl(devpriv->i_IobaseAddon) & 0xf;
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outl(s->state, devpriv->i_IobaseAddon);
-       }
 
        data[1] = s->state;
 
index 08674c18cf429052648b932c59ea7792bd44a47d..9d1b1425c60b7c8ec41f574df4f733687820c688 100644 (file)
@@ -90,16 +90,10 @@ static int apci1516_do_insn_bits(struct comedi_device *dev,
                                 struct comedi_insn *insn,
                                 unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
        s->state = inw(dev->iobase + APCI1516_DO_REG);
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + APCI1516_DO_REG);
-       }
 
        data[1] = s->state;
 
index 96523744b8de57cc5203d7c7667b60f67f4b647c..5ee204bcbeef3a5577547c34d04c24f378b87464 100644 (file)
@@ -87,17 +87,8 @@ static int apci16xx_dio_insn_bits(struct comedi_device *dev,
                                  struct comedi_insn *insn,
                                  unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       /* Only update the channels configured as outputs */
-       mask &= s->io_bits;
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                outl(s->state, dev->iobase + APCI16XX_OUT_REG(s->index));
-       }
 
        data[1] = inl(dev->iobase + APCI16XX_IN_REG(s->index));
 
index 6b0ea16ff5467eeb3da5c76a9c8a9f2c9c705faa..c77ee8732d38fe158f974a29ff5f0f2921afc609 100644 (file)
@@ -57,16 +57,10 @@ static int apci2032_do_insn_bits(struct comedi_device *dev,
                                 struct comedi_insn *insn,
                                 unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
        s->state = inl(dev->iobase + APCI2032_DO_REG);
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outl(s->state, dev->iobase + APCI2032_DO_REG);
-       }
 
        data[1] = s->state;
 
index 92ac8ece8494b1e1998ed545ea62f89fb9d793c5..7fb32e778d8ba5742565c3aaf508557dca385807 100644 (file)
@@ -50,16 +50,10 @@ static int apci2200_do_insn_bits(struct comedi_device *dev,
                                 struct comedi_insn *insn,
                                 unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
        s->state = inw(dev->iobase + APCI2200_DO_REG);
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + APCI2200_DO_REG);
-       }
 
        data[1] = s->state;
 
index d804957018aba8db2c0e95bd4f9d29a33ce8dfa0..67d09e8afb2efdbcf8c21677f884a135c59a5e8b 100644 (file)
@@ -164,7 +164,6 @@ static int apci3120_auto_attach(struct comedi_device *dev,
        s->maxdata = 1;
        s->len_chanlist = this_board->i_NbrDiChannel;
        s->range_table = &range_digital;
-       s->io_bits = 0; /* all bits input */
        s->insn_bits = apci3120_di_insn_bits;
 
        /*  Allocate and Initialise DO Subdevice Structures */
@@ -176,7 +175,6 @@ static int apci3120_auto_attach(struct comedi_device *dev,
        s->maxdata = this_board->i_DoMaxdata;
        s->len_chanlist = this_board->i_NbrDoChannel;
        s->range_table = &range_digital;
-       s->io_bits = 0xf;       /* all bits output */
        s->insn_bits = apci3120_do_insn_bits;
 
        /*  Allocate and Initialise Timer Subdevice Structures */
index d9650ffb7d2f3e99603535b1cf091df0db8b8b54..6138440b919e86dc94ea6c80f06c6573c079bb0b 100644 (file)
@@ -161,16 +161,10 @@ static int apci3501_do_insn_bits(struct comedi_device *dev,
                                 struct comedi_insn *insn,
                                 unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
        s->state = inl(dev->iobase + APCI3501_DO_REG);
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outl(s->state, dev->iobase + APCI3501_DO_REG);
-       }
 
        data[1] = s->state;
 
index cf5dd10eaf91daa71cb75ced4270c450d49d31de..761cbf8f964b3c69b96c84baab5d9c21d7829454 100644 (file)
@@ -664,16 +664,10 @@ static int apci3xxx_do_insn_bits(struct comedi_device *dev,
                                 struct comedi_insn *insn,
                                 unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
        s->state = inl(dev->iobase + 48) & 0xf;
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outl(s->state, dev->iobase + 48);
-       }
 
        data[1] = s->state;
 
@@ -717,16 +711,11 @@ static int apci3xxx_dio_insn_bits(struct comedi_device *dev,
                                  struct comedi_insn *insn,
                                  unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
+       unsigned int mask;
        unsigned int val;
 
-       /* only update output channels */
-       mask &= s->io_bits;
+       mask = comedi_dio_update_state(s, data);
        if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
                if (mask & 0xff)
                        outl(s->state & 0xff, dev->iobase + 80);
                if (mask & 0xff0000)
index a67ad57cefcb906c108f044cd2c3c069bc788418..60f1f5c9532d70d87def20edcf5cfc9ce3d80e95 100644 (file)
@@ -141,15 +141,8 @@ static int pci6208_do_insn_bits(struct comedi_device *dev,
                                struct comedi_insn *insn,
                                unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + PCI6208_DIO);
-       }
 
        data[1] = s->state;
 
@@ -221,7 +214,6 @@ static int pci6208_auto_attach(struct comedi_device *dev,
        val = inw(dev->iobase + PCI6208_DIO);
        val = (val & PCI6208_DIO_DO_MASK) >> PCI6208_DIO_DO_SHIFT;
        s->state        = val;
-       s->io_bits      = 0x0f;
 
        dev_info(dev->class_dev, "%s: %s, I/O base=0x%04lx\n",
                dev->driver->driver_name, dev->board_name, dev->iobase);
index 81b7203f824f15e7947b1f5783184171cdf10fc3..5617f5ca384a0bd8fd463c85dca28357bb025a2a 100644 (file)
@@ -112,21 +112,10 @@ static int adl_pci7x3x_do_insn_bits(struct comedi_device *dev,
                                    unsigned int *data)
 {
        unsigned long reg = (unsigned long)s->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                outl(s->state, dev->iobase + reg);
-       }
 
-       /*
-        * NOTE: The output register is not readable.
-        * This returned state will not be correct until all the
-        * outputs have been updated.
-        */
        data[1] = s->state;
 
        return insn->n;
index 78cea193504f3e772413298b25dca9bacb45a39b..89ca5078e8b36809a70903d369f0f2226ec1bef8 100644 (file)
@@ -813,15 +813,8 @@ static int pci9111_do_insn_bits(struct comedi_device *dev,
                                struct comedi_insn *insn,
                                unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + PCI9111_DIO_REG);
-       }
 
        data[1] = s->state;
 
index 22196ada0362200b12f83d89e9bed0dfa208e83d..f50dbea6724051cf3d143f8a7e115af98b907365 100644 (file)
@@ -671,13 +671,12 @@ static int pci9118_insn_bits_di(struct comedi_device *dev,
 
 static int pci9118_insn_bits_do(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data))
                outl(s->state & 0x0f, dev->iobase + PCI9118_DO);
-       }
+
        data[1] = s->state;
 
        return insn->n;
@@ -2075,7 +2074,6 @@ static int pci9118_common_attach(struct comedi_device *dev, int disable_irq,
        s->maxdata = 1;
        s->len_chanlist = 4;
        s->range_table = &range_digital;
-       s->io_bits = 0;         /* all bits input */
        s->insn_bits = pci9118_insn_bits_di;
 
        s = &dev->subdevices[3];
@@ -2085,7 +2083,6 @@ static int pci9118_common_attach(struct comedi_device *dev, int disable_irq,
        s->maxdata = 1;
        s->len_chanlist = 4;
        s->range_table = &range_digital;
-       s->io_bits = 0xf;       /* all bits output */
        s->insn_bits = pci9118_insn_bits_do;
 
        devpriv->valid = 1;
index cdf5ba26c5904fdd93db071dc59c51addca83f7a..8150a67cd1fbf99927db2220dbb40bb0847c46b1 100644 (file)
@@ -119,7 +119,6 @@ struct adq12b_private {
        int differential;       /* option 3 of comedi_config */
        int last_channel;
        int last_range;
-       unsigned int digital_state;
 };
 
 /*
@@ -186,23 +185,25 @@ static int adq12b_di_insn_bits(struct comedi_device *dev,
 
 static int adq12b_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
-       struct adq12b_private *devpriv = dev->private;
-       int channel;
-
-       for (channel = 0; channel < 8; channel++)
-               if (((data[0] >> channel) & 0x01) != 0)
-                       outb((((data[1] >> channel) & 0x01) << 3) | channel,
-                            dev->iobase + ADQ12B_OUTBR);
-
-       /* store information to retrieve when asked for reading */
-       if (data[0]) {
-               devpriv->digital_state &= ~data[0];
-               devpriv->digital_state |= (data[0] & data[1]);
+       unsigned int mask;
+       unsigned int chan;
+       unsigned int val;
+
+       mask = comedi_dio_update_state(s, data);
+       if (mask) {
+               for (chan = 0; chan < 8; chan++) {
+                       if ((mask >> chan) & 0x01) {
+                               val = (s->state >> chan) & 0x01;
+                               outb((val << 3) | chan,
+                                    dev->iobase + ADQ12B_OUTBR);
+                       }
+               }
        }
 
-       data[1] = devpriv->digital_state;
+       data[1] = s->state;
 
        return insn->n;
 }
@@ -223,7 +224,6 @@ static int adq12b_attach(struct comedi_device *dev, struct comedi_devconfig *it)
 
        devpriv->unipolar = it->options[1];
        devpriv->differential = it->options[2];
-       devpriv->digital_state = 0;
        /*
         * initialize channel and range to -1 so we make sure we
         * always write at least once to the CTREG in the instruction
index f84df46d326aeededa20d574bdcb8ae5b749a53f..3dacfaeca4cbb16fcdab0c7fd7a079d50cee44f0 100644 (file)
@@ -544,18 +544,14 @@ static int pci171x_insn_bits_di(struct comedi_device *dev,
        return insn->n;
 }
 
-/*
-==============================================================================
-*/
 static int pci171x_insn_bits_do(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + PCI171x_DO);
-       }
+
        data[1] = s->state;
 
        return insn->n;
@@ -1320,7 +1316,6 @@ static int pci1710_auto_attach(struct comedi_device *dev,
                s->maxdata = 1;
                s->len_chanlist = this_board->n_dichan;
                s->range_table = &range_digital;
-               s->io_bits = 0; /* all bits input */
                s->insn_bits = pci171x_insn_bits_di;
                subdev++;
        }
@@ -1333,9 +1328,6 @@ static int pci1710_auto_attach(struct comedi_device *dev,
                s->maxdata = 1;
                s->len_chanlist = this_board->n_dochan;
                s->range_table = &range_digital;
-               /* all bits output */
-               s->io_bits = (1 << this_board->n_dochan) - 1;
-               s->state = 0;
                s->insn_bits = pci171x_insn_bits_do;
                subdev++;
        }
index b793d6987b843366654ac9935b0546ade9230f10..71321f75d0cdefb483e96f79447181f4633f97a0 100644 (file)
@@ -205,19 +205,16 @@ static int pci1723_dio_insn_config(struct comedi_device *dev,
        return insn->n;
 }
 
-/*
-  digital i/o bits read/write
-*/
 static int pci1723_dio_insn_bits(struct comedi_device *dev,
                                 struct comedi_subdevice *s,
-                                struct comedi_insn *insn, unsigned int *data)
+                                struct comedi_insn *insn,
+                                unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + PCI1723_WRITE_DIGITAL_OUTPUT_CMD);
-       }
+
        data[1] = inw(dev->iobase + PCI1723_READ_DIGITAL_INPUT_DATA);
+
        return insn->n;
 }
 
index f091fa0d304df6d54da515db639804faeb125a43..6bac665261f847c750299a9979bb140d7c83784c 100644 (file)
@@ -448,45 +448,39 @@ static int pci_dio_insn_bits_di_w(struct comedi_device *dev,
        return insn->n;
 }
 
-/*
-==============================================================================
-*/
 static int pci_dio_insn_bits_do_b(struct comedi_device *dev,
                                  struct comedi_subdevice *s,
-                                 struct comedi_insn *insn, unsigned int *data)
+                                 struct comedi_insn *insn,
+                                 unsigned int *data)
 {
        const struct diosubd_data *d = (const struct diosubd_data *)s->private;
        int i;
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data)) {
                for (i = 0; i < d->regs; i++)
                        outb((s->state >> (8 * i)) & 0xff,
                             dev->iobase + d->addr + i);
        }
+
        data[1] = s->state;
 
        return insn->n;
 }
 
-/*
-==============================================================================
-*/
 static int pci_dio_insn_bits_do_w(struct comedi_device *dev,
                                  struct comedi_subdevice *s,
-                                 struct comedi_insn *insn, unsigned int *data)
+                                 struct comedi_insn *insn,
+                                 unsigned int *data)
 {
        const struct diosubd_data *d = (const struct diosubd_data *)s->private;
        int i;
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data)) {
                for (i = 0; i < d->regs; i++)
                        outw((s->state >> (16 * i)) & 0xffff,
                             dev->iobase + d->addr + 2 * i);
        }
+
        data[1] = s->state;
 
        return insn->n;
@@ -641,12 +635,10 @@ static int pci1760_insn_bits_di(struct comedi_device *dev,
        return insn->n;
 }
 
-/*
-==============================================================================
-*/
 static int pci1760_insn_bits_do(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
        int ret;
        unsigned char omb[4] = {
@@ -657,14 +649,13 @@ static int pci1760_insn_bits_do(struct comedi_device *dev,
        };
        unsigned char imb[4];
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data)) {
                omb[0] = s->state;
                ret = pci1760_mbxrequest(dev, omb, imb);
                if (!ret)
                        return ret;
        }
+
        data[1] = s->state;
 
        return insn->n;
index afe87cc897612c0508f0924088b65452533ad052..22b3dda135ff23a9b7ff351bba8c578227e90353 100644 (file)
@@ -45,9 +45,7 @@ static int aio_iiro_16_dio_insn_bits_write(struct comedi_device *dev,
                                           struct comedi_insn *insn,
                                           unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
+       if (comedi_dio_update_state(s, data)) {
                outb(s->state & 0xff, dev->iobase + AIO_IIRO_16_RELAY_0_7);
                outb((s->state >> 8) & 0xff,
                     dev->iobase + AIO_IIRO_16_RELAY_8_15);
index c1f723e8614613826d9753e07ec6af5044f925a7..2e4bf284d52c08e5edc7fbd6221563b01cd92e70 100644 (file)
@@ -941,31 +941,34 @@ static void dio200_subdev_8255_set_dir(struct comedi_device *dev,
        dio200_write8(dev, subpriv->ofs + 3, config);
 }
 
-/*
- * Handle 'insn_bits' for an '8255' DIO subdevice.
- */
 static int dio200_subdev_8255_bits(struct comedi_device *dev,
                                   struct comedi_subdevice *s,
-                                  struct comedi_insn *insn, unsigned int *data)
+                                  struct comedi_insn *insn,
+                                  unsigned int *data)
 {
        struct dio200_subdev_8255 *subpriv = s->private;
+       unsigned int mask;
+       unsigned int val;
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
-               if (data[0] & 0xff)
+       mask = comedi_dio_update_state(s, data);
+       if (mask) {
+               if (mask & 0xff)
                        dio200_write8(dev, subpriv->ofs, s->state & 0xff);
-               if (data[0] & 0xff00)
+               if (mask & 0xff00)
                        dio200_write8(dev, subpriv->ofs + 1,
                                      (s->state >> 8) & 0xff);
-               if (data[0] & 0xff0000)
+               if (mask & 0xff0000)
                        dio200_write8(dev, subpriv->ofs + 2,
                                      (s->state >> 16) & 0xff);
        }
-       data[1] = dio200_read8(dev, subpriv->ofs);
-       data[1] |= dio200_read8(dev, subpriv->ofs + 1) << 8;
-       data[1] |= dio200_read8(dev, subpriv->ofs + 2) << 16;
-       return 2;
+
+       val = dio200_read8(dev, subpriv->ofs);
+       val |= dio200_read8(dev, subpriv->ofs + 1) << 8;
+       val |= dio200_read8(dev, subpriv->ofs + 2) << 16;
+
+       data[1] = val;
+
+       return insn->n;
 }
 
 /*
@@ -1022,8 +1025,6 @@ static int dio200_subdev_8255_init(struct comedi_device *dev,
        s->maxdata = 1;
        s->insn_bits = dio200_subdev_8255_bits;
        s->insn_config = dio200_subdev_8255_config;
-       s->state = 0;
-       s->io_bits = 0;
        dio200_subdev_8255_set_dir(dev, s);
        return 0;
 }
index e7108045f5535969a695622697060a46c47a7e8b..5b4b5ab34e2e930869b854f0f7b4b2056b2dc526 100644 (file)
@@ -57,17 +57,16 @@ static const struct pc263_board pc263_boards[] = {
 
 static int pc263_do_insn_bits(struct comedi_device *dev,
                              struct comedi_subdevice *s,
-                             struct comedi_insn *insn, unsigned int *data)
+                             struct comedi_insn *insn,
+                             unsigned int *data)
 {
-       /* The insn data is a mask in data[0] and the new data
-        * in data[1], each channel cooresponding to a bit. */
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
-               /* Write out the new digital output lines */
-               outb(s->state & 0xFF, dev->iobase);
-               outb(s->state >> 8, dev->iobase + 1);
+       if (comedi_dio_update_state(s, data)) {
+               outb(s->state & 0xff, dev->iobase);
+               outb((s->state >> 8) & 0xff, dev->iobase + 1);
        }
+
+       data[1] = s->state;
+
        return insn->n;
 }
 
index 145bb48f618e9ab1516a8881f2c0f13c4bb795c2..4bd4ef8e88cd05dbf6453fb88f988196c5eb5174 100644 (file)
@@ -44,17 +44,16 @@ The state of the outputs can be read.
 
 static int pci263_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
-       /* The insn data is a mask in data[0] and the new data
-        * in data[1], each channel cooresponding to a bit. */
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
-               /* Write out the new digital output lines */
-               outb(s->state & 0xFF, dev->iobase);
-               outb(s->state >> 8, dev->iobase + 1);
+       if (comedi_dio_update_state(s, data)) {
+               outb(s->state & 0xff, dev->iobase);
+               outb((s->state >> 8) & 0xff, dev->iobase + 1);
        }
+
+       data[1] = s->state;
+
        return insn->n;
 }
 
index 0ce93da70847c566fd328ae21ae80f258fade0f1..3e072955ea79d4b808c4137da8154d97061f3c32 100644 (file)
@@ -325,14 +325,11 @@ static int das16cs_ao_rinsn(struct comedi_device *dev,
 
 static int das16cs_dio_insn_bits(struct comedi_device *dev,
                                 struct comedi_subdevice *s,
-                                struct comedi_insn *insn, unsigned int *data)
+                                struct comedi_insn *insn,
+                                unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
-
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + DAS16CS_DIO);
-       }
 
        data[1] = inw(dev->iobase + DAS16CS_DIO);
 
index 388dbd7a5d27f2fa1c93b24f4f2342558f4b0b8c..e49743aed65de9987862bbbb9575db9a41cd14a7 100644 (file)
@@ -3490,18 +3490,15 @@ static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
        return insn->n;
 }
 
-static int do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
-                   struct comedi_insn *insn, unsigned int *data)
+static int do_wbits(struct comedi_device *dev,
+                   struct comedi_subdevice *s,
+                   struct comedi_insn *insn,
+                   unsigned int *data)
 {
        struct pcidas64_private *devpriv = dev->private;
 
-       data[0] &= 0xf;
-       /*  zero bits we are going to change */
-       s->state &= ~data[0];
-       /*  set new bits */
-       s->state |= data[0] & data[1];
-
-       writeb(s->state, devpriv->dio_counter_iobase + DO_REG);
+       if (comedi_dio_update_state(s, data))
+               writeb(s->state, devpriv->dio_counter_iobase + DO_REG);
 
        data[1] = s->state;
 
@@ -3526,14 +3523,14 @@ static int dio_60xx_config_insn(struct comedi_device *dev,
        return insn->n;
 }
 
-static int dio_60xx_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
-                         struct comedi_insn *insn, unsigned int *data)
+static int dio_60xx_wbits(struct comedi_device *dev,
+                         struct comedi_subdevice *s,
+                         struct comedi_insn *insn,
+                         unsigned int *data)
 {
        struct pcidas64_private *devpriv = dev->private;
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data)) {
                writeb(s->state,
                       devpriv->dio_counter_iobase + DIO_DATA_60XX_REG);
        }
index f28a15f0274e44819040d7322d046f43aab03c05..9de81c7712fb9103ae9054f54b37abf4dfa2c0b8 100644 (file)
 /*
-    comedi/drivers/comedi_parport.c
-    hardware driver for standard parallel port
-
-    COMEDI - Linux Control and Measurement Device Interface
-    Copyright (C) 1998,2001 David A. Schleef <ds@schleef.org>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-*/
-/*
-Driver: comedi_parport
-Description: Standard PC parallel port
-Author: ds
-Status: works in immediate mode
-Devices: [standard] parallel port (comedi_parport)
-Updated: Tue, 30 Apr 2002 21:11:45 -0700
-
-A cheap and easy way to get a few more digital I/O lines.  Steal
-additional parallel ports from old computers or your neighbors'
-computers.
-
-Option list:
- 0: I/O port base for the parallel port.
- 1: IRQ
-
-Parallel Port Lines:
-
-pin     subdev  chan    aka
----     ------  ----    ---
-1       2       0       strobe
-2       0       0       data 0
-3       0       1       data 1
-4       0       2       data 2
-5       0       3       data 3
-6       0       4       data 4
-7       0       5       data 5
-8       0       6       data 6
-9       0       7       data 7
-10      1       3       acknowledge
-11      1       4       busy
-12      1       2       output
-13      1       1       printer selected
-14      2       1       auto LF
-15      1       0       error
-16      2       2       init
-17      2       3       select printer
-18-25   ground
-
-Notes:
-
-Subdevices 0 is digital I/O, subdevice 1 is digital input, and
-subdevice 2 is digital output.  Unlike other Comedi devices,
-subdevice 0 defaults to output.
-
-Pins 13 and 14 are inverted once by Comedi and once by the
-hardware, thus cancelling the effect.
-
-Pin 1 is a strobe, thus acts like one.  There's no way in software
-to change this, at least on a standard parallel port.
-
-Subdevice 3 pretends to be a digital input subdevice, but it always
-returns 0 when read.  However, if you run a command with
-scan_begin_src=TRIG_EXT, it uses pin 10 as a external triggering
-pin, which can be used to wake up tasks.
-*/
+ * comedi_parport.c
+ * Comedi driver for standard parallel port
+ *
+ * For more information see:
+ *     http://retired.beyondlogic.org/spp/parallel.htm
+ *
+ * COMEDI - Linux Control and Measurement Device Interface
+ * Copyright (C) 1998,2001 David A. Schleef <ds@schleef.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
 /*
-   see http://www.beyondlogic.org/ for information.
-   or http://www.linux-magazin.de/ausgabe/1999/10/IO/io.html
+ * Driver: comedi_parport
+ * Description: Standard PC parallel port
+ * Author: ds
+ * Status: works in immediate mode
+ * Devices: (standard) parallel port [comedi_parport]
+ * Updated: Tue, 30 Apr 2002 21:11:45 -0700
+ *
+ * A cheap and easy way to get a few more digital I/O lines. Steal
+ * additional parallel ports from old computers or your neighbors'
+ * computers.
+ *
+ * Option list:
+ *   0: I/O port base for the parallel port.
+ *   1: IRQ (optional)
+ *
+ * Parallel Port Lines:
+ *
+ *      pin   subdev  chan  type  name
+ *     -----  ------  ----  ----  --------------
+ *       1      2       0    DO   strobe
+ *       2      0       0    DIO  data 0
+ *       3      0       1    DIO  data 1
+ *       4      0       2    DIO  data 2
+ *       5      0       3    DIO  data 3
+ *       6      0       4    DIO  data 4
+ *       7      0       5    DIO  data 5
+ *       8      0       6    DIO  data 6
+ *       9      0       7    DIO  data 7
+ *      10      1       3    DI   ack
+ *      11      1       4    DI   busy
+ *      12      1       2    DI   paper out
+ *      13      1       1    DI   select in
+ *      14      2       1    DO   auto LF
+ *      15      1       0    DI   error
+ *      16      2       2    DO   init
+ *      17      2       3    DO   select printer
+ *     18-25                      ground
+ *
+ * When an IRQ is configured subdevice 3 pretends to be a digital
+ * input subdevice, but it always returns 0 when read. However, if
+ * you run a command with scan_begin_src=TRIG_EXT, it uses pin 10
+ * as a external trigger, which can be used to wake up tasks.
  */
 
 #include <linux/module.h>
-#include "../comedidev.h"
 #include <linux/interrupt.h>
 
-#include "comedi_fc.h"
-
-#define PARPORT_SIZE 3
-
-#define PARPORT_A 0
-#define PARPORT_B 1
-#define PARPORT_C 2
+#include "../comedidev.h"
 
-struct parport_private {
-       unsigned int a_data;
-       unsigned int c_data;
-       int enable_irq;
-};
+#include "comedi_fc.h"
 
-static int parport_insn_a(struct comedi_device *dev, struct comedi_subdevice *s,
-                         struct comedi_insn *insn, unsigned int *data)
+/*
+ * Register map
+ */
+#define PARPORT_DATA_REG       0x00
+#define PARPORT_STATUS_REG     0x01
+#define PARPORT_CTRL_REG       0x02
+#define PARPORT_CTRL_IRQ_ENA   (1 << 4)
+#define PARPORT_CTRL_BIDIR_ENA (1 << 5)
+
+static int parport_data_reg_insn_bits(struct comedi_device *dev,
+                                     struct comedi_subdevice *s,
+                                     struct comedi_insn *insn,
+                                     unsigned int *data)
 {
-       struct parport_private *devpriv = dev->private;
-
-       if (data[0]) {
-               devpriv->a_data &= ~data[0];
-               devpriv->a_data |= (data[0] & data[1]);
-
-               outb(devpriv->a_data, dev->iobase + PARPORT_A);
-       }
+       if (comedi_dio_update_state(s, data))
+               outb(s->state, dev->iobase + PARPORT_DATA_REG);
 
-       data[1] = inb(dev->iobase + PARPORT_A);
+       data[1] = inb(dev->iobase + PARPORT_DATA_REG);
 
        return insn->n;
 }
 
-static int parport_insn_config_a(struct comedi_device *dev,
-                                struct comedi_subdevice *s,
-                                struct comedi_insn *insn, unsigned int *data)
+static int parport_data_reg_insn_config(struct comedi_device *dev,
+                                       struct comedi_subdevice *s,
+                                       struct comedi_insn *insn,
+                                       unsigned int *data)
 {
-       struct parport_private *devpriv = dev->private;
-
-       if (data[0]) {
-               s->io_bits = 0xff;
-               devpriv->c_data &= ~(1 << 5);
-       } else {
-               s->io_bits = 0;
-               devpriv->c_data |= (1 << 5);
-       }
-       outb(devpriv->c_data, dev->iobase + PARPORT_C);
+       unsigned int ctrl;
+       int ret;
+
+       ret = comedi_dio_insn_config(dev, s, insn, data, 0xff);
+       if (ret)
+               return ret;
+
+       ctrl = inb(dev->iobase + PARPORT_CTRL_REG);
+       if (s->io_bits)
+               ctrl &= ~PARPORT_CTRL_BIDIR_ENA;
+       else
+               ctrl |= PARPORT_CTRL_BIDIR_ENA;
+       outb(ctrl, dev->iobase + PARPORT_CTRL_REG);
 
-       return 1;
+       return insn->n;
 }
 
-static int parport_insn_b(struct comedi_device *dev, struct comedi_subdevice *s,
-                         struct comedi_insn *insn, unsigned int *data)
+static int parport_status_reg_insn_bits(struct comedi_device *dev,
+                                       struct comedi_subdevice *s,
+                                       struct comedi_insn *insn,
+                                       unsigned int *data)
 {
-       if (data[0]) {
-               /* should writes be ignored? */
-               /* anyone??? */
-       }
-
-       data[1] = (inb(dev->iobase + PARPORT_B) >> 3);
+       data[1] = inb(dev->iobase + PARPORT_STATUS_REG) >> 3;
 
        return insn->n;
 }
 
-static int parport_insn_c(struct comedi_device *dev, struct comedi_subdevice *s,
-                         struct comedi_insn *insn, unsigned int *data)
+static int parport_ctrl_reg_insn_bits(struct comedi_device *dev,
+                                     struct comedi_subdevice *s,
+                                     struct comedi_insn *insn,
+                                     unsigned int *data)
 {
-       struct parport_private *devpriv = dev->private;
-
-       data[0] &= 0x0f;
-       if (data[0]) {
-               devpriv->c_data &= ~data[0];
-               devpriv->c_data |= (data[0] & data[1]);
+       unsigned int ctrl;
 
-               outb(devpriv->c_data, dev->iobase + PARPORT_C);
+       if (comedi_dio_update_state(s, data)) {
+               ctrl = inb(dev->iobase + PARPORT_CTRL_REG);
+               ctrl &= (PARPORT_CTRL_IRQ_ENA | PARPORT_CTRL_BIDIR_ENA);
+               ctrl |= s->state;
+               outb(ctrl, dev->iobase + PARPORT_CTRL_REG);
        }
 
-       data[1] = devpriv->c_data & 0xf;
+       data[1] = s->state;
 
        return insn->n;
 }
 
-static int parport_intr_insn(struct comedi_device *dev,
-                            struct comedi_subdevice *s,
-                            struct comedi_insn *insn, unsigned int *data)
+static int parport_intr_insn_bits(struct comedi_device *dev,
+                                 struct comedi_subdevice *s,
+                                 struct comedi_insn *insn,
+                                 unsigned int *data)
 {
        data[1] = 0;
        return insn->n;
@@ -213,12 +198,11 @@ static int parport_intr_cmdtest(struct comedi_device *dev,
 static int parport_intr_cmd(struct comedi_device *dev,
                            struct comedi_subdevice *s)
 {
-       struct parport_private *devpriv = dev->private;
+       unsigned int ctrl;
 
-       devpriv->c_data |= 0x10;
-       outb(devpriv->c_data, dev->iobase + PARPORT_C);
-
-       devpriv->enable_irq = 1;
+       ctrl = inb(dev->iobase + PARPORT_CTRL_REG);
+       ctrl |= PARPORT_CTRL_IRQ_ENA;
+       outb(ctrl, dev->iobase + PARPORT_CTRL_REG);
 
        return 0;
 }
@@ -226,12 +210,11 @@ static int parport_intr_cmd(struct comedi_device *dev,
 static int parport_intr_cancel(struct comedi_device *dev,
                               struct comedi_subdevice *s)
 {
-       struct parport_private *devpriv = dev->private;
-
-       devpriv->c_data &= ~0x10;
-       outb(devpriv->c_data, dev->iobase + PARPORT_C);
+       unsigned int ctrl;
 
-       devpriv->enable_irq = 0;
+       ctrl = inb(dev->iobase + PARPORT_CTRL_REG);
+       ctrl &= ~PARPORT_CTRL_IRQ_ENA;
+       outb(ctrl, dev->iobase + PARPORT_CTRL_REG);
 
        return 0;
 }
@@ -239,10 +222,11 @@ static int parport_intr_cancel(struct comedi_device *dev,
 static irqreturn_t parport_interrupt(int irq, void *d)
 {
        struct comedi_device *dev = d;
-       struct parport_private *devpriv = dev->private;
-       struct comedi_subdevice *s = &dev->subdevices[3];
+       struct comedi_subdevice *s = dev->read_subdev;
+       unsigned int ctrl;
 
-       if (!devpriv->enable_irq)
+       ctrl = inb(dev->iobase + PARPORT_CTRL_REG);
+       if (!(ctrl & PARPORT_CTRL_IRQ_ENA))
                return IRQ_NONE;
 
        comedi_buf_put(s->async, 0);
@@ -255,79 +239,69 @@ static irqreturn_t parport_interrupt(int irq, void *d)
 static int parport_attach(struct comedi_device *dev,
                          struct comedi_devconfig *it)
 {
-       struct parport_private *devpriv;
        struct comedi_subdevice *s;
-       unsigned int irq;
        int ret;
 
-       ret = comedi_request_region(dev, it->options[0], PARPORT_SIZE);
+       ret = comedi_request_region(dev, it->options[0], 0x03);
        if (ret)
                return ret;
 
-       irq = it->options[1];
-       if (irq) {
-               ret = request_irq(irq, parport_interrupt, 0, dev->board_name,
-                                 dev);
-               if (ret < 0) {
-                       dev_err(dev->class_dev, "irq not available\n");
-                       return -EINVAL;
-               }
-               dev->irq = irq;
+       if (it->options[1]) {
+               ret = request_irq(it->options[1], parport_interrupt, 0,
+                                 dev->board_name, dev);
+               if (ret == 0)
+                       dev->irq = it->options[1];
        }
 
-       ret = comedi_alloc_subdevices(dev, 4);
+       ret = comedi_alloc_subdevices(dev, dev->irq ? 4 : 3);
        if (ret)
                return ret;
 
-       devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
-       if (!devpriv)
-               return -ENOMEM;
-
+       /* Digial I/O subdevice - Parallel port DATA register */
        s = &dev->subdevices[0];
-       s->type = COMEDI_SUBD_DIO;
-       s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
-       s->n_chan = 8;
-       s->maxdata = 1;
-       s->range_table = &range_digital;
-       s->insn_bits = parport_insn_a;
-       s->insn_config = parport_insn_config_a;
-
+       s->type         = COMEDI_SUBD_DIO;
+       s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
+       s->n_chan       = 8;
+       s->maxdata      = 1;
+       s->range_table  = &range_digital;
+       s->insn_bits    = parport_data_reg_insn_bits;
+       s->insn_config  = parport_data_reg_insn_config;
+
+       /* Digial Input subdevice - Parallel port STATUS register */
        s = &dev->subdevices[1];
-       s->type = COMEDI_SUBD_DI;
-       s->subdev_flags = SDF_READABLE;
-       s->n_chan = 5;
-       s->maxdata = 1;
-       s->range_table = &range_digital;
-       s->insn_bits = parport_insn_b;
-
+       s->type         = COMEDI_SUBD_DI;
+       s->subdev_flags = SDF_READABLE;
+       s->n_chan       = 5;
+       s->maxdata      = 1;
+       s->range_table  = &range_digital;
+       s->insn_bits    = parport_status_reg_insn_bits;
+
+       /* Digial Output subdevice - Parallel port CONTROL register */
        s = &dev->subdevices[2];
-       s->type = COMEDI_SUBD_DO;
-       s->subdev_flags = SDF_WRITABLE;
-       s->n_chan = 4;
-       s->maxdata = 1;
-       s->range_table = &range_digital;
-       s->insn_bits = parport_insn_c;
-
-       s = &dev->subdevices[3];
-       if (irq) {
+       s->type         = COMEDI_SUBD_DO;
+       s->subdev_flags = SDF_WRITABLE;
+       s->n_chan       = 4;
+       s->maxdata      = 1;
+       s->range_table  = &range_digital;
+       s->insn_bits    = parport_ctrl_reg_insn_bits;
+
+       if (dev->irq) {
+               /* Digial Input subdevice - Interrupt support */
+               s = &dev->subdevices[3];
                dev->read_subdev = s;
-               s->type = COMEDI_SUBD_DI;
-               s->subdev_flags = SDF_READABLE | SDF_CMD_READ;
-               s->n_chan = 1;
-               s->maxdata = 1;
-               s->range_table = &range_digital;
-               s->insn_bits = parport_intr_insn;
-               s->do_cmdtest = parport_intr_cmdtest;
-               s->do_cmd = parport_intr_cmd;
-               s->cancel = parport_intr_cancel;
-       } else {
-               s->type = COMEDI_SUBD_UNUSED;
+               s->type         = COMEDI_SUBD_DI;
+               s->subdev_flags = SDF_READABLE | SDF_CMD_READ;
+               s->n_chan       = 1;
+               s->maxdata      = 1;
+               s->range_table  = &range_digital;
+               s->insn_bits    = parport_intr_insn_bits;
+               s->do_cmdtest   = parport_intr_cmdtest;
+               s->do_cmd       = parport_intr_cmd;
+               s->cancel       = parport_intr_cancel;
        }
 
-       devpriv->a_data = 0;
-       outb(devpriv->a_data, dev->iobase + PARPORT_A);
-       devpriv->c_data = 0;
-       outb(devpriv->c_data, dev->iobase + PARPORT_C);
+       outb(0, dev->iobase + PARPORT_DATA_REG);
+       outb(0, dev->iobase + PARPORT_CTRL_REG);
 
        return 0;
 }
@@ -341,5 +315,5 @@ static struct comedi_driver parport_driver = {
 module_comedi_driver(parport_driver);
 
 MODULE_AUTHOR("Comedi http://www.comedi.org");
-MODULE_DESCRIPTION("Comedi low-level driver");
+MODULE_DESCRIPTION("Comedi: Standard parallel port driver");
 MODULE_LICENSE("GPL");
index e781716bf3555e9a93b3af8e7bb5a11ac12c35da..89836c0828d9cb08a8626cecbe9fd266bf38f9d2 100644 (file)
@@ -40,17 +40,11 @@ Configuration Options: not applicable, uses comedi PCI auto config
 
 static int contec_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + PIO1616L_DO_REG);
-       }
 
        data[1] = s->state;
 
index 5f669709501f90376afe046e84bda819f1544f2d..15dd33e3e1c796c12f2f409a77da22395c4c6c48 100644 (file)
@@ -279,27 +279,23 @@ static int das08_di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
        return insn->n;
 }
 
-static int das08_do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
-                         struct comedi_insn *insn, unsigned int *data)
+static int das08_do_wbits(struct comedi_device *dev,
+                         struct comedi_subdevice *s,
+                         struct comedi_insn *insn,
+                         unsigned int *data)
 {
        struct das08_private_struct *devpriv = dev->private;
-       int wbits;
-
-       /*  get current settings of digital output lines */
-       wbits = (devpriv->do_mux_bits >> 4) & 0xf;
-       /*  null bits we are going to set */
-       wbits &= ~data[0];
-       /*  set new bit values */
-       wbits |= data[0] & data[1];
-       /*  remember digital output bits */
-       /*  prevent race with setting of analog input mux */
-       spin_lock(&dev->spinlock);
-       devpriv->do_mux_bits &= ~DAS08_DO_MASK;
-       devpriv->do_mux_bits |= DAS08_OP(wbits);
-       outb(devpriv->do_mux_bits, dev->iobase + DAS08_CONTROL);
-       spin_unlock(&dev->spinlock);
 
-       data[1] = wbits;
+       if (comedi_dio_update_state(s, data)) {
+               /* prevent race with setting of analog input mux */
+               spin_lock(&dev->spinlock);
+               devpriv->do_mux_bits &= ~DAS08_DO_MASK;
+               devpriv->do_mux_bits |= DAS08_OP(s->state);
+               outb(devpriv->do_mux_bits, dev->iobase + DAS08_CONTROL);
+               spin_unlock(&dev->spinlock);
+       }
+
+       data[1] = s->state;
 
        return insn->n;
 }
@@ -316,17 +312,13 @@ static int das08jr_di_rbits(struct comedi_device *dev,
 
 static int das08jr_do_wbits(struct comedi_device *dev,
                            struct comedi_subdevice *s,
-                           struct comedi_insn *insn, unsigned int *data)
+                           struct comedi_insn *insn,
+                           unsigned int *data)
 {
-       struct das08_private_struct *devpriv = dev->private;
-
-       /*  null bits we are going to set */
-       devpriv->do_bits &= ~data[0];
-       /*  set new bit values */
-       devpriv->do_bits |= data[0] & data[1];
-       outb(devpriv->do_bits, dev->iobase + DAS08JR_DIO);
+       if (comedi_dio_update_state(s, data))
+               outb(s->state, dev->iobase + DAS08JR_DIO);
 
-       data[1] = devpriv->do_bits;
+       data[1] = s->state;
 
        return insn->n;
 }
index cce1b584200a82acbf1036af85fa91c103b2d3e8..46a314c5113e56c5699ae242b66db2e4b19c79a0 100644 (file)
@@ -41,7 +41,6 @@ struct das08_board_struct {
 
 struct das08_private_struct {
        unsigned int do_mux_bits;       /*  bits for do/mux register on boards without separate do register */
-       unsigned int do_bits;   /*  bits for do register on boards with register dedicated to digital out only */
        const unsigned int *pg_gainlist;
        unsigned int ao_readback[2];    /* assume 2 AO channels */
 };
index 1b0793f33b9f12742453d18ca5801601f87413b4..fc058f8e870209b5b482593afa80f8df6355afca 100644 (file)
@@ -952,15 +952,8 @@ static int das16_do_insn_bits(struct comedi_device *dev,
                              struct comedi_insn *insn,
                              unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                outb(s->state, dev->iobase + DAS16_DIO_REG);
-       }
 
        data[1] = s->state;
 
index b943c449b69198ef9782137d65c5c0a0cd5524a1..187b0a1c378bd35deedf2dd16b9a07c09049e66a 100644 (file)
@@ -134,7 +134,6 @@ struct das16m1_private_struct {
         * counter yet (loaded by first sample conversion) */
        u16 initial_hw_count;
        short ai_buffer[FIFO_SIZE];
-       unsigned int do_bits;   /*  saves status of digital output bits */
        unsigned int divisor1;  /*  divides master clock to obtain conversion speed */
        unsigned int divisor2;  /*  divides master clock to obtain conversion speed */
        unsigned long extra_iobase;
@@ -393,22 +392,13 @@ static int das16m1_di_rbits(struct comedi_device *dev,
 
 static int das16m1_do_wbits(struct comedi_device *dev,
                            struct comedi_subdevice *s,
-                           struct comedi_insn *insn, unsigned int *data)
+                           struct comedi_insn *insn,
+                           unsigned int *data)
 {
-       struct das16m1_private_struct *devpriv = dev->private;
-       unsigned int wbits;
-
-       /*  only set bits that have been masked */
-       data[0] &= 0xf;
-       wbits = devpriv->do_bits;
-       /*  zero bits that have been masked */
-       wbits &= ~data[0];
-       /*  set masked bits */
-       wbits |= data[0] & data[1];
-       devpriv->do_bits = wbits;
-       data[1] = wbits;
+       if (comedi_dio_update_state(s, data))
+               outb(s->state, dev->iobase + DAS16M1_DIO);
 
-       outb(devpriv->do_bits, dev->iobase + DAS16M1_DIO);
+       data[1] = s->state;
 
        return insn->n;
 }
@@ -649,7 +639,7 @@ static int das16m1_attach(struct comedi_device *dev,
        outb(TOTAL_CLEAR, dev->iobase + DAS16M1_8254_FIRST_CNTRL);
 
        /*  initialize digital output lines */
-       outb(devpriv->do_bits, dev->iobase + DAS16M1_DIO);
+       outb(0, dev->iobase + DAS16M1_DIO);
 
        /* set the interrupt level */
        if (dev->irq)
index 5b300294d3229171d2212d962bdc626a57810f09..8b9a0a66b5a5dcb4c8e115d497e37dbecbe1176f 100644 (file)
@@ -427,7 +427,6 @@ struct das1800_private {
        volatile unsigned int count;    /* number of data points left to be taken */
        unsigned int divisor1;  /* value to load into board's counter 1 for timed conversions */
        unsigned int divisor2;  /* value to load into board's counter 2 for timed conversions */
-       int do_bits;            /* digital output bits */
        int irq_dma_bits;       /* bits for control register b */
        /* dma bits for control register b, stored so that dma can be
         * turned on and off */
@@ -1319,24 +1318,15 @@ static int das1800_di_rbits(struct comedi_device *dev,
        return insn->n;
 }
 
-/* writes to digital output channels */
 static int das1800_do_wbits(struct comedi_device *dev,
                            struct comedi_subdevice *s,
-                           struct comedi_insn *insn, unsigned int *data)
+                           struct comedi_insn *insn,
+                           unsigned int *data)
 {
-       struct das1800_private *devpriv = dev->private;
-       unsigned int wbits;
-
-       /*  only set bits that have been masked */
-       data[0] &= (1 << s->n_chan) - 1;
-       wbits = devpriv->do_bits;
-       wbits &= ~data[0];
-       wbits |= data[0] & data[1];
-       devpriv->do_bits = wbits;
-
-       outb(devpriv->do_bits, dev->iobase + DAS1800_DIGITAL);
+       if (comedi_dio_update_state(s, data))
+               outb(s->state, dev->iobase + DAS1800_DIGITAL);
 
-       data[1] = devpriv->do_bits;
+       data[1] = s->state;
 
        return insn->n;
 }
@@ -1644,7 +1634,7 @@ static int das1800_attach(struct comedi_device *dev,
        das1800_cancel(dev, dev->read_subdev);
 
        /*  initialize digital out channels */
-       outb(devpriv->do_bits, dev->iobase + DAS1800_DIGITAL);
+       outb(0, dev->iobase + DAS1800_DIGITAL);
 
        /*  initialize analog out channels */
        if (thisboard->ao_ability == 1) {
index 11e16114e4e3150ccca1763f44107ee6e2238dad..b80dd0362ffcc2c61c2dcbce8a22645d772a43cc 100644 (file)
@@ -630,13 +630,9 @@ static int das800_do_insn_bits(struct comedi_device *dev,
                               unsigned int *data)
 {
        struct das800_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
        unsigned long irq_flags;
 
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
+       if (comedi_dio_update_state(s, data)) {
                devpriv->do_bits = s->state << 4;
 
                spin_lock_irqsave(&dev->spinlock, irq_flags);
index 118a4fd129f903ee3481c392644e115a8ef56188..b04a5633f754ef3c286ca0ef7615ba67152482d4 100644 (file)
@@ -596,52 +596,40 @@ static int dmm32at_ao_rinsn(struct comedi_device *dev,
 
 static int dmm32at_dio_insn_bits(struct comedi_device *dev,
                                 struct comedi_subdevice *s,
-                                struct comedi_insn *insn, unsigned int *data)
+                                struct comedi_insn *insn,
+                                unsigned int *data)
 {
        struct dmm32at_private *devpriv = dev->private;
-       unsigned char diobits;
-
-       /* The insn data is a mask in data[0] and the new data
-        * in data[1], each channel cooresponding to a bit. */
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
-               /* Write out the new digital output lines */
-               /* outw(s->state,dev->iobase + DMM32AT_DIO); */
+       unsigned int mask;
+       unsigned int val;
+
+       mask = comedi_dio_update_state(s, data);
+       if (mask) {
+               /* get access to the DIO regs */
+               outb(DMM32AT_DIOACC, dev->iobase + DMM32AT_CNTRL);
+
+               /* if either part of dio is set for output */
+               if (((devpriv->dio_config & DMM32AT_DIRCL) == 0) ||
+                   ((devpriv->dio_config & DMM32AT_DIRCH) == 0)) {
+                       val = (s->state & 0x00ff0000) >> 16;
+                       outb(val, dev->iobase + DMM32AT_DIOC);
+               }
+               if ((devpriv->dio_config & DMM32AT_DIRB) == 0) {
+                       val = (s->state & 0x0000ff00) >> 8;
+                       outb(val, dev->iobase + DMM32AT_DIOB);
+               }
+               if ((devpriv->dio_config & DMM32AT_DIRA) == 0) {
+                       val = (s->state & 0x000000ff);
+                       outb(val, dev->iobase + DMM32AT_DIOA);
+               }
        }
 
-       /* get access to the DIO regs */
-       outb(DMM32AT_DIOACC, dev->iobase + DMM32AT_CNTRL);
-
-       /* if either part of dio is set for output */
-       if (((devpriv->dio_config & DMM32AT_DIRCL) == 0) ||
-           ((devpriv->dio_config & DMM32AT_DIRCH) == 0)) {
-               diobits = (s->state & 0x00ff0000) >> 16;
-               outb(diobits, dev->iobase + DMM32AT_DIOC);
-       }
-       if ((devpriv->dio_config & DMM32AT_DIRB) == 0) {
-               diobits = (s->state & 0x0000ff00) >> 8;
-               outb(diobits, dev->iobase + DMM32AT_DIOB);
-       }
-       if ((devpriv->dio_config & DMM32AT_DIRA) == 0) {
-               diobits = (s->state & 0x000000ff);
-               outb(diobits, dev->iobase + DMM32AT_DIOA);
-       }
+       val = inb(dev->iobase + DMM32AT_DIOA);
+       val |= inb(dev->iobase + DMM32AT_DIOB) << 8;
+       val |= inb(dev->iobase + DMM32AT_DIOC) << 16;
+       s->state = val;
 
-       /* now read the state back in */
-       s->state = inb(dev->iobase + DMM32AT_DIOC);
-       s->state <<= 8;
-       s->state |= inb(dev->iobase + DMM32AT_DIOB);
-       s->state <<= 8;
-       s->state |= inb(dev->iobase + DMM32AT_DIOA);
-       data[1] = s->state;
-
-       /* on return, data[1] contains the value of the digital
-        * input and output lines. */
-       /* data[1]=inw(dev->iobase + DMM32AT_DIO); */
-       /* or we could just return the software copy of the output values if
-        * it was a purely digital output subdevice */
-       /* data[1]=s->state; */
+       data[1] = val;
 
        return insn->n;
 }
index 38918a1198aa83cfbcc717f69be05c074b9bd7aa..1a2b0e4b1ea5c2d246a5e2e65186403c8c5d3bd3 100644 (file)
@@ -528,23 +528,23 @@ static int dt2801_ao_insn_write(struct comedi_device *dev,
 
 static int dt2801_dio_insn_bits(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       int which = 0;
-
-       if (s == &dev->subdevices[3])
-               which = 1;
+       int which = (s == &dev->subdevices[3]) ? 1 : 0;
+       unsigned int val;
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data)) {
                dt2801_writecmd(dev, DT_C_WRITE_DIG);
                dt2801_writedata(dev, which);
                dt2801_writedata(dev, s->state);
        }
+
        dt2801_writecmd(dev, DT_C_READ_DIG);
        dt2801_writedata(dev, which);
-       dt2801_readdata(dev, data + 1);
+       dt2801_readdata(dev, &val);
+
+       data[1] = val;
 
        return insn->n;
 }
index a41a5716f3584fdbb488203b1c87b055fe5ae84f..0ca02fa7ba1b96e1a92edd97a81ca92a623bc711 100644 (file)
@@ -353,11 +353,11 @@ static int dt2811_di_insn_bits(struct comedi_device *dev,
 
 static int dt2811_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
-       s->state &= ~data[0];
-       s->state |= data[0] & data[1];
-       outb(s->state, dev->iobase + DT2811_DIO);
+       if (comedi_dio_update_state(s, data))
+               outb(s->state, dev->iobase + DT2811_DIO);
 
        data[1] = s->state;
 
index f4a8529239b5448b5fe5c9a317b0dfaf1146bc46..bf589936e5465f7822d47cc7e31c4d2162fa5fa9 100644 (file)
@@ -80,36 +80,31 @@ static int dt2817_dio_insn_config(struct comedi_device *dev,
 
 static int dt2817_dio_insn_bits(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       unsigned int changed;
-
-       /* It's questionable whether it is more important in
-        * a driver like this to be deterministic or fast.
-        * We choose fast. */
-
-       if (data[0]) {
-               changed = s->state;
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
-               changed ^= s->state;
-               changed &= s->io_bits;
-               if (changed & 0x000000ff)
-                       outb(s->state & 0xff, dev->iobase + DT2817_DATA + 0);
-               if (changed & 0x0000ff00)
-                       outb((s->state >> 8) & 0xff,
-                            dev->iobase + DT2817_DATA + 1);
-               if (changed & 0x00ff0000)
-                       outb((s->state >> 16) & 0xff,
-                            dev->iobase + DT2817_DATA + 2);
-               if (changed & 0xff000000)
-                       outb((s->state >> 24) & 0xff,
-                            dev->iobase + DT2817_DATA + 3);
+       unsigned long iobase = dev->iobase + DT2817_DATA;
+       unsigned int mask;
+       unsigned int val;
+
+       mask = comedi_dio_update_state(s, data);
+       if (mask) {
+               if (mask & 0x000000ff)
+                       outb(s->state & 0xff, iobase + 0);
+               if (mask & 0x0000ff00)
+                       outb((s->state >> 8) & 0xff, iobase + 1);
+               if (mask & 0x00ff0000)
+                       outb((s->state >> 16) & 0xff, iobase + 2);
+               if (mask & 0xff000000)
+                       outb((s->state >> 24) & 0xff, iobase + 3);
        }
-       data[1] = inb(dev->iobase + DT2817_DATA + 0);
-       data[1] |= (inb(dev->iobase + DT2817_DATA + 1) << 8);
-       data[1] |= (inb(dev->iobase + DT2817_DATA + 2) << 16);
-       data[1] |= (inb(dev->iobase + DT2817_DATA + 3) << 24);
+
+       val = inb(iobase + 0);
+       val |= (inb(iobase + 1) << 8);
+       val |= (inb(iobase + 2) << 16);
+       val |= (inb(iobase + 3) << 24);
+
+       data[1] = val;
 
        return insn->n;
 }
index da3ee859bdbcedd025708fa0af0ac434df241b26..e89126a15e53590988134bbbb1caac04ae02e497 100644 (file)
@@ -967,14 +967,12 @@ static int dt282x_ao_cancel(struct comedi_device *dev,
 
 static int dt282x_dio_insn_bits(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
-
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + DT2821_DIODAT);
-       }
+
        data[1] = inw(dev->iobase + DT2821_DIODAT);
 
        return insn->n;
index 64ef87598b607deffe7b9a11999c753defbce126..fec911fc8d688137d5728170725f780b821184cb 100644 (file)
@@ -665,13 +665,12 @@ static int dt3k_dio_insn_config(struct comedi_device *dev,
 
 static int dt3k_dio_insn_bits(struct comedi_device *dev,
                              struct comedi_subdevice *s,
-                             struct comedi_insn *insn, unsigned int *data)
+                             struct comedi_insn *insn,
+                             unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[1] & data[0];
+       if (comedi_dio_update_state(s, data))
                dt3k_writesingle(dev, SUBS_DOUT, 0, s->state);
-       }
+
        data[1] = dt3k_readsingle(dev, SUBS_DIN, 0, 0);
 
        return insn->n;
index b5e6f33dc217c4493f595ddedc82e86a3b5b2ee1..64565d4c902db881226ff339103e96264a1ac266 100644 (file)
@@ -580,15 +580,8 @@ static int dt9812_do_insn_bits(struct comedi_device *dev,
                               struct comedi_insn *insn,
                               unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                dt9812_digital_out(dev, s->state);
-       }
 
        data[1] = s->state;
 
index fd525f499f2a2db47d16eef9a9f07b780cc00690..f2a9f1c2f3b6dfe2ffa563a53c466ac7bd7fd987 100644 (file)
@@ -147,33 +147,23 @@ static int dyna_pci10xx_di_insn_bits(struct comedi_device *dev,
        return insn->n;
 }
 
-/* digital output bit interface */
 static int dyna_pci10xx_do_insn_bits(struct comedi_device *dev,
-                             struct comedi_subdevice *s,
-                             struct comedi_insn *insn, unsigned int *data)
+                                    struct comedi_subdevice *s,
+                                    struct comedi_insn *insn,
+                                    unsigned int *data)
 {
        struct dyna_pci10xx_private *devpriv = dev->private;
 
-       /* The insn data is a mask in data[0] and the new data
-        * in data[1], each channel cooresponding to a bit.
-        * s->state contains the previous write data
-        */
        mutex_lock(&devpriv->mutex);
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data)) {
                smp_mb();
                outw_p(s->state, devpriv->BADR3);
                udelay(10);
        }
 
-       /*
-        * On return, data[1] contains the value of the digital
-        * input and output lines. We just return the software copy of the
-        * output values if it was a purely digital output subdevice.
-        */
        data[1] = s->state;
        mutex_unlock(&devpriv->mutex);
+
        return insn->n;
 }
 
index 3889d23292d04d322dcba5d37dbf6d14c0a8aab0..15d87187b59088bda192f47622e1f50b317e8411 100644 (file)
@@ -348,18 +348,13 @@ static int icp_multi_insn_bits_di(struct comedi_device *dev,
 
 static int icp_multi_insn_bits_do(struct comedi_device *dev,
                                  struct comedi_subdevice *s,
-                                 struct comedi_insn *insn, unsigned int *data)
+                                 struct comedi_insn *insn,
+                                 unsigned int *data)
 {
        struct icp_multi_private *devpriv = dev->private;
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
-
-               printk(KERN_DEBUG "Digital outputs = %4x \n", s->state);
-
+       if (comedi_dio_update_state(s, data))
                writew(s->state, devpriv->io_addr + ICP_MULTI_DO);
-       }
 
        data[1] = readw(devpriv->io_addr + ICP_MULTI_DI);
 
@@ -548,7 +543,6 @@ static int icp_multi_auto_attach(struct comedi_device *dev,
        s->maxdata = 1;
        s->len_chanlist = 16;
        s->range_table = &range_digital;
-       s->io_bits = 0;
        s->insn_bits = icp_multi_insn_bits_di;
 
        s = &dev->subdevices[3];
@@ -558,8 +552,6 @@ static int icp_multi_auto_attach(struct comedi_device *dev,
        s->maxdata = 1;
        s->len_chanlist = 8;
        s->range_table = &range_digital;
-       s->io_bits = 0xff;
-       s->state = 0;
        s->insn_bits = icp_multi_insn_bits_do;
 
        s = &dev->subdevices[4];
index 5c3a318b464012bff1f5a44c2788e20008399ed7..8577778441fa8cfa1f5af64f40f82e4cc7d0ee15 100644 (file)
@@ -378,13 +378,10 @@ static int ii20k_dio_insn_bits(struct comedi_device *dev,
                               unsigned int *data)
 {
        struct ii20k_private *devpriv = dev->private;
-       unsigned int mask = data[0] & s->io_bits;       /* outputs only */
-       unsigned int bits = data[1];
+       unsigned int mask;
 
+       mask = comedi_dio_update_state(s, data);
        if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
                if (mask & 0x000000ff)
                        writeb((s->state >> 0) & 0xff,
                               devpriv->ioaddr + II20K_DIO0_REG);
index 8f4afadab76a617a526da821d3ac029562eadf3c..aba7beae8e860ff87e0964a4402c41ad8fb0803a 100644 (file)
@@ -1313,29 +1313,12 @@ static int me4000_ao_insn_read(struct comedi_device *dev,
        return 1;
 }
 
-/*=============================================================================
-  Digital I/O section
-  ===========================================================================*/
-
 static int me4000_dio_insn_bits(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       /*
-        * The insn data consists of a mask in data[0] and the new data
-        * in data[1]. The mask defines which bits we are concerning about.
-        * The new data must be anded with the mask.
-        * Each channel corresponds to a bit.
-        */
-       if (data[0]) {
-               /* Check if requested ports are configured for output */
-               if ((s->io_bits & data[0]) != data[0])
-                       return -EIO;
-
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
-
-               /* Write out the new digital output lines */
+       if (comedi_dio_update_state(s, data)) {
                outl((s->state >> 0) & 0xFF,
                            dev->iobase + ME4000_DIO_PORT_0_REG);
                outl((s->state >> 8) & 0xFF,
@@ -1346,8 +1329,6 @@ static int me4000_dio_insn_bits(struct comedi_device *dev,
                            dev->iobase + ME4000_DIO_PORT_3_REG);
        }
 
-       /* On return, data[1] contains the value of
-          the digital input and output lines. */
        data[1] = ((inl(dev->iobase + ME4000_DIO_PORT_0_REG) & 0xFF) << 0) |
                  ((inl(dev->iobase + ME4000_DIO_PORT_1_REG) & 0xFF) << 8) |
                  ((inl(dev->iobase + ME4000_DIO_PORT_2_REG) & 0xFF) << 16) |
index a6f6d4a46587f06d1b84ba53a45df3ebcf150821..24ec9ef9b1a0fc326ac560aa74a5b57105fd2647 100644 (file)
@@ -222,15 +222,11 @@ static int me_dio_insn_bits(struct comedi_device *dev,
        struct me_private_data *dev_private = dev->private;
        void __iomem *mmio_porta = dev_private->me_regbase + ME_DIO_PORT_A;
        void __iomem *mmio_portb = dev_private->me_regbase + ME_DIO_PORT_B;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
+       unsigned int mask;
        unsigned int val;
 
-       mask &= s->io_bits;     /* only update the COMEDI_OUTPUT channels */
+       mask = comedi_dio_update_state(s, data);
        if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
                if (mask & 0x0000ffff)
                        writew((s->state & 0xffff), mmio_porta);
                if (mask & 0xffff0000)
@@ -545,7 +541,6 @@ static int me_auto_attach(struct comedi_device *dev,
        s->range_table  = &range_digital;
        s->insn_bits    = me_dio_insn_bits;
        s->insn_config  = me_dio_insn_config;
-       s->io_bits      = 0;
 
        dev_info(dev->class_dev, "%s: %s attached\n",
                dev->driver->driver_name, dev->board_name);
index 9d75ea4e201bcb553cc5cb75b38b759d0fe87e65..3ca755eca285dd129741640c7153f7a0413dcfe8 100644 (file)
@@ -163,11 +163,11 @@ static int multiq3_di_insn_bits(struct comedi_device *dev,
 
 static int multiq3_do_insn_bits(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       s->state &= ~data[0];
-       s->state |= (data[0] & data[1]);
-       outw(s->state, dev->iobase + MULTIQ3_DIGOUT_PORT);
+       if (comedi_dio_update_state(s, data))
+               outw(s->state, dev->iobase + MULTIQ3_DIGOUT_PORT);
 
        data[1] = s->state;
 
index c2745f201f2c19cb713b812630c0d0774fb3c5d8..44557c9671ace9b1050010e5b59bbb517484ee7b 100644 (file)
@@ -163,29 +163,29 @@ static int ni6527_di_insn_bits(struct comedi_device *dev,
 
 static int ni6527_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
        struct ni6527_private *devpriv = dev->private;
+       unsigned int mask;
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
-
-               /* The open relay state on the board cooresponds to 1,
-                * but in Comedi, it is represented by 0. */
-               if (data[0] & 0x0000ff) {
-                       writeb((s->state ^ 0xff),
+       mask = comedi_dio_update_state(s, data);
+       if (mask) {
+               /* Outputs are inverted */
+               if (mask & 0x0000ff) {
+                       writeb(s->state ^ 0xff,
                               devpriv->mite->daq_io_addr + Port_Register(3));
                }
-               if (data[0] & 0x00ff00) {
+               if (mask & 0x00ff00) {
                        writeb((s->state >> 8) ^ 0xff,
                               devpriv->mite->daq_io_addr + Port_Register(4));
                }
-               if (data[0] & 0xff0000) {
+               if (mask & 0xff0000) {
                        writeb((s->state >> 16) ^ 0xff,
                               devpriv->mite->daq_io_addr + Port_Register(5));
                }
        }
+
        data[1] = s->state;
 
        return insn->n;
index 3607336dafe297968395871e00bd0a14fa700bd5..8a991dcab24a9b5a08cdcaf480979292337db555 100644 (file)
@@ -1213,7 +1213,6 @@ static int ni_660x_auto_attach(struct comedi_device *dev,
        s->range_table = &range_digital;
        s->insn_bits = ni_660x_dio_insn_bits;
        s->insn_config = ni_660x_dio_insn_config;
-       s->io_bits = 0;         /* all bits default to input */
        /*  we use the ioconfig registers to control dio direction, so zero
        output enables in stc dio control reg */
        ni_660x_write_register(dev, 0, 0, STCDIOControl);
index e2926ce3fb24be9799e1ce2fe949992dfacc17c3..e4414cf110e7e3a72e049d48d0c00c32a7e7d6c6 100644 (file)
@@ -136,20 +136,15 @@ static int ni_670x_ao_rinsn(struct comedi_device *dev,
 
 static int ni_670x_dio_insn_bits(struct comedi_device *dev,
                                 struct comedi_subdevice *s,
-                                struct comedi_insn *insn, unsigned int *data)
+                                struct comedi_insn *insn,
+                                unsigned int *data)
 {
        struct ni_670x_private *devpriv = dev->private;
        void __iomem *io_addr = devpriv->mite->daq_io_addr +
                                        DIO_PORT0_DATA_OFFSET;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                writel(s->state, io_addr);
-       }
 
        data[1] = readl(io_addr);
 
index 2512ce8dfcaa7bd2a830fc29aaf307555b115d28..c77d34306119f0e5e02f6a1af3219d60e6e95374 100644 (file)
@@ -684,13 +684,12 @@ static int a2150_set_chanlist(struct comedi_device *dev,
                devpriv->config_bits |= CHANNEL_BITS(0x4 | start_channel);
                break;
        case 2:
-               if (start_channel == 0) {
+               if (start_channel == 0)
                        devpriv->config_bits |= CHANNEL_BITS(0x2);
-               } else if (start_channel == 2) {
+               else if (start_channel == 2)
                        devpriv->config_bits |= CHANNEL_BITS(0x3);
-               } else {
+               else
                        return -1;
-               }
                break;
        case 4:
                devpriv->config_bits |= CHANNEL_BITS(0x1);
index b9122fd835e1e714cec811c43d2c6c1a51675e9e..4e4b227e091f9cb108bc2dc6215f8839f8628a4a 100644 (file)
@@ -233,13 +233,11 @@ static int atao_ao_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
 
 static int atao_dio_insn_bits(struct comedi_device *dev,
                              struct comedi_subdevice *s,
-                             struct comedi_insn *insn, unsigned int *data)
+                             struct comedi_insn *insn,
+                             unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + ATAO_DOUT);
-       }
 
        data[1] = inw(dev->iobase + ATAO_DIN);
 
index bb3491f5ad21c993c916ab827cfe74dffa05ad41..a9f7d40d6db24ed32f8efcd07bef5e4ce94160f6 100644 (file)
@@ -558,13 +558,12 @@ static int atmio16d_ao_insn_write(struct comedi_device *dev,
 
 static int atmio16d_dio_insn_bits(struct comedi_device *dev,
                                  struct comedi_subdevice *s,
-                                 struct comedi_insn *insn, unsigned int *data)
+                                 struct comedi_insn *insn,
+                                 unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] | data[1]);
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + MIO_16_DIG_OUT_REG);
-       }
+
        data[1] = inw(dev->iobase + MIO_16_DIG_IN_REG);
 
        return insn->n;
index 404f83de276da21bd00cb4d17c7b87eb9fd9743d..e4cdca349157f89ab12ccf543c849769c9785dfd 100644 (file)
@@ -72,18 +72,22 @@ Manuals:    Register level: http://www.ni.com/pdf/manuals/340698.pdf
 
 static int daq700_dio_insn_bits(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       unsigned int mask;
+       unsigned int val;
 
-               if (data[0] & 0xff)
+       mask = comedi_dio_update_state(s, data);
+       if (mask) {
+               if (mask & 0xff)
                        outb(s->state & 0xff, dev->iobase + DIO_W);
        }
 
-       data[1] = s->state & 0xff;
-       data[1] |= inb(dev->iobase + DIO_R) << 8;
+       val = s->state & 0xff;
+       val |= inb(dev->iobase + DIO_R) << 8;
+
+       data[1] = val;
 
        return insn->n;
 }
@@ -212,7 +216,6 @@ static int daq700_auto_attach(struct comedi_device *dev,
        s->maxdata      = 1;
        s->insn_bits    = daq700_dio_insn_bits;
        s->insn_config  = daq700_dio_insn_config;
-       s->state        = 0;
        s->io_bits      = 0x00ff;
 
        /* DAQCard-700 ai */
index 1add114dc0bc9d5b490d169a88e69c63f86106e6..27daccb78f83a3bef973702e043e81bcb519a7e7 100644 (file)
@@ -201,12 +201,6 @@ static int labpc_counter_set_mode(struct comedi_device *dev,
                return i8254_set_mode(base_address, 0, counter_number, mode);
 }
 
-static bool labpc_range_is_unipolar(struct comedi_subdevice *s,
-                                   unsigned int range)
-{
-       return s->range_table->range[range].min >= 0;
-}
-
 static int labpc_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
 {
        struct labpc_private *devpriv = dev->private;
@@ -272,7 +266,7 @@ static void labpc_setup_cmd6_reg(struct comedi_device *dev,
                devpriv->cmd6 &= ~CMD6_NRSE;
 
        /* bipolar or unipolar range? */
-       if (labpc_range_is_unipolar(s, range))
+       if (comedi_range_is_unipolar(s, range))
                devpriv->cmd6 |= CMD6_ADCUNI;
        else
                devpriv->cmd6 &= ~CMD6_ADCUNI;
@@ -1046,7 +1040,7 @@ static int labpc_ao_insn_write(struct comedi_device *dev,
        /* set range */
        if (board->is_labpc1200) {
                range = CR_RANGE(insn->chanspec);
-               if (labpc_range_is_unipolar(s, range))
+               if (comedi_range_is_unipolar(s, range))
                        devpriv->cmd6 |= CMD6_DACUNI(channel);
                else
                        devpriv->cmd6 &= ~CMD6_DACUNI(channel);
index 4e02770e834bd7df20e8f015c92750ba4efb05a1..b9df2eeae6fbf6a7ca3689fb9212d8b713938c42 100644 (file)
@@ -3547,28 +3547,22 @@ static int ni_dio_insn_config(struct comedi_device *dev,
 
 static int ni_dio_insn_bits(struct comedi_device *dev,
                            struct comedi_subdevice *s,
-                           struct comedi_insn *insn, unsigned int *data)
+                           struct comedi_insn *insn,
+                           unsigned int *data)
 {
        struct ni_private *devpriv = dev->private;
 
-#ifdef DEBUG_DIO
-       printk("ni_dio_insn_bits() mask=0x%x bits=0x%x\n", data[0], data[1]);
-#endif
-
-       if (data[0]) {
-               /* Perform check to make sure we're not using the
-                  serial part of the dio */
-               if ((data[0] & (DIO_SDIN | DIO_SDOUT))
-                   && devpriv->serial_interval_ns)
-                       return -EBUSY;
+       /* Make sure we're not using the serial part of the dio */
+       if ((data[0] & (DIO_SDIN | DIO_SDOUT)) && devpriv->serial_interval_ns)
+               return -EBUSY;
 
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data)) {
                devpriv->dio_output &= ~DIO_Parallel_Data_Mask;
                devpriv->dio_output |= DIO_Parallel_Data_Out(s->state);
                devpriv->stc_writew(dev, devpriv->dio_output,
                                    DIO_Output_Register);
        }
+
        data[1] = devpriv->stc_readw(dev, DIO_Parallel_Input_Register);
 
        return insn->n;
@@ -3598,16 +3592,9 @@ static int ni_m_series_dio_insn_bits(struct comedi_device *dev,
 {
        struct ni_private *devpriv __maybe_unused = dev->private;
 
-#ifdef DEBUG_DIO
-       printk("ni_m_series_dio_insn_bits() mask=0x%x bits=0x%x\n", data[0],
-              data[1]);
-#endif
-
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data))
                ni_writel(s->state, M_Offset_Static_Digital_Output);
-       }
+
        data[1] = ni_readl(M_Offset_Static_Digital_Input);
 
        return insn->n;
@@ -5355,20 +5342,20 @@ static int ni_config_filter(struct comedi_device *dev, unsigned pfi_channel,
 
 static int ni_pfi_insn_bits(struct comedi_device *dev,
                            struct comedi_subdevice *s,
-                           struct comedi_insn *insn, unsigned int *data)
+                           struct comedi_insn *insn,
+                           unsigned int *data)
 {
        const struct ni_board_struct *board = comedi_board(dev);
        struct ni_private *devpriv __maybe_unused = dev->private;
 
-       if ((board->reg_type & ni_reg_m_series_mask) == 0) {
+       if (!(board->reg_type & ni_reg_m_series_mask))
                return -ENOTSUPP;
-       }
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+
+       if (comedi_dio_update_state(s, data))
                ni_writew(s->state, M_Offset_PFI_DO);
-       }
+
        data[1] = ni_readw(M_Offset_PFI_DI);
+
        return insn->n;
 }
 
index fad81bc97b6e090d87b1391349bf4c8ad3a4dcd9..b6283a8a7cd488a4e1ba41733ff84ded1311c4f9 100644 (file)
@@ -657,15 +657,14 @@ static int ni_pcidio_insn_config(struct comedi_device *dev,
 
 static int ni_pcidio_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
        struct nidio96_private *devpriv = dev->private;
 
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= (data[0] & data[1]);
+       if (comedi_dio_update_state(s, data))
                writel(s->state, devpriv->mite->daq_io_addr + Port_IO(0));
-       }
+
        data[1] = readl(devpriv->mite->daq_io_addr + Port_IO(0));
 
        return insn->n;
index e859f85a8e17c1b39ac7300f7ded90f250da1d22..53cd1af7ce9d2392c74a3f6cb1f1cbbbb0a163da 100644 (file)
@@ -422,19 +422,20 @@ static int pcl711_di_insn_bits(struct comedi_device *dev,
        return insn->n;
 }
 
-/* Digital port write - Untested on 8112 */
 static int pcl711_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
+       unsigned int mask;
+
+       mask = comedi_dio_update_state(s, data);
+       if (mask) {
+               if (mask & 0x00ff)
+                       outb(s->state & 0xff, dev->iobase + PCL711_DO_LO);
+               if (mask & 0xff00)
+                       outb((s->state >> 8), dev->iobase + PCL711_DO_HI);
        }
-       if (data[0] & 0x00ff)
-               outb(s->state & 0xff, dev->iobase + PCL711_DO_LO);
-       if (data[0] & 0xff00)
-               outb((s->state >> 8), dev->iobase + PCL711_DO_HI);
 
        data[1] = s->state;
 
index a4d0bcc31e52df22290fbfb174f08eac5f89f3c5..32fb57a7fa263646c1a0f4a8f0965870ca2f416e 100644 (file)
@@ -196,18 +196,19 @@ static int pcl726_di_insn_bits(struct comedi_device *dev,
 
 static int pcl726_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
        const struct pcl726_board *board = comedi_board(dev);
-
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
+       unsigned int mask;
+
+       mask = comedi_dio_update_state(s, data);
+       if (mask) {
+               if (mask & 0x00ff)
+                       outb(s->state & 0xff, dev->iobase + board->do_lo);
+               if (mask & 0xff00)
+                       outb((s->state >> 8), dev->iobase + board->do_hi);
        }
-       if (data[1] & 0x00ff)
-               outb(s->state & 0xff, dev->iobase + board->do_lo);
-       if (data[1] & 0xff00)
-               outb((s->state >> 8), dev->iobase + board->do_hi);
 
        data[1] = s->state;
 
index 2a659f23ecda78be31cbb369c735c543c8218616..d041b714db29732f91e8739db8dcf1122f55d55b 100644 (file)
@@ -167,20 +167,17 @@ static int pcl730_do_insn_bits(struct comedi_device *dev,
                               unsigned int *data)
 {
        unsigned long reg = (unsigned long)s->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
+       unsigned int mask;
 
+       mask = comedi_dio_update_state(s, data);
        if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
                if (mask & 0x00ff)
                        outb(s->state & 0xff, dev->iobase + reg);
-               if ((mask & 0xff00) && (s->n_chan > 8))
+               if ((mask & 0xff00) & (s->n_chan > 8))
                        outb((s->state >> 8) & 0xff, dev->iobase + reg + 1);
-               if ((mask & 0xff0000) && (s->n_chan > 16))
+               if ((mask & 0xff0000) & (s->n_chan > 16))
                        outb((s->state >> 16) & 0xff, dev->iobase + reg + 2);
-               if ((mask & 0xff000000) && (s->n_chan > 24))
+               if ((mask & 0xff000000) & (s->n_chan > 24))
                        outb((s->state >> 24) & 0xff, dev->iobase + reg + 3);
        }
 
index 03a098900d34eca1acdda953983c3004f8f59cca..2b10a95251bdf179e70c809f5a39efebec096baf 100644 (file)
@@ -509,19 +509,16 @@ static int pcl812_di_insn_bits(struct comedi_device *dev,
        return insn->n;
 }
 
-/*
-==============================================================================
-*/
 static int pcl812_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
+       if (comedi_dio_update_state(s, data)) {
                outb(s->state & 0xff, dev->iobase + PCL812_DO_LO);
                outb((s->state >> 8), dev->iobase + PCL812_DO_HI);
        }
+
        data[1] = s->state;
 
        return insn->n;
index a52ba82ff0e4a10adbdebf1508b73b1d7967c132..33cd4aae884ebc5e0a1969c19537c0dc2dc8e2f3 100644 (file)
@@ -418,21 +418,15 @@ static int pcl818_di_insn_bits(struct comedi_device *dev,
        return insn->n;
 }
 
-/*
-==============================================================================
-   DIGITAL OUTPUT MODE0, 818 cards
-
-   only one sample per call is supported
-*/
 static int pcl818_do_insn_bits(struct comedi_device *dev,
                               struct comedi_subdevice *s,
-                              struct comedi_insn *insn, unsigned int *data)
+                              struct comedi_insn *insn,
+                              unsigned int *data)
 {
-       s->state &= ~data[0];
-       s->state |= (data[0] & data[1]);
-
-       outb(s->state & 0xff, dev->iobase + PCL818_DO_LO);
-       outb((s->state >> 8), dev->iobase + PCL818_DO_HI);
+       if (comedi_dio_update_state(s, data)) {
+               outb(s->state & 0xff, dev->iobase + PCL818_DO_LO);
+               outb((s->state >> 8), dev->iobase + PCL818_DO_HI);
+       }
 
        data[1] = s->state;
 
index 423f23676d26cc1df6b8d91bf81a4691c9d0150d..fe482fdd512ed32f94af0987b236b2da28d62a57 100644 (file)
@@ -75,12 +75,6 @@ static int pcmad_ai_wait_for_eoc(struct comedi_device *dev,
        return -ETIME;
 }
 
-static bool pcmad_range_is_bipolar(struct comedi_subdevice *s,
-                                  unsigned int range)
-{
-       return s->range_table->range[range].min < 0;
-}
-
 static int pcmad_ai_insn_read(struct comedi_device *dev,
                              struct comedi_subdevice *s,
                              struct comedi_insn *insn,
@@ -106,7 +100,7 @@ static int pcmad_ai_insn_read(struct comedi_device *dev,
                if (s->maxdata == 0x0fff)
                        val >>= 4;
 
-               if (pcmad_range_is_bipolar(s, range)) {
+               if (comedi_range_is_bipolar(s, range)) {
                        /* munge the two's complement value */
                        val ^= ((s->maxdata + 1) >> 1);
                }
index 9775d3622a6266a51da709d951dbb6ae60e415d1..ece3031711eb484a07b2307b67c855102b9852da 100644 (file)
@@ -690,18 +690,12 @@ static int daqp_do_insn_bits(struct comedi_device *dev,
                             unsigned int *data)
 {
        struct daqp_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
 
        if (devpriv->stop)
                return -EIO;
 
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data))
                outb(s->state, dev->iobase + DAQP_DIGITAL_IO);
-       }
 
        data[1] = s->state;
 
index 93c980c62a23a96ded07673231cf216e85055f2e..3ec6632949bd3d003f66ee20a3dd454ac9501d37 100644 (file)
@@ -1217,15 +1217,9 @@ static int rtd_dio_insn_bits(struct comedi_device *dev,
                             unsigned int *data)
 {
        struct rtd_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                writew(s->state & 0xff, devpriv->las0 + LAS0_DIO0);
-       }
 
        data[1] = readw(devpriv->las0 + LAS0_DIO0) & 0xff;
 
index cbb4ba5b852a1fdf43b44a0c2b7dacd2092f8c60..e1f3671ac056095982922ff3697832f9ded54dbf 100644 (file)
@@ -267,13 +267,7 @@ static int rti800_do_insn_bits(struct comedi_device *dev,
                               struct comedi_insn *insn,
                               unsigned int *data)
 {
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
-
-       if (mask) {
-               s->state &= ~mask;
-               s->state |= (bits & mask);
-
+       if (comedi_dio_update_state(s, data)) {
                /* Outputs are inverted... */
                outb(s->state ^ 0xff, dev->iobase + RTI800_DO);
        }
index d629463b85a2ae38ba7c97d8329633ce606b7c1c..9950f59b1192c99dc471265027dbb2a9fd26fc4a 100644 (file)
@@ -499,14 +499,11 @@ static int s526_ao_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
 
 static int s526_dio_insn_bits(struct comedi_device *dev,
                              struct comedi_subdevice *s,
-                             struct comedi_insn *insn, unsigned int *data)
+                             struct comedi_insn *insn,
+                             unsigned int *data)
 {
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
-
+       if (comedi_dio_update_state(s, data))
                outw(s->state, dev->iobase + REG_DIO);
-       }
 
        data[1] = inw(dev->iobase + REG_DIO) & 0xff;
 
index d22b95dcb9bdff2ae4e064513ac7295f16b7fbbf..4eb4e7160bc364812d283e2d8198964e2048b0ca 100644 (file)
@@ -1638,19 +1638,10 @@ static int s626_dio_insn_bits(struct comedi_device *dev,
                              unsigned int *data)
 {
        unsigned long group = (unsigned long)s->private;
-       unsigned long mask = data[0];
-       unsigned long bits = data[1];
-
-       if (mask) {
-               /* Check if requested channels are configured for output */
-               if ((s->io_bits & mask) != mask)
-                       return -EIO;
-
-               s->state &= ~mask;
-               s->state |= (bits & mask);
 
+       if (comedi_dio_update_state(s, data))
                DEBIwrite(dev, LP_WRDOUT(group), s->state);
-       }
+
        data[1] = DEBIread(dev, LP_RDDIN(group));
 
        return insn->n;
index 9e964950a560ed92d9f37599d6138fd9c1a360b6..daee2f42bde0632c2cd05a38640ba1346a7bfeb6 100644 (file)
@@ -332,30 +332,44 @@ static int skel_ao_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
        return i;
 }
 
-/* DIO devices are slightly special.  Although it is possible to
+/*
+ * DIO devices are slightly special. Although it is possible to
  * implement the insn_read/insn_write interface, it is much more
  * useful to applications if you implement the insn_bits interface.
- * This allows packed reading/writing of the DIO channels.  The
- * comedi core can convert between insn_bits and insn_read/write */
+ * This allows packed reading/writing of the DIO channels. The
+ * comedi core can convert between insn_bits and insn_read/write.
+ */
 static int skel_dio_insn_bits(struct comedi_device *dev,
                              struct comedi_subdevice *s,
-                             struct comedi_insn *insn, unsigned int *data)
+                             struct comedi_insn *insn,
+                             unsigned int *data)
 {
-       /* The insn data is a mask in data[0] and the new data
-        * in data[1], each channel cooresponding to a bit. */
-       if (data[0]) {
-               s->state &= ~data[0];
-               s->state |= data[0] & data[1];
+       /*
+        * The insn data is a mask in data[0] and the new data
+        * in data[1], each channel cooresponding to a bit.
+        *
+        * The core provided comedi_dio_update_state() function can
+        * be used to handle the internal state update to DIO subdevices
+        * with <= 32 channels. This function will return '0' if the
+        * state does not change or the mask of the channels that need
+        * to be updated.
+        */
+       if (comedi_dio_update_state(s, data)) {
                /* Write out the new digital output lines */
-               /* outw(s->state,dev->iobase + SKEL_DIO); */
+               /* outw(s->state, dev->iobase + SKEL_DIO); */
        }
 
-       /* on return, data[1] contains the value of the digital
-        * input and output lines. */
-       /* data[1]=inw(dev->iobase + SKEL_DIO); */
-       /* or we could just return the software copy of the output values if
-        * it was a purely digital output subdevice */
-       /* data[1]=s->state; */
+       /*
+        * On return, data[1] contains the value of the digital
+        * input and output lines.
+        */
+       /* data[1] = inw(dev->iobase + SKEL_DIO); */
+
+       /*
+        * Or we could just return the software copy of the output
+        * values if it was a purely digital output subdevice.
+        */
+       /* data[1] = s->state; */
 
        return insn->n;
 }
index 11758a515c1bfed78ac7025b7f26d74a212368c6..df22a78d2b7e0879394953cb6f4987d77d6bc271 100644 (file)
@@ -46,51 +46,43 @@ Status: unknown
 #define PCMR  0xa3             /* Port C Mode Register                      */
 #define PCDR  0xa7             /* Port C Data Register                      */
 
-/* ------------------------------------------------------------------------- */
-/* The insn_bits interface allows packed reading/writing of DIO channels.    */
-/* The comedi core can convert between insn_bits and insn_read/write, so you */
-/* are able to use these instructions as well.                               */
-/* ------------------------------------------------------------------------- */
-
 static int dnp_dio_insn_bits(struct comedi_device *dev,
                             struct comedi_subdevice *s,
-                            struct comedi_insn *insn, unsigned int *data)
+                            struct comedi_insn *insn,
+                            unsigned int *data)
 {
-       /* The insn data is a mask in data[0] and the new data in data[1],   */
-       /* each channel cooresponding to a bit.                              */
-
-       /* Ports A and B are straight forward: each bit corresponds to an    */
-       /* output pin with the same order. Port C is different: bits 0...3   */
-       /* correspond to bits 4...7 of the output register (PCDR).           */
+       unsigned int mask;
+       unsigned int val;
 
-       if (data[0]) {
+       /*
+        * Ports A and B are straight forward: each bit corresponds to an
+        * output pin with the same order. Port C is different: bits 0...3
+        * correspond to bits 4...7 of the output register (PCDR).
+        */
 
+       mask = comedi_dio_update_state(s, data);
+       if (mask) {
                outb(PADR, CSCIR);
-               outb((inb(CSCDR)
-                     & ~(u8) (data[0] & 0x0000FF))
-                    | (u8) (data[1] & 0x0000FF), CSCDR);
+               outb(s->state & 0xff, CSCDR);
 
                outb(PBDR, CSCIR);
-               outb((inb(CSCDR)
-                     & ~(u8) ((data[0] & 0x00FF00) >> 8))
-                    | (u8) ((data[1] & 0x00FF00) >> 8), CSCDR);
+               outb((s->state >> 8) & 0xff, CSCDR);
 
                outb(PCDR, CSCIR);
-               outb((inb(CSCDR)
-                     & ~(u8) ((data[0] & 0x0F0000) >> 12))
-                    | (u8) ((data[1] & 0x0F0000) >> 12), CSCDR);
+               val = inb(CSCDR) & 0x0f;
+               outb(((s->state >> 12) & 0xf0) | val, CSCDR);
        }
 
-       /* on return, data[1] contains the value of the digital input lines. */
        outb(PADR, CSCIR);
-       data[0] = inb(CSCDR);
+       val = inb(CSCDR);
        outb(PBDR, CSCIR);
-       data[0] += inb(CSCDR) << 8;
+       val |= (inb(CSCDR) << 8);
        outb(PCDR, CSCIR);
-       data[0] += ((inb(CSCDR) & 0xF0) << 12);
+       val |= ((inb(CSCDR) & 0xf0) << 12);
 
-       return insn->n;
+       data[1] = val;
 
+       return insn->n;
 }
 
 static int dnp_dio_insn_config(struct comedi_device *dev,
index 701ad1a6939469d04df237ed71971006d7ed60ee..9218d7336923b199fca893e129b85f84b83e2877 100644 (file)
@@ -1133,15 +1133,13 @@ static int usbdux_dio_insn_bits(struct comedi_device *dev,
 {
 
        struct usbdux_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
        int ret;
 
        down(&devpriv->sem);
 
-       s->state &= ~mask;
-       s->state |= (bits & mask);
+       comedi_dio_update_state(s, data);
 
+       /* Always update the hardware. See the (*insn_config). */
        devpriv->dux_commands[1] = s->io_bits;
        devpriv->dux_commands[2] = s->state;
 
index c47f4087568fc0e4fae91c83433c49f9dba6c0eb..5618e61893da917cb48a7cf921ddc616d86d1860 100644 (file)
@@ -1059,15 +1059,13 @@ static int usbduxsigma_dio_insn_bits(struct comedi_device *dev,
                                     unsigned int *data)
 {
        struct usbduxsigma_private *devpriv = dev->private;
-       unsigned int mask = data[0];
-       unsigned int bits = data[1];
        int ret;
 
        down(&devpriv->sem);
 
-       s->state &= ~mask;
-       s->state |= (bits & mask);
+       comedi_dio_update_state(s, data);
 
+       /* Always update the hardware. See the (*insn_config). */
        devpriv->dux_commands[1] = s->io_bits & 0xff;
        devpriv->dux_commands[4] = s->state & 0xff;
        devpriv->dux_commands[2] = (s->io_bits >> 8) & 0xff;
index 06efa16b9af2377a0370952815d701dc344d51c4..933b01a0f03d4274e4f82ced6240a79f78b2c742 100644 (file)
@@ -462,9 +462,10 @@ static int vmk80xx_do_insn_bits(struct comedi_device *dev,
                                unsigned int *data)
 {
        struct vmk80xx_private *devpriv = dev->private;
-       unsigned char *rx_buf, *tx_buf;
+       unsigned char *rx_buf = devpriv->usb_rx_buf;
+       unsigned char *tx_buf = devpriv->usb_tx_buf;
        int reg, cmd;
-       int retval;
+       int ret;
 
        if (devpriv->model == VMK8061_MODEL) {
                reg = VMK8061_DO_REG;
@@ -476,37 +477,27 @@ static int vmk80xx_do_insn_bits(struct comedi_device *dev,
 
        down(&devpriv->limit_sem);
 
-       rx_buf = devpriv->usb_rx_buf;
-       tx_buf = devpriv->usb_tx_buf;
-
-       if (data[0]) {
-               tx_buf[reg] &= ~data[0];
-               tx_buf[reg] |= (data[0] & data[1]);
-
-               retval = vmk80xx_write_packet(dev, cmd);
-
-               if (retval)
+       if (comedi_dio_update_state(s, data)) {
+               tx_buf[reg] = s->state;
+               ret = vmk80xx_write_packet(dev, cmd);
+               if (ret)
                        goto out;
        }
 
        if (devpriv->model == VMK8061_MODEL) {
                tx_buf[0] = VMK8061_CMD_RD_DO;
-
-               retval = vmk80xx_read_packet(dev);
-
-               if (!retval) {
-                       data[1] = rx_buf[reg];
-                       retval = 2;
-               }
+               ret = vmk80xx_read_packet(dev);
+               if (ret)
+                       goto out;
+               data[1] = rx_buf[reg];
        } else {
-               data[1] = tx_buf[reg];
-               retval = 2;
+               data[1] = s->state;
        }
 
 out:
        up(&devpriv->limit_sem);
 
-       return retval;
+       return ret ? ret : insn->n;
 }
 
 static int vmk80xx_cnt_insn_read(struct comedi_device *dev,
index f79e65cd1d51522aaf41fe8ecf4703263cc26773..271ac19257f9f32fd2aae6ee4c7ac180c02e6119 100644 (file)
@@ -35,7 +35,7 @@
 struct fepimg {
     int type;                          /* board type */
     int        len;                            /* length of image */
-    char fepimage[1];                  /* begining of image */
+    char fepimage[1];                  /* beginning of image */
 };
 
 struct downldio {
index 40ef785a04284d9a4c79633f2877a957b8c405dc..a3fa6a80b3aeaed1c104914bcd0ab9f6d5e14299 100644 (file)
 
 
 #include <linux/kernel.h>
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/delay.h>       /* For udelay */
 #include <linux/slab.h>
 #include <asm/uaccess.h>       /* For copy_from_user/copy_to_user */
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)
 #include <linux/sched.h>
-#endif
 
 #include "dgap_driver.h"
 #include "dgap_pci.h"
index b1cf489a729c8d66327a15dfe3f1bef54733c272..4b9538598f3c42f99a84e3c9a799a46bb3652088 100644 (file)
@@ -46,7 +46,7 @@
 /*
  * Driver identification, error and debugging statments
  *
- * In theory, you can change all occurances of "digi" in the next
+ * In theory, you can change all occurrences of "digi" in the next
  * three lines, and the driver printk's will all automagically change.
  *
  * APR((fmt, args, ...));      Always prints message
index 3a12ba5e3c2ade2f34a2f376ec962e52c71ac74f..c9abc406a1e0cb5fe23f5b074e7f91607279d0b5 100644 (file)
@@ -211,7 +211,7 @@ struct bs_t {
 #define SIFLAG         0xea            /* Set UNIX iflags              */
 #define SFLOWC         0xeb            /* Set flow control characters  */
 #define STLOW          0xec            /* Set transmit low water mark  */
-#define RPAUSE         0xee            /* Pause recieve                */
+#define RPAUSE         0xee            /* Pause receive                */
 #define RRESUME                0xef            /* Resume receive               */  
 #define CHRESET                0xf0            /* Reset Channel                */
 #define BUFSETALL      0xf2            /* Set Tx & Rx buffer size avail*/
index 8ebf4b7373b74c8a696f919f1a10e189053b69d7..0dc2404922ff0a485bfe5e2b72e6e6898e3a32e2 100644 (file)
 #ifndef __DGAP_KCOMPAT_H
 #define __DGAP_KCOMPAT_H
 
-# ifndef KERNEL_VERSION
-#  define KERNEL_VERSION(a,b,c)  (((a) << 16) + ((b) << 8) + (c))
-# endif
-
-
 #if !defined(TTY_FLIPBUF_SIZE)
 # define TTY_FLIPBUF_SIZE 512
 #endif
                module_param(VAR, long, PERM); \
                MODULE_PARM_DESC(VAR, DESC);
 
-
-
-
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
-
-
-
-
-/* NOTHING YET */
-
-
-
-
-# else
-
-
-
-# error "this driver does not support anything below the 2.6.27 kernel series."
-
-
-
-# endif
-
 #endif /* ! __DGAP_KCOMPAT_H */
index 5497e6de06088f21c88cc11a3b53b92ed46d584b..ff9d19449b43c1dc41d8b0a8ba0e9bdc3c2a0116 100644 (file)
@@ -904,7 +904,7 @@ int dgap_parsefile(char **in, int Remove)
 /*
  * dgap_sindex: much like index(), but it looks for a match of any character in
  * the group, and returns that position.  If the first character is a ^, then
- * this will match the first occurence not in that group.
+ * this will match the first occurrence not in that group.
  */
 static char *dgap_sindex (char *string, char *group)
 {
@@ -1013,8 +1013,10 @@ static void dgap_err(char *s)
 static struct cnode *dgap_newnode(int t)
 {
        struct cnode *n;
-       if ( (n = (struct cnode *) kmalloc(sizeof(struct cnode ), GFP_ATOMIC) ) != NULL) {
-               memset( (char *)n, 0, sizeof(struct cnode ) );
+
+       n = kmalloc(sizeof(struct cnode), GFP_ATOMIC);
+       if (n != NULL) {
+               memset((char *)n, 0, sizeof(struct cnode));
                n->type = t;
        }
        return(n);
@@ -1150,7 +1152,7 @@ uint dgap_config_get_altpin(struct board_t *bd)
 
 /*
  * Given a specific type of board, if found, detached link and 
- * returns the first occurance in the list.
+ * returns the first occurrence in the list.
  */
 struct cnode *dgap_find_config(int type, int bus, int slot)
 {
index 94da06fcf7e9b869a9de127f3465660745905bf1..7f4ec9a1829398f87c2bd58a3a3be339c1151b80 100644 (file)
@@ -395,7 +395,7 @@ static ssize_t dgap_tty_state_show(struct device *d, struct device_attribute *at
 
        if (!d)
                return (0);
-       un = (struct un_t *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un || un->magic != DGAP_UNIT_MAGIC)
                return (0);
        ch = un->un_ch;
@@ -420,7 +420,7 @@ static ssize_t dgap_tty_baud_show(struct device *d, struct device_attribute *att
 
        if (!d)
                return (0);
-       un = (struct un_t *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un || un->magic != DGAP_UNIT_MAGIC)
                return (0);
        ch = un->un_ch;
@@ -445,7 +445,7 @@ static ssize_t dgap_tty_msignals_show(struct device *d, struct device_attribute
 
        if (!d)
                return (0);
-       un = (struct un_t *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un || un->magic != DGAP_UNIT_MAGIC)
                return (0);
        ch = un->un_ch;
@@ -479,7 +479,7 @@ static ssize_t dgap_tty_iflag_show(struct device *d, struct device_attribute *at
 
        if (!d)
                return (0);
-       un = (struct un_t *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un || un->magic != DGAP_UNIT_MAGIC)
                return (0);
        ch = un->un_ch;
@@ -504,7 +504,7 @@ static ssize_t dgap_tty_cflag_show(struct device *d, struct device_attribute *at
 
        if (!d)
                return (0);
-       un = (struct un_t *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un || un->magic != DGAP_UNIT_MAGIC)
                return (0);
        ch = un->un_ch;
@@ -529,7 +529,7 @@ static ssize_t dgap_tty_oflag_show(struct device *d, struct device_attribute *at
 
        if (!d)
                return (0);
-       un = (struct un_t *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un || un->magic != DGAP_UNIT_MAGIC)
                return (0);
        ch = un->un_ch;
@@ -554,7 +554,7 @@ static ssize_t dgap_tty_lflag_show(struct device *d, struct device_attribute *at
 
        if (!d)
                return (0);
-       un = (struct un_t *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un || un->magic != DGAP_UNIT_MAGIC)
                return (0);
        ch = un->un_ch;
@@ -579,7 +579,7 @@ static ssize_t dgap_tty_digi_flag_show(struct device *d, struct device_attribute
 
        if (!d)
                return (0);
-       un = (struct un_t *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un || un->magic != DGAP_UNIT_MAGIC)
                return (0);
        ch = un->un_ch;
@@ -604,7 +604,7 @@ static ssize_t dgap_tty_rxcount_show(struct device *d, struct device_attribute *
 
        if (!d)
                return (0);
-       un = (struct un_t *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un || un->magic != DGAP_UNIT_MAGIC)
                return (0);
        ch = un->un_ch;
@@ -629,7 +629,7 @@ static ssize_t dgap_tty_txcount_show(struct device *d, struct device_attribute *
 
        if (!d)
                return (0);
-       un = (struct un_t *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un || un->magic != DGAP_UNIT_MAGIC)
                return (0);
        ch = un->un_ch;
@@ -661,7 +661,7 @@ static ssize_t dgap_tty_name_show(struct device *d, struct device_attribute *att
 
        if (!d)
                return (0);
-       un = (struct un_t *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un || un->magic != DGAP_UNIT_MAGIC)
                return (0);
        ch = un->un_ch;
index b906db30b617678a648f6a910800a98a7c95c6be..2b26152022646c972f9156cc09bcc1b23ebdd2b0 100644 (file)
@@ -249,7 +249,7 @@ int dgap_tty_register(struct board_t *brd)
 
        /*
         * If we're doing transparent print, we have to do all of the above
-        * again, seperately so we don't get the LD confused about what major
+        * again, separately so we don't get the LD confused about what major
         * we are when we get into the dgap_tty_open() routine.
         */
        brd->PrintDriver = alloc_tty_driver(MAXPORTS);
@@ -1069,7 +1069,7 @@ static int dgap_tty_open(struct tty_struct *tty, struct file *file)
 
        DGAP_LOCK(brd->bd_lock, lock_flags);
 
-       /* The wait above should guarentee this cannot happen */
+       /* The wait above should guarantee this cannot happen */
        if (brd->state != BOARD_READY) {
                DGAP_UNLOCK(brd->bd_lock, lock_flags);
                return -ENXIO;
index 651e2e5e93c7780765d0f2c9a9bc6c8d91f6d20f..bcea4f734a329c6a18de37d2e67eba2b7bc9fc92 100644 (file)
@@ -203,9 +203,9 @@ struct shrink_buf_struct {
        unsigned long   shrink_buf_vaddr;       /* Virtual address of board */
        unsigned long   shrink_buf_phys;        /* Physical address of board */
        unsigned long   shrink_buf_bseg;        /* Amount of board memory */
-       unsigned long   shrink_buf_hseg;        /* '186 Begining of Dual-Port */
+       unsigned long   shrink_buf_hseg;        /* '186 Beginning of Dual-Port */
 
-       unsigned long   shrink_buf_lseg;        /* '186 Begining of freed memory                                                */ 
+       unsigned long   shrink_buf_lseg;        /* '186 Beginning of freed memory                                               */ 
        unsigned long   shrink_buf_mseg;        /* Linear address from start of
                                                   dual-port were freed memory
                                                   begins, host viewpoint. */
index 57dfd6bafcf69a2ba3450b65a43c858607a73bc3..638c5da43c85fbad924797369c8349582aedd321 100644 (file)
@@ -52,7 +52,7 @@ char          *pgm;
 void           myperror();
 
 /*
-**  This structure is used to keep track of the diferent images available
+**  This structure is used to keep track of the different images available
 **  to give to the driver.  It is arranged so that the things that are
 **  constants or that have defaults are first inthe strucutre to simplify
 **  the table of initializers.
@@ -789,7 +789,7 @@ int main(int argc, char **argv)
 /*
 ** myperror()
 **
-**  Same as normal perror(), but places the program name at the begining
+**  Same as normal perror(), but places the program name at the beginning
 **  of the message.
 */
 void myperror(char *s)
index 117e158082402ddc5b32ace5dfcadc3201300e2d..fa1bb633f0360e3eca44207cb43d90f006dac1ff 100644 (file)
@@ -43,7 +43,7 @@
 #include "dgnc_tty.h"
 #include "dgnc_trace.h"
 
-static inline void cls_parse_isr(struct board_t *brd, uint port);
+static inline void cls_parse_isr(struct dgnc_board *brd, uint port);
 static inline void cls_clear_break(struct channel_t *ch, int force);
 static inline void cls_set_cts_flow_control(struct channel_t *ch);
 static inline void cls_set_rts_flow_control(struct channel_t *ch);
@@ -53,7 +53,7 @@ static inline void cls_set_no_output_flow_control(struct channel_t *ch);
 static inline void cls_set_no_input_flow_control(struct channel_t *ch);
 static void cls_parse_modem(struct channel_t *ch, uchar signals);
 static void cls_tasklet(unsigned long data);
-static void cls_vpd(struct board_t *brd);
+static void cls_vpd(struct dgnc_board *brd);
 static void cls_uart_init(struct channel_t *ch);
 static void cls_uart_off(struct channel_t *ch);
 static int cls_drain(struct tty_struct *tty, uint seconds);
@@ -393,7 +393,7 @@ static inline void cls_clear_break(struct channel_t *ch, int force)
 
 
 /* Parse the ISR register for the specific port */
-static inline void cls_parse_isr(struct board_t *brd, uint port)
+static inline void cls_parse_isr(struct dgnc_board *brd, uint port)
 {
        struct channel_t *ch;
        uchar isr = 0;
@@ -477,7 +477,7 @@ static void cls_param(struct tty_struct *tty)
        uchar uart_ier = 0;
         uint baud = 9600;
        int quot = 0;
-        struct board_t *bd;
+        struct dgnc_board *bd;
        struct channel_t *ch;
         struct un_t   *un;
 
@@ -725,7 +725,7 @@ static void cls_param(struct tty_struct *tty)
  */
 static void cls_tasklet(unsigned long data)
 {
-        struct board_t *bd = (struct board_t *) data;
+        struct dgnc_board *bd = (struct dgnc_board *) data;
        struct channel_t *ch;
        ulong  lock_flags;
        int i;
@@ -802,7 +802,7 @@ static void cls_tasklet(unsigned long data)
  */
 static irqreturn_t cls_intr(int irq, void *voidbrd)
 {
-       struct board_t *brd = (struct board_t *) voidbrd;
+       struct dgnc_board *brd = (struct dgnc_board *) voidbrd;
        uint i = 0;
        uchar poll_reg;
        unsigned long lock_flags;
@@ -976,17 +976,17 @@ static int cls_drain(struct tty_struct *tty, uint seconds)
        int rc = 0;
 
        if (!tty || tty->magic != TTY_MAGIC) {
-               return (-ENXIO);
+               return -ENXIO;
        }
 
        un = (struct un_t *) tty->driver_data;
        if (!un || un->magic != DGNC_UNIT_MAGIC) {
-               return (-ENXIO);
+               return -ENXIO;
        }
 
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC) {
-               return (-ENXIO);
+               return -ENXIO;
        }
 
        DGNC_LOCK(ch->ch_lock, lock_flags);
@@ -1002,7 +1002,7 @@ static int cls_drain(struct tty_struct *tty, uint seconds)
        if (rc)
                DPR_IOCTL(("%d Drain - User ctrl c'ed\n", __LINE__));
 
-        return (rc);
+        return rc;
 }
 
 
@@ -1378,7 +1378,7 @@ static void cls_send_immediate_char(struct channel_t *ch, unsigned char c)
        writeb(c, &ch->ch_cls_uart->txrx);
 }
 
-static void cls_vpd(struct board_t *brd)
+static void cls_vpd(struct dgnc_board *brd)
 {
         ulong           vpdbase;        /* Start of io base of the card */
         u8 __iomem           *re_map_vpdbase;/* Remapped memory of the card */
index 71d2b83cc3a12e365823df2e40fd176ac26120ef..1318a70401b214cf0683dcb61641636d9426ffdc 100644 (file)
@@ -71,16 +71,16 @@ PARM_INT(trcbuf_size,       0x100000,       0644,   "Debugging trace buffer size.");
  *
  */
 static int             dgnc_start(void);
-static int             dgnc_finalize_board_init(struct board_t *brd);
+static int             dgnc_finalize_board_init(struct dgnc_board *brd);
 static void            dgnc_init_globals(void);
 static int             dgnc_found_board(struct pci_dev *pdev, int id);
-static void            dgnc_cleanup_board(struct board_t *brd);
+static void            dgnc_cleanup_board(struct dgnc_board *brd);
 static void            dgnc_poll_handler(ulong dummy);
 static int             dgnc_init_pci(void);
 static int             dgnc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
 static void            dgnc_remove_one(struct pci_dev *dev);
 static int             dgnc_probe1(struct pci_dev *pdev, int card_type);
-static void            dgnc_do_remap(struct board_t *brd);
+static void            dgnc_do_remap(struct dgnc_board *brd);
 
 /* Driver load/unload functions */
 int            dgnc_init_module(void);
@@ -106,7 +106,7 @@ static struct file_operations dgnc_BoardFops =
  * Globals
  */
 uint                   dgnc_NumBoards;
-struct board_t         *dgnc_Board[MAXBOARDS];
+struct dgnc_board              *dgnc_Board[MAXBOARDS];
 DEFINE_SPINLOCK(dgnc_global_lock);
 int                    dgnc_driver_state = DRIVER_INITIALIZED;
 ulong                  dgnc_poll_counter;
@@ -225,7 +225,7 @@ int dgnc_init_module(void)
        rc = dgnc_start();
 
        if (rc < 0) {
-               return(rc);
+               return rc;
        }
 
        /*
@@ -250,7 +250,7 @@ int dgnc_init_module(void)
        }
 
        DPR_INIT(("Finished init_module. Returning %d\n", rc));
-       return (rc);
+       return rc;
 }
 
 
@@ -286,7 +286,7 @@ static int dgnc_start(void)
                        if (rc <= 0) {
                                APR(("Can't register dgnc driver device (%d)\n", rc));
                                rc = -ENXIO;
-                               return(rc);
+                               return rc;
                        }
                        dgnc_Major = rc;
 
@@ -311,7 +311,7 @@ static int dgnc_start(void)
 
                if (rc < 0) {
                        APR(("tty preinit - not enough memory (%d)\n", rc));
-                       return(rc);
+                       return rc;
                }
 
                /* Start the poller */
@@ -328,7 +328,7 @@ static int dgnc_start(void)
                dgnc_driver_state = DRIVER_READY;
        }
 
-       return(rc);
+       return rc;
 }
 
 /*
@@ -418,7 +418,7 @@ void dgnc_cleanup_module(void)
  *
  * Free all the memory associated with a board
  */
-static void dgnc_cleanup_board(struct board_t *brd)
+static void dgnc_cleanup_board(struct dgnc_board *brd)
 {
        int i = 0;
 
@@ -491,7 +491,7 @@ static void dgnc_cleanup_board(struct board_t *brd)
  */
 static int dgnc_found_board(struct pci_dev *pdev, int id)
 {
-       struct board_t *brd;
+       struct dgnc_board *brd;
        unsigned int pci_irq;
        int i = 0;
        int rc = 0;
@@ -499,10 +499,10 @@ static int dgnc_found_board(struct pci_dev *pdev, int id)
 
        /* get the board structure and prep it */
        brd = dgnc_Board[dgnc_NumBoards] =
-       (struct board_t *) kzalloc(sizeof(struct board_t), GFP_KERNEL);
+       (struct dgnc_board *) kzalloc(sizeof(struct dgnc_board), GFP_KERNEL);
        if (!brd) {
                APR(("memory allocation for board structure failed\n"));
-               return(-ENOMEM);
+               return -ENOMEM;
        }
 
        /* make a temporary message buffer for the boot messages */
@@ -511,7 +511,7 @@ static int dgnc_found_board(struct pci_dev *pdev, int id)
        if (!brd->msgbuf) {
                kfree(brd);
                APR(("memory allocation for board msgbuf failed\n"));
-               return(-ENOMEM);
+               return -ENOMEM;
        }
 
        /* store the info for the board we've found */
@@ -663,7 +663,7 @@ static int dgnc_found_board(struct pci_dev *pdev, int id)
 
        default:
                APR(("Did not find any compatible Neo or Classic PCI boards in system.\n"));
-               return (-ENXIO);
+               return -ENXIO;
 
        }
 
@@ -725,22 +725,22 @@ static int dgnc_found_board(struct pci_dev *pdev, int id)
 
        wake_up_interruptible(&brd->state_wait);
 
-       return(0);
+       return 0;
 
 failed:
 
-       return (-ENXIO);
+       return -ENXIO;
 
 }
 
 
-static int dgnc_finalize_board_init(struct board_t *brd) {
+static int dgnc_finalize_board_init(struct dgnc_board *brd) {
        int rc = 0;
 
        DPR_INIT(("dgnc_finalize_board_init() - start\n"));
 
        if (!brd || brd->magic != DGNC_BOARD_MAGIC)
-               return(-ENODEV);
+               return -ENODEV;
 
        DPR_INIT(("dgnc_finalize_board_init() - start #2\n"));
 
@@ -756,13 +756,13 @@ static int dgnc_finalize_board_init(struct board_t *brd) {
                        DPR_INIT(("Requested and received usage of IRQ %d\n", brd->irq));
                }
        }
-       return(rc);
+       return rc;
 }
 
 /*
  * Remap PCI memory.
  */
-static void dgnc_do_remap(struct board_t *brd)
+static void dgnc_do_remap(struct dgnc_board *brd)
 {
 
        if (!brd || brd->magic != DGNC_BOARD_MAGIC)
@@ -802,7 +802,7 @@ static void dgnc_do_remap(struct board_t *brd)
 
 static void dgnc_poll_handler(ulong dummy)
 {
-       struct board_t *brd;
+       struct dgnc_board *brd;
        unsigned long lock_flags;
        int i;
        unsigned long new_time;
@@ -900,7 +900,7 @@ int dgnc_ms_sleep(ulong ms)
 {
        current->state = TASK_INTERRUPTIBLE;
        schedule_timeout((ms * HZ) / 1000);
-       return (signal_pending(current));
+       return signal_pending(current);
 }
 
 
@@ -912,47 +912,47 @@ char *dgnc_ioctl_name(int cmd)
 {
        switch(cmd) {
 
-       case TCGETA:            return("TCGETA");
-       case TCGETS:            return("TCGETS");
-       case TCSETA:            return("TCSETA");
-       case TCSETS:            return("TCSETS");
-       case TCSETAW:           return("TCSETAW");
-       case TCSETSW:           return("TCSETSW");
-       case TCSETAF:           return("TCSETAF");
-       case TCSETSF:           return("TCSETSF");
-       case TCSBRK:            return("TCSBRK");
-       case TCXONC:            return("TCXONC");
-       case TCFLSH:            return("TCFLSH");
-       case TIOCGSID:          return("TIOCGSID");
-
-       case TIOCGETD:          return("TIOCGETD");
-       case TIOCSETD:          return("TIOCSETD");
-       case TIOCGWINSZ:        return("TIOCGWINSZ");
-       case TIOCSWINSZ:        return("TIOCSWINSZ");
-
-       case TIOCMGET:          return("TIOCMGET");
-       case TIOCMSET:          return("TIOCMSET");
-       case TIOCMBIS:          return("TIOCMBIS");
-       case TIOCMBIC:          return("TIOCMBIC");
+       case TCGETA:            return "TCGETA";
+       case TCGETS:            return "TCGETS";
+       case TCSETA:            return "TCSETA";
+       case TCSETS:            return "TCSETS";
+       case TCSETAW:           return "TCSETAW";
+       case TCSETSW:           return "TCSETSW";
+       case TCSETAF:           return "TCSETAF";
+       case TCSETSF:           return "TCSETSF";
+       case TCSBRK:            return "TCSBRK";
+       case TCXONC:            return "TCXONC";
+       case TCFLSH:            return "TCFLSH";
+       case TIOCGSID:          return "TIOCGSID";
+
+       case TIOCGETD:          return "TIOCGETD";
+       case TIOCSETD:          return "TIOCSETD";
+       case TIOCGWINSZ:        return "TIOCGWINSZ";
+       case TIOCSWINSZ:        return "TIOCSWINSZ";
+
+       case TIOCMGET:          return "TIOCMGET";
+       case TIOCMSET:          return "TIOCMSET";
+       case TIOCMBIS:          return "TIOCMBIS";
+       case TIOCMBIC:          return "TIOCMBIC";
 
        /* from digi.h */
-       case DIGI_SETA:         return("DIGI_SETA");
-       case DIGI_SETAW:        return("DIGI_SETAW");
-       case DIGI_SETAF:        return("DIGI_SETAF");
-       case DIGI_SETFLOW:      return("DIGI_SETFLOW");
-       case DIGI_SETAFLOW:     return("DIGI_SETAFLOW");
-       case DIGI_GETFLOW:      return("DIGI_GETFLOW");
-       case DIGI_GETAFLOW:     return("DIGI_GETAFLOW");
-       case DIGI_GETA:         return("DIGI_GETA");
-       case DIGI_GEDELAY:      return("DIGI_GEDELAY");
-       case DIGI_SEDELAY:      return("DIGI_SEDELAY");
-       case DIGI_GETCUSTOMBAUD: return("DIGI_GETCUSTOMBAUD");
-       case DIGI_SETCUSTOMBAUD: return("DIGI_SETCUSTOMBAUD");
-       case TIOCMODG:          return("TIOCMODG");
-       case TIOCMODS:          return("TIOCMODS");
-       case TIOCSDTR:          return("TIOCSDTR");
-       case TIOCCDTR:          return("TIOCCDTR");
-
-       default:                return("unknown");
+       case DIGI_SETA:         return "DIGI_SETA";
+       case DIGI_SETAW:        return "DIGI_SETAW";
+       case DIGI_SETAF:        return "DIGI_SETAF";
+       case DIGI_SETFLOW:      return "DIGI_SETFLOW";
+       case DIGI_SETAFLOW:     return "DIGI_SETAFLOW";
+       case DIGI_GETFLOW:      return "DIGI_GETFLOW";
+       case DIGI_GETAFLOW:     return "DIGI_GETAFLOW";
+       case DIGI_GETA:         return "DIGI_GETA";
+       case DIGI_GEDELAY:      return "DIGI_GEDELAY";
+       case DIGI_SEDELAY:      return "DIGI_SEDELAY";
+       case DIGI_GETCUSTOMBAUD: return "DIGI_GETCUSTOMBAUD";
+       case DIGI_SETCUSTOMBAUD: return "DIGI_SETCUSTOMBAUD";
+       case TIOCMODG:          return "TIOCMODG";
+       case TIOCMODS:          return "TIOCMODS";
+       case TIOCSDTR:          return "TIOCSDTR";
+       case TIOCCDTR:          return "TIOCCDTR";
+
+       default:                return "unknown";
        }
 }
index 218b15dccb7dc970bef7bd1d56d491b51ad16884..3519b803e7535be17d22adc9e7f889859f9ff577 100644 (file)
@@ -45,7 +45,7 @@
 /*
  * Driver identification, error and debugging statments
  *
- * In theory, you can change all occurances of "digi" in the next
+ * In theory, you can change all occurrences of "digi" in the next
  * three lines, and the driver printk's will all automagically change.
  *
  * APR((fmt, args, ...));      Always prints message
@@ -246,7 +246,7 @@ enum {
  *
  *************************************************************************/
 
-struct board_t;
+struct dgnc_board;
 struct channel_t;
 
 /************************************************************************
@@ -259,7 +259,7 @@ struct board_ops {
        void (*uart_off) (struct channel_t *ch);
        int  (*drain) (struct tty_struct *tty, uint seconds);
        void (*param) (struct tty_struct *tty);
-       void (*vpd) (struct board_t *brd);
+       void (*vpd) (struct dgnc_board *brd);
        void (*assert_modem_signals) (struct channel_t *ch);
        void (*flush_uart_write) (struct channel_t *ch);
        void (*flush_uart_read) (struct channel_t *ch);
@@ -282,7 +282,7 @@ struct board_ops {
 /*
  *     Per-board information
  */
-struct board_t {
+struct dgnc_board {
        int             magic;          /* Board Magic number.  */
        int             boardnum;       /* Board number: 0-32 */
 
@@ -449,7 +449,7 @@ struct un_t {
  ************************************************************************/
 struct channel_t {
        int magic;                      /* Channel Magic Number         */
-       struct board_t  *ch_bd;         /* Board structure pointer      */
+       struct dgnc_board       *ch_bd;         /* Board structure pointer      */
        struct digi_t   ch_digi;        /* Transparent Print structure  */
        struct un_t     ch_tun;         /* Terminal unit info      */
        struct un_t     ch_pun;         /* Printer unit info        */
@@ -555,7 +555,7 @@ extern int          dgnc_poll_tick;         /* Poll interval - 20 ms        */
 extern int             dgnc_trcbuf_size;       /* Size of the ringbuffer       */
 extern spinlock_t      dgnc_global_lock;       /* Driver global spinlock       */
 extern uint            dgnc_NumBoards;         /* Total number of boards       */
-extern struct board_t  *dgnc_Board[MAXBOARDS]; /* Array of board structs       */
+extern struct dgnc_board       *dgnc_Board[MAXBOARDS]; /* Array of board structs       */
 extern ulong           dgnc_poll_counter;      /* Times the poller has run     */
 extern char            *dgnc_state_text[];     /* Array of state text          */
 extern char            *dgnc_driver_state_text[];/* Array of driver state text */
index c4629d7c80b21bb72400e1074662438ce518192a..bb39f5dfa0431cca78ab881fffe881bd91749d6e 100644 (file)
@@ -74,13 +74,13 @@ int dgnc_mgmt_open(struct inode *inode, struct file *file)
                /* Only allow 1 open at a time on mgmt device */
                if (dgnc_mgmt_in_use[minor]) {
                        DGNC_UNLOCK(dgnc_global_lock, lock_flags);
-                       return (-EBUSY);
+                       return -EBUSY;
                }
                dgnc_mgmt_in_use[minor]++;
        }
        else {
                DGNC_UNLOCK(dgnc_global_lock, lock_flags);
-               return (-ENXIO);
+               return -ENXIO;
        }
 
        DGNC_UNLOCK(dgnc_global_lock, lock_flags);
@@ -154,7 +154,7 @@ long dgnc_mgmt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                        ddi.dinfo_nboards, ddi.dinfo_version));
 
                if (copy_to_user(uarg, &ddi, sizeof (ddi)))
-                       return(-EFAULT);
+                       return -EFAULT;
 
                break;
        }
@@ -166,13 +166,13 @@ long dgnc_mgmt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                struct digi_info di;
 
                if (copy_from_user(&brd, uarg, sizeof(int))) {
-                       return(-EFAULT);
+                       return -EFAULT;
                }
 
                DPR_MGMT(("DIGI_GETBD asking about board: %d\n", brd));
 
                if ((brd < 0) || (brd > dgnc_NumBoards) || (dgnc_NumBoards == 0))
-                       return (-ENODEV);
+                       return -ENODEV;
 
                memset(&di, 0, sizeof(di));
 
@@ -196,7 +196,7 @@ long dgnc_mgmt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                        di.info_bdtype, di.info_bdstate, di.info_nports, di.info_physsize));
 
                if (copy_to_user(uarg, &di, sizeof (di)))
-                       return (-EFAULT);
+                       return -EFAULT;
 
                break;
        }
@@ -210,7 +210,7 @@ long dgnc_mgmt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                uint channel = 0;
 
                if (copy_from_user(&ni, uarg, sizeof(struct ni_info))) {
-                       return(-EFAULT);
+                       return -EFAULT;
                }
 
                DPR_MGMT(("DIGI_GETBD asking about board: %d channel: %d\n",
@@ -221,16 +221,16 @@ long dgnc_mgmt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 
                /* Verify boundaries on board */
                if ((board < 0) || (board > dgnc_NumBoards) || (dgnc_NumBoards == 0))
-                       return (-ENODEV);
+                       return -ENODEV;
 
                /* Verify boundaries on channel */
                if ((channel < 0) || (channel > dgnc_Board[board]->nasync))
-                       return (-ENODEV);
+                       return -ENODEV;
 
                ch = dgnc_Board[board]->channels[channel];
 
                if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-                       return (-ENODEV);
+                       return -ENODEV;
 
                memset(&ni, 0, sizeof(ni));
                ni.board = board;
@@ -291,7 +291,7 @@ long dgnc_mgmt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
 
                if (copy_to_user(uarg, &ni, sizeof(ni)))
-                       return (-EFAULT);
+                       return -EFAULT;
 
                break;
        }
index 8b9e09a83f757efb410ac4159180b235923ae8ef..0e2a5e144cfef69d8ba876394b9832108ad20690 100644 (file)
@@ -43,8 +43,8 @@
 #include "dgnc_tty.h"
 #include "dgnc_trace.h"
 
-static inline void neo_parse_lsr(struct board_t *brd, uint port);
-static inline void neo_parse_isr(struct board_t *brd, uint port);
+static inline void neo_parse_lsr(struct dgnc_board *brd, uint port);
+static inline void neo_parse_isr(struct dgnc_board *brd, uint port);
 static void neo_copy_data_from_uart_to_queue(struct channel_t *ch);
 static inline void neo_clear_break(struct channel_t *ch, int force);
 static inline void neo_set_cts_flow_control(struct channel_t *ch);
@@ -56,7 +56,7 @@ static inline void neo_set_no_input_flow_control(struct channel_t *ch);
 static inline void neo_set_new_start_stop_chars(struct channel_t *ch);
 static void neo_parse_modem(struct channel_t *ch, uchar signals);
 static void neo_tasklet(unsigned long data);
-static void neo_vpd(struct board_t *brd);
+static void neo_vpd(struct dgnc_board *brd);
 static void neo_uart_init(struct channel_t *ch);
 static void neo_uart_off(struct channel_t *ch);
 static int neo_drain(struct tty_struct *tty, uint seconds);
@@ -107,7 +107,7 @@ static uint dgnc_offset_table[8] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0
  * In this case, we are reading the DVID (Read-only Device Identification)
  * value of the Neo card.
  */
-static inline void neo_pci_posting_flush(struct board_t *bd)
+static inline void neo_pci_posting_flush(struct dgnc_board *bd)
 {
        readb(bd->re_map_membase + 0x8D);
 }
@@ -411,7 +411,7 @@ static inline void neo_clear_break(struct channel_t *ch, int force)
 /*
  * Parse the ISR register.
  */
-static inline void neo_parse_isr(struct board_t *brd, uint port)
+static inline void neo_parse_isr(struct dgnc_board *brd, uint port)
 {
        struct channel_t *ch;
        uchar isr;
@@ -538,7 +538,7 @@ static inline void neo_parse_isr(struct board_t *brd, uint port)
 }
 
 
-static inline void neo_parse_lsr(struct board_t *brd, uint port)
+static inline void neo_parse_lsr(struct dgnc_board *brd, uint port)
 {
        struct channel_t *ch;
        int linestatus;
@@ -650,7 +650,7 @@ static void neo_param(struct tty_struct *tty)
        uchar uart_ier = 0;
        uint baud = 9600;
        int quot = 0;
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t   *un;
 
@@ -911,7 +911,7 @@ static void neo_param(struct tty_struct *tty)
  */
 static void neo_tasklet(unsigned long data)
 {
-       struct board_t *bd = (struct board_t *) data;
+       struct dgnc_board *bd = (struct dgnc_board *) data;
        struct channel_t *ch;
        ulong  lock_flags;
        int i;
@@ -994,7 +994,7 @@ static void neo_tasklet(unsigned long data)
  */
 static irqreturn_t neo_intr(int irq, void *voidbrd)
 {
-       struct board_t *brd = (struct board_t *) voidbrd;
+       struct dgnc_board *brd = (struct dgnc_board *) voidbrd;
        struct channel_t *ch;
        int port = 0;
        int type = 0;
@@ -1111,7 +1111,7 @@ static irqreturn_t neo_intr(int irq, void *voidbrd)
                         * Why would I check EVERY possibility of type of
                         * interrupt, when we know its TXRDY???
                         * Becuz for some reason, even tho we got triggered for TXRDY,
-                        * it seems to be occassionally wrong. Instead of TX, which
+                        * it seems to be occasionally wrong. Instead of TX, which
                         * it should be, I was getting things like RXDY too. Weird.
                         */
                        neo_parse_isr(brd, port);
@@ -1404,17 +1404,17 @@ static int neo_drain(struct tty_struct *tty, uint seconds)
        int rc = 0;
 
        if (!tty || tty->magic != TTY_MAGIC) {
-               return (-ENXIO);
+               return -ENXIO;
        }
 
        un = (struct un_t *) tty->driver_data;
        if (!un || un->magic != DGNC_UNIT_MAGIC) {
-               return (-ENXIO);
+               return -ENXIO;
        }
 
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC) {
-               return (-ENXIO);
+               return -ENXIO;
        }
 
        DPR_IOCTL(("%d Drain wait started.\n", __LINE__));
@@ -1439,7 +1439,7 @@ static int neo_drain(struct tty_struct *tty, uint seconds)
                DPR_IOCTL(("%d Drain wait finished.\n", __LINE__));
        }
 
-       return (rc);
+       return rc;
 }
 
 
@@ -1939,7 +1939,7 @@ static unsigned int neo_read_eeprom(unsigned char __iomem *base, unsigned int ad
 }
 
 
-static void neo_vpd(struct board_t *brd)
+static void neo_vpd(struct dgnc_board *brd)
 {
        unsigned int i = 0;
        unsigned int a;
index 7ec5710a4340f7ce54c462cb29df2d4929d925e3..1a4abb128693657bfc1fcfc7520f313fe18317b6 100644 (file)
@@ -47,7 +47,7 @@ struct neo_uart_struct {
        u8 fctr;                /* WR  FCTR - Feature Control Reg */
        u8 efr;         /* WR  EFR - Enhanced Function Reg */
        u8 tfifo;               /* WR  TXCNT/TXTRG - Transmit FIFO Reg */
-       u8 rfifo;               /* WR  RXCNT/RXTRG - Recieve  FIFO Reg */
+       u8 rfifo;               /* WR  RXCNT/RXTRG - Receive  FIFO Reg */
        u8 xoffchar1;   /* WR  XOFF 1 - XOff Character 1 Reg */
        u8 xoffchar2;   /* WR  XOFF 2 - XOff Character 2 Reg */
        u8 xonchar1;    /* WR  XON 1 - Xon Character 1 Reg */
index 0ea6c800280505639b2df05f554e7210f6888275..5834e0c17ee0eba9a5add291d2fabdc22bc54b86 100644 (file)
@@ -152,19 +152,19 @@ void dgnc_remove_driver_sysfiles(struct pci_driver *dgnc_driver)
 
 #define DGNC_VERIFY_BOARD(p, bd)                       \
        if (!p)                                         \
-               return (0);                             \
+               return 0;                               \
                                                        \
        bd = dev_get_drvdata(p);                        \
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)       \
-               return (0);                             \
+               return 0;                               \
        if (bd->state != BOARD_READY)                   \
-               return (0);                             \
+               return 0;                               \
 
 
 
 static ssize_t dgnc_vpd_show(struct device *p, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        int count = 0;
        int i = 0;
 
@@ -184,7 +184,7 @@ static DEVICE_ATTR(vpd, S_IRUSR, dgnc_vpd_show, NULL);
 
 static ssize_t dgnc_serial_number_show(struct device *p, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        int count = 0;
 
        DGNC_VERIFY_BOARD(p, bd);
@@ -201,7 +201,7 @@ static DEVICE_ATTR(serial_number, S_IRUSR, dgnc_serial_number_show, NULL);
 
 static ssize_t dgnc_ports_state_show(struct device *p, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        int count = 0;
        int i = 0;
 
@@ -219,7 +219,7 @@ static DEVICE_ATTR(ports_state, S_IRUSR, dgnc_ports_state_show, NULL);
 
 static ssize_t dgnc_ports_baud_show(struct device *p, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        int count = 0;
        int i = 0;
 
@@ -236,7 +236,7 @@ static DEVICE_ATTR(ports_baud, S_IRUSR, dgnc_ports_baud_show, NULL);
 
 static ssize_t dgnc_ports_msignals_show(struct device *p, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        int count = 0;
        int i = 0;
 
@@ -264,7 +264,7 @@ static DEVICE_ATTR(ports_msignals, S_IRUSR, dgnc_ports_msignals_show, NULL);
 
 static ssize_t dgnc_ports_iflag_show(struct device *p, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        int count = 0;
        int i = 0;
 
@@ -281,7 +281,7 @@ static DEVICE_ATTR(ports_iflag, S_IRUSR, dgnc_ports_iflag_show, NULL);
 
 static ssize_t dgnc_ports_cflag_show(struct device *p, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        int count = 0;
        int i = 0;
 
@@ -298,7 +298,7 @@ static DEVICE_ATTR(ports_cflag, S_IRUSR, dgnc_ports_cflag_show, NULL);
 
 static ssize_t dgnc_ports_oflag_show(struct device *p, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        int count = 0;
        int i = 0;
 
@@ -315,7 +315,7 @@ static DEVICE_ATTR(ports_oflag, S_IRUSR, dgnc_ports_oflag_show, NULL);
 
 static ssize_t dgnc_ports_lflag_show(struct device *p, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        int count = 0;
        int i = 0;
 
@@ -332,7 +332,7 @@ static DEVICE_ATTR(ports_lflag, S_IRUSR, dgnc_ports_lflag_show, NULL);
 
 static ssize_t dgnc_ports_digi_flag_show(struct device *p, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        int count = 0;
        int i = 0;
 
@@ -349,7 +349,7 @@ static DEVICE_ATTR(ports_digi_flag, S_IRUSR, dgnc_ports_digi_flag_show, NULL);
 
 static ssize_t dgnc_ports_rxcount_show(struct device *p, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        int count = 0;
        int i = 0;
 
@@ -366,7 +366,7 @@ static DEVICE_ATTR(ports_rxcount, S_IRUSR, dgnc_ports_rxcount_show, NULL);
 
 static ssize_t dgnc_ports_txcount_show(struct device *p, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        int count = 0;
        int i = 0;
 
@@ -384,7 +384,7 @@ static DEVICE_ATTR(ports_txcount, S_IRUSR, dgnc_ports_txcount_show, NULL);
 /* this function creates the sys files that will export each signal status
  * to sysfs each value will be put in a separate filename
  */
-void dgnc_create_ports_sysfiles(struct board_t *bd)
+void dgnc_create_ports_sysfiles(struct dgnc_board *bd)
 {
        int rc = 0;
 
@@ -408,7 +408,7 @@ void dgnc_create_ports_sysfiles(struct board_t *bd)
 
 
 /* removes all the sys files created for that port */
-void dgnc_remove_ports_sysfiles(struct board_t *bd)
+void dgnc_remove_ports_sysfiles(struct dgnc_board *bd)
 {
        device_remove_file(&(bd->pdev->dev), &dev_attr_ports_state);
        device_remove_file(&(bd->pdev->dev), &dev_attr_ports_baud);
@@ -427,23 +427,23 @@ void dgnc_remove_ports_sysfiles(struct board_t *bd)
 
 static ssize_t dgnc_tty_state_show(struct device *d, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
 
        if (!d)
-               return (0);
+               return 0;
        un = (struct un_t *) dev_get_drvdata(d);
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (0);
+               return 0;
        if (bd->state != BOARD_READY)
-               return (0);
+               return 0;
 
        return snprintf(buf, PAGE_SIZE, "%s", un->un_open_count ? "Open" : "Closed");
 }
@@ -452,23 +452,23 @@ static DEVICE_ATTR(state, S_IRUSR, dgnc_tty_state_show, NULL);
 
 static ssize_t dgnc_tty_baud_show(struct device *d, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
 
        if (!d)
-               return (0);
+               return 0;
        un = (struct un_t *) dev_get_drvdata(d);
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (0);
+               return 0;
        if (bd->state != BOARD_READY)
-               return (0);
+               return 0;
 
        return snprintf(buf, PAGE_SIZE, "%d\n", ch->ch_old_baud);
 }
@@ -477,23 +477,23 @@ static DEVICE_ATTR(baud, S_IRUSR, dgnc_tty_baud_show, NULL);
 
 static ssize_t dgnc_tty_msignals_show(struct device *d, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
 
        if (!d)
-               return (0);
+               return 0;
        un = (struct un_t *) dev_get_drvdata(d);
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (0);
+               return 0;
        if (bd->state != BOARD_READY)
-               return (0);
+               return 0;
 
        if (ch->ch_open_count) {
                return snprintf(buf, PAGE_SIZE, "%s %s %s %s %s %s\n",
@@ -511,23 +511,23 @@ static DEVICE_ATTR(msignals, S_IRUSR, dgnc_tty_msignals_show, NULL);
 
 static ssize_t dgnc_tty_iflag_show(struct device *d, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
 
        if (!d)
-               return (0);
+               return 0;
        un = (struct un_t *) dev_get_drvdata(d);
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (0);
+               return 0;
        if (bd->state != BOARD_READY)
-               return (0);
+               return 0;
 
        return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_iflag);
 }
@@ -536,23 +536,23 @@ static DEVICE_ATTR(iflag, S_IRUSR, dgnc_tty_iflag_show, NULL);
 
 static ssize_t dgnc_tty_cflag_show(struct device *d, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
 
        if (!d)
-               return (0);
+               return 0;
        un = (struct un_t *) dev_get_drvdata(d);
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (0);
+               return 0;
        if (bd->state != BOARD_READY)
-               return (0);
+               return 0;
 
        return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_cflag);
 }
@@ -561,23 +561,23 @@ static DEVICE_ATTR(cflag, S_IRUSR, dgnc_tty_cflag_show, NULL);
 
 static ssize_t dgnc_tty_oflag_show(struct device *d, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
 
        if (!d)
-               return (0);
+               return 0;
        un = (struct un_t *) dev_get_drvdata(d);
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (0);
+               return 0;
        if (bd->state != BOARD_READY)
-               return (0);
+               return 0;
 
        return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_oflag);
 }
@@ -586,23 +586,23 @@ static DEVICE_ATTR(oflag, S_IRUSR, dgnc_tty_oflag_show, NULL);
 
 static ssize_t dgnc_tty_lflag_show(struct device *d, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
 
        if (!d)
-               return (0);
+               return 0;
        un = (struct un_t *) dev_get_drvdata(d);
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (0);
+               return 0;
        if (bd->state != BOARD_READY)
-               return (0);
+               return 0;
 
        return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_lflag);
 }
@@ -611,23 +611,23 @@ static DEVICE_ATTR(lflag, S_IRUSR, dgnc_tty_lflag_show, NULL);
 
 static ssize_t dgnc_tty_digi_flag_show(struct device *d, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
 
        if (!d)
-               return (0);
+               return 0;
        un = (struct un_t *) dev_get_drvdata(d);
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (0);
+               return 0;
        if (bd->state != BOARD_READY)
-               return (0);
+               return 0;
 
        return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_digi.digi_flags);
 }
@@ -636,23 +636,23 @@ static DEVICE_ATTR(digi_flag, S_IRUSR, dgnc_tty_digi_flag_show, NULL);
 
 static ssize_t dgnc_tty_rxcount_show(struct device *d, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
 
        if (!d)
-               return (0);
+               return 0;
        un = (struct un_t *) dev_get_drvdata(d);
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (0);
+               return 0;
        if (bd->state != BOARD_READY)
-               return (0);
+               return 0;
 
        return snprintf(buf, PAGE_SIZE, "%ld\n", ch->ch_rxcount);
 }
@@ -661,23 +661,23 @@ static DEVICE_ATTR(rxcount, S_IRUSR, dgnc_tty_rxcount_show, NULL);
 
 static ssize_t dgnc_tty_txcount_show(struct device *d, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
 
        if (!d)
-               return (0);
+               return 0;
        un = (struct un_t *) dev_get_drvdata(d);
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (0);
+               return 0;
        if (bd->state != BOARD_READY)
-               return (0);
+               return 0;
 
        return snprintf(buf, PAGE_SIZE, "%ld\n", ch->ch_txcount);
 }
@@ -686,23 +686,23 @@ static DEVICE_ATTR(txcount, S_IRUSR, dgnc_tty_txcount_show, NULL);
 
 static ssize_t dgnc_tty_name_show(struct device *d, struct device_attribute *attr, char *buf)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
 
        if (!d)
-               return (0);
+               return 0;
        un = (struct un_t *) dev_get_drvdata(d);
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (0);
+               return 0;
        if (bd->state != BOARD_READY)
-               return (0);
+               return 0;
 
        return snprintf(buf, PAGE_SIZE, "%sn%d%c\n",
                (un->un_type == DGNC_PRINT) ? "pr" : "tty",
index 4b87ce1cc7a2434c5b56124fabdba2751c1a0dd7..68c0de5898a483c6c918c7cd10d69932e56f7129 100644 (file)
 
 #include <linux/device.h>
 
-struct board_t;
+struct dgnc_board;
 struct channel_t;
 struct un_t;
 struct pci_driver;
 struct class_device;
 
-extern void dgnc_create_ports_sysfiles(struct board_t *bd);
-extern void dgnc_remove_ports_sysfiles(struct board_t *bd);
+extern void dgnc_create_ports_sysfiles(struct dgnc_board *bd);
+extern void dgnc_remove_ports_sysfiles(struct dgnc_board *bd);
 
 extern void dgnc_create_driver_sysfiles(struct pci_driver *);
 extern void dgnc_remove_driver_sysfiles(struct pci_driver *);
index a7bb6bceb9e7b738ee072c7040df97c72a0ec7d7..6906e9810913bcaca56252cd9d9f5f7765267d9c 100644 (file)
@@ -69,7 +69,7 @@
 /*
  * internal variables
  */
-static struct board_t  *dgnc_BoardsByMajor[256];
+static struct dgnc_board       *dgnc_BoardsByMajor[256];
 static uchar           *dgnc_TmpWriteBuf = NULL;
 static DECLARE_MUTEX(dgnc_TmpWriteSem);
 
@@ -190,10 +190,10 @@ int dgnc_tty_preinit(void)
 
        if (!dgnc_TmpWriteBuf) {
                DPR_INIT(("unable to allocate tmp write buf"));
-               return (-ENOMEM);
+               return -ENOMEM;
        }
 
-       return(0);
+       return 0;
 }
 
 
@@ -202,7 +202,7 @@ int dgnc_tty_preinit(void)
  *
  * Init the tty subsystem for this board.
  */
-int dgnc_tty_register(struct board_t *brd)
+int dgnc_tty_register(struct dgnc_board *brd)
 {
        int rc = 0;
 
@@ -232,7 +232,7 @@ int dgnc_tty_register(struct board_t *brd)
         */
        brd->SerialDriver.ttys = kzalloc(brd->maxports * sizeof(struct tty_struct *), GFP_KERNEL);
        if (!brd->SerialDriver.ttys)
-               return(-ENOMEM);
+               return -ENOMEM;
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28)
        brd->SerialDriver.refcount = brd->TtyRefCnt;
@@ -242,12 +242,12 @@ int dgnc_tty_register(struct board_t *brd)
 
        brd->SerialDriver.termios = kzalloc(brd->maxports * sizeof(struct ktermios *), GFP_KERNEL);
        if (!brd->SerialDriver.termios)
-               return(-ENOMEM);
+               return -ENOMEM;
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
        brd->SerialDriver.termios_locked = kzalloc(brd->maxports * sizeof(struct ktermios *), GFP_KERNEL);
        if (!brd->SerialDriver.termios_locked)
-               return(-ENOMEM);
+               return -ENOMEM;
 #endif
        /*
         * Entry points for driver.  Called by the kernel from
@@ -260,14 +260,14 @@ int dgnc_tty_register(struct board_t *brd)
                rc = tty_register_driver(&brd->SerialDriver);
                if (rc < 0) {
                        APR(("Can't register tty device (%d)\n", rc));
-                       return(rc);
+                       return rc;
                }
                brd->dgnc_Major_Serial_Registered = TRUE;
        }
 
        /*
         * If we're doing transparent print, we have to do all of the above
-        * again, seperately so we don't get the LD confused about what major
+        * again, separately so we don't get the LD confused about what major
         * we are when we get into the dgnc_tty_open() routine.
         */
        brd->PrintDriver.magic = TTY_DRIVER_MAGIC;
@@ -286,12 +286,12 @@ int dgnc_tty_register(struct board_t *brd)
 
        /*
         * The kernel wants space to store pointers to
-        * tty_struct's and termios's.  Must be seperate from
+        * tty_struct's and termios's.  Must be separated from
         * the Serial Driver so we don't get confused
         */
        brd->PrintDriver.ttys = kzalloc(brd->maxports * sizeof(struct tty_struct *), GFP_KERNEL);
        if (!brd->PrintDriver.ttys)
-               return(-ENOMEM);
+               return -ENOMEM;
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28)
        brd->PrintDriver.refcount = brd->TtyRefCnt;
@@ -301,12 +301,12 @@ int dgnc_tty_register(struct board_t *brd)
 
        brd->PrintDriver.termios = kzalloc(brd->maxports * sizeof(struct ktermios *), GFP_KERNEL);
        if (!brd->PrintDriver.termios)
-               return(-ENOMEM);
+               return -ENOMEM;
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
        brd->PrintDriver.termios_locked = kzalloc(brd->maxports * sizeof(struct ktermios *), GFP_KERNEL);
        if (!brd->PrintDriver.termios_locked)
-               return(-ENOMEM);
+               return -ENOMEM;
 #endif
 
        /*
@@ -320,7 +320,7 @@ int dgnc_tty_register(struct board_t *brd)
                rc = tty_register_driver(&brd->PrintDriver);
                if (rc < 0) {
                        APR(("Can't register Transparent Print device (%d)\n", rc));
-                       return(rc);
+                       return rc;
                }
                brd->dgnc_Major_TransparentPrint_Registered = TRUE;
        }
@@ -331,7 +331,7 @@ int dgnc_tty_register(struct board_t *brd)
 
        DPR_INIT(("DGNC REGISTER TTY: MAJOR: %d\n", brd->SerialDriver.major));
 
-       return (rc);
+       return rc;
 }
 
 
@@ -341,14 +341,14 @@ int dgnc_tty_register(struct board_t *brd)
  * Init the tty subsystem.  Called once per board after board has been
  * downloaded and init'ed.
  */
-int dgnc_tty_init(struct board_t *brd)
+int dgnc_tty_init(struct dgnc_board *brd)
 {
        int i;
        void __iomem *vaddr;
        struct channel_t *ch;
 
        if (!brd)
-               return (-ENXIO);
+               return -ENXIO;
 
        DPR_INIT(("dgnc_tty_init start\n"));
 
@@ -436,7 +436,7 @@ int dgnc_tty_init(struct board_t *brd)
 
        DPR_INIT(("dgnc_tty_init finish\n"));
 
-       return (0);
+       return 0;
 }
 
 
@@ -460,7 +460,7 @@ void dgnc_tty_post_uninit(void)
  * Uninitialize the TTY portion of this driver.  Free all memory and
  * resources.
  */
-void dgnc_tty_uninit(struct board_t *brd)
+void dgnc_tty_uninit(struct dgnc_board *brd)
 {
        int i = 0;
 
@@ -671,7 +671,7 @@ static void dgnc_wmove(struct channel_t *ch, char *buf, uint n)
  *=======================================================================*/
 void dgnc_input(struct channel_t *ch)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct tty_struct *tp;
        struct tty_ldisc *ld;
        uint    rmask;
@@ -867,7 +867,7 @@ void dgnc_input(struct channel_t *ch)
  ************************************************************************/
 void dgnc_carrier(struct channel_t *ch)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
 
        int virt_carrier = 0;
        int phys_carrier = 0;
@@ -1260,7 +1260,7 @@ void dgnc_wakeup_writes(struct channel_t *ch)
  */
 static int dgnc_tty_open(struct tty_struct *tty, struct file *file)
 {
-       struct board_t  *brd;
+       struct dgnc_board       *brd;
        struct channel_t *ch;
        struct un_t     *un;
        uint            major = 0;
@@ -1473,7 +1473,7 @@ static int dgnc_tty_open(struct tty_struct *tty, struct file *file)
        DGNC_UNLOCK(ch->ch_lock, lock_flags);
 
        DPR_OPEN(("dgnc_tty_open finished\n"));
-       return (rc);
+       return rc;
 }
 
 
@@ -1491,12 +1491,12 @@ static int dgnc_block_til_ready(struct tty_struct *tty, struct file *file, struc
        int     sleep_on_un_flags = 0;
 
        if (!tty || tty->magic != TTY_MAGIC || !file || !ch || ch->magic != DGNC_CHANNEL_MAGIC) {
-               return (-ENXIO);
+               return -ENXIO;
        }
 
        un = tty->driver_data;
        if (!un || un->magic != DGNC_UNIT_MAGIC) {
-               return (-ENXIO);
+               return -ENXIO;
        }
 
        DPR_OPEN(("dgnc_block_til_ready - before block.\n"));
@@ -1624,12 +1624,12 @@ static int dgnc_block_til_ready(struct tty_struct *tty, struct file *file, struc
 
        if (retval) {
                DPR_OPEN(("dgnc_block_til_ready - done. error. retval: %x\n", retval));
-               return(retval);
+               return retval;
        }
 
        DPR_OPEN(("dgnc_block_til_ready - done no error. jiffies: %lu\n", jiffies));
 
-       return(0);
+       return 0;
 }
 
 
@@ -1667,7 +1667,7 @@ static void dgnc_tty_hangup(struct tty_struct *tty)
 static void dgnc_tty_close(struct tty_struct *tty, struct file *file)
 {
        struct ktermios *ts;
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
        ulong lock_flags;
@@ -1843,15 +1843,15 @@ static int dgnc_tty_chars_in_buffer(struct tty_struct *tty)
        ulong   lock_flags = 0;
 
        if (tty == NULL)
-               return(0);
+               return 0;
 
        un = tty->driver_data;
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
 
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
 
        DGNC_LOCK(ch->ch_lock, lock_flags);
 
@@ -1873,7 +1873,7 @@ static int dgnc_tty_chars_in_buffer(struct tty_struct *tty)
        DPR_WRITE(("dgnc_tty_chars_in_buffer. Port: %x - %d (head: %d tail: %d)\n",
                ch->ch_portnum, chars, thead, ttail));
 
-       return(chars);
+       return chars;
 }
 
 
@@ -1891,22 +1891,22 @@ static int dgnc_maxcps_room(struct tty_struct *tty, int bytes_available)
        struct un_t *un = NULL;
 
        if (!tty)
-               return (bytes_available);
+               return bytes_available;
 
        un = tty->driver_data;
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (bytes_available);
+               return bytes_available;
 
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (bytes_available);
+               return bytes_available;
 
        /*
         * If its not the Transparent print device, return
         * the full data amount.
         */
        if (un->un_type != DGNC_PRINT)
-               return (bytes_available);
+               return bytes_available;
 
        if (ch->ch_digi.digi_maxcps > 0 && ch->ch_digi.digi_bufsize > 0 ) {
                int cps_limit = 0;
@@ -1931,7 +1931,7 @@ static int dgnc_maxcps_room(struct tty_struct *tty, int bytes_available)
                bytes_available = min(cps_limit, bytes_available);
        }
 
-       return (bytes_available);
+       return bytes_available;
 }
 
 
@@ -1951,15 +1951,15 @@ static int dgnc_tty_write_room(struct tty_struct *tty)
        ulong   lock_flags = 0;
 
        if (tty == NULL || dgnc_TmpWriteBuf == NULL)
-               return(0);
+               return 0;
 
        un = tty->driver_data;
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (0);
+               return 0;
 
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (0);
+               return 0;
 
        DGNC_LOCK(ch->ch_lock, lock_flags);
 
@@ -1994,7 +1994,7 @@ static int dgnc_tty_write_room(struct tty_struct *tty)
 
        DPR_WRITE(("dgnc_tty_write_room - %d tail: %d head: %d\n", ret, tail, head));
 
-       return(ret);
+       return ret;
 }
 
 
@@ -2037,18 +2037,18 @@ static int dgnc_tty_write(struct tty_struct *tty,
        int from_user = 0;
 
        if (tty == NULL || dgnc_TmpWriteBuf == NULL)
-               return(0);
+               return 0;
 
        un = tty->driver_data;
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return(0);
+               return 0;
 
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return(0);
+               return 0;
 
        if (!count)
-               return(0);
+               return 0;
 
        DPR_WRITE(("dgnc_tty_write: Port: %x tty=%p user=%d len=%d\n",
                ch->ch_portnum, tty, from_user, count));
@@ -2090,7 +2090,7 @@ static int dgnc_tty_write(struct tty_struct *tty,
         */
        if (count <= 0) {
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
-               return(0);
+               return 0;
        }
 
        /*
@@ -2120,7 +2120,7 @@ static int dgnc_tty_write(struct tty_struct *tty,
         */
        if (count <= 0) {
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
-               return(0);
+               return 0;
        }
 
        if (from_user) {
@@ -2136,7 +2136,7 @@ static int dgnc_tty_write(struct tty_struct *tty,
                 */
                /* we're allowed to block if it's from_user */
                if (down_interruptible(&dgnc_TmpWriteSem)) {
-                       return (-EINTR);
+                       return -EINTR;
                }
 
                /*
@@ -2147,7 +2147,7 @@ static int dgnc_tty_write(struct tty_struct *tty,
 
                if (!count) {
                        up(&dgnc_TmpWriteSem);
-                       return(-EFAULT);
+                       return -EFAULT;
                }
 
                DGNC_LOCK(ch->ch_lock, lock_flags);
@@ -2229,7 +2229,7 @@ static int dgnc_tty_write(struct tty_struct *tty,
                ch->ch_bd->bd_ops->copy_data_from_queue_to_uart(ch);
        }
 
-       return (count);
+       return count;
 }
 
 
@@ -2301,7 +2301,7 @@ static int dgnc_tty_tiocmset(struct tty_struct *tty, struct file *file,
                unsigned int set, unsigned int clear)
 #endif
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
        int ret = -EIO;
@@ -2349,7 +2349,7 @@ static int dgnc_tty_tiocmset(struct tty_struct *tty, struct file *file,
 
        DPR_IOCTL(("dgnc_tty_tiocmset finish\n"));
 
-       return (0);
+       return 0;
 }
 
 
@@ -2360,7 +2360,7 @@ static int dgnc_tty_tiocmset(struct tty_struct *tty, struct file *file,
  */
 static int dgnc_tty_send_break(struct tty_struct *tty, int msec)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
        int ret = -EIO;
@@ -2402,7 +2402,7 @@ static int dgnc_tty_send_break(struct tty_struct *tty, int msec)
 
        DPR_IOCTL(("dgnc_tty_send_break finish\n"));
 
-       return (0);
+       return 0;
 
 }
 
@@ -2414,7 +2414,7 @@ static int dgnc_tty_send_break(struct tty_struct *tty, int msec)
  */
 static void dgnc_tty_wait_until_sent(struct tty_struct *tty, int timeout)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
        int rc;
@@ -2450,7 +2450,7 @@ static void dgnc_tty_wait_until_sent(struct tty_struct *tty, int timeout)
  */
 static void dgnc_tty_send_xchar(struct tty_struct *tty, char c)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
        ulong   lock_flags;
@@ -2497,7 +2497,7 @@ static inline int dgnc_get_mstat(struct channel_t *ch)
        DPR_IOCTL(("dgnc_getmstat start\n"));
 
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return(-ENXIO);
+               return -ENXIO;
 
        DGNC_LOCK(ch->ch_lock, lock_flags);
 
@@ -2522,7 +2522,7 @@ static inline int dgnc_get_mstat(struct channel_t *ch)
 
        DPR_IOCTL(("dgnc_getmstat finish\n"));
 
-       return(result);
+       return result;
 }
 
 
@@ -2538,17 +2538,17 @@ static int dgnc_get_modem_info(struct channel_t *ch, unsigned int  __user *value
        DPR_IOCTL(("dgnc_get_modem_info start\n"));
 
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return(-ENXIO);
+               return -ENXIO;
 
        result = dgnc_get_mstat(ch);
 
        if (result < 0)
-               return (-ENXIO);
+               return -ENXIO;
 
        rc = put_user(result, value);
 
        DPR_IOCTL(("dgnc_get_modem_info finish\n"));
-       return(rc);
+       return rc;
 }
 
 
@@ -2559,7 +2559,7 @@ static int dgnc_get_modem_info(struct channel_t *ch, unsigned int  __user *value
  */
 static int dgnc_set_modem_info(struct tty_struct *tty, unsigned int command, unsigned int __user *value)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
        int ret = -ENXIO;
@@ -2587,7 +2587,7 @@ static int dgnc_set_modem_info(struct tty_struct *tty, unsigned int command, uns
 
        ret = get_user(arg, value);
        if (ret)
-               return(ret);
+               return ret;
 
        switch (command) {
        case TIOCMBIS:
@@ -2631,7 +2631,7 @@ static int dgnc_set_modem_info(struct tty_struct *tty, unsigned int command, uns
                break;
 
        default:
-               return(-EINVAL);
+               return -EINVAL;
        }
 
        DGNC_LOCK(ch->ch_lock, lock_flags);
@@ -2642,7 +2642,7 @@ static int dgnc_set_modem_info(struct tty_struct *tty, unsigned int command, uns
 
        DPR_IOCTL(("dgnc_set_modem_info finish\n"));
 
-       return (0);
+       return 0;
 }
 
 
@@ -2662,18 +2662,18 @@ static int dgnc_tty_digigeta(struct tty_struct *tty, struct digi_t __user *retin
        ulong   lock_flags;
 
        if (!retinfo)
-               return (-EFAULT);
+               return -EFAULT;
 
        if (!tty || tty->magic != TTY_MAGIC)
-               return (-EFAULT);
+               return -EFAULT;
 
        un = tty->driver_data;
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (-EFAULT);
+               return -EFAULT;
 
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (-EFAULT);
+               return -EFAULT;
 
        memset(&tmp, 0, sizeof(tmp));
 
@@ -2682,9 +2682,9 @@ static int dgnc_tty_digigeta(struct tty_struct *tty, struct digi_t __user *retin
        DGNC_UNLOCK(ch->ch_lock, lock_flags);
 
        if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
-               return (-EFAULT);
+               return -EFAULT;
 
-       return (0);
+       return 0;
 }
 
 
@@ -2698,7 +2698,7 @@ static int dgnc_tty_digigeta(struct tty_struct *tty, struct digi_t __user *retin
  */
 static int dgnc_tty_digiseta(struct tty_struct *tty, struct digi_t __user *new_info)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
        struct digi_t new_digi;
@@ -2707,23 +2707,23 @@ static int dgnc_tty_digiseta(struct tty_struct *tty, struct digi_t __user *new_i
        DPR_IOCTL(("DIGI_SETA start\n"));
 
        if (!tty || tty->magic != TTY_MAGIC)
-               return (-EFAULT);
+               return -EFAULT;
 
        un = tty->driver_data;
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (-EFAULT);
+               return -EFAULT;
 
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (-EFAULT);
+               return -EFAULT;
 
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (-EFAULT);
+               return -EFAULT;
 
        if (copy_from_user(&new_digi, new_info, sizeof(struct digi_t))) {
                DPR_IOCTL(("DIGI_SETA failed copy_from_user\n"));
-               return(-EFAULT);
+               return -EFAULT;
        }
 
        DGNC_LOCK(ch->ch_lock, lock_flags);
@@ -2773,7 +2773,7 @@ static int dgnc_tty_digiseta(struct tty_struct *tty, struct digi_t __user *new_i
 
        DPR_IOCTL(("DIGI_SETA finish\n"));
 
-       return(0);
+       return 0;
 }
 
 
@@ -2782,7 +2782,7 @@ static int dgnc_tty_digiseta(struct tty_struct *tty, struct digi_t __user *new_i
  */
 static void dgnc_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
        unsigned long lock_flags;
@@ -2878,7 +2878,7 @@ static void dgnc_tty_unthrottle(struct tty_struct *tty)
 
 static void dgnc_tty_start(struct tty_struct *tty)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
        ulong lock_flags;
@@ -2912,7 +2912,7 @@ static void dgnc_tty_start(struct tty_struct *tty)
 
 static void dgnc_tty_stop(struct tty_struct *tty)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
        ulong lock_flags;
@@ -2959,7 +2959,7 @@ static void dgnc_tty_stop(struct tty_struct *tty)
  */
 static void dgnc_tty_flush_chars(struct tty_struct *tty)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
        ulong lock_flags;
@@ -3056,7 +3056,7 @@ static void dgnc_tty_flush_buffer(struct tty_struct *tty)
 static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                unsigned long arg)
 {
-       struct board_t *bd;
+       struct dgnc_board *bd;
        struct channel_t *ch;
        struct un_t *un;
        int rc;
@@ -3064,19 +3064,19 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
        void __user *uarg = (void __user *) arg;
 
        if (!tty || tty->magic != TTY_MAGIC)
-               return (-ENODEV);
+               return -ENODEV;
 
        un = tty->driver_data;
        if (!un || un->magic != DGNC_UNIT_MAGIC)
-               return (-ENODEV);
+               return -ENODEV;
 
        ch = un->un_ch;
        if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
-               return (-ENODEV);
+               return -ENODEV;
 
        bd = ch->ch_bd;
        if (!bd || bd->magic != DGNC_BOARD_MAGIC)
-               return (-ENODEV);
+               return -ENODEV;
 
        DPR_IOCTL(("dgnc_tty_ioctl start on port %d - cmd %s (%x), arg %lx\n",
                ch->ch_portnum, dgnc_ioctl_name(cmd), cmd, arg));
@@ -3086,7 +3086,7 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
        if (un->un_open_count <= 0) {
                DPR_BASIC(("dgnc_tty_ioctl - unit not open.\n"));
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
-               return(-EIO);
+               return -EIO;
        }
 
        switch (cmd) {
@@ -3105,14 +3105,14 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                rc = tty_check_change(tty);
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
                if (rc) {
-                       return(rc);
+                       return rc;
                }
 
                rc = ch->ch_bd->bd_ops->drain(tty, 0);
 
                if (rc) {
                        DPR_IOCTL(("dgnc_tty_ioctl - bad return: %d ", rc));
-                       return(-EINTR);
+                       return -EINTR;
                }
 
                DGNC_LOCK(ch->ch_lock, lock_flags);
@@ -3126,7 +3126,7 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                DPR_IOCTL(("dgnc_tty_ioctl finish on port %d - cmd %s (%x), arg %lx\n",
                        ch->ch_portnum, dgnc_ioctl_name(cmd), cmd, arg));
 
-               return(0);
+               return 0;
 
 
        case TCSBRKP:
@@ -3138,13 +3138,13 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                rc = tty_check_change(tty);
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
                if (rc) {
-                       return(rc);
+                       return rc;
                }
 
                rc = ch->ch_bd->bd_ops->drain(tty, 0);
                if (rc) {
                        DPR_IOCTL(("dgnc_tty_ioctl - bad return: %d ", rc));
-                       return(-EINTR);
+                       return -EINTR;
                }
 
                DGNC_LOCK(ch->ch_lock, lock_flags);
@@ -3156,19 +3156,19 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                DPR_IOCTL(("dgnc_tty_ioctl finish on port %d - cmd %s (%x), arg %lx\n",
                        ch->ch_portnum, dgnc_ioctl_name(cmd), cmd, arg));
 
-               return(0);
+               return 0;
 
        case TIOCSBRK:
                rc = tty_check_change(tty);
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
                if (rc) {
-                       return(rc);
+                       return rc;
                }
 
                rc = ch->ch_bd->bd_ops->drain(tty, 0);
                if (rc) {
                        DPR_IOCTL(("dgnc_tty_ioctl - bad return: %d ", rc));
-                       return(-EINTR);
+                       return -EINTR;
                }
 
                DGNC_LOCK(ch->ch_lock, lock_flags);
@@ -3180,7 +3180,7 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                DPR_IOCTL(("dgnc_tty_ioctl finish on port %d - cmd %s (%x), arg %lx\n",
                        ch->ch_portnum, dgnc_ioctl_name(cmd), cmd, arg));
 
-               return(0);
+               return 0;
 
        case TIOCCBRK:
                /* Do Nothing */
@@ -3192,31 +3192,31 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
 
                rc = put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long __user *) arg);
-               return(rc);
+               return rc;
 
        case TIOCSSOFTCAR:
 
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
                rc = get_user(arg, (unsigned long __user *) arg);
                if (rc)
-                       return(rc);
+                       return rc;
 
                DGNC_LOCK(ch->ch_lock, lock_flags);
                tty->termios.c_cflag = ((tty->termios.c_cflag & ~CLOCAL) | (arg ? CLOCAL : 0));
                ch->ch_bd->bd_ops->param(tty);
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
 
-               return(0);
+               return 0;
 
        case TIOCMGET:
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
-               return(dgnc_get_modem_info(ch, uarg));
+               return dgnc_get_modem_info(ch, uarg);
 
        case TIOCMBIS:
        case TIOCMBIC:
        case TIOCMSET:
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
-               return(dgnc_set_modem_info(tty, cmd, uarg));
+               return dgnc_set_modem_info(tty, cmd, uarg);
 
                /*
                 * Here are any additional ioctl's that we want to implement
@@ -3235,7 +3235,7 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                rc = tty_check_change(tty);
                if (rc) {
                        DGNC_UNLOCK(ch->ch_lock, lock_flags);
-                       return(rc);
+                       return rc;
                }
 
                if ((arg == TCIFLUSH) || (arg == TCIOFLUSH)) {
@@ -3265,7 +3265,7 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
 
                /* pretend we didn't recognize this IOCTL */
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
-               return(-ENOIOCTLCMD);
+               return -ENOIOCTLCMD;
        case TCSETSF:
        case TCSETSW:
                /*
@@ -3291,14 +3291,14 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                rc = ch->ch_bd->bd_ops->drain(tty, 0);
                if (rc) {
                        DPR_IOCTL(("dgnc_tty_ioctl - bad return: %d\n", rc));
-                       return(-EINTR);
+                       return -EINTR;
                }
 
                DPR_IOCTL(("dgnc_tty_ioctl finish on port %d - cmd %s (%x), arg %lx\n",
                        ch->ch_portnum, dgnc_ioctl_name(cmd), cmd, arg));
 
                /* pretend we didn't recognize this */
-               return(-ENOIOCTLCMD);
+               return -ENOIOCTLCMD;
 
        case TCSETAW:
 
@@ -3306,21 +3306,21 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                rc = ch->ch_bd->bd_ops->drain(tty, 0);
                if (rc) {
                        DPR_IOCTL(("dgnc_tty_ioctl - bad return: %d ", rc));
-                       return(-EINTR);
+                       return -EINTR;
                }
 
                /* pretend we didn't recognize this */
-               return(-ENOIOCTLCMD);
+               return -ENOIOCTLCMD;
 
        case TCXONC:
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
                /* Make the ld do it */
-               return(-ENOIOCTLCMD);
+               return -ENOIOCTLCMD;
 
        case DIGI_GETA:
                /* get information for ditty */
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
-               return(dgnc_tty_digigeta(tty, uarg));
+               return dgnc_tty_digigeta(tty, uarg);
 
        case DIGI_SETAW:
        case DIGI_SETAF:
@@ -3332,7 +3332,7 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                        rc = ch->ch_bd->bd_ops->drain(tty, 0);
                        if (rc) {
                                DPR_IOCTL(("dgnc_tty_ioctl - bad return: %d ", rc));
-                               return(-EINTR);
+                               return -EINTR;
                        }
                        DGNC_LOCK(ch->ch_lock, lock_flags);
                }
@@ -3343,7 +3343,7 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
 
        case DIGI_SETA:
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
-               return(dgnc_tty_digiseta(tty, uarg));
+               return dgnc_tty_digiseta(tty, uarg);
 
        case DIGI_LOOPBACK:
                {
@@ -3352,7 +3352,7 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                        DGNC_UNLOCK(ch->ch_lock, lock_flags);
                        rc = get_user(loopback, (unsigned int __user *) arg);
                        if (rc)
-                               return(rc);
+                               return rc;
                        DGNC_LOCK(ch->ch_lock, lock_flags);
 
                        /* Enable/disable internal loopback for this port */
@@ -3363,13 +3363,13 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
 
                        ch->ch_bd->bd_ops->param(tty);
                        DGNC_UNLOCK(ch->ch_lock, lock_flags);
-                       return(0);
+                       return 0;
                }
 
        case DIGI_GETCUSTOMBAUD:
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
                rc = put_user(ch->ch_custom_speed, (unsigned int __user *) arg);
-               return(rc);
+               return rc;
 
        case DIGI_SETCUSTOMBAUD:
        {
@@ -3378,12 +3378,12 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
                rc = get_user(new_rate, (unsigned int __user *) arg);
                if (rc)
-                       return(rc);
+                       return rc;
                DGNC_LOCK(ch->ch_lock, lock_flags);
                dgnc_set_custom_speed(ch, new_rate);
                ch->ch_bd->bd_ops->param(tty);
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
-               return(0);
+               return 0;
        }
 
        /*
@@ -3399,11 +3399,11 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
                rc = get_user(c, (unsigned char __user *) arg);
                if (rc)
-                       return(rc);
+                       return rc;
                DGNC_LOCK(ch->ch_lock, lock_flags);
                ch->ch_bd->bd_ops->send_immediate_char(ch, c);
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
-               return(0);
+               return 0;
        }
 
        /*
@@ -3427,9 +3427,9 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
 
                if (copy_to_user(uarg, &buf, sizeof(struct digi_getcounter))) {
-                       return (-EFAULT);
+                       return -EFAULT;
                }
-               return(0);
+               return 0;
        }
 
        /*
@@ -3454,7 +3454,7 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
 
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
                rc = put_user(events, (unsigned int __user *) arg);
-               return(rc);
+               return rc;
        }
 
        /*
@@ -3475,7 +3475,7 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                 * Get data from user first.
                 */
                if (copy_from_user(&buf, uarg, sizeof(struct digi_getbuffer))) {
-                       return (-EFAULT);
+                       return -EFAULT;
                }
 
                DGNC_LOCK(ch->ch_lock, lock_flags);
@@ -3521,9 +3521,9 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
 
                if (copy_to_user(uarg, &buf, sizeof(struct digi_getbuffer))) {
-                       return (-EFAULT);
+                       return -EFAULT;
                }
-               return(0);
+               return 0;
        }
        default:
                DGNC_UNLOCK(ch->ch_lock, lock_flags);
@@ -3532,7 +3532,7 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
                DPR_IOCTL(("dgnc_tty_ioctl end - cmd %s (%x), arg %lx\n",
                        dgnc_ioctl_name(cmd), cmd, arg));
 
-               return(-ENOIOCTLCMD);
+               return -ENOIOCTLCMD;
        }
 
        DGNC_UNLOCK(ch->ch_lock, lock_flags);
@@ -3540,5 +3540,5 @@ static int dgnc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
        DPR_IOCTL(("dgnc_tty_ioctl end - cmd %s (%x), arg %lx\n",
                dgnc_ioctl_name(cmd), cmd, arg));
 
-       return(0);
+       return 0;
 }
index deb388d2f4cff0861dbad385c35f3d6ce27dc1e2..9d1c2847bd9429617a7a10ff16538c03daf45435 100644 (file)
 
 #include "dgnc_driver.h"
 
-int    dgnc_tty_register(struct board_t *brd);
+int    dgnc_tty_register(struct dgnc_board *brd);
 
 int    dgnc_tty_preinit(void);
-int     dgnc_tty_init(struct board_t *);
+int     dgnc_tty_init(struct dgnc_board *);
 
 void   dgnc_tty_post_uninit(void);
-void   dgnc_tty_uninit(struct board_t *);
+void   dgnc_tty_uninit(struct dgnc_board *);
 
 void   dgnc_input(struct channel_t *ch);
 void   dgnc_carrier(struct channel_t *ch);
index eb6e3712572763c77987e45baed1a06b1c084bf1..6a9adf6591ebcaabf480c1e63d222d2d03ea807d 100644 (file)
@@ -201,9 +201,9 @@ struct shrink_buf_struct {
        unsigned int    shrink_buf_vaddr;       /* Virtual address of board */
        unsigned int    shrink_buf_phys;        /* Physical address of board */
        unsigned int    shrink_buf_bseg;        /* Amount of board memory */
-       unsigned int    shrink_buf_hseg;        /* '186 Begining of Dual-Port */
+       unsigned int    shrink_buf_hseg;        /* '186 Beginning of Dual-Port */
 
-       unsigned int    shrink_buf_lseg;        /* '186 Begining of freed memory */
+       unsigned int    shrink_buf_lseg;        /* '186 Beginning of freed memory */
        unsigned int    shrink_buf_mseg;        /* Linear address from start of
                                                   dual-port were freed memory
                                                   begins, host viewpoint. */
index 8cee9c8bc38b1850b8bdcc3edad37e91a6996515..9a18a2c9e73b20932ecb72d7fd6469617580c7c8 100644 (file)
@@ -157,7 +157,7 @@ static ssize_t dgrp_node_state_show(struct device *c,
 
        if (!c)
                return 0;
-       nd = (struct nd_struct *) dev_get_drvdata(c);
+       nd = dev_get_drvdata(c);
        if (!nd)
                return 0;
 
@@ -174,7 +174,7 @@ static ssize_t dgrp_node_description_show(struct device *c,
 
        if (!c)
                return 0;
-       nd = (struct nd_struct *) dev_get_drvdata(c);
+       nd = dev_get_drvdata(c);
        if (!nd)
                return 0;
 
@@ -192,7 +192,7 @@ static ssize_t dgrp_node_hw_version_show(struct device *c,
 
        if (!c)
                return 0;
-       nd = (struct nd_struct *) dev_get_drvdata(c);
+       nd = dev_get_drvdata(c);
        if (!nd)
                return 0;
 
@@ -212,7 +212,7 @@ static ssize_t dgrp_node_hw_id_show(struct device *c,
 
        if (!c)
                return 0;
-       nd = (struct nd_struct *) dev_get_drvdata(c);
+       nd = dev_get_drvdata(c);
        if (!nd)
                return 0;
 
@@ -232,7 +232,7 @@ static ssize_t dgrp_node_sw_version_show(struct device *c,
        if (!c)
                return 0;
 
-       nd = (struct nd_struct *) dev_get_drvdata(c);
+       nd = dev_get_drvdata(c);
        if (!nd)
                return 0;
 
@@ -311,7 +311,7 @@ static ssize_t dgrp_tty_state_show(struct device *d,
 
        if (!d)
                return 0;
-       un = (struct un_struct *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un)
                return 0;
 
@@ -328,7 +328,7 @@ static ssize_t dgrp_tty_baud_show(struct device *d,
 
        if (!d)
                return 0;
-       un = (struct un_struct *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un)
                return 0;
        ch = un->un_ch;
@@ -348,7 +348,7 @@ static ssize_t dgrp_tty_msignals_show(struct device *d,
 
        if (!d)
                return 0;
-       un = (struct un_struct *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un)
                return 0;
        ch = un->un_ch;
@@ -377,7 +377,7 @@ static ssize_t dgrp_tty_iflag_show(struct device *d,
 
        if (!d)
                return 0;
-       un = (struct un_struct *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un)
                return 0;
        ch = un->un_ch;
@@ -396,7 +396,7 @@ static ssize_t dgrp_tty_cflag_show(struct device *d,
 
        if (!d)
                return 0;
-       un = (struct un_struct *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un)
                return 0;
        ch = un->un_ch;
@@ -415,7 +415,7 @@ static ssize_t dgrp_tty_oflag_show(struct device *d,
 
        if (!d)
                return 0;
-       un = (struct un_struct *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un)
                return 0;
        ch = un->un_ch;
@@ -434,7 +434,7 @@ static ssize_t dgrp_tty_digi_flag_show(struct device *d,
 
        if (!d)
                return 0;
-       un = (struct un_struct *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un)
                return 0;
        ch = un->un_ch;
@@ -453,7 +453,7 @@ static ssize_t dgrp_tty_rxcount_show(struct device *d,
 
        if (!d)
                return 0;
-       un = (struct un_struct *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un)
                return 0;
        ch = un->un_ch;
@@ -472,7 +472,7 @@ static ssize_t dgrp_tty_txcount_show(struct device *d,
 
        if (!d)
                return 0;
-       un = (struct un_struct *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un)
                return 0;
        ch = un->un_ch;
@@ -493,7 +493,7 @@ static ssize_t dgrp_tty_name_show(struct device *d,
 
        if (!d)
                return 0;
-       un = (struct un_struct *) dev_get_drvdata(d);
+       un = dev_get_drvdata(d);
        if (!un)
                return 0;
        ch = un->un_ch;
index 06dae67a9d6294499ebf5926a7734bd56e1dc1ec..8dbd174c91293608d1aa1663880ef1bfce3fd0a6 100644 (file)
@@ -564,7 +564,7 @@ void dwc2_core_host_init(struct dwc2_hsotg *hsotg)
 
        /*
         * This bit allows dynamic reloading of the HFIR register during
-        * runtime. This bit needs to be programmed during inital configuration
+        * runtime. This bit needs to be programmed during initial configuration
         * and its value must not be changed during runtime.
         */
        if (hsotg->core_params->reload_ctl > 0) {
index b1980ef28fa30ce2581e7a3516a4e5ee807e5a8d..c09b2db2c89a042766d4b947d9e1590ff01be33e 100644 (file)
@@ -251,12 +251,12 @@ void dwc2_hcd_qh_free(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh)
  *
  * @hsotg: The HCD state structure for the DWC OTG controller
  *
- * Return: 0 if successful, negative error code otherise
+ * Return: 0 if successful, negative error code otherwise
  */
 static int dwc2_periodic_channel_available(struct dwc2_hsotg *hsotg)
 {
        /*
-        * Currently assuming that there is a dedicated host channnel for
+        * Currently assuming that there is a dedicated host channel for
         * each periodic transaction plus at least one host channel for
         * non-periodic transactions
         */
diff --git a/drivers/staging/et131x/Module.symvers b/drivers/staging/et131x/Module.symvers
new file mode 100644 (file)
index 0000000..e69de29
index 9272a24ae61c8250ba770acf8f85e69c610d0f99..8da96a6d2c927946d0c1444fca0472904af7b21b 100644 (file)
@@ -11,7 +11,12 @@ TODO:
        - Look at reducing the number of spinlocks
        - Simplify code in nic_rx_pkts(), when determining multicast_pkts_rcvd
        - Implement NAPI support
-       - in et131x_tx(), don't return NETDEV_TX_BUSY, just drop the packet with          kfree_skb().
+       - In et131x_tx(), don't return NETDEV_TX_BUSY, just drop the packet with kfree_skb().
+       - Reduce the number of split lines by careful consideration of variable names etc.
+       - Do this in et131x.c:
+                struct fbr_lookup *fbr;
+                fbr = rx_local->fbr[id];
+         Then replace all the instances of "rx_local->fbr[id]" with fbr.
 
 Please send patches to:
        Greg Kroah-Hartman <gregkh@linuxfoundation.org>
index f73e58f5ef8d0390f8b4068db2030d9d1b42592c..7cd3d34707585c90f9155db6eac3b14ac59f9da8 100644 (file)
@@ -493,11 +493,8 @@ struct et131x_adapter {
        spinlock_t send_hw_lock;
 
        spinlock_t rcv_lock;
-       spinlock_t rcv_pend_lock;
        spinlock_t fbr_lock;
 
-       spinlock_t phy_lock;
-
        /* Packet Filter and look ahead size */
        u32 packet_filter;
 
@@ -2777,10 +2774,9 @@ static void et131x_handle_recv_interrupt(struct et131x_adapter *adapter)
                adapter->net_stats.rx_packets++;
 
                /* Set the status on the packet, either resources or success */
-               if (adapter->rx_ring.num_ready_recv < RFD_LOW_WATER_MARK) {
-                       dev_warn(&adapter->pdev->dev,
-                                   "RFD's are running out\n");
-               }
+               if (adapter->rx_ring.num_ready_recv < RFD_LOW_WATER_MARK)
+                       dev_warn(&adapter->pdev->dev, "RFD's are running out\n");
+
                count++;
        }
 
@@ -3100,11 +3096,10 @@ static int send_packet(struct sk_buff *skb, struct et131x_adapter *adapter)
                shbufva = (u16 *) skb->data;
 
                if ((shbufva[0] == 0xffff) &&
-                   (shbufva[1] == 0xffff) && (shbufva[2] == 0xffff)) {
+                   (shbufva[1] == 0xffff) && (shbufva[2] == 0xffff))
                        tcb->flags |= FMP_DEST_BROAD;
-               } else if ((shbufva[0] & 0x3) == 0x0001) {
+               else if ((shbufva[0] & 0x3) == 0x0001)
                        tcb->flags |=  FMP_DEST_MULTI;
-               }
        }
 
        tcb->next = NULL;
@@ -3926,9 +3921,7 @@ static struct et131x_adapter *et131x_adapter_init(struct net_device *netdev,
        spin_lock_init(&adapter->tcb_ready_qlock);
        spin_lock_init(&adapter->send_hw_lock);
        spin_lock_init(&adapter->rcv_lock);
-       spin_lock_init(&adapter->rcv_pend_lock);
        spin_lock_init(&adapter->fbr_lock);
-       spin_lock_init(&adapter->phy_lock);
 
        adapter->registry_jumbo_packet = 1514;  /* 1514-9216 */
 
index ff92f34e4746f3e9e0239abe945c866115e86605..62df009e5ac7c8e9bcd5779bf57e9b8c1d2c309d 100644 (file)
@@ -2394,7 +2394,8 @@ static int fwserial_create(struct fw_unit *unit)
 
        list_del_rcu(&serial->list);
        if (create_loop_dev)
-               tty_unregister_device(fwloop_driver, loop_idx(serial->ports[j]));
+               tty_unregister_device(fwloop_driver,
+                                     loop_idx(serial->ports[j]));
 unregister_ttys:
        for (--j; j >= 0; --j)
                tty_unregister_device(fwtty_driver, serial->ports[j]->index);
index 5b8f0f6c99385d409ba471acfe902a041518da38..aae86ddd658ba9ed3bc45f837b23aaae3bf4ce3f 100644 (file)
@@ -146,11 +146,7 @@ static irqreturn_t lis3l02dq_trigger_handler(int irq, void *p)
        if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
                len = lis3l02dq_get_buffer_element(indio_dev, data);
 
-         /* Guaranteed to be aligned with 8 byte boundary */
-       if (indio_dev->scan_timestamp)
-               *(s64 *)((u8 *)data + ALIGN(len, sizeof(s64)))
-                       = pf->timestamp;
-       iio_push_to_buffers(indio_dev, (u8 *)data);
+       iio_push_to_buffers_with_timestamp(indio_dev, data, pf->timestamp);
 
        kfree(data);
 done:
index 48a25ba290f5ae8a19c18c824a155c082321c66e..6a9ca20ea22d7dd8d0f2079285922af9e70df504 100644 (file)
@@ -624,9 +624,9 @@ static ssize_t sca3000_set_frequency(struct device *dev,
        struct sca3000_state *st = iio_priv(indio_dev);
        int ret, base_freq = 0;
        int ctrlval;
-       long val;
+       int val;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtoint(buf, 10, &val);
        if (ret)
                return ret;
 
@@ -931,12 +931,12 @@ static ssize_t sca3000_set_free_fall_mode(struct device *dev,
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct sca3000_state *st = iio_priv(indio_dev);
-       long val;
+       u8 val;
        int ret;
        u8 protect_mask = SCA3000_FREE_FALL_DETECT;
 
        mutex_lock(&st->lock);
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou8(buf, 10, &val);
        if (ret)
                goto error_ret;
 
index 3e5e860aa38eec64ad8805c6b33c03952d6acad0..0f2ee3373d9a39773138a974e90f36c66d14189b 100644 (file)
@@ -177,11 +177,11 @@ static ssize_t sca3000_set_ring_int(struct device *dev,
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct sca3000_state *st = iio_priv(indio_dev);
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-       long val;
+       u8 val;
        int ret;
 
        mutex_lock(&st->lock);
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou8(buf, 10, &val);
        if (ret)
                goto error_ret;
        ret = sca3000_read_data_short(st, SCA3000_REG_ADDR_INT_MASK, 1);
index 3283e282953653eab17c098c8df6bcfe64f9d602..83bb44b381524bc448929ccab8fe29ffad92c496 100644 (file)
@@ -623,17 +623,17 @@ static int ad7192_probe(struct spi_device *spi)
                return -ENODEV;
        }
 
-       indio_dev = iio_device_alloc(sizeof(*st));
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
        if (indio_dev == NULL)
                return -ENOMEM;
 
        st = iio_priv(indio_dev);
 
-       st->reg = regulator_get(&spi->dev, "vcc");
+       st->reg = devm_regulator_get(&spi->dev, "vcc");
        if (!IS_ERR(st->reg)) {
                ret = regulator_enable(st->reg);
                if (ret)
-                       goto error_put_reg;
+                       return ret;
 
                voltage_uv = regulator_get_voltage(st->reg);
        }
@@ -677,11 +677,6 @@ error_remove_trigger:
 error_disable_reg:
        if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
-error_put_reg:
-       if (!IS_ERR(st->reg))
-               regulator_put(st->reg);
-
-       iio_device_free(indio_dev);
 
        return ret;
 }
@@ -694,10 +689,8 @@ static int ad7192_remove(struct spi_device *spi)
        iio_device_unregister(indio_dev);
        ad_sd_cleanup_buffer_and_trigger(indio_dev);
 
-       if (!IS_ERR(st->reg)) {
+       if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
-               regulator_put(st->reg);
-       }
 
        return 0;
 }
index c19618bc37c4a004e21206e9ae55e5116ad4016e..e7191e44a970faebada245611359dcc6ab99b49b 100644 (file)
@@ -835,8 +835,9 @@ static int ad7280_probe(struct spi_device *spi)
        int ret;
        const unsigned short tACQ_ns[4] = {465, 1010, 1460, 1890};
        const unsigned short nAVG[4] = {1, 2, 4, 8};
-       struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
+       struct iio_dev *indio_dev;
 
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
        if (indio_dev == NULL)
                return -ENOMEM;
 
@@ -860,7 +861,7 @@ static int ad7280_probe(struct spi_device *spi)
 
        ret = ad7280_chain_setup(st);
        if (ret < 0)
-               goto error_free_device;
+               return ret;
 
        st->slave_num = ret;
        st->scan_cnt = (st->slave_num + 1) * AD7280A_NUM_CH;
@@ -891,7 +892,7 @@ static int ad7280_probe(struct spi_device *spi)
 
        ret = ad7280_channel_init(st);
        if (ret < 0)
-               goto error_free_device;
+               return ret;
 
        indio_dev->num_channels = ret;
        indio_dev->channels = st->channels;
@@ -940,9 +941,6 @@ error_free_attr:
 error_free_channels:
        kfree(st->channels);
 
-error_free_device:
-       iio_device_free(indio_dev);
-
        return ret;
 }
 
@@ -960,7 +958,6 @@ static int ad7280_remove(struct spi_device *spi)
 
        kfree(st->channels);
        kfree(st->iio_attr);
-       iio_device_free(indio_dev);
 
        return 0;
 }
index a2e61c2fc8d19a319aa1d29e4bfadc7866d6c3f3..1dae1efe41c7e2817537087f6edb4c2eebdef330 100644 (file)
@@ -528,21 +528,19 @@ static int ad7291_probe(struct i2c_client *client,
        struct iio_dev *indio_dev;
        int ret = 0;
 
-       indio_dev = iio_device_alloc(sizeof(*chip));
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*chip));
+       if (!indio_dev)
+               return -ENOMEM;
        chip = iio_priv(indio_dev);
 
        if (pdata && pdata->use_external_ref) {
-               chip->reg = regulator_get(&client->dev, "vref");
+               chip->reg = devm_regulator_get(&client->dev, "vref");
                if (IS_ERR(chip->reg))
-                       goto error_free;
+                       return ret;
 
                ret = regulator_enable(chip->reg);
                if (ret)
-                       goto error_put_reg;
+                       return ret;
        }
 
        mutex_init(&chip->state_lock);
@@ -601,12 +599,7 @@ error_unreg_irq:
 error_disable_reg:
        if (chip->reg)
                regulator_disable(chip->reg);
-error_put_reg:
-       if (chip->reg)
-               regulator_put(chip->reg);
-error_free:
-       iio_device_free(indio_dev);
-error_ret:
+
        return ret;
 }
 
@@ -620,12 +613,8 @@ static int ad7291_remove(struct i2c_client *client)
        if (client->irq)
                free_irq(client->irq, indio_dev);
 
-       if (chip->reg) {
+       if (chip->reg)
                regulator_disable(chip->reg);
-               regulator_put(chip->reg);
-       }
-
-       iio_device_free(indio_dev);
 
        return 0;
 }
index 72868ceda360cdd969cae70ddc6b1e50b2b33bb6..f042027b52912cd81e8267229c1590d4528e7579 100644 (file)
@@ -425,8 +425,7 @@ static irqreturn_t ad7606_interrupt(int irq, void *dev_id)
        struct ad7606_state *st = iio_priv(indio_dev);
 
        if (iio_buffer_enabled(indio_dev)) {
-               if (!work_pending(&st->poll_work))
-                       schedule_work(&st->poll_work);
+               schedule_work(&st->poll_work);
        } else {
                st->done = true;
                wake_up_interruptible(&st->wq_data_avail);
@@ -466,12 +465,11 @@ struct iio_dev *ad7606_probe(struct device *dev, int irq,
        struct ad7606_platform_data *pdata = dev->platform_data;
        struct ad7606_state *st;
        int ret;
-       struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
+       struct iio_dev *indio_dev;
 
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
+       if (!indio_dev)
+               return ERR_PTR(-ENOMEM);
 
        st = iio_priv(indio_dev);
 
@@ -489,11 +487,11 @@ struct iio_dev *ad7606_probe(struct device *dev, int irq,
                st->oversampling = pdata->default_os;
        }
 
-       st->reg = regulator_get(dev, "vcc");
+       st->reg = devm_regulator_get(dev, "vcc");
        if (!IS_ERR(st->reg)) {
                ret = regulator_enable(st->reg);
                if (ret)
-                       goto error_put_reg;
+                       return ERR_PTR(ret);
        }
 
        st->pdata = pdata;
@@ -554,11 +552,6 @@ error_free_gpios:
 error_disable_reg:
        if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
-error_put_reg:
-       if (!IS_ERR(st->reg))
-               regulator_put(st->reg);
-       iio_device_free(indio_dev);
-error_ret:
        return ERR_PTR(ret);
 }
 
@@ -570,13 +563,10 @@ int ad7606_remove(struct iio_dev *indio_dev, int irq)
        ad7606_ring_cleanup(indio_dev);
 
        free_irq(irq, indio_dev);
-       if (!IS_ERR(st->reg)) {
+       if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
-               regulator_put(st->reg);
-       }
 
        ad7606_free_gpios(st);
-       iio_device_free(indio_dev);
 
        return 0;
 }
index 2b25cb07fe41d1470513424380de4ab439657191..3bf174cb19b1ef3573482896fef1848a3f7941ff 100644 (file)
@@ -46,7 +46,6 @@ static void ad7606_poll_bh_to_ring(struct work_struct *work_s)
        struct ad7606_state *st = container_of(work_s, struct ad7606_state,
                                                poll_work);
        struct iio_dev *indio_dev = iio_priv_to_dev(st);
-       s64 time_ns;
        __u8 *buf;
        int ret;
 
@@ -78,12 +77,7 @@ static void ad7606_poll_bh_to_ring(struct work_struct *work_s)
                        goto done;
        }
 
-       time_ns = iio_get_time_ns();
-
-       if (indio_dev->scan_timestamp)
-               *((s64 *)(buf + indio_dev->scan_bytes - sizeof(s64))) = time_ns;
-
-       iio_push_to_buffers(indio_dev, buf);
+       iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns());
 done:
        gpio_set_value(st->pdata->gpio_convst, 0);
        iio_trigger_notify_done(indio_dev->trig);
index e1f88603d7e023f2fe389ceb1af865de43141de9..4f2522a9edfb2c509906244b44fb8747dc8d08e9 100644 (file)
@@ -171,7 +171,7 @@ static int ad7780_probe(struct spi_device *spi)
        struct iio_dev *indio_dev;
        int ret, voltage_uv = 0;
 
-       indio_dev = iio_device_alloc(sizeof(*st));
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
        if (indio_dev == NULL)
                return -ENOMEM;
 
@@ -180,11 +180,11 @@ static int ad7780_probe(struct spi_device *spi)
 
        ad_sd_init(&st->sd, indio_dev, spi, &ad7780_sigma_delta_info);
 
-       st->reg = regulator_get(&spi->dev, "vcc");
+       st->reg = devm_regulator_get(&spi->dev, "vcc");
        if (!IS_ERR(st->reg)) {
                ret = regulator_enable(st->reg);
                if (ret)
-                       goto error_put_reg;
+                       return ret;
 
                voltage_uv = regulator_get_voltage(st->reg);
        }
@@ -210,8 +210,8 @@ static int ad7780_probe(struct spi_device *spi)
 
        if (pdata && gpio_is_valid(pdata->gpio_pdrst)) {
 
-               ret = gpio_request_one(pdata->gpio_pdrst, GPIOF_OUT_INIT_LOW,
-                              "AD7780 /PDRST");
+               ret = devm_gpio_request_one(&spi->dev, pdata->gpio_pdrst,
+                                       GPIOF_OUT_INIT_LOW, "AD7780 /PDRST");
                if (ret) {
                        dev_err(&spi->dev, "failed to request GPIO PDRST\n");
                        goto error_disable_reg;
@@ -223,7 +223,7 @@ static int ad7780_probe(struct spi_device *spi)
 
        ret = ad_sd_setup_buffer_and_trigger(indio_dev);
        if (ret)
-               goto error_free_gpio;
+               goto error_disable_reg;
 
        ret = iio_device_register(indio_dev);
        if (ret)
@@ -233,17 +233,9 @@ static int ad7780_probe(struct spi_device *spi)
 
 error_cleanup_buffer_and_trigger:
        ad_sd_cleanup_buffer_and_trigger(indio_dev);
-error_free_gpio:
-       if (pdata && gpio_is_valid(pdata->gpio_pdrst))
-               gpio_free(pdata->gpio_pdrst);
 error_disable_reg:
        if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
-error_put_reg:
-       if (!IS_ERR(st->reg))
-               regulator_put(st->reg);
-
-       iio_device_free(indio_dev);
 
        return ret;
 }
@@ -256,14 +248,8 @@ static int ad7780_remove(struct spi_device *spi)
        iio_device_unregister(indio_dev);
        ad_sd_cleanup_buffer_and_trigger(indio_dev);
 
-       if (gpio_is_valid(st->powerdown_gpio))
-               gpio_free(st->powerdown_gpio);
-
-       if (!IS_ERR(st->reg)) {
+       if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
-               regulator_put(st->reg);
-       }
-       iio_device_free(indio_dev);
 
        return 0;
 }
index 8470036a3378cba40d787f1e45fcb0410bd5d676..9f48e5c74eed85c8f164208d4ddbaf4ed108dfb8 100644 (file)
@@ -356,11 +356,9 @@ static int ad7816_probe(struct spi_device *spi_dev)
                return -EINVAL;
        }
 
-       indio_dev = iio_device_alloc(sizeof(*chip));
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       indio_dev = devm_iio_device_alloc(&spi_dev->dev, sizeof(*chip));
+       if (!indio_dev)
+               return -ENOMEM;
        chip = iio_priv(indio_dev);
        /* this is only used for device removal purposes */
        dev_set_drvdata(&spi_dev->dev, indio_dev);
@@ -372,25 +370,28 @@ static int ad7816_probe(struct spi_device *spi_dev)
        chip->convert_pin = pins[1];
        chip->busy_pin = pins[2];
 
-       ret = gpio_request(chip->rdwr_pin, spi_get_device_id(spi_dev)->name);
+       ret = devm_gpio_request(&spi_dev->dev, chip->rdwr_pin,
+                                       spi_get_device_id(spi_dev)->name);
        if (ret) {
                dev_err(&spi_dev->dev, "Fail to request rdwr gpio PIN %d.\n",
                        chip->rdwr_pin);
-               goto error_free_device;
+               return ret;
        }
        gpio_direction_input(chip->rdwr_pin);
-       ret = gpio_request(chip->convert_pin, spi_get_device_id(spi_dev)->name);
+       ret = devm_gpio_request(&spi_dev->dev, chip->convert_pin,
+                                       spi_get_device_id(spi_dev)->name);
        if (ret) {
                dev_err(&spi_dev->dev, "Fail to request convert gpio PIN %d.\n",
                        chip->convert_pin);
-               goto error_free_gpio_rdwr;
+               return ret;
        }
        gpio_direction_input(chip->convert_pin);
-       ret = gpio_request(chip->busy_pin, spi_get_device_id(spi_dev)->name);
+       ret = devm_gpio_request(&spi_dev->dev, chip->busy_pin,
+                                       spi_get_device_id(spi_dev)->name);
        if (ret) {
                dev_err(&spi_dev->dev, "Fail to request busy gpio PIN %d.\n",
                        chip->busy_pin);
-               goto error_free_gpio_convert;
+               return ret;
        }
        gpio_direction_input(chip->busy_pin);
 
@@ -401,51 +402,31 @@ static int ad7816_probe(struct spi_device *spi_dev)
 
        if (spi_dev->irq) {
                /* Only low trigger is supported in ad7816/7/8 */
-               ret = request_threaded_irq(spi_dev->irq,
-                                          NULL,
-                                          &ad7816_event_handler,
-                                          IRQF_TRIGGER_LOW | IRQF_ONESHOT,
-                                          indio_dev->name,
-                                          indio_dev);
+               ret = devm_request_threaded_irq(&spi_dev->dev, spi_dev->irq,
+                                               NULL,
+                                               &ad7816_event_handler,
+                                               IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+                                               indio_dev->name,
+                                               indio_dev);
                if (ret)
-                       goto error_free_gpio;
+                       return ret;
        }
 
        ret = iio_device_register(indio_dev);
        if (ret)
-               goto error_free_irq;
+               return ret;
 
        dev_info(&spi_dev->dev, "%s temperature sensor and ADC registered.\n",
                         indio_dev->name);
 
        return 0;
-error_free_irq:
-       free_irq(spi_dev->irq, indio_dev);
-error_free_gpio:
-       gpio_free(chip->busy_pin);
-error_free_gpio_convert:
-       gpio_free(chip->convert_pin);
-error_free_gpio_rdwr:
-       gpio_free(chip->rdwr_pin);
-error_free_device:
-       iio_device_free(indio_dev);
-error_ret:
-       return ret;
 }
 
 static int ad7816_remove(struct spi_device *spi_dev)
 {
        struct iio_dev *indio_dev = dev_get_drvdata(&spi_dev->dev);
-       struct ad7816_chip_info *chip = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-       dev_set_drvdata(&spi_dev->dev, NULL);
-       if (spi_dev->irq)
-               free_irq(spi_dev->irq, indio_dev);
-       gpio_free(chip->busy_pin);
-       gpio_free(chip->convert_pin);
-       gpio_free(chip->rdwr_pin);
-       iio_device_free(indio_dev);
 
        return 0;
 }
index 2b2049c8bc6ba969896168f6b22b58ed7336afcc..3f5142b284d1cbb66e213be9528ab56a904130f9 100644 (file)
@@ -586,8 +586,9 @@ static int ad799x_probe(struct i2c_client *client,
        int ret;
        struct ad799x_platform_data *pdata = client->dev.platform_data;
        struct ad799x_state *st;
-       struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
+       struct iio_dev *indio_dev;
 
+       indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*st));
        if (indio_dev == NULL)
                return -ENOMEM;
 
@@ -606,11 +607,11 @@ static int ad799x_probe(struct i2c_client *client,
 
        st->int_vref_mv = pdata->vref_mv;
 
-       st->reg = regulator_get(&client->dev, "vcc");
+       st->reg = devm_regulator_get(&client->dev, "vcc");
        if (!IS_ERR(st->reg)) {
                ret = regulator_enable(st->reg);
                if (ret)
-                       goto error_put_reg;
+                       return ret;
        }
        st->client = client;
 
@@ -650,10 +651,6 @@ error_cleanup_ring:
 error_disable_reg:
        if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
-error_put_reg:
-       if (!IS_ERR(st->reg))
-               regulator_put(st->reg);
-       iio_device_free(indio_dev);
 
        return ret;
 }
@@ -668,12 +665,9 @@ static int ad799x_remove(struct i2c_client *client)
                free_irq(client->irq, indio_dev);
 
        ad799x_ring_cleanup(indio_dev);
-       if (!IS_ERR(st->reg)) {
+       if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
-               regulator_put(st->reg);
-       }
        kfree(st->rx_buf);
-       iio_device_free(indio_dev);
 
        return 0;
 }
index c2ebae12ee1961852e83f73a818860d7b8af7550..0ff6c03a483ec0bd72909c0eb49228baf2f555c7 100644 (file)
@@ -35,7 +35,6 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
        struct iio_poll_func *pf = p;
        struct iio_dev *indio_dev = pf->indio_dev;
        struct ad799x_state *st = iio_priv(indio_dev);
-       s64 time_ns;
        int b_sent;
        u8 cmd;
 
@@ -65,13 +64,8 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
        if (b_sent < 0)
                goto out;
 
-       time_ns = iio_get_time_ns();
-
-       if (indio_dev->scan_timestamp)
-               memcpy(st->rx_buf + indio_dev->scan_bytes - sizeof(s64),
-                       &time_ns, sizeof(time_ns));
-
-       iio_push_to_buffers(indio_dev, st->rx_buf);
+       iio_push_to_buffers_with_timestamp(indio_dev, st->rx_buf,
+                       iio_get_time_ns());
 out:
        iio_trigger_notify_done(indio_dev->trig);
 
index 9a4bb0999b51244d3e621610aa626477f5f851f5..ce7ff3e6cd21e5df63f4a6210ff43b250065ec49 100644 (file)
@@ -137,43 +137,39 @@ static int lpc32xx_adc_probe(struct platform_device *pdev)
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                dev_err(&pdev->dev, "failed to get platform I/O memory\n");
-               retval = -EBUSY;
-               goto errout1;
+               return -EBUSY;
        }
 
-       iodev = iio_device_alloc(sizeof(struct lpc32xx_adc_info));
-       if (!iodev) {
-               dev_err(&pdev->dev, "failed allocating iio device\n");
-               retval = -ENOMEM;
-               goto errout1;
-       }
+       iodev = devm_iio_device_alloc(&pdev->dev, sizeof(*info));
+       if (!iodev)
+               return -ENOMEM;
 
        info = iio_priv(iodev);
 
-       info->adc_base = ioremap(res->start, resource_size(res));
+       info->adc_base = devm_ioremap(&pdev->dev, res->start,
+                                               resource_size(res));
        if (!info->adc_base) {
                dev_err(&pdev->dev, "failed mapping memory\n");
-               retval = -EBUSY;
-               goto errout2;
+               return -EBUSY;
        }
 
-       info->clk = clk_get(&pdev->dev, NULL);
+       info->clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(info->clk)) {
                dev_err(&pdev->dev, "failed getting clock\n");
-               goto errout3;
+               return PTR_ERR(info->clk);
        }
 
        irq = platform_get_irq(pdev, 0);
        if ((irq < 0) || (irq >= NR_IRQS)) {
                dev_err(&pdev->dev, "failed getting interrupt resource\n");
-               retval = -EINVAL;
-               goto errout4;
+               return -EINVAL;
        }
 
-       retval = request_irq(irq, lpc32xx_adc_isr, 0, MOD_NAME, info);
+       retval = devm_request_irq(&pdev->dev, irq, lpc32xx_adc_isr, 0,
+                                                               MOD_NAME, info);
        if (retval < 0) {
                dev_err(&pdev->dev, "failed requesting interrupt\n");
-               goto errout4;
+               return retval;
        }
 
        platform_set_drvdata(pdev, iodev);
@@ -189,35 +185,18 @@ static int lpc32xx_adc_probe(struct platform_device *pdev)
 
        retval = iio_device_register(iodev);
        if (retval)
-               goto errout5;
+               return retval;
 
        dev_info(&pdev->dev, "LPC32XX ADC driver loaded, IRQ %d\n", irq);
 
        return 0;
-
-errout5:
-       free_irq(irq, info);
-errout4:
-       clk_put(info->clk);
-errout3:
-       iounmap(info->adc_base);
-errout2:
-       iio_device_free(iodev);
-errout1:
-       return retval;
 }
 
 static int lpc32xx_adc_remove(struct platform_device *pdev)
 {
        struct iio_dev *iodev = platform_get_drvdata(pdev);
-       struct lpc32xx_adc_info *info = iio_priv(iodev);
-       int irq = platform_get_irq(pdev, 0);
 
        iio_device_unregister(iodev);
-       free_irq(irq, info);
-       clk_put(info->clk);
-       iounmap(info->adc_base);
-       iio_device_free(iodev);
 
        return 0;
 }
index a08c1736458b4f2cfab9af87c408a65e430d8020..9da64bf00039133563bc5e0368e1f44bf5d6a7cb 100644 (file)
@@ -625,13 +625,7 @@ static irqreturn_t mxs_lradc_trigger_handler(int irq, void *p)
                j++;
        }
 
-       if (iio->scan_timestamp) {
-               s64 *timestamp = (s64 *)((u8 *)lradc->buffer +
-                                       ALIGN(j, sizeof(s64)));
-               *timestamp = pf->timestamp;
-       }
-
-       iio_push_to_buffers(iio, (u8 *)lradc->buffer);
+       iio_push_to_buffers_with_timestamp(iio, lradc->buffer, pf->timestamp);
 
        iio_trigger_notify_done(iio->trig);
 
@@ -987,7 +981,7 @@ static int mxs_lradc_probe(struct platform_device *pdev)
        /* Register the touchscreen input device. */
        ret = mxs_lradc_ts_register(lradc);
        if (ret)
-               goto err_dev;
+               goto err_ts_register;
 
        /* Register IIO device. */
        ret = iio_device_register(iio);
@@ -1000,6 +994,8 @@ static int mxs_lradc_probe(struct platform_device *pdev)
 
 err_ts:
        mxs_lradc_ts_unregister(lradc);
+err_ts_register:
+       mxs_lradc_hw_stop(lradc);
 err_dev:
        mxs_lradc_trigger_remove(iio);
 err_trig:
@@ -1012,13 +1008,11 @@ static int mxs_lradc_remove(struct platform_device *pdev)
        struct iio_dev *iio = platform_get_drvdata(pdev);
        struct mxs_lradc *lradc = iio_priv(iio);
 
+       iio_device_unregister(iio);
        mxs_lradc_ts_unregister(lradc);
-
        mxs_lradc_hw_stop(lradc);
-
-       iio_device_unregister(iio);
-       iio_triggered_buffer_cleanup(iio);
        mxs_lradc_trigger_remove(iio);
+       iio_triggered_buffer_cleanup(iio);
 
        return 0;
 }
@@ -1038,3 +1032,4 @@ module_platform_driver(mxs_lradc_driver);
 MODULE_AUTHOR("Marek Vasut <marex@denx.de>");
 MODULE_DESCRIPTION("Freescale i.MX28 LRADC driver");
 MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DRIVER_NAME);
index 1e1356825d6dadd98b7e9d14e8bc3a896890080d..80266e801d5673919533c9208241b3a0e3868d7f 100644 (file)
@@ -412,13 +412,13 @@ static ssize_t adt7316_store_ad_channel(struct device *dev,
        struct iio_dev *dev_info = dev_to_iio_dev(dev);
        struct adt7316_chip_info *chip = iio_priv(dev_info);
        u8 config2;
-       unsigned long data = 0;
+       u8 data;
        int ret;
 
        if (!(chip->config2 & ADT7316_AD_SINGLE_CH_MODE))
                return -EPERM;
 
-       ret = strict_strtoul(buf, 10, &data);
+       ret = kstrtou8(buf, 10, &data);
        if (ret)
                return -EINVAL;
 
@@ -823,10 +823,10 @@ static ssize_t adt7316_store_DAC_2Vref_ch_mask(struct device *dev,
        struct iio_dev *dev_info = dev_to_iio_dev(dev);
        struct adt7316_chip_info *chip = iio_priv(dev_info);
        u8 dac_config;
-       unsigned long data = 0;
+       u8 data;
        int ret;
 
-       ret = strict_strtoul(buf, 16, &data);
+       ret = kstrtou8(buf, 16, &data);
        if (ret || data > ADT7316_DA_2VREF_CH_MASK)
                return -EINVAL;
 
@@ -878,13 +878,13 @@ static ssize_t adt7316_store_DAC_update_mode(struct device *dev,
        struct iio_dev *dev_info = dev_to_iio_dev(dev);
        struct adt7316_chip_info *chip = iio_priv(dev_info);
        u8 dac_config;
-       unsigned long data;
+       u8 data;
        int ret;
 
        if (!(chip->config3 & ADT7316_DA_EN_VIA_DAC_LDCA))
                return -EPERM;
 
-       ret = strict_strtoul(buf, 10, &data);
+       ret = kstrtou8(buf, 10, &data);
        if (ret || data > ADT7316_DA_EN_MODE_MASK)
                return -EINVAL;
 
@@ -933,7 +933,7 @@ static ssize_t adt7316_store_update_DAC(struct device *dev,
        struct iio_dev *dev_info = dev_to_iio_dev(dev);
        struct adt7316_chip_info *chip = iio_priv(dev_info);
        u8 ldac_config;
-       unsigned long data;
+       u8 data;
        int ret;
 
        if (chip->config3 & ADT7316_DA_EN_VIA_DAC_LDCA) {
@@ -941,7 +941,7 @@ static ssize_t adt7316_store_update_DAC(struct device *dev,
                        ADT7316_DA_EN_MODE_LDAC)
                        return -EPERM;
 
-               ret = strict_strtoul(buf, 16, &data);
+               ret = kstrtou8(buf, 16, &data);
                if (ret || data > ADT7316_LDAC_EN_DA_MASK)
                        return -EINVAL;
 
@@ -1079,11 +1079,11 @@ static ssize_t adt7316_store_DAC_internal_Vref(struct device *dev,
        struct iio_dev *dev_info = dev_to_iio_dev(dev);
        struct adt7316_chip_info *chip = iio_priv(dev_info);
        u8 ldac_config;
-       unsigned long data;
+       u8 data;
        int ret;
 
        if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) {
-               ret = strict_strtoul(buf, 16, &data);
+               ret = kstrtou8(buf, 16, &data);
                if (ret || data > 3)
                        return -EINVAL;
 
@@ -1093,7 +1093,7 @@ static ssize_t adt7316_store_DAC_internal_Vref(struct device *dev,
                else if (data & 0x2)
                        ldac_config |= ADT7516_DAC_CD_IN_VREF;
        } else {
-               ret = strict_strtoul(buf, 16, &data);
+               ret = kstrtou8(buf, 16, &data);
                if (ret)
                        return -EINVAL;
 
@@ -1281,11 +1281,11 @@ static ssize_t adt7316_show_temp_offset(struct adt7316_chip_info *chip,
 static ssize_t adt7316_store_temp_offset(struct adt7316_chip_info *chip,
                int offset_addr, const char *buf, size_t len)
 {
-       long data;
+       int data;
        u8 val;
        int ret;
 
-       ret = strict_strtol(buf, 10, &data);
+       ret = kstrtoint(buf, 10, &data);
        if (ret || data > 127 || data < -128)
                return -EINVAL;
 
@@ -1442,7 +1442,7 @@ static ssize_t adt7316_store_DAC(struct adt7316_chip_info *chip,
                int channel, const char *buf, size_t len)
 {
        u8 msb, lsb, offset;
-       unsigned long data;
+       u16 data;
        int ret;
 
        if (channel >= ADT7316_DA_MSB_DATA_REGS ||
@@ -1454,7 +1454,7 @@ static ssize_t adt7316_store_DAC(struct adt7316_chip_info *chip,
 
        offset = chip->dac_bits - 8;
 
-       ret = strict_strtoul(buf, 10, &data);
+       ret = kstrtou16(buf, 10, &data);
        if (ret || data >= (1 << chip->dac_bits))
                return -EINVAL;
 
@@ -1830,11 +1830,11 @@ static ssize_t adt7316_set_int_mask(struct device *dev,
 {
        struct iio_dev *dev_info = dev_to_iio_dev(dev);
        struct adt7316_chip_info *chip = iio_priv(dev_info);
-       unsigned long data;
+       u16 data;
        int ret;
        u8 mask;
 
-       ret = strict_strtoul(buf, 16, &data);
+       ret = kstrtou16(buf, 16, &data);
        if (ret || data >= ADT7316_VDD_INT_MASK + 1)
                return -EINVAL;
 
@@ -1901,7 +1901,7 @@ static inline ssize_t adt7316_set_ad_bound(struct device *dev,
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
        struct iio_dev *dev_info = dev_to_iio_dev(dev);
        struct adt7316_chip_info *chip = iio_priv(dev_info);
-       long data;
+       int data;
        u8 val;
        int ret;
 
@@ -1909,7 +1909,7 @@ static inline ssize_t adt7316_set_ad_bound(struct device *dev,
                this_attr->address > ADT7316_EX_TEMP_LOW)
                return -EPERM;
 
-       ret = strict_strtol(buf, 10, &data);
+       ret = kstrtoint(buf, 10, &data);
        if (ret)
                return -EINVAL;
 
@@ -2106,11 +2106,9 @@ int adt7316_probe(struct device *dev, struct adt7316_bus *bus,
        unsigned short *adt7316_platform_data = dev->platform_data;
        int ret = 0;
 
-       indio_dev = iio_device_alloc(sizeof(*chip));
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       indio_dev = devm_iio_device_alloc(dev, sizeof(*chip));
+       if (!indio_dev)
+               return -ENOMEM;
        chip = iio_priv(indio_dev);
        /* this is only used for device removal purposes */
        dev_set_drvdata(dev, indio_dev);
@@ -2146,58 +2144,44 @@ int adt7316_probe(struct device *dev, struct adt7316_bus *bus,
                if (adt7316_platform_data[0])
                        chip->bus.irq_flags = adt7316_platform_data[0];
 
-               ret = request_threaded_irq(chip->bus.irq,
-                                          NULL,
-                                          &adt7316_event_handler,
-                                          chip->bus.irq_flags | IRQF_ONESHOT,
-                                          indio_dev->name,
-                                          indio_dev);
+               ret = devm_request_threaded_irq(dev, chip->bus.irq,
+                                               NULL,
+                                               &adt7316_event_handler,
+                                               chip->bus.irq_flags |
+                                               IRQF_ONESHOT,
+                                               indio_dev->name,
+                                               indio_dev);
                if (ret)
-                       goto error_free_dev;
+                       return ret;
 
                if (chip->bus.irq_flags & IRQF_TRIGGER_HIGH)
                        chip->config1 |= ADT7316_INT_POLARITY;
        }
 
        ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, chip->config1);
-       if (ret) {
-               ret = -EIO;
-               goto error_unreg_irq;
-       }
+       if (ret)
+               return -EIO;
 
        ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, chip->config3);
-       if (ret) {
-               ret = -EIO;
-               goto error_unreg_irq;
-       }
+       if (ret)
+               return -EIO;
 
        ret = iio_device_register(indio_dev);
        if (ret)
-               goto error_unreg_irq;
+               return ret;
 
        dev_info(dev, "%s temperature sensor, ADC and DAC registered.\n",
                        indio_dev->name);
 
        return 0;
-
-error_unreg_irq:
-       free_irq(chip->bus.irq, indio_dev);
-error_free_dev:
-       iio_device_free(indio_dev);
-error_ret:
-       return ret;
 }
 EXPORT_SYMBOL(adt7316_probe);
 
 int adt7316_remove(struct device *dev)
 {
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct adt7316_chip_info *chip = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-       if (chip->bus.irq)
-               free_irq(chip->bus.irq, indio_dev);
-       iio_device_free(indio_dev);
 
        return 0;
 }
index 69e90e9e60eaa9642075a5402655bf3e94d03401..a4aeee6ffdf2a6248e095f74d00397376f4105ab 100644 (file)
@@ -94,11 +94,9 @@ static int ad5930_probe(struct spi_device *spi)
        struct iio_dev *idev;
        int ret = 0;
 
-       idev = iio_device_alloc(sizeof(*st));
-       if (idev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       idev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!idev)
+               return -ENOMEM;
        spi_set_drvdata(spi, idev);
        st = iio_priv(idev);
 
@@ -110,24 +108,18 @@ static int ad5930_probe(struct spi_device *spi)
 
        ret = iio_device_register(idev);
        if (ret)
-               goto error_free_dev;
+               return ret;
        spi->max_speed_hz = 2000000;
        spi->mode = SPI_MODE_3;
        spi->bits_per_word = 16;
        spi_setup(spi);
 
        return 0;
-
-error_free_dev:
-       iio_device_free(idev);
-error_ret:
-       return ret;
 }
 
 static int ad5930_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
-       iio_device_free(spi_get_drvdata(spi));
 
        return 0;
 }
index 4e18380c514103a40ce01a21640697b385dd2707..c7d0307c8e76110044bf37580f35e963fc46c4da 100644 (file)
@@ -81,9 +81,9 @@ static ssize_t ad9832_write(struct device *dev,
        struct ad9832_state *st = iio_priv(indio_dev);
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
        int ret;
-       long val;
+       unsigned long val;
 
-       ret = strict_strtoul(buf, 10, &val);
+       ret = kstrtoul(buf, 10, &val);
        if (ret)
                goto error_ret;
 
@@ -214,14 +214,14 @@ static int ad9832_probe(struct spi_device *spi)
                return -ENODEV;
        }
 
-       reg = regulator_get(&spi->dev, "vcc");
+       reg = devm_regulator_get(&spi->dev, "vcc");
        if (!IS_ERR(reg)) {
                ret = regulator_enable(reg);
                if (ret)
-                       goto error_put_reg;
+                       return ret;
        }
 
-       indio_dev = iio_device_alloc(sizeof(*st));
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
        if (indio_dev == NULL) {
                ret = -ENOMEM;
                goto error_disable_reg;
@@ -279,47 +279,42 @@ static int ad9832_probe(struct spi_device *spi)
        ret = spi_sync(st->spi, &st->msg);
        if (ret) {
                dev_err(&spi->dev, "device init failed\n");
-               goto error_free_device;
+               goto error_disable_reg;
        }
 
        ret = ad9832_write_frequency(st, AD9832_FREQ0HM, pdata->freq0);
        if (ret)
-               goto error_free_device;
+               goto error_disable_reg;
 
        ret = ad9832_write_frequency(st, AD9832_FREQ1HM, pdata->freq1);
        if (ret)
-               goto error_free_device;
+               goto error_disable_reg;
 
        ret = ad9832_write_phase(st, AD9832_PHASE0H, pdata->phase0);
        if (ret)
-               goto error_free_device;
+               goto error_disable_reg;
 
        ret = ad9832_write_phase(st, AD9832_PHASE1H, pdata->phase1);
        if (ret)
-               goto error_free_device;
+               goto error_disable_reg;
 
        ret = ad9832_write_phase(st, AD9832_PHASE2H, pdata->phase2);
        if (ret)
-               goto error_free_device;
+               goto error_disable_reg;
 
        ret = ad9832_write_phase(st, AD9832_PHASE3H, pdata->phase3);
        if (ret)
-               goto error_free_device;
+               goto error_disable_reg;
 
        ret = iio_device_register(indio_dev);
        if (ret)
-               goto error_free_device;
+               goto error_disable_reg;
 
        return 0;
 
-error_free_device:
-       iio_device_free(indio_dev);
 error_disable_reg:
        if (!IS_ERR(reg))
                regulator_disable(reg);
-error_put_reg:
-       if (!IS_ERR(reg))
-               regulator_put(reg);
 
        return ret;
 }
@@ -330,11 +325,8 @@ static int ad9832_remove(struct spi_device *spi)
        struct ad9832_state *st = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-       if (!IS_ERR(st->reg)) {
+       if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
-               regulator_put(st->reg);
-       }
-       iio_device_free(indio_dev);
 
        return 0;
 }
index 5cba3c01f41720f57148bfe994263b17e18f71e9..86cda617609330d6183bbaea05bae90f4599b152 100644 (file)
@@ -70,9 +70,9 @@ static ssize_t ad9834_write(struct device *dev,
        struct ad9834_state *st = iio_priv(indio_dev);
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
        int ret;
-       long val;
+       unsigned long val;
 
-       ret = strict_strtoul(buf, 10, &val);
+       ret = kstrtoul(buf, 10, &val);
        if (ret)
                goto error_ret;
 
@@ -327,14 +327,14 @@ static int ad9834_probe(struct spi_device *spi)
                return -ENODEV;
        }
 
-       reg = regulator_get(&spi->dev, "vcc");
+       reg = devm_regulator_get(&spi->dev, "vcc");
        if (!IS_ERR(reg)) {
                ret = regulator_enable(reg);
                if (ret)
-                       goto error_put_reg;
+                       return ret;
        }
 
-       indio_dev = iio_device_alloc(sizeof(*st));
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
        if (indio_dev == NULL) {
                ret = -ENOMEM;
                goto error_disable_reg;
@@ -388,39 +388,35 @@ static int ad9834_probe(struct spi_device *spi)
        ret = spi_sync(st->spi, &st->msg);
        if (ret) {
                dev_err(&spi->dev, "device init failed\n");
-               goto error_free_device;
+               goto error_disable_reg;
        }
 
        ret = ad9834_write_frequency(st, AD9834_REG_FREQ0, pdata->freq0);
        if (ret)
-               goto error_free_device;
+               goto error_disable_reg;
 
        ret = ad9834_write_frequency(st, AD9834_REG_FREQ1, pdata->freq1);
        if (ret)
-               goto error_free_device;
+               goto error_disable_reg;
 
        ret = ad9834_write_phase(st, AD9834_REG_PHASE0, pdata->phase0);
        if (ret)
-               goto error_free_device;
+               goto error_disable_reg;
 
        ret = ad9834_write_phase(st, AD9834_REG_PHASE1, pdata->phase1);
        if (ret)
-               goto error_free_device;
+               goto error_disable_reg;
 
        ret = iio_device_register(indio_dev);
        if (ret)
-               goto error_free_device;
+               goto error_disable_reg;
 
        return 0;
 
-error_free_device:
-       iio_device_free(indio_dev);
 error_disable_reg:
        if (!IS_ERR(reg))
                regulator_disable(reg);
-error_put_reg:
-       if (!IS_ERR(reg))
-               regulator_put(reg);
+
        return ret;
 }
 
@@ -430,11 +426,8 @@ static int ad9834_remove(struct spi_device *spi)
        struct ad9834_state *st = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-       if (!IS_ERR(st->reg)) {
+       if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
-               regulator_put(st->reg);
-       }
-       iio_device_free(indio_dev);
 
        return 0;
 }
index 01a8a93031f54887d76961afe781f504bd65d8d8..af877ff680e9eda37711181842327e93ade39f7f 100644 (file)
@@ -80,11 +80,9 @@ static int ad9850_probe(struct spi_device *spi)
        struct iio_dev *idev;
        int ret = 0;
 
-       idev = iio_device_alloc(sizeof(*st));
-       if (idev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       idev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!idev)
+               return -ENOMEM;
        spi_set_drvdata(spi, idev);
        st = iio_priv(idev);
        mutex_init(&st->lock);
@@ -96,24 +94,18 @@ static int ad9850_probe(struct spi_device *spi)
 
        ret = iio_device_register(idev);
        if (ret)
-               goto error_free_dev;
+               return ret;
        spi->max_speed_hz = 2000000;
        spi->mode = SPI_MODE_3;
        spi->bits_per_word = 16;
        spi_setup(spi);
 
        return 0;
-
-error_free_dev:
-       iio_device_free(idev);
-error_ret:
-       return ret;
 }
 
 static int ad9850_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
-       iio_device_free(spi_get_drvdata(spi));
 
        return 0;
 }
index 1344031232bca7cb2c0ce93e3c11a427d9a136e0..4be2cf8c2ab62323fc261d72ecd7e71977f97384 100644 (file)
@@ -229,11 +229,9 @@ static int ad9852_probe(struct spi_device *spi)
        struct iio_dev *idev;
        int ret = 0;
 
-       idev = iio_device_alloc(sizeof(*st));
-       if (idev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       idev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!idev)
+               return -ENOMEM;
        st = iio_priv(idev);
        spi_set_drvdata(spi, idev);
        mutex_init(&st->lock);
@@ -245,7 +243,7 @@ static int ad9852_probe(struct spi_device *spi)
 
        ret = iio_device_register(idev);
        if (ret)
-               goto error_free_dev;
+               return ret;
        spi->max_speed_hz = 2000000;
        spi->mode = SPI_MODE_3;
        spi->bits_per_word = 8;
@@ -253,18 +251,11 @@ static int ad9852_probe(struct spi_device *spi)
        ad9852_init(st);
 
        return 0;
-
-error_free_dev:
-       iio_device_free(idev);
-
-error_ret:
-       return ret;
 }
 
 static int ad9852_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
-       iio_device_free(spi_get_drvdata(spi));
 
        return 0;
 }
index e48f874c1fc2a8c1c05dcfbb8312d95f2155c9f9..a7d528ef620c232a997b0c06b55aeeb27307cb12 100644 (file)
@@ -367,11 +367,9 @@ static int ad9910_probe(struct spi_device *spi)
        struct iio_dev *idev;
        int ret = 0;
 
-       idev = iio_device_alloc(sizeof(*st));
-       if (idev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       idev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!idev)
+               return -ENOMEM;
        spi_set_drvdata(spi, idev);
        st = iio_priv(idev);
        mutex_init(&st->lock);
@@ -383,24 +381,18 @@ static int ad9910_probe(struct spi_device *spi)
 
        ret = iio_device_register(idev);
        if (ret)
-               goto error_free_dev;
+               return ret;
        spi->max_speed_hz = 2000000;
        spi->mode = SPI_MODE_3;
        spi->bits_per_word = 8;
        spi_setup(spi);
        ad9910_init(st);
        return 0;
-
-error_free_dev:
-       iio_device_free(idev);
-error_ret:
-       return ret;
 }
 
 static int ad9910_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
-       iio_device_free(spi_get_drvdata(spi));
 
        return 0;
 }
index 8234e3c915c441ffb6291d22a0ae50c6cbb6cd72..0094c2f392ad6dcfcc3167071ac24b79991a59df 100644 (file)
@@ -176,11 +176,9 @@ static int ad9951_probe(struct spi_device *spi)
        struct iio_dev *idev;
        int ret = 0;
 
-       idev = iio_device_alloc(sizeof(*st));
-       if (idev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       idev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!idev)
+               return -ENOMEM;
        spi_set_drvdata(spi, idev);
        st = iio_priv(idev);
        mutex_init(&st->lock);
@@ -193,25 +191,18 @@ static int ad9951_probe(struct spi_device *spi)
 
        ret = iio_device_register(idev);
        if (ret)
-               goto error_free_dev;
+               return ret;
        spi->max_speed_hz = 2000000;
        spi->mode = SPI_MODE_3;
        spi->bits_per_word = 8;
        spi_setup(spi);
        ad9951_init(st);
        return 0;
-
-error_free_dev:
-       iio_device_free(idev);
-
-error_ret:
-       return ret;
 }
 
 static int ad9951_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
-       iio_device_free(spi_get_drvdata(spi));
 
        return 0;
 }
index 0e8e02a3cf5bb1b933106c7c8cff50467f923568..141ec6188dea871d7bccb83dc45e9f951814de0a 100644 (file)
@@ -90,6 +90,11 @@ static const struct iio_chan_spec iio_dummy_channels[] = {
                 * when converting to standard units (microvolts)
                 */
                BIT(IIO_CHAN_INFO_SCALE),
+               /*
+                * sampling_frequency
+                * The frequency in Hz at which the channels are sampled
+                */
+               .info_mask_shared_by_dir = BIT(IIO_CHAN_INFO_SAMP_FREQ),
                /* The ordering of elements in the buffer via an enum */
                .scan_index = voltage0,
                .scan_type = { /* Description of storage in buffer */
@@ -130,6 +135,10 @@ static const struct iio_chan_spec iio_dummy_channels[] = {
                 * input channels of type IIO_VOLTAGE.
                 */
                .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
+               /*
+                * sampling_frequency
+                * The frequency in Hz at which the channels are sampled
+                */
                .scan_index = diffvoltage1m2,
                .scan_type = { /* Description of storage in buffer */
                        .sign = 's', /* signed */
@@ -147,6 +156,7 @@ static const struct iio_chan_spec iio_dummy_channels[] = {
                .channel2 = 4,
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
                .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
+               .info_mask_shared_by_dir = BIT(IIO_CHAN_INFO_SAMP_FREQ),
                .scan_index = diffvoltage3m4,
                .scan_type = {
                        .sign = 's',
@@ -173,6 +183,7 @@ static const struct iio_chan_spec iio_dummy_channels[] = {
                 */
                BIT(IIO_CHAN_INFO_CALIBSCALE) |
                BIT(IIO_CHAN_INFO_CALIBBIAS),
+               .info_mask_shared_by_dir = BIT(IIO_CHAN_INFO_SAMP_FREQ),
                .scan_index = accelx,
                .scan_type = { /* Description of storage in buffer */
                        .sign = 's', /* signed */
@@ -272,6 +283,11 @@ static int iio_dummy_read_raw(struct iio_dev *indio_dev,
                *val2 = st->accel_calibscale->val2;
                ret = IIO_VAL_INT_PLUS_MICRO;
                break;
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               *val = 3;
+               *val2 = 33;
+               ret = IIO_VAL_INT_PLUS_NANO;
+               break;
        default:
                break;
        }
index 72f400c3cbcbbdc88391a02ae14cb87fc589d2da..09c93ac7351a5f052d04fbfb4742e52fa7f5ba76 100644 (file)
@@ -82,11 +82,8 @@ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p)
                        len += 2;
                }
        }
-       /* Store the timestamp at an 8 byte aligned offset */
-       if (indio_dev->scan_timestamp)
-               *(s64 *)((u8 *)data + ALIGN(len, sizeof(s64)))
-                       = iio_get_time_ns();
-       iio_push_to_buffers(indio_dev, (u8 *)data);
+
+       iio_push_to_buffers_with_timestamp(indio_dev, data, iio_get_time_ns());
 
        kfree(data);
 
index 6330af656a0f536d6a56580a5503eac75bdd3e53..712f3c22ce64ab19c0c7fc19964e86afbddd9ebe 100644 (file)
@@ -323,10 +323,10 @@ static ssize_t ad5933_store_frequency(struct device *dev,
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad5933_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;
 
@@ -400,12 +400,12 @@ static ssize_t ad5933_store(struct device *dev,
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad5933_state *st = iio_priv(indio_dev);
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-       long val;
+       u16 val;
        int i, ret = 0;
        unsigned short dat;
 
        if (this_attr->address != AD5933_IN_PGA_GAIN) {
-               ret = strict_strtol(buf, 10, &val);
+               ret = kstrtou16(buf, 10, &val);
                if (ret)
                        return ret;
        }
@@ -434,7 +434,7 @@ static ssize_t ad5933_store(struct device *dev,
                ret = ad5933_cmd(st, 0);
                break;
        case AD5933_OUT_SETTLING_CYCLES:
-               val = clamp(val, 0L, 0x7FFL);
+               val = clamp(val, (u16)0, (u16)0x7FF);
                st->settling_cycles = val;
 
                /* 2x, 4x handling, see datasheet */
@@ -448,7 +448,7 @@ static ssize_t ad5933_store(struct device *dev,
                                AD5933_REG_SETTLING_CYCLES, 2, (u8 *)&dat);
                break;
        case AD5933_FREQ_POINTS:
-               val = clamp(val, 0L, 511L);
+               val = clamp(val, (u16)0, (u16)511);
                st->freq_points = val;
 
                dat = cpu_to_be16(val);
@@ -676,7 +676,7 @@ static void ad5933_work(struct work_struct *work)
                } else {
                        buf[0] = be16_to_cpu(buf[0]);
                }
-               iio_push_to_buffers(indio_dev, (u8 *)buf);
+               iio_push_to_buffers(indio_dev, buf);
        } else {
                /* no data available - try again later */
                schedule_delayed_work(&st->work, st->poll_time_jiffies);
@@ -703,7 +703,9 @@ static int ad5933_probe(struct i2c_client *client,
        int ret, voltage_uv = 0;
        struct ad5933_platform_data *pdata = client->dev.platform_data;
        struct ad5933_state *st;
-       struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
+       struct iio_dev *indio_dev;
+
+       indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*st));
        if (indio_dev == NULL)
                return -ENOMEM;
 
@@ -716,11 +718,11 @@ static int ad5933_probe(struct i2c_client *client,
        else
                st->pdata = pdata;
 
-       st->reg = regulator_get(&client->dev, "vcc");
+       st->reg = devm_regulator_get(&client->dev, "vcc");
        if (!IS_ERR(st->reg)) {
                ret = regulator_enable(st->reg);
                if (ret)
-                       goto error_put_reg;
+                       return ret;
                voltage_uv = regulator_get_voltage(st->reg);
        }
 
@@ -778,11 +780,6 @@ error_unreg_ring:
 error_disable_reg:
        if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
-error_put_reg:
-       if (!IS_ERR(st->reg))
-               regulator_put(st->reg);
-
-       iio_device_free(indio_dev);
 
        return ret;
 }
@@ -795,11 +792,8 @@ static int ad5933_remove(struct i2c_client *client)
        iio_device_unregister(indio_dev);
        iio_buffer_unregister(indio_dev);
        iio_kfifo_free(indio_dev->buffer);
-       if (!IS_ERR(st->reg)) {
+       if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
-               regulator_put(st->reg);
-       }
-       iio_device_free(indio_dev);
 
        return 0;
 }
index e4998e4d4434b2af9365aacc1a8c4137a4c70544..488e690388c948dc3cda08afdc334cebc15966ef 100644 (file)
@@ -240,7 +240,7 @@ static ssize_t store_range(struct device *dev,
        unsigned long lval;
        unsigned int new_range;
 
-       if (strict_strtoul(buf, 10, &lval))
+       if (kstrtoul(buf, 10, &lval))
                return -EINVAL;
 
        if (!(lval == 1000UL || lval == 4000UL ||
@@ -279,18 +279,18 @@ static ssize_t store_resolution(struct device *dev,
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct isl29018_chip *chip = iio_priv(indio_dev);
        int status;
-       unsigned long lval;
+       unsigned int val;
        unsigned int new_adc_bit;
 
-       if (strict_strtoul(buf, 10, &lval))
+       if (kstrtouint(buf, 10, &val))
                return -EINVAL;
-       if (!(lval == 4 || lval == 8 || lval == 12 || lval == 16)) {
+       if (!(val == 4 || val == 8 || val == 12 || val == 16)) {
                dev_err(dev, "The resolution is not supported\n");
                return -EINVAL;
        }
 
        mutex_lock(&chip->lock);
-       status = isl29018_set_resolution(chip, lval, &new_adc_bit);
+       status = isl29018_set_resolution(chip, val, &new_adc_bit);
        if (status < 0) {
                mutex_unlock(&chip->lock);
                dev_err(dev, "Error in setting resolution\n");
@@ -319,11 +319,11 @@ static ssize_t store_prox_infrared_suppression(struct device *dev,
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct isl29018_chip *chip = iio_priv(indio_dev);
-       unsigned long lval;
+       int val;
 
-       if (strict_strtoul(buf, 10, &lval))
+       if (kstrtoint(buf, 10, &val))
                return -EINVAL;
-       if (!(lval == 0UL || lval == 1UL)) {
+       if (!(val == 0 || val == 1)) {
                dev_err(dev, "The mode is not supported\n");
                return -EINVAL;
        }
@@ -331,7 +331,7 @@ static ssize_t store_prox_infrared_suppression(struct device *dev,
        /* get the  "proximity scheme" i.e. if the chip does on chip
        infrared suppression (1 means perform on chip suppression) */
        mutex_lock(&chip->lock);
-       chip->prox_scheme = (int)lval;
+       chip->prox_scheme = val;
        mutex_unlock(&chip->lock);
 
        return count;
index b377dd3b76ad3a2eea33e34025923859bb1b477b..f8c659568c384f1884e74757df2981deb508b0ab 100644 (file)
@@ -493,9 +493,9 @@ static ssize_t taos_power_state_store(struct device *dev,
        struct device_attribute *attr, const char *buf, size_t len)
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       unsigned long value;
+       int value;
 
-       if (strict_strtoul(buf, 0, &value))
+       if (kstrtoint(buf, 0, &value))
                return -EINVAL;
 
        if (value == 0)
@@ -536,9 +536,9 @@ static ssize_t taos_gain_store(struct device *dev,
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct tsl2583_chip *chip = iio_priv(indio_dev);
-       unsigned long value;
+       int value;
 
-       if (strict_strtoul(buf, 0, &value))
+       if (kstrtoint(buf, 0, &value))
                return -EINVAL;
 
        switch (value) {
@@ -582,9 +582,9 @@ static ssize_t taos_als_time_store(struct device *dev,
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct tsl2583_chip *chip = iio_priv(indio_dev);
-       unsigned long value;
+       int value;
 
-       if (strict_strtoul(buf, 0, &value))
+       if (kstrtoint(buf, 0, &value))
                return -EINVAL;
 
        if ((value < 50) || (value > 650))
@@ -619,9 +619,9 @@ static ssize_t taos_als_trim_store(struct device *dev,
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct tsl2583_chip *chip = iio_priv(indio_dev);
-       unsigned long value;
+       int value;
 
-       if (strict_strtoul(buf, 0, &value))
+       if (kstrtoint(buf, 0, &value))
                return -EINVAL;
 
        if (value)
@@ -644,9 +644,9 @@ static ssize_t taos_als_cal_target_store(struct device *dev,
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct tsl2583_chip *chip = iio_priv(indio_dev);
-       unsigned long value;
+       int value;
 
-       if (strict_strtoul(buf, 0, &value))
+       if (kstrtoint(buf, 0, &value))
                return -EINVAL;
 
        if (value)
@@ -671,9 +671,9 @@ static ssize_t taos_do_calibrate(struct device *dev,
        struct device_attribute *attr, const char *buf, size_t len)
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       unsigned long value;
+       int value;
 
-       if (strict_strtoul(buf, 0, &value))
+       if (kstrtoint(buf, 0, &value))
                return -EINVAL;
 
        if (value == 1)
@@ -815,12 +815,9 @@ static int taos_probe(struct i2c_client *clientp,
                return -EOPNOTSUPP;
        }
 
-       indio_dev = iio_device_alloc(sizeof(*chip));
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               dev_err(&clientp->dev, "iio allocation failed\n");
-               goto fail1;
-       }
+       indio_dev = devm_iio_device_alloc(&clientp->dev, sizeof(*chip));
+       if (!indio_dev)
+               return -ENOMEM;
        chip = iio_priv(indio_dev);
        chip->client = clientp;
        i2c_set_clientdata(clientp, indio_dev);
@@ -835,14 +832,14 @@ static int taos_probe(struct i2c_client *clientp,
                if (ret < 0) {
                        dev_err(&clientp->dev, "i2c_smbus_write_bytes() to cmd "
                                "reg failed in taos_probe(), err = %d\n", ret);
-                       goto fail2;
+                       return ret;
                }
                ret = i2c_smbus_read_byte(clientp);
                if (ret < 0) {
                        dev_err(&clientp->dev, "i2c_smbus_read_byte from "
                                "reg failed in taos_probe(), err = %d\n", ret);
 
-                       goto fail2;
+                       return ret;
                }
                buf[i] = ret;
        }
@@ -850,14 +847,14 @@ static int taos_probe(struct i2c_client *clientp,
        if (!taos_tsl258x_device(buf)) {
                dev_info(&clientp->dev, "i2c device found but does not match "
                        "expected id in taos_probe()\n");
-               goto fail2;
+               return -EINVAL;
        }
 
        ret = i2c_smbus_write_byte(clientp, (TSL258X_CMD_REG | TSL258X_CNTRL));
        if (ret < 0) {
                dev_err(&clientp->dev, "i2c_smbus_write_byte() to cmd reg "
                        "failed in taos_probe(), err = %d\n", ret);
-               goto fail2;
+               return ret;
        }
 
        indio_dev->info = &tsl2583_info;
@@ -867,7 +864,7 @@ static int taos_probe(struct i2c_client *clientp,
        ret = iio_device_register(indio_dev);
        if (ret) {
                dev_err(&clientp->dev, "iio registration failed\n");
-               goto fail2;
+               return ret;
        }
 
        /* Load up the V2 defaults (these are hard coded defaults for now) */
@@ -878,10 +875,6 @@ static int taos_probe(struct i2c_client *clientp,
 
        dev_info(&clientp->dev, "Light sensor found.\n");
        return 0;
-fail1:
-       iio_device_free(indio_dev);
-fail2:
-       return ret;
 }
 
 #ifdef CONFIG_PM_SLEEP
@@ -926,7 +919,6 @@ static SIMPLE_DEV_PM_OPS(taos_pm_ops, taos_suspend, taos_resume);
 static int taos_remove(struct i2c_client *client)
 {
        iio_device_unregister(i2c_get_clientdata(client));
-       iio_device_free(i2c_get_clientdata(client));
 
        return 0;
 }
index c99f890cc6c65ae9ea13a9aafa8c8258e21e3cb8..9c43dcf444c2245cb526cc78b7a3524a6cfdb0dd 100644 (file)
@@ -550,7 +550,7 @@ prox_poll_err:
 static void tsl2x7x_defaults(struct tsl2X7X_chip *chip)
 {
        /* If Operational settings defined elsewhere.. */
-       if (chip->pdata && chip->pdata->platform_default_settings != 0)
+       if (chip->pdata && chip->pdata->platform_default_settings)
                memcpy(&(chip->tsl2x7x_settings),
                        chip->pdata->platform_default_settings,
                        sizeof(tsl2x7x_default_settings));
@@ -951,7 +951,6 @@ static ssize_t tsl2x7x_gain_available_show(struct device *dev,
        case tsl2771:
        case tmd2771:
                return snprintf(buf, PAGE_SIZE, "%s\n", "1 8 16 128");
-       break;
        }
 
        return snprintf(buf, PAGE_SIZE, "%s\n", "1 8 16 120");
@@ -1346,7 +1345,6 @@ static int tsl2x7x_read_raw(struct iio_dev *indio_dev,
                        break;
                default:
                        return -EINVAL;
-                       break;
                }
                break;
        case IIO_CHAN_INFO_RAW:
@@ -1366,7 +1364,6 @@ static int tsl2x7x_read_raw(struct iio_dev *indio_dev,
                        break;
                default:
                        return -EINVAL;
-                       break;
                }
                break;
        case IIO_CHAN_INFO_CALIBSCALE:
@@ -1419,7 +1416,6 @@ static int tsl2x7x_write_raw(struct iio_dev *indio_dev,
                                case tsl2772:
                                case tmd2772:
                                        return -EINVAL;
-                               break;
                                }
                                chip->tsl2x7x_settings.als_gain = 3;
                                break;
@@ -1431,7 +1427,6 @@ static int tsl2x7x_write_raw(struct iio_dev *indio_dev,
                                case tsl2771:
                                case tmd2771:
                                        return -EINVAL;
-                               break;
                                }
                                chip->tsl2x7x_settings.als_gain = 3;
                                break;
@@ -1508,18 +1503,15 @@ static int tsl2x7x_device_id(unsigned char *id, int target)
        case tsl2671:
        case tsl2771:
                return ((*id & 0xf0) == TRITON_ID);
-       break;
        case tmd2671:
        case tmd2771:
                return ((*id & 0xf0) == HALIBUT_ID);
-       break;
        case tsl2572:
        case tsl2672:
        case tmd2672:
        case tsl2772:
        case tmd2772:
                return ((*id & 0xf0) == SWORDFISH_ID);
-       break;
        }
 
        return -EINVAL;
@@ -1851,7 +1843,7 @@ static int tsl2x7x_probe(struct i2c_client *clientp,
        struct iio_dev *indio_dev;
        struct tsl2X7X_chip *chip;
 
-       indio_dev = iio_device_alloc(sizeof(*chip));
+       indio_dev = devm_iio_device_alloc(&clientp->dev, sizeof(*chip));
        if (!indio_dev)
                return -ENOMEM;
 
@@ -1862,22 +1854,21 @@ static int tsl2x7x_probe(struct i2c_client *clientp,
        ret = tsl2x7x_i2c_read(chip->client,
                TSL2X7X_CHIPID, &device_id);
        if (ret < 0)
-               goto fail1;
+               return ret;
 
        if ((!tsl2x7x_device_id(&device_id, id->driver_data)) ||
                (tsl2x7x_device_id(&device_id, id->driver_data) == -EINVAL)) {
                dev_info(&chip->client->dev,
                                "%s: i2c device found does not match expected id\n",
                                __func__);
-               ret = -EINVAL;
-               goto fail1;
+               return -EINVAL;
        }
 
        ret = i2c_smbus_write_byte(clientp, (TSL2X7X_CMD_REG | TSL2X7X_CNTRL));
        if (ret < 0) {
                dev_err(&clientp->dev, "%s: write to cmd reg failed. err = %d\n",
                                __func__, ret);
-               goto fail1;
+               return ret;
        }
 
        /* ALS and PROX functions can be invoked via user space poll
@@ -1899,16 +1890,17 @@ static int tsl2x7x_probe(struct i2c_client *clientp,
        indio_dev->num_channels = chip->chip_info->chan_table_elements;
 
        if (clientp->irq) {
-               ret = request_threaded_irq(clientp->irq,
-                                          NULL,
-                                          &tsl2x7x_event_handler,
-                                          IRQF_TRIGGER_RISING | IRQF_ONESHOT,
-                                          "TSL2X7X_event",
-                                          indio_dev);
+               ret = devm_request_threaded_irq(&clientp->dev, clientp->irq,
+                                               NULL,
+                                               &tsl2x7x_event_handler,
+                                               IRQF_TRIGGER_RISING |
+                                               IRQF_ONESHOT,
+                                               "TSL2X7X_event",
+                                               indio_dev);
                if (ret) {
                        dev_err(&clientp->dev,
                                "%s: irq request failed", __func__);
-                       goto fail1;
+                       return ret;
                }
        }
 
@@ -1921,20 +1913,12 @@ static int tsl2x7x_probe(struct i2c_client *clientp,
        if (ret) {
                dev_err(&clientp->dev,
                        "%s: iio registration failed\n", __func__);
-               goto fail2;
+               return ret;
        }
 
        dev_info(&clientp->dev, "%s Light sensor found.\n", id->name);
 
        return 0;
-
-fail2:
-       if (clientp->irq)
-               free_irq(clientp->irq, indio_dev);
-fail1:
-       iio_device_free(indio_dev);
-
-       return ret;
 }
 
 static int tsl2x7x_suspend(struct device *dev)
@@ -1980,10 +1964,6 @@ static int tsl2x7x_remove(struct i2c_client *client)
        tsl2x7x_chip_off(indio_dev);
 
        iio_device_unregister(indio_dev);
-       if (client->irq)
-               free_irq(client->irq, indio_dev);
-
-       iio_device_free(indio_dev);
 
        return 0;
 }
index c3f3f539e787e926b54f793958d8e9dac13aa6d7..76e0cf43197e47c8d54f603bd43bdd220d4be385 100644 (file)
@@ -643,11 +643,9 @@ static int hmc5843_probe(struct i2c_client *client,
        struct iio_dev *indio_dev;
        int err = 0;
 
-       indio_dev = iio_device_alloc(sizeof(*data));
-       if (indio_dev == NULL) {
-               err = -ENOMEM;
-               goto exit;
-       }
+       indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
+       if (indio_dev == NULL)
+               return -ENOMEM;
 
        /* default settings at probe */
        data = iio_priv(indio_dev);
@@ -665,24 +663,16 @@ static int hmc5843_probe(struct i2c_client *client,
 
        err = iio_device_register(indio_dev);
        if (err)
-               goto exit_free2;
+               return err;
 
        return 0;
-
-exit_free2:
-       iio_device_free(indio_dev);
-exit:
-       return err;
 }
 
 static int hmc5843_remove(struct i2c_client *client)
 {
-       struct iio_dev *indio_dev = i2c_get_clientdata(client);
-
-       iio_device_unregister(indio_dev);
+       iio_device_unregister(i2c_get_clientdata(client));
         /*  sleep mode to save power */
        hmc5843_configure(client, HMC5843_MODE_SLEEP);
-       iio_device_free(indio_dev);
 
        return 0;
 }
@@ -691,14 +681,14 @@ static int hmc5843_remove(struct i2c_client *client)
 static int hmc5843_suspend(struct device *dev)
 {
        hmc5843_configure(to_i2c_client(dev), HMC5843_MODE_SLEEP);
+
        return 0;
 }
 
 static int hmc5843_resume(struct device *dev)
 {
        struct i2c_client *client = to_i2c_client(dev);
-       struct iio_dev *indio_dev = i2c_get_clientdata(client);
-       struct hmc5843_data *data = iio_priv(indio_dev);
+       struct hmc5843_data *data = iio_priv(i2c_get_clientdata(client));
 
        hmc5843_configure(client, data->operating_mode);
 
@@ -730,6 +720,6 @@ static struct i2c_driver hmc5843_driver = {
 };
 module_i2c_driver(hmc5843_driver);
 
-MODULE_AUTHOR("Shubhrajyoti Datta <shubhrajyoti@ti.com");
+MODULE_AUTHOR("Shubhrajyoti Datta <shubhrajyoti@ti.com>");
 MODULE_DESCRIPTION("HMC5843/5883/5883L driver");
 MODULE_LICENSE("GPL");
index 74025fbae6794f3c5f6226efd1b137ef42ec450c..6200335d12f7171b460c060df7a02dc86235dd3c 100644 (file)
@@ -186,9 +186,9 @@ static ssize_t ade7753_write_8bit(struct device *dev,
 {
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
        int ret;
-       long val;
+       u8 val;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou8(buf, 10, &val);
        if (ret)
                goto error_ret;
        ret = ade7753_spi_write_reg_8(dev, this_attr->address, val);
@@ -204,9 +204,9 @@ static ssize_t ade7753_write_16bit(struct device *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 = ade7753_spi_write_reg_16(dev, this_attr->address, val);
@@ -399,11 +399,11 @@ static ssize_t ade7753_write_frequency(struct device *dev,
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ade7753_state *st = iio_priv(indio_dev);
-       unsigned long val;
+       u16 val;
        int ret;
        u16 reg, t;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou16(buf, 10, &val);
        if (ret)
                return ret;
        if (val == 0)
@@ -497,11 +497,9 @@ static int ade7753_probe(struct spi_device *spi)
        struct iio_dev *indio_dev;
 
        /* setup the industrialio driver allocated elements */
-       indio_dev = iio_device_alloc(sizeof(*st));
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!indio_dev)
+               return -ENOMEM;
        /* this is only used for removal purposes */
        spi_set_drvdata(spi, indio_dev);
 
@@ -517,19 +515,13 @@ static int ade7753_probe(struct spi_device *spi)
        /* Get the device into a sane initial state */
        ret = ade7753_initial_setup(indio_dev);
        if (ret)
-               goto error_free_dev;
+               return ret;
 
        ret = iio_device_register(indio_dev);
        if (ret)
-               goto error_free_dev;
+               return ret;
 
        return 0;
-
-error_free_dev:
-       iio_device_free(indio_dev);
-
-error_ret:
-       return ret;
 }
 
 /* fixme, confirm ordering in this function */
@@ -539,7 +531,6 @@ static int ade7753_remove(struct spi_device *spi)
 
        iio_device_unregister(indio_dev);
        ade7753_stop_device(&indio_dev->dev);
-       iio_device_free(indio_dev);
 
        return 0;
 }
index f649ebe55a04d49da431c9c8ff5d45947d7e8ac7..2e046f6e4fb4873e1917983ff6c1474ad803dba3 100644 (file)
@@ -186,9 +186,9 @@ static ssize_t ade7754_write_8bit(struct device *dev,
 {
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
        int ret;
-       long val;
+       u8 val;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou8(buf, 10, &val);
        if (ret)
                goto error_ret;
        ret = ade7754_spi_write_reg_8(dev, this_attr->address, val);
@@ -204,9 +204,9 @@ static ssize_t ade7754_write_16bit(struct device *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 = ade7754_spi_write_reg_16(dev, this_attr->address, val);
@@ -419,11 +419,11 @@ static ssize_t ade7754_write_frequency(struct device *dev,
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ade7754_state *st = iio_priv(indio_dev);
-       unsigned long val;
+       u16 val;
        int ret;
        u8 reg, t;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou16(buf, 10, &val);
        if (ret)
                return ret;
        if (val == 0)
@@ -520,11 +520,9 @@ static int ade7754_probe(struct spi_device *spi)
        struct iio_dev *indio_dev;
 
        /* setup the industrialio driver allocated elements */
-       indio_dev = iio_device_alloc(sizeof(*st));
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!indio_dev)
+               return -ENOMEM;
        /* this is only used for removal purposes */
        spi_set_drvdata(spi, indio_dev);
 
@@ -540,18 +538,12 @@ static int ade7754_probe(struct spi_device *spi)
        /* Get the device into a sane initial state */
        ret = ade7754_initial_setup(indio_dev);
        if (ret)
-               goto error_free_dev;
+               return ret;
        ret = iio_device_register(indio_dev);
        if (ret)
-               goto error_free_dev;
+               return ret;
 
        return 0;
-
-error_free_dev:
-       iio_device_free(indio_dev);
-
-error_ret:
-       return ret;
 }
 
 /* fixme, confirm ordering in this function */
@@ -561,7 +553,6 @@ static int ade7754_remove(struct spi_device *spi)
 
        iio_device_unregister(indio_dev);
        ade7754_stop_device(&indio_dev->dev);
-       iio_device_free(indio_dev);
 
        return 0;
 }
index 6005d4aab0c346365c7f76ed0047bfb6f2b81cda..cba183e24838e64bd4f69d5e102981118ac9e262 100644 (file)
@@ -269,9 +269,9 @@ static ssize_t ade7758_write_8bit(struct device *dev,
 {
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
        int ret;
-       long val;
+       u8 val;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou8(buf, 10, &val);
        if (ret)
                goto error_ret;
        ret = ade7758_spi_write_reg_8(dev, this_attr->address, val);
@@ -287,9 +287,9 @@ static ssize_t ade7758_write_16bit(struct device *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 = ade7758_spi_write_reg_16(dev, this_attr->address, val);
@@ -502,11 +502,11 @@ static ssize_t ade7758_write_frequency(struct device *dev,
                size_t len)
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       unsigned long val;
+       u16 val;
        int ret;
        u8 reg, t;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou16(buf, 10, &val);
        if (ret)
                return ret;
 
@@ -849,12 +849,11 @@ static int ade7758_probe(struct spi_device *spi)
 {
        int ret;
        struct ade7758_state *st;
-       struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
+       struct iio_dev *indio_dev;
 
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!indio_dev)
+               return -ENOMEM;
 
        st = iio_priv(indio_dev);
        /* this is only used for removal purposes */
@@ -862,10 +861,8 @@ static int ade7758_probe(struct spi_device *spi)
 
        /* Allocate the comms buffers */
        st->rx = kcalloc(ADE7758_MAX_RX, sizeof(*st->rx), GFP_KERNEL);
-       if (st->rx == NULL) {
-               ret = -ENOMEM;
-               goto error_free_dev;
-       }
+       if (!st->rx)
+               return -ENOMEM;
        st->tx = kcalloc(ADE7758_MAX_TX, sizeof(*st->tx), GFP_KERNEL);
        if (st->tx == NULL) {
                ret = -ENOMEM;
@@ -920,9 +917,6 @@ error_free_tx:
        kfree(st->tx);
 error_free_rx:
        kfree(st->rx);
-error_free_dev:
-       iio_device_free(indio_dev);
-error_ret:
        return ret;
 }
 
@@ -939,8 +933,6 @@ static int ade7758_remove(struct spi_device *spi)
        kfree(st->tx);
        kfree(st->rx);
 
-       iio_device_free(indio_dev);
-
        return 0;
 }
 
index 7d5db71755788372638035b49917e5470cf4bc68..4080995c99b6c42d00459282d90bf7cc602c7c70 100644 (file)
@@ -69,11 +69,7 @@ static irqreturn_t ade7758_trigger_handler(int irq, void *p)
                if (ade7758_spi_read_burst(indio_dev) >= 0)
                        *dat32 = get_unaligned_be32(&st->rx_buf[5]) & 0xFFFFFF;
 
-       /* Guaranteed to be aligned with 8 byte boundary */
-       if (indio_dev->scan_timestamp)
-               dat64[1] = pf->timestamp;
-
-       iio_push_to_buffers(indio_dev, (u8 *)dat64);
+       iio_push_to_buffers_with_timestamp(indio_dev, dat64, pf->timestamp);
 
        iio_trigger_notify_done(indio_dev->trig);
 
index d214ac4932cbef428c4d414967146eb7c92cce4d..145f896aae2b4c38d3663809863f0ff9db2652b6 100644 (file)
@@ -185,9 +185,9 @@ static ssize_t ade7759_write_8bit(struct device *dev,
 {
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
        int ret;
-       long val;
+       u8 val;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou8(buf, 10, &val);
        if (ret)
                goto error_ret;
        ret = ade7759_spi_write_reg_8(dev, this_attr->address, val);
@@ -203,9 +203,9 @@ static ssize_t ade7759_write_16bit(struct device *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 = ade7759_spi_write_reg_16(dev, this_attr->address, val);
@@ -360,11 +360,11 @@ static ssize_t ade7759_write_frequency(struct device *dev,
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ade7759_state *st = iio_priv(indio_dev);
-       unsigned long val;
+       u16 val;
        int ret;
        u16 reg, t;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou16(buf, 10, &val);
        if (ret)
                return ret;
        if (val == 0)
@@ -444,11 +444,9 @@ static int ade7759_probe(struct spi_device *spi)
        struct iio_dev *indio_dev;
 
        /* setup the industrialio driver allocated elements */
-       indio_dev = iio_device_alloc(sizeof(*st));
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!indio_dev)
+               return -ENOMEM;
        /* this is only used for removal purposes */
        spi_set_drvdata(spi, indio_dev);
 
@@ -463,18 +461,13 @@ static int ade7759_probe(struct spi_device *spi)
        /* Get the device into a sane initial state */
        ret = ade7759_initial_setup(indio_dev);
        if (ret)
-               goto error_free_dev;
+               return ret;
 
        ret = iio_device_register(indio_dev);
        if (ret)
-               goto error_free_dev;
+               return ret;
 
        return 0;
-
-error_free_dev:
-       iio_device_free(indio_dev);
-error_ret:
-       return ret;
 }
 
 /* fixme, confirm ordering in this function */
@@ -484,7 +477,6 @@ static int ade7759_remove(struct spi_device *spi)
 
        iio_device_unregister(indio_dev);
        ade7759_stop_device(&indio_dev->dev);
-       iio_device_free(indio_dev);
 
        return 0;
 }
index db9ef6c86c1edad8df8ef5f94e725ff8021a5c25..5b33c7f1aa9108652fb4d6f7d8ceb81048646113 100644 (file)
@@ -208,7 +208,7 @@ static int ade7854_i2c_probe(struct i2c_client *client,
        struct ade7854_state *st;
        struct iio_dev *indio_dev;
 
-       indio_dev = iio_device_alloc(sizeof(*st));
+       indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*st));
        if (indio_dev == NULL)
                return -ENOMEM;
        st = iio_priv(indio_dev);
@@ -225,8 +225,6 @@ static int ade7854_i2c_probe(struct i2c_client *client,
        st->irq = client->irq;
 
        ret = ade7854_probe(indio_dev, &client->dev);
-       if (ret)
-               iio_device_free(indio_dev);
 
        return ret;
 }
index 4c6d2041260bed259f7cba174c64ceb9a9c1a3f8..94f73bbbc0fd28ec65153b401ef5a401d32d24d2 100644 (file)
@@ -278,7 +278,7 @@ static int ade7854_spi_probe(struct spi_device *spi)
        struct ade7854_state *st;
        struct iio_dev *indio_dev;
 
-       indio_dev = iio_device_alloc(sizeof(*st));
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
        if (indio_dev == NULL)
                return -ENOMEM;
        st = iio_priv(indio_dev);
@@ -296,8 +296,6 @@ static int ade7854_spi_probe(struct spi_device *spi)
 
 
        ret = ade7854_probe(indio_dev, &spi->dev);
-       if (ret)
-               iio_device_free(indio_dev);
 
        return ret;
 }
index e8379c0f1173ffc454067788d16cd39ee8bc48fb..d620bbd603a30db2264bb5f8499c142eb19a3d8c 100644 (file)
@@ -100,9 +100,9 @@ static ssize_t ade7854_write_8bit(struct device *dev,
        struct ade7854_state *st = iio_priv(indio_dev);
 
        int ret;
-       long val;
+       u8 val;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou8(buf, 10, &val);
        if (ret)
                goto error_ret;
        ret = st->write_reg_8(dev, this_attr->address, val);
@@ -121,9 +121,9 @@ static ssize_t ade7854_write_16bit(struct device *dev,
        struct ade7854_state *st = iio_priv(indio_dev);
 
        int ret;
-       long val;
+       u16 val;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou16(buf, 10, &val);
        if (ret)
                goto error_ret;
        ret = st->write_reg_16(dev, this_attr->address, val);
@@ -142,9 +142,9 @@ static ssize_t ade7854_write_24bit(struct device *dev,
        struct ade7854_state *st = iio_priv(indio_dev);
 
        int ret;
-       long val;
+       u32 val;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou32(buf, 10, &val);
        if (ret)
                goto error_ret;
        ret = st->write_reg_24(dev, this_attr->address, val);
@@ -163,9 +163,9 @@ static ssize_t ade7854_write_32bit(struct device *dev,
        struct ade7854_state *st = iio_priv(indio_dev);
 
        int ret;
-       long val;
+       u32 val;
 
-       ret = strict_strtol(buf, 10, &val);
+       ret = kstrtou32(buf, 10, &val);
        if (ret)
                goto error_ret;
        ret = st->write_reg_32(dev, this_attr->address, val);
@@ -550,7 +550,7 @@ int ade7854_probe(struct iio_dev *indio_dev, struct device *dev)
 
        ret = iio_device_register(indio_dev);
        if (ret)
-               goto error_free_dev;
+               return ret;
 
        /* Get the device into a sane initial state */
        ret = ade7854_initial_setup(indio_dev);
@@ -561,9 +561,6 @@ int ade7854_probe(struct iio_dev *indio_dev, struct device *dev)
 
 error_unreg_dev:
        iio_device_unregister(indio_dev);
-error_free_dev:
-       iio_device_free(indio_dev);
-
        return ret;
 }
 EXPORT_SYMBOL(ade7854_probe);
@@ -571,7 +568,6 @@ EXPORT_SYMBOL(ade7854_probe);
 int ade7854_remove(struct iio_dev *indio_dev)
 {
        iio_device_unregister(indio_dev);
-       iio_device_free(indio_dev);
 
        return 0;
 }
index 71221161aa6b983f37c438755c1d3a5085d34bf5..62d30179301fa52e0d6b9322d553371641b952e2 100644 (file)
@@ -107,16 +107,16 @@ static int ad2s1200_probe(struct spi_device *spi)
        unsigned short *pins = spi->dev.platform_data;
 
        for (pn = 0; pn < AD2S1200_PN; pn++)
-               if (gpio_request_one(pins[pn], GPIOF_DIR_OUT, DRV_NAME)) {
-                       pr_err("%s: request gpio pin %d failed\n",
-                                               DRV_NAME, pins[pn]);
-                       goto error_ret;
+               ret = devm_gpio_request_one(&spi->dev, pins[pn], GPIOF_DIR_OUT,
+                                           DRV_NAME);
+               if (ret) {
+                       dev_err(&spi->dev, "request gpio pin %d failed\n",
+                                                       pins[pn]);
+                       return ret;
                }
-       indio_dev = iio_device_alloc(sizeof(*st));
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!indio_dev)
+               return -ENOMEM;
        spi_set_drvdata(spi, indio_dev);
        st = iio_priv(indio_dev);
        mutex_init(&st->lock);
@@ -133,26 +133,18 @@ static int ad2s1200_probe(struct spi_device *spi)
 
        ret = iio_device_register(indio_dev);
        if (ret)
-               goto error_free_dev;
+               return ret;
 
        spi->max_speed_hz = AD2S1200_HZ;
        spi->mode = SPI_MODE_3;
        spi_setup(spi);
 
        return 0;
-
-error_free_dev:
-       iio_device_free(indio_dev);
-error_ret:
-       for (--pn; pn >= 0; pn--)
-               gpio_free(pins[pn]);
-       return ret;
 }
 
 static int ad2s1200_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
-       iio_device_free(spi_get_drvdata(spi));
 
        return 0;
 }
index dcdadbbcf7e864978fbd119721f1cf058ba69234..6966d5f766481befae4cb5d250434842acc06bc1 100644 (file)
@@ -206,10 +206,10 @@ static ssize_t ad2s1210_store_fclkin(struct device *dev,
                                     size_t len)
 {
        struct ad2s1210_state *st = iio_priv(dev_to_iio_dev(dev));
-       unsigned long fclkin;
+       unsigned int fclkin;
        int ret;
 
-       ret = strict_strtoul(buf, 10, &fclkin);
+       ret = kstrtouint(buf, 10, &fclkin);
        if (ret)
                return ret;
        if (fclkin < AD2S1210_MIN_CLKIN || fclkin > AD2S1210_MAX_CLKIN) {
@@ -243,10 +243,10 @@ static ssize_t ad2s1210_store_fexcit(struct device *dev,
                                     const char *buf, size_t len)
 {
        struct ad2s1210_state *st = iio_priv(dev_to_iio_dev(dev));
-       unsigned long fexcit;
+       unsigned int fexcit;
        int ret;
 
-       ret = strict_strtoul(buf, 10, &fexcit);
+       ret = kstrtouint(buf, 10, &fexcit);
        if (ret < 0)
                return ret;
        if (fexcit < AD2S1210_MIN_EXCIT || fexcit > AD2S1210_MAX_EXCIT) {
@@ -282,11 +282,11 @@ static ssize_t ad2s1210_store_control(struct device *dev,
                        const char *buf, size_t len)
 {
        struct ad2s1210_state *st = iio_priv(dev_to_iio_dev(dev));
-       unsigned long udata;
+       unsigned char udata;
        unsigned char data;
        int ret;
 
-       ret = strict_strtoul(buf, 16, &udata);
+       ret = kstrtou8(buf, 16, &udata);
        if (ret)
                return -EINVAL;
 
@@ -337,10 +337,10 @@ static ssize_t ad2s1210_store_resolution(struct device *dev,
 {
        struct ad2s1210_state *st = iio_priv(dev_to_iio_dev(dev));
        unsigned char data;
-       unsigned long udata;
+       unsigned char udata;
        int ret;
 
-       ret = strict_strtoul(buf, 10, &udata);
+       ret = kstrtou8(buf, 10, &udata);
        if (ret || udata < 10 || udata > 16) {
                pr_err("ad2s1210: resolution out of range\n");
                return -EINVAL;
@@ -438,11 +438,11 @@ static ssize_t ad2s1210_store_reg(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t len)
 {
        struct ad2s1210_state *st = iio_priv(dev_to_iio_dev(dev));
-       unsigned long data;
+       unsigned char data;
        int ret;
        struct iio_dev_attr *iattr = to_iio_dev_attr(attr);
 
-       ret = strict_strtoul(buf, 10, &data);
+       ret = kstrtou8(buf, 10, &data);
        if (ret)
                return -EINVAL;
        mutex_lock(&st->lock);
@@ -669,16 +669,14 @@ static int ad2s1210_probe(struct spi_device *spi)
        if (spi->dev.platform_data == NULL)
                return -EINVAL;
 
-       indio_dev = iio_device_alloc(sizeof(*st));
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!indio_dev)
+               return -ENOMEM;
        st = iio_priv(indio_dev);
        st->pdata = spi->dev.platform_data;
        ret = ad2s1210_setup_gpios(st);
        if (ret < 0)
-               goto error_free_dev;
+               return ret;
 
        spi_set_drvdata(spi, indio_dev);
 
@@ -709,9 +707,6 @@ static int ad2s1210_probe(struct spi_device *spi)
 
 error_free_gpios:
        ad2s1210_free_gpios(st);
-error_free_dev:
-       iio_device_free(indio_dev);
-error_ret:
        return ret;
 }
 
@@ -721,7 +716,6 @@ static int ad2s1210_remove(struct spi_device *spi)
 
        iio_device_unregister(indio_dev);
        ad2s1210_free_gpios(iio_priv(indio_dev));
-       iio_device_free(indio_dev);
 
        return 0;
 }
index 40b825286d4af65dfe9228baa76c0af392096fa9..e24c5890652f8d1c1b0280875f25cde6fb0050a5 100644 (file)
@@ -64,11 +64,9 @@ static int ad2s90_probe(struct spi_device *spi)
        struct ad2s90_state *st;
        int ret = 0;
 
-       indio_dev = iio_device_alloc(sizeof(*st));
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!indio_dev)
+               return -ENOMEM;
        st = iio_priv(indio_dev);
        spi_set_drvdata(spi, indio_dev);
 
@@ -83,7 +81,7 @@ static int ad2s90_probe(struct spi_device *spi)
 
        ret = iio_device_register(indio_dev);
        if (ret)
-               goto error_free_dev;
+               return ret;
 
        /* need 600ns between CS and the first falling edge of SCLK */
        spi->max_speed_hz = 830000;
@@ -91,17 +89,11 @@ static int ad2s90_probe(struct spi_device *spi)
        spi_setup(spi);
 
        return 0;
-
-error_free_dev:
-       iio_device_free(indio_dev);
-error_ret:
-       return ret;
 }
 
 static int ad2s90_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
-       iio_device_free(spi_get_drvdata(spi));
 
        return 0;
 }
index 38a158b77b1d24f3d55ac12c08ae13b0792b8d20..ebb189c68d88b32be3fafce9d238559db57cabff 100644 (file)
@@ -83,32 +83,28 @@ static ssize_t iio_bfin_tmr_frequency_store(struct device *dev,
 {
        struct iio_trigger *trig = to_iio_trigger(dev);
        struct bfin_tmr_state *st = iio_trigger_get_drvdata(trig);
-       unsigned long val;
+       unsigned int val;
        bool enabled;
        int ret;
 
-       ret = strict_strtoul(buf, 10, &val);
+       ret = kstrtouint(buf, 10, &val);
        if (ret)
-               goto error_ret;
+               return ret;
 
        if (val > 100000) {
-               ret = -EINVAL;
-               goto error_ret;
-       }
+               return -EINVAL;
 
        enabled = get_enabled_gptimers() & st->t->bit;
 
        if (enabled)
                disable_gptimers(st->t->bit);
 
-       if (!val)
-               goto error_ret;
+       if (val == 0)
+               return count;
 
        val = get_sclk() / val;
-       if (val <= 4 || val <= st->duty) {
-               ret = -EINVAL;
-               goto error_ret;
-       }
+       if (val <= 4 || val <= st->duty)
+               return -EINVAL;
 
        set_gptimer_period(st->t->id, val);
        set_gptimer_pwidth(st->t->id, val - st->duty);
@@ -116,8 +112,7 @@ static ssize_t iio_bfin_tmr_frequency_store(struct device *dev,
        if (enabled)
                enable_gptimers(st->t->bit);
 
-error_ret:
-       return ret ? ret : count;
+       return count;
 }
 
 static ssize_t iio_bfin_tmr_frequency_show(struct device *dev,
index 79695974b1d43dde0a46e1dbf60e00254edd0807..48a6afa8408805ff3a8f2ab25689ebccc3e419cf 100644 (file)
@@ -53,10 +53,10 @@ static ssize_t iio_trig_periodic_write_freq(struct device *dev,
 {
        struct iio_trigger *trig = to_iio_trigger(dev);
        struct iio_prtc_trigger_info *trig_info = iio_trigger_get_drvdata(trig);
-       unsigned long val;
+       int val;
        int ret;
 
-       ret = strict_strtoul(buf, 10, &val);
+       ret = kstrtoint(buf, 10, &val);
        if (ret)
                goto error_ret;
 
index 2156a44d07409c0501cba726ccb33ee99d1d9c92..93d59b6a60daa6cb1916281016421ce0c84fbf4a 100644 (file)
@@ -16,7 +16,7 @@ config LUSTRE_FS
          this file system support as a module, choose M here: the module will
          be called lustre.
 
-         To mount Lustre file systems , you also need to install the user space
+         To mount Lustre file systems, you also need to install the user space
          mount.lustre and other user space commands which can be found in the
          lustre-client package, available from
          http://downloads.whamcloud.com/public/lustre/
index e86df7356cb1ee141e637d29b7e503f883bdbace..0d6ed69ddb223af36efff72419abad7bf6a91038 100644 (file)
@@ -50,9 +50,8 @@ static struct fsfilt_operations *fsfilt_search_type(const char *type)
 
        list_for_each(p, &fsfilt_types) {
                found = list_entry(p, struct fsfilt_operations, fs_list);
-               if (!strcmp(found->fs_type, type)) {
+               if (!strcmp(found->fs_type, type))
                        return found;
-               }
        }
        return NULL;
 }
@@ -62,7 +61,8 @@ int fsfilt_register_ops(struct fsfilt_operations *fs_ops)
        struct fsfilt_operations *found;
 
        /* lock fsfilt_types list */
-       if ((found = fsfilt_search_type(fs_ops->fs_type))) {
+       found = fsfilt_search_type(fs_ops->fs_type);
+       if (found) {
                if (found != fs_ops) {
                        CERROR("different operations for type %s\n",
                               fs_ops->fs_type);
@@ -103,14 +103,16 @@ struct fsfilt_operations *fsfilt_get_ops(const char *type)
        struct fsfilt_operations *fs_ops;
 
        /* lock fsfilt_types list */
-       if (!(fs_ops = fsfilt_search_type(type))) {
+       fs_ops = fsfilt_search_type(type);
+       if (!fs_ops) {
                char name[32];
                int rc;
 
                snprintf(name, sizeof(name) - 1, "fsfilt_%s", type);
                name[sizeof(name) - 1] = '\0';
 
-               if (!(rc = request_module("%s", name))) {
+               rc = request_module("%s", name);
+               if (!rc) {
                        fs_ops = fsfilt_search_type(type);
                        CDEBUG(D_INFO, "Loaded module '%s'\n", name);
                        if (!fs_ops)
index 97a8be2300dd1ad2ee417d617107766aad895f3b..b21e40cdacab21b6f80f94b1c3f324577e2ee9db 100644 (file)
@@ -154,11 +154,10 @@ int lprocfs_stats_alloc_one(struct lprocfs_stats *stats, unsigned int cpuid)
                                spin_lock(&stats->ls_lock);
                        if (stats->ls_biggest_alloc_num <= cpuid)
                                stats->ls_biggest_alloc_num = cpuid + 1;
-                       if (stats->ls_flags & LPROCFS_STATS_FLAG_IRQ_SAFE) {
+                       if (stats->ls_flags & LPROCFS_STATS_FLAG_IRQ_SAFE)
                                spin_unlock_irqrestore(&stats->ls_lock, flags);
-                       } else {
+                       else
                                spin_unlock(&stats->ls_lock);
-                       }
                }
                /* initialize the ls_percpu[cpuid] non-zero counter */
                for (i = 0; i < stats->ls_num; ++i) {
index 6547f46a7729f2f95c16f9bdff5e334a43806eea..316103ab7c3c056fa760db06cc49babb9d6ab28b 100644 (file)
@@ -207,7 +207,7 @@ static void enc_pools_release_free_pages(long npages)
                        p_idx++;
                        g_idx = 0;
                }
-       };
+       }
 
        /* free unused pools */
        while (p_idx_max1 < p_idx_max2) {
index fbca394cf4fcd5f02073529422ce9a3bace0bda0..63564f71c7c9177ccedc5f5ae4dbe680d851f9ca 100644 (file)
@@ -677,9 +677,8 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method)
                        switch (method) {
                        case NAT25_CHECK:
                                if (!memcmp(skb->data+ETH_ALEN, ipx->ipx_source.node, ETH_ALEN))
-                               DEBUG_INFO("NAT25: Check IPX skb_copy\n");
+                                       DEBUG_INFO("NAT25: Check IPX skb_copy\n");
                                return 0;
-                               return -1;
                        case NAT25_INSERT:
                                DEBUG_INFO("NAT25: Insert IPX, Dest =%08x,%02x%02x%02x%02x%02x%02x,%04x Source =%08x,%02x%02x%02x%02x%02x%02x,%04x\n",
                                        ipx->ipx_dest.net,
index 869434c4cf6924d012eaae192cf6093a2cd00247..ad1c174cd7eea68613d96bf028315c3985807f42 100644 (file)
@@ -542,7 +542,7 @@ u8 rtw_efuse_map_write(struct adapter *padapter, u16 addr, u16 cnts, u8 *data)
 {
        u8 offset, word_en;
        u8 *map;
-       u8 newdata[PGPKT_DATA_SIZE];
+       u8 newdata[PGPKT_DATA_SIZE + 1];
        s32     i, idx;
        u8 ret = _SUCCESS;
        u16 mapLen = 0;
@@ -564,7 +564,7 @@ u8 rtw_efuse_map_write(struct adapter *padapter, u16 addr, u16 cnts, u8 *data)
 
        offset = (addr >> 3);
        word_en = 0xF;
-       _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE);
+       _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE + 1);
        i = addr & 0x7; /*  index of one package */
        idx = 0;        /*  data index */
 
@@ -634,7 +634,7 @@ u8 rtw_BT_efuse_map_write(struct adapter *padapter, u16 addr, u16 cnts, u8 *data
 {
        u8 offset, word_en;
        u8 *map;
-       u8 newdata[PGPKT_DATA_SIZE];
+       u8 newdata[PGPKT_DATA_SIZE + 1];
        s32     i, idx;
        u8 ret = _SUCCESS;
        u16 mapLen = 0;
@@ -656,7 +656,7 @@ u8 rtw_BT_efuse_map_write(struct adapter *padapter, u16 addr, u16 cnts, u8 *data
 
        offset = (addr >> 3);
        word_en = 0xF;
-       _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE);
+       _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE + 1);
        i = addr & 0x7; /*  index of one package */
        idx = 0;        /*  data index */
 
index 201165787362b6ea9d1b2a7613b1c8d7457dffe0..ba8e53463d10140f1d2db27e9c44a20adc3c36e3 100644 (file)
@@ -204,11 +204,14 @@ void rtw_init_recvframe(union recv_frame *precvframe, struct recv_priv *precvpri
 int rtw_free_recvframe(union recv_frame *precvframe, struct __queue *pfree_recv_queue)
 {
        unsigned long irqL;
-       struct adapter *padapter = precvframe->u.hdr.adapter;
-       struct recv_priv *precvpriv = &padapter->recvpriv;
+       struct adapter *padapter;
+       struct recv_priv *precvpriv;
 
 _func_enter_;
-
+       if (!precvframe)
+               return _FAIL;
+       padapter = precvframe->u.hdr.adapter;
+       precvpriv = &padapter->recvpriv;
        if (precvframe->u.hdr.pkt) {
                dev_kfree_skb_any(precvframe->u.hdr.pkt);/* free skb by driver */
                precvframe->u.hdr.pkt = NULL;
@@ -1798,16 +1801,14 @@ static int amsdu_to_msdu(struct adapter *padapter, union recv_frame *prframe)
                        memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN);
                }
 
-               /* Indicat the packets to upper layer */
-               if (sub_skb) {
-                       /*  Insert NAT2.5 RX here! */
-                       sub_skb->protocol = eth_type_trans(sub_skb, padapter->pnetdev);
-                       sub_skb->dev = padapter->pnetdev;
+               /* Indicate the packets to upper layer */
+               /*  Insert NAT2.5 RX here! */
+               sub_skb->protocol = eth_type_trans(sub_skb, padapter->pnetdev);
+               sub_skb->dev = padapter->pnetdev;
 
-                       sub_skb->ip_summed = CHECKSUM_NONE;
+               sub_skb->ip_summed = CHECKSUM_NONE;
 
-                       netif_rx(sub_skb);
-               }
+               netif_rx(sub_skb);
        }
 
 exit:
index c2977be92fb14d3d4d7f2892b3c9f5baa9c954f7..cd3c9a7c3044c26ea626bf1b8e89070aeedaa3c4 100644 (file)
@@ -267,9 +267,8 @@ _func_enter_;
 
                rtw_mfree_sta_priv_lock(pstapriv);
 
-               if (pstapriv->pallocated_stainfo_buf) {
+               if (pstapriv->pallocated_stainfo_buf)
                        rtw_vmfree(pstapriv->pallocated_stainfo_buf, sizeof(struct sta_info)*NUM_STA+4);
-               }
        }
 
 _func_exit_;
@@ -315,7 +314,7 @@ _func_enter_;
 
                rtw_list_insert_tail(&psta->hash_list, phash_list);
 
-               pstapriv->asoc_sta_count++ ;
+               pstapriv->asoc_sta_count++;
 
                _exit_critical_bh(&(pstapriv->sta_hash_lock), &irql2);
 
@@ -419,7 +418,7 @@ _func_enter_;
        _cancel_timer_ex(&psta->addba_retry_timer);
 
        /* for A-MPDU Rx reordering buffer control, cancel reordering_ctrl_timer */
-       for (i = 0; i < 16 ; i++) {
+       for (i = 0; i < 16; i++) {
                unsigned long irql;
                struct list_head *phead, *plist;
                union recv_frame *prframe;
index 8018edd3d42e19fcc0875c7324584d94e6fb02ad..153ec61493ab6ef94a4ec71f886b8a700ecad4ad 100644 (file)
@@ -80,7 +80,7 @@ int cckratesonly_included(unsigned char *rate, int ratelen)
        for (i = 0; i < ratelen; i++) {
                if  ((((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) &&
                           (((rate[i]) & 0x7f) != 11)  && (((rate[i]) & 0x7f) != 22))
-               return false;
+                       return false;
        }
 
        return true;
@@ -766,7 +766,7 @@ void HT_caps_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE)
 
        for (i = 0; i < (pIE->Length); i++) {
                if (i != 2) {
-                       /*      Got the endian issue here. */
+                       /*      Got the endian issue here. */
                        pmlmeinfo->HT_caps.u.HT_cap[i] &= (pIE->data[i]);
                } else {
                        /* modify from  fw by Thomas 2010/11/17 */
@@ -1096,13 +1096,13 @@ int rtw_check_bcn_info(struct adapter  *Adapter, u8 *pframe, u32 packet_len)
        }
 
        kfree(bssid);
+       _func_exit_;
        return _SUCCESS;
 
 _mismatch:
        kfree(bssid);
-       return _FAIL;
-
        _func_exit_;
+       return _FAIL;
 }
 
 void update_beacon_info(struct adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta)
@@ -1186,7 +1186,7 @@ unsigned int should_forbid_n_rate(struct adapter *padapter)
                        case _RSN_IE_2_:
                                if  ((_rtw_memcmp((pIE->data + 8), RSN_CIPHER_SUITE_CCMP, 4))  ||
                                       (_rtw_memcmp((pIE->data + 12), RSN_CIPHER_SUITE_CCMP, 4)))
-                               return false;
+                                       return false;
                        default:
                                break;
                        }
@@ -1368,21 +1368,21 @@ void update_tx_basic_rate(struct adapter *padapter, u8 wirelessmode)
 #ifdef CONFIG_88EU_P2P
        struct wifidirect_info *pwdinfo = &padapter->wdinfo;
 
-       /*      Added by Albert 2011/03/22 */
-       /*      In the P2P mode, the driver should not support the b mode. */
-       /*      So, the Tx packet shouldn't use the CCK rate */
+       /*      Added by Albert 2011/03/22 */
+       /*      In the P2P mode, the driver should not support the b mode. */
+       /*      So, the Tx packet shouldn't use the CCK rate */
        if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
                return;
 #endif /* CONFIG_88EU_P2P */
        _rtw_memset(supported_rates, 0, NDIS_802_11_LENGTH_RATES_EX);
 
-       if ((wirelessmode & WIRELESS_11B) && (wirelessmode == WIRELESS_11B)) {
+       if ((wirelessmode & WIRELESS_11B) && (wirelessmode == WIRELESS_11B))
                memcpy(supported_rates, rtw_basic_rate_cck, 4);
-       } else if (wirelessmode & WIRELESS_11B) {
+       else if (wirelessmode & WIRELESS_11B)
                memcpy(supported_rates, rtw_basic_rate_mix, 7);
-       } else {
+       else
                memcpy(supported_rates, rtw_basic_rate_ofdm, 3);
-       }
+
 
        if (wirelessmode & WIRELESS_11B)
                update_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB);
@@ -1435,7 +1435,7 @@ unsigned char check_assoc_AP(u8 *pframe, uint len)
                                DBG_88E("link to Airgo Cap\n");
                                return HT_IOT_PEER_AIRGO;
                        } else if (_rtw_memcmp(pIE->data, EPIGRAM_OUI, 3)) {
-                                epigram_vendor_flag = 1;
+                               epigram_vendor_flag = 1;
                                if (ralink_vendor_flag) {
                                        DBG_88E("link to Tenda W311R AP\n");
                                         return HT_IOT_PEER_TENDA;
index bb5cd95c564e2089897457f0c066a3ae16850b37..a594e51d2e1ca974b9bb946b56e9e9457c533c2e 100644 (file)
@@ -1556,7 +1556,7 @@ static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, str
        xmitframe_phead = get_list_head(pframe_queue);
        xmitframe_plist = get_next(xmitframe_phead);
 
-       while (!rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) {
+       if (!rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) {
                pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
 
                xmitframe_plist = get_next(xmitframe_plist);
@@ -1564,12 +1564,7 @@ static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, str
                rtw_list_delete(&pxmitframe->list);
 
                ptxservq->qcnt--;
-
-               break;
-
-               pxmitframe = NULL;
        }
-
        return pxmitframe;
 }
 
index e4f20da91b433de32c29ec5d21343cc464b7d3a6..bb43793fd1ec2f57ff6eb1d6019189957b9ed188 100644 (file)
@@ -1276,407 +1276,6 @@ static void phy_LCCalibrate_8188E(struct adapter *adapt, bool is2t)
        }
 }
 
-/* Analog Pre-distortion calibration */
-#define                APK_BB_REG_NUM  8
-#define                APK_CURVE_REG_NUM 4
-#define                PATH_NUM                2
-
-static void phy_APCalibrate_8188E(struct adapter *adapt, s8 delta, bool is2t)
-{
-       struct hal_data_8188e   *pHalData = GET_HAL_DATA(adapt);
-       struct odm_dm_struct *dm_odm = &pHalData->odmpriv;
-       u32 regD[PATH_NUM];
-       u32 tmpreg, index, offset,  apkbound;
-       u8 path, i, pathbound = PATH_NUM;
-       u32 BB_backup[APK_BB_REG_NUM];
-       u32 BB_REG[APK_BB_REG_NUM] = {
-               rFPGA1_TxBlock,         rOFDM0_TRxPathEnable,
-               rFPGA0_RFMOD, rOFDM0_TRMuxPar,
-               rFPGA0_XCD_RFInterfaceSW, rFPGA0_XAB_RFInterfaceSW,
-               rFPGA0_XA_RFInterfaceOE, rFPGA0_XB_RFInterfaceOE        };
-       u32 BB_AP_MODE[APK_BB_REG_NUM] = {
-               0x00000020, 0x00a05430, 0x02040000,
-               0x000800e4, 0x00204000 };
-       u32 BB_normal_AP_MODE[APK_BB_REG_NUM] = {
-               0x00000020, 0x00a05430, 0x02040000,
-               0x000800e4, 0x22204000 };
-
-       u32 AFE_backup[IQK_ADDA_REG_NUM];
-       u32 AFE_REG[IQK_ADDA_REG_NUM] = {
-               rFPGA0_XCD_SwitchControl, rBlue_Tooth,
-               rRx_Wait_CCA,   rTx_CCK_RFON,
-               rTx_CCK_BBON, rTx_OFDM_RFON,
-               rTx_OFDM_BBON, rTx_To_Rx,
-               rTx_To_Tx,      rRx_CCK,
-               rRx_OFDM,       rRx_Wait_RIFS,
-               rRx_TO_Rx,      rStandby,
-               rSleep,                         rPMPD_ANAEN };
-
-       u32 MAC_backup[IQK_MAC_REG_NUM];
-       u32 MAC_REG[IQK_MAC_REG_NUM] = {
-               REG_TXPAUSE,    REG_BCN_CTRL,
-               REG_BCN_CTRL_1, REG_GPIO_MUXCFG};
-
-       u32 APK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {
-               {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c},
-               {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e}
-       };
-
-       u32 APK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {
-               {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c}, /* path settings equal to path b settings */
-               {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c}
-       };
-
-       u32 APK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {
-               {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d},
-               {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050}
-       };
-
-       u32 APK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {
-               {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}, /* path settings equal to path b settings */
-               {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}
-       };
-
-       u32 AFE_on_off[PATH_NUM] = {
-               0x04db25a4, 0x0b1b25a4};        /* path A on path B off / path A off path B on */
-
-       u32 APK_offset[PATH_NUM] = {
-               rConfig_AntA, rConfig_AntB};
-
-       u32 APK_normal_offset[PATH_NUM] = {
-               rConfig_Pmpd_AntA, rConfig_Pmpd_AntB};
-
-       u32 APK_value[PATH_NUM] = {
-               0x92fc0000, 0x12fc0000};
-
-       u32 APK_normal_value[PATH_NUM] = {
-               0x92680000, 0x12680000};
-
-       s8 APK_delta_mapping[APK_BB_REG_NUM][13] = {
-               {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
-               {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
-               {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
-               {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6},
-               {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0}
-       };
-
-       u32 APK_normal_setting_value_1[13] = {
-               0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28,
-               0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3,
-               0x12680000, 0x00880000, 0x00880000
-       };
-
-       u32 APK_normal_setting_value_2[16] = {
-               0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3,
-               0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025,
-               0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008,
-               0x00050006
-       };
-
-       u32 APK_result[PATH_NUM][APK_BB_REG_NUM];       /* val_1_1a, val_1_2a, val_2a, val_3a, val_4a */
-       s32 BB_offset, delta_V, delta_offset;
-
-       if (*(dm_odm->mp_mode) == 1) {
-               struct mpt_context *pMptCtx = &(adapt->mppriv.MptCtx);
-               pMptCtx->APK_bound[0] = 45;
-               pMptCtx->APK_bound[1] = 52;
-       }
-
-       ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("==>phy_APCalibrate_8188E() delta %d\n", delta));
-       ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("AP Calibration for %s\n", (is2t ? "2T2R" : "1T1R")));
-       if (!is2t)
-               pathbound = 1;
-
-       /* 2 FOR NORMAL CHIP SETTINGS */
-
-/*  Temporarily do not allow normal driver to do the following settings
- *  because these offset and value will cause RF internal PA to be
- *  unpredictably disabled by HW, such that RF Tx signal  will disappear
- *  after disable/enable card many times on 88CU. RF SD and DD have not
- *  find the root cause, so we remove these actions temporarily.
- */
-       if (*(dm_odm->mp_mode) != 1)
-               return;
-       /* settings adjust for normal chip */
-       for (index = 0; index < PATH_NUM; index++) {
-               APK_offset[index] = APK_normal_offset[index];
-               APK_value[index] = APK_normal_value[index];
-               AFE_on_off[index] = 0x6fdb25a4;
-       }
-
-       for (index = 0; index < APK_BB_REG_NUM; index++) {
-               for (path = 0; path < pathbound; path++) {
-                       APK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index];
-                       APK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index];
-               }
-               BB_AP_MODE[index] = BB_normal_AP_MODE[index];
-       }
-
-       apkbound = 6;
-
-       /* save BB default value */
-       for (index = 0; index < APK_BB_REG_NUM; index++) {
-               if (index == 0)         /* skip */
-                       continue;
-               BB_backup[index] = ODM_GetBBReg(dm_odm, BB_REG[index], bMaskDWord);
-       }
-
-       /* save MAC default value */
-       _PHY_SaveMACRegisters(adapt, MAC_REG, MAC_backup);
-
-       /* save AFE default value */
-       _PHY_SaveADDARegisters(adapt, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);
-
-       for (path = 0; path < pathbound; path++) {
-               if (path == RF_PATH_A) {
-                       /* path A APK */
-                       /* load APK setting */
-                       /* path-A */
-                       offset = rPdp_AntA;
-                       for (index = 0; index < 11; index++) {
-                               ODM_SetBBReg(dm_odm, offset, bMaskDWord, APK_normal_setting_value_1[index]);
-                               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,
-                                            ("phy_APCalibrate_8188E() offset 0x%x value 0x%x\n",
-                                            offset, ODM_GetBBReg(dm_odm, offset, bMaskDWord)));
-                               offset += 0x04;
-                       }
-
-                       ODM_SetBBReg(dm_odm, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);
-
-                       offset = rConfig_AntA;
-                       for (; index < 13; index++) {
-                               ODM_SetBBReg(dm_odm, offset, bMaskDWord, APK_normal_setting_value_1[index]);
-                               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,
-                                            ("phy_APCalibrate_8188E() offset 0x%x value 0x%x\n",
-                                            offset, ODM_GetBBReg(dm_odm, offset, bMaskDWord)));
-                               offset += 0x04;
-                       }
-
-                       /* page-B1 */
-                       ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0x40000000);
-
-                       /* path A */
-                       offset = rPdp_AntA;
-                       for (index = 0; index < 16; index++) {
-                               ODM_SetBBReg(dm_odm, offset, bMaskDWord, APK_normal_setting_value_2[index]);
-                               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,
-                                            ("phy_APCalibrate_8188E() offset 0x%x value 0x%x\n",
-                                            offset, ODM_GetBBReg(dm_odm, offset, bMaskDWord)));
-
-                               offset += 0x04;
-                       }
-                       ODM_SetBBReg(dm_odm,  rFPGA0_IQK, bMaskDWord, 0x00000000);
-               } else if (path == RF_PATH_B) {
-                       /* path B APK */
-                       /* load APK setting */
-                       /* path-B */
-                       offset = rPdp_AntB;
-                       for (index = 0; index < 10; index++) {
-                               ODM_SetBBReg(dm_odm, offset, bMaskDWord, APK_normal_setting_value_1[index]);
-                               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,
-                                            ("phy_APCalibrate_8188E() offset 0x%x value 0x%x\n",
-                                            offset, ODM_GetBBReg(dm_odm, offset, bMaskDWord)));
-
-                               offset += 0x04;
-                       }
-                       ODM_SetBBReg(dm_odm, rConfig_Pmpd_AntA, bMaskDWord, 0x12680000);
-                       PHY_SetBBReg(adapt, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);
-
-                       offset = rConfig_AntA;
-                       index = 11;
-                       for (; index < 13; index++) { /* offset 0xb68, 0xb6c */
-                               ODM_SetBBReg(dm_odm, offset, bMaskDWord, APK_normal_setting_value_1[index]);
-                               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,
-                                            ("phy_APCalibrate_8188E() offset 0x%x value 0x%x\n",
-                                            offset, ODM_GetBBReg(dm_odm, offset, bMaskDWord)));
-                               offset += 0x04;
-                       }
-
-                       /* page-B1 */
-                       ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0x40000000);
-
-                       /* path B */
-                       offset = 0xb60;
-                       for (index = 0; index < 16; index++) {
-                               ODM_SetBBReg(dm_odm, offset, bMaskDWord, APK_normal_setting_value_2[index]);
-                               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,
-                                            ("phy_APCalibrate_8188E() offset 0x%x value 0x%x\n",
-                                            offset, ODM_GetBBReg(dm_odm, offset, bMaskDWord)));
-
-                               offset += 0x04;
-                       }
-                       ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0);
-               }
-
-               /* save RF default value */
-               regD[path] = PHY_QueryRFReg(adapt, path, RF_TXBIAS_A, bMaskDWord);
-
-               /* Path A AFE all on, path B AFE All off or vise versa */
-               for (index = 0; index < IQK_ADDA_REG_NUM; index++)
-                       ODM_SetBBReg(dm_odm, AFE_REG[index], bMaskDWord, AFE_on_off[path]);
-               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,
-                            ("phy_APCalibrate_8188E() offset 0xe70 %x\n",
-                            ODM_GetBBReg(dm_odm, rRx_Wait_CCA, bMaskDWord)));
-
-               /* BB to AP mode */
-               if (path == 0) {
-                       for (index = 0; index < APK_BB_REG_NUM; index++) {
-                               if (index == 0)         /* skip */
-                                       continue;
-                               else if (index < 5)
-                               ODM_SetBBReg(dm_odm, BB_REG[index], bMaskDWord, BB_AP_MODE[index]);
-                               else if (BB_REG[index] == 0x870)
-                                       ODM_SetBBReg(dm_odm, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26);
-                               else
-                                       ODM_SetBBReg(dm_odm, BB_REG[index], BIT10, 0x0);
-                       }
-
-                       ODM_SetBBReg(dm_odm, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);
-                       ODM_SetBBReg(dm_odm, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);
-               } else {
-                       /* path B */
-                       ODM_SetBBReg(dm_odm, rTx_IQK_Tone_B, bMaskDWord, 0x01008c00);
-                       ODM_SetBBReg(dm_odm, rRx_IQK_Tone_B, bMaskDWord, 0x01008c00);
-               }
-
-               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,
-                            ("phy_APCalibrate_8188E() offset 0x800 %x\n",
-                            ODM_GetBBReg(dm_odm, 0x800, bMaskDWord)));
-
-               /* MAC settings */
-               _PHY_MACSettingCalibration(adapt, MAC_REG, MAC_backup);
-
-               if (path == RF_PATH_A) {
-                       /* Path B to standby mode */
-                       ODM_SetRFReg(dm_odm, RF_PATH_B, RF_AC, bMaskDWord, 0x10000);
-               } else {
-                       /* Path A to standby mode */
-                       ODM_SetRFReg(dm_odm, RF_PATH_A, RF_AC, bMaskDWord, 0x10000);
-                       ODM_SetRFReg(dm_odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f);
-                       ODM_SetRFReg(dm_odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20103);
-               }
-
-               delta_offset = ((delta+14)/2);
-               if (delta_offset < 0)
-                       delta_offset = 0;
-               else if (delta_offset > 12)
-                       delta_offset = 12;
-
-               /* AP calibration */
-               for (index = 0; index < APK_BB_REG_NUM; index++) {
-                       if (index != 1) /* only DO PA11+PAD01001, AP RF setting */
-                               continue;
-
-                       tmpreg = APK_RF_init_value[path][index];
-                       if (!dm_odm->RFCalibrateInfo.bAPKThermalMeterIgnore) {
-                               BB_offset = (tmpreg & 0xF0000) >> 16;
-
-                               if (!(tmpreg & BIT15)) /* sign bit 0 */
-                                       BB_offset = -BB_offset;
-
-                               delta_V = APK_delta_mapping[index][delta_offset];
-
-                               BB_offset += delta_V;
-
-                               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,
-                                            ("phy_APCalibrate_8188E() APK index %d tmpreg 0x%x delta_V %d delta_offset %d\n",
-                                            index, tmpreg, delta_V, delta_offset));
-
-                               if (BB_offset < 0) {
-                                       tmpreg = tmpreg & (~BIT15);
-                                       BB_offset = -BB_offset;
-                               } else {
-                                       tmpreg = tmpreg | BIT15;
-                               }
-                               tmpreg = (tmpreg & 0xFFF0FFFF) | (BB_offset << 16);
-                       }
-
-                       ODM_SetRFReg(dm_odm, path, RF_IPA_A, bMaskDWord, 0x8992e);
-                       ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8188E() offset 0xc %x\n", PHY_QueryRFReg(adapt, path, RF_IPA_A, bMaskDWord)));
-                       ODM_SetRFReg(dm_odm, path, RF_AC, bMaskDWord, APK_RF_value_0[path][index]);
-                       ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("phy_APCalibrate_8188E() offset 0x0 %x\n", PHY_QueryRFReg(adapt, path, RF_AC, bMaskDWord)));
-                       ODM_SetRFReg(dm_odm, path, RF_TXBIAS_A, bMaskDWord, tmpreg);
-                       ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8188E() offset 0xd %x\n", PHY_QueryRFReg(adapt, path, RF_TXBIAS_A, bMaskDWord)));
-                       /*  PA11+PAD01111, one shot */
-                       i = 0;
-                       do {
-                               ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0x80000000);
-                               ODM_SetBBReg(dm_odm, APK_offset[path], bMaskDWord, APK_value[0]);
-                               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8188E() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(dm_odm, APK_offset[path], bMaskDWord)));
-                               ODM_delay_ms(3);
-                               ODM_SetBBReg(dm_odm, APK_offset[path], bMaskDWord, APK_value[1]);
-                               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8188E() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(dm_odm, APK_offset[path], bMaskDWord)));
-
-                               ODM_delay_ms(20);
-                               ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
-
-                               if (path == RF_PATH_A)
-                                       tmpreg = ODM_GetBBReg(dm_odm, rAPK, 0x03E00000);
-                               else
-                                       tmpreg = ODM_GetBBReg(dm_odm, rAPK, 0xF8000000);
-                               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8188E() offset 0xbd8[25:21] %x\n", tmpreg));
-
-                               i++;
-                       } while (tmpreg > apkbound && i < 4);
-
-                       APK_result[path][index] = tmpreg;
-               }
-       }
-
-       /* reload MAC default value */
-       _PHY_ReloadMACRegisters(adapt, MAC_REG, MAC_backup);
-
-       /* reload BB default value */
-       for (index = 0; index < APK_BB_REG_NUM; index++) {
-               if (index == 0)         /* skip */
-                       continue;
-               ODM_SetBBReg(dm_odm, BB_REG[index], bMaskDWord, BB_backup[index]);
-       }
-
-       /* reload AFE default value */
-       reload_adda_reg(adapt, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);
-
-       /* reload RF path default value */
-       for (path = 0; path < pathbound; path++) {
-               ODM_SetRFReg(dm_odm, path, 0xd, bMaskDWord, regD[path]);
-               if (path == RF_PATH_B) {
-                       ODM_SetRFReg(dm_odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f);
-                       ODM_SetRFReg(dm_odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20101);
-               }
-
-               /* note no index == 0 */
-               if (APK_result[path][1] > 6)
-                       APK_result[path][1] = 6;
-               ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("apk path %d result %d 0x%x \t", path, 1, APK_result[path][1]));
-       }
-
-       ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("\n"));
-
-       for (path = 0; path < pathbound; path++) {
-               ODM_SetRFReg(dm_odm, path, 0x3, bMaskDWord,
-                            ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1]));
-               if (path == RF_PATH_A)
-                       ODM_SetRFReg(dm_odm, path, 0x4, bMaskDWord,
-                                    ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05));
-               else
-                       ODM_SetRFReg(dm_odm, path, 0x4, bMaskDWord,
-                                    ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05));
-               ODM_SetRFReg(dm_odm, path, RF_BS_PA_APSET_G9_G11, bMaskDWord,
-                            ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08));
-       }
-
-       dm_odm->RFCalibrateInfo.bAPKdone = true;
-
-       ODM_RT_TRACE(dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<==phy_APCalibrate_8188E()\n"));
-}
-
-#define                DP_BB_REG_NUM           7
-#define                DP_RF_REG_NUM           1
-#define                DP_RETRY_LIMIT          10
-#define                DP_PATH_NUM             2
-#define                DP_DPK_NUM                      3
-#define                DP_DPK_VALUE_NUM        2
-
 void PHY_IQCalibrate_8188E(struct adapter *adapt, bool recovery)
 {
        struct hal_data_8188e   *pHalData = GET_HAL_DATA(adapt);
@@ -1867,28 +1466,6 @@ void PHY_LCCalibrate_8188E(struct adapter *adapt)
                     ("LCK:Finish!!!interface %d\n", dm_odm->InterfaceIndex));
 }
 
-void PHY_APCalibrate_8188E(struct adapter *adapt, s8 delta)
-{
-       struct hal_data_8188e   *pHalData = GET_HAL_DATA(adapt);
-       struct odm_dm_struct *dm_odm = &pHalData->odmpriv;
-
-       return;
-       if (!(dm_odm->SupportAbility & ODM_RF_CALIBRATION))
-               return;
-
-#if FOR_BRAZIL_PRETEST != 1
-       if (dm_odm->RFCalibrateInfo.bAPKdone)
-#endif
-               return;
-
-       if (dm_odm->RFType == ODM_2T2R) {
-               phy_APCalibrate_8188E(adapt, delta, true);
-       } else {
-               /*  For 88C 1T1R */
-               phy_APCalibrate_8188E(adapt, delta, false);
-       }
-}
-
 static void phy_setrfpathswitch_8188e(struct adapter *adapt, bool main, bool is2t)
 {
        struct hal_data_8188e   *pHalData = GET_HAL_DATA(adapt);
index 292ba62d722f6235298bb5e54bd2253668b09b5b..390ab39591e6ba29966375d6af6229dc88bbbc7a 100644 (file)
@@ -1479,7 +1479,6 @@ static bool hal_EfusePgPacketWrite1ByteHeader(struct adapter *pAdapter, u8 efuse
 
 static bool hal_EfusePgPacketWriteData(struct adapter *pAdapter, u8 efuseType, u16 *pAddr, struct pgpkt *pTargetPkt, bool bPseudoTest)
 {
-       bool bRet = false;
        u16     efuse_addr = *pAddr;
        u8 badworden = 0;
        u32     PgWriteSuccess = 0;
@@ -1497,7 +1496,6 @@ static bool hal_EfusePgPacketWriteData(struct adapter *pAdapter, u8 efuseType, u
                else
                        return true;
        }
-       return bRet;
 }
 
 static bool
@@ -2182,7 +2180,7 @@ void Hal_ReadTxPowerInfo88E(struct adapter *padapter, u8 *PROMContent, bool Auto
                pHalData->bTXPowerDataReadFromEEPORM = true;
 
        for (rfPath = 0; rfPath < pHalData->NumTotalRFPath; rfPath++) {
-               for (ch = 0; ch <= CHANNEL_MAX_NUMBER; ch++) {
+               for (ch = 0; ch < CHANNEL_MAX_NUMBER; ch++) {
                        bIn24G = Hal_GetChnlGroup88E(ch, &group);
                        if (bIn24G) {
                                pHalData->Index24G_CCK_Base[rfPath][ch] = pwrInfo24G.IndexCCK_Base[rfPath][group];
index bc564169b2f0560b155a519d2421fc5ae7f71a56..2a20f2348108058f39c033700f7023f5fc570091 100644 (file)
@@ -605,68 +605,68 @@ _func_enter_;
                return _FAIL;
        }
 
+       if (!precvbuf) {
+               RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
+                        ("usb_read_port:precvbuf==NULL\n"));
+               return _FAIL;
+       }
+
        if ((!precvbuf->reuse) || (precvbuf->pskb == NULL)) {
                precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue);
                if (NULL != precvbuf->pskb)
                        precvbuf->reuse = true;
        }
 
-       if (precvbuf != NULL) {
-               rtl8188eu_init_recvbuf(adapter, precvbuf);
-
-               /* re-assign for linux based on skb */
-               if ((!precvbuf->reuse) || (precvbuf->pskb == NULL)) {
-                       precvbuf->pskb = netdev_alloc_skb(adapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
-                       if (precvbuf->pskb == NULL) {
-                               RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("init_recvbuf(): alloc_skb fail!\n"));
-                               DBG_88E("#### usb_read_port() alloc_skb fail!#####\n");
-                               return _FAIL;
-                       }
-
-                       tmpaddr = (size_t)precvbuf->pskb->data;
-                       alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);
-                       skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment));
-
-                       precvbuf->phead = precvbuf->pskb->head;
-                       precvbuf->pdata = precvbuf->pskb->data;
-                       precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
-                       precvbuf->pend = skb_end_pointer(precvbuf->pskb);
-                       precvbuf->pbuf = precvbuf->pskb->data;
-               } else { /* reuse skb */
-                       precvbuf->phead = precvbuf->pskb->head;
-                       precvbuf->pdata = precvbuf->pskb->data;
-                       precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
-                       precvbuf->pend = skb_end_pointer(precvbuf->pskb);
-                       precvbuf->pbuf = precvbuf->pskb->data;
+       rtl8188eu_init_recvbuf(adapter, precvbuf);
 
-                       precvbuf->reuse = false;
+       /* re-assign for linux based on skb */
+       if ((!precvbuf->reuse) || (precvbuf->pskb == NULL)) {
+               precvbuf->pskb = netdev_alloc_skb(adapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
+               if (precvbuf->pskb == NULL) {
+                       RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("init_recvbuf(): alloc_skb fail!\n"));
+                       DBG_88E("#### usb_read_port() alloc_skb fail!#####\n");
+                       return _FAIL;
                }
 
-               precvpriv->rx_pending_cnt++;
+               tmpaddr = (size_t)precvbuf->pskb->data;
+               alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);
+               skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment));
+
+               precvbuf->phead = precvbuf->pskb->head;
+               precvbuf->pdata = precvbuf->pskb->data;
+               precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
+               precvbuf->pend = skb_end_pointer(precvbuf->pskb);
+               precvbuf->pbuf = precvbuf->pskb->data;
+       } else { /* reuse skb */
+               precvbuf->phead = precvbuf->pskb->head;
+               precvbuf->pdata = precvbuf->pskb->data;
+               precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
+               precvbuf->pend = skb_end_pointer(precvbuf->pskb);
+               precvbuf->pbuf = precvbuf->pskb->data;
+
+               precvbuf->reuse = false;
+       }
 
-               purb = precvbuf->purb;
+       precvpriv->rx_pending_cnt++;
 
-               /* translate DMA FIFO addr to pipehandle */
-               pipe = ffaddr2pipehdl(pdvobj, addr);
+       purb = precvbuf->purb;
 
-               usb_fill_bulk_urb(purb, pusbd, pipe,
-                                 precvbuf->pbuf,
-                                 MAX_RECVBUF_SZ,
-                                 usb_read_port_complete,
-                                 precvbuf);/* context is precvbuf */
+       /* translate DMA FIFO addr to pipehandle */
+       pipe = ffaddr2pipehdl(pdvobj, addr);
 
-               err = usb_submit_urb(purb, GFP_ATOMIC);
-               if ((err) && (err != (-EPERM))) {
-                       RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
-                                ("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x",
-                                err, purb->status));
-                       DBG_88E("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",
-                               err, purb->status);
-                       ret = _FAIL;
-               }
-       } else {
+       usb_fill_bulk_urb(purb, pusbd, pipe,
+                         precvbuf->pbuf,
+                         MAX_RECVBUF_SZ,
+                         usb_read_port_complete,
+                         precvbuf);/* context is precvbuf */
+
+       err = usb_submit_urb(purb, GFP_ATOMIC);
+       if ((err) && (err != (-EPERM))) {
                RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
-                        ("usb_read_port:precvbuf ==NULL\n"));
+                        ("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x",
+                        err, purb->status));
+               DBG_88E("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",
+                       err, purb->status);
                ret = _FAIL;
        }
 
index c4769e20a5c371149c6c07f8cce71bf6868ced05..25cae8147e732a1519761de9b8bf48379d598b1e 100644 (file)
@@ -75,7 +75,7 @@ enum rf_radio_path {
 
 #define MAX_PG_GROUP 13
 
-#define        RF_PATH_MAX                     2
+#define        RF_PATH_MAX                     3
 #define                MAX_RF_PATH             RF_PATH_MAX
 #define                MAX_TX_COUNT            4 /* path numbers */
 
index fa583f2483201d587814454ddc79e8e86406b6a9..287e9f9eae4a0b601eac7883149c540236e37963 100644 (file)
@@ -45,8 +45,6 @@ void PHY_IQCalibrate_8188E(struct adapter *Adapter, bool ReCovery);
 void PHY_LCCalibrate_8188E(struct adapter *pAdapter);
 
 /*  AP calibrate */
-void PHY_APCalibrate_8188E(struct adapter *pAdapter, s8 delta);
-
 void PHY_DigitalPredistortion_8188E(struct adapter *pAdapter);
 
 void _PHY_SaveADDARegisters(struct adapter *pAdapter, u32 *ADDAReg,
index 4787bacdcad892da62bf66c05cadb851e090e09d..eaa4bc1b2255b136731e4dcda62e86f196206885 100644 (file)
@@ -283,8 +283,6 @@ struct odm_rate_adapt {
 
 /*  Declare for common info */
 
-#define MAX_PATH_NUM_92CS      2
-
 struct odm_phy_status_info {
        u8      RxPWDBAll;
        u8      SignalQuality;   /*  in 0-100 index. */
@@ -950,7 +948,7 @@ struct odm_dm_struct {
        struct timer_list FastAntTrainingTimer;
 };             /*  DM_Dynamic_Mechanism_Structure */
 
-#define ODM_RF_PATH_MAX 2
+#define ODM_RF_PATH_MAX 3
 
 enum ODM_RF_RADIO_PATH {
        ODM_RF_PATH_A = 0,   /* Radio Path A */
index 63779f5b2a3c142f992593eb1f91ccfb93c4e348..df5272221bad976bbb133b991eddb440749d883c 100644 (file)
@@ -69,7 +69,7 @@ struct phy_rx_agc_info {
 };
 
 struct phy_status_rpt {
-       struct phy_rx_agc_info path_agc[2];
+       struct phy_rx_agc_info path_agc[3];
        u8      ch_corr[2];
        u8      cck_sig_qual_ofdm_pwdb_all;
        u8      cck_agc_rpt_ofdm_cfosho_a;
@@ -79,7 +79,7 @@ struct phy_status_rpt {
        u8      path_cfotail[2];
        u8      pcts_mask[2];
        s8      stream_rxevm[2];
-       u8      path_rxsnr[2];
+       u8      path_rxsnr[3];
        u8      noise_power_db_lsb;
        u8      rsvd_2[3];
        u8      stream_csi[2];
index bae8885c57f92c464e9a61b1f14db6b5b70a1b55..be9c30c574198afceab9d01365d743939efdba3a 100644 (file)
@@ -83,7 +83,7 @@ struct signal_stat {
        u32     total_num;              /* num of valid elements */
        u32     total_val;              /* sum of valid elements */
 };
-#define MAX_PATH_NUM_92CS              2
+#define MAX_PATH_NUM_92CS              3
 struct phy_info {
        u8      RxPWDBAll;
        u8      SignalQuality;   /*  in 0-100 index. */
index cd4100fb3645ffd1cc2fcb8ec1013c1fa76d30da..1138ed18780f04b26913243a0172940c080b08e9 100644 (file)
@@ -938,7 +938,7 @@ static int rtw_wx_set_pmkid(struct net_device *dev,
        memcpy(strIssueBssid, pPMK->bssid.sa_data, ETH_ALEN);
        if (pPMK->cmd == IW_PMKSA_ADD) {
                DBG_88E("[rtw_wx_set_pmkid] IW_PMKSA_ADD!\n");
-               if (!memcmp(strIssueBssid, strZeroMacAddress, ETH_ALEN) == true)
+               if (!memcmp(strIssueBssid, strZeroMacAddress, ETH_ALEN))
                        return ret;
                else
                        ret = true;
@@ -1039,7 +1039,7 @@ static int rtw_wx_get_range(struct net_device *dev,
 
        range->avg_qual.qual = 92; /* > 8% missed beacons is 'bad' */
        /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
-       range->avg_qual.level = 20 + -98;
+       range->avg_qual.level = 178; /* -78 dBm */
        range->avg_qual.noise = 0;
        range->avg_qual.updated = 7; /* Updated all three */
 
@@ -2626,7 +2626,7 @@ static int rtw_get_ap_info(struct net_device *dev,
                        return -EINVAL;
                }
 
-               if (!memcmp(bssid, pnetwork->network.MacAddress, ETH_ALEN) == true) {
+               if (!memcmp(bssid, pnetwork->network.MacAddress, ETH_ALEN)) {
                        /* BSSID match, then check if supporting wpa/wpa2 */
                        DBG_88E("BSSID:%pM\n", (bssid));
 
@@ -4040,7 +4040,7 @@ static int rtw_rereg_nd_name(struct net_device *dev,
        if (0 != ret)
                goto exit;
 
-       if (!memcmp(rereg_priv->old_ifname, "disable%d", 9) == true) {
+       if (!memcmp(rereg_priv->old_ifname, "disable%d", 9)) {
                padapter->ledpriv.bRegUseLed = rereg_priv->old_bRegUseLed;
                rtw_hal_sw_led_init(padapter);
                rtw_ips_mode_req(&padapter->pwrctrlpriv, rereg_priv->old_ips_mode);
@@ -4049,7 +4049,7 @@ static int rtw_rereg_nd_name(struct net_device *dev,
        strncpy(rereg_priv->old_ifname, new_ifname, IFNAMSIZ);
        rereg_priv->old_ifname[IFNAMSIZ-1] = 0;
 
-       if (!memcmp(new_ifname, "disable%d", 9) == true) {
+       if (!memcmp(new_ifname, "disable%d", 9)) {
                DBG_88E("%s disable\n", __func__);
                /*  free network queue for Android's timming issue */
                rtw_free_network_queue(padapter, true);
@@ -4884,7 +4884,6 @@ static int set_group_key(struct adapter *padapter, u8 *key, u8 alg, int keyid)
        case _TKIP_:
        case _TKIP_WTMIC_:
        case _AES_:
-               keylen = 16;
        default:
                keylen = 16;
        }
index 4e0bfb7e153b811b75227b9d864b96d49f48676c..51a1f6f9dbe78ec1be32a8b7e5012a2d7e10cf3c 100644 (file)
@@ -627,13 +627,14 @@ RETURN:
 int rtw_change_ifname(struct adapter *padapter, const char *ifname)
 {
        struct net_device *pnetdev;
-       struct net_device *cur_pnetdev = padapter->pnetdev;
+       struct net_device *cur_pnetdev;
        struct rereg_nd_name_data *rereg_priv;
        int ret;
 
        if (!padapter)
                goto error;
 
+       cur_pnetdev = padapter->pnetdev;
        rereg_priv = &padapter->rereg_nd_name_priv;
 
        /* free the old_pnetdev */
index e2f4e7d7717041621acfc29299d81cfe56ee66b5..c40ef1357117d0db7d96c85946a2e5b6a38980f7 100644 (file)
@@ -224,8 +224,7 @@ _func_exit_;
 _recv_indicatepkt_drop:
 
         /* enqueue back to free_recv_queue */
-       if (precv_frame)
-               rtw_free_recvframe(precv_frame, pfree_recv_queue);
+       rtw_free_recvframe(precv_frame, pfree_recv_queue);
 
 _func_exit_;
         return _FAIL;
index d3078d200e505f4c4f24237eb202d80ae6e9cd69..6e40299adbc2608b232ce561fda44f7839974c6f 100644 (file)
@@ -736,7 +736,7 @@ static struct adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
        status = _SUCCESS;
 
 free_hal_data:
-       if (status != _SUCCESS && padapter->HalData)
+       if (status != _SUCCESS)
                kfree(padapter->HalData);
 handle_dualmac:
        if (status != _SUCCESS)
index 74fbd70d583886f3696b8968c77f8b0bdec683ac..6616b3a20bc996611809fa246179b3544d1aaafb 100644 (file)
@@ -1866,15 +1866,15 @@ static void rtl8192_TranslateRxSignalStuff(struct net_device *dev,
        type = WLAN_FC_GET_TYPE(fc);
        praddr = hdr->addr1;
 
-       bpacket_match_bssid = ((RTLLIB_FTYPE_CTL != type) &&
-                       (!compare_ether_addr(priv->rtllib->
-                       current_network.bssid,
-                          (fc & RTLLIB_FCTL_TODS) ? hdr->addr1 :
-                          (fc & RTLLIB_FCTL_FROMDS) ? hdr->addr2 : hdr->addr3))
-               && (!pstats->bHwError) && (!pstats->bCRC) && (!pstats->bICV));
-       bpacket_toself =  bpacket_match_bssid &&        /* check this */
-                         (!compare_ether_addr(praddr,
-                         priv->rtllib->dev->dev_addr));
+       bpacket_match_bssid =
+               ((RTLLIB_FTYPE_CTL != type) &&
+                ether_addr_equal(priv->rtllib->current_network.bssid,
+                                 (fc & RTLLIB_FCTL_TODS) ? hdr->addr1 :
+                                 (fc & RTLLIB_FCTL_FROMDS) ? hdr->addr2 :
+                                 hdr->addr3) &&
+                (!pstats->bHwError) && (!pstats->bCRC) && (!pstats->bICV));
+       bpacket_toself = bpacket_match_bssid &&         /* check this */
+                        ether_addr_equal(praddr, priv->rtllib->dev->dev_addr);
        if (WLAN_FC_GET_FRAMETYPE(fc) == RTLLIB_STYPE_BEACON)
                bPacketBeacon = true;
        if (bpacket_match_bssid)
index 8aeaed5a987d62468022124db2b2deeff92c9afd..8ee80c50303ad8dc07e5b5a3a94cae9e51c19f19 100644 (file)
@@ -957,16 +957,15 @@ static void rtllib_rx_extract_addr(struct rtllib_device *ieee,
 static int rtllib_rx_data_filter(struct rtllib_device *ieee, u16 fc,
                                 u8 *dst, u8 *src, u8 *bssid, u8 *addr2)
 {
-       u8 zero_addr[ETH_ALEN] = {0};
        u8 type, stype;
 
        type = WLAN_FC_GET_TYPE(fc);
        stype = WLAN_FC_GET_STYPE(fc);
 
        /* Filter frames from different BSS */
-       if (((fc & RTLLIB_FCTL_DSTODS) != RTLLIB_FCTL_DSTODS)
-               && (compare_ether_addr(ieee->current_network.bssid, bssid) != 0)
-               && memcmp(ieee->current_network.bssid, zero_addr, ETH_ALEN)) {
+       if (((fc & RTLLIB_FCTL_DSTODS) != RTLLIB_FCTL_DSTODS) &&
+           !ether_addr_equal(ieee->current_network.bssid, bssid) &&
+           !is_zero_ether_addr(ieee->current_network.bssid)) {
                return -1;
        }
 
@@ -974,8 +973,8 @@ static int rtllib_rx_data_filter(struct rtllib_device *ieee, u16 fc,
        if (ieee->IntelPromiscuousModeInfo.bPromiscuousOn  &&
                ieee->IntelPromiscuousModeInfo.bFilterSourceStationFrame) {
                if ((fc & RTLLIB_FCTL_TODS) && !(fc & RTLLIB_FCTL_FROMDS) &&
-                       (compare_ether_addr(dst, ieee->current_network.bssid) != 0) &&
-                       (compare_ether_addr(bssid, ieee->current_network.bssid) == 0)) {
+                   !ether_addr_equal(dst, ieee->current_network.bssid) &&
+                   ether_addr_equal(bssid, ieee->current_network.bssid)) {
                        return -1;
                }
        }
@@ -1275,7 +1274,7 @@ static int rtllib_rx_InfraAdhoc(struct rtllib_device *ieee, struct sk_buff *skb,
        /*Filter pkt not to me*/
        multicast = is_multicast_ether_addr(hdr->addr1);
        unicast = !multicast;
-       if (unicast && (compare_ether_addr(dev->dev_addr, hdr->addr1) != 0)) {
+       if (unicast && !ether_addr_equal(dev->dev_addr, hdr->addr1)) {
                if (ieee->bNetPromiscuousMode)
                        bToOtherSTA = true;
                else
index c812d6c7dc31d48b8c9fc320ce59fba2d735f89a..dbefa43e4c2c50211cf4aa866896d875068b8147 100644 (file)
@@ -353,11 +353,6 @@ static void disable_ht_for_spec_devid(const struct usb_device_id *pdid,
        }
 }
 
-static u8 key_2char2num(u8 hch, u8 lch)
-{
-       return (hex_to_bin(hch) << 4) | hex_to_bin(lch);
-}
-
 /*
  * drv_init() - a device potentially for us
  *
@@ -465,16 +460,7 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf,
                                r8712_efuse_pg_packet_read(padapter, offset,
                                                     &pdata[i]);
 
-                       if (r8712_initmac) {
-                               /* Users specify the mac address */
-                               int jj, kk;
-
-                               for (jj = 0, kk = 0; jj < ETH_ALEN;
-                                    jj++, kk += 3)
-                                       mac[jj] =
-                                          key_2char2num(r8712_initmac[kk],
-                                          r8712_initmac[kk + 1]);
-                       } else {
+                       if (!r8712_initmac || !mac_pton(r8712_initmac, mac)) {
                                /* Use the mac address stored in the Efuse
                                 * offset = 0x12 for usb in efuse
                                 */
index 495272d0134859bf36f080bd7a5c53bc5e0ae708..39dc92a271aba2a1f341a224bd59089fa2ba3870 100644 (file)
@@ -1,11 +1,11 @@
 /******************************************************************************/
 /*                                                                            */
-/* Bypass Control utility, Copyright (c) 2005-20011 Silicom                   */
+/* Bypass Control utility, Copyright (c) 2005-2011 Silicom                    */
 /*                                                                            */
 /* This program is free software; you can redistribute it and/or modify       */
 /* it under the terms of the GNU General Public License as published by       */
 /* the Free Software Foundation, located in the file LICENSE.                 */
-/*  Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.          */
+/* Copyright(c) 2007 - 2009, 2013 Intel Corporation. All rights reserved.     */
 /*                                                                            */
 /*                                                                            */
 /******************************************************************************/
@@ -124,80 +124,60 @@ int bp_proc_create(void);
 int is_bypass_fn(struct bpctl_dev *pbpctl_dev);
 int get_dev_idx_bsf(int bus, int slot, int func);
 
-static unsigned long str_to_hex(char *p);
+static int bp_get_dev_idx_bsf(struct net_device *dev, int *index)
+{
+       struct ethtool_drvinfo drvinfo = {0};
+       char *buf;
+       int bus, slot, func;
+
+       if (dev->ethtool_ops && dev->ethtool_ops->get_drvinfo)
+               dev->ethtool_ops->get_drvinfo(dev, &drvinfo);
+       else
+               return -EOPNOTSUPP;
+
+       if (!drvinfo.bus_info)
+               return -ENODATA;
+       if (!strcmp(drvinfo.bus_info, "N/A"))
+               return -ENODATA;
+
+       buf = strchr(drvinfo.bus_info, ':');
+       if (!buf)
+               return -EINVAL;
+       buf++;
+       if (sscanf(buf, "%x:%x.%x", &bus, &slot, &func) != 3)
+               return -EINVAL;
+
+       *index = get_dev_idx_bsf(bus, slot, func);
+       return 0;
+}
+
 static int bp_device_event(struct notifier_block *unused,
                           unsigned long event, void *ptr)
 {
        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
        static struct bpctl_dev *pbpctl_dev, *pbpctl_dev_m;
        int dev_num = 0, ret = 0, ret_d = 0, time_left = 0;
+
        /* printk("BP_PROC_SUPPORT event =%d %s %d\n", event,dev->name, dev->ifindex ); */
        /* return NOTIFY_DONE; */
        if (!dev)
                return NOTIFY_DONE;
-       if (event == NETDEV_REGISTER) {
-               {
-                       struct ethtool_drvinfo drvinfo;
-                       char cbuf[32];
-                       char *buf = NULL;
-                       char res[10];
-                       int i = 0, ifindex, idx_dev = 0;
-                       int bus = 0, slot = 0, func = 0;
-                       ifindex = dev->ifindex;
-
-                       memset(res, 0, 10);
-                       memset(&drvinfo, 0, sizeof(struct ethtool_drvinfo));
-
-                       if (dev->ethtool_ops && dev->ethtool_ops->get_drvinfo) {
-                               memset(&drvinfo, 0, sizeof(drvinfo));
-                               dev->ethtool_ops->get_drvinfo(dev, &drvinfo);
-                       } else
-                               return NOTIFY_DONE;
-                       if (!drvinfo.bus_info)
-                               return NOTIFY_DONE;
-                       if (!strcmp(drvinfo.bus_info, "N/A"))
-                               return NOTIFY_DONE;
-                       memcpy(&cbuf, drvinfo.bus_info, 32);
-                       buf = &cbuf[0];
 
-                       while (*buf++ != ':')
-                               ;
-                       for (i = 0; i < 10; i++, buf++) {
-                               if (*buf == ':')
-                                       break;
-                               res[i] = *buf;
-
-                       }
-                       buf++;
-                       bus = str_to_hex(res);
-                       memset(res, 0, 10);
-
-                       for (i = 0; i < 10; i++, buf++) {
-                               if (*buf == '.')
-                                       break;
-                               res[i] = *buf;
-
-                       }
-                       buf++;
-                       slot = str_to_hex(res);
-                       func = str_to_hex(buf);
-                       idx_dev = get_dev_idx_bsf(bus, slot, func);
-
-                       if (idx_dev != -1) {
+       if (event == NETDEV_REGISTER) {
+               int idx_dev;
 
-                               bpctl_dev_arr[idx_dev].ifindex = ifindex;
-                               bpctl_dev_arr[idx_dev].ndev = dev;
+               if (bp_get_dev_idx_bsf(dev, &idx_dev))
+                       return NOTIFY_DONE;
 
-                               bypass_proc_remove_dev_sd(&bpctl_dev_arr
-                                                         [idx_dev]);
-                               bypass_proc_create_dev_sd(&bpctl_dev_arr
-                                                         [idx_dev]);
+               if (idx_dev == -1)
+                       return NOTIFY_DONE;
 
-                       }
+               bpctl_dev_arr[idx_dev].ifindex = dev->ifindex;
+               bpctl_dev_arr[idx_dev].ndev = dev;
 
-               }
+               bypass_proc_remove_dev_sd(&bpctl_dev_arr[idx_dev]);
+               bypass_proc_create_dev_sd(&bpctl_dev_arr[idx_dev]);
                return NOTIFY_DONE;
-
        }
        if (event == NETDEV_UNREGISTER) {
                int idx_dev = 0;
@@ -5269,36 +5249,6 @@ int get_dev_idx_bsf(int bus, int slot, int func)
        return -1;
 }
 
-static void str_low(char *str)
-{
-       int i;
-
-       for (i = 0; i < strlen(str); i++)
-               if ((str[i] >= 65) && (str[i] <= 90))
-                       str[i] += 32;
-}
-
-static unsigned long str_to_hex(char *p)
-{
-       unsigned long hex = 0;
-       unsigned long length = strlen(p), shift = 0;
-       unsigned char dig = 0;
-
-       str_low(p);
-       length = strlen(p);
-
-       if (length == 0)
-               return 0;
-
-       do {
-               dig = p[--length];
-               dig = dig < 'a' ? (dig - '0') : (dig - 'a' + 0xa);
-               hex |= (dig << shift);
-               shift += 4;
-       } while (length);
-       return hex;
-}
-
 static int get_dev_idx(int ifindex)
 {
        int idx_dev = 0;
@@ -5329,70 +5279,26 @@ static struct bpctl_dev *get_dev_idx_p(int ifindex)
 
 static void if_scan_init(void)
 {
-       int idx_dev = 0;
        struct net_device *dev;
-       int ifindex;
+
        /* rcu_read_lock(); */
        /* rtnl_lock();     */
        /* rcu_read_lock(); */
 
        for_each_netdev(&init_net, dev) {
+               int idx_dev;
 
-               struct ethtool_drvinfo drvinfo;
-               char cbuf[32];
-               char *buf = NULL;
-               char res[10];
-               int i = 0;
-               int bus = 0, slot = 0, func = 0;
-               ifindex = dev->ifindex;
-
-               memset(res, 0, 10);
-               memset(&drvinfo, 0, sizeof(struct ethtool_drvinfo));
-
-               if (dev->ethtool_ops && dev->ethtool_ops->get_drvinfo) {
-                       memset(&drvinfo, 0, sizeof(drvinfo));
-                       dev->ethtool_ops->get_drvinfo(dev, &drvinfo);
-               } else
+               if (bp_get_dev_idx_bsf(dev, &idx_dev))
                        continue;
-               if (!strcmp(drvinfo.bus_info, "N/A"))
-                       continue;
-               memcpy(&cbuf, drvinfo.bus_info, 32);
-               buf = &cbuf[0];
 
-               while (*buf++ != ':')
-                       ;
-               for (i = 0; i < 10; i++, buf++) {
-                       if (*buf == ':')
-                               break;
-                       res[i] = *buf;
-
-               }
-               buf++;
-               bus = str_to_hex(res);
-               memset(res, 0, 10);
-
-               for (i = 0; i < 10; i++, buf++) {
-                       if (*buf == '.')
-                               break;
-                       res[i] = *buf;
-
-               }
-               buf++;
-               slot = str_to_hex(res);
-               func = str_to_hex(buf);
-               idx_dev = get_dev_idx_bsf(bus, slot, func);
-
-               if (idx_dev != -1) {
-
-                       bpctl_dev_arr[idx_dev].ifindex = ifindex;
-                       bpctl_dev_arr[idx_dev].ndev = dev;
-
-               }
+               if (idx_dev == -1)
+                       continue;
 
+               bpctl_dev_arr[idx_dev].ifindex = dev->ifindex;
+               bpctl_dev_arr[idx_dev].ndev = dev;
        }
        /* rtnl_unlock();     */
        /* rcu_read_unlock(); */
-
 }
 
 static long device_ioctl(struct file *file,    /* see include/linux/fs.h */
index 869dcd3b385accb8606d8f53c73b298986c4712c..b6eb5df7a4269b681990ae320ca322fc934d30e3 100644 (file)
@@ -791,8 +791,8 @@ static bool slic_mac_filter(struct adapter *adapter,
                        struct mcast_address *mcaddr = adapter->mcastaddrs;
 
                        while (mcaddr) {
-                               if (!compare_ether_addr(mcaddr->address,
-                                                       ether_frame->ether_dhost)) {
+                               if (ether_addr_equal(mcaddr->address,
+                                                    ether_frame->ether_dhost)) {
                                        adapter->rcv_multicasts++;
                                        netdev->stats.multicast++;
                                        return true;
@@ -2333,7 +2333,7 @@ static int slic_mcast_add_list(struct adapter *adapter, char *address)
        /* Check to see if it already exists */
        mlist = adapter->mcastaddrs;
        while (mlist) {
-               if (!compare_ether_addr(mlist->address, address))
+               if (ether_addr_equal(mlist->address, address))
                        return 0;
                mlist = mlist->next;
        }
index 8c3e7a60a9be380888cc6450353cbf0c9889880c..efd6f4560d3e55ceeab571fdc1d0ebc242a38df2 100644 (file)
@@ -51,6 +51,7 @@ config SPEAKUP_SYNTH_ACNTSA
 
 config SPEAKUP_SYNTH_ACNTPC
        tristate "Accent PC synthesizer support"
+       depends on ISA || COMPILE_TEST
        ---help---
                This is the Speakup driver for the accent pc
                synthesizer.  You can say y to build it into the kernel,
@@ -102,6 +103,7 @@ config SPEAKUP_SYNTH_DECEXT
 
 config SPEAKUP_SYNTH_DECPC
        depends on m
+       depends on ISA || COMPILE_TEST
        tristate "DECtalk PC (big ISA card) synthesizer support"
        ---help---
 
@@ -124,6 +126,7 @@ config SPEAKUP_SYNTH_DECPC
 
 config SPEAKUP_SYNTH_DTLK
        tristate "DoubleTalk PC synthesizer support"
+       depends on ISA || COMPILE_TEST
        ---help---
 
                This is the Speakup driver for the internal DoubleTalk
@@ -134,6 +137,7 @@ config SPEAKUP_SYNTH_DTLK
 
 config SPEAKUP_SYNTH_KEYPC
        tristate "Keynote Gold PC synthesizer support"
+       depends on ISA || COMPILE_TEST
        ---help---
 
                This is the Speakup driver for the Keynote Gold
index 51bdea3a5beada9a6de419abc9dad9b658355ad3..f31afa2cffb71597df483615730c6a0e92fffdd6 100644 (file)
@@ -585,6 +585,25 @@ ssize_t spk_var_show(struct kobject *kobj, struct kobj_attribute *attr,
 }
 EXPORT_SYMBOL_GPL(spk_var_show);
 
+/*
+ * Used to reset either default_pitch or default_vol.
+ */
+static inline void spk_reset_default_value(char *header_name,
+                                       int *synth_default_value, int idx)
+{
+       struct st_var_header *param;
+
+       if (synth && synth_default_value) {
+               param = spk_var_header_by_name(header_name);
+               if (param)  {
+                       spk_set_num_var(synth_default_value[idx],
+                                       param, E_NEW_DEFAULT);
+                       spk_set_num_var(0, param, E_DEFAULT);
+                       pr_info("%s reset to default value\n", param->name);
+               }
+       }
+}
+
 /*
  * This function is called when a user echos a value to one of the
  * variable parameters.
@@ -624,56 +643,47 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr,
                if (ret == -ERANGE) {
                        var_data = param->data;
                        pr_warn("value for %s out of range, expect %d to %d\n",
-                               attr->attr.name,
+                               param->name,
                                var_data->u.n.low, var_data->u.n.high);
                }
+
+              /*
+               * If voice was just changed, we might need to reset our default
+               * pitch and volume.
+               */
+               if (param->var_id == VOICE && synth &&
+                   (ret == 0 || ret == -ERESTART)) {
+                       var_data = param->data;
+                       value = var_data->u.n.value;
+                       spk_reset_default_value("pitch", synth->default_pitch,
+                               value);
+                       spk_reset_default_value("vol", synth->default_vol,
+                               value);
+               }
                break;
        case VAR_STRING:
-               len = strlen(buf);
-               if ((len >= 1) && (buf[len - 1] == '\n'))
+               len = strlen(cp);
+               if ((len >= 1) && (cp[len - 1] == '\n'))
                        --len;
-               if ((len >= 2) && (buf[0] == '"') && (buf[len - 1] == '"')) {
-                       ++buf;
+               if ((len >= 2) && (cp[0] == '"') && (cp[len - 1] == '"')) {
+                       ++cp;
                        len -= 2;
                }
-               cp = (char *) buf;
                cp[len] = '\0';
-               ret = spk_set_string_var(buf, param, len);
+               ret = spk_set_string_var(cp, param, len);
                if (ret == -E2BIG)
                        pr_warn("value too long for %s\n",
-                                       attr->attr.name);
+                                       param->name);
                break;
        default:
                pr_warn("%s unknown type %d\n",
                        param->name, (int)param->var_type);
        break;
        }
-       /*
-        * If voice was just changed, we might need to reset our default
-        * pitch and volume.
-        */
-       if (strcmp(attr->attr.name, "voice") == 0) {
-               if (synth && synth->default_pitch) {
-                       param = spk_var_header_by_name("pitch");
-                       if (param)  {
-                               spk_set_num_var(synth->default_pitch[value],
-                                               param, E_NEW_DEFAULT);
-                               spk_set_num_var(0, param, E_DEFAULT);
-                       }
-               }
-               if (synth && synth->default_vol) {
-                       param = spk_var_header_by_name("vol");
-                       if (param)  {
-                               spk_set_num_var(synth->default_vol[value],
-                                               param, E_NEW_DEFAULT);
-                               spk_set_num_var(0, param, E_DEFAULT);
-                       }
-               }
-       }
        spin_unlock_irqrestore(&speakup_info.spinlock, flags);
 
        if (ret == -ERESTART)
-               pr_info("%s reset to default value\n", attr->attr.name);
+               pr_info("%s reset to default value\n", param->name);
        return count;
 }
 EXPORT_SYMBOL_GPL(spk_var_store);
index f983915168b7883c30a435c4561b8571abb77f75..a23b591eeac3d7432a73e78990342ef0ce65c15d 100644 (file)
@@ -148,7 +148,8 @@ BSSpSearchBSSList(
                        if (pDevice->bLinkPass == false) pCurrBSS->bSelected = false;
                        if ((pCurrBSS->bActive) &&
                            (pCurrBSS->bSelected == false)) {
-                               if (!compare_ether_addr(pCurrBSS->abyBSSID, pbyBSSID)) {
+                               if (ether_addr_equal(pCurrBSS->abyBSSID,
+                                                    pbyBSSID)) {
                                        if (pSSID != NULL) {
                                                // compare ssid
                                                if (!memcmp(pSSID->abySSID,
@@ -275,7 +276,8 @@ BSSvClearBSSList(
        for (ii = 0; ii < MAX_BSS_NUM; ii++) {
                if (bKeepCurrBSSID) {
                        if (pMgmt->sBSSList[ii].bActive &&
-                           !compare_ether_addr(pMgmt->sBSSList[ii].abyBSSID, pMgmt->abyCurrBSSID)) {
+                           ether_addr_equal(pMgmt->sBSSList[ii].abyBSSID,
+                                            pMgmt->abyCurrBSSID)) {
                                // bKeepCurrBSSID = false;
                                continue;
                        }
@@ -318,7 +320,7 @@ BSSpAddrIsInBSSList(
        for (ii = 0; ii < MAX_BSS_NUM; ii++) {
                pBSSList = &(pMgmt->sBSSList[ii]);
                if (pBSSList->bActive) {
-                       if (!compare_ether_addr(pBSSList->abyBSSID, abyBSSID)) {
+                       if (ether_addr_equal(pBSSList->abyBSSID, abyBSSID)) {
                                if (pSSID->len == ((PWLAN_IE_SSID)pBSSList->abySSID)->len) {
                                        if (memcmp(pSSID->abySSID,
                                                   ((PWLAN_IE_SSID)pBSSList->abySSID)->abySSID,
@@ -733,7 +735,8 @@ BSSDBbIsSTAInNodeDB(void *pMgmtObject, unsigned char *abyDstAddr,
        // Index = 0 reserved for AP Node
        for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) {
                if (pMgmt->sNodeDBTable[ii].bActive) {
-                       if (!compare_ether_addr(abyDstAddr, pMgmt->sNodeDBTable[ii].abyMACAddr)) {
+                       if (ether_addr_equal(abyDstAddr,
+                                            pMgmt->sNodeDBTable[ii].abyMACAddr)) {
                                *puNodeIndex = ii;
                                return true;
                        }
index a9533f3f25299cc77e9158712d218347dada3cb3..0ff51cb4a207eeb045720a3884be0eebefc11823 100644 (file)
@@ -172,9 +172,9 @@ s_vProcessRxMACHeader(PSDevice pDevice, unsigned char *pbyRxBufferAddr,
        };
 
        pbyRxBuffer = (unsigned char *)(pbyRxBufferAddr + cbHeaderSize);
-       if (!compare_ether_addr(pbyRxBuffer, &pDevice->abySNAP_Bridgetunnel[0])) {
+       if (ether_addr_equal(pbyRxBuffer, pDevice->abySNAP_Bridgetunnel)) {
                cbHeaderSize += 6;
-       } else if (!compare_ether_addr(pbyRxBuffer, &pDevice->abySNAP_RFC1042[0])) {
+       } else if (ether_addr_equal(pbyRxBuffer, pDevice->abySNAP_RFC1042)) {
                cbHeaderSize += 6;
                pwType = (unsigned short *)(pbyRxBufferAddr + cbHeaderSize);
                if ((*pwType != TYPE_PKT_IPX) && (*pwType != cpu_to_le16(0xF380))) {
@@ -420,7 +420,8 @@ device_receive_frame(
        s_vGetDASA(skb->data+4, &cbHeaderSize, &pDevice->sRxEthHeader);
 
        // filter packet send from myself
-       if (!compare_ether_addr((unsigned char *)&(pDevice->sRxEthHeader.abySrcAddr[0]), pDevice->abyCurrentNetAddr))
+       if (ether_addr_equal(pDevice->sRxEthHeader.abySrcAddr,
+                            pDevice->abyCurrentNetAddr))
                return false;
 
        if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) || (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
index 9de698ef25f5de0511b2f3ebc98c197c4f6566f8..4bff8aa96be71689c707f858f4aed6f20d1acb17 100644 (file)
@@ -663,7 +663,8 @@ int iwctl_siwap(struct net_device *dev,
                        unsigned int ii, uSameBssidNum = 0;
                        for (ii = 0; ii < MAX_BSS_NUM; ii++) {
                                if (pMgmt->sBSSList[ii].bActive &&
-                                   !compare_ether_addr(pMgmt->sBSSList[ii].abyBSSID, pMgmt->abyDesireBSSID)) {
+                                   ether_addr_equal(pMgmt->sBSSList[ii].abyBSSID,
+                                                    pMgmt->abyDesireBSSID)) {
                                        uSameBssidNum++;
                                }
                        }
@@ -840,7 +841,8 @@ int iwctl_siwessid(struct net_device *dev,
                                        //         by means of judging if there are two same BSSID exist in list ?
                                        for (ii = 0; ii < MAX_BSS_NUM; ii++) {
                                                if (pMgmt->sBSSList[ii].bActive &&
-                                                   !compare_ether_addr(pMgmt->sBSSList[ii].abyBSSID, pCurr->abyBSSID)) {
+                                                   ether_addr_equal(pMgmt->sBSSList[ii].abyBSSID,
+                                                                    pCurr->abyBSSID)) {
                                                        uSameBssidNum++;
                                                }
                                        }
index 92b84b5ea115cd0ee465e097078bbd4bd9866500..04c1304d16e59105b9616029bc6da2a2db0f8abc 100644 (file)
@@ -141,7 +141,7 @@ bool KeybGetKey(
        *pKey = NULL;
        for (i = 0; i < MAX_KEY_TABLE; i++) {
                if ((pTable->KeyTable[i].bInUse == true) &&
-                   !compare_ether_addr(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
+                   ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
                        if (dwKeyIndex == 0xFFFFFFFF) {
                                if (pTable->KeyTable[i].PairwiseKey.bKeyValid == true) {
                                        *pKey = &(pTable->KeyTable[i].PairwiseKey);
@@ -208,7 +208,7 @@ bool KeybSetKey(
                        j = i;
                }
                if ((pTable->KeyTable[i].bInUse == true) &&
-                   !compare_ether_addr(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
+                   ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
                        // found table already exist
                        if ((dwKeyIndex & PAIRWISE_KEY) != 0) {
                                // Pairwise key
@@ -385,7 +385,7 @@ bool KeybRemoveKey(
 
        for (i = 0; i < MAX_KEY_TABLE; i++) {
                if ((pTable->KeyTable[i].bInUse == true) &&
-                   !compare_ether_addr(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
+                   ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
                        if ((dwKeyIndex & PAIRWISE_KEY) != 0) {
                                pTable->KeyTable[i].PairwiseKey.bKeyValid = false;
                                s_vCheckKeyTableValid(pTable, dwIoBase);
@@ -429,7 +429,7 @@ bool KeybRemoveAllKey(
 
        for (i = 0; i < MAX_KEY_TABLE; i++) {
                if ((pTable->KeyTable[i].bInUse == true) &&
-                   !compare_ether_addr(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
+                   ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
                        pTable->KeyTable[i].PairwiseKey.bKeyValid = false;
                        for (u = 0; u < MAX_GROUP_KEY; u++) {
                                pTable->KeyTable[i].GroupKey[u].bKeyValid = false;
@@ -512,7 +512,7 @@ bool KeybGetTransmitKey(
        *pKey = NULL;
        for (i = 0; i < MAX_KEY_TABLE; i++) {
                if ((pTable->KeyTable[i].bInUse == true) &&
-                   !compare_ether_addr(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
+                   ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
                        if (dwKeyType == PAIRWISE_KEY) {
                                if (pTable->KeyTable[i].PairwiseKey.bKeyValid == true) {
                                        *pKey = &(pTable->KeyTable[i].PairwiseKey);
index d8f4f8e7d05eba72281375483ca35fe09f7fbd46..d2bdb71fe62d37a914e5d9fc0c43fff570425320 100644 (file)
@@ -752,25 +752,3 @@ VNTWIFIbChannelSwitch(
        //spin_unlock_irq(&pDevice->lock);
        return true;
 }
-
-/*
-  bool
-  VNTWIFIbRadarPresent(
-  void *pMgmtObject,
-  unsigned char byChannel
-) {
-  PSMgmtObject    pMgmt = (PSMgmtObject) pMgmtObject;
-  if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) &&
-  (byChannel == (unsigned char) pMgmt->uCurrChannel) &&
-  (pMgmt->bSwitchChannel != true) &&
-  (pMgmt->b11hEnable == true)) {
-  if (!compare_ether_addr(pMgmt->abyIBSSDFSOwner, CARDpGetCurrentAddress(pMgmt->pAdapter))) {
-  pMgmt->byNewChannel = CARDbyAutoChannelSelect(pMgmt->pAdapter,(unsigned char) pMgmt->uCurrChannel);
-  pMgmt->bSwitchChannel = true;
-  }
-  BEACONbSendBeacon(pMgmt);
-  CARDbChannelSwitch(pMgmt->pAdapter, 0, pMgmt->byNewChannel, 10);
-  }
-  return true;
-  }
-*/
index 9eb81b4eee806b3ccda7331c4a0245182a22ec4d..f05f9f55398bf7a390068495b60ace381a978bc7 100644 (file)
@@ -75,8 +75,8 @@ bool WCTLbIsDuplicate(PSCache pCache, PS802_11Header pMACHeader)
                for (ii = 0; ii < DUPLICATE_RX_CACHE_LENGTH; ii++) {
                        pCacheEntry = &(pCache->asCacheEntry[uIndex]);
                        if ((pCacheEntry->wFmSequence == pMACHeader->wSeqCtl) &&
-                           (!compare_ether_addr(&(pCacheEntry->abyAddr2[0]), &(pMACHeader->abyAddr2[0])))
-) {
+                           ether_addr_equal(pCacheEntry->abyAddr2,
+                                            pMACHeader->abyAddr2)) {
                                /* Duplicate match */
                                return true;
                        }
@@ -111,8 +111,8 @@ unsigned int WCTLuSearchDFCB(PSDevice pDevice, PS802_11Header pMACHeader)
 
        for (ii = 0; ii < pDevice->cbDFCB; ii++) {
                if ((pDevice->sRxDFCB[ii].bInUse == true) &&
-                   (!compare_ether_addr(&(pDevice->sRxDFCB[ii].abyAddr2[0]), &(pMACHeader->abyAddr2[0])))
-) {
+                   ether_addr_equal(pDevice->sRxDFCB[ii].abyAddr2,
+                                    pMACHeader->abyAddr2)) {
                        //
                        return ii;
                }
index 9938813f997a276227d1cdaae10fc245e97f886b..ed4b32b6d9cee7c4fdf8e1ca6c33ea61b06f928c 100644 (file)
@@ -1680,7 +1680,8 @@ s_vMgrRxDeauthentication(
                        vMgrDecodeDeauthen(&sFrame);
                        DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO  "AP deauthed me, reason=%d.\n", cpu_to_le16((*(sFrame.pwReason))));
                        // TODO: update BSS list for specific BSSID if pre-authentication case
-                       if (!compare_ether_addr(sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID)) {
+                       if (ether_addr_equal(sFrame.pHdr->sA3.abyAddr3,
+                                            pMgmt->abyCurrBSSID)) {
                                if (pMgmt->eCurrState >= WMAC_STATE_AUTHPENDING) {
                                        pMgmt->sNodeDBTable[0].bActive = false;
                                        pMgmt->eCurrMode = WMAC_MODE_STANDBY;
index e8d9ecd2913aa32d512e94ddc3ef0fb522904fa2..044368a46c53f332d45f9387722563143139c468 100644 (file)
@@ -394,7 +394,7 @@ int wpa_set_keys(PSDevice pDevice, void *ctx, bool fcpfkernel)
 
                } else {
                        // Key Table Full
-                       if (!compare_ether_addr(&param->addr[0], pDevice->abyBSSID)) {
+                       if (ether_addr_equal(param->addr, pDevice->abyBSSID)) {
                                //DBG_PRN_WLAN03(("return NDIS_STATUS_INVALID_DATA -Key Table Full.2\n"));
                                //spin_unlock_irq(&pDevice->lock);
                                return -EINVAL;
index ee79bbdf1a06ad0e48c23a24ba48f40be1d2778e..ed1d609cc25fbc2bf06ce684dcdd5902dfb6aef2 100644 (file)
@@ -126,7 +126,7 @@ PKnownBSS BSSpSearchBSSList(struct vnt_private *pDevice,
 
             if ((pCurrBSS->bActive) &&
                 (pCurrBSS->bSelected == false)) {
-                   if (!compare_ether_addr(pCurrBSS->abyBSSID, pbyBSSID)) {
+                   if (ether_addr_equal(pCurrBSS->abyBSSID, pbyBSSID)) {
                     if (pSSID != NULL) {
                         // compare ssid
                         if ( !memcmp(pSSID->abySSID,
@@ -242,8 +242,8 @@ void BSSvClearBSSList(struct vnt_private *pDevice, int bKeepCurrBSSID)
     for (ii = 0; ii < MAX_BSS_NUM; ii++) {
         if (bKeepCurrBSSID) {
             if (pMgmt->sBSSList[ii].bActive &&
-               !compare_ether_addr(pMgmt->sBSSList[ii].abyBSSID,
-                                   pMgmt->abyCurrBSSID)) {
+               ether_addr_equal(pMgmt->sBSSList[ii].abyBSSID,
+                                pMgmt->abyCurrBSSID)) {
  //mike mark: there are two BSSID's in list. If that AP is in hidden ssid mode, one SSID is null,
  //                 but other's might not be obvious, so if it associate's with your STA,
  //                 you must keep the two of them!!
@@ -277,7 +277,7 @@ PKnownBSS BSSpAddrIsInBSSList(struct vnt_private *pDevice,
     for (ii = 0; ii < MAX_BSS_NUM; ii++) {
         pBSSList = &(pMgmt->sBSSList[ii]);
         if (pBSSList->bActive) {
-               if (!compare_ether_addr(pBSSList->abyBSSID, abyBSSID)) {
+               if (ether_addr_equal(pBSSList->abyBSSID, abyBSSID)) {
                 if (pSSID->len == ((PWLAN_IE_SSID)pBSSList->abySSID)->len){
                     if (memcmp(pSSID->abySSID,
                             ((PWLAN_IE_SSID)pBSSList->abySSID)->abySSID,
@@ -623,8 +623,8 @@ int BSSbIsSTAInNodeDB(struct vnt_private *pDevice,
     // Index = 0 reserved for AP Node
     for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) {
         if (pMgmt->sNodeDBTable[ii].bActive) {
-               if (!compare_ether_addr(abyDstAddr,
-                                       pMgmt->sNodeDBTable[ii].abyMACAddr)) {
+               if (ether_addr_equal(abyDstAddr,
+                                    pMgmt->sNodeDBTable[ii].abyMACAddr)) {
                 *puNodeIndex = ii;
                 return true;
             }
index ea7d443b11d067c22f07f41c5c8ac7d2f6fecb03..29381b466e2087b36081df7f96a3149217363284 100644 (file)
@@ -136,9 +136,9 @@ static void s_vProcessRxMACHeader(struct vnt_private *pDevice,
     };
 
     pbyRxBuffer = (u8 *) (pbyRxBufferAddr + cbHeaderSize);
-    if (!compare_ether_addr(pbyRxBuffer, &pDevice->abySNAP_Bridgetunnel[0])) {
+    if (ether_addr_equal(pbyRxBuffer, pDevice->abySNAP_Bridgetunnel)) {
         cbHeaderSize += 6;
-    } else if (!compare_ether_addr(pbyRxBuffer, &pDevice->abySNAP_RFC1042[0])) {
+    } else if (ether_addr_equal(pbyRxBuffer, pDevice->abySNAP_RFC1042)) {
         cbHeaderSize += 6;
         pwType = (u16 *) (pbyRxBufferAddr + cbHeaderSize);
        if ((*pwType == cpu_to_be16(ETH_P_IPX)) ||
@@ -361,7 +361,7 @@ int RXbBulkInProcessData(struct vnt_private *pDevice, struct vnt_rcb *pRCB,
     if ((pMgmt->eCurrMode == WMAC_MODE_STANDBY) ||
         (pMgmt->eCurrMode == WMAC_MODE_ESS_STA)) {
        if (pMgmt->sNodeDBTable[0].bActive) {
-        if (!compare_ether_addr(pMgmt->abyCurrBSSID, pMACHeader->addr2)) {
+        if (ether_addr_equal(pMgmt->abyCurrBSSID, pMACHeader->addr2)) {
            if (pMgmt->sNodeDBTable[0].uInActiveCount != 0)
                   pMgmt->sNodeDBTable[0].uInActiveCount = 0;
            }
@@ -374,8 +374,7 @@ int RXbBulkInProcessData(struct vnt_private *pDevice, struct vnt_rcb *pRCB,
             return false;
         }
 
-       if (compare_ether_addr(pDevice->abyCurrentNetAddr,
-                              pMACHeader->addr1)) {
+       if (!ether_addr_equal(pDevice->abyCurrentNetAddr, pMACHeader->addr1)) {
                return false;
         }
     }
@@ -383,8 +382,8 @@ int RXbBulkInProcessData(struct vnt_private *pDevice, struct vnt_rcb *pRCB,
     // Use for TKIP MIC
     s_vGetDASA(pbyFrame, &cbHeaderSize, &pDevice->sRxEthHeader);
 
-    if (!compare_ether_addr((u8 *)&(pDevice->sRxEthHeader.h_source[0]),
-                           pDevice->abyCurrentNetAddr))
+    if (ether_addr_equal((u8 *)pDevice->sRxEthHeader.h_source,
+                        pDevice->abyCurrentNetAddr))
         return false;
 
     if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) || (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
index d0cf7d8a20e5640fe507f3ff1b1dc64c170f9408..033cb50f779a50b025d3899f3c943515fa835ea9 100644 (file)
@@ -657,8 +657,8 @@ int iwctl_siwap(struct net_device *dev, struct iw_request_info *info,
                        unsigned uSameBssidNum = 0;
                        for (ii = 0; ii < MAX_BSS_NUM; ii++) {
                                if (pMgmt->sBSSList[ii].bActive &&
-                                       !compare_ether_addr(pMgmt->sBSSList[ii].abyBSSID,
-                                                       pMgmt->abyDesireBSSID)) {
+                                       ether_addr_equal(pMgmt->sBSSList[ii].abyBSSID,
+                                                        pMgmt->abyDesireBSSID)) {
                                        uSameBssidNum++;
                                }
                        }
@@ -840,8 +840,8 @@ int iwctl_siwessid(struct net_device *dev, struct iw_request_info *info,
                                // are two same BSSID exist in list ?
                                for (ii = 0; ii < MAX_BSS_NUM; ii++) {
                                        if (pMgmt->sBSSList[ii].bActive &&
-                                               !compare_ether_addr(pMgmt->sBSSList[ii].abyBSSID,
-                                                               pCurr->abyBSSID)) {
+                                               ether_addr_equal(pMgmt->sBSSList[ii].abyBSSID,
+                                                                pCurr->abyBSSID)) {
                                                uSameBssidNum++;
                                        }
                                }
index 205590b0e9c839018a390cd79a0c23fe97d341ec..be92c048a12e93bbd6169e0b2d54fb1c6c0503f9 100644 (file)
@@ -151,7 +151,7 @@ int KeybGetKey(PSKeyManagement pTable, u8 *pbyBSSID, u32 dwKeyIndex,
     *pKey = NULL;
     for (i=0;i<MAX_KEY_TABLE;i++) {
         if ((pTable->KeyTable[i].bInUse == true) &&
-           !compare_ether_addr(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
+           ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
             if (dwKeyIndex == 0xFFFFFFFF) {
                 if (pTable->KeyTable[i].PairwiseKey.bKeyValid == true) {
                     *pKey = &(pTable->KeyTable[i].PairwiseKey);
@@ -213,7 +213,7 @@ int KeybSetKey(struct vnt_private *pDevice, PSKeyManagement pTable,
             j = i;
         }
         if ((pTable->KeyTable[i].bInUse == true) &&
-           !compare_ether_addr(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
+           ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
             // found table already exist
             if ((dwKeyIndex & PAIRWISE_KEY) != 0) {
                 // Pairwise key
@@ -395,7 +395,7 @@ int KeybRemoveKey(struct vnt_private *pDevice, PSKeyManagement pTable,
     } else {
         for (i=0;i<MAX_KEY_TABLE;i++) {
             if ( (pTable->KeyTable[i].bInUse == true) &&
-                !compare_ether_addr(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
+                ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
 
                 if ((dwKeyIndex & PAIRWISE_KEY) != 0) {
                     pTable->KeyTable[i].PairwiseKey.bKeyValid = false;
@@ -445,7 +445,7 @@ int KeybRemoveAllKey(struct vnt_private *pDevice, PSKeyManagement pTable,
 
     for (i=0;i<MAX_KEY_TABLE;i++) {
         if ((pTable->KeyTable[i].bInUse == true) &&
-           !compare_ether_addr(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
+           ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
             pTable->KeyTable[i].PairwiseKey.bKeyValid = false;
            for (u = 0; u < MAX_GROUP_KEY; u++)
                pTable->KeyTable[i].GroupKey[u].bKeyValid = false;
@@ -480,7 +480,7 @@ int KeybGetTransmitKey(PSKeyManagement pTable, u8 *pbyBSSID, u32 dwKeyType,
 
     for (i = 0; i < MAX_KEY_TABLE; i++) {
         if ((pTable->KeyTable[i].bInUse == true) &&
-           !compare_ether_addr(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
+           ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) {
 
             if (dwKeyType == PAIRWISE_KEY) {
 
index 47a655db51efe7491af61f9243691e3660ea7ff4..814342cd948ed9509d175d8ece30734b05d9f69a 100644 (file)
@@ -69,8 +69,7 @@ bool WCTLbIsDuplicate (PSCache pCache, struct ieee80211_hdr *pMACHeader)
         for (ii = 0; ii < DUPLICATE_RX_CACHE_LENGTH; ii++) {
             pCacheEntry = &(pCache->asCacheEntry[uIndex]);
             if ((pCacheEntry->wFmSequence == pMACHeader->seq_ctrl) &&
-               (!compare_ether_addr(&(pCacheEntry->abyAddr2[0]),
-                                    &(pMACHeader->addr2[0]))) &&
+               ether_addr_equal(pCacheEntry->abyAddr2, pMACHeader->addr2) &&
                 (LOBYTE(pCacheEntry->wFrameCtl) == LOBYTE(pMACHeader->frame_control))
                 ) {
                 /* Duplicate match */
@@ -110,8 +109,8 @@ unsigned int WCTLuSearchDFCB(struct vnt_private *pDevice,
 
        for (ii = 0; ii < pDevice->cbDFCB; ii++) {
                if ((pDevice->sRxDFCB[ii].bInUse == true) &&
-                   (!compare_ether_addr(&(pDevice->sRxDFCB[ii].abyAddr2[0]),
-                                         &(pMACHeader->addr2[0])))) {
+                   ether_addr_equal(pDevice->sRxDFCB[ii].abyAddr2,
+                                    pMACHeader->addr2)) {
                        return ii;
                }
        }
index b6cbd138a2b46c615b0870c2c8dca58d094372b5..bc808ef7bd217dcf49d4b6834d03378c0dcd7235 100644 (file)
@@ -1422,8 +1422,8 @@ static void s_vMgrRxDeauthentication(struct vnt_private *pDevice,
           pDevice->fWPA_Authened = false;
             DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO  "AP deauthed me, reason=%d.\n", cpu_to_le16((*(sFrame.pwReason))));
             // TODO: update BSS list for specific BSSID if pre-authentication case
-           if (!compare_ether_addr(sFrame.pHdr->sA3.abyAddr3,
-                                   pMgmt->abyCurrBSSID)) {
+           if (ether_addr_equal(sFrame.pHdr->sA3.abyAddr3,
+                                pMgmt->abyCurrBSSID)) {
                 if (pMgmt->eCurrState >= WMAC_STATE_AUTHPENDING) {
                     pMgmt->sNodeDBTable[0].bActive = false;
                     pMgmt->eCurrMode = WMAC_MODE_STANDBY;
index 9f1b413ce86f7534cf7ccc30bb2de26cc0c7ded0..003bd7c614e5f726b9e94109ebef08391dec260c 100644 (file)
@@ -227,7 +227,7 @@ int wpa_set_keys(struct vnt_private *pDevice, void *ctx)
                        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Pairwise Key Set\n");
                } else {
                        // Key Table Full
-                       if (!compare_ether_addr(&param->addr[0], pDevice->abyBSSID)) {
+                       if (ether_addr_equal(param->addr, pDevice->abyBSSID)) {
                                //DBG_PRN_WLAN03(("return NDIS_STATUS_INVALID_DATA -Key Table Full.2\n"));
                                return -EINVAL;
                        } else {
index f1bce18ea828fe4f957705ec342508b16670f99a..237479acc3b4531e434c95e7a7a2efb7788d85e4 100644 (file)
@@ -122,7 +122,7 @@ int prism2_change_virtual_intf(struct wiphy *wiphy,
                data = 1;
                break;
        default:
-               printk(KERN_WARNING "Operation mode: %d not support\n", type);
+               netdev_warn(dev, "Operation mode: %d not support\n", type);
                return -EOPNOTSUPP;
        }
 
@@ -352,7 +352,7 @@ int prism2_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
                return -EBUSY;
 
        if (wlandev->macmode == WLAN_MACMODE_ESS_AP) {
-               printk(KERN_ERR "Can't scan in AP mode\n");
+               netdev_err(dev, "Can't scan in AP mode\n");
                return -EOPNOTSUPP;
        }
 
@@ -510,7 +510,7 @@ int prism2_connect(struct wiphy *wiphy, struct net_device *dev,
                ((sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC) && is_wep))
                        msg_join.authtype.data = P80211ENUM_authalg_sharedkey;
        else
-               printk(KERN_WARNING
+               netdev_warn(dev,
                        "Unhandled authorisation type for connect (%d)\n",
                        sme->auth_type);
 
index c1a8cb62515445741b914cb8734dcbe0d7b4553a..5b8b094c87261807d49d2b68b3e518033b17a13f 100644 (file)
@@ -355,7 +355,7 @@ static int submit_rx_urb(hfa384x_t *hw, gfp_t memflags)
 
                /* Check whether we need to reset the RX pipe */
                if (result == -EPIPE) {
-                       printk(KERN_WARNING
+                       netdev_warn(hw->wlandev->netdev,
                               "%s rx pipe stalled: requesting reset\n",
                               hw->wlandev->netdev->name);
                        if (!test_and_set_bit(WORK_RX_HALT, &hw->usb_flags))
@@ -405,7 +405,7 @@ static int submit_tx_urb(hfa384x_t *hw, struct urb *tx_urb, gfp_t memflags)
 
                        /* Test whether we need to reset the TX pipe */
                        if (result == -EPIPE) {
-                               printk(KERN_WARNING
+                               netdev_warn(hw->wlandev->netdev,
                                       "%s tx pipe stalled: requesting reset\n",
                                       netdev->name);
                                set_bit(WORK_TX_HALT, &hw->usb_flags);
@@ -454,11 +454,11 @@ static void hfa384x_usb_defer(struct work_struct *data)
 
                ret = usb_clear_halt(hw->usb, hw->endp_in);
                if (ret != 0) {
-                       printk(KERN_ERR
+                       netdev_err(hw->wlandev->netdev,
                               "Failed to clear rx pipe for %s: err=%d\n",
                               netdev->name, ret);
                } else {
-                       printk(KERN_INFO "%s rx pipe reset complete.\n",
+                       netdev_info(hw->wlandev->netdev, "%s rx pipe reset complete.\n",
                               netdev->name);
                        clear_bit(WORK_RX_HALT, &hw->usb_flags);
                        set_bit(WORK_RX_RESUME, &hw->usb_flags);
@@ -471,7 +471,7 @@ static void hfa384x_usb_defer(struct work_struct *data)
 
                ret = submit_rx_urb(hw, GFP_KERNEL);
                if (ret != 0) {
-                       printk(KERN_ERR
+                       netdev_err(hw->wlandev->netdev,
                               "Failed to resume %s rx pipe.\n", netdev->name);
                } else {
                        clear_bit(WORK_RX_RESUME, &hw->usb_flags);
@@ -485,11 +485,11 @@ static void hfa384x_usb_defer(struct work_struct *data)
                usb_kill_urb(&hw->tx_urb);
                ret = usb_clear_halt(hw->usb, hw->endp_out);
                if (ret != 0) {
-                       printk(KERN_ERR
+                       netdev_err(hw->wlandev->netdev,
                               "Failed to clear tx pipe for %s: err=%d\n",
                               netdev->name, ret);
                } else {
-                       printk(KERN_INFO "%s tx pipe reset complete.\n",
+                       netdev_info(hw->wlandev->netdev, "%s tx pipe reset complete.\n",
                               netdev->name);
                        clear_bit(WORK_TX_HALT, &hw->usb_flags);
                        set_bit(WORK_TX_RESUME, &hw->usb_flags);
@@ -1211,7 +1211,7 @@ int hfa384x_corereset(hfa384x_t *hw, int holdtime, int settletime, int genesis)
 
        result = usb_reset_device(hw->usb);
        if (result < 0) {
-               printk(KERN_ERR "usb_reset_device() failed, result=%d.\n",
+               netdev_err(hw->wlandev->netdev, "usb_reset_device() failed, result=%d.\n",
                       result);
        }
 
@@ -1311,7 +1311,7 @@ cleanup:
                if (ctlx->state == CTLX_COMPLETE) {
                        result = completor->complete(completor);
                } else {
-                       printk(KERN_WARNING "CTLX[%d] error: state(%s)\n",
+                       netdev_warn(hw->wlandev->netdev, "CTLX[%d] error: state(%s)\n",
                               le16_to_cpu(ctlx->outbuf.type),
                               ctlxstr(ctlx->state));
                        result = -EIO;
@@ -2018,7 +2018,7 @@ int hfa384x_drvr_flashdl_write(hfa384x_t *hw, u32 daddr, void *buf, u32 len)
        if (hw->dlstate != HFA384x_DLSTATE_FLASHENABLED)
                return -EINVAL;
 
-       printk(KERN_INFO "Download %d bytes to flash @0x%06x\n", len, daddr);
+       netdev_info(hw->wlandev->netdev, "Download %d bytes to flash @0x%06x\n", len, daddr);
 
        /* Convert to flat address for arithmetic */
        /* NOTE: dlbuffer RID stores the address in AUX format */
@@ -2028,7 +2028,7 @@ int hfa384x_drvr_flashdl_write(hfa384x_t *hw, u32 daddr, void *buf, u32 len)
                 hw->bufinfo.page, hw->bufinfo.offset, dlbufaddr);
 
 #if 0
-       printk(KERN_WARNING "dlbuf@0x%06lx len=%d to=%d\n", dlbufaddr,
+       netdev_warn(hw->wlandev->netdev, "dlbuf@0x%06lx len=%d to=%d\n", dlbufaddr,
               hw->bufinfo.len, hw->dltimeout);
 #endif
        /* Calculations to determine how many fills of the dlbuffer to do
@@ -2055,14 +2055,14 @@ int hfa384x_drvr_flashdl_write(hfa384x_t *hw, u32 daddr, void *buf, u32 len)
                burnlo = HFA384x_ADDR_CMD_MKOFF(burndaddr);
                burnhi = HFA384x_ADDR_CMD_MKPAGE(burndaddr);
 
-               printk(KERN_INFO "Writing %d bytes to flash @0x%06x\n",
+               netdev_info(hw->wlandev->netdev, "Writing %d bytes to flash @0x%06x\n",
                       burnlen, burndaddr);
 
                /* Set the download mode */
                result = hfa384x_cmd_download(hw, HFA384x_PROGMODE_NV,
                                              burnlo, burnhi, burnlen);
                if (result) {
-                       printk(KERN_ERR "download(NV,lo=%x,hi=%x,len=%x) "
+                       netdev_err(hw->wlandev->netdev, "download(NV,lo=%x,hi=%x,len=%x) "
                               "cmd failed, result=%d. Aborting d/l\n",
                               burnlo, burnhi, burnlen, result);
                        goto exit_proc;
@@ -2094,7 +2094,7 @@ int hfa384x_drvr_flashdl_write(hfa384x_t *hw, u32 daddr, void *buf, u32 len)
                                              HFA384x_PROGMODE_NVWRITE,
                                              0, 0, 0);
                if (result) {
-                       printk(KERN_ERR
+                       netdev_err(hw->wlandev->netdev,
                               "download(NVWRITE,lo=%x,hi=%x,len=%x) "
                               "cmd failed, result=%d. Aborting d/l\n",
                               burnlo, burnhi, burnlen, result);
@@ -2279,7 +2279,7 @@ int hfa384x_drvr_ramdl_enable(hfa384x_t *hw, u32 exeaddr)
        /* Check that a port isn't active */
        for (i = 0; i < HFA384x_PORTID_MAX; i++) {
                if (hw->port_enabled[i]) {
-                       printk(KERN_ERR
+                       netdev_err(hw->wlandev->netdev,
                               "Can't download with a macport enabled.\n");
                        return -EINVAL;
                }
@@ -2287,7 +2287,7 @@ int hfa384x_drvr_ramdl_enable(hfa384x_t *hw, u32 exeaddr)
 
        /* Check that we're not already in a download state */
        if (hw->dlstate != HFA384x_DLSTATE_DISABLED) {
-               printk(KERN_ERR "Download state not disabled.\n");
+               netdev_err(hw->wlandev->netdev, "Download state not disabled.\n");
                return -EINVAL;
        }
 
@@ -2352,7 +2352,7 @@ int hfa384x_drvr_ramdl_write(hfa384x_t *hw, u32 daddr, void *buf, u32 len)
        if (hw->dlstate != HFA384x_DLSTATE_RAMENABLED)
                return -EINVAL;
 
-       printk(KERN_INFO "Writing %d bytes to ram @0x%06x\n", len, daddr);
+       netdev_info(hw->wlandev->netdev, "Writing %d bytes to ram @0x%06x\n", len, daddr);
 
        /* How many dowmem calls?  */
        nwrites = len / HFA384x_USB_RWMEM_MAXLEN;
@@ -2449,7 +2449,7 @@ int hfa384x_drvr_readpda(hfa384x_t *hw, void *buf, unsigned int len)
                                                len);
 
                if (result) {
-                       printk(KERN_WARNING
+                       netdev_warn(hw->wlandev->netdev,
                               "Read from index %zd failed, continuing\n", i);
                        continue;
                }
@@ -2462,13 +2462,13 @@ int hfa384x_drvr_readpda(hfa384x_t *hw, void *buf, unsigned int len)
                        pdrcode = le16_to_cpu(pda[currpdr + 1]);
                        /* Test the record length */
                        if (pdrlen > HFA384x_PDR_LEN_MAX || pdrlen == 0) {
-                               printk(KERN_ERR "pdrlen invalid=%d\n", pdrlen);
+                               netdev_err(hw->wlandev->netdev, "pdrlen invalid=%d\n", pdrlen);
                                pdaok = 0;
                                break;
                        }
                        /* Test the code */
                        if (!hfa384x_isgood_pdrcode(pdrcode)) {
-                               printk(KERN_ERR "pdrcode invalid=%d\n",
+                               netdev_err(hw->wlandev->netdev, "pdrcode invalid=%d\n",
                                       pdrcode);
                                pdaok = 0;
                                break;
@@ -2484,7 +2484,7 @@ int hfa384x_drvr_readpda(hfa384x_t *hw, void *buf, unsigned int len)
                        }
                }
                if (pdaok) {
-                       printk(KERN_INFO
+                       netdev_info(hw->wlandev->netdev,
                               "PDA Read from 0x%08x in %s space.\n",
                               pdaloc[i].cardaddr,
                               pdaloc[i].auxctl == 0 ? "EXTDS" :
@@ -2564,20 +2564,20 @@ int hfa384x_drvr_start(hfa384x_t *hw)
        result =
            usb_get_status(hw->usb, USB_RECIP_ENDPOINT, hw->endp_in, &status);
        if (result < 0) {
-               printk(KERN_ERR "Cannot get bulk in endpoint status.\n");
+               netdev_err(hw->wlandev->netdev, "Cannot get bulk in endpoint status.\n");
                goto done;
        }
        if ((status == 1) && usb_clear_halt(hw->usb, hw->endp_in))
-               printk(KERN_ERR "Failed to reset bulk in endpoint.\n");
+               netdev_err(hw->wlandev->netdev, "Failed to reset bulk in endpoint.\n");
 
        result =
            usb_get_status(hw->usb, USB_RECIP_ENDPOINT, hw->endp_out, &status);
        if (result < 0) {
-               printk(KERN_ERR "Cannot get bulk out endpoint status.\n");
+               netdev_err(hw->wlandev->netdev, "Cannot get bulk out endpoint status.\n");
                goto done;
        }
        if ((status == 1) && usb_clear_halt(hw->usb, hw->endp_out))
-               printk(KERN_ERR "Failed to reset bulk out endpoint.\n");
+               netdev_err(hw->wlandev->netdev, "Failed to reset bulk out endpoint.\n");
 
        /* Synchronous unlink, in case we're trying to restart the driver */
        usb_kill_urb(&hw->rx_urb);
@@ -2585,7 +2585,7 @@ int hfa384x_drvr_start(hfa384x_t *hw)
        /* Post the IN urb */
        result = submit_rx_urb(hw, GFP_KERNEL);
        if (result != 0) {
-               printk(KERN_ERR
+               netdev_err(hw->wlandev->netdev,
                       "Fatal, failed to submit RX URB, result=%d\n", result);
                goto done;
        }
@@ -2605,7 +2605,7 @@ int hfa384x_drvr_start(hfa384x_t *hw)
        result = result2 = hfa384x_cmd_initialize(hw);
        if (result1 != 0) {
                if (result2 != 0) {
-                       printk(KERN_ERR
+                       netdev_err(hw->wlandev->netdev,
                                "cmd_initialize() failed on two attempts, results %d and %d\n",
                                result1, result2);
                        usb_kill_urb(&hw->rx_urb);
@@ -2616,9 +2616,9 @@ int hfa384x_drvr_start(hfa384x_t *hw)
                        pr_debug("but second attempt succeeded. All should be ok\n");
                }
        } else if (result2 != 0) {
-               printk(KERN_WARNING "First cmd_initialize() succeeded, but second attempt failed (result=%d)\n",
+               netdev_warn(hw->wlandev->netdev, "First cmd_initialize() succeeded, but second attempt failed (result=%d)\n",
                        result2);
-               printk(KERN_WARNING
+               netdev_warn(hw->wlandev->netdev,
                       "Most likely the card will be functional\n");
                goto done;
        }
@@ -2709,7 +2709,7 @@ int hfa384x_drvr_txframe(hfa384x_t *hw, struct sk_buff *skb,
        char *ptr;
 
        if (hw->tx_urb.status == -EINPROGRESS) {
-               printk(KERN_WARNING "TX URB already in use\n");
+               netdev_warn(hw->wlandev->netdev, "TX URB already in use\n");
                result = 3;
                goto exit;
        }
@@ -2784,7 +2784,7 @@ int hfa384x_drvr_txframe(hfa384x_t *hw, struct sk_buff *skb,
        result = 1;
        ret = submit_tx_urb(hw, &hw->tx_urb, GFP_ATOMIC);
        if (ret != 0) {
-               printk(KERN_ERR "submit_tx_urb() failed, error=%d\n", ret);
+               netdev_err(hw->wlandev->netdev, "submit_tx_urb() failed, error=%d\n", ret);
                result = 3;
        }
 
@@ -3009,7 +3009,7 @@ static void unlocked_usbctlx_complete(hfa384x_t *hw, hfa384x_usbctlx_t *ctlx)
                break;
 
        default:
-               printk(KERN_ERR "CTLX[%d] not in a terminating state(%s)\n",
+               netdev_err(hw->wlandev->netdev, "CTLX[%d] not in a terminating state(%s)\n",
                       le16_to_cpu(ctlx->outbuf.type), ctlxstr(ctlx->state));
                break;
        }                       /* switch */
@@ -3091,7 +3091,7 @@ static void hfa384x_usbctlxq_run(hfa384x_t *hw)
                         * this CTLX back in the "pending" queue
                         * and schedule a reset ...
                         */
-                       printk(KERN_WARNING
+                       netdev_warn(hw->wlandev->netdev,
                               "%s tx pipe stalled: requesting reset\n",
                               hw->wlandev->netdev->name);
                        list_move(&head->list, &hw->ctlxq.pending);
@@ -3101,12 +3101,12 @@ static void hfa384x_usbctlxq_run(hfa384x_t *hw)
                }
 
                if (result == -ESHUTDOWN) {
-                       printk(KERN_WARNING "%s urb shutdown!\n",
+                       netdev_warn(hw->wlandev->netdev, "%s urb shutdown!\n",
                               hw->wlandev->netdev->name);
                        break;
                }
 
-               printk(KERN_ERR "Failed to submit CTLX[%d]: error=%d\n",
+               netdev_err(hw->wlandev->netdev, "Failed to submit CTLX[%d]: error=%d\n",
                       le16_to_cpu(head->outbuf.type), result);
                unlocked_usbctlx_complete(hw, head);
        }                       /* while */
@@ -3173,7 +3173,7 @@ static void hfa384x_usbin_callback(struct urb *urb)
                break;
 
        case -EPIPE:
-               printk(KERN_WARNING "%s rx pipe stalled: requesting reset\n",
+               netdev_warn(hw->wlandev->netdev, "%s rx pipe stalled: requesting reset\n",
                       wlandev->netdev->name);
                if (!test_and_set_bit(WORK_RX_HALT, &hw->usb_flags))
                        schedule_work(&hw->usb_work);
@@ -3224,7 +3224,7 @@ static void hfa384x_usbin_callback(struct urb *urb)
                result = submit_rx_urb(hw, GFP_ATOMIC);
 
                if (result != 0) {
-                       printk(KERN_ERR
+                       netdev_err(hw->wlandev->netdev,
                               "Fatal, failed to resubmit rx_urb. error=%d\n",
                               result);
                }
@@ -3360,7 +3360,7 @@ retry:
                 * Check that our message is what we're expecting ...
                 */
                if (ctlx->outbuf.type != intype) {
-                       printk(KERN_WARNING
+                       netdev_warn(hw->wlandev->netdev,
                               "Expected IN[%d], received IN[%d] - ignored.\n",
                               le16_to_cpu(ctlx->outbuf.type),
                               le16_to_cpu(intype));
@@ -3396,7 +3396,7 @@ retry:
                        /*
                         * Throw this CTLX away ...
                         */
-                       printk(KERN_ERR
+                       netdev_err(hw->wlandev->netdev,
                               "Matched IN URB, CTLX[%d] in invalid state(%s)."
                               " Discarded.\n",
                               le16_to_cpu(ctlx->outbuf.type),
@@ -3534,7 +3534,7 @@ static void hfa384x_usbin_rx(wlandevice_t *wlandev, struct sk_buff *skb)
                break;
 
        default:
-               printk(KERN_WARNING "Received frame on unsupported port=%d\n",
+               netdev_warn(hw->wlandev->netdev, "Received frame on unsupported port=%d\n",
                       HFA384x_RXSTATUS_MACPORT_GET(usbin->rxfrm.desc.status));
                goto done;
                break;
@@ -3596,7 +3596,7 @@ static void hfa384x_int_rxmonitor(wlandevice_t *wlandev,
 
        skb = dev_alloc_skb(skblen);
        if (skb == NULL) {
-               printk(KERN_ERR
+               netdev_err(hw->wlandev->netdev,
                       "alloc_skb failed trying to allocate %d bytes\n",
                       skblen);
                return;
@@ -3714,7 +3714,7 @@ static void hfa384x_usbout_callback(struct urb *urb)
                case -EPIPE:
                        {
                                hfa384x_t *hw = wlandev->priv;
-                               printk(KERN_WARNING
+                               netdev_warn(hw->wlandev->netdev,
                                       "%s tx pipe stalled: requesting reset\n",
                                       wlandev->netdev->name);
                                if (!test_and_set_bit
@@ -3747,7 +3747,7 @@ static void hfa384x_usbout_callback(struct urb *urb)
                        break;
 
                default:
-                       printk(KERN_INFO "unknown urb->status=%d\n",
+                       netdev_info(wlandev->netdev, "unknown urb->status=%d\n",
                               urb->status);
                        ++(wlandev->linux_stats.tx_errors);
                        break;
@@ -3841,7 +3841,7 @@ retry:
 
                default:
                        /* This is NOT a valid CTLX "success" state! */
-                       printk(KERN_ERR
+                       netdev_err(hw->wlandev->netdev,
                                "Illegal CTLX[%d] success state(%s, %d) in OUT URB\n",
                                le16_to_cpu(ctlx->outbuf.type),
                                ctlxstr(ctlx->state), urb->status);
@@ -3851,7 +3851,7 @@ retry:
                /* If the pipe has stalled then we need to reset it */
                if ((urb->status == -EPIPE) &&
                    !test_and_set_bit(WORK_TX_HALT, &hw->usb_flags)) {
-                       printk(KERN_WARNING
+                       netdev_warn(hw->wlandev->netdev,
                               "%s tx pipe stalled: requesting reset\n",
                               hw->wlandev->netdev->name);
                        schedule_work(&hw->usb_work);
index 2bac0eb8948df6c541d738823aaeb37153b018e0..a1124bdc4cacce88872010e2873565b5889487be 100644 (file)
@@ -36,7 +36,7 @@ struct iio_buffer;
  * any of them not existing.
  **/
 struct iio_buffer_access_funcs {
-       int (*store_to)(struct iio_buffer *buffer, u8 *data);
+       int (*store_to)(struct iio_buffer *buffer, const void *data);
        int (*read_first_n)(struct iio_buffer *buffer,
                            size_t n,
                            char __user *buf);
@@ -81,7 +81,7 @@ struct iio_buffer {
        bool                                    stufftoread;
        const struct attribute_group *attrs;
        struct list_head                        demux_list;
-       unsigned char                           *demux_bounce;
+       void                                    *demux_bounce;
        struct list_head                        buffer_list;
 };
 
@@ -120,7 +120,32 @@ int iio_scan_mask_set(struct iio_dev *indio_dev,
  * @indio_dev:         iio_dev structure for device.
  * @data:              Full scan.
  */
-int iio_push_to_buffers(struct iio_dev *indio_dev, unsigned char *data);
+int iio_push_to_buffers(struct iio_dev *indio_dev, const void *data);
+
+/*
+ * iio_push_to_buffers_with_timestamp() - push data and timestamp to buffers
+ * @indio_dev:         iio_dev structure for device.
+ * @data:              sample data
+ * @timestamp:         timestamp for the sample data
+ *
+ * Pushes data to the IIO device's buffers. If timestamps are enabled for the
+ * device the function will store the supplied timestamp as the last element in
+ * the sample data buffer before pushing it to the device buffers. The sample
+ * data buffer needs to be large enough to hold the additional timestamp
+ * (usually the buffer should be indio->scan_bytes bytes large).
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+static inline int iio_push_to_buffers_with_timestamp(struct iio_dev *indio_dev,
+       void *data, int64_t timestamp)
+{
+       if (indio_dev->scan_timestamp) {
+               size_t ts_offset = indio_dev->scan_bytes / sizeof(int64_t) - 1;
+               ((int64_t *)data)[ts_offset] = timestamp;
+       }
+
+       return iio_push_to_buffers(indio_dev, data);
+}
 
 int iio_update_demux(struct iio_dev *indio_dev);
 
index e51f65480ea5a895828433444e0d3ec6348ca785..e732fda6c8e6443ca5e373fe24b3daef51bfed9f 100644 (file)
@@ -184,6 +184,7 @@ struct st_sensors {
        u8 wai;
        char sensors_supported[ST_SENSORS_MAX_4WAI][ST_SENSORS_MAX_NAME];
        struct iio_chan_spec *ch;
+       int num_ch;
        struct st_sensor_odr odr;
        struct st_sensor_power pw;
        struct st_sensor_axis enable_axis;
index 833926c91aa84dff36403b814a046267dd968557..2752b1fd12be3ea8b41c58f64b408d88f1afddaa 100644 (file)
@@ -77,7 +77,7 @@ struct iio_cb_buffer;
  * fail.
  */
 struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev,
-                                            int (*cb)(u8 *data,
+                                            int (*cb)(const void *data,
                                                       void *private),
                                             void *private);
 /**
index 2103cc32a5fb9b7d701d428e2f49ac636bbc6376..ac1cb8f1858c1f48bea30be9b51da3d577f2b01b 100644 (file)
@@ -36,6 +36,14 @@ enum iio_chan_info_enum {
        IIO_CHAN_INFO_PHASE,
        IIO_CHAN_INFO_HARDWAREGAIN,
        IIO_CHAN_INFO_HYSTERESIS,
+       IIO_CHAN_INFO_INT_TIME,
+};
+
+enum iio_shared_by {
+       IIO_SEPARATE,
+       IIO_SHARED_BY_TYPE,
+       IIO_SHARED_BY_DIR,
+       IIO_SHARED_BY_ALL
 };
 
 enum iio_endian {
@@ -57,7 +65,7 @@ struct iio_dev;
  */
 struct iio_chan_spec_ext_info {
        const char *name;
-       bool shared;
+       enum iio_shared_by shared;
        ssize_t (*read)(struct iio_dev *, uintptr_t private,
                        struct iio_chan_spec const *, char *buf);
        ssize_t (*write)(struct iio_dev *, uintptr_t private,
@@ -125,7 +133,7 @@ ssize_t iio_enum_write(struct iio_dev *indio_dev,
 #define IIO_ENUM_AVAILABLE(_name, _e) \
 { \
        .name = (_name "_available"), \
-       .shared = true, \
+       .shared = IIO_SHARED_BY_TYPE, \
        .read = iio_enum_available_read, \
        .private = (uintptr_t)(_e), \
 }
@@ -146,12 +154,14 @@ ssize_t iio_enum_write(struct iio_dev *indio_dev,
  *                     shift:          Shift right by this before masking out
  *                                     realbits.
  *                     endianness:     little or big endian
- * @info_mask:         What information is to be exported about this channel.
- *                     This includes calibbias, scale etc.
  * @info_mask_separate: What information is to be exported that is specific to
  *                     this channel.
  * @info_mask_shared_by_type: What information is to be exported that is shared
-*                      by all channels of the same type.
+ *                     by all channels of the same type.
+ * @info_mask_shared_by_dir: What information is to be exported that is shared
+ *                     by all channels of the same direction.
+ * @info_mask_shared_by_all: What information is to be exported that is shared
+ *                     by all channels.
  * @event_mask:                What events can this channel produce.
  * @ext_info:          Array of extended info attributes for this channel.
  *                     The array is NULL terminated, the last element should
@@ -186,9 +196,10 @@ struct iio_chan_spec {
                u8      shift;
                enum iio_endian endianness;
        } scan_type;
-       long                    info_mask;
        long                    info_mask_separate;
        long                    info_mask_shared_by_type;
+       long                    info_mask_shared_by_dir;
+       long                    info_mask_shared_by_all;
        long                    event_mask;
        const struct iio_chan_spec_ext_info *ext_info;
        const char              *extend_name;
@@ -212,7 +223,9 @@ static inline bool iio_channel_has_info(const struct iio_chan_spec *chan,
        enum iio_chan_info_enum type)
 {
        return (chan->info_mask_separate & BIT(type)) |
-              (chan->info_mask_shared_by_type & BIT(type));
+               (chan->info_mask_shared_by_type & BIT(type)) |
+               (chan->info_mask_shared_by_dir & BIT(type)) |
+               (chan->info_mask_shared_by_all & BIT(type));
 }
 
 #define IIO_ST(si, rb, sb, sh)                                         \
@@ -457,7 +470,7 @@ static inline void iio_device_put(struct iio_dev *indio_dev)
 {
        if (indio_dev)
                put_device(&indio_dev->dev);
-};
+}
 
 /**
  * dev_to_iio_dev() - Get IIO device struct from a device struct
@@ -593,7 +606,7 @@ static inline bool iio_buffer_enabled(struct iio_dev *indio_dev)
 {
        return indio_dev->currentmode
                & (INDIO_BUFFER_TRIGGERED | INDIO_BUFFER_HARDWARE);
-};
+}
 
 /**
  * iio_get_debugfs_dentry() - helper function to get the debugfs_dentry
@@ -603,12 +616,12 @@ static inline bool iio_buffer_enabled(struct iio_dev *indio_dev)
 static inline struct dentry *iio_get_debugfs_dentry(struct iio_dev *indio_dev)
 {
        return indio_dev->debugfs_dentry;
-};
+}
 #else
 static inline struct dentry *iio_get_debugfs_dentry(struct iio_dev *indio_dev)
 {
        return NULL;
-};
+}
 #endif
 
 int iio_str_to_fixpoint(const char *str, int fract_mult, int *integer,
index 2958c960003a7ed3bcb22baf8ca02266f3736c7d..8a1d18640ab94dd7d29ddec3473f3c5c0e9ef112 100644 (file)
@@ -100,6 +100,21 @@ struct iio_const_attr {
 #define IIO_CONST_ATTR_SAMP_FREQ_AVAIL(_string)                        \
        IIO_CONST_ATTR(sampling_frequency_available, _string)
 
+/**
+ * IIO_DEV_ATTR_INT_TIME_AVAIL - list available integration times
+ * @_show: output method for the attribute
+ **/
+#define IIO_DEV_ATTR_INT_TIME_AVAIL(_show)             \
+       IIO_DEVICE_ATTR(integration_time_available, S_IRUGO, _show, NULL, 0)
+/**
+ * IIO_CONST_ATTR_INT_TIME_AVAIL - list available integration times
+ * @_string: frequency string for the attribute
+ *
+ * Constant version
+ **/
+#define IIO_CONST_ATTR_INT_TIME_AVAIL(_string)         \
+       IIO_CONST_ATTR(integration_time_available, _string)
+
 #define IIO_DEV_ATTR_TEMP_RAW(_show)                   \
        IIO_DEVICE_ATTR(in_temp_raw, S_IRUGO, _show, NULL, 0)
 
index 25f2c611ab013db8e3a4135a00c129b3d556e7d5..08cce7f96ab9365359c30a4726d910022f571be5 100644 (file)
 /* Step Enable */
 #define STEPENB_MASK           (0x1FFFF << 0)
 #define STEPENB(val)           ((val) << 0)
+#define ENB(val)                       (1 << (val))
+#define STPENB_STEPENB         STEPENB(0x1FFFF)
+#define STPENB_STEPENB_TC      STEPENB(0x1FFF)
 
 /* IRQ enable */
 #define IRQENB_HW_PEN          BIT(0)
 #define IRQENB_FIFO0THRES      BIT(2)
+#define IRQENB_FIFO0OVRRUN     BIT(3)
+#define IRQENB_FIFO0UNDRFLW    BIT(4)
 #define IRQENB_FIFO1THRES      BIT(5)
+#define IRQENB_FIFO1OVRRUN     BIT(6)
+#define IRQENB_FIFO1UNDRFLW    BIT(7)
 #define IRQENB_PENUP           BIT(9)
 
 /* Step Configuration */
 #define STEPCONFIG_MODE_MASK   (3 << 0)
 #define STEPCONFIG_MODE(val)   ((val) << 0)
+#define STEPCONFIG_MODE_SWCNT  STEPCONFIG_MODE(1)
 #define STEPCONFIG_MODE_HWSYNC STEPCONFIG_MODE(2)
 #define STEPCONFIG_AVG_MASK    (7 << 2)
 #define STEPCONFIG_AVG(val)    ((val) << 2)
 #define ADC_CLK                        3000000
 #define TOTAL_STEPS            16
 #define TOTAL_CHANNELS         8
+#define FIFO1_THRESHOLD                19
 
 /*
 * ADC runs at 3MHz, and it takes