]> Git Repo - linux.git/commitdiff
Merge tag 'spi-v4.4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
authorLinus Torvalds <[email protected]>
Thu, 5 Nov 2015 21:15:12 +0000 (13:15 -0800)
committerLinus Torvalds <[email protected]>
Thu, 5 Nov 2015 21:15:12 +0000 (13:15 -0800)
Pull spi updates from Mark Brown:
 "Quite a lot of activity in SPI this cycle, almost all of it in drivers
  with a few minor improvements and tweaks in the core.

   - Updates to pxa2xx to support Intel Broxton and multiple chip selects.
   - Support for big endian in the bcm63xx driver.
   - Multiple slave support for the mt8173
   - New driver for the auxiliary SPI controller in bcm2835 SoCs.
   - Support for Layerscale SoCs in the Freescale DSPI driver"

* tag 'spi-v4.4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: (87 commits)
  spi: pxa2xx: Rework self-initiated platform data creation for non-ACPI
  spi: pxa2xx: Add support for Intel Broxton
  spi: pxa2xx: Detect number of enabled Intel LPSS SPI chip select signals
  spi: pxa2xx: Add output control for multiple Intel LPSS chip selects
  spi: pxa2xx: Use LPSS prefix for defines that are Intel LPSS specific
  spi: Add DSPI support for layerscape family
  spi: ti-qspi: improve ->remove() callback
  spi/spi-xilinx: Fix race condition on last word read
  spi: Drop owner assignment from spi_drivers
  spi: Add THIS_MODULE to spi_driver in SPI core
  spi: Setup the master controller driver before setting the chipselect
  spi: dw: replace magic constant by DW_SPI_DR
  spi: mediatek: mt8173 spi multiple devices support
  spi: mediatek: handle controller_data in mtk_spi_setup
  spi: mediatek: remove mtk_spi_config
  spi: mediatek: Update document devicetree bindings to support multiple devices
  spi: fix kernel-doc warnings about missing return desc in spi.c
  spi: fix kernel-doc warnings about missing return desc in spi.h
  spi: pxa2xx: Align a few defines
  spi: pxa2xx: Save other reg_cs_ctrl bits when configuring chip select
  ...

35 files changed:
1  2 
drivers/iio/adc/max1027.c
drivers/iio/adc/mcp320x.c
drivers/iio/adc/ti-adc128s052.c
drivers/iio/amplifiers/ad8366.c
drivers/iio/dac/ad5504.c
drivers/iio/dac/ad7303.c
drivers/iio/frequency/adf4350.c
drivers/iio/proximity/as3935.c
drivers/media/i2c/s5c73m3/s5c73m3-spi.c
drivers/mmc/host/mmc_spi.c
drivers/net/ieee802154/at86rf230.c
drivers/net/ieee802154/mrf24j40.c
drivers/nfc/st-nci/spi.c
drivers/nfc/trf7970a.c
drivers/staging/fbtft/fbtft.h
drivers/staging/fbtft/flexfb.c
drivers/staging/iio/accel/lis3l02dq_core.c
drivers/staging/iio/accel/sca3000_core.c
drivers/staging/iio/adc/ad7192.c
drivers/staging/iio/adc/ad7280a.c
drivers/staging/iio/adc/ad7606_spi.c
drivers/staging/iio/adc/ad7780.c
drivers/staging/iio/adc/ad7816.c
drivers/staging/iio/frequency/ad9834.c
drivers/staging/iio/gyro/adis16060_core.c
drivers/staging/iio/magnetometer/hmc5843_spi.c
drivers/staging/iio/meter/ade7753.c
drivers/staging/iio/meter/ade7754.c
drivers/staging/iio/meter/ade7758_core.c
drivers/staging/iio/meter/ade7759.c
drivers/staging/iio/meter/ade7854-spi.c
drivers/staging/iio/resolver/ad2s1210.c
drivers/staging/iio/resolver/ad2s90.c
drivers/staging/mt29f_spinand/mt29f_spinand.c
drivers/tty/serial/sc16is7xx.c

index 54a8302aaacec518c46fb8d603b4da62e28d505d,3bc059c698241a46908c9b5047082f0262cdae26..41d495c6035e1a882e03b17ca8066224e767cde6
@@@ -508,8 -508,6 +508,7 @@@ static int max1027_remove(struct spi_de
  static struct spi_driver max1027_driver = {
        .driver = {
                .name   = "max1027",
-               .owner  = THIS_MODULE,
 +              .of_match_table = of_match_ptr(max1027_adc_dt_ids),
        },
        .probe          = max1027_probe,
        .remove         = max1027_remove,
index 41a21e986c1a326593a4864d53f2d33882342a98,d5d8b4180914d873a673072c5c377e68cd2e603e..8569c8e1f4b276db3e968356626c67fab9b60c16
@@@ -404,8 -404,6 +404,7 @@@ MODULE_DEVICE_TABLE(spi, mcp320x_id)
  static struct spi_driver mcp320x_driver = {
        .driver = {
                .name = "mcp320x",
-               .owner = THIS_MODULE,
 +              .of_match_table = of_match_ptr(mcp320x_dt_ids),
        },
        .probe = mcp320x_probe,
        .remove = mcp320x_remove,
index 98c0d2b444bff46048fac8c03979661f7a922a95,76b619649409a43329719e17668b851b427e3c84..ff6f7f63c8d9b8c2c7e758ce932912663b7fbc3f
@@@ -174,13 -174,6 +174,13 @@@ static int adc128_remove(struct spi_dev
        return 0;
  }
  
 +static const struct of_device_id adc128_of_match[] = {
 +      { .compatible = "ti,adc128s052", },
 +      { .compatible = "ti,adc122s021", },
 +      { /* sentinel */ },
 +};
 +MODULE_DEVICE_TABLE(of, adc128_of_match);
 +
  static const struct spi_device_id adc128_id[] = {
        { "adc128s052", 0},     /* index into adc128_config */
        { "adc122s021", 1},
@@@ -191,8 -184,6 +191,7 @@@ MODULE_DEVICE_TABLE(spi, adc128_id)
  static struct spi_driver adc128_driver = {
        .driver = {
                .name = "adc128s052",
-               .owner = THIS_MODULE,
 +              .of_match_table = of_match_ptr(adc128_of_match),
        },
        .probe = adc128_probe,
        .remove = adc128_remove,
index 32b82a2dc8942126ff1214e83f609e07544037d9,6da31e4dbdd4833332a6888115eb29f458c4c3de..102c7174da5bf2485cc0fb7343cea2e390c1c8f3
@@@ -195,12 -195,10 +195,11 @@@ static const struct spi_device_id ad836
        {"ad8366", 0},
        {}
  };
 +MODULE_DEVICE_TABLE(spi, ad8366_id);
  
  static struct spi_driver ad8366_driver = {
        .driver = {
                .name   = KBUILD_MODNAME,
-               .owner  = THIS_MODULE,
        },
        .probe          = ad8366_probe,
        .remove         = ad8366_remove,
diff --combined drivers/iio/dac/ad5504.c
index e6e9756580af3e048c510fe92b490e4d65b654a6,88b2c92e243bccdb1cb20e0d038853500f8b3fd0..4e4c20d6d8b57a763bb043eaf47af0d76709204c
@@@ -214,6 -214,7 +214,6 @@@ static struct attribute *ad5504_ev_attr
  
  static struct attribute_group ad5504_ev_attribute_group = {
        .attrs = ad5504_ev_attributes,
 -      .name = "events",
  };
  
  static irqreturn_t ad5504_event_handler(int irq, void *private)
@@@ -363,7 -364,6 +363,6 @@@ MODULE_DEVICE_TABLE(spi, ad5504_id)
  static struct spi_driver ad5504_driver = {
        .driver = {
                   .name = "ad5504",
-                  .owner = THIS_MODULE,
                   },
        .probe = ad5504_probe,
        .remove = ad5504_remove,
diff --combined drivers/iio/dac/ad7303.c
index 18a4ad5ff8c50ccfb87bd4a31ce2ec6ca6dbe79d,399de2cfeb16b52c75180c88f8435e4102a53be5..e690dd11e99f64fa1270da8132010f34d94d7241
@@@ -281,12 -281,6 +281,12 @@@ static int ad7303_remove(struct spi_dev
        return 0;
  }
  
 +static const struct of_device_id ad7303_spi_of_match[] = {
 +      { .compatible = "adi,ad7303", },
 +      { /* sentinel */ },
 +};
 +MODULE_DEVICE_TABLE(of, ad7303_spi_of_match);
 +
  static const struct spi_device_id ad7303_spi_ids[] = {
        { "ad7303", 0 },
        {}
@@@ -296,8 -290,6 +296,7 @@@ MODULE_DEVICE_TABLE(spi, ad7303_spi_ids
  static struct spi_driver ad7303_driver = {
        .driver = {
                .name = "ad7303",
-               .owner = THIS_MODULE,
 +              .of_match_table = of_match_ptr(ad7303_spi_of_match),
        },
        .probe = ad7303_probe,
        .remove = ad7303_remove,
index 73f27e0a08dd3e1313a1160004aae56c1da246af,b83534cc2ab14bde5fb25819e9a6d854275f2895..d2d824b446f5242c09fe8bb9ac276ab8f2fe746f
@@@ -616,25 -616,15 +616,24 @@@ static int adf4350_remove(struct spi_de
        return 0;
  }
  
 +static const struct of_device_id adf4350_of_match[] = {
 +      { .compatible = "adi,adf4350", },
 +      { .compatible = "adi,adf4351", },
 +      { /* sentinel */ },
 +};
 +MODULE_DEVICE_TABLE(of, adf4350_of_match);
 +
  static const struct spi_device_id adf4350_id[] = {
        {"adf4350", 4350},
        {"adf4351", 4351},
        {}
  };
 +MODULE_DEVICE_TABLE(spi, adf4350_id);
  
  static struct spi_driver adf4350_driver = {
        .driver = {
                .name   = "adf4350",
-               .owner  = THIS_MODULE,
 +              .of_match_table = of_match_ptr(adf4350_of_match),
        },
        .probe          = adf4350_probe,
        .remove         = adf4350_remove,
index e95035136889342a88f398d33738fe67055e8c1b,2865aa63f4f1de9cf4900700663bbbf617c49e2c..f4d29d5dbd5f88d6e5edffef142e86db30076d44
@@@ -434,12 -434,6 +434,12 @@@ static int as3935_remove(struct spi_dev
        return 0;
  }
  
 +static const struct of_device_id as3935_of_match[] = {
 +      { .compatible = "ams,as3935", },
 +      { /* sentinel */ },
 +};
 +MODULE_DEVICE_TABLE(of, as3935_of_match);
 +
  static const struct spi_device_id as3935_id[] = {
        {"as3935", 0},
        {},
@@@ -449,8 -443,6 +449,7 @@@ MODULE_DEVICE_TABLE(spi, as3935_id)
  static struct spi_driver as3935_driver = {
        .driver = {
                .name   = "as3935",
-               .owner  = THIS_MODULE,
 +              .of_match_table = of_match_ptr(as3935_of_match),
                .pm     = AS3935_PM_OPS,
        },
        .probe          = as3935_probe,
index 17ac4417fb176a50518ac57e9c09e7b1c415486f,d744b170c9ed64c7b18ce6e12db2a7b880a911fa..72ef9f936e6ceb13ad7b94e5c998ffa9543700e8
@@@ -31,7 -31,6 +31,7 @@@ static const struct of_device_id s5c73m
        { .compatible = "samsung,s5c73m3" },
        { }
  };
 +MODULE_DEVICE_TABLE(of, s5c73m3_spi_ids);
  
  enum spi_direction {
        SPI_DIR_RX,
@@@ -150,7 -149,6 +150,6 @@@ int s5c73m3_register_spi_driver(struct 
        spidrv->remove = s5c73m3_spi_remove;
        spidrv->probe = s5c73m3_spi_probe;
        spidrv->driver.name = S5C73M3_SPI_DRV_NAME;
-       spidrv->driver.owner = THIS_MODULE;
        spidrv->driver.of_match_table = s5c73m3_spi_ids;
  
        return spi_register_driver(spidrv);
index 8ee11f4120fcae295756118c492b9cdef150eadf,8c79831b20fbcda44891f3cc7d1f3a5f6017dc54..1c1b45ef3faf847d4087d61904ed18c1a6f7ce5e
@@@ -1511,12 -1511,10 +1511,11 @@@ static const struct of_device_id mmc_sp
        { .compatible = "mmc-spi-slot", },
        {},
  };
 +MODULE_DEVICE_TABLE(of, mmc_spi_of_match_table);
  
  static struct spi_driver mmc_spi_driver = {
        .driver = {
                .name =         "mmc_spi",
-               .owner =        THIS_MODULE,
                .of_match_table = mmc_spi_of_match_table,
        },
        .probe =        mmc_spi_probe,
index de6e4fa2d6aafd24cd53ce7b8a7eb5f272c3d804,46805ab0764f94cadac760a17f23e7ad170e16f5..0fbbba7a0cae38afe5fc6dfa122489c1a3271fdf
@@@ -31,7 -31,6 +31,7 @@@
  #include <linux/skbuff.h>
  #include <linux/of_gpio.h>
  #include <linux/ieee802154.h>
 +#include <linux/debugfs.h>
  
  #include <net/mac802154.h>
  #include <net/cfg802154.h>
@@@ -81,16 -80,7 +81,16 @@@ struct at86rf230_state_change 
        u8 from_state;
        u8 to_state;
  
 -      bool irq_enable;
 +      bool free;
 +};
 +
 +struct at86rf230_trac {
 +      u64 success;
 +      u64 success_data_pending;
 +      u64 success_wait_for_ack;
 +      u64 channel_access_failure;
 +      u64 no_ack;
 +      u64 invalid;
  };
  
  struct at86rf230_local {
        struct completion state_complete;
        struct at86rf230_state_change state;
  
 -      struct at86rf230_state_change irq;
 -
        unsigned long cal_timeout;
        bool is_tx;
        bool is_tx_from_off;
        u8 tx_retry;
        struct sk_buff *tx_skb;
        struct at86rf230_state_change tx;
 +
 +      struct at86rf230_trac trac;
  };
  
  #define AT86RF2XX_NUMREGS 0x3F
  static void
  at86rf230_async_state_change(struct at86rf230_local *lp,
                             struct at86rf230_state_change *ctx,
 -                           const u8 state, void (*complete)(void *context),
 -                           const bool irq_enable);
 +                           const u8 state, void (*complete)(void *context));
  
  static inline void
  at86rf230_sleep(struct at86rf230_local *lp)
@@@ -349,10 -340,8 +349,10 @@@ at86rf230_async_error_recover(void *con
        struct at86rf230_local *lp = ctx->lp;
  
        lp->is_tx = 0;
 -      at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON, NULL, false);
 +      at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON, NULL);
        ieee802154_wake_queue(lp->hw);
 +      if (ctx->free)
 +              kfree(ctx);
  }
  
  static inline void
@@@ -362,14 -351,15 +362,14 @@@ at86rf230_async_error(struct at86rf230_
        dev_err(&lp->spi->dev, "spi_async error %d\n", rc);
  
        at86rf230_async_state_change(lp, ctx, STATE_FORCE_TRX_OFF,
 -                                   at86rf230_async_error_recover, false);
 +                                   at86rf230_async_error_recover);
  }
  
  /* Generic function to get some register value in async mode */
  static void
 -at86rf230_async_read_reg(struct at86rf230_local *lp, const u8 reg,
 +at86rf230_async_read_reg(struct at86rf230_local *lp, u8 reg,
                         struct at86rf230_state_change *ctx,
 -                       void (*complete)(void *context),
 -                       const bool irq_enable)
 +                       void (*complete)(void *context))
  {
        int rc;
  
  
        tx_buf[0] = (reg & CMD_REG_MASK) | CMD_REG;
        ctx->msg.complete = complete;
 -      ctx->irq_enable = irq_enable;
        rc = spi_async(lp->spi, &ctx->msg);
 -      if (rc) {
 -              if (irq_enable)
 -                      enable_irq(ctx->irq);
 -
 +      if (rc)
                at86rf230_async_error(lp, ctx, rc);
 -      }
  }
  
 -static inline u8 at86rf230_state_to_force(u8 state)
 +static void
 +at86rf230_async_write_reg(struct at86rf230_local *lp, u8 reg, u8 val,
 +                        struct at86rf230_state_change *ctx,
 +                        void (*complete)(void *context))
  {
 -      if (state == STATE_TX_ON)
 -              return STATE_FORCE_TX_ON;
 -      else
 -              return STATE_FORCE_TRX_OFF;
 +      int rc;
 +
 +      ctx->buf[0] = (reg & CMD_REG_MASK) | CMD_REG | CMD_WRITE;
 +      ctx->buf[1] = val;
 +      ctx->msg.complete = complete;
 +      rc = spi_async(lp->spi, &ctx->msg);
 +      if (rc)
 +              at86rf230_async_error(lp, ctx, rc);
  }
  
  static void
@@@ -438,11 -426,12 +438,11 @@@ at86rf230_async_state_assert(void *cont
                                u8 state = ctx->to_state;
  
                                if (lp->tx_retry >= AT86RF2XX_MAX_TX_RETRIES)
 -                                      state = at86rf230_state_to_force(state);
 +                                      state = STATE_FORCE_TRX_OFF;
                                lp->tx_retry++;
  
                                at86rf230_async_state_change(lp, ctx, state,
 -                                                           ctx->complete,
 -                                                           ctx->irq_enable);
 +                                                           ctx->complete);
                                return;
                        }
                }
@@@ -463,7 -452,8 +463,7 @@@ static enum hrtimer_restart at86rf230_a
        struct at86rf230_local *lp = ctx->lp;
  
        at86rf230_async_read_reg(lp, RG_TRX_STATUS, ctx,
 -                               at86rf230_async_state_assert,
 -                               ctx->irq_enable);
 +                               at86rf230_async_state_assert);
  
        return HRTIMER_NORESTART;
  }
@@@ -568,12 -558,14 +568,12 @@@ at86rf230_async_state_change_start(voi
        struct at86rf230_local *lp = ctx->lp;
        u8 *buf = ctx->buf;
        const u8 trx_state = buf[1] & TRX_STATE_MASK;
 -      int rc;
  
        /* Check for "possible" STATE_TRANSITION_IN_PROGRESS */
        if (trx_state == STATE_TRANSITION_IN_PROGRESS) {
                udelay(1);
                at86rf230_async_read_reg(lp, RG_TRX_STATUS, ctx,
 -                                       at86rf230_async_state_change_start,
 -                                       ctx->irq_enable);
 +                                       at86rf230_async_state_change_start);
                return;
        }
  
        /* Going into the next step for a state change which do a timing
         * relevant delay.
         */
 -      buf[0] = (RG_TRX_STATE & CMD_REG_MASK) | CMD_REG | CMD_WRITE;
 -      buf[1] = ctx->to_state;
 -      ctx->msg.complete = at86rf230_async_state_delay;
 -      rc = spi_async(lp->spi, &ctx->msg);
 -      if (rc) {
 -              if (ctx->irq_enable)
 -                      enable_irq(ctx->irq);
 -
 -              at86rf230_async_error(lp, ctx, rc);
 -      }
 +      at86rf230_async_write_reg(lp, RG_TRX_STATE, ctx->to_state, ctx,
 +                                at86rf230_async_state_delay);
  }
  
  static void
  at86rf230_async_state_change(struct at86rf230_local *lp,
                             struct at86rf230_state_change *ctx,
 -                           const u8 state, void (*complete)(void *context),
 -                           const bool irq_enable)
 +                           const u8 state, void (*complete)(void *context))
  {
        /* Initialization for the state change context */
        ctx->to_state = state;
        ctx->complete = complete;
 -      ctx->irq_enable = irq_enable;
        at86rf230_async_read_reg(lp, RG_TRX_STATUS, ctx,
 -                               at86rf230_async_state_change_start,
 -                               irq_enable);
 +                               at86rf230_async_state_change_start);
  }
  
  static void
@@@ -625,7 -628,8 +625,7 @@@ at86rf230_sync_state_change(struct at86
        unsigned long rc;
  
        at86rf230_async_state_change(lp, &lp->state, state,
 -                                   at86rf230_sync_state_change_complete,
 -                                   false);
 +                                   at86rf230_sync_state_change_complete);
  
        rc = wait_for_completion_timeout(&lp->state_complete,
                                         msecs_to_jiffies(100));
@@@ -643,8 -647,9 +643,8 @@@ at86rf230_tx_complete(void *context
        struct at86rf230_state_change *ctx = context;
        struct at86rf230_local *lp = ctx->lp;
  
 -      enable_irq(ctx->irq);
 -
        ieee802154_xmit_complete(lp->hw, lp->tx_skb, false);
 +      kfree(ctx);
  }
  
  static void
@@@ -654,7 -659,7 +654,7 @@@ at86rf230_tx_on(void *context
        struct at86rf230_local *lp = ctx->lp;
  
        at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON,
 -                                   at86rf230_tx_complete, true);
 +                                   at86rf230_tx_complete);
  }
  
  static void
