]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'spi/topic/bfin' into spi-next
authorMark Brown <broonie@linaro.org>
Fri, 25 Oct 2013 08:51:21 +0000 (09:51 +0100)
committerMark Brown <broonie@linaro.org>
Fri, 25 Oct 2013 08:51:21 +0000 (09:51 +0100)
1  2 
drivers/spi/spi-bfin-sport.c
drivers/spi/spi-bfin5xx.c
drivers/spi/spi-clps711x.c
drivers/spi/spi-ep93xx.c
drivers/spi/spi-mpc512x-psc.c
drivers/spi/spi-omap2-mcspi.c
drivers/spi/spi-pxa2xx.c
drivers/spi/spi-sh-hspi.c
drivers/spi/spi.c

index 7b2cda0747d5f4756d20f9f7bfaba91402c38f25,6c81a5978ecae0fa0a9ac40a383f45a159ac8a31..38941e5920b50fe2bb9455cc9392fe6803db6355
@@@ -592,7 -592,7 +592,7 @@@ bfin_sport_spi_setup(struct spi_device 
                         */
                        if (chip_info->ctl_reg || chip_info->enable_dma) {
                                ret = -EINVAL;
 -                              dev_err(&spi->dev, "don't set ctl_reg/enable_dma fields");
 +                              dev_err(&spi->dev, "don't set ctl_reg/enable_dma fields\n");
                                goto error;
                        }
                        chip->cs_chg_udelay = chip_info->cs_chg_udelay;
@@@ -879,11 -879,10 +879,10 @@@ static int bfin_sport_spi_remove(struc
        return 0;
  }
  
- #ifdef CONFIG_PM
- static int
- bfin_sport_spi_suspend(struct platform_device *pdev, pm_message_t state)
+ #ifdef CONFIG_PM_SLEEP
+ static int bfin_sport_spi_suspend(struct device *dev)
  {
-       struct bfin_sport_spi_master_data *drv_data = platform_get_drvdata(pdev);
+       struct bfin_sport_spi_master_data *drv_data = dev_get_drvdata(dev);
        int status;
  
        status = bfin_sport_spi_stop_queue(drv_data);
        return status;
  }
  
- static int
- bfin_sport_spi_resume(struct platform_device *pdev)
+ static int bfin_sport_spi_resume(struct device *dev)
  {
-       struct bfin_sport_spi_master_data *drv_data = platform_get_drvdata(pdev);
+       struct bfin_sport_spi_master_data *drv_data = dev_get_drvdata(dev);
        int status;
  
        /* Enable the SPI interface */
  
        return status;
  }
+ static SIMPLE_DEV_PM_OPS(bfin_sport_spi_pm_ops, bfin_sport_spi_suspend,
+                       bfin_sport_spi_resume);
+ #define BFIN_SPORT_SPI_PM_OPS         (&bfin_sport_spi_pm_ops)
  #else
- # define bfin_sport_spi_suspend NULL
- # define bfin_sport_spi_resume  NULL
+ #define BFIN_SPORT_SPI_PM_OPS         NULL
  #endif
  
  static struct platform_driver bfin_sport_spi_driver = {
        .driver = {
-               .name = DRV_NAME,
-               .owner = THIS_MODULE,
+               .name   = DRV_NAME,
+               .owner  = THIS_MODULE,
+               .pm     = BFIN_SPORT_SPI_PM_OPS,
        },
        .probe   = bfin_sport_spi_probe,
        .remove  = bfin_sport_spi_remove,
-       .suspend = bfin_sport_spi_suspend,
-       .resume  = bfin_sport_spi_resume,
  };
  module_platform_driver(bfin_sport_spi_driver);
index b70a2bd9324d6f82ddb14affa32dd337c9f823ff,5284f158d4e6f067f375e606eabafe92557011c3..f0f195af75d4d67815e6d550d54c5cf990d6813f
@@@ -524,7 -524,7 +524,7 @@@ static irqreturn_t bfin_spi_dma_irq_han
        timeout = jiffies + HZ;
        while (!(bfin_read(&drv_data->regs->stat) & BIT_STAT_SPIF))
                if (!time_before(jiffies, timeout)) {
 -                      dev_warn(&drv_data->pdev->dev, "timeout waiting for SPIF");
 +                      dev_warn(&drv_data->pdev->dev, "timeout waiting for SPIF\n");
                        break;
                } else
                        cpu_relax();
@@@ -913,9 -913,8 +913,9 @@@ static void bfin_spi_pump_messages(stru
        drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next,
                                            struct spi_transfer, transfer_list);
  
 -      dev_dbg(&drv_data->pdev->dev, "got a message to pump, "
 -              "state is set to: baud %d, flag 0x%x, ctl 0x%x\n",
 +      dev_dbg(&drv_data->pdev->dev,
 +              "got a message to pump, state is set to: baud "
 +              "%d, flag 0x%x, ctl 0x%x\n",
                drv_data->cur_chip->baud, drv_data->cur_chip->flag,
                drv_data->cur_chip->ctl_reg);
  
@@@ -1014,8 -1013,8 +1014,8 @@@ static int bfin_spi_setup(struct spi_de
                 * but let's assume (for now) they do.
                 */
                if (chip_info->ctl_reg & ~bfin_ctl_reg) {
 -                      dev_err(&spi->dev, "do not set bits in ctl_reg "
 -                              "that the SPI framework manages\n");
 +                      dev_err(&spi->dev,
 +                              "do not set bits in ctl_reg that the SPI framework manages\n");
                        goto error;
                }
                chip->enable_dma = chip_info->enable_dma != 0
        chip->chip_select_num = spi->chip_select;
        if (chip->chip_select_num < MAX_CTRL_CS) {
                if (!(spi->mode & SPI_CPHA))
 -                      dev_warn(&spi->dev, "Warning: SPI CPHA not set:"
 -                              " Slave Select not under software control!\n"
 -                              " See Documentation/blackfin/bfin-spi-notes.txt");
 +                      dev_warn(&spi->dev,
 +                              "Warning: SPI CPHA not set: Slave Select not under software control!\n"
 +                              "See Documentation/blackfin/bfin-spi-notes.txt\n");
  
                chip->flag = (1 << spi->chip_select) << 8;
        } else
                chip->cs_gpio = chip->chip_select_num - MAX_CTRL_CS;
  
        if (chip->enable_dma && chip->pio_interrupt) {
 -              dev_err(&spi->dev, "enable_dma is set, "
 -                              "do not set pio_interrupt\n");
 +              dev_err(&spi->dev,
 +                      "enable_dma is set, do not set pio_interrupt\n");
                goto error;
        }
        /*
@@@ -1411,10 -1410,10 +1411,10 @@@ static int bfin_spi_remove(struct platf
        return 0;
  }
  
- #ifdef CONFIG_PM
- static int bfin_spi_suspend(struct platform_device *pdev, pm_message_t state)
+ #ifdef CONFIG_PM_SLEEP
+ static int bfin_spi_suspend(struct device *dev)
  {
-       struct bfin_spi_master_data *drv_data = platform_get_drvdata(pdev);
+       struct bfin_spi_master_data *drv_data = dev_get_drvdata(dev);
        int status = 0;
  
        status = bfin_spi_stop_queue(drv_data);
        return 0;
  }
  
- static int bfin_spi_resume(struct platform_device *pdev)
+ static int bfin_spi_resume(struct device *dev)
  {
-       struct bfin_spi_master_data *drv_data = platform_get_drvdata(pdev);
+       struct bfin_spi_master_data *drv_data = dev_get_drvdata(dev);
        int status = 0;
  
        bfin_write(&drv_data->regs->ctl, drv_data->ctrl_reg);
        /* Start the queue running */
        status = bfin_spi_start_queue(drv_data);
        if (status != 0) {
-               dev_err(&pdev->dev, "problem starting queue (%d)\n", status);
+               dev_err(dev, "problem starting queue (%d)\n", status);
                return status;
        }
  
        return 0;
  }
+ static SIMPLE_DEV_PM_OPS(bfin_spi_pm_ops, bfin_spi_suspend, bfin_spi_resume);
+ #define BFIN_SPI_PM_OPS               (&bfin_spi_pm_ops)
  #else
- #define bfin_spi_suspend NULL
- #define bfin_spi_resume NULL
- #endif                                /* CONFIG_PM */
+ #define BFIN_SPI_PM_OPS               NULL
+ #endif
  
  MODULE_ALIAS("platform:bfin-spi");
  static struct platform_driver bfin_spi_driver = {
        .driver = {
                .name   = DRV_NAME,
                .owner  = THIS_MODULE,
+               .pm     = BFIN_SPI_PM_OPS,
        },
-       .suspend        = bfin_spi_suspend,
-       .resume         = bfin_spi_resume,
+       .probe          = bfin_spi_probe,
        .remove         = bfin_spi_remove,
  };
  
  static int __init bfin_spi_init(void)
  {
-       return platform_driver_probe(&bfin_spi_driver, bfin_spi_probe);
+       return platform_driver_register(&bfin_spi_driver);
  }
  subsys_initcall(bfin_spi_init);
  
index 6416798828e72bc9f5194282f55cf49a37f6809c,f2b1a1c33907d5f794c21fad1295e0338b8237db..7f2fd33ad4d918de4c60263d19840b1c9611c7ec
@@@ -226,10 -226,11 +226,10 @@@ static int spi_clps711x_probe(struct pl
                               dev_name(&pdev->dev), hw);
        if (ret) {
                dev_err(&pdev->dev, "Can't request IRQ\n");
 -              clk_put(hw->spi_clk);
                goto clk_out;
        }
  
-       ret = spi_register_master(master);
+       ret = devm_spi_register_master(&pdev->dev, master);
        if (!ret) {
                dev_info(&pdev->dev,
                         "SPI bus driver initialized. Master clock %u Hz\n",
@@@ -260,8 -261,6 +260,6 @@@ static int spi_clps711x_remove(struct p
                if (gpio_is_valid(hw->chipselect[i]))
                        gpio_free(hw->chipselect[i]);
  
-       spi_unregister_master(master);
        return 0;
  }
  
diff --combined drivers/spi/spi-ep93xx.c
index b57a341d3e1c5a2e1c25e6e4eeb60ad48397d736,486fb6deab05b0f71aedf1858c8fcd0e892a1496..1bfaed6e4073cb3d536a9d1baf5be2227324a555
@@@ -330,7 -330,7 +330,7 @@@ static int ep93xx_spi_chip_setup(const 
  
        dev_dbg(&espi->pdev->dev, "setup: mode %d, cpsr %d, scr %d, dss %d\n",
                chip->spi->mode, div_cpsr, div_scr, dss);
 -      dev_dbg(&espi->pdev->dev, "setup: cr0 %#x", cr0);
 +      dev_dbg(&espi->pdev->dev, "setup: cr0 %#x\n", cr0);
  
        ep93xx_spi_write_u8(espi, SSPCPSR, div_cpsr);
        ep93xx_spi_write_u16(espi, SSPCR0, cr0);
@@@ -509,7 -509,7 +509,7 @@@ ep93xx_spi_dma_prepare(struct ep93xx_sp
        }
  
        if (WARN_ON(len)) {
 -              dev_warn(&espi->pdev->dev, "len = %zu expected 0!", len);
 +              dev_warn(&espi->pdev->dev, "len = %zu expected 0!\n", len);
                return ERR_PTR(-EINVAL);
        }
  
@@@ -942,7 -942,7 +942,7 @@@ static int ep93xx_spi_probe(struct plat
        /* make sure that the hardware is disabled */
        ep93xx_spi_write_u8(espi, SSPCR1, 0);
  
-       error = spi_register_master(master);
+       error = devm_spi_register_master(&pdev->dev, master);
        if (error) {
                dev_err(&pdev->dev, "failed to register SPI master\n");
                goto fail_free_dma;
@@@ -968,7 -968,6 +968,6 @@@ static int ep93xx_spi_remove(struct pla
  
        ep93xx_spi_release_dma(espi);
  
-       spi_unregister_master(master);
        return 0;
  }
  
index 6adf4e35816d76c1c7f120cd924420c4c8bf71a1,b4426dd8a0c3a18dea945c9e63f0410cb5c0dee9..ee6e61cbf7f514caa5c5ebb212e0811426e8b408
@@@ -522,10 -522,8 +522,10 @@@ static int mpc512x_psc_spi_do_probe(str
        psc_num = master->bus_num;
        snprintf(clk_name, sizeof(clk_name), "psc%d_mclk", psc_num);
        clk = devm_clk_get(dev, clk_name);
 -      if (IS_ERR(clk))
 +      if (IS_ERR(clk)) {
 +              ret = PTR_ERR(clk);
                goto free_irq;
 +      }
        ret = clk_prepare_enable(clk);
        if (ret)
                goto free_irq;
        if (ret < 0)
                goto free_clock;
  
-       ret = spi_register_master(master);
+       ret = devm_spi_register_master(dev, master);
        if (ret < 0)
                goto free_clock;
  
@@@ -559,12 -557,10 +559,10 @@@ static int mpc512x_psc_spi_do_remove(st
        struct spi_master *master = spi_master_get(dev_get_drvdata(dev));
        struct mpc512x_psc_spi *mps = spi_master_get_devdata(master);
  
-       spi_unregister_master(master);
        clk_disable_unprepare(mps->clk_mclk);
        free_irq(mps->irq, mps);
        if (mps->psc)
                iounmap(mps->psc);
-       spi_master_put(master);
  
        return 0;
  }
index c4e4868913c7ac8ac3729e2d4b2ce01725c12350,2f7fd35a9ac8ae1ba353b865960425c1401b438d..443df39840bc899fb3525dcb141ed82da87d72f4
@@@ -276,7 -276,7 +276,7 @@@ static void omap2_mcspi_set_fifo(const 
        struct omap2_mcspi_cs *cs = spi->controller_state;
        struct omap2_mcspi *mcspi;
        unsigned int wcnt;
 -      int fifo_depth, bytes_per_word;
 +      int max_fifo_depth, fifo_depth, bytes_per_word;
        u32 chconf, xferlevel;
  
        mcspi = spi_master_get_devdata(master);
                if (t->len % bytes_per_word != 0)
                        goto disable_fifo;
  
 -              fifo_depth = gcd(t->len, OMAP2_MCSPI_MAX_FIFODEPTH);
 +              if (t->rx_buf != NULL && t->tx_buf != NULL)
 +                      max_fifo_depth = OMAP2_MCSPI_MAX_FIFODEPTH / 2;
 +              else
 +                      max_fifo_depth = OMAP2_MCSPI_MAX_FIFODEPTH;
 +
 +              fifo_depth = gcd(t->len, max_fifo_depth);
                if (fifo_depth < 2 || fifo_depth % bytes_per_word != 0)
                        goto disable_fifo;
  
                if (t->rx_buf != NULL) {
                        chconf |= OMAP2_MCSPI_CHCONF_FFER;
                        xferlevel |= (fifo_depth - 1) << 8;
 -              } else {
 +              }
 +              if (t->tx_buf != NULL) {
                        chconf |= OMAP2_MCSPI_CHCONF_FFET;
                        xferlevel |= fifo_depth - 1;
                }
@@@ -504,7 -498,7 +504,7 @@@ omap2_mcspi_rx_dma(struct spi_device *s
                                ((u32 *)xfer->rx_buf)[elements++] = w;
                } else {
                        int bytes_per_word = mcspi_bytes_per_word(word_len);
 -                      dev_err(&spi->dev, "DMA RX penultimate word empty");
 +                      dev_err(&spi->dev, "DMA RX penultimate word empty\n");
                        count -= (bytes_per_word << 1);
                        omap2_mcspi_set_enable(spi, 1);
                        return count;
                else /* word_len <= 32 */
                        ((u32 *)xfer->rx_buf)[elements] = w;
        } else {
 -              dev_err(&spi->dev, "DMA RX last word empty");
 +              dev_err(&spi->dev, "DMA RX last word empty\n");
                count -= mcspi_bytes_per_word(word_len);
        }
        omap2_mcspi_set_enable(spi, 1);
@@@ -1413,7 -1407,7 +1413,7 @@@ static int omap2_mcspi_probe(struct pla
        if (status < 0)
                goto disable_pm;
  
-       status = spi_register_master(master);
+       status = devm_spi_register_master(&pdev->dev, master);
        if (status < 0)
                goto disable_pm;
  
@@@ -1441,7 -1435,6 +1441,6 @@@ static int omap2_mcspi_remove(struct pl
        pm_runtime_put_sync(mcspi->dev);
        pm_runtime_disable(&pdev->dev);
  
-       spi_unregister_master(master);
        kfree(dma_channels);
  
        return 0;
diff --combined drivers/spi/spi-pxa2xx.c
index 64e1682c39b14e28520621515337230d6a30be0e,669306aa6c29623b571b92a27624f01e691f80ac..cb0e1f1137adb65384188ce31651171cb3f5f311
@@@ -546,17 -546,8 +546,17 @@@ static irqreturn_t ssp_int(int irq, voi
        if (pm_runtime_suspended(&drv_data->pdev->dev))
                return IRQ_NONE;
  
 -      sccr1_reg = read_SSCR1(reg);
 +      /*
 +       * If the device is not yet in RPM suspended state and we get an
 +       * interrupt that is meant for another device, check if status bits
 +       * are all set to one. That means that the device is already
 +       * powered off.
 +       */
        status = read_SSSR(reg);
 +      if (status == ~0)
 +              return IRQ_NONE;
 +
 +      sccr1_reg = read_SSCR1(reg);
  
        /* Ignore possible writes if we don't need to write */
        if (!(sccr1_reg & SSCR1_TIE))
                        write_SSTO(0, reg);
                write_SSSR_CS(drv_data, drv_data->clear_sr);
  
 -              dev_err(&drv_data->pdev->dev, "bad message state "
 -                      "in interrupt handler\n");
 +              dev_err(&drv_data->pdev->dev,
 +                      "bad message state in interrupt handler\n");
  
                /* Never fail */
                return IRQ_HANDLED;
@@@ -651,8 -642,8 +651,8 @@@ static void pump_transfers(unsigned lon
                if (message->is_dma_mapped
                                || transfer->rx_dma || transfer->tx_dma) {
                        dev_err(&drv_data->pdev->dev,
 -                              "pump_transfers: mapped transfer length "
 -                              "of %u is greater than %d\n",
 +                              "pump_transfers: mapped transfer length of "
 +                              "%u is greater than %d\n",
                                transfer->len, MAX_DMA_LEN);
                        message->status = -EINVAL;
                        giveback(drv_data);
                }
  
                /* warn ... we force this to PIO mode */
 -              if (printk_ratelimit())
 -                      dev_warn(&message->spi->dev, "pump_transfers: "
 -                              "DMA disabled for transfer length %ld "
 -                              "greater than %d\n",
 -                              (long)drv_data->len, MAX_DMA_LEN);
 +              dev_warn_ratelimited(&message->spi->dev,
 +                                   "pump_transfers: DMA disabled for transfer length %ld "
 +                                   "greater than %d\n",
 +                                   (long)drv_data->len, MAX_DMA_LEN);
        }
  
        /* Setup the transfer state based on the type of transfer */
                                                        message->spi,
                                                        bits, &dma_burst,
                                                        &dma_thresh))
 -                              if (printk_ratelimit())
 -                                      dev_warn(&message->spi->dev,
 -                                              "pump_transfers: "
 -                                              "DMA burst size reduced to "
 -                                              "match bits_per_word\n");
 +                              dev_warn_ratelimited(&message->spi->dev,
 +                                                   "pump_transfers: DMA burst size reduced to match bits_per_word\n");
                }
  
                cr0 = clk_div
@@@ -850,8 -845,8 +850,8 @@@ static int setup_cs(struct spi_device *
        if (gpio_is_valid(chip_info->gpio_cs)) {
                err = gpio_request(chip_info->gpio_cs, "SPI_CS");
                if (err) {
 -                      dev_err(&spi->dev, "failed to request chip select "
 -                                      "GPIO%d\n", chip_info->gpio_cs);
 +                      dev_err(&spi->dev, "failed to request chip select GPIO%d\n",
 +                              chip_info->gpio_cs);
                        return err;
                }
  
@@@ -895,8 -890,8 +895,8 @@@ static int setup(struct spi_device *spi
  
                if (drv_data->ssp_type == CE4100_SSP) {
                        if (spi->chip_select > 4) {
 -                              dev_err(&spi->dev, "failed setup: "
 -                              "cs number must not be > 4.\n");
 +                              dev_err(&spi->dev,
 +                                      "failed setup: cs number must not be > 4.\n");
                                kfree(chip);
                                return -EINVAL;
                        }
                                                spi->bits_per_word,
                                                &chip->dma_burst_size,
                                                &chip->dma_threshold)) {
 -                      dev_warn(&spi->dev, "in setup: DMA burst size reduced "
 -                                      "to match bits_per_word\n");
 +                      dev_warn(&spi->dev,
 +                               "in setup: DMA burst size reduced to match bits_per_word\n");
                }
        }
  
@@@ -1201,7 -1196,7 +1201,7 @@@ static int pxa2xx_spi_probe(struct plat
  
        /* Register with the SPI framework */
        platform_set_drvdata(pdev, drv_data);
-       status = spi_register_master(master);
+       status = devm_spi_register_master(&pdev->dev, master);
        if (status != 0) {
                dev_err(&pdev->dev, "problem registering spi master\n");
                goto out_error_clock_enabled;
@@@ -1253,9 -1248,6 +1253,6 @@@ static int pxa2xx_spi_remove(struct pla
        /* Release SSP */
        pxa_ssp_free(ssp);
  
-       /* Disconnect from the SPI framework */
-       spi_unregister_master(drv_data->master);
        return 0;
  }
  
index e488a90a98b8acbfff5b1fd72dd92b54db2ae602,97e913d225f36bc06789f10e561121551f8ade55..7e749a22f51e8c6c22fae89742263e1afbc46424
@@@ -296,8 -296,6 +296,8 @@@ static int hspi_probe(struct platform_d
                goto error1;
        }
  
 +      pm_runtime_enable(&pdev->dev);
 +
        master->num_chipselect  = 1;
        master->bus_num         = pdev->id;
        master->setup           = hspi_setup;
        master->mode_bits       = SPI_CPOL | SPI_CPHA;
        master->auto_runtime_pm = true;
        master->transfer_one_message            = hspi_transfer_one_message;
-       ret = spi_register_master(master);
+       ret = devm_spi_register_master(&pdev->dev, master);
        if (ret < 0) {
                dev_err(&pdev->dev, "spi_register_master error.\n");
                goto error1;
        }
  
 -      pm_runtime_enable(&pdev->dev);
 -
        return 0;
  
   error1:
@@@ -328,7 -328,6 +328,6 @@@ static int hspi_remove(struct platform_
        pm_runtime_disable(&pdev->dev);
  
        clk_put(hspi->clk);
-       spi_unregister_master(hspi->master);
  
        return 0;
  }
diff --combined drivers/spi/spi.c
index e57e9acd75cbf8d42813b728e8dad3137d984ff8,a586ceb111fcb1ef813b899ca1fad7845d053094..f7d792366b6af7dc1d52d0774eddcc62dcf311bd
@@@ -1025,7 -1025,7 +1025,7 @@@ static acpi_status acpi_spi_add_device(
                return AE_OK;
        }
  
 -      strlcpy(spi->modalias, dev_name(&adev->dev), sizeof(spi->modalias));
 +      strlcpy(spi->modalias, acpi_device_hid(adev), sizeof(spi->modalias));
        if (spi_add_device(spi)) {
                dev_err(&master->dev, "failed to add SPI device %s from ACPI\n",
                        dev_name(&adev->dev));
@@@ -1245,6 -1245,41 +1245,41 @@@ done
  }
  EXPORT_SYMBOL_GPL(spi_register_master);
  
+ static void devm_spi_unregister(struct device *dev, void *res)
+ {
+       spi_unregister_master(*(struct spi_master **)res);
+ }
+ /**
+  * dev_spi_register_master - register managed SPI master controller
+  * @dev:    device managing SPI master
+  * @master: initialized master, originally from spi_alloc_master()
+  * Context: can sleep
+  *
+  * Register a SPI device as with spi_register_master() which will
+  * automatically be unregister
+  */
+ int devm_spi_register_master(struct device *dev, struct spi_master *master)
+ {
+       struct spi_master **ptr;
+       int ret;
+       ptr = devres_alloc(devm_spi_unregister, sizeof(*ptr), GFP_KERNEL);
+       if (!ptr)
+               return -ENOMEM;
+       ret = spi_register_master(master);
+       if (ret != 0) {
+               *ptr = master;
+               devres_add(dev, ptr);
+       } else {
+               devres_free(ptr);
+       }
+       return ret;
+ }
+ EXPORT_SYMBOL_GPL(devm_spi_register_master);
  static int __unregister(struct device *dev, void *null)
  {
        spi_unregister_device(to_spi_device(dev));