@@@ -662,33 -667,28 +662,33 @@@ at86rf230_tx_trac_check(void *context
  {
        struct at86rf230_state_change *ctx = context;
        struct at86rf230_local *lp = ctx->lp;
 -      const u8 *buf = ctx->buf;
 -      const u8 trac = (buf[1] & 0xe0) >> 5;
  
 -      /* If trac status is different than zero we need to do a state change
 -       * to STATE_FORCE_TRX_OFF then STATE_RX_AACK_ON to recover the
 -       * transceiver.
 -       */
 -      if (trac)
 -              at86rf230_async_state_change(lp, ctx, STATE_FORCE_TRX_OFF,
 -                                           at86rf230_tx_on, true);
 -      else
 -              at86rf230_tx_on(context);
 -}
 +      if (IS_ENABLED(CONFIG_IEEE802154_AT86RF230_DEBUGFS)) {
 +              u8 trac = TRAC_MASK(ctx->buf[1]);
  
 -static void
 -at86rf230_tx_trac_status(void *context)
 -{
 -      struct at86rf230_state_change *ctx = context;
 -      struct at86rf230_local *lp = ctx->lp;
 +              switch (trac) {
 +              case TRAC_SUCCESS:
 +                      lp->trac.success++;
 +                      break;
 +              case TRAC_SUCCESS_DATA_PENDING:
 +                      lp->trac.success_data_pending++;
 +                      break;
 +              case TRAC_CHANNEL_ACCESS_FAILURE:
 +                      lp->trac.channel_access_failure++;
 +                      break;
 +              case TRAC_NO_ACK:
 +                      lp->trac.no_ack++;
 +                      break;
 +              case TRAC_INVALID:
 +                      lp->trac.invalid++;
 +                      break;
 +              default:
 +                      WARN_ONCE(1, "received tx trac status %d\n", trac);
 +                      break;
 +              }
 +      }
  
 -      at86rf230_async_read_reg(lp, RG_TRX_STATE, ctx,
 -                               at86rf230_tx_trac_check, true);
 +      at86rf230_async_state_change(lp, ctx, STATE_TX_ON, at86rf230_tx_on);
  }
  
  static void
@@@ -696,6 -696,7 +696,6 @@@ at86rf230_rx_read_frame_complete(void *
  {
        struct at86rf230_state_change *ctx = context;
        struct at86rf230_local *lp = ctx->lp;
 -      u8 rx_local_buf[AT86RF2XX_MAX_BUF];
        const u8 *buf = ctx->buf;
        struct sk_buff *skb;
        u8 len, lqi;
        }
        lqi = buf[2 + len];
  
 -      memcpy(rx_local_buf, buf + 2, len);
 -      ctx->trx.len = 2;
 -      enable_irq(ctx->irq);
 -
        skb = dev_alloc_skb(IEEE802154_MTU);
        if (!skb) {
                dev_vdbg(&lp->spi->dev, "failed to allocate sk_buff\n");
 +              kfree(ctx);
                return;
        }
  
 -      memcpy(skb_put(skb, len), rx_local_buf, len);
 +      memcpy(skb_put(skb, len), buf + 2, len);
        ieee802154_rx_irqsafe(lp->hw, skb, lqi);
 +      kfree(ctx);
  }
  
  static void
 -at86rf230_rx_read_frame(void *context)
 +at86rf230_rx_trac_check(void *context)
  {
        struct at86rf230_state_change *ctx = context;
        struct at86rf230_local *lp = ctx->lp;
        u8 *buf = ctx->buf;
        int rc;
  
 +      if (IS_ENABLED(CONFIG_IEEE802154_AT86RF230_DEBUGFS)) {
 +              u8 trac = TRAC_MASK(buf[1]);
 +
 +              switch (trac) {
 +              case TRAC_SUCCESS:
 +                      lp->trac.success++;
 +                      break;
 +              case TRAC_SUCCESS_WAIT_FOR_ACK:
 +                      lp->trac.success_wait_for_ack++;
 +                      break;
 +              case TRAC_INVALID:
 +                      lp->trac.invalid++;
 +                      break;
 +              default:
 +                      WARN_ONCE(1, "received rx trac status %d\n", trac);
 +                      break;
 +              }
 +      }
 +
        buf[0] = CMD_FB;
        ctx->trx.len = AT86RF2XX_MAX_BUF;
        ctx->msg.complete = at86rf230_rx_read_frame_complete;
        rc = spi_async(lp->spi, &ctx->msg);
        if (rc) {
                ctx->trx.len = 2;
 -              enable_irq(ctx->irq);
                at86rf230_async_error(lp, ctx, rc);
        }
  }
  
  static void
 -at86rf230_rx_trac_check(void *context)
 +at86rf230_irq_trx_end(void *context)
  {
 -      /* Possible check on trac status here. This could be useful to make
 -       * some stats why receive is failed. Not used at the moment, but it's
 -       * maybe timing relevant. Datasheet doesn't say anything about this.
 -       * The programming guide say do it so.
 -       */
 -
 -      at86rf230_rx_read_frame(context);
 -}
 +      struct at86rf230_state_change *ctx = context;
 +      struct at86rf230_local *lp = ctx->lp;
  
 -static void
 -at86rf230_irq_trx_end(struct at86rf230_local *lp)
 -{
        if (lp->is_tx) {
                lp->is_tx = 0;
 -              at86rf230_async_state_change(lp, &lp->irq,
 -                                           STATE_FORCE_TX_ON,
 -                                           at86rf230_tx_trac_status,
 -                                           true);
 +              at86rf230_async_read_reg(lp, RG_TRX_STATE, ctx,
 +                                       at86rf230_tx_trac_check);
        } else {
 -              at86rf230_async_read_reg(lp, RG_TRX_STATE, &lp->irq,
 -                                       at86rf230_rx_trac_check, true);
 +              at86rf230_async_read_reg(lp, RG_TRX_STATE, ctx,
 +                                       at86rf230_rx_trac_check);
        }
  }
  
@@@ -778,59 -774,32 +778,59 @@@ at86rf230_irq_status(void *context
        struct at86rf230_state_change *ctx = context;
        struct at86rf230_local *lp = ctx->lp;
        const u8 *buf = ctx->buf;
 -      const u8 irq = buf[1];
 +      u8 irq = buf[1];
 +
 +      enable_irq(lp->spi->irq);
  
        if (irq & IRQ_TRX_END) {
 -              at86rf230_irq_trx_end(lp);
 +              at86rf230_irq_trx_end(ctx);
        } else {
 -              enable_irq(ctx->irq);
                dev_err(&lp->spi->dev, "not supported irq %02x received\n",
                        irq);
 +              kfree(ctx);
        }
  }
  
 +static void
 +at86rf230_setup_spi_messages(struct at86rf230_local *lp,
 +                           struct at86rf230_state_change *state)
 +{
 +      state->lp = lp;
 +      state->irq = lp->spi->irq;
 +      spi_message_init(&state->msg);
 +      state->msg.context = state;
 +      state->trx.len = 2;
 +      state->trx.tx_buf = state->buf;
 +      state->trx.rx_buf = state->buf;
 +      spi_message_add_tail(&state->trx, &state->msg);
 +      hrtimer_init(&state->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 +      state->timer.function = at86rf230_async_state_timer;
 +}
 +
  static irqreturn_t at86rf230_isr(int irq, void *data)
  {
        struct at86rf230_local *lp = data;
 -      struct at86rf230_state_change *ctx = &lp->irq;
 -      u8 *buf = ctx->buf;
 +      struct at86rf230_state_change *ctx;
        int rc;
  
        disable_irq_nosync(irq);
  
 -      buf[0] = (RG_IRQ_STATUS & CMD_REG_MASK) | CMD_REG;
 +      ctx = kzalloc(sizeof(*ctx), GFP_ATOMIC);
 +      if (!ctx) {
 +              enable_irq(irq);
 +              return IRQ_NONE;
 +      }
 +
 +      at86rf230_setup_spi_messages(lp, ctx);
 +      /* tell on error handling to free ctx */
 +      ctx->free = true;
 +
 +      ctx->buf[0] = (RG_IRQ_STATUS & CMD_REG_MASK) | CMD_REG;
        ctx->msg.complete = at86rf230_irq_status;
        rc = spi_async(lp->spi, &ctx->msg);
        if (rc) {
 -              enable_irq(irq);
                at86rf230_async_error(lp, ctx, rc);
 +              enable_irq(irq);
                return IRQ_NONE;
        }
  
@@@ -842,14 -811,21 +842,14 @@@ at86rf230_write_frame_complete(void *co
  {
        struct at86rf230_state_change *ctx = context;
        struct at86rf230_local *lp = ctx->lp;
 -      u8 *buf = ctx->buf;
 -      int rc;
  
        ctx->trx.len = 2;
  
 -      if (gpio_is_valid(lp->slp_tr)) {
 +      if (gpio_is_valid(lp->slp_tr))
                at86rf230_slp_tr_rising_edge(lp);
 -      } else {
 -              buf[0] = (RG_TRX_STATE & CMD_REG_MASK) | CMD_REG | CMD_WRITE;
 -              buf[1] = STATE_BUSY_TX;
 -              ctx->msg.complete = NULL;
 -              rc = spi_async(lp->spi, &ctx->msg);
 -              if (rc)
 -                      at86rf230_async_error(lp, ctx, rc);
 -      }
 +      else
 +              at86rf230_async_write_reg(lp, RG_TRX_STATE, STATE_BUSY_TX, ctx,
 +                                        NULL);
  }
  
  static void
@@@ -882,7 -858,7 +882,7 @@@ at86rf230_xmit_tx_on(void *context
        struct at86rf230_local *lp = ctx->lp;
  
        at86rf230_async_state_change(lp, ctx, STATE_TX_ARET_ON,
 -                                   at86rf230_write_frame, false);
 +                                   at86rf230_write_frame);
  }
  
  static void
@@@ -895,10 -871,12 +895,10 @@@ at86rf230_xmit_start(void *context
        if (lp->is_tx_from_off) {
                lp->is_tx_from_off = false;
                at86rf230_async_state_change(lp, ctx, STATE_TX_ARET_ON,
 -                                           at86rf230_write_frame,
 -                                           false);
 +                                           at86rf230_write_frame);
        } else {
                at86rf230_async_state_change(lp, ctx, STATE_TX_ON,
 -                                           at86rf230_xmit_tx_on,
 -                                           false);
 +                                           at86rf230_xmit_tx_on);
        }
  }
  
@@@ -921,7 -899,7 +921,7 @@@ at86rf230_xmit(struct ieee802154_hw *hw
        if (time_is_before_jiffies(lp->cal_timeout)) {
                lp->is_tx_from_off = true;
                at86rf230_async_state_change(lp, ctx, STATE_TRX_OFF,
 -                                           at86rf230_xmit_start, false);
 +                                           at86rf230_xmit_start);
        } else {
                at86rf230_xmit_start(ctx);
        }
@@@ -942,10 -920,6 +942,10 @@@ at86rf230_start(struct ieee802154_hw *h
  {
        struct at86rf230_local *lp = hw->priv;
  
 +      /* reset trac stats on start */
 +      if (IS_ENABLED(CONFIG_IEEE802154_AT86RF230_DEBUGFS))
 +              memset(&lp->trac, 0, sizeof(struct at86rf230_trac));
 +
        at86rf230_awake(lp);
        enable_irq(lp->spi->irq);
  
@@@ -1380,6 -1354,10 +1380,6 @@@ static int at86rf230_hw_init(struct at8
                return rc;
  
        irq_type = irq_get_trigger_type(lp->spi->irq);
 -      if (irq_type == IRQ_TYPE_EDGE_RISING ||
 -          irq_type == IRQ_TYPE_EDGE_FALLING)
 -              dev_warn(&lp->spi->dev,
 -                       "Using edge triggered irq's are not recommended!\n");
        if (irq_type == IRQ_TYPE_EDGE_FALLING ||
            irq_type == IRQ_TYPE_LEVEL_LOW)
                irq_pol = IRQ_ACTIVE_LOW;
@@@ -1605,65 -1583,42 +1605,65 @@@ not_supp
        return rc;
  }
  
 -static void
 -at86rf230_setup_spi_messages(struct at86rf230_local *lp)
 +#ifdef CONFIG_IEEE802154_AT86RF230_DEBUGFS
 +static struct dentry *at86rf230_debugfs_root;
 +
 +static int at86rf230_stats_show(struct seq_file *file, void *offset)
 +{
 +      struct at86rf230_local *lp = file->private;
 +
 +      seq_printf(file, "SUCCESS:\t\t%8llu\n", lp->trac.success);
 +      seq_printf(file, "SUCCESS_DATA_PENDING:\t%8llu\n",
 +                 lp->trac.success_data_pending);
 +      seq_printf(file, "SUCCESS_WAIT_FOR_ACK:\t%8llu\n",
 +                 lp->trac.success_wait_for_ack);
 +      seq_printf(file, "CHANNEL_ACCESS_FAILURE:\t%8llu\n",
 +                 lp->trac.channel_access_failure);
 +      seq_printf(file, "NO_ACK:\t\t\t%8llu\n", lp->trac.no_ack);
 +      seq_printf(file, "INVALID:\t\t%8llu\n", lp->trac.invalid);
 +      return 0;
 +}
 +
 +static int at86rf230_stats_open(struct inode *inode, struct file *file)
 +{
 +      return single_open(file, at86rf230_stats_show, inode->i_private);
 +}
 +
 +static const struct file_operations at86rf230_stats_fops = {
 +      .open           = at86rf230_stats_open,
 +      .read           = seq_read,
 +      .llseek         = seq_lseek,
 +      .release        = single_release,
 +};
 +
 +static int at86rf230_debugfs_init(struct at86rf230_local *lp)
 +{
 +      char debugfs_dir_name[DNAME_INLINE_LEN + 1] = "at86rf230-";
 +      struct dentry *stats;
 +
 +      strncat(debugfs_dir_name, dev_name(&lp->spi->dev), DNAME_INLINE_LEN);
 +
 +      at86rf230_debugfs_root = debugfs_create_dir(debugfs_dir_name, NULL);
 +      if (!at86rf230_debugfs_root)
 +              return -ENOMEM;
 +
 +      stats = debugfs_create_file("trac_stats", S_IRUGO,
 +                                  at86rf230_debugfs_root, lp,
 +                                  &at86rf230_stats_fops);
 +      if (!stats)
 +              return -ENOMEM;
 +
 +      return 0;
 +}
 +
 +static void at86rf230_debugfs_remove(void)
  {
 -      lp->state.lp = lp;
 -      lp->state.irq = lp->spi->irq;
 -      spi_message_init(&lp->state.msg);
 -      lp->state.msg.context = &lp->state;
 -      lp->state.trx.len = 2;
 -      lp->state.trx.tx_buf = lp->state.buf;
 -      lp->state.trx.rx_buf = lp->state.buf;
 -      spi_message_add_tail(&lp->state.trx, &lp->state.msg);
 -      hrtimer_init(&lp->state.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 -      lp->state.timer.function = at86rf230_async_state_timer;
 -
 -      lp->irq.lp = lp;
 -      lp->irq.irq = lp->spi->irq;
 -      spi_message_init(&lp->irq.msg);
 -      lp->irq.msg.context = &lp->irq;
 -      lp->irq.trx.len = 2;
 -      lp->irq.trx.tx_buf = lp->irq.buf;
 -      lp->irq.trx.rx_buf = lp->irq.buf;
 -      spi_message_add_tail(&lp->irq.trx, &lp->irq.msg);
 -      hrtimer_init(&lp->irq.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 -      lp->irq.timer.function = at86rf230_async_state_timer;
 -
 -      lp->tx.lp = lp;
 -      lp->tx.irq = lp->spi->irq;
 -      spi_message_init(&lp->tx.msg);
 -      lp->tx.msg.context = &lp->tx;
 -      lp->tx.trx.len = 2;
 -      lp->tx.trx.tx_buf = lp->tx.buf;
 -      lp->tx.trx.rx_buf = lp->tx.buf;
 -      spi_message_add_tail(&lp->tx.trx, &lp->tx.msg);
 -      hrtimer_init(&lp->tx.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 -      lp->tx.timer.function = at86rf230_async_state_timer;
 +      debugfs_remove_recursive(at86rf230_debugfs_root);
  }
 +#else
 +static int at86rf230_debugfs_init(struct at86rf230_local *lp) { return 0; }
 +static void at86rf230_debugfs_remove(void) { }
 +#endif
  
  static int at86rf230_probe(struct spi_device *spi)
  {
                goto free_dev;
        }
  
 -      at86rf230_setup_spi_messages(lp);
 +      at86rf230_setup_spi_messages(lp, &lp->state);
 +      at86rf230_setup_spi_messages(lp, &lp->tx);
  
        rc = at86rf230_detect_device(lp);
        if (rc < 0)
        /* going into sleep by default */
        at86rf230_sleep(lp);
  
 -      rc = ieee802154_register_hw(lp->hw);
 +      rc = at86rf230_debugfs_init(lp);
        if (rc)
                goto free_dev;
  
 +      rc = ieee802154_register_hw(lp->hw);
 +      if (rc)
 +              goto free_debugfs;
 +
        return rc;
  
 +free_debugfs:
 +      at86rf230_debugfs_remove();
  free_dev:
        ieee802154_free_hw(lp->hw);
  
@@@ -1787,7 -1735,6 +1787,7 @@@ static int at86rf230_remove(struct spi_
        at86rf230_write_subreg(lp, SR_IRQ_MASK, 0);
        ieee802154_unregister_hw(lp->hw);
        ieee802154_free_hw(lp->hw);
 +      at86rf230_debugfs_remove();
        dev_dbg(&spi->dev, "unregistered at86rf230\n");
  
        return 0;
@@@ -1816,7 -1763,6 +1816,6 @@@ static struct spi_driver at86rf230_driv
        .driver = {
                .of_match_table = of_match_ptr(at86rf230_of_match),
                .name   = "at86rf230",
-               .owner  = THIS_MODULE,
        },
        .probe      = at86rf230_probe,
        .remove     = at86rf230_remove,
index aca0fb3cccbf5f294e689daae6722638356badab,e4c37d48add16a40c67c8cc36e7288054b7efa85..4cdf51638972095644204eebccf46c8c77421ef2
  #include <linux/spi/spi.h>
  #include <linux/interrupt.h>
  #include <linux/module.h>
 +#include <linux/regmap.h>
  #include <linux/ieee802154.h>
 +#include <linux/irq.h>
  #include <net/cfg802154.h>
  #include <net/mac802154.h>
  
  /* MRF24J40 Short Address Registers */
 -#define REG_RXMCR    0x00  /* Receive MAC control */
 -#define REG_PANIDL   0x01  /* PAN ID (low) */
 -#define REG_PANIDH   0x02  /* PAN ID (high) */
 -#define REG_SADRL    0x03  /* Short address (low) */
 -#define REG_SADRH    0x04  /* Short address (high) */
 -#define REG_EADR0    0x05  /* Long address (low) (high is EADR7) */
 -#define REG_TXMCR    0x11  /* Transmit MAC control */
 -#define REG_PACON0   0x16  /* Power Amplifier Control */
 -#define REG_PACON1   0x17  /* Power Amplifier Control */
 -#define REG_PACON2   0x18  /* Power Amplifier Control */
 -#define REG_TXNCON   0x1B  /* Transmit Normal FIFO Control */
 -#define REG_TXSTAT   0x24  /* TX MAC Status Register */
 -#define REG_SOFTRST  0x2A  /* Soft Reset */
 -#define REG_TXSTBL   0x2E  /* TX Stabilization */
 -#define REG_INTSTAT  0x31  /* Interrupt Status */
 -#define REG_INTCON   0x32  /* Interrupt Control */
 -#define REG_GPIO     0x33  /* GPIO */
 -#define REG_TRISGPIO 0x34  /* GPIO direction */
 -#define REG_RFCTL    0x36  /* RF Control Mode Register */
 -#define REG_BBREG1   0x39  /* Baseband Registers */
 -#define REG_BBREG2   0x3A  /* */
 -#define REG_BBREG6   0x3E  /* */
 -#define REG_CCAEDTH  0x3F  /* Energy Detection Threshold */
 +#define REG_RXMCR     0x00  /* Receive MAC control */
 +#define BIT_PROMI     BIT(0)
 +#define BIT_ERRPKT    BIT(1)
 +#define BIT_NOACKRSP  BIT(5)
 +#define BIT_PANCOORD  BIT(3)
 +
 +#define REG_PANIDL    0x01  /* PAN ID (low) */
 +#define REG_PANIDH    0x02  /* PAN ID (high) */
 +#define REG_SADRL     0x03  /* Short address (low) */
 +#define REG_SADRH     0x04  /* Short address (high) */
 +#define REG_EADR0     0x05  /* Long address (low) (high is EADR7) */
 +#define REG_EADR1     0x06
 +#define REG_EADR2     0x07
 +#define REG_EADR3     0x08
 +#define REG_EADR4     0x09
 +#define REG_EADR5     0x0A
 +#define REG_EADR6     0x0B
 +#define REG_EADR7     0x0C
 +#define REG_RXFLUSH   0x0D
 +#define REG_ORDER     0x10
 +#define REG_TXMCR     0x11  /* Transmit MAC control */
 +#define TXMCR_MIN_BE_SHIFT            3
 +#define TXMCR_MIN_BE_MASK             0x18
 +#define TXMCR_CSMA_RETRIES_SHIFT      0
 +#define TXMCR_CSMA_RETRIES_MASK               0x07
 +
 +#define REG_ACKTMOUT  0x12
 +#define REG_ESLOTG1   0x13
 +#define REG_SYMTICKL  0x14
 +#define REG_SYMTICKH  0x15
 +#define REG_PACON0    0x16  /* Power Amplifier Control */
 +#define REG_PACON1    0x17  /* Power Amplifier Control */
 +#define REG_PACON2    0x18  /* Power Amplifier Control */
 +#define REG_TXBCON0   0x1A
 +#define REG_TXNCON    0x1B  /* Transmit Normal FIFO Control */
 +#define BIT_TXNTRIG   BIT(0)
 +#define BIT_TXNACKREQ BIT(2)
 +
 +#define REG_TXG1CON   0x1C
 +#define REG_TXG2CON   0x1D
 +#define REG_ESLOTG23  0x1E
 +#define REG_ESLOTG45  0x1F
 +#define REG_ESLOTG67  0x20
 +#define REG_TXPEND    0x21
 +#define REG_WAKECON   0x22
 +#define REG_FROMOFFSET        0x23
 +#define REG_TXSTAT    0x24  /* TX MAC Status Register */
 +#define REG_TXBCON1   0x25
 +#define REG_GATECLK   0x26
 +#define REG_TXTIME    0x27
 +#define REG_HSYMTMRL  0x28
 +#define REG_HSYMTMRH  0x29
 +#define REG_SOFTRST   0x2A  /* Soft Reset */
 +#define REG_SECCON0   0x2C
 +#define REG_SECCON1   0x2D
 +#define REG_TXSTBL    0x2E  /* TX Stabilization */
 +#define REG_RXSR      0x30
 +#define REG_INTSTAT   0x31  /* Interrupt Status */
 +#define BIT_TXNIF     BIT(0)
 +#define BIT_RXIF      BIT(3)
 +
 +#define REG_INTCON    0x32  /* Interrupt Control */
 +#define BIT_TXNIE     BIT(0)
 +#define BIT_RXIE      BIT(3)
 +
 +#define REG_GPIO      0x33  /* GPIO */
 +#define REG_TRISGPIO  0x34  /* GPIO direction */
 +#define REG_SLPACK    0x35
 +#define REG_RFCTL     0x36  /* RF Control Mode Register */
 +#define BIT_RFRST     BIT(2)
 +
 +#define REG_SECCR2    0x37
 +#define REG_BBREG0    0x38
 +#define REG_BBREG1    0x39  /* Baseband Registers */
 +#define BIT_RXDECINV  BIT(2)
 +
 +#define REG_BBREG2    0x3A  /* */
 +#define BBREG2_CCA_MODE_SHIFT 6
 +#define BBREG2_CCA_MODE_MASK  0xc0
 +
 +#define REG_BBREG3    0x3B
 +#define REG_BBREG4    0x3C
 +#define REG_BBREG6    0x3E  /* */
 +#define REG_CCAEDTH   0x3F  /* Energy Detection Threshold */
  
  /* MRF24J40 Long Address Registers */
 -#define REG_RFCON0     0x200  /* RF Control Registers */
 -#define REG_RFCON1     0x201
 -#define REG_RFCON2     0x202
 -#define REG_RFCON3     0x203
 -#define REG_RFCON5     0x205
 -#define REG_RFCON6     0x206
 -#define REG_RFCON7     0x207
 -#define REG_RFCON8     0x208
 -#define REG_RSSI       0x210
 -#define REG_SLPCON0    0x211  /* Sleep Clock Control Registers */
 -#define REG_SLPCON1    0x220
 -#define REG_WAKETIMEL  0x222  /* Wake-up Time Match Value Low */
 -#define REG_WAKETIMEH  0x223  /* Wake-up Time Match Value High */
 -#define REG_TESTMODE   0x22F  /* Test mode */
 -#define REG_RX_FIFO    0x300  /* Receive FIFO */
 +#define REG_RFCON0    0x200  /* RF Control Registers */
 +#define RFCON0_CH_SHIFT       4
 +#define RFCON0_CH_MASK        0xf0
 +#define RFOPT_RECOMMEND       3
 +
 +#define REG_RFCON1    0x201
 +#define REG_RFCON2    0x202
 +#define REG_RFCON3    0x203
 +
 +#define TXPWRL_MASK   0xc0
 +#define TXPWRL_SHIFT  6
 +#define TXPWRL_30     0x3
 +#define TXPWRL_20     0x2
 +#define TXPWRL_10     0x1
 +#define TXPWRL_0      0x0
 +
 +#define TXPWRS_MASK   0x38
 +#define TXPWRS_SHIFT  3
 +#define TXPWRS_6_3    0x7
 +#define TXPWRS_4_9    0x6
 +#define TXPWRS_3_7    0x5
 +#define TXPWRS_2_8    0x4
 +#define TXPWRS_1_9    0x3
 +#define TXPWRS_1_2    0x2
 +#define TXPWRS_0_5    0x1
 +#define TXPWRS_0      0x0
 +
 +#define REG_RFCON5    0x205
 +#define REG_RFCON6    0x206
 +#define REG_RFCON7    0x207
 +#define REG_RFCON8    0x208
 +#define REG_SLPCAL0   0x209
 +#define REG_SLPCAL1   0x20A
 +#define REG_SLPCAL2   0x20B
 +#define REG_RFSTATE   0x20F
 +#define REG_RSSI      0x210
 +#define REG_SLPCON0   0x211  /* Sleep Clock Control Registers */
 +#define BIT_INTEDGE   BIT(1)
 +
 +#define REG_SLPCON1   0x220
 +#define REG_WAKETIMEL 0x222  /* Wake-up Time Match Value Low */
 +#define REG_WAKETIMEH 0x223  /* Wake-up Time Match Value High */
 +#define REG_REMCNTL   0x224
 +#define REG_REMCNTH   0x225
 +#define REG_MAINCNT0  0x226
 +#define REG_MAINCNT1  0x227
 +#define REG_MAINCNT2  0x228
 +#define REG_MAINCNT3  0x229
 +#define REG_TESTMODE  0x22F  /* Test mode */
 +#define REG_ASSOEAR0  0x230
 +#define REG_ASSOEAR1  0x231
 +#define REG_ASSOEAR2  0x232
 +#define REG_ASSOEAR3  0x233
 +#define REG_ASSOEAR4  0x234
 +#define REG_ASSOEAR5  0x235
 +#define REG_ASSOEAR6  0x236
 +#define REG_ASSOEAR7  0x237
 +#define REG_ASSOSAR0  0x238
 +#define REG_ASSOSAR1  0x239
 +#define REG_UNONCE0   0x240
 +#define REG_UNONCE1   0x241
 +#define REG_UNONCE2   0x242
 +#define REG_UNONCE3   0x243
 +#define REG_UNONCE4   0x244
 +#define REG_UNONCE5   0x245
 +#define REG_UNONCE6   0x246
 +#define REG_UNONCE7   0x247
 +#define REG_UNONCE8   0x248
 +#define REG_UNONCE9   0x249
 +#define REG_UNONCE10  0x24A
 +#define REG_UNONCE11  0x24B
 +#define REG_UNONCE12  0x24C
 +#define REG_RX_FIFO   0x300  /* Receive FIFO */
  
  /* Device configuration: Only channels 11-26 on page 0 are supported. */
  #define MRF24J40_CHAN_MIN 11
@@@ -202,52 -81,11 +202,52 @@@ struct mrf24j40 
        struct spi_device *spi;
        struct ieee802154_hw *hw;
  
 -      struct mutex buffer_mutex; /* only used to protect buf */
 -      struct completion tx_complete;
 -      u8 *buf; /* 3 bytes. Used for SPI single-register transfers. */
 +      struct regmap *regmap_short;
 +      struct regmap *regmap_long;
 +
 +      /* for writing txfifo */
 +      struct spi_message tx_msg;
 +      u8 tx_hdr_buf[2];
 +      struct spi_transfer tx_hdr_trx;
 +      u8 tx_len_buf[2];
 +      struct spi_transfer tx_len_trx;
 +      struct spi_transfer tx_buf_trx;
 +      struct sk_buff *tx_skb;
 +
 +      /* post transmit message to send frame out  */
 +      struct spi_message tx_post_msg;
 +      u8 tx_post_buf[2];
 +      struct spi_transfer tx_post_trx;
 +
 +      /* for protect/unprotect/read length rxfifo */
 +      struct spi_message rx_msg;
 +      u8 rx_buf[3];
 +      struct spi_transfer rx_trx;
 +
 +      /* receive handling */
 +      struct spi_message rx_buf_msg;
 +      u8 rx_addr_buf[2];
 +      struct spi_transfer rx_addr_trx;
 +      u8 rx_lqi_buf[2];
 +      struct spi_transfer rx_lqi_trx;
 +      u8 rx_fifo_buf[RX_FIFO_SIZE];
 +      struct spi_transfer rx_fifo_buf_trx;
 +
 +      /* isr handling for reading intstat */
 +      struct spi_message irq_msg;
 +      u8 irq_buf[2];
 +      struct spi_transfer irq_trx;
  };
  
 +/* regmap information for short address register access */
 +#define MRF24J40_SHORT_WRITE  0x01
 +#define MRF24J40_SHORT_READ   0x00
 +#define MRF24J40_SHORT_NUMREGS        0x3F
 +
 +/* regmap information for long address register access */
 +#define MRF24J40_LONG_ACCESS  0x80
 +#define MRF24J40_LONG_NUMREGS 0x38F
 +
  /* Read/Write SPI Commands for Short and Long Address registers. */
  #define MRF24J40_READSHORT(reg) ((reg) << 1)
  #define MRF24J40_WRITESHORT(reg) ((reg) << 1 | 1)
  
  #define printdev(X) (&X->spi->dev)
  
 -static int write_short_reg(struct mrf24j40 *devrec, u8 reg, u8 value)
 +static bool
 +mrf24j40_short_reg_writeable(struct device *dev, unsigned int reg)
  {
 -      int ret;
 -      struct spi_message msg;
 -      struct spi_transfer xfer = {
 -              .len = 2,
 -              .tx_buf = devrec->buf,
 -              .rx_buf = devrec->buf,
 -      };
 +      switch (reg) {
 +      case REG_RXMCR:
 +      case REG_PANIDL:
 +      case REG_PANIDH:
 +      case REG_SADRL:
 +      case REG_SADRH:
 +      case REG_EADR0:
 +      case REG_EADR1:
 +      case REG_EADR2:
 +      case REG_EADR3:
 +      case REG_EADR4:
 +      case REG_EADR5:
 +      case REG_EADR6:
 +      case REG_EADR7:
 +      case REG_RXFLUSH:
 +      case REG_ORDER:
 +      case REG_TXMCR:
 +      case REG_ACKTMOUT:
 +      case REG_ESLOTG1:
 +      case REG_SYMTICKL:
 +      case REG_SYMTICKH:
 +      case REG_PACON0:
 +      case REG_PACON1:
 +      case REG_PACON2:
 +      case REG_TXBCON0:
 +      case REG_TXNCON:
 +      case REG_TXG1CON:
 +      case REG_TXG2CON:
 +      case REG_ESLOTG23:
 +      case REG_ESLOTG45:
 +      case REG_ESLOTG67:
 +      case REG_TXPEND:
 +      case REG_WAKECON:
 +      case REG_FROMOFFSET:
 +      case REG_TXBCON1:
 +      case REG_GATECLK:
 +      case REG_TXTIME:
 +      case REG_HSYMTMRL:
 +      case REG_HSYMTMRH:
 +      case REG_SOFTRST:
 +      case REG_SECCON0:
 +      case REG_SECCON1:
 +      case REG_TXSTBL:
 +      case REG_RXSR:
 +      case REG_INTCON:
 +      case REG_TRISGPIO:
 +      case REG_GPIO:
 +      case REG_RFCTL:
 +      case REG_SLPACK:
 +      case REG_BBREG0:
 +      case REG_BBREG1:
 +      case REG_BBREG2:
 +      case REG_BBREG3:
 +      case REG_BBREG4:
 +      case REG_BBREG6:
 +      case REG_CCAEDTH:
 +              return true;
 +      default:
 +              return false;
 +      }
 +}
  
 -      spi_message_init(&msg);
 -      spi_message_add_tail(&xfer, &msg);
 +static bool
 +mrf24j40_short_reg_readable(struct device *dev, unsigned int reg)
 +{
 +      bool rc;
 +
 +      /* all writeable are also readable */
 +      rc = mrf24j40_short_reg_writeable(dev, reg);
 +      if (rc)
 +              return rc;
 +
 +      /* readonly regs */
 +      switch (reg) {
 +      case REG_TXSTAT:
 +      case REG_INTSTAT:
 +              return true;
 +      default:
 +              return false;
 +      }
 +}
  
 -      mutex_lock(&devrec->buffer_mutex);
 -      devrec->buf[0] = MRF24J40_WRITESHORT(reg);
 -      devrec->buf[1] = value;
 +static bool
 +mrf24j40_short_reg_volatile(struct device *dev, unsigned int reg)
 +{
 +      /* can be changed during runtime */
 +      switch (reg) {
 +      case REG_TXSTAT:
 +      case REG_INTSTAT:
 +      case REG_RXFLUSH:
 +      case REG_TXNCON:
 +      case REG_SOFTRST:
 +      case REG_RFCTL:
 +      case REG_TXBCON0:
 +      case REG_TXG1CON:
 +      case REG_TXG2CON:
 +      case REG_TXBCON1:
 +      case REG_SECCON0:
 +      case REG_RXSR:
 +      case REG_SLPACK:
 +      case REG_SECCR2:
 +      case REG_BBREG6:
 +      /* use them in spi_async and regmap so it's volatile */
 +      case REG_BBREG1:
 +              return true;
 +      default:
 +              return false;
 +      }
 +}
  
 -      ret = spi_sync(devrec->spi, &msg);
 -      if (ret)
 -              dev_err(printdev(devrec),
 -                      "SPI write Failed for short register 0x%hhx\n", reg);
 +static bool
 +mrf24j40_short_reg_precious(struct device *dev, unsigned int reg)
 +{
 +      /* don't clear irq line on read */
 +      switch (reg) {
 +      case REG_INTSTAT:
 +              return true;
 +      default:
 +              return false;
 +      }
 +}
  
 -      mutex_unlock(&devrec->buffer_mutex);
 -      return ret;
 +static const struct regmap_config mrf24j40_short_regmap = {
 +      .name = "mrf24j40_short",
 +      .reg_bits = 7,
 +      .val_bits = 8,
 +      .pad_bits = 1,
 +      .write_flag_mask = MRF24J40_SHORT_WRITE,
 +      .read_flag_mask = MRF24J40_SHORT_READ,
 +      .cache_type = REGCACHE_RBTREE,
 +      .max_register = MRF24J40_SHORT_NUMREGS,
 +      .writeable_reg = mrf24j40_short_reg_writeable,
 +      .readable_reg = mrf24j40_short_reg_readable,
 +      .volatile_reg = mrf24j40_short_reg_volatile,
 +      .precious_reg = mrf24j40_short_reg_precious,
 +};
 +
 +static bool
 +mrf24j40_long_reg_writeable(struct device *dev, unsigned int reg)
 +{
 +      switch (reg) {
 +      case REG_RFCON0:
 +      case REG_RFCON1:
 +      case REG_RFCON2:
 +      case REG_RFCON3:
 +      case REG_RFCON5:
 +      case REG_RFCON6:
 +      case REG_RFCON7:
 +      case REG_RFCON8:
 +      case REG_SLPCAL2:
 +      case REG_SLPCON0:
 +      case REG_SLPCON1:
 +      case REG_WAKETIMEL:
 +      case REG_WAKETIMEH:
 +      case REG_REMCNTL:
 +      case REG_REMCNTH:
 +      case REG_MAINCNT0:
 +      case REG_MAINCNT1:
 +      case REG_MAINCNT2:
 +      case REG_MAINCNT3:
 +      case REG_TESTMODE:
 +      case REG_ASSOEAR0:
 +      case REG_ASSOEAR1:
 +      case REG_ASSOEAR2:
 +      case REG_ASSOEAR3:
 +      case REG_ASSOEAR4:
 +      case REG_ASSOEAR5:
 +      case REG_ASSOEAR6:
 +      case REG_ASSOEAR7:
 +      case REG_ASSOSAR0:
 +      case REG_ASSOSAR1:
 +      case REG_UNONCE0:
 +      case REG_UNONCE1:
 +      case REG_UNONCE2:
 +      case REG_UNONCE3:
 +      case REG_UNONCE4:
 +      case REG_UNONCE5:
 +      case REG_UNONCE6:
 +      case REG_UNONCE7:
 +      case REG_UNONCE8:
 +      case REG_UNONCE9:
 +      case REG_UNONCE10:
 +      case REG_UNONCE11:
 +      case REG_UNONCE12:
 +              return true;
 +      default:
 +              return false;
 +      }
  }
  
 -static int read_short_reg(struct mrf24j40 *devrec, u8 reg, u8 *val)
 +static bool
 +mrf24j40_long_reg_readable(struct device *dev, unsigned int reg)
  {
 -      int ret = -1;
 -      struct spi_message msg;
 -      struct spi_transfer xfer = {
 -              .len = 2,
 -              .tx_buf = devrec->buf,
 -              .rx_buf = devrec->buf,
 -      };
 +      bool rc;
 +
 +      /* all writeable are also readable */
 +      rc = mrf24j40_long_reg_writeable(dev, reg);
 +      if (rc)
 +              return rc;
 +
 +      /* readonly regs */
 +      switch (reg) {
 +      case REG_SLPCAL0:
 +      case REG_SLPCAL1:
 +      case REG_RFSTATE:
 +      case REG_RSSI:
 +              return true;
 +      default:
 +              return false;
 +      }
 +}
  
 -      spi_message_init(&msg);
 -      spi_message_add_tail(&xfer, &msg);
 +static bool
 +mrf24j40_long_reg_volatile(struct device *dev, unsigned int reg)
 +{
 +      /* can be changed during runtime */
 +      switch (reg) {
 +      case REG_SLPCAL0:
 +      case REG_SLPCAL1:
 +      case REG_SLPCAL2:
 +      case REG_RFSTATE:
 +      case REG_RSSI:
 +      case REG_MAINCNT3:
 +              return true;
 +      default:
 +              return false;
 +      }
 +}
  
 -      mutex_lock(&devrec->buffer_mutex);
 -      devrec->buf[0] = MRF24J40_READSHORT(reg);
 -      devrec->buf[1] = 0;
 +static const struct regmap_config mrf24j40_long_regmap = {
 +      .name = "mrf24j40_long",
 +      .reg_bits = 11,
 +      .val_bits = 8,
 +      .pad_bits = 5,
 +      .write_flag_mask = MRF24J40_LONG_ACCESS,
 +      .read_flag_mask = MRF24J40_LONG_ACCESS,
 +      .cache_type = REGCACHE_RBTREE,
 +      .max_register = MRF24J40_LONG_NUMREGS,
 +      .writeable_reg = mrf24j40_long_reg_writeable,
 +      .readable_reg = mrf24j40_long_reg_readable,
 +      .volatile_reg = mrf24j40_long_reg_volatile,
 +};
  
 -      ret = spi_sync(devrec->spi, &msg);
 -      if (ret)
 -              dev_err(printdev(devrec),
 -                      "SPI read Failed for short register 0x%hhx\n", reg);
 -      else
 -              *val = devrec->buf[1];
 +static int mrf24j40_long_regmap_write(void *context, const void *data,
 +                                    size_t count)
 +{
 +      struct spi_device *spi = context;
 +      u8 buf[3];
  
 -      mutex_unlock(&devrec->buffer_mutex);
 -      return ret;
 +      if (count > 3)
 +              return -EINVAL;
 +
 +      /* regmap supports read/write mask only in frist byte
 +       * long write access need to set the 12th bit, so we
 +       * make special handling for write.
 +       */
 +      memcpy(buf, data, count);
 +      buf[1] |= (1 << 4);
 +
 +      return spi_write(spi, buf, count);
  }
  
 -static int read_long_reg(struct mrf24j40 *devrec, u16 reg, u8 *value)
 +static int
 +mrf24j40_long_regmap_read(void *context, const void *reg, size_t reg_size,
 +                        void *val, size_t val_size)
  {
 -      int ret;
 -      u16 cmd;
 -      struct spi_message msg;
 -      struct spi_transfer xfer = {
 -              .len = 3,
 -              .tx_buf = devrec->buf,
 -              .rx_buf = devrec->buf,
 -      };
 -
 -      spi_message_init(&msg);
 -      spi_message_add_tail(&xfer, &msg);
 -
 -      cmd = MRF24J40_READLONG(reg);
 -      mutex_lock(&devrec->buffer_mutex);
 -      devrec->buf[0] = cmd >> 8 & 0xff;
 -      devrec->buf[1] = cmd & 0xff;
 -      devrec->buf[2] = 0;
 -
 -      ret = spi_sync(devrec->spi, &msg);
 -      if (ret)
 -              dev_err(printdev(devrec),
 -                      "SPI read Failed for long register 0x%hx\n", reg);
 -      else
 -              *value = devrec->buf[2];
 +      struct spi_device *spi = context;
  
 -      mutex_unlock(&devrec->buffer_mutex);
 -      return ret;
 +      return spi_write_then_read(spi, reg, reg_size, val, val_size);
  }
  
 -static int write_long_reg(struct mrf24j40 *devrec, u16 reg, u8 val)
 +static const struct regmap_bus mrf24j40_long_regmap_bus = {
 +      .write = mrf24j40_long_regmap_write,
 +      .read = mrf24j40_long_regmap_read,
 +      .reg_format_endian_default = REGMAP_ENDIAN_BIG,
 +      .val_format_endian_default = REGMAP_ENDIAN_BIG,
 +};
 +
 +static void write_tx_buf_complete(void *context)
  {
 +      struct mrf24j40 *devrec = context;
 +      __le16 fc = ieee802154_get_fc_from_skb(devrec->tx_skb);
 +      u8 val = BIT_TXNTRIG;
        int ret;
 -      u16 cmd;
 -      struct spi_message msg;
 -      struct spi_transfer xfer = {
 -              .len = 3,
 -              .tx_buf = devrec->buf,
 -              .rx_buf = devrec->buf,
 -      };
  
 -      spi_message_init(&msg);
 -      spi_message_add_tail(&xfer, &msg);
 +      if (ieee802154_is_ackreq(fc))
 +              val |= BIT_TXNACKREQ;
  
 -      cmd = MRF24J40_WRITELONG(reg);
 -      mutex_lock(&devrec->buffer_mutex);
 -      devrec->buf[0] = cmd >> 8 & 0xff;
 -      devrec->buf[1] = cmd & 0xff;
 -      devrec->buf[2] = val;
 +      devrec->tx_post_msg.complete = NULL;
 +      devrec->tx_post_buf[0] = MRF24J40_WRITESHORT(REG_TXNCON);
 +      devrec->tx_post_buf[1] = val;
  
 -      ret = spi_sync(devrec->spi, &msg);
 +      ret = spi_async(devrec->spi, &devrec->tx_post_msg);
        if (ret)
 -              dev_err(printdev(devrec),
 -                      "SPI write Failed for long register 0x%hx\n", reg);
 -
 -      mutex_unlock(&devrec->buffer_mutex);
 -      return ret;
 +              dev_err(printdev(devrec), "SPI write Failed for transmit buf\n");
  }
  
  /* This function relies on an undocumented write method. Once a write command
  static int write_tx_buf(struct mrf24j40 *devrec, u16 reg,
                        const u8 *data, size_t length)
  {
 -      int ret;
        u16 cmd;
 -      u8 lengths[2];
 -      struct spi_message msg;
 -      struct spi_transfer addr_xfer = {
 -              .len = 2,
 -              .tx_buf = devrec->buf,
 -      };
 -      struct spi_transfer lengths_xfer = {
 -              .len = 2,
 -              .tx_buf = &lengths, /* TODO: Is DMA really required for SPI? */
 -      };
 -      struct spi_transfer data_xfer = {
 -              .len = length,
 -              .tx_buf = data,
 -      };
 +      int ret;
  
        /* Range check the length. 2 bytes are used for the length fields.*/
        if (length > TX_FIFO_SIZE-2) {
                length = TX_FIFO_SIZE-2;
        }
  
 -      spi_message_init(&msg);
 -      spi_message_add_tail(&addr_xfer, &msg);
 -      spi_message_add_tail(&lengths_xfer, &msg);
 -      spi_message_add_tail(&data_xfer, &msg);
 -
        cmd = MRF24J40_WRITELONG(reg);
 -      mutex_lock(&devrec->buffer_mutex);
 -      devrec->buf[0] = cmd >> 8 & 0xff;
 -      devrec->buf[1] = cmd & 0xff;
 -      lengths[0] = 0x0; /* Header Length. Set to 0 for now. TODO */
 -      lengths[1] = length; /* Total length */
 -
 -      ret = spi_sync(devrec->spi, &msg);
 +      devrec->tx_hdr_buf[0] = cmd >> 8 & 0xff;
 +      devrec->tx_hdr_buf[1] = cmd & 0xff;
 +      devrec->tx_len_buf[0] = 0x0; /* Header Length. Set to 0 for now. TODO */
 +      devrec->tx_len_buf[1] = length; /* Total length */
 +      devrec->tx_buf_trx.tx_buf = data;
 +      devrec->tx_buf_trx.len = length;
 +
 +      ret = spi_async(devrec->spi, &devrec->tx_msg);
        if (ret)
                dev_err(printdev(devrec), "SPI write Failed for TX buf\n");
  
 -      mutex_unlock(&devrec->buffer_mutex);
 -      return ret;
 -}
 -
 -static int mrf24j40_read_rx_buf(struct mrf24j40 *devrec,
 -                              u8 *data, u8 *len, u8 *lqi)
 -{
 -      u8 rx_len;
 -      u8 addr[2];
 -      u8 lqi_rssi[2];
 -      u16 cmd;
 -      int ret;
 -      struct spi_message msg;
 -      struct spi_transfer addr_xfer = {
 -              .len = 2,
 -              .tx_buf = &addr,
 -      };
 -      struct spi_transfer data_xfer = {
 -              .len = 0x0, /* set below */
 -              .rx_buf = data,
 -      };
 -      struct spi_transfer status_xfer = {
 -              .len = 2,
 -              .rx_buf = &lqi_rssi,
 -      };
 -
 -      /* Get the length of the data in the RX FIFO. The length in this
 -       * register exclues the 1-byte length field at the beginning. */
 -      ret = read_long_reg(devrec, REG_RX_FIFO, &rx_len);
 -      if (ret)
 -              goto out;
 -
 -      /* Range check the RX FIFO length, accounting for the one-byte
 -       * length field at the beginning. */
 -      if (rx_len > RX_FIFO_SIZE-1) {
 -              dev_err(printdev(devrec), "Invalid length read from device. Performing short read.\n");
 -              rx_len = RX_FIFO_SIZE-1;
 -      }
 -
 -      if (rx_len > *len) {
 -              /* Passed in buffer wasn't big enough. Should never happen. */
 -              dev_err(printdev(devrec), "Buffer not big enough. Performing short read\n");
 -              rx_len = *len;
 -      }
 -
 -      /* Set up the commands to read the data. */
 -      cmd = MRF24J40_READLONG(REG_RX_FIFO+1);
 -      addr[0] = cmd >> 8 & 0xff;
 -      addr[1] = cmd & 0xff;
 -      data_xfer.len = rx_len;
 -
 -      spi_message_init(&msg);
 -      spi_message_add_tail(&addr_xfer, &msg);
 -      spi_message_add_tail(&data_xfer, &msg);
 -      spi_message_add_tail(&status_xfer, &msg);
 -
 -      ret = spi_sync(devrec->spi, &msg);
 -      if (ret) {
 -              dev_err(printdev(devrec), "SPI RX Buffer Read Failed.\n");
 -              goto out;
 -      }
 -
 -      *lqi = lqi_rssi[0];
 -      *len = rx_len;
 -
 -#ifdef DEBUG
 -      print_hex_dump(KERN_DEBUG, "mrf24j40 rx: ",
 -                     DUMP_PREFIX_OFFSET, 16, 1, data, *len, 0);
 -      pr_debug("mrf24j40 rx: lqi: %02hhx rssi: %02hhx\n",
 -               lqi_rssi[0], lqi_rssi[1]);
 -#endif
 -
 -out:
        return ret;
  }
  
  static int mrf24j40_tx(struct ieee802154_hw *hw, struct sk_buff *skb)
  {
        struct mrf24j40 *devrec = hw->priv;
 -      u8 val;
 -      int ret = 0;
  
        dev_dbg(printdev(devrec), "tx packet of %d bytes\n", skb->len);
 +      devrec->tx_skb = skb;
  
 -      ret = write_tx_buf(devrec, 0x000, skb->data, skb->len);
 -      if (ret)
 -              goto err;
 -
 -      reinit_completion(&devrec->tx_complete);
 -
 -      /* Set TXNTRIG bit of TXNCON to send packet */
 -      ret = read_short_reg(devrec, REG_TXNCON, &val);
 -      if (ret)
 -              goto err;
 -      val |= 0x1;
 -      /* Set TXNACKREQ if the ACK bit is set in the packet. */
 -      if (skb->data[0] & IEEE802154_FC_ACK_REQ)
 -              val |= 0x4;
 -      write_short_reg(devrec, REG_TXNCON, val);
 -
 -      /* Wait for the device to send the TX complete interrupt. */
 -      ret = wait_for_completion_interruptible_timeout(
 -                                              &devrec->tx_complete,
 -                                              5 * HZ);
 -      if (ret == -ERESTARTSYS)
 -              goto err;
 -      if (ret == 0) {
 -              dev_warn(printdev(devrec), "Timeout waiting for TX interrupt\n");
 -              ret = -ETIMEDOUT;
 -              goto err;
 -      }
 -
 -      /* Check for send error from the device. */
 -      ret = read_short_reg(devrec, REG_TXSTAT, &val);
 -      if (ret)
 -              goto err;
 -      if (val & 0x1) {
 -              dev_dbg(printdev(devrec), "Error Sending. Retry count exceeded\n");
 -              ret = -ECOMM; /* TODO: Better error code ? */
 -      } else
 -              dev_dbg(printdev(devrec), "Packet Sent\n");
 -
 -err:
 -
 -      return ret;
 +      return write_tx_buf(devrec, 0x000, skb->data, skb->len);
  }
  
  static int mrf24j40_ed(struct ieee802154_hw *hw, u8 *level)
  static int mrf24j40_start(struct ieee802154_hw *hw)
  {
        struct mrf24j40 *devrec = hw->priv;
 -      u8 val;
 -      int ret;
  
        dev_dbg(printdev(devrec), "start\n");
  
 -      ret = read_short_reg(devrec, REG_INTCON, &val);
 -      if (ret)
 -              return ret;
 -      val &= ~(0x1|0x8); /* Clear TXNIE and RXIE. Enable interrupts */
 -      write_short_reg(devrec, REG_INTCON, val);
 -
 -      return 0;
 +      /* Clear TXNIE and RXIE. Enable interrupts */
 +      return regmap_update_bits(devrec->regmap_short, REG_INTCON,
 +                                BIT_TXNIE | BIT_RXIE, 0);
  }
  
  static void mrf24j40_stop(struct ieee802154_hw *hw)
  {
        struct mrf24j40 *devrec = hw->priv;
 -      u8 val;
 -      int ret;
  
        dev_dbg(printdev(devrec), "stop\n");
  
 -      ret = read_short_reg(devrec, REG_INTCON, &val);
 -      if (ret)
 -              return;
 -      val |= 0x1|0x8; /* Set TXNIE and RXIE. Disable Interrupts */
 -      write_short_reg(devrec, REG_INTCON, val);
 +      /* Set TXNIE and RXIE. Disable Interrupts */
 +      regmap_update_bits(devrec->regmap_short, REG_INTCON,
 +                         BIT_TXNIE | BIT_TXNIE, BIT_TXNIE | BIT_TXNIE);
  }
  
  static int mrf24j40_set_channel(struct ieee802154_hw *hw, u8 page, u8 channel)
        WARN_ON(channel > MRF24J40_CHAN_MAX);
  
        /* Set Channel TODO */
 -      val = (channel-11) << 4 | 0x03;
 -      write_long_reg(devrec, REG_RFCON0, val);
 +      val = (channel - 11) << RFCON0_CH_SHIFT | RFOPT_RECOMMEND;
 +      ret = regmap_update_bits(devrec->regmap_long, REG_RFCON0,
 +                               RFCON0_CH_MASK, val);
 +      if (ret)
 +              return ret;
  
        /* RF Reset */
 -      ret = read_short_reg(devrec, REG_RFCTL, &val);
 +      ret = regmap_update_bits(devrec->regmap_short, REG_RFCTL, BIT_RFRST,
 +                               BIT_RFRST);
        if (ret)
                return ret;
 -      val |= 0x04;
 -      write_short_reg(devrec, REG_RFCTL, val);
 -      val &= ~0x04;
 -      write_short_reg(devrec, REG_RFCTL, val);
  
 -      udelay(SET_CHANNEL_DELAY_US); /* per datasheet */
 +      ret = regmap_update_bits(devrec->regmap_short, REG_RFCTL, BIT_RFRST, 0);
 +      if (!ret)
 +              udelay(SET_CHANNEL_DELAY_US); /* per datasheet */
  
 -      return 0;
 +      return ret;
  }
  
  static int mrf24j40_filter(struct ieee802154_hw *hw,
                addrh = le16_to_cpu(filt->short_addr) >> 8 & 0xff;
                addrl = le16_to_cpu(filt->short_addr) & 0xff;
  
 -              write_short_reg(devrec, REG_SADRH, addrh);
 -              write_short_reg(devrec, REG_SADRL, addrl);
 +              regmap_write(devrec->regmap_short, REG_SADRH, addrh);
 +              regmap_write(devrec->regmap_short, REG_SADRL, addrl);
                dev_dbg(printdev(devrec),
                        "Set short addr to %04hx\n", filt->short_addr);
        }
  
                memcpy(addr, &filt->ieee_addr, 8);
                for (i = 0; i < 8; i++)
 -                      write_short_reg(devrec, REG_EADR0 + i, addr[i]);
 +                      regmap_write(devrec->regmap_short, REG_EADR0 + i,
 +                                   addr[i]);
  
  #ifdef DEBUG
                pr_debug("Set long addr to: ");
  
                panidh = le16_to_cpu(filt->pan_id) >> 8 & 0xff;
                panidl = le16_to_cpu(filt->pan_id) & 0xff;
 -              write_short_reg(devrec, REG_PANIDH, panidh);
 -              write_short_reg(devrec, REG_PANIDL, panidl);
 +              regmap_write(devrec->regmap_short, REG_PANIDH, panidh);
 +              regmap_write(devrec->regmap_short, REG_PANIDL, panidl);
  
                dev_dbg(printdev(devrec), "Set PANID to %04hx\n", filt->pan_id);
        }
                u8 val;
                int ret;
  
 -              ret = read_short_reg(devrec, REG_RXMCR, &val);
 -              if (ret)
 -                      return ret;
                if (filt->pan_coord)
 -                      val |= 0x8;
 +                      val = BIT_PANCOORD;
                else
 -                      val &= ~0x8;
 -              write_short_reg(devrec, REG_RXMCR, val);
 +                      val = 0;
 +              ret = regmap_update_bits(devrec->regmap_short, REG_RXMCR,
 +                                       BIT_PANCOORD, val);
 +              if (ret)
 +                      return ret;
  
                /* REG_SLOTTED is maintained as default (unslotted/CSMA-CA).
                 * REG_ORDER is maintained as default (no beacon/superframe).
        return 0;
  }
  
 -static int mrf24j40_handle_rx(struct mrf24j40 *devrec)
 +static void mrf24j40_handle_rx_read_buf_unlock(struct mrf24j40 *devrec)
  {
 -      u8 len = RX_FIFO_SIZE;
 -      u8 lqi = 0;
 -      u8 val;
 -      int ret = 0;
 -      int ret2;
 -      struct sk_buff *skb;
 +      int ret;
  
 -      /* Turn off reception of packets off the air. This prevents the
 -       * device from overwriting the buffer while we're reading it. */
 -      ret = read_short_reg(devrec, REG_BBREG1, &val);
 +      /* Turn back on reception of packets off the air. */
 +      devrec->rx_msg.complete = NULL;
 +      devrec->rx_buf[0] = MRF24J40_WRITESHORT(REG_BBREG1);
 +      devrec->rx_buf[1] = 0x00; /* CLR RXDECINV */
 +      ret = spi_async(devrec->spi, &devrec->rx_msg);
        if (ret)
 -              goto out;
 -      val |= 4; /* SET RXDECINV */
 -      write_short_reg(devrec, REG_BBREG1, val);
 +              dev_err(printdev(devrec), "failed to unlock rx buffer\n");
 +}
 +
 +static void mrf24j40_handle_rx_read_buf_complete(void *context)
 +{
 +      struct mrf24j40 *devrec = context;
 +      u8 len = devrec->rx_buf[2];
 +      u8 rx_local_buf[RX_FIFO_SIZE];
 +      struct sk_buff *skb;
 +
 +      memcpy(rx_local_buf, devrec->rx_fifo_buf, len);
 +      mrf24j40_handle_rx_read_buf_unlock(devrec);
  
 -      skb = dev_alloc_skb(len);
 +      skb = dev_alloc_skb(IEEE802154_MTU);
        if (!skb) {
 -              ret = -ENOMEM;
 -              goto out;
 +              dev_err(printdev(devrec), "failed to allocate skb\n");
 +              return;
        }
  
 -      ret = mrf24j40_read_rx_buf(devrec, skb_put(skb, len), &len, &lqi);
 -      if (ret < 0) {
 -              dev_err(printdev(devrec), "Failure reading RX FIFO\n");
 -              kfree_skb(skb);
 -              ret = -EINVAL;
 -              goto out;
 +      memcpy(skb_put(skb, len), rx_local_buf, len);
 +      ieee802154_rx_irqsafe(devrec->hw, skb, 0);
 +
 +#ifdef DEBUG
 +       print_hex_dump(KERN_DEBUG, "mrf24j40 rx: ", DUMP_PREFIX_OFFSET, 16, 1,
 +                      rx_local_buf, len, 0);
 +       pr_debug("mrf24j40 rx: lqi: %02hhx rssi: %02hhx\n",
 +                devrec->rx_lqi_buf[0], devrec->rx_lqi_buf[1]);
 +#endif
 +}
 +
 +static void mrf24j40_handle_rx_read_buf(void *context)
 +{
 +      struct mrf24j40 *devrec = context;
 +      u16 cmd;
 +      int ret;
 +
 +      /* if length is invalid read the full MTU */
 +      if (!ieee802154_is_valid_psdu_len(devrec->rx_buf[2]))
 +              devrec->rx_buf[2] = IEEE802154_MTU;
 +
 +      cmd = MRF24J40_READLONG(REG_RX_FIFO + 1);
 +      devrec->rx_addr_buf[0] = cmd >> 8 & 0xff;
 +      devrec->rx_addr_buf[1] = cmd & 0xff;
 +      devrec->rx_fifo_buf_trx.len = devrec->rx_buf[2];
 +      ret = spi_async(devrec->spi, &devrec->rx_buf_msg);
 +      if (ret) {
 +              dev_err(printdev(devrec), "failed to read rx buffer\n");
 +              mrf24j40_handle_rx_read_buf_unlock(devrec);
        }
 +}
  
 -      /* Cut off the checksum */
 -      skb_trim(skb, len-2);
 +static void mrf24j40_handle_rx_read_len(void *context)
 +{
 +      struct mrf24j40 *devrec = context;
 +      u16 cmd;
 +      int ret;
  
 -      /* TODO: Other drivers call ieee20154_rx_irqsafe() here (eg: cc2040,
 -       * also from a workqueue).  I think irqsafe is not necessary here.
 -       * Can someone confirm? */
 -      ieee802154_rx_irqsafe(devrec->hw, skb, lqi);
 +      /* read the length of received frame */
 +      devrec->rx_msg.complete = mrf24j40_handle_rx_read_buf;
 +      devrec->rx_trx.len = 3;
 +      cmd = MRF24J40_READLONG(REG_RX_FIFO);
 +      devrec->rx_buf[0] = cmd >> 8 & 0xff;
 +      devrec->rx_buf[1] = cmd & 0xff;
  
 -      dev_dbg(printdev(devrec), "RX Handled\n");
 +      ret = spi_async(devrec->spi, &devrec->rx_msg);
 +      if (ret) {
 +              dev_err(printdev(devrec), "failed to read rx buffer length\n");
 +              mrf24j40_handle_rx_read_buf_unlock(devrec);
 +      }
 +}
  
 -out:
 -      /* Turn back on reception of packets off the air. */
 -      ret2 = read_short_reg(devrec, REG_BBREG1, &val);
 -      if (ret2)
 -              return ret2;
 -      val &= ~0x4; /* Clear RXDECINV */
 -      write_short_reg(devrec, REG_BBREG1, val);
 +static int mrf24j40_handle_rx(struct mrf24j40 *devrec)
 +{
 +      /* Turn off reception of packets off the air. This prevents the
 +       * device from overwriting the buffer while we're reading it.
 +       */
 +      devrec->rx_msg.complete = mrf24j40_handle_rx_read_len;
 +      devrec->rx_trx.len = 2;
 +      devrec->rx_buf[0] = MRF24J40_WRITESHORT(REG_BBREG1);
 +      devrec->rx_buf[1] = BIT_RXDECINV; /* SET RXDECINV */
 +
 +      return spi_async(devrec->spi, &devrec->rx_msg);
 +}
 +
 +static int
 +mrf24j40_csma_params(struct ieee802154_hw *hw, u8 min_be, u8 max_be,
 +                   u8 retries)
 +{
 +      struct mrf24j40 *devrec = hw->priv;
 +      u8 val;
 +
 +      /* min_be */
 +      val = min_be << TXMCR_MIN_BE_SHIFT;
 +      /* csma backoffs */
 +      val |= retries << TXMCR_CSMA_RETRIES_SHIFT;
 +
 +      return regmap_update_bits(devrec->regmap_short, REG_TXMCR,
 +                                TXMCR_MIN_BE_MASK | TXMCR_CSMA_RETRIES_MASK,
 +                                val);
 +}
 +
 +static int mrf24j40_set_cca_mode(struct ieee802154_hw *hw,
 +                               const struct wpan_phy_cca *cca)
 +{
 +      struct mrf24j40 *devrec = hw->priv;
 +      u8 val;
 +
 +      /* mapping 802.15.4 to driver spec */
 +      switch (cca->mode) {
 +      case NL802154_CCA_ENERGY:
 +              val = 2;
 +              break;
 +      case NL802154_CCA_CARRIER:
 +              val = 1;
 +              break;
 +      case NL802154_CCA_ENERGY_CARRIER:
 +              switch (cca->opt) {
 +              case NL802154_CCA_OPT_ENERGY_CARRIER_AND:
 +                      val = 3;
 +                      break;
 +              default:
 +                      return -EINVAL;
 +              }
 +              break;
 +      default:
 +              return -EINVAL;
 +      }
 +
 +      return regmap_update_bits(devrec->regmap_short, REG_BBREG2,
 +                                BBREG2_CCA_MODE_MASK,
 +                                val << BBREG2_CCA_MODE_SHIFT);
 +}
 +
 +/* array for representing ed levels */
 +static const s32 mrf24j40_ed_levels[] = {
 +      -9000, -8900, -8800, -8700, -8600, -8500, -8400, -8300, -8200, -8100,
 +      -8000, -7900, -7800, -7700, -7600, -7500, -7400, -7300, -7200, -7100,
 +      -7000, -6900, -6800, -6700, -6600, -6500, -6400, -6300, -6200, -6100,
 +      -6000, -5900, -5800, -5700, -5600, -5500, -5400, -5300, -5200, -5100,
 +      -5000, -4900, -4800, -4700, -4600, -4500, -4400, -4300, -4200, -4100,
 +      -4000, -3900, -3800, -3700, -3600, -3500
 +};
 +
 +/* map ed levels to register value */
 +static const s32 mrf24j40_ed_levels_map[][2] = {
 +      { -9000, 0 }, { -8900, 1 }, { -8800, 2 }, { -8700, 5 }, { -8600, 9 },
 +      { -8500, 13 }, { -8400, 18 }, { -8300, 23 }, { -8200, 27 },
 +      { -8100, 32 }, { -8000, 37 }, { -7900, 43 }, { -7800, 48 },
 +      { -7700, 53 }, { -7600, 58 }, { -7500, 63 }, { -7400, 68 },
 +      { -7300, 73 }, { -7200, 78 }, { -7100, 83 }, { -7000, 89 },
 +      { -6900, 95 }, { -6800, 100 }, { -6700, 107 }, { -6600, 111 },
 +      { -6500, 117 }, { -6400, 121 }, { -6300, 125 }, { -6200, 129 },
 +      { -6100, 133 }, { -6000, 138 }, { -5900, 143 }, { -5800, 148 },
 +      { -5700, 153 }, { -5600, 159 }, { -5500, 165 }, { -5400, 170 },
 +      { -5300, 176 }, { -5200, 183 }, { -5100, 188 }, { -5000, 193 },
 +      { -4900, 198 }, { -4800, 203 }, { -4700, 207 }, { -4600, 212 },
 +      { -4500, 216 }, { -4400, 221 }, { -4300, 225 }, { -4200, 228 },
 +      { -4100, 233 }, { -4000, 239 }, { -3900, 245 }, { -3800, 250 },
 +      { -3700, 253 }, { -3600, 254 }, { -3500, 255 },
 +};
 +
 +static int mrf24j40_set_cca_ed_level(struct ieee802154_hw *hw, s32 mbm)
 +{
 +      struct mrf24j40 *devrec = hw->priv;
 +      int i;
 +
 +      for (i = 0; i < ARRAY_SIZE(mrf24j40_ed_levels_map); i++) {
 +              if (mrf24j40_ed_levels_map[i][0] == mbm)
 +                      return regmap_write(devrec->regmap_short, REG_CCAEDTH,
 +                                          mrf24j40_ed_levels_map[i][1]);
 +      }
 +
 +      return -EINVAL;
 +}
 +
 +static const s32 mrf24j40ma_powers[] = {
 +      0, -50, -120, -190, -280, -370, -490, -630, -1000, -1050, -1120, -1190,
 +      -1280, -1370, -1490, -1630, -2000, -2050, -2120, -2190, -2280, -2370,
 +      -2490, -2630, -3000, -3050, -3120, -3190, -3280, -3370, -3490, -3630,
 +};
 +
 +static int mrf24j40_set_txpower(struct ieee802154_hw *hw, s32 mbm)
 +{
 +      struct mrf24j40 *devrec = hw->priv;
 +      s32 small_scale;
 +      u8 val;
 +
 +      if (0 >= mbm && mbm > -1000) {
 +              val = TXPWRL_0 << TXPWRL_SHIFT;
 +              small_scale = mbm;
 +      } else if (-1000 >= mbm && mbm > -2000) {
 +              val = TXPWRL_10 << TXPWRL_SHIFT;
 +              small_scale = mbm + 1000;
 +      } else if (-2000 >= mbm && mbm > -3000) {
 +              val = TXPWRL_20 << TXPWRL_SHIFT;
 +              small_scale = mbm + 2000;
 +      } else if (-3000 >= mbm && mbm > -4000) {
 +              val = TXPWRL_30 << TXPWRL_SHIFT;
 +              small_scale = mbm + 3000;
 +      } else {
 +              return -EINVAL;
 +      }
 +
 +      switch (small_scale) {
 +      case 0:
 +              val |= (TXPWRS_0 << TXPWRS_SHIFT);
 +              break;
 +      case -50:
 +              val |= (TXPWRS_0_5 << TXPWRS_SHIFT);
 +              break;
 +      case -120:
 +              val |= (TXPWRS_1_2 << TXPWRS_SHIFT);
 +              break;
 +      case -190:
 +              val |= (TXPWRS_1_9 << TXPWRS_SHIFT);
 +              break;
 +      case -280:
 +              val |= (TXPWRS_2_8 << TXPWRS_SHIFT);
 +              break;
 +      case -370:
 +              val |= (TXPWRS_3_7 << TXPWRS_SHIFT);
 +              break;
 +      case -490:
 +              val |= (TXPWRS_4_9 << TXPWRS_SHIFT);
 +              break;
 +      case -630:
 +              val |= (TXPWRS_6_3 << TXPWRS_SHIFT);
 +              break;
 +      default:
 +              return -EINVAL;
 +      }
 +
 +      return regmap_update_bits(devrec->regmap_long, REG_RFCON3,
 +                                TXPWRL_MASK | TXPWRS_MASK, val);
 +}
 +
 +static int mrf24j40_set_promiscuous_mode(struct ieee802154_hw *hw, bool on)
 +{
 +      struct mrf24j40 *devrec = hw->priv;
 +      int ret;
 +
 +      if (on) {
 +              /* set PROMI, ERRPKT and NOACKRSP */
 +              ret = regmap_update_bits(devrec->regmap_short, REG_RXMCR,
 +                                       BIT_PROMI | BIT_ERRPKT | BIT_NOACKRSP,
 +                                       BIT_PROMI | BIT_ERRPKT | BIT_NOACKRSP);
 +      } else {
 +              /* clear PROMI, ERRPKT and NOACKRSP */
 +              ret = regmap_update_bits(devrec->regmap_short, REG_RXMCR,
 +                                       BIT_PROMI | BIT_ERRPKT | BIT_NOACKRSP,
 +                                       0);
 +      }
  
        return ret;
  }
  
  static const struct ieee802154_ops mrf24j40_ops = {
        .owner = THIS_MODULE,
 -      .xmit_sync = mrf24j40_tx,
 +      .xmit_async = mrf24j40_tx,
        .ed = mrf24j40_ed,
        .start = mrf24j40_start,
        .stop = mrf24j40_stop,
        .set_channel = mrf24j40_set_channel,
        .set_hw_addr_filt = mrf24j40_filter,
 +      .set_csma_params = mrf24j40_csma_params,
 +      .set_cca_mode = mrf24j40_set_cca_mode,
 +      .set_cca_ed_level = mrf24j40_set_cca_ed_level,
 +      .set_txpower = mrf24j40_set_txpower,
 +      .set_promiscuous_mode = mrf24j40_set_promiscuous_mode,
  };
  
 -static irqreturn_t mrf24j40_isr(int irq, void *data)
 +static void mrf24j40_intstat_complete(void *context)
  {
 -      struct mrf24j40 *devrec = data;
 -      u8 intstat;
 -      int ret;
 +      struct mrf24j40 *devrec = context;
 +      u8 intstat = devrec->irq_buf[1];
  
 -      /* Read the interrupt status */
 -      ret = read_short_reg(devrec, REG_INTSTAT, &intstat);
 -      if (ret)
 -              goto out;
 +      enable_irq(devrec->spi->irq);
  
        /* Check for TX complete */
 -      if (intstat & 0x1)
 -              complete(&devrec->tx_complete);
 +      if (intstat & BIT_TXNIF)
 +              ieee802154_xmit_complete(devrec->hw, devrec->tx_skb, false);
  
        /* Check for Rx */
 -      if (intstat & 0x8)
 +      if (intstat & BIT_RXIF)
                mrf24j40_handle_rx(devrec);
 +}
 +
 +static irqreturn_t mrf24j40_isr(int irq, void *data)
 +{
 +      struct mrf24j40 *devrec = data;
 +      int ret;
 +
 +      disable_irq_nosync(irq);
 +
 +      devrec->irq_buf[0] = MRF24J40_READSHORT(REG_INTSTAT);
 +      /* Read the interrupt status */
 +      ret = spi_async(devrec->spi, &devrec->irq_msg);
 +      if (ret) {
 +              enable_irq(irq);
 +              return IRQ_NONE;
 +      }
  
 -out:
        return IRQ_HANDLED;
  }
  
  static int mrf24j40_hw_init(struct mrf24j40 *devrec)
  {
 +      u32 irq_type;
        int ret;
 -      u8 val;
  
        /* Initialize the device.
                From datasheet section 3.2: Initialization. */
 -      ret = write_short_reg(devrec, REG_SOFTRST, 0x07);
 +      ret = regmap_write(devrec->regmap_short, REG_SOFTRST, 0x07);
        if (ret)
                goto err_ret;
  
 -      ret = write_short_reg(devrec, REG_PACON2, 0x98);
 +      ret = regmap_write(devrec->regmap_short, REG_PACON2, 0x98);
        if (ret)
                goto err_ret;
  
 -      ret = write_short_reg(devrec, REG_TXSTBL, 0x95);
 +      ret = regmap_write(devrec->regmap_short, REG_TXSTBL, 0x95);
        if (ret)
                goto err_ret;
  
 -      ret = write_long_reg(devrec, REG_RFCON0, 0x03);
 +      ret = regmap_write(devrec->regmap_long, REG_RFCON0, 0x03);
        if (ret)
                goto err_ret;
  
 -      ret = write_long_reg(devrec, REG_RFCON1, 0x01);
 +      ret = regmap_write(devrec->regmap_long, REG_RFCON1, 0x01);
        if (ret)
                goto err_ret;
  
 -      ret = write_long_reg(devrec, REG_RFCON2, 0x80);
 +      ret = regmap_write(devrec->regmap_long, REG_RFCON2, 0x80);
        if (ret)
                goto err_ret;
  
 -      ret = write_long_reg(devrec, REG_RFCON6, 0x90);
 +      ret = regmap_write(devrec->regmap_long, REG_RFCON6, 0x90);
        if (ret)
                goto err_ret;
  
 -      ret = write_long_reg(devrec, REG_RFCON7, 0x80);
 +      ret = regmap_write(devrec->regmap_long, REG_RFCON7, 0x80);
        if (ret)
                goto err_ret;
  
 -      ret = write_long_reg(devrec, REG_RFCON8, 0x10);
 +      ret = regmap_write(devrec->regmap_long, REG_RFCON8, 0x10);
        if (ret)
                goto err_ret;
  
 -      ret = write_long_reg(devrec, REG_SLPCON1, 0x21);
 +      ret = regmap_write(devrec->regmap_long, REG_SLPCON1, 0x21);
        if (ret)
                goto err_ret;
  
 -      ret = write_short_reg(devrec, REG_BBREG2, 0x80);
 +      ret = regmap_write(devrec->regmap_short, REG_BBREG2, 0x80);
        if (ret)
                goto err_ret;
  
 -      ret = write_short_reg(devrec, REG_CCAEDTH, 0x60);
 +      ret = regmap_write(devrec->regmap_short, REG_CCAEDTH, 0x60);
        if (ret)
                goto err_ret;
  
 -      ret = write_short_reg(devrec, REG_BBREG6, 0x40);
 +      ret = regmap_write(devrec->regmap_short, REG_BBREG6, 0x40);
        if (ret)
                goto err_ret;
  
 -      ret = write_short_reg(devrec, REG_RFCTL, 0x04);
 +      ret = regmap_write(devrec->regmap_short, REG_RFCTL, 0x04);
        if (ret)
                goto err_ret;
  
 -      ret = write_short_reg(devrec, REG_RFCTL, 0x0);
 +      ret = regmap_write(devrec->regmap_short, REG_RFCTL, 0x0);
        if (ret)
                goto err_ret;
  
        udelay(192);
  
        /* Set RX Mode. RXMCR<1:0>: 0x0 normal, 0x1 promisc, 0x2 error */
 -      ret = read_short_reg(devrec, REG_RXMCR, &val);
 -      if (ret)
 -              goto err_ret;
 -
 -      val &= ~0x3; /* Clear RX mode (normal) */
 -
 -      ret = write_short_reg(devrec, REG_RXMCR, val);
 +      ret = regmap_update_bits(devrec->regmap_short, REG_RXMCR, 0x03, 0x00);
        if (ret)
                goto err_ret;
  
                /* Enable external amplifier.
                 * From MRF24J40MC datasheet section 1.3: Operation.
                 */
 -              read_long_reg(devrec, REG_TESTMODE, &val);
 -              val |= 0x7; /* Configure GPIO 0-2 to control amplifier */
 -              write_long_reg(devrec, REG_TESTMODE, val);
 +              regmap_update_bits(devrec->regmap_long, REG_TESTMODE, 0x07,
 +                                 0x07);
  
 -              read_short_reg(devrec, REG_TRISGPIO, &val);
 -              val |= 0x8; /* Set GPIO3 as output. */
 -              write_short_reg(devrec, REG_TRISGPIO, val);
 +              /* Set GPIO3 as output. */
 +              regmap_update_bits(devrec->regmap_short, REG_TRISGPIO, 0x08,
 +                                 0x08);
  
 -              read_short_reg(devrec, REG_GPIO, &val);
 -              val |= 0x8; /* Set GPIO3 HIGH to enable U5 voltage regulator */
 -              write_short_reg(devrec, REG_GPIO, val);
 +              /* Set GPIO3 HIGH to enable U5 voltage regulator */
 +              regmap_update_bits(devrec->regmap_short, REG_GPIO, 0x08, 0x08);
  
                /* Reduce TX pwr to meet FCC requirements.
                 * From MRF24J40MC datasheet section 3.1.1
                 */
 -              write_long_reg(devrec, REG_RFCON3, 0x28);
 +              regmap_write(devrec->regmap_long, REG_RFCON3, 0x28);
 +      }
 +
 +      irq_type = irq_get_trigger_type(devrec->spi->irq);
 +      if (irq_type == IRQ_TYPE_EDGE_RISING ||
 +          irq_type == IRQ_TYPE_EDGE_FALLING)
 +              dev_warn(&devrec->spi->dev,
 +                       "Using edge triggered irq's are not recommended, because it can cause races and result in a non-functional driver!\n");
 +      switch (irq_type) {
 +      case IRQ_TYPE_EDGE_RISING:
 +      case IRQ_TYPE_LEVEL_HIGH:
 +              /* set interrupt polarity to rising */
 +              ret = regmap_update_bits(devrec->regmap_long, REG_SLPCON0,
 +                                       BIT_INTEDGE, BIT_INTEDGE);
 +              if (ret)
 +                      goto err_ret;
 +              break;
 +      default:
 +              /* default is falling edge */
 +              break;
        }
  
        return 0;
@@@ -1170,178 -720,67 +1170,178 @@@ err_ret
        return ret;
  }
  
 -static int mrf24j40_probe(struct spi_device *spi)
 +static void
 +mrf24j40_setup_tx_spi_messages(struct mrf24j40 *devrec)
  {
 -      int ret = -ENOMEM;
 -      struct mrf24j40 *devrec;
 +      spi_message_init(&devrec->tx_msg);
 +      devrec->tx_msg.context = devrec;
 +      devrec->tx_msg.complete = write_tx_buf_complete;
 +      devrec->tx_hdr_trx.len = 2;
 +      devrec->tx_hdr_trx.tx_buf = devrec->tx_hdr_buf;
 +      spi_message_add_tail(&devrec->tx_hdr_trx, &devrec->tx_msg);
 +      devrec->tx_len_trx.len = 2;
 +      devrec->tx_len_trx.tx_buf = devrec->tx_len_buf;
 +      spi_message_add_tail(&devrec->tx_len_trx, &devrec->tx_msg);
 +      spi_message_add_tail(&devrec->tx_buf_trx, &devrec->tx_msg);
 +
 +      spi_message_init(&devrec->tx_post_msg);
 +      devrec->tx_post_msg.context = devrec;
 +      devrec->tx_post_trx.len = 2;
 +      devrec->tx_post_trx.tx_buf = devrec->tx_post_buf;
 +      spi_message_add_tail(&devrec->tx_post_trx, &devrec->tx_post_msg);
 +}
  
 -      dev_info(&spi->dev, "probe(). IRQ: %d\n", spi->irq);
 +static void
 +mrf24j40_setup_rx_spi_messages(struct mrf24j40 *devrec)
 +{
 +      spi_message_init(&devrec->rx_msg);
 +      devrec->rx_msg.context = devrec;
 +      devrec->rx_trx.len = 2;
 +      devrec->rx_trx.tx_buf = devrec->rx_buf;
 +      devrec->rx_trx.rx_buf = devrec->rx_buf;
 +      spi_message_add_tail(&devrec->rx_trx, &devrec->rx_msg);
 +
 +      spi_message_init(&devrec->rx_buf_msg);
 +      devrec->rx_buf_msg.context = devrec;
 +      devrec->rx_buf_msg.complete = mrf24j40_handle_rx_read_buf_complete;
 +      devrec->rx_addr_trx.len = 2;
 +      devrec->rx_addr_trx.tx_buf = devrec->rx_addr_buf;
 +      spi_message_add_tail(&devrec->rx_addr_trx, &devrec->rx_buf_msg);
 +      devrec->rx_fifo_buf_trx.rx_buf = devrec->rx_fifo_buf;
 +      spi_message_add_tail(&devrec->rx_fifo_buf_trx, &devrec->rx_buf_msg);
 +      devrec->rx_lqi_trx.len = 2;
 +      devrec->rx_lqi_trx.rx_buf = devrec->rx_lqi_buf;
 +      spi_message_add_tail(&devrec->rx_lqi_trx, &devrec->rx_buf_msg);
 +}
  
 -      devrec = devm_kzalloc(&spi->dev, sizeof(struct mrf24j40), GFP_KERNEL);
 -      if (!devrec)
 -              goto err_ret;
 -      devrec->buf = devm_kzalloc(&spi->dev, 3, GFP_KERNEL);
 -      if (!devrec->buf)
 -              goto err_ret;
 +static void
 +mrf24j40_setup_irq_spi_messages(struct mrf24j40 *devrec)
 +{
 +      spi_message_init(&devrec->irq_msg);
 +      devrec->irq_msg.context = devrec;
 +      devrec->irq_msg.complete = mrf24j40_intstat_complete;
 +      devrec->irq_trx.len = 2;
 +      devrec->irq_trx.tx_buf = devrec->irq_buf;
 +      devrec->irq_trx.rx_buf = devrec->irq_buf;
 +      spi_message_add_tail(&devrec->irq_trx, &devrec->irq_msg);
 +}
 +
 +static void  mrf24j40_phy_setup(struct mrf24j40 *devrec)
 +{
 +      ieee802154_random_extended_addr(&devrec->hw->phy->perm_extended_addr);
 +      devrec->hw->phy->current_channel = 11;
 +
 +      /* mrf24j40 supports max_minbe 0 - 3 */
 +      devrec->hw->phy->supported.max_minbe = 3;
 +      /* datasheet doesn't say anything about max_be, but we have min_be
 +       * So we assume the max_be default.
 +       */
 +      devrec->hw->phy->supported.min_maxbe = 5;
 +      devrec->hw->phy->supported.max_maxbe = 5;
 +
 +      devrec->hw->phy->cca.mode = NL802154_CCA_CARRIER;
 +      devrec->hw->phy->supported.cca_modes = BIT(NL802154_CCA_ENERGY) |
 +                                             BIT(NL802154_CCA_CARRIER) |
 +                                             BIT(NL802154_CCA_ENERGY_CARRIER);
 +      devrec->hw->phy->supported.cca_opts = BIT(NL802154_CCA_OPT_ENERGY_CARRIER_AND);
 +
 +      devrec->hw->phy->cca_ed_level = -6900;
 +      devrec->hw->phy->supported.cca_ed_levels = mrf24j40_ed_levels;
 +      devrec->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(mrf24j40_ed_levels);
 +
 +      switch (spi_get_device_id(devrec->spi)->driver_data) {
 +      case MRF24J40:
 +      case MRF24J40MA:
 +              devrec->hw->phy->supported.tx_powers = mrf24j40ma_powers;
 +              devrec->hw->phy->supported.tx_powers_size = ARRAY_SIZE(mrf24j40ma_powers);
 +              devrec->hw->phy->flags |= WPAN_PHY_FLAG_TXPOWER;
 +              break;
 +      default:
 +              break;
 +      }
 +}
  
 -      spi->mode = SPI_MODE_0; /* TODO: Is this appropriate for right here? */
 -      if (spi->max_speed_hz > MAX_SPI_SPEED_HZ)
 -              spi->max_speed_hz = MAX_SPI_SPEED_HZ;
 +static int mrf24j40_probe(struct spi_device *spi)
 +{
 +      int ret = -ENOMEM, irq_type;
 +      struct ieee802154_hw *hw;
 +      struct mrf24j40 *devrec;
  
 -      mutex_init(&devrec->buffer_mutex);
 -      init_completion(&devrec->tx_complete);
 -      devrec->spi = spi;
 -      spi_set_drvdata(spi, devrec);
 +      dev_info(&spi->dev, "probe(). IRQ: %d\n", spi->irq);
  
        /* Register with the 802154 subsystem */
  
 -      devrec->hw = ieee802154_alloc_hw(0, &mrf24j40_ops);
 -      if (!devrec->hw)
 +      hw = ieee802154_alloc_hw(sizeof(*devrec), &mrf24j40_ops);
 +      if (!hw)
                goto err_ret;
  
 -      devrec->hw->priv = devrec;
 -      devrec->hw->parent = &devrec->spi->dev;
 +      devrec = hw->priv;
 +      devrec->spi = spi;
 +      spi_set_drvdata(spi, devrec);
 +      devrec->hw = hw;
 +      devrec->hw->parent = &spi->dev;
        devrec->hw->phy->supported.channels[0] = CHANNEL_MASK;
 -      devrec->hw->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AFILT;
 +      devrec->hw->flags = IEEE802154_HW_TX_OMIT_CKSUM | IEEE802154_HW_AFILT |
 +                          IEEE802154_HW_CSMA_PARAMS |
 +                          IEEE802154_HW_PROMISCUOUS;
 +
 +      devrec->hw->phy->flags = WPAN_PHY_FLAG_CCA_MODE |
 +                               WPAN_PHY_FLAG_CCA_ED_LEVEL;
 +
 +      mrf24j40_setup_tx_spi_messages(devrec);
 +      mrf24j40_setup_rx_spi_messages(devrec);
 +      mrf24j40_setup_irq_spi_messages(devrec);
 +
 +      devrec->regmap_short = devm_regmap_init_spi(spi,
 +                                                  &mrf24j40_short_regmap);
 +      if (IS_ERR(devrec->regmap_short)) {
 +              ret = PTR_ERR(devrec->regmap_short);
 +              dev_err(&spi->dev, "Failed to allocate short register map: %d\n",
 +                      ret);
 +              goto err_register_device;
 +      }
  
 -      dev_dbg(printdev(devrec), "registered mrf24j40\n");
 -      ret = ieee802154_register_hw(devrec->hw);
 -      if (ret)
 +      devrec->regmap_long = devm_regmap_init(&spi->dev,
 +                                             &mrf24j40_long_regmap_bus,
 +                                             spi, &mrf24j40_long_regmap);
 +      if (IS_ERR(devrec->regmap_long)) {
 +              ret = PTR_ERR(devrec->regmap_long);
 +              dev_err(&spi->dev, "Failed to allocate long register map: %d\n",
 +                      ret);
                goto err_register_device;
 +      }
 +
 +      if (spi->max_speed_hz > MAX_SPI_SPEED_HZ) {
 +              dev_warn(&spi->dev, "spi clock above possible maximum: %d",
 +                       MAX_SPI_SPEED_HZ);
 +              return -EINVAL;
 +      }
  
        ret = mrf24j40_hw_init(devrec);
        if (ret)
 -              goto err_hw_init;
 +              goto err_register_device;
  
 -      ret = devm_request_threaded_irq(&spi->dev,
 -                                      spi->irq,
 -                                      NULL,
 -                                      mrf24j40_isr,
 -                                      IRQF_TRIGGER_LOW|IRQF_ONESHOT,
 -                                      dev_name(&spi->dev),
 -                                      devrec);
 +      mrf24j40_phy_setup(devrec);
  
 +      /* request IRQF_TRIGGER_LOW as fallback default */
 +      irq_type = irq_get_trigger_type(spi->irq);
 +      if (!irq_type)
 +              irq_type = IRQF_TRIGGER_LOW;
 +
 +      ret = devm_request_irq(&spi->dev, spi->irq, mrf24j40_isr,
 +                             irq_type, dev_name(&spi->dev), devrec);
        if (ret) {
                dev_err(printdev(devrec), "Unable to get IRQ");
 -              goto err_irq;
 +              goto err_register_device;
        }
  
 +      dev_dbg(printdev(devrec), "registered mrf24j40\n");
 +      ret = ieee802154_register_hw(devrec->hw);
 +      if (ret)
 +              goto err_register_device;
 +
        return 0;
  
 -err_irq:
 -err_hw_init:
 -      ieee802154_unregister_hw(devrec->hw);
  err_register_device:
        ieee802154_free_hw(devrec->hw);
  err_ret:
@@@ -1362,14 -801,6 +1362,14 @@@ static int mrf24j40_remove(struct spi_d
        return 0;
  }
  
 +static const struct of_device_id mrf24j40_of_match[] = {
 +      { .compatible = "microchip,mrf24j40", .data = (void *)MRF24J40 },
 +      { .compatible = "microchip,mrf24j40ma", .data = (void *)MRF24J40MA },
 +      { .compatible = "microchip,mrf24j40mc", .data = (void *)MRF24J40MC },
 +      { },
 +};
 +MODULE_DEVICE_TABLE(of, mrf24j40_of_match);
 +
  static const struct spi_device_id mrf24j40_ids[] = {
        { "mrf24j40", MRF24J40 },
        { "mrf24j40ma", MRF24J40MA },
@@@ -1380,9 -811,7 +1380,8 @@@ MODULE_DEVICE_TABLE(spi, mrf24j40_ids)
  
  static struct spi_driver mrf24j40_driver = {
        .driver = {
 +              .of_match_table = of_match_ptr(mrf24j40_of_match),
                .name = "mrf24j40",
-               .owner = THIS_MODULE,
        },
        .id_table = mrf24j40_ids,
        .probe = mrf24j40_probe,
diff --combined drivers/nfc/st-nci/spi.c
index cf7ad8121e1139b9c14376fbf2afaf113ab00cf3,2bb5851eef41cee9350f875ec504592c448765fc..d6519bb9dba5100dd8a8fdb199b318d479247cab
  #include <linux/interrupt.h>
  #include <linux/delay.h>
  #include <linux/nfc.h>
 +#include <net/nfc/nci.h>
  #include <linux/platform_data/st-nci.h>
  
 -#include "ndlc.h"
 +#include "st-nci.h"
  
  #define DRIVER_DESC "NCI NFC driver for ST_NCI"
  
@@@ -51,13 -50,16 +51,13 @@@ struct st_nci_spi_phy 
        struct spi_device *spi_dev;
        struct llt_ndlc *ndlc;
  
 +      bool irq_active;
 +
        unsigned int gpio_reset;
        unsigned int irq_polarity;
 -};
  
 -#define SPI_DUMP_SKB(info, skb)                                       \
 -do {                                                          \
 -      pr_debug("%s:\n", info);                                \
 -      print_hex_dump(KERN_DEBUG, "spi: ", DUMP_PREFIX_OFFSET, \
 -                     16, 1, (skb)->data, (skb)->len, 0);      \
 -} while (0)
 +      struct st_nci_se_status se_status;
 +};
  
  static int st_nci_spi_enable(void *phy_id)
  {
        gpio_set_value(phy->gpio_reset, 1);
        usleep_range(80000, 85000);
  
 -      if (phy->ndlc->powered == 0)
 +      if (phy->ndlc->powered == 0 && phy->irq_active == 0) {
                enable_irq(phy->spi_dev->irq);
 +              phy->irq_active = true;
 +      }
  
        return 0;
  }
@@@ -81,7 -81,6 +81,7 @@@ static void st_nci_spi_disable(void *ph
        struct st_nci_spi_phy *phy = phy_id;
  
        disable_irq_nosync(phy->spi_dev->irq);
 +      phy->irq_active = false;
  }
  
  /*
@@@ -95,14 -94,15 +95,14 @@@ static int st_nci_spi_write(void *phy_i
        struct st_nci_spi_phy *phy = phy_id;
        struct spi_device *dev = phy->spi_dev;
        struct sk_buff *skb_rx;
 -      u8 buf[ST_NCI_SPI_MAX_SIZE];
 +      u8 buf[ST_NCI_SPI_MAX_SIZE + NCI_DATA_HDR_SIZE +
 +             ST_NCI_FRAME_HEADROOM + ST_NCI_FRAME_TAILROOM];
        struct spi_transfer spi_xfer = {
                .tx_buf = skb->data,
                .rx_buf = buf,
                .len = skb->len,
        };
  
 -      SPI_DUMP_SKB("st_nci_spi_write", skb);
 -
        if (phy->ndlc->hard_fault != 0)
                return phy->ndlc->hard_fault;
  
@@@ -179,6 -179,8 +179,6 @@@ static int st_nci_spi_read(struct st_nc
        skb_put(*skb, len);
        memcpy((*skb)->data + ST_NCI_SPI_MIN_SIZE, buf, len);
  
 -      SPI_DUMP_SKB("spi frame read", *skb);
 -
        return 0;
  }
  
@@@ -256,11 -258,6 +256,11 @@@ static int st_nci_spi_of_request_resour
  
        phy->irq_polarity = irq_get_trigger_type(dev->irq);
  
 +      phy->se_status.is_ese_present =
 +                              of_property_read_bool(pp, "ese-present");
 +      phy->se_status.is_uicc_present =
 +                              of_property_read_bool(pp, "uicc-present");
 +
        return 0;
  }
  #else
@@@ -293,9 -290,6 +293,9 @@@ static int st_nci_spi_request_resources
                return r;
        }
  
 +      phy->se_status.is_ese_present = pdata->is_ese_present;
 +      phy->se_status.is_uicc_present = pdata->is_uicc_present;
 +
        return 0;
  }
  
@@@ -346,13 -340,12 +346,13 @@@ static int st_nci_spi_probe(struct spi_
  
        r = ndlc_probe(phy, &spi_phy_ops, &dev->dev,
                        ST_NCI_FRAME_HEADROOM, ST_NCI_FRAME_TAILROOM,
 -                      &phy->ndlc);
 +                      &phy->ndlc, &phy->se_status);
        if (r < 0) {
                nfc_err(&dev->dev, "Unable to register ndlc layer\n");
                return r;
        }
  
 +      phy->irq_active = true;
        r = devm_request_threaded_irq(&dev->dev, dev->irq, NULL,
                                st_nci_irq_thread_fn,
                                phy->irq_polarity | IRQF_ONESHOT,
@@@ -384,7 -377,6 +384,6 @@@ MODULE_DEVICE_TABLE(of, of_st_nci_spi_m
  
  static struct spi_driver st_nci_spi_driver = {
        .driver = {
-               .owner = THIS_MODULE,
                .name = ST_NCI_SPI_DRIVER_NAME,
                .of_match_table = of_match_ptr(of_st_nci_spi_match),
        },
diff --combined drivers/nfc/trf7970a.c
index 123aa981c9d87844932b769cd3949ef6a1416a4c,4036788c78b6edda97d00e83240b77d82958d8c2..f857feb2b573e7bb98e008f44527ed762d82b7a8
@@@ -2211,12 -2211,6 +2211,12 @@@ static const struct dev_pm_ops trf7970a
                        trf7970a_pm_runtime_resume, NULL)
  };
  
 +static const struct of_device_id trf7970a_of_match[] = {
 +      { .compatible = "ti,trf7970a", },
 +      { /* sentinel */ },
 +};
 +MODULE_DEVICE_TABLE(of, trf7970a_of_match);
 +
  static const struct spi_device_id trf7970a_id_table[] = {
        { "trf7970a", 0 },
        { }
@@@ -2229,8 -2223,6 +2229,7 @@@ static struct spi_driver trf7970a_spi_d
        .id_table       = trf7970a_id_table,
        .driver         = {
                .name   = "trf7970a",
-               .owner  = THIS_MODULE,
 +              .of_match_table = of_match_ptr(trf7970a_of_match),
                .pm     = &trf7970a_pm_ops,
        },
  };
index 20e69f0b5cb047cc810a5aaf284bdcd2a1358160,0d27daf23228adaeee72dac0027ebd2194f77d9c..3ccdec94fee74e60be8652f53bc6043d52cd5432
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
 - *
 - * You should have received a copy of the GNU General Public License
 - * along with this program; if not, write to the Free Software
 - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */
  
  #ifndef __LINUX_FBTFT_H
@@@ -20,6 -24,7 +20,6 @@@
  #include <linux/spi/spi.h>
  #include <linux/platform_device.h>
  
 -
  #define FBTFT_NOP             0x00
  #define FBTFT_SWRESET 0x01
  #define FBTFT_RDDID           0x04
@@@ -246,7 -251,7 +246,7 @@@ struct fbtft_par 
        } gamma;
        unsigned long debug;
        bool first_update_done;
 -      struct timespec update_time;
 +      ktime_t update_time;
        bool bgr;
        void *extra;
  };
@@@ -290,6 -295,7 +290,6 @@@ void fbtft_write_reg8_bus9(struct fbtft
  void fbtft_write_reg16_bus8(struct fbtft_par *par, int len, ...);
  void fbtft_write_reg16_bus16(struct fbtft_par *par, int len, ...);
  
 -
  #define FBTFT_REGISTER_DRIVER(_name, _compatible, _display)                \
                                                                           \
  static int fbtft_driver_probe_spi(struct spi_device *spi)                  \
@@@ -327,7 -333,6 +327,6 @@@ MODULE_DEVICE_TABLE(of, dt_ids)
  static struct spi_driver fbtft_driver_spi_driver = {                       \
        .driver = {                                                        \
                .name   = _name,                                           \
-               .owner  = THIS_MODULE,                                     \
                .of_match_table = of_match_ptr(dt_ids),                    \
        },                                                                 \
        .probe  = fbtft_driver_probe_spi,                                  \
@@@ -363,6 -368,7 +362,6 @@@ static void __exit fbtft_driver_module_
  module_init(fbtft_driver_module_init);                                     \
  module_exit(fbtft_driver_module_exit);
  
 -
  /* Debug macros */
  
  /* shorthand debug levels */
  #define DEBUG_REQUEST_GPIOS_MATCH   (1<<30)
  #define DEBUG_VERIFY_GPIOS          (1<<31)
  
 -
  #define fbtft_init_dbg(dev, format, arg...)                  \
  do {                                                         \
        if (unlikely((dev)->platform_data &&                 \
@@@ -421,6 -428,7 +420,6 @@@ do 
                dev_info(par->info->device, format, ##arg);  \
  } while (0)
  
 -
  #define fbtft_par_dbg_hex(level, par, dev, type, buf, num, format, arg...) \
  do {                                                                       \
        if (unlikely(par->debug & level))                                  \
index 704b78c78f1390fc9f40083e3e3ecaddbc672580,86d9223e4e0c273abbe195ab44b5d5c96591733f..ce0d254148e4d8a8e3498ef33b68f5313e16ecf8
@@@ -233,6 -233,8 +233,6 @@@ static const struct flexfb_lcd_controll
  static void flexfb_set_addr_win_1(struct fbtft_par *par,
                                  int xs, int ys, int xe, int ye)
  {
 -      fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par, "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n",
 -                    __func__, xs, ys, xe, ye);
        switch (par->info->var.rotate) {
        /* R20h = Horizontal GRAM Start Address */
        /* R21h = Vertical GRAM Start Address */
  static void flexfb_set_addr_win_2(struct fbtft_par *par,
                                  int xs, int ys, int xe, int ye)
  {
 -      fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
 -                    "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n",
 -                    __func__, xs, ys, xe, ye);
 -
        switch (par->info->var.rotate) {
        /* R4Eh - Set GDDRAM X address counter */
        /* R4Fh - Set GDDRAM Y address counter */
  static void set_addr_win_3(struct fbtft_par *par,
                           int xs, int ys, int xe, int ye)
  {
 -      fbtft_par_dbg(DEBUG_SET_ADDR_WIN, par,
 -                    "%s(xs=%d, ys=%d, xe=%d, ye=%d)\n", __func__,
 -                    xs, ys, xe, ye);
 -
        write_reg(par, 0x15, xs, xe);
        write_reg(par, 0x75, ys, ye);
        write_reg(par, 0x5C);
@@@ -573,7 -583,6 +573,6 @@@ static int flexfb_remove_pdev(struct pl
  static struct spi_driver flexfb_spi_driver = {
        .driver = {
                .name   = DRVNAME,
-               .owner  = THIS_MODULE,
        },
        .probe  = flexfb_probe_spi,
        .remove = flexfb_remove_spi,
index 7a1939a66c935766469b6d6d257ffbad53ce526c,24d90b35d669898bf39522405397f9a6fb6796c9..7939ae6378d7876efc1bd162a7185878fb365616
@@@ -406,10 -406,8 +406,10 @@@ static int lis3l02dq_initial_setup(stru
                goto err_ret;
        }
  
 -      /* Read back to check this has worked acts as loose test of correct
 -       * chip */
 +      /*
 +       * Read back to check this has worked acts as loose test of correct
 +       * chip
 +       */
        ret = lis3l02dq_spi_read_reg_8(indio_dev,
                                       LIS3L02DQ_REG_CTRL_1_ADDR,
                                       &valtest);
@@@ -567,7 -565,7 +567,7 @@@ static int lis3l02dq_read_event_config(
  {
        u8 val;
        int ret;
 -      u8 mask = (1 << (chan->channel2*2 + (dir == IIO_EV_DIR_RISING)));
 +      u8 mask = (1 << (chan->channel2 * 2 + (dir == IIO_EV_DIR_RISING)));
  
        ret = lis3l02dq_spi_read_reg_8(indio_dev,
                                       LIS3L02DQ_REG_WAKE_UP_CFG_ADDR,
@@@ -622,7 -620,7 +622,7 @@@ static int lis3l02dq_write_event_config
        u8 val, control;
        u8 currentlyset;
        bool changed = false;
 -      u8 mask = (1 << (chan->channel2*2 + (dir == IIO_EV_DIR_RISING)));
 +      u8 mask = (1 << (chan->channel2 * 2 + (dir == IIO_EV_DIR_RISING)));
  
        mutex_lock(&indio_dev->mlock);
        /* read current control */
@@@ -802,7 -800,6 +802,6 @@@ static int lis3l02dq_remove(struct spi_
  static struct spi_driver lis3l02dq_driver = {
        .driver = {
                .name = "lis3l02dq",
-               .owner = THIS_MODULE,
        },
        .probe = lis3l02dq_probe,
        .remove = lis3l02dq_remove,
index 03cb22508a5d157ebfa0e404ca319458db98a818,fda646246215c2c3180610c59c86a6f286f9838d..02e930c55570237817e24c629b3f7df11fbd1fdd
@@@ -88,7 -88,7 +88,7 @@@ int sca3000_write_reg(struct sca3000_st
  }
  
  int sca3000_read_data_short(struct sca3000_state *st,
 -                          uint8_t reg_address_high,
 +                          u8 reg_address_high,
                            int len)
  {
        struct spi_transfer xfer[2] = {
@@@ -165,9 -165,10 +165,9 @@@ static int __sca3000_unlock_reg_lock(st
   * Lock must be held.
   **/
  static int sca3000_write_ctrl_reg(struct sca3000_state *st,
 -                                uint8_t sel,
 +                                u8 sel,
                                  uint8_t val)
  {
 -
        int ret;
  
        ret = sca3000_reg_lock_on(st);
@@@ -373,6 -374,7 +373,6 @@@ error_ret
        return ret;
  }
  
 -
  /*
   * Not even vaguely standard attributes so defined here rather than
   * in the relevant IIO core headers
@@@ -469,13 -471,12 +469,13 @@@ static int sca3000_read_raw(struct iio_
                                return ret;
                        }
                        *val = (be16_to_cpup((__be16 *)st->rx) >> 3) & 0x1FFF;
 -                      *val = ((*val) << (sizeof(*val)*8 - 13)) >>
 -                              (sizeof(*val)*8 - 13);
 +                      *val = ((*val) << (sizeof(*val) * 8 - 13)) >>
 +                              (sizeof(*val) * 8 - 13);
                } else {
                        /* get the temperature when available */
                        ret = sca3000_read_data_short(st,
 -                              SCA3000_REG_ADDR_TEMP_MSB, 2);
 +                                                    SCA3000_REG_ADDR_TEMP_MSB,
 +                                                    2);
                        if (ret < 0) {
                                mutex_unlock(&st->lock);
                                return ret;
   * at all.
   **/
  static ssize_t sca3000_read_av_freq(struct device *dev,
 -                           struct device_attribute *attr,
 -                           char *buf)
 +                                  struct device_attribute *attr,
 +                                  char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct sca3000_state *st = iio_priv(indio_dev);
        case SCA3000_MEAS_MODE_NORMAL:
                len += sprintf(buf + len, "%d %d %d\n",
                               st->info->measurement_mode_freq,
 -                             st->info->measurement_mode_freq/2,
 -                             st->info->measurement_mode_freq/4);
 +                             st->info->measurement_mode_freq / 2,
 +                             st->info->measurement_mode_freq / 4);
                break;
        case SCA3000_MEAS_MODE_OP_1:
                len += sprintf(buf + len, "%d %d %d\n",
                               st->info->option_mode_1_freq,
 -                             st->info->option_mode_1_freq/2,
 -                             st->info->option_mode_1_freq/4);
 +                             st->info->option_mode_1_freq / 2,
 +                             st->info->option_mode_1_freq / 4);
                break;
        case SCA3000_MEAS_MODE_OP_2:
                len += sprintf(buf + len, "%d %d %d\n",
                               st->info->option_mode_2_freq,
 -                             st->info->option_mode_2_freq/2,
 -                             st->info->option_mode_2_freq/4);
 +                             st->info->option_mode_2_freq / 2,
 +                             st->info->option_mode_2_freq / 4);
                break;
        }
        return len;
  error_ret:
        return ret;
  }
 +
  /**
   * __sca3000_get_base_freq() obtain mode specific base frequency
   *
@@@ -582,8 -582,8 +582,8 @@@ error_ret
   * sca3000_read_frequency() sysfs interface to get the current frequency
   **/
  static ssize_t sca3000_read_frequency(struct device *dev,
 -                             struct device_attribute *attr,
 -                             char *buf)
 +                                    struct device_attribute *attr,
 +                                    char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct sca3000_state *st = iio_priv(indio_dev);
                        len = sprintf(buf, "%d\n", base_freq);
                        break;
                case 0x01:
 -                      len = sprintf(buf, "%d\n", base_freq/2);
 +                      len = sprintf(buf, "%d\n", base_freq / 2);
                        break;
                case 0x02:
 -                      len = sprintf(buf, "%d\n", base_freq/4);
 +                      len = sprintf(buf, "%d\n", base_freq / 4);
                        break;
        }
  
@@@ -623,9 -623,9 +623,9 @@@ error_ret
   * sca3000_set_frequency() sysfs interface to set the current frequency
   **/
  static ssize_t sca3000_set_frequency(struct device *dev,
 -                            struct device_attribute *attr,
 -                            const char *buf,
 -                            size_t len)
 +                                   struct device_attribute *attr,
 +                                   const char *buf,
 +                                   size_t len)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct sca3000_state *st = iio_priv(indio_dev);
        /* clear the bits */
        ctrlval &= ~0x03;
  
 -      if (val == base_freq/2) {
 +      if (val == base_freq / 2) {
                ctrlval |= SCA3000_OUT_CTRL_BUF_DIV_2;
 -      } else if (val == base_freq/4) {
 +      } else if (val == base_freq / 4) {
                ctrlval |= SCA3000_OUT_CTRL_BUF_DIV_4;
        } else if (val != base_freq) {
                ret = -EINVAL;
@@@ -849,9 -849,9 +849,9 @@@ static int sca3000_read_event_config(st
        if (ret)
                goto error_ret;
  
 -      if ((st->rx[0] & protect_mask) != SCA3000_MEAS_MODE_MOT_DET)
 +      if ((st->rx[0] & protect_mask) != SCA3000_MEAS_MODE_MOT_DET) {
                ret = 0;
 -      else {
 +      else {
                ret = sca3000_read_ctrl_reg(st, SCA3000_REG_CTRL_SEL_MD_CTRL);
                if (ret < 0)
                        goto error_ret;
@@@ -863,7 -863,6 +863,7 @@@ error_ret
  
        return ret;
  }
 +
  /**
   * sca3000_query_free_fall_mode() is free fall mode enabled
   **/
@@@ -980,14 -979,14 +980,14 @@@ static int sca3000_write_event_config(s
        if (ret)
                goto exit_point;
        /* if off and should be on */
 -      if ((st->mo_det_use_count)
 -          && ((st->rx[0] & protect_mask) != SCA3000_MEAS_MODE_MOT_DET))
 +      if ((st->mo_det_use_count) &&
 +          ((st->rx[0] & protect_mask) != SCA3000_MEAS_MODE_MOT_DET))
                ret = sca3000_write_reg(st, SCA3000_REG_ADDR_MODE,
                                        (st->rx[0] & ~protect_mask)
                                        | SCA3000_MEAS_MODE_MOT_DET);
        /* if on and should be off */
 -      else if (!(st->mo_det_use_count)
 -               && ((st->rx[0] & protect_mask) == SCA3000_MEAS_MODE_MOT_DET))
 +      else if (!(st->mo_det_use_count) &&
 +               ((st->rx[0] & protect_mask) == SCA3000_MEAS_MODE_MOT_DET))
                ret = sca3000_write_reg(st, SCA3000_REG_ADDR_MODE,
                                        (st->rx[0] & ~protect_mask));
  exit_point:
  
  /* Free fall detector related event attribute */
  static IIO_DEVICE_ATTR_NAMED(accel_xayaz_mag_falling_en,
 -                           in_accel_x&y&z_mag_falling_en,
 +                           in_accel_x & y & z_mag_falling_en,
                             S_IRUGO | S_IWUSR,
                             sca3000_query_free_fall_mode,
                             sca3000_set_free_fall_mode,
                             0);
  
  static IIO_CONST_ATTR_NAMED(accel_xayaz_mag_falling_period,
 -                          in_accel_x&y&z_mag_falling_period,
 +                          in_accel_x & y & z_mag_falling_period,
                            "0.226");
  
  static struct attribute *sca3000_event_attributes[] = {
@@@ -1197,7 -1196,6 +1197,6 @@@ MODULE_DEVICE_TABLE(spi, sca3000_id)
  static struct spi_driver sca3000_driver = {
        .driver = {
                .name = "sca3000",
-               .owner = THIS_MODULE,
        },
        .probe = sca3000_probe,
        .remove = sca3000_remove,
index 5b87049cd3f96345462607b13f65c088e8b0b860,a3b76559a4f02d03f06da581078bb5d351927f62..bb40f37287426c4855a70b0b19b124802a52c284
@@@ -88,6 -88,7 +88,6 @@@
  #define AD7192_CLK_INT_CO             3 /* Internal 4.92 MHz Clock available
                                           * at the MCLK2 pin */
  
 -
  /* Configuration Register Bit Designations (AD7192_REG_CONF) */
  
  #define AD7192_CONF_CHOP      BIT(23) /* CHOP enable */
  #define AD7192_GPOCON_P1DAT   BIT(1) /* P1 state */
  #define AD7192_GPOCON_P0DAT   BIT(0) /* P0 state */
  
 -#define AD7192_INT_FREQ_MHz   4915200
 +#define AD7192_INT_FREQ_MHZ   4915200
  
  /* NOTE:
   * The AD7190/2/5 features a dual use data out ready DOUT/RDY output.
@@@ -200,7 -201,7 +200,7 @@@ static int ad7192_calibrate_all(struct 
  }
  
  static int ad7192_setup(struct ad7192_state *st,
 -      const struct ad7192_platform_data *pdata)
 +                      const struct ad7192_platform_data *pdata)
  {
        struct iio_dev *indio_dev = spi_get_drvdata(st->sd.spi);
        unsigned long long scale_uv;
  
        if (id != st->devid)
                dev_warn(&st->sd.spi->dev, "device ID query failed (0x%X)\n",
 -                      id);
 +                       id);
  
        switch (pdata->clock_source_sel) {
        case AD7192_CLK_EXT_MCLK1_2:
        case AD7192_CLK_EXT_MCLK2:
 -              st->mclk = AD7192_INT_FREQ_MHz;
 +              st->mclk = AD7192_INT_FREQ_MHZ;
                break;
        case AD7192_CLK_INT:
        case AD7192_CLK_INT_CO:
 -              if (pdata->ext_clk_Hz)
 -                      st->mclk = pdata->ext_clk_Hz;
 +              if (pdata->ext_clk_hz)
 +                      st->mclk = pdata->ext_clk_hz;
                else
 -                      st->mclk = AD7192_INT_FREQ_MHz;
 +                      st->mclk = AD7192_INT_FREQ_MHZ;
                        break;
        default:
                ret = -EINVAL;
@@@ -306,8 -307,8 +306,8 @@@ out
  }
  
  static ssize_t ad7192_read_frequency(struct device *dev,
 -              struct device_attribute *attr,
 -              char *buf)
 +                                   struct device_attribute *attr,
 +                                   char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7192_state *st = iio_priv(indio_dev);
  }
  
  static ssize_t ad7192_write_frequency(struct device *dev,
 -              struct device_attribute *attr,
 -              const char *buf,
 -              size_t len)
 +                                    struct device_attribute *attr,
 +                                    const char *buf,
 +                                    size_t len)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7192_state *st = iio_priv(indio_dev);
@@@ -358,9 -359,8 +358,9 @@@ static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR 
                ad7192_read_frequency,
                ad7192_write_frequency);
  
 -static ssize_t ad7192_show_scale_available(struct device *dev,
 -                      struct device_attribute *attr, char *buf)
 +static ssize_t
 +ad7192_show_scale_available(struct device *dev,
 +                          struct device_attribute *attr, char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7192_state *st = iio_priv(indio_dev);
@@@ -383,8 -383,8 +383,8 @@@ static IIO_DEVICE_ATTR(in_voltage_scale
                       ad7192_show_scale_available, NULL, 0);
  
  static ssize_t ad7192_show_ac_excitation(struct device *dev,
 -              struct device_attribute *attr,
 -              char *buf)
 +                                       struct device_attribute *attr,
 +                                       char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7192_state *st = iio_priv(indio_dev);
  }
  
  static ssize_t ad7192_show_bridge_switch(struct device *dev,
 -              struct device_attribute *attr,
 -              char *buf)
 +                                       struct device_attribute *attr,
 +                                       char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7192_state *st = iio_priv(indio_dev);
  }
  
  static ssize_t ad7192_set(struct device *dev,
 -              struct device_attribute *attr,
 -              const char *buf,
 -              size_t len)
 +                        struct device_attribute *attr,
 +                        const char *buf,
 +                        size_t len)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7192_state *st = iio_priv(indio_dev);
                return -EBUSY;
        }
  
 -      switch ((u32) this_attr->address) {
 +      switch ((u32)this_attr->address) {
        case AD7192_REG_GPOCON:
                if (val)
                        st->gpocon |= AD7192_GPOCON_BPDSW;
@@@ -529,10 -529,10 +529,10 @@@ static int ad7192_read_raw(struct iio_d
  }
  
  static int ad7192_write_raw(struct iio_dev *indio_dev,
 -                             struct iio_chan_spec const *chan,
 -                             int val,
 -                             int val2,
 -                             long mask)
 +                          struct iio_chan_spec const *chan,
 +                          int val,
 +                          int val2,
 +                          long mask)
  {
        struct ad7192_state *st = iio_priv(indio_dev);
        int ret, i;
                                if (tmp == st->conf)
                                        break;
                                ad_sd_write_reg(&st->sd, AD7192_REG_CONF,
 -                                               3, st->conf);
 +                                              3, st->conf);
                                ad7192_calibrate_all(st);
                                break;
                        }
  }
  
  static int ad7192_write_raw_get_fmt(struct iio_dev *indio_dev,
 -                             struct iio_chan_spec const *chan,
 -                             long mask)
 +                                  struct iio_chan_spec const *chan,
 +                                  long mask)
  {
        return IIO_VAL_INT_PLUS_NANO;
  }
@@@ -625,7 -625,7 +625,7 @@@ static int ad7192_probe(struct spi_devi
        }
  
        indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
 -      if (indio_dev == NULL)
 +      if (!indio_dev)
                return -ENOMEM;
  
        st = iio_priv(indio_dev);
                voltage_uv = regulator_get_voltage(st->reg);
        }
  
 -      if (pdata && pdata->vref_mv)
 +      if (pdata->vref_mv)
                st->int_vref_mv = pdata->vref_mv;
        else if (voltage_uv)
                st->int_vref_mv = voltage_uv / 1000;
@@@ -707,7 -707,6 +707,6 @@@ MODULE_DEVICE_TABLE(spi, ad7192_id)
  static struct spi_driver ad7192_driver = {
        .driver = {
                .name   = "ad7192",
-               .owner  = THIS_MODULE,
        },
        .probe          = ad7192_probe,
        .remove         = ad7192_remove,
index 45df714cc83af352f3bd85082360a8f3a26b0426,8a7c8737adc4d1cd2c0589cab9fed297241ce6aa..35acb1a4669b30b1cbe0fc565ab3a797b4dc04ae
@@@ -89,7 -89,7 +89,7 @@@
  
  #define AD7280A_ALL_CELLS                             (0xAD << 16)
  
 -#define AD7280A_MAX_SPI_CLK_Hz                700000 /* < 1MHz */
 +#define AD7280A_MAX_SPI_CLK_HZ                700000 /* < 1MHz */
  #define AD7280A_MAX_CHAIN             8
  #define AD7280A_CELLS_PER_DEV         6
  #define AD7280A_BITS                  12
@@@ -224,24 -224,24 +224,24 @@@ static int ad7280_write(struct ad7280_s
  }
  
  static int ad7280_read(struct ad7280_state *st, unsigned devaddr,
 -                      unsigned addr)
 +                     unsigned addr)
  {
        int ret;
        unsigned tmp;
  
        /* turns off the read operation on all parts */
        ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CONTROL_HB, 1,
 -                      AD7280A_CTRL_HB_CONV_INPUT_ALL |
 -                      AD7280A_CTRL_HB_CONV_RES_READ_NO |
 -                      st->ctrl_hb);
 +                         AD7280A_CTRL_HB_CONV_INPUT_ALL |
 +                         AD7280A_CTRL_HB_CONV_RES_READ_NO |
 +                         st->ctrl_hb);
        if (ret)
                return ret;
  
        /* turns on the read operation on the addressed part */
        ret = ad7280_write(st, devaddr, AD7280A_CONTROL_HB, 0,
 -                      AD7280A_CTRL_HB_CONV_INPUT_ALL |
 -                      AD7280A_CTRL_HB_CONV_RES_READ_ALL |
 -                      st->ctrl_hb);
 +                         AD7280A_CTRL_HB_CONV_INPUT_ALL |
 +                         AD7280A_CTRL_HB_CONV_RES_READ_ALL |
 +                         st->ctrl_hb);
        if (ret)
                return ret;
  
@@@ -272,17 -272,17 +272,17 @@@ static int ad7280_read_channel(struct a
                return ret;
  
        ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CONTROL_HB, 1,
 -                      AD7280A_CTRL_HB_CONV_INPUT_ALL |
 -                      AD7280A_CTRL_HB_CONV_RES_READ_NO |
 -                      st->ctrl_hb);
 +                         AD7280A_CTRL_HB_CONV_INPUT_ALL |
 +                         AD7280A_CTRL_HB_CONV_RES_READ_NO |
 +                         st->ctrl_hb);
        if (ret)
                return ret;
  
        ret = ad7280_write(st, devaddr, AD7280A_CONTROL_HB, 0,
 -                      AD7280A_CTRL_HB_CONV_INPUT_ALL |
 -                      AD7280A_CTRL_HB_CONV_RES_READ_ALL |
 -                      AD7280A_CTRL_HB_CONV_START_CS |
 -                      st->ctrl_hb);
 +                         AD7280A_CTRL_HB_CONV_INPUT_ALL |
 +                         AD7280A_CTRL_HB_CONV_RES_READ_ALL |
 +                         AD7280A_CTRL_HB_CONV_START_CS |
 +                         st->ctrl_hb);
        if (ret)
                return ret;
  
  }
  
  static int ad7280_read_all_channels(struct ad7280_state *st, unsigned cnt,
 -                           unsigned *array)
 +                                  unsigned *array)
  {
        int i, ret;
        unsigned tmp, sum = 0;
                return ret;
  
        ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CONTROL_HB, 1,
 -                      AD7280A_CTRL_HB_CONV_INPUT_ALL |
 -                      AD7280A_CTRL_HB_CONV_RES_READ_ALL |
 -                      AD7280A_CTRL_HB_CONV_START_CS |
 -                      st->ctrl_hb);
 +                         AD7280A_CTRL_HB_CONV_INPUT_ALL |
 +                         AD7280A_CTRL_HB_CONV_RES_READ_ALL |
 +                         AD7280A_CTRL_HB_CONV_START_CS |
 +                         st->ctrl_hb);
        if (ret)
                return ret;
  
@@@ -342,24 -342,24 +342,24 @@@ static int ad7280_chain_setup(struct ad
        int ret;
  
        ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CONTROL_LB, 1,
 -                      AD7280A_CTRL_LB_DAISY_CHAIN_RB_EN |
 -                      AD7280A_CTRL_LB_LOCK_DEV_ADDR |
 -                      AD7280A_CTRL_LB_MUST_SET |
 -                      AD7280A_CTRL_LB_SWRST |
 -                      st->ctrl_lb);
 +                         AD7280A_CTRL_LB_DAISY_CHAIN_RB_EN |
 +                         AD7280A_CTRL_LB_LOCK_DEV_ADDR |
 +                         AD7280A_CTRL_LB_MUST_SET |
 +                         AD7280A_CTRL_LB_SWRST |
 +                         st->ctrl_lb);
        if (ret)
                return ret;
  
        ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CONTROL_LB, 1,
 -                      AD7280A_CTRL_LB_DAISY_CHAIN_RB_EN |
 -                      AD7280A_CTRL_LB_LOCK_DEV_ADDR |
 -                      AD7280A_CTRL_LB_MUST_SET |
 -                      st->ctrl_lb);
 +                         AD7280A_CTRL_LB_DAISY_CHAIN_RB_EN |
 +                         AD7280A_CTRL_LB_LOCK_DEV_ADDR |
 +                         AD7280A_CTRL_LB_MUST_SET |
 +                         st->ctrl_lb);
        if (ret)
                return ret;
  
        ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_READ, 1,
 -                      AD7280A_CONTROL_LB << 2);
 +                         AD7280A_CONTROL_LB << 2);
        if (ret)
                return ret;
  
  }
  
  static ssize_t ad7280_show_balance_sw(struct device *dev,
 -                                      struct device_attribute *attr,
 -                                      char *buf)
 +                                    struct device_attribute *attr,
 +                                    char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7280_state *st = iio_priv(indio_dev);
  }
  
  static ssize_t ad7280_store_balance_sw(struct device *dev,
 -                                       struct device_attribute *attr,
 -                                       const char *buf,
 -                                       size_t len)
 +                                     struct device_attribute *attr,
 +                                     const char *buf,
 +                                     size_t len)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7280_state *st = iio_priv(indio_dev);
  }
  
  static ssize_t ad7280_show_balance_timer(struct device *dev,
 -                                      struct device_attribute *attr,
 -                                      char *buf)
 +                                       struct device_attribute *attr,
 +                                       char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7280_state *st = iio_priv(indio_dev);
  
        mutex_lock(&indio_dev->mlock);
        ret = ad7280_read(st, this_attr->address >> 8,
 -                      this_attr->address & 0xFF);
 +                        this_attr->address & 0xFF);
        mutex_unlock(&indio_dev->mlock);
  
        if (ret < 0)
  }
  
  static ssize_t ad7280_store_balance_timer(struct device *dev,
 -                                       struct device_attribute *attr,
 -                                       const char *buf,
 -                                       size_t len)
 +                                        struct device_attribute *attr,
 +                                        const char *buf,
 +                                        size_t len)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7280_state *st = iio_priv(indio_dev);
@@@ -488,12 -488,12 +488,12 @@@ static int ad7280_channel_init(struct a
  
        st->channels = kcalloc((st->slave_num + 1) * 12 + 2,
                               sizeof(*st->channels), GFP_KERNEL);
 -      if (st->channels == NULL)
 +      if (!st->channels)
                return -ENOMEM;
  
        for (dev = 0, cnt = 0; dev <= st->slave_num; dev++)
 -              for (ch = AD7280A_CELL_VOLTAGE_1; ch <= AD7280A_AUX_ADC_6; ch++,
 -                      cnt++) {
 +              for (ch = AD7280A_CELL_VOLTAGE_1; ch <= AD7280A_AUX_ADC_6;
 +                      ch++, cnt++) {
                        if (ch < AD7280A_AUX_ADC_1) {
                                st->channels[cnt].type = IIO_VOLTAGE;
                                st->channels[cnt].differential = 1;
@@@ -550,7 -550,7 +550,7 @@@ static int ad7280_attr_init(struct ad72
        st->iio_attr = kcalloc(2, sizeof(*st->iio_attr) *
                               (st->slave_num + 1) * AD7280A_CELLS_PER_DEV,
                               GFP_KERNEL);
 -      if (st->iio_attr == NULL)
 +      if (!st->iio_attr)
                return -ENOMEM;
  
        for (dev = 0, cnt = 0; dev <= st->slave_num; dev++)
                                ad7280_store_balance_sw;
                        st->iio_attr[cnt].dev_attr.attr.name =
                                kasprintf(GFP_KERNEL,
 -                                      "in%d-in%d_balance_switch_en",
 -                                      (dev * AD7280A_CELLS_PER_DEV) + ch,
 -                                      (dev * AD7280A_CELLS_PER_DEV) + ch + 1);
 +                                        "in%d-in%d_balance_switch_en",
 +                                        dev * AD7280A_CELLS_PER_DEV + ch,
 +                                        dev * AD7280A_CELLS_PER_DEV + ch + 1);
                        ad7280_attributes[cnt] =
                                &st->iio_attr[cnt].dev_attr.attr;
                        cnt++;
                        st->iio_attr[cnt].dev_attr.store =
                                ad7280_store_balance_timer;
                        st->iio_attr[cnt].dev_attr.attr.name =
 -                              kasprintf(GFP_KERNEL, "in%d-in%d_balance_timer",
 -                                      (dev * AD7280A_CELLS_PER_DEV) + ch,
 -                                      (dev * AD7280A_CELLS_PER_DEV) + ch + 1);
 +                              kasprintf(GFP_KERNEL,
 +                                        "in%d-in%d_balance_timer",
 +                                        dev * AD7280A_CELLS_PER_DEV + ch,
 +                                        dev * AD7280A_CELLS_PER_DEV + ch + 1);
                        ad7280_attributes[cnt] =
                                &st->iio_attr[cnt].dev_attr.attr;
                }
  }
  
  static ssize_t ad7280_read_channel_config(struct device *dev,
 -                                      struct device_attribute *attr,
 -                                      char *buf)
 +                                        struct device_attribute *attr,
 +                                        char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7280_state *st = iio_priv(indio_dev);
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
        unsigned val;
  
 -      switch ((u32) this_attr->address) {
 +      switch ((u32)this_attr->address) {
        case AD7280A_CELL_OVERVOLTAGE:
                val = 1000 + (st->cell_threshhigh * 1568) / 100;
                break;
  }
  
  static ssize_t ad7280_write_channel_config(struct device *dev,
 -                                       struct device_attribute *attr,
 -                                       const char *buf,
 -                                       size_t len)
 +                                         struct device_attribute *attr,
 +                                         const char *buf,
 +                                         size_t len)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7280_state *st = iio_priv(indio_dev);
        if (ret)
                return ret;
  
 -      switch ((u32) this_attr->address) {
 +      switch ((u32)this_attr->address) {
        case AD7280A_CELL_OVERVOLTAGE:
        case AD7280A_CELL_UNDERVOLTAGE:
                val = ((val - 1000) * 100) / 1568; /* LSB 15.68mV */
        val = clamp(val, 0L, 0xFFL);
  
        mutex_lock(&indio_dev->mlock);
 -      switch ((u32) this_attr->address) {
 +      switch ((u32)this_attr->address) {
        case AD7280A_CELL_OVERVOLTAGE:
                st->cell_threshhigh = val;
                break;
@@@ -687,7 -686,7 +687,7 @@@ static irqreturn_t ad7280_event_handler
        int i, ret;
  
        channels = kcalloc(st->scan_cnt, sizeof(*channels), GFP_KERNEL);
 -      if (channels == NULL)
 +      if (!channels)
                return IRQ_HANDLED;
  
        ret = ad7280_read_all_channels(st, st->scan_cnt, channels);
                        if (((channels[i] >> 11) & 0xFFF) >=
                                st->cell_threshhigh)
                                iio_push_event(indio_dev,
 -                                      IIO_EVENT_CODE(IIO_VOLTAGE,
 -                                                     1,
 -                                                     0,
 -                                                     IIO_EV_DIR_RISING,
 -                                                     IIO_EV_TYPE_THRESH,
 -                                                     0, 0, 0),
 -                                      iio_get_time_ns());
 +                                             IIO_EVENT_CODE(IIO_VOLTAGE,
 +                                                      1,
 +                                                      0,
 +                                                      IIO_EV_DIR_RISING,
 +                                                      IIO_EV_TYPE_THRESH,
 +                                                      0, 0, 0),
 +                                             iio_get_time_ns());
                        else if (((channels[i] >> 11) & 0xFFF) <=
                                st->cell_threshlow)
                                iio_push_event(indio_dev,
 -                                      IIO_EVENT_CODE(IIO_VOLTAGE,
 -                                                     1,
 -                                                     0,
 -                                                     IIO_EV_DIR_FALLING,
 -                                                     IIO_EV_TYPE_THRESH,
 -                                                     0, 0, 0),
 -                                      iio_get_time_ns());
 +                                             IIO_EVENT_CODE(IIO_VOLTAGE,
 +                                                      1,
 +                                                      0,
 +                                                      IIO_EV_DIR_FALLING,
 +                                                      IIO_EV_TYPE_THRESH,
 +                                                      0, 0, 0),
 +                                             iio_get_time_ns());
                } else {
                        if (((channels[i] >> 11) & 0xFFF) >= st->aux_threshhigh)
                                iio_push_event(indio_dev,
 -                                      IIO_UNMOD_EVENT_CODE(IIO_TEMP,
 -                                      0,
 -                                      IIO_EV_TYPE_THRESH,
 -                                      IIO_EV_DIR_RISING),
 -                                      iio_get_time_ns());
 +                                             IIO_UNMOD_EVENT_CODE(
 +                                                      IIO_TEMP,
 +                                                      0,
 +                                                      IIO_EV_TYPE_THRESH,
 +                                                      IIO_EV_DIR_RISING),
 +                                             iio_get_time_ns());
                        else if (((channels[i] >> 11) & 0xFFF) <=
                                st->aux_threshlow)
                                iio_push_event(indio_dev,
 -                                      IIO_UNMOD_EVENT_CODE(IIO_TEMP,
 -                                      0,
 -                                      IIO_EV_TYPE_THRESH,
 -                                      IIO_EV_DIR_FALLING),
 -                                      iio_get_time_ns());
 +                                             IIO_UNMOD_EVENT_CODE(
 +                                                      IIO_TEMP,
 +                                                      0,
 +                                                      IIO_EV_TYPE_THRESH,
 +                                                      IIO_EV_DIR_FALLING),
 +                                             iio_get_time_ns());
                }
        }
  
@@@ -769,6 -766,7 +769,6 @@@ static IIO_DEVICE_ATTR(in_temp_thresh_h
                ad7280_write_channel_config,
                AD7280A_AUX_ADC_OVERVOLTAGE);
  
 -
  static struct attribute *ad7280_event_attributes[] = {
        &iio_dev_attr_in_thresh_low_value.dev_attr.attr,
        &iio_dev_attr_in_thresh_high_value.dev_attr.attr,
@@@ -819,7 -817,7 +819,7 @@@ static int ad7280_read_raw(struct iio_d
  }
  
  static const struct iio_info ad7280_info = {
 -      .read_raw = &ad7280_read_raw,
 +      .read_raw = ad7280_read_raw,
        .event_attrs = &ad7280_event_attrs_group,
        .attrs = &ad7280_attrs_group,
        .driver_module = THIS_MODULE,
@@@ -841,7 -839,7 +841,7 @@@ static int ad7280_probe(struct spi_devi
        struct iio_dev *indio_dev;
  
        indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
 -      if (indio_dev == NULL)
 +      if (!indio_dev)
                return -ENOMEM;
  
        st = iio_priv(indio_dev);
  
        ad7280_crc8_build_table(st->crc_tab);
  
 -      st->spi->max_speed_hz = AD7280A_MAX_SPI_CLK_Hz;
 +      st->spi->max_speed_hz = AD7280A_MAX_SPI_CLK_HZ;
        st->spi->mode = SPI_MODE_1;
        spi_setup(st->spi);
  
@@@ -957,7 -955,7 +957,7 @@@ static int ad7280_remove(struct spi_dev
        iio_device_unregister(indio_dev);
  
        ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CONTROL_HB, 1,
 -                      AD7280A_CTRL_HB_PWRDN_SW | st->ctrl_hb);
 +                   AD7280A_CTRL_HB_PWRDN_SW | st->ctrl_hb);
  
        kfree(st->channels);
        kfree(st->iio_attr);
@@@ -974,7 -972,6 +974,6 @@@ MODULE_DEVICE_TABLE(spi, ad7280_id)
  static struct spi_driver ad7280_driver = {
        .driver = {
                .name   = "ad7280",
-               .owner  = THIS_MODULE,
        },
        .probe          = ad7280_probe,
        .remove         = ad7280_remove,
index b88f8825797d20643b3704f38cbbdf28fe2be727,06b59cbca4438e1f43b466277457a8d7a17719e2..cbb36317200e28ca6cb50a85467c03587875f997
@@@ -44,8 -44,8 +44,8 @@@ static int ad7606_spi_probe(struct spi_
        struct iio_dev *indio_dev;
  
        indio_dev = ad7606_probe(&spi->dev, spi->irq, NULL,
 -                         spi_get_device_id(spi)->driver_data,
 -                         &ad7606_spi_bops);
 +                               spi_get_device_id(spi)->driver_data,
 +                               &ad7606_spi_bops);
  
        if (IS_ERR(indio_dev))
                return PTR_ERR(indio_dev);
@@@ -85,7 -85,6 +85,7 @@@ static const struct dev_pm_ops ad7606_p
        .suspend = ad7606_spi_suspend,
        .resume  = ad7606_spi_resume,
  };
 +
  #define AD7606_SPI_PM_OPS (&ad7606_pm_ops)
  
  #else
@@@ -103,7 -102,6 +103,6 @@@ MODULE_DEVICE_TABLE(spi, ad7606_id)
  static struct spi_driver ad7606_driver = {
        .driver = {
                .name = "ad7606",
-               .owner = THIS_MODULE,
                .pm    = AD7606_SPI_PM_OPS,
        },
        .probe = ad7606_spi_probe,
index 618b41faa289a54eedd73bba17329075a5eacbe4,b76dd15427f5affb5795c539e004ff79398b3640..3abc7789237f7220945e3df0df0b9f837e7d0c88
@@@ -62,7 -62,7 +62,7 @@@ static struct ad7780_state *ad_sigma_de
  }
  
  static int ad7780_set_mode(struct ad_sigma_delta *sigma_delta,
 -      enum ad_sigma_delta_mode mode)
 +                         enum ad_sigma_delta_mode mode)
  {
        struct ad7780_state *st = ad_sigma_delta_to_ad7780(sigma_delta);
        unsigned val;
@@@ -107,13 -107,13 +107,13 @@@ static int ad7780_read_raw(struct iio_d
  }
  
  static int ad7780_postprocess_sample(struct ad_sigma_delta *sigma_delta,
 -      unsigned int raw_sample)
 +                                   unsigned int raw_sample)
  {
        struct ad7780_state *st = ad_sigma_delta_to_ad7780(sigma_delta);
        const struct ad7780_chip_info *chip_info = st->chip_info;
  
        if ((raw_sample & AD7780_ERR) ||
 -              ((raw_sample & chip_info->pattern_mask) != chip_info->pattern))
 +          ((raw_sample & chip_info->pattern_mask) != chip_info->pattern))
                return -EIO;
  
        if (raw_sample & AD7780_GAIN)
@@@ -206,10 -206,9 +206,10 @@@ static int ad7780_probe(struct spi_devi
        indio_dev->info = &ad7780_info;
  
        if (pdata && gpio_is_valid(pdata->gpio_pdrst)) {
 -
 -              ret = devm_gpio_request_one(&spi->dev, 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;
@@@ -264,7 -263,6 +264,6 @@@ MODULE_DEVICE_TABLE(spi, ad7780_id)
  static struct spi_driver ad7780_driver = {
        .driver = {
                .name   = "ad7780",
-               .owner  = THIS_MODULE,
        },
        .probe          = ad7780_probe,
        .remove         = ad7780_remove,
index ccec57c5f70d6235c2621610750c65e352def949,f3bbb38cdbe48d4d6d75a38513a18e68a76d536e..c8e15664652856a331938398bffc597b4a8f0b14
@@@ -38,6 -38,7 +38,6 @@@
  #define AD7816_TEMP_FLOAT_OFFSET      2
  #define AD7816_TEMP_FLOAT_MASK                0x3
  
 -
  /*
   * struct ad7816_chip_info - chip specific information
   */
@@@ -47,7 -48,7 +47,7 @@@ struct ad7816_chip_info 
        u16 rdwr_pin;
        u16 convert_pin;
        u16 busy_pin;
 -      u8  oti_data[AD7816_CS_MAX+1];
 +      u8  oti_data[AD7816_CS_MAX + 1];
        u8  channel_id; /* 0 always be temperature */
        u8  mode;
  };
@@@ -59,7 -60,6 +59,7 @@@ static int ad7816_spi_read(struct ad781
  {
        struct spi_device *spi_dev = chip->spi_dev;
        int ret = 0;
 +      __be16 buf;
  
        gpio_set_value(chip->rdwr_pin, 1);
        gpio_set_value(chip->rdwr_pin, 0);
@@@ -70,6 -70,7 +70,6 @@@
        }
        gpio_set_value(chip->rdwr_pin, 1);
  
 -
        if (chip->mode == AD7816_PD) { /* operating mode 2 */
                gpio_set_value(chip->convert_pin, 1);
                gpio_set_value(chip->convert_pin, 0);
  
        gpio_set_value(chip->rdwr_pin, 0);
        gpio_set_value(chip->rdwr_pin, 1);
 -      ret = spi_read(spi_dev, (u8 *)data, sizeof(*data));
 +      ret = spi_read(spi_dev, &buf, sizeof(*data));
        if (ret < 0) {
                dev_err(&spi_dev->dev, "SPI data read error\n");
                return ret;
        }
  
 -      *data = be16_to_cpu(*data);
 +      *data = be16_to_cpu(buf);
  
        return ret;
  }
@@@ -109,8 -110,8 +109,8 @@@ static int ad7816_spi_write(struct ad78
  }
  
  static ssize_t ad7816_show_mode(struct device *dev,
 -              struct device_attribute *attr,
 -              char *buf)
 +                              struct device_attribute *attr,
 +                              char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7816_chip_info *chip = iio_priv(indio_dev);
  }
  
  static ssize_t ad7816_store_mode(struct device *dev,
 -              struct device_attribute *attr,
 -              const char *buf,
 -              size_t len)
 +                               struct device_attribute *attr,
 +                               const char *buf,
 +                               size_t len)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7816_chip_info *chip = iio_priv(indio_dev);
@@@ -145,8 -146,8 +145,8 @@@ static IIO_DEVICE_ATTR(mode, S_IRUGO | 
                0);
  
  static ssize_t ad7816_show_available_modes(struct device *dev,
 -              struct device_attribute *attr,
 -              char *buf)
 +                                         struct device_attribute *attr,
 +                                         char *buf)
  {
        return sprintf(buf, "full\npower-save\n");
  }
@@@ -155,8 -156,8 +155,8 @@@ static IIO_DEVICE_ATTR(available_modes
                        NULL, 0);
  
  static ssize_t ad7816_show_channel(struct device *dev,
 -              struct device_attribute *attr,
 -              char *buf)
 +                                 struct device_attribute *attr,
 +                                 char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7816_chip_info *chip = iio_priv(indio_dev);
  }
  
  static ssize_t ad7816_store_channel(struct device *dev,
 -              struct device_attribute *attr,
 -              const char *buf,
 -              size_t len)
 +                                  struct device_attribute *attr,
 +                                  const char *buf,
 +                                  size_t len)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7816_chip_info *chip = iio_priv(indio_dev);
@@@ -202,9 -203,10 +202,9 @@@ static IIO_DEVICE_ATTR(channel, S_IRUG
                ad7816_store_channel,
                0);
  
 -
  static ssize_t ad7816_show_value(struct device *dev,
 -              struct device_attribute *attr,
 -              char *buf)
 +                               struct device_attribute *attr,
 +                               char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7816_chip_info *chip = iio_priv(indio_dev);
@@@ -258,8 -260,8 +258,8 @@@ static irqreturn_t ad7816_event_handler
  }
  
  static ssize_t ad7816_show_oti(struct device *dev,
 -              struct device_attribute *attr,
 -              char *buf)
 +                             struct device_attribute *attr,
 +                             char *buf)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7816_chip_info *chip = iio_priv(indio_dev);
  }
  
  static inline ssize_t ad7816_set_oti(struct device *dev,
 -              struct device_attribute *attr,
 -              const char *buf,
 -              size_t len)
 +                                   struct device_attribute *attr,
 +                                   const char *buf,
 +                                   size_t len)
  {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct ad7816_chip_info *chip = iio_priv(indio_dev);
                return -EINVAL;
        } else if (chip->channel_id == 0) {
                if (ret || value < AD7816_BOUND_VALUE_MIN ||
 -                      value > AD7816_BOUND_VALUE_MAX)
 +                  value > AD7816_BOUND_VALUE_MAX)
                        return -EINVAL;
  
                data = (u8)(value - AD7816_BOUND_VALUE_MIN +
@@@ -369,7 -371,7 +369,7 @@@ static int ad7816_probe(struct spi_devi
        chip->busy_pin = pins[2];
  
        ret = devm_gpio_request(&spi_dev->dev, chip->rdwr_pin,
 -                                      spi_get_device_id(spi_dev)->name);
 +                              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);
        }
        gpio_direction_input(chip->rdwr_pin);
        ret = devm_gpio_request(&spi_dev->dev, chip->convert_pin,
 -                                      spi_get_device_id(spi_dev)->name);
 +                              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);
        }
        gpio_direction_input(chip->convert_pin);
        ret = devm_gpio_request(&spi_dev->dev, chip->busy_pin,
 -                                      spi_get_device_id(spi_dev)->name);
 +                              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);
                return ret;
  
        dev_info(&spi_dev->dev, "%s temperature sensor and ADC registered.\n",
 -                       indio_dev->name);
 +               indio_dev->name);
  
        return 0;
  }
@@@ -432,7 -434,6 +432,6 @@@ MODULE_DEVICE_TABLE(spi, ad7816_id)
  static struct spi_driver ad7816_driver = {
        .driver = {
                .name = "ad7816",
-               .owner = THIS_MODULE,
        },
        .probe = ad7816_probe,
        .id_table = ad7816_id,
index fcffe2c1168512b5ae1c747ffe247c57d4713874,15f0cc3b4d3172bb6127b29c4527d9a5c9fa4503..6464f2cbe94b556f2738c39f874574262019ea9a
@@@ -111,7 -111,7 +111,7 @@@ static ssize_t ad9834_write(struct devi
                break;
        case AD9834_FSEL:
        case AD9834_PSEL:
 -              if (val == 0) {
 +              if (!val) {
                        st->control &= ~(this_attr->address | AD9834_PIN_SW);
                } else if (val == 1) {
                        st->control |= this_attr->address;
@@@ -446,7 -446,6 +446,6 @@@ MODULE_DEVICE_TABLE(spi, ad9834_id)
  static struct spi_driver ad9834_driver = {
        .driver = {
                .name   = "ad9834",
-               .owner  = THIS_MODULE,
        },
        .probe          = ad9834_probe,
        .remove         = ad9834_remove,
index 981b63f83a7b2d8ee940b5103fb440aeb7f67772,b8776d638e662a72a013b302dd811a9b608e09b1..ab816a215eb80f10acb672c905372c977c244d9d
@@@ -67,7 -67,7 +67,7 @@@ static int adis16060_spi_read(struct ii
         * starts to place data MSB first on the DOUT line at
         * the 6th falling edge of SCLK
         */
 -      if (ret == 0)
 +      if (!ret)
                *val = ((st->buf[0] & 0x3) << 12) |
                        (st->buf[1] << 4) |
                        ((st->buf[2] >> 4) & 0xF);
@@@ -89,13 -89,11 +89,13 @@@ static int adis16060_read_raw(struct ii
                /* Take the iio_dev status lock */
                mutex_lock(&indio_dev->mlock);
                ret = adis16060_spi_write(indio_dev, chan->address);
 -              if (ret < 0) {
 -                      mutex_unlock(&indio_dev->mlock);
 -                      return ret;
 -              }
 +              if (ret < 0)
 +                      goto out_unlock;
 +
                ret = adis16060_spi_read(indio_dev, &tval);
 +              if (ret < 0)
 +                      goto out_unlock;
 +
                mutex_unlock(&indio_dev->mlock);
                *val = tval;
                return IIO_VAL_INT;
        }
  
        return -EINVAL;
 +
 +out_unlock:
 +      mutex_unlock(&indio_dev->mlock);
 +      return ret;
  }
  
  static const struct iio_info adis16060_info = {
@@@ -208,7 -202,6 +208,6 @@@ static int adis16060_w_remove(struct sp
  static struct spi_driver adis16060_r_driver = {
        .driver = {
                .name = "adis16060_r",
-               .owner = THIS_MODULE,
        },
        .probe = adis16060_r_probe,
  };
  static struct spi_driver adis16060_w_driver = {
        .driver = {
                .name = "adis16060_w",
-               .owner = THIS_MODULE,
        },
        .probe = adis16060_w_probe,
        .remove = adis16060_w_remove,
index 1549192c0dec0372f5bb5b99611ae22327e2d182,070c918dadcfa1e5887dfe528687f4396036e9db..8be198058ea20452cd3623d6e3564c58537b8d15
@@@ -59,7 -59,6 +59,7 @@@ static const struct regmap_config hmc58
  static int hmc5843_spi_probe(struct spi_device *spi)
  {
        int ret;
 +      const struct spi_device_id *id = spi_get_device_id(spi);
  
        spi->mode = SPI_MODE_3;
        spi->max_speed_hz = 8000000;
@@@ -70,7 -69,7 +70,7 @@@
  
        return hmc5843_common_probe(&spi->dev,
                        devm_regmap_init_spi(spi, &hmc5843_spi_regmap_config),
 -                      HMC5983_ID);
 +                      id->driver_data, id->name);
  }
  
  static int hmc5843_spi_remove(struct spi_device *spi)
@@@ -82,13 -81,11 +82,12 @@@ static const struct spi_device_id hmc58
        { "hmc5983", HMC5983_ID },
        { }
  };
 +MODULE_DEVICE_TABLE(spi, hmc5843_id);
  
  static struct spi_driver hmc5843_driver = {
                .driver = {
                                .name = "hmc5843",
                                .pm = HMC5843_PM_OPS,
-                               .owner = THIS_MODULE,
                },
                .id_table = hmc5843_id,
                .probe = hmc5843_spi_probe,
index 188830d7e2574109592fae90d66ab09a4579214d,9ca9fef4b8bac7ffa23484550e3449ac24519ffd..f129039bece3c74b96fb78e70996ea65279502ea
@@@ -219,7 -219,7 +219,7 @@@ static int ade7753_reset(struct device 
        u16 val;
  
        ade7753_spi_read_reg_16(dev, ADE7753_MODE, &val);
 -      val |= 1 << 6; /* Software Chip Reset */
 +      val |= BIT(6); /* Software Chip Reset */
  
        return ade7753_spi_write_reg_16(dev, ADE7753_MODE, val);
  }
@@@ -328,10 -328,10 +328,10 @@@ static int ade7753_set_irq(struct devic
                goto error_ret;
  
        if (enable)
 -              irqen |= 1 << 3; /* Enables an interrupt when a data is
 +              irqen |= BIT(3); /* Enables an interrupt when a data is
                                    present in the waveform register */
        else
 -              irqen &= ~(1 << 3);
 +              irqen &= ~BIT(3);
  
        ret = ade7753_spi_write_reg_8(dev, ADE7753_IRQEN, irqen);
  
@@@ -345,7 -345,7 +345,7 @@@ static int ade7753_stop_device(struct d
        u16 val;
  
        ade7753_spi_read_reg_16(dev, ADE7753_MODE, &val);
 -      val |= 1 << 4;  /* AD converters can be turned off */
 +      val |= BIT(4);  /* AD converters can be turned off */
  
        return ade7753_spi_write_reg_16(dev, ADE7753_MODE, val);
  }
@@@ -406,7 -406,7 +406,7 @@@ static ssize_t ade7753_write_frequency(
        ret = kstrtou16(buf, 10, &val);
        if (ret)
                return ret;
 -      if (val == 0)
 +      if (!val)
                return -EINVAL;
  
        mutex_lock(&indio_dev->mlock);
@@@ -534,7 -534,6 +534,6 @@@ static int ade7753_remove(struct spi_de
  static struct spi_driver ade7753_driver = {
        .driver = {
                .name = "ade7753",
-               .owner = THIS_MODULE,
        },
        .probe = ade7753_probe,
        .remove = ade7753_remove,
index 664c6e5f76b13e872484d19328c163a9446eebcf,5609872532f11b4a0a6fc8a5d69098dfabd48aea..1e950685e12f94bf3ee1864b9ff1b60a39845271
@@@ -223,7 -223,7 +223,7 @@@ static int ade7754_reset(struct device 
        if (ret < 0)
                return ret;
  
 -      val |= 1 << 6; /* Software Chip Reset */
 +      val |= BIT(6); /* Software Chip Reset */
        return ade7754_spi_write_reg_8(dev, ADE7754_OPMODE, val);
  }
  
@@@ -350,10 -350,10 +350,10 @@@ static int ade7754_set_irq(struct devic
                goto error_ret;
  
        if (enable)
 -              irqen |= 1 << 14; /* Enables an interrupt when a data is
 +              irqen |= BIT(14); /* Enables an interrupt when a data is
                                     present in the waveform register */
        else
 -              irqen &= ~(1 << 14);
 +              irqen &= ~BIT(14);
  
        ret = ade7754_spi_write_reg_16(dev, ADE7754_IRQEN, irqen);
        if (ret)
@@@ -438,7 -438,7 +438,7 @@@ static ssize_t ade7754_write_frequency(
        ret = kstrtou16(buf, 10, &val);
        if (ret)
                return ret;
 -      if (val == 0)
 +      if (!val)
                return -EINVAL;
  
        mutex_lock(&indio_dev->mlock);
@@@ -575,7 -575,6 +575,6 @@@ static int ade7754_remove(struct spi_de
  static struct spi_driver ade7754_driver = {
        .driver = {
                .name = "ade7754",
-               .owner = THIS_MODULE,
        },
        .probe = ade7754_probe,
        .remove = ade7754_remove,
index 38838085824fc796483eea72919d7ab9df3e5ab2,d348e161c8484a17ddd6bffc9306844078ba9752..0db23e4d1852b01936823da0c8c79225667d0049
@@@ -308,7 -308,7 +308,7 @@@ static int ade7758_reset(struct device 
                dev_err(dev, "Failed to read opmode reg\n");
                return ret;
        }
 -      val |= 1 << 6; /* Software Chip Reset */
 +      val |= BIT(6); /* Software Chip Reset */
        ret = ade7758_spi_write_reg_8(dev, ADE7758_OPMODE, val);
        if (ret < 0)
                dev_err(dev, "Failed to write opmode reg\n");
@@@ -426,10 -426,10 +426,10 @@@ int ade7758_set_irq(struct device *dev
                goto error_ret;
  
        if (enable)
 -              irqen |= 1 << 16; /* Enables an interrupt when a data is
 +              irqen |= BIT(16); /* Enables an interrupt when a data is
                                     present in the waveform register */
        else
 -              irqen &= ~(1 << 16);
 +              irqen &= ~BIT(16);
  
        ret = ade7758_spi_write_reg_24(dev, ADE7758_MASK, irqen);
        if (ret)
@@@ -904,7 -904,6 +904,6 @@@ MODULE_DEVICE_TABLE(spi, ade7758_id)
  static struct spi_driver ade7758_driver = {
        .driver = {
                .name = "ade7758",
-               .owner = THIS_MODULE,
        },
        .probe = ade7758_probe,
        .remove = ade7758_remove,
index 11c1edcc1ed638478fd2c3ba4ebba477fbd52f60,f774a62cad4ef945d63f605c3185fd6c73329d17..684e612a88b934f7f3fde54799d2d2a2fe3ebe88
@@@ -224,7 -224,7 +224,7 @@@ static int ade7759_reset(struct device 
        if (ret < 0)
                return ret;
  
 -      val |= 1 << 6; /* Software Chip Reset */
 +      val |= BIT(6); /* Software Chip Reset */
        return ade7759_spi_write_reg_16(dev,
                        ADE7759_MODE,
                        val);
@@@ -288,10 -288,10 +288,10 @@@ static int ade7759_set_irq(struct devic
                goto error_ret;
  
        if (enable)
 -              irqen |= 1 << 3; /* Enables an interrupt when a data is
 +              irqen |= BIT(3); /* Enables an interrupt when a data is
                                    present in the waveform register */
        else
 -              irqen &= ~(1 << 3);
 +              irqen &= ~BIT(3);
  
        ret = ade7759_spi_write_reg_8(dev, ADE7759_IRQEN, irqen);
  
@@@ -314,7 -314,7 +314,7 @@@ static int ade7759_stop_device(struct d
                return ret;
        }
  
 -      val |= 1 << 4;  /* AD converters can be turned off */
 +      val |= BIT(4);  /* AD converters can be turned off */
  
        return ade7759_spi_write_reg_16(dev, ADE7759_MODE, val);
  }
@@@ -377,7 -377,7 +377,7 @@@ static ssize_t ade7759_write_frequency(
        ret = kstrtou16(buf, 10, &val);
        if (ret)
                return ret;
 -      if (val == 0)
 +      if (!val)
                return -EINVAL;
  
        mutex_lock(&indio_dev->mlock);
@@@ -490,7 -490,6 +490,6 @@@ static int ade7759_remove(struct spi_de
  static struct spi_driver ade7759_driver = {
        .driver = {
                .name = "ade7759",
-               .owner = THIS_MODULE,
        },
        .probe = ade7759_probe,
        .remove = ade7759_remove,
index da774866512c3828d33b0bdffe34e252f71551ea,16f288d8b8f6dc1d9647a0282b5832b29ccff2fc..2413052c5bfb5d23cd880d56e90127d367756528
@@@ -278,7 -278,7 +278,7 @@@ static int ade7854_spi_probe(struct spi
        struct iio_dev *indio_dev;
  
        indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
 -      if (indio_dev == NULL)
 +      if (!indio_dev)
                return -ENOMEM;
        st = iio_priv(indio_dev);
        spi_set_drvdata(spi, indio_dev);
@@@ -314,7 -314,6 +314,6 @@@ MODULE_DEVICE_TABLE(spi, ade7854_id)
  static struct spi_driver ade7854_driver = {
        .driver = {
                .name = "ade7854",
-               .owner = THIS_MODULE,
        },
        .probe = ade7854_spi_probe,
        .remove = ade7854_spi_remove,
index 3bd65f5c9cf5a5d9f7109e70e752423ceccc76f5,95f5426a14d90a449a27433cc29fb48202aefed2..d97aa2827412a606de57a66e858db205a96f13a0
@@@ -633,7 -633,7 +633,7 @@@ error_ret
  }
  
  static const struct iio_info ad2s1210_info = {
 -      .read_raw = &ad2s1210_read_raw,
 +      .read_raw = ad2s1210_read_raw,
        .attrs = &ad2s1210_attribute_group,
        .driver_module = THIS_MODULE,
  };
@@@ -735,7 -735,6 +735,6 @@@ MODULE_DEVICE_TABLE(spi, ad2s1210_id)
  static struct spi_driver ad2s1210_driver = {
        .driver = {
                .name = DRV_NAME,
-               .owner = THIS_MODULE,
        },
        .probe = ad2s1210_probe,
        .remove = ad2s1210_remove,
index c57a29616223ba54b8335691d6b122c7a6553f30,cfeedfb7c774e1177a546c370a2ff1747e9dd2cf..5b1c0db33e7f2dfe4ddbebdc48c117b01f146e5b
@@@ -79,7 -79,7 +79,7 @@@ static int ad2s90_probe(struct spi_devi
        indio_dev->num_channels = 1;
        indio_dev->name = spi_get_device_id(spi)->name;
  
 -      ret = iio_device_register(indio_dev);
 +      ret = devm_iio_device_register(indio_dev->dev.parent, indio_dev);
        if (ret)
                return ret;
  
        return 0;
  }
  
 -static int ad2s90_remove(struct spi_device *spi)
 -{
 -      iio_device_unregister(spi_get_drvdata(spi));
 -
 -      return 0;
 -}
 -
  static const struct spi_device_id ad2s90_id[] = {
        { "ad2s90" },
        {}
@@@ -100,9 -107,9 +100,8 @@@ MODULE_DEVICE_TABLE(spi, ad2s90_id)
  static struct spi_driver ad2s90_driver = {
        .driver = {
                .name = "ad2s90",
-               .owner = THIS_MODULE,
        },
        .probe = ad2s90_probe,
 -      .remove = ad2s90_remove,
        .id_table = ad2s90_id,
  };
  module_spi_driver(ad2s90_driver);
index 20a3f8eeb264651915530a372861a98aa52a65da,5a0e77305827a4083b9da82bfa4c18d37012ef8d..9dba16f1fac4c0266c08a3eb233348827b0faad6
@@@ -145,7 -145,7 +145,7 @@@ static int spinand_read_id(struct spi_d
   *    Once the status turns to be ready, the other status bits also are
   *    valid status bits.
   */
 -static int spinand_read_status(struct spi_device *spi_nand, uint8_t *status)
 +static int spinand_read_status(struct spi_device *spi_nand, u8 *status)
  {
        struct spinand_cmd cmd = {0};
        int ret;
@@@ -186,7 -186,6 +186,7 @@@ static int wait_till_ready(struct spi_d
  
        return -1;
  }
 +
  /**
   * spinand_get_otp- send command 0xf to read the SPI Nand OTP register
   * Description:
@@@ -322,7 -321,7 +322,7 @@@ static int spinand_read_page_to_cache(s
   *   No tRd delay.
   */
  static int spinand_read_from_cache(struct spi_device *spi_nand, u16 page_id,
 -              u16 byte_id, u16 len, u8 *rbuf)
 +                                 u16 byte_id, u16 len, u8 *rbuf)
  {
        struct spinand_cmd cmd = {0};
        u16 column;
   *   Poll to read status to wait for tRD time.
   */
  static int spinand_read_page(struct spi_device *spi_nand, u16 page_id,
 -              u16 offset, u16 len, u8 *rbuf)
 +                           u16 offset, u16 len, u8 *rbuf)
  {
        int ret;
        u8 status = 0;
                ret = spinand_read_status(spi_nand, &status);
                if (ret < 0) {
                        dev_err(&spi_nand->dev,
 -                                      "err %d read status register\n", ret);
 +                              "err %d read status register\n", ret);
                        return ret;
                }
  
                if ((status & STATUS_OIP_MASK) == STATUS_READY) {
                        if ((status & STATUS_ECC_MASK) == STATUS_ECC_ERROR) {
                                dev_err(&spi_nand->dev, "ecc error, page=%d\n",
 -                                              page_id);
 +                                      page_id);
                                return 0;
                        }
                        break;
   *   Since it is writing the data to cache, there is no tPROG time.
   */
  static int spinand_program_data_to_cache(struct spi_device *spi_nand,
 -              u16 page_id, u16 byte_id, u16 len, u8 *wbuf)
 +                                       u16 page_id, u16 byte_id,
 +                                       u16 len, u8 *wbuf)
  {
        struct spinand_cmd cmd = {0};
        u16 column;
@@@ -475,11 -473,11 +475,11 @@@ static int spinand_program_execute(stru
   *   Poll to wait for the tPROG time to finish the transaction.
   */
  static int spinand_program_page(struct spi_device *spi_nand,
 -              u16 page_id, u16 offset, u16 len, u8 *buf)
 +                              u16 page_id, u16 offset, u16 len, u8 *buf)
  {
        int retval;
        u8 status = 0;
 -      uint8_t *wbuf;
 +      u8 *wbuf;
  #ifdef CONFIG_MTD_SPINAND_ONDIEECC
        unsigned int i, j;
  
                dev_err(&spi_nand->dev, "wait timedout!!!\n");
  
        retval = spinand_program_data_to_cache(spi_nand, page_id,
 -                      offset, len, wbuf);
 +                                             offset, len, wbuf);
        if (retval < 0)
                return retval;
        retval = spinand_program_execute(spi_nand, page_id);
                retval = spinand_read_status(spi_nand, &status);
                if (retval < 0) {
                        dev_err(&spi_nand->dev,
 -                                      "error %d reading status register\n",
 -                                      retval);
 +                              "error %d reading status register\n", retval);
                        return retval;
                }
  
@@@ -594,7 -593,8 +594,7 @@@ static int spinand_erase_block(struct s
                retval = spinand_read_status(spi_nand, &status);
                if (retval < 0) {
                        dev_err(&spi_nand->dev,
 -                                      "error %d reading status register\n",
 -                                      (int) retval);
 +                              "error %d reading status register\n", retval);
                        return retval;
                }
  
  
  #ifdef CONFIG_MTD_SPINAND_ONDIEECC
  static int spinand_write_page_hwecc(struct mtd_info *mtd,
 -              struct nand_chip *chip, const uint8_t *buf, int oob_required)
 +                                  struct nand_chip *chip,
 +                                  const u8 *buf, int oob_required)
  {
 -      const uint8_t *p = buf;
 +      const u8 *p = buf;
        int eccsize = chip->ecc.size;
        int eccsteps = chip->ecc.steps;
  
  }
  
  static int spinand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
 -              uint8_t *buf, int oob_required, int page)
 +                                 u8 *buf, int oob_required, int page)
  {
        int retval;
        u8 status;
 -      uint8_t *p = buf;
 +      u8 *p = buf;
        int eccsize = chip->ecc.size;
        int eccsteps = chip->ecc.steps;
        struct spinand_info *info = (struct spinand_info *)chip->priv;
                retval = spinand_read_status(info->spi, &status);
                if (retval < 0) {
                        dev_err(&mtd->dev,
 -                                      "error %d reading status register\n",
 -                                      retval);
 +                              "error %d reading status register\n", retval);
                        return retval;
                }
  
                }
        }
        return 0;
 -
  }
  #endif
  
@@@ -666,7 -667,7 +666,7 @@@ static void spinand_select_chip(struct 
  {
  }
  
 -static uint8_t spinand_read_byte(struct mtd_info *mtd)
 +static u8 spinand_read_byte(struct mtd_info *mtd)
  {
        struct spinand_state *state = mtd_to_state(mtd);
        u8 data;
        return data;
  }
  
 -
  static int spinand_wait(struct mtd_info *mtd, struct nand_chip *chip)
  {
        struct spinand_info *info = (struct spinand_info *)chip->priv;
                retval = spinand_read_status(info->spi, &status);
                if (retval < 0) {
                        dev_err(&mtd->dev,
 -                                      "error %d reading status register\n",
 -                                      retval);
 +                              "error %d reading status register\n", retval);
                        return retval;
                }
  
        return 0;
  }
  
 -static void spinand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
 +static void spinand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
  {
 -
        struct spinand_state *state = mtd_to_state(mtd);
  
        memcpy(state->buf + state->buf_ptr, buf, len);
        state->buf_ptr += len;
  }
  
 -static void spinand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
 +static void spinand_read_buf(struct mtd_info *mtd, u8 *buf, int len)
  {
        struct spinand_state *state = mtd_to_state(mtd);
  
@@@ -734,14 -738,14 +734,14 @@@ static void spinand_reset(struct spi_de
                pr_info("spinand reset failed!\n");
  
        /* elapse 1ms before issuing any other command */
 -      udelay(1000);
 +      usleep_range(1000, 2000);
  
        if (wait_till_ready(spi_nand))
                dev_err(&spi_nand->dev, "wait timedout!\n");
  }
  
  static void spinand_cmdfunc(struct mtd_info *mtd, unsigned int command,
 -              int column, int page)
 +                          int column, int page)
  {
        struct nand_chip *chip = (struct nand_chip *)mtd->priv;
        struct spinand_info *info = (struct spinand_info *)chip->priv;
        /* PAGEPROG reuses all of the setup from SEQIN and adds the length */
        case NAND_CMD_PAGEPROG:
                spinand_program_page(info->spi, state->row, state->col,
 -                              state->buf_ptr, state->buf);
 +                                   state->buf_ptr, state->buf);
                break;
        case NAND_CMD_STATUS:
                spinand_get_otp(info->spi, state->buf);
                if (wait_till_ready(info->spi))
                        dev_err(&info->spi->dev, "WAIT timedout!!!\n");
                /* a minimum of 250us must elapse before issuing RESET cmd*/
 -              udelay(250);
 +              usleep_range(250, 1000);
                spinand_reset(info->spi);
                break;
        default:
@@@ -835,7 -839,6 +835,7 @@@ static int spinand_lock_block(struct sp
  
        return ret;
  }
 +
  /*
   * spinand_probe - [spinand Interface]
   * @spi_nand: registered device driver.
@@@ -852,7 -855,7 +852,7 @@@ static int spinand_probe(struct spi_dev
        struct mtd_part_parser_data ppdata;
  
        info  = devm_kzalloc(&spi_nand->dev, sizeof(struct spinand_info),
 -                      GFP_KERNEL);
 +                           GFP_KERNEL);
        if (!info)
                return -ENOMEM;
  
        spinand_lock_block(spi_nand, BL_ALL_UNLOCKED);
  
        state = devm_kzalloc(&spi_nand->dev, sizeof(struct spinand_state),
 -                      GFP_KERNEL);
 +                           GFP_KERNEL);
        if (!state)
                return -ENOMEM;
  
                return -ENOMEM;
  
        chip = devm_kzalloc(&spi_nand->dev, sizeof(struct nand_chip),
 -                      GFP_KERNEL);
 +                          GFP_KERNEL);
        if (!chip)
                return -ENOMEM;
  
@@@ -938,7 -941,6 +938,7 @@@ static const struct of_device_id spinan
        { .compatible = "spinand,mt29f", },
        {}
  };
 +MODULE_DEVICE_TABLE(of, spinand_dt);
  
  /*
   * Device name structure description
  static struct spi_driver spinand_driver = {
        .driver = {
                .name           = "mt29f",
-               .owner          = THIS_MODULE,
                .of_match_table = spinand_dt,
        },
        .probe          = spinand_probe,
index 1ae8aa698fcbd6dc80ebfae05a0a3ae0b1c6e5eb,55b61d79e75770ada22902588106beee0411720b..edb5305b9d4da72e388452f66db9e65e40d15f18
@@@ -1321,9 -1321,6 +1321,9 @@@ static int sc16is7xx_spi_probe(struct s
                const struct of_device_id *of_id =
                        of_match_device(sc16is7xx_dt_ids, &spi->dev);
  
 +              if (!of_id)
 +                      return -ENODEV;
 +
                devtype = (struct sc16is7xx_devtype *)of_id->data;
        } else {
                const struct spi_device_id *id_entry = spi_get_device_id(spi);
@@@ -1360,7 -1357,6 +1360,6 @@@ MODULE_DEVICE_TABLE(spi, sc16is7xx_spi_
  static struct spi_driver sc16is7xx_spi_uart_driver = {
        .driver = {
                .name           = SC16IS7XX_NAME,
-               .owner          = THIS_MODULE,
                .of_match_table = of_match_ptr(sc16is7xx_dt_ids),
        },
        .probe          = sc16is7xx_spi_probe,
@@@ -1383,9 -1379,6 +1382,9 @@@ static int sc16is7xx_i2c_probe(struct i
                const struct of_device_id *of_id =
                                of_match_device(sc16is7xx_dt_ids, &i2c->dev);
  
 +              if (!of_id)
 +                      return -ENODEV;
 +
                devtype = (struct sc16is7xx_devtype *)of_id->data;
        } else {
                devtype = (struct sc16is7xx_devtype *)id->driver_data;
@@@ -1426,6 -1419,7 +1425,6 @@@ static struct i2c_driver sc16is7xx_i2c_
        .id_table       = sc16is7xx_i2c_id_table,
  };
  
 -MODULE_ALIAS("i2c:sc16is7xx");
  #endif
  
  static int __init sc16is7xx_init(void)
This page took 0.36432 seconds and 4 git commands to generate.