linux/drivers/net/wireless/p54/p54spi.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2008 Christian Lamparter <chunkeey@web.de>
   3 * Copyright 2008       Johannes Berg <johannes@sipsolutions.net>
   4 *
   5 * This driver is a port from stlc45xx:
   6 *      Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License
  10 * version 2 as published by the Free Software Foundation.
  11 *
  12 * This program is distributed in the hope that it will be useful, but
  13 * WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15 * General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20 * 02110-1301 USA
  21 */
  22
  23#include <linux/module.h>
  24#include <linux/platform_device.h>
  25#include <linux/interrupt.h>
  26#include <linux/firmware.h>
  27#include <linux/delay.h>
  28#include <linux/irq.h>
  29#include <linux/spi/spi.h>
  30#include <linux/etherdevice.h>
  31#include <linux/gpio.h>
  32#include <linux/slab.h>
  33
  34#include "p54spi.h"
  35#include "p54.h"
  36
  37#include "lmac.h"
  38
  39#ifdef CONFIG_P54_SPI_DEFAULT_EEPROM
  40#include "p54spi_eeprom.h"
  41#endif /* CONFIG_P54_SPI_DEFAULT_EEPROM */
  42
  43MODULE_FIRMWARE("3826.arm");
  44MODULE_ALIAS("stlc45xx");
  45
  46/*
  47 * gpios should be handled in board files and provided via platform data,
  48 * but because it's currently impossible for p54spi to have a header file
  49 * in include/linux, let's use module paramaters for now
  50 */
  51
  52static int p54spi_gpio_power = 97;
  53module_param(p54spi_gpio_power, int, 0444);
  54MODULE_PARM_DESC(p54spi_gpio_power, "gpio number for power line");
  55
  56static int p54spi_gpio_irq = 87;
  57module_param(p54spi_gpio_irq, int, 0444);
  58MODULE_PARM_DESC(p54spi_gpio_irq, "gpio number for irq line");
  59
  60static void p54spi_spi_read(struct p54s_priv *priv, u8 address,
  61                              void *buf, size_t len)
  62{
  63        struct spi_transfer t[2];
  64        struct spi_message m;
  65        __le16 addr;
  66
  67        /* We first push the address */
  68        addr = cpu_to_le16(address << 8 | SPI_ADRS_READ_BIT_15);
  69
  70        spi_message_init(&m);
  71        memset(t, 0, sizeof(t));
  72
  73        t[0].tx_buf = &addr;
  74        t[0].len = sizeof(addr);
  75        spi_message_add_tail(&t[0], &m);
  76
  77        t[1].rx_buf = buf;
  78        t[1].len = len;
  79        spi_message_add_tail(&t[1], &m);
  80
  81        spi_sync(priv->spi, &m);
  82}
  83
  84
  85static void p54spi_spi_write(struct p54s_priv *priv, u8 address,
  86                             const void *buf, size_t len)
  87{
  88        struct spi_transfer t[3];
  89        struct spi_message m;
  90        __le16 addr;
  91
  92        /* We first push the address */
  93        addr = cpu_to_le16(address << 8);
  94
  95        spi_message_init(&m);
  96        memset(t, 0, sizeof(t));
  97
  98        t[0].tx_buf = &addr;
  99        t[0].len = sizeof(addr);
 100        spi_message_add_tail(&t[0], &m);
 101
 102        t[1].tx_buf = buf;
 103        t[1].len = len & ~1;
 104        spi_message_add_tail(&t[1], &m);
 105
 106        if (len % 2) {
 107                __le16 last_word;
 108                last_word = cpu_to_le16(((u8 *)buf)[len - 1]);
 109
 110                t[2].tx_buf = &last_word;
 111                t[2].len = sizeof(last_word);
 112                spi_message_add_tail(&t[2], &m);
 113        }
 114
 115        spi_sync(priv->spi, &m);
 116}
 117
 118static u32 p54spi_read32(struct p54s_priv *priv, u8 addr)
 119{
 120        __le32 val;
 121
 122        p54spi_spi_read(priv, addr, &val, sizeof(val));
 123
 124        return le32_to_cpu(val);
 125}
 126
 127static inline void p54spi_write16(struct p54s_priv *priv, u8 addr, __le16 val)
 128{
 129        p54spi_spi_write(priv, addr, &val, sizeof(val));
 130}
 131
 132static inline void p54spi_write32(struct p54s_priv *priv, u8 addr, __le32 val)
 133{
 134        p54spi_spi_write(priv, addr, &val, sizeof(val));
 135}
 136
 137static int p54spi_wait_bit(struct p54s_priv *priv, u16 reg, u32 bits)
 138{
 139        int i;
 140
 141        for (i = 0; i < 2000; i++) {
 142                u32 buffer = p54spi_read32(priv, reg);
 143                if ((buffer & bits) == bits)
 144                        return 1;
 145        }
 146        return 0;
 147}
 148
 149static int p54spi_spi_write_dma(struct p54s_priv *priv, __le32 base,
 150                                const void *buf, size_t len)
 151{
 152        if (!p54spi_wait_bit(priv, SPI_ADRS_DMA_WRITE_CTRL, HOST_ALLOWED)) {
 153                dev_err(&priv->spi->dev, "spi_write_dma not allowed "
 154                        "to DMA write.\n");
 155                return -EAGAIN;
 156        }
 157
 158        p54spi_write16(priv, SPI_ADRS_DMA_WRITE_CTRL,
 159                       cpu_to_le16(SPI_DMA_WRITE_CTRL_ENABLE));
 160
 161        p54spi_write16(priv, SPI_ADRS_DMA_WRITE_LEN, cpu_to_le16(len));
 162        p54spi_write32(priv, SPI_ADRS_DMA_WRITE_BASE, base);
 163        p54spi_spi_write(priv, SPI_ADRS_DMA_DATA, buf, len);
 164        return 0;
 165}
 166
 167static int p54spi_request_firmware(struct ieee80211_hw *dev)
 168{
 169        struct p54s_priv *priv = dev->priv;
 170        int ret;
 171
 172        /* FIXME: should driver use it's own struct device? */
 173        ret = request_firmware(&priv->firmware, "3826.arm", &priv->spi->dev);
 174
 175        if (ret < 0) {
 176                dev_err(&priv->spi->dev, "request_firmware() failed: %d", ret);
 177                return ret;
 178        }
 179
 180        ret = p54_parse_firmware(dev, priv->firmware);
 181        if (ret) {
 182                release_firmware(priv->firmware);
 183                return ret;
 184        }
 185
 186        return 0;
 187}
 188
 189static int p54spi_request_eeprom(struct ieee80211_hw *dev)
 190{
 191        struct p54s_priv *priv = dev->priv;
 192        const struct firmware *eeprom;
 193        int ret;
 194
 195        /*
 196         * allow users to customize their eeprom.
 197         */
 198
 199        ret = request_firmware(&eeprom, "3826.eeprom", &priv->spi->dev);
 200        if (ret < 0) {
 201#ifdef CONFIG_P54_SPI_DEFAULT_EEPROM
 202                dev_info(&priv->spi->dev, "loading default eeprom...\n");
 203                ret = p54_parse_eeprom(dev, (void *) p54spi_eeprom,
 204                                       sizeof(p54spi_eeprom));
 205#else
 206                dev_err(&priv->spi->dev, "Failed to request user eeprom\n");
 207#endif /* CONFIG_P54_SPI_DEFAULT_EEPROM */
 208        } else {
 209                dev_info(&priv->spi->dev, "loading user eeprom...\n");
 210                ret = p54_parse_eeprom(dev, (void *) eeprom->data,
 211                                       (int)eeprom->size);
 212                release_firmware(eeprom);
 213        }
 214        return ret;
 215}
 216
 217static int p54spi_upload_firmware(struct ieee80211_hw *dev)
 218{
 219        struct p54s_priv *priv = dev->priv;
 220        unsigned long fw_len, _fw_len;
 221        unsigned int offset = 0;
 222        int err = 0;
 223        u8 *fw;
 224
 225        fw_len = priv->firmware->size;
 226        fw = kmemdup(priv->firmware->data, fw_len, GFP_KERNEL);
 227        if (!fw)
 228                return -ENOMEM;
 229
 230        /* stop the device */
 231        p54spi_write16(priv, SPI_ADRS_DEV_CTRL_STAT, cpu_to_le16(
 232                       SPI_CTRL_STAT_HOST_OVERRIDE | SPI_CTRL_STAT_HOST_RESET |
 233                       SPI_CTRL_STAT_START_HALTED));
 234
 235        msleep(TARGET_BOOT_SLEEP);
 236
 237        p54spi_write16(priv, SPI_ADRS_DEV_CTRL_STAT, cpu_to_le16(
 238                       SPI_CTRL_STAT_HOST_OVERRIDE |
 239                       SPI_CTRL_STAT_START_HALTED));
 240
 241        msleep(TARGET_BOOT_SLEEP);
 242
 243        while (fw_len > 0) {
 244                _fw_len = min_t(long, fw_len, SPI_MAX_PACKET_SIZE);
 245
 246                err = p54spi_spi_write_dma(priv, cpu_to_le32(
 247                                           ISL38XX_DEV_FIRMWARE_ADDR + offset),
 248                                           (fw + offset), _fw_len);
 249                if (err < 0)
 250                        goto out;
 251
 252                fw_len -= _fw_len;
 253                offset += _fw_len;
 254        }
 255
 256        BUG_ON(fw_len != 0);
 257
 258        /* enable host interrupts */
 259        p54spi_write32(priv, SPI_ADRS_HOST_INT_EN,
 260                       cpu_to_le32(SPI_HOST_INTS_DEFAULT));
 261
 262        /* boot the device */
 263        p54spi_write16(priv, SPI_ADRS_DEV_CTRL_STAT, cpu_to_le16(
 264                       SPI_CTRL_STAT_HOST_OVERRIDE | SPI_CTRL_STAT_HOST_RESET |
 265                       SPI_CTRL_STAT_RAM_BOOT));
 266
 267        msleep(TARGET_BOOT_SLEEP);
 268
 269        p54spi_write16(priv, SPI_ADRS_DEV_CTRL_STAT, cpu_to_le16(
 270                       SPI_CTRL_STAT_HOST_OVERRIDE | SPI_CTRL_STAT_RAM_BOOT));
 271        msleep(TARGET_BOOT_SLEEP);
 272
 273out:
 274        kfree(fw);
 275        return err;
 276}
 277
 278static void p54spi_power_off(struct p54s_priv *priv)
 279{
 280        disable_irq(gpio_to_irq(p54spi_gpio_irq));
 281        gpio_set_value(p54spi_gpio_power, 0);
 282}
 283
 284static void p54spi_power_on(struct p54s_priv *priv)
 285{
 286        gpio_set_value(p54spi_gpio_power, 1);
 287        enable_irq(gpio_to_irq(p54spi_gpio_irq));
 288
 289        /*
 290         * need to wait a while before device can be accessed, the length
 291         * is just a guess
 292         */
 293        msleep(10);
 294}
 295
 296static inline void p54spi_int_ack(struct p54s_priv *priv, u32 val)
 297{
 298        p54spi_write32(priv, SPI_ADRS_HOST_INT_ACK, cpu_to_le32(val));
 299}
 300
 301static int p54spi_wakeup(struct p54s_priv *priv)
 302{
 303        /* wake the chip */
 304        p54spi_write32(priv, SPI_ADRS_ARM_INTERRUPTS,
 305                       cpu_to_le32(SPI_TARGET_INT_WAKEUP));
 306
 307        /* And wait for the READY interrupt */
 308        if (!p54spi_wait_bit(priv, SPI_ADRS_HOST_INTERRUPTS,
 309                             SPI_HOST_INT_READY)) {
 310                dev_err(&priv->spi->dev, "INT_READY timeout\n");
 311                return -EBUSY;
 312        }
 313
 314        p54spi_int_ack(priv, SPI_HOST_INT_READY);
 315        return 0;
 316}
 317
 318static inline void p54spi_sleep(struct p54s_priv *priv)
 319{
 320        p54spi_write32(priv, SPI_ADRS_ARM_INTERRUPTS,
 321                       cpu_to_le32(SPI_TARGET_INT_SLEEP));
 322}
 323
 324static void p54spi_int_ready(struct p54s_priv *priv)
 325{
 326        p54spi_write32(priv, SPI_ADRS_HOST_INT_EN, cpu_to_le32(
 327                       SPI_HOST_INT_UPDATE | SPI_HOST_INT_SW_UPDATE));
 328
 329        switch (priv->fw_state) {
 330        case FW_STATE_BOOTING:
 331                priv->fw_state = FW_STATE_READY;
 332                complete(&priv->fw_comp);
 333                break;
 334        case FW_STATE_RESETTING:
 335                priv->fw_state = FW_STATE_READY;
 336                /* TODO: reinitialize state */
 337                break;
 338        default:
 339                break;
 340        }
 341}
 342
 343static int p54spi_rx(struct p54s_priv *priv)
 344{
 345        struct sk_buff *skb;
 346        u16 len;
 347        u16 rx_head[2];
 348#define READAHEAD_SZ (sizeof(rx_head)-sizeof(u16))
 349
 350        if (p54spi_wakeup(priv) < 0)
 351                return -EBUSY;
 352
 353        /* Read data size and first data word in one SPI transaction
 354         * This is workaround for firmware/DMA bug,
 355         * when first data word gets lost under high load.
 356         */
 357        p54spi_spi_read(priv, SPI_ADRS_DMA_DATA, rx_head, sizeof(rx_head));
 358        len = rx_head[0];
 359
 360        if (len == 0) {
 361                p54spi_sleep(priv);
 362                dev_err(&priv->spi->dev, "rx request of zero bytes\n");
 363                return 0;
 364        }
 365
 366        /* Firmware may insert up to 4 padding bytes after the lmac header,
 367         * but it does not amend the size of SPI data transfer.
 368         * Such packets has correct data size in header, thus referencing
 369         * past the end of allocated skb. Reserve extra 4 bytes for this case */
 370        skb = dev_alloc_skb(len + 4);
 371        if (!skb) {
 372                p54spi_sleep(priv);
 373                dev_err(&priv->spi->dev, "could not alloc skb");
 374                return -ENOMEM;
 375        }
 376
 377        if (len <= READAHEAD_SZ) {
 378                memcpy(skb_put(skb, len), rx_head + 1, len);
 379        } else {
 380                memcpy(skb_put(skb, READAHEAD_SZ), rx_head + 1, READAHEAD_SZ);
 381                p54spi_spi_read(priv, SPI_ADRS_DMA_DATA,
 382                                skb_put(skb, len - READAHEAD_SZ),
 383                                len - READAHEAD_SZ);
 384        }
 385        p54spi_sleep(priv);
 386        /* Put additional bytes to compensate for the possible
 387         * alignment-caused truncation */
 388        skb_put(skb, 4);
 389
 390        if (p54_rx(priv->hw, skb) == 0)
 391                dev_kfree_skb(skb);
 392
 393        return 0;
 394}
 395
 396
 397static irqreturn_t p54spi_interrupt(int irq, void *config)
 398{
 399        struct spi_device *spi = config;
 400        struct p54s_priv *priv = dev_get_drvdata(&spi->dev);
 401
 402        ieee80211_queue_work(priv->hw, &priv->work);
 403
 404        return IRQ_HANDLED;
 405}
 406
 407static int p54spi_tx_frame(struct p54s_priv *priv, struct sk_buff *skb)
 408{
 409        struct p54_hdr *hdr = (struct p54_hdr *) skb->data;
 410        int ret = 0;
 411
 412        if (p54spi_wakeup(priv) < 0)
 413                return -EBUSY;
 414
 415        ret = p54spi_spi_write_dma(priv, hdr->req_id, skb->data, skb->len);
 416        if (ret < 0)
 417                goto out;
 418
 419        if (!p54spi_wait_bit(priv, SPI_ADRS_HOST_INTERRUPTS,
 420                             SPI_HOST_INT_WR_READY)) {
 421                dev_err(&priv->spi->dev, "WR_READY timeout\n");
 422                ret = -EAGAIN;
 423                goto out;
 424        }
 425
 426        p54spi_int_ack(priv, SPI_HOST_INT_WR_READY);
 427
 428        if (FREE_AFTER_TX(skb))
 429                p54_free_skb(priv->hw, skb);
 430out:
 431        p54spi_sleep(priv);
 432        return ret;
 433}
 434
 435static int p54spi_wq_tx(struct p54s_priv *priv)
 436{
 437        struct p54s_tx_info *entry;
 438        struct sk_buff *skb;
 439        struct ieee80211_tx_info *info;
 440        struct p54_tx_info *minfo;
 441        struct p54s_tx_info *dinfo;
 442        unsigned long flags;
 443        int ret = 0;
 444
 445        spin_lock_irqsave(&priv->tx_lock, flags);
 446
 447        while (!list_empty(&priv->tx_pending)) {
 448                entry = list_entry(priv->tx_pending.next,
 449                                   struct p54s_tx_info, tx_list);
 450
 451                list_del_init(&entry->tx_list);
 452
 453                spin_unlock_irqrestore(&priv->tx_lock, flags);
 454
 455                dinfo = container_of((void *) entry, struct p54s_tx_info,
 456                                     tx_list);
 457                minfo = container_of((void *) dinfo, struct p54_tx_info,
 458                                     data);
 459                info = container_of((void *) minfo, struct ieee80211_tx_info,
 460                                    rate_driver_data);
 461                skb = container_of((void *) info, struct sk_buff, cb);
 462
 463                ret = p54spi_tx_frame(priv, skb);
 464
 465                if (ret < 0) {
 466                        p54_free_skb(priv->hw, skb);
 467                        return ret;
 468                }
 469
 470                spin_lock_irqsave(&priv->tx_lock, flags);
 471        }
 472        spin_unlock_irqrestore(&priv->tx_lock, flags);
 473        return ret;
 474}
 475
 476static void p54spi_op_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
 477{
 478        struct p54s_priv *priv = dev->priv;
 479        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 480        struct p54_tx_info *mi = (struct p54_tx_info *) info->rate_driver_data;
 481        struct p54s_tx_info *di = (struct p54s_tx_info *) mi->data;
 482        unsigned long flags;
 483
 484        BUILD_BUG_ON(sizeof(*di) > sizeof((mi->data)));
 485
 486        spin_lock_irqsave(&priv->tx_lock, flags);
 487        list_add_tail(&di->tx_list, &priv->tx_pending);
 488        spin_unlock_irqrestore(&priv->tx_lock, flags);
 489
 490        ieee80211_queue_work(priv->hw, &priv->work);
 491}
 492
 493static void p54spi_work(struct work_struct *work)
 494{
 495        struct p54s_priv *priv = container_of(work, struct p54s_priv, work);
 496        u32 ints;
 497        int ret;
 498
 499        mutex_lock(&priv->mutex);
 500
 501        if (priv->fw_state == FW_STATE_OFF)
 502                goto out;
 503
 504        ints = p54spi_read32(priv, SPI_ADRS_HOST_INTERRUPTS);
 505
 506        if (ints & SPI_HOST_INT_READY) {
 507                p54spi_int_ready(priv);
 508                p54spi_int_ack(priv, SPI_HOST_INT_READY);
 509        }
 510
 511        if (priv->fw_state != FW_STATE_READY)
 512                goto out;
 513
 514        if (ints & SPI_HOST_INT_UPDATE) {
 515                p54spi_int_ack(priv, SPI_HOST_INT_UPDATE);
 516                ret = p54spi_rx(priv);
 517                if (ret < 0)
 518                        goto out;
 519        }
 520        if (ints & SPI_HOST_INT_SW_UPDATE) {
 521                p54spi_int_ack(priv, SPI_HOST_INT_SW_UPDATE);
 522                ret = p54spi_rx(priv);
 523                if (ret < 0)
 524                        goto out;
 525        }
 526
 527        ret = p54spi_wq_tx(priv);
 528out:
 529        mutex_unlock(&priv->mutex);
 530}
 531
 532static int p54spi_op_start(struct ieee80211_hw *dev)
 533{
 534        struct p54s_priv *priv = dev->priv;
 535        unsigned long timeout;
 536        int ret = 0;
 537
 538        if (mutex_lock_interruptible(&priv->mutex)) {
 539                ret = -EINTR;
 540                goto out;
 541        }
 542
 543        priv->fw_state = FW_STATE_BOOTING;
 544
 545        p54spi_power_on(priv);
 546
 547        ret = p54spi_upload_firmware(dev);
 548        if (ret < 0) {
 549                p54spi_power_off(priv);
 550                goto out_unlock;
 551        }
 552
 553        mutex_unlock(&priv->mutex);
 554
 555        timeout = msecs_to_jiffies(2000);
 556        timeout = wait_for_completion_interruptible_timeout(&priv->fw_comp,
 557                                                            timeout);
 558        if (!timeout) {
 559                dev_err(&priv->spi->dev, "firmware boot failed");
 560                p54spi_power_off(priv);
 561                ret = -1;
 562                goto out;
 563        }
 564
 565        if (mutex_lock_interruptible(&priv->mutex)) {
 566                ret = -EINTR;
 567                p54spi_power_off(priv);
 568                goto out;
 569        }
 570
 571        WARN_ON(priv->fw_state != FW_STATE_READY);
 572
 573out_unlock:
 574        mutex_unlock(&priv->mutex);
 575
 576out:
 577        return ret;
 578}
 579
 580static void p54spi_op_stop(struct ieee80211_hw *dev)
 581{
 582        struct p54s_priv *priv = dev->priv;
 583        unsigned long flags;
 584
 585        if (mutex_lock_interruptible(&priv->mutex)) {
 586                /* FIXME: how to handle this error? */
 587                return;
 588        }
 589
 590        WARN_ON(priv->fw_state != FW_STATE_READY);
 591
 592        cancel_work_sync(&priv->work);
 593
 594        p54spi_power_off(priv);
 595        spin_lock_irqsave(&priv->tx_lock, flags);
 596        INIT_LIST_HEAD(&priv->tx_pending);
 597        spin_unlock_irqrestore(&priv->tx_lock, flags);
 598
 599        priv->fw_state = FW_STATE_OFF;
 600        mutex_unlock(&priv->mutex);
 601}
 602
 603static int __devinit p54spi_probe(struct spi_device *spi)
 604{
 605        struct p54s_priv *priv = NULL;
 606        struct ieee80211_hw *hw;
 607        int ret = -EINVAL;
 608
 609        hw = p54_init_common(sizeof(*priv));
 610        if (!hw) {
 611                dev_err(&spi->dev, "could not alloc ieee80211_hw");
 612                return -ENOMEM;
 613        }
 614
 615        priv = hw->priv;
 616        priv->hw = hw;
 617        dev_set_drvdata(&spi->dev, priv);
 618        priv->spi = spi;
 619
 620        spi->bits_per_word = 16;
 621        spi->max_speed_hz = 24000000;
 622
 623        ret = spi_setup(spi);
 624        if (ret < 0) {
 625                dev_err(&priv->spi->dev, "spi_setup failed");
 626                goto err_free_common;
 627        }
 628
 629        ret = gpio_request(p54spi_gpio_power, "p54spi power");
 630        if (ret < 0) {
 631                dev_err(&priv->spi->dev, "power GPIO request failed: %d", ret);
 632                goto err_free_common;
 633        }
 634
 635        ret = gpio_request(p54spi_gpio_irq, "p54spi irq");
 636        if (ret < 0) {
 637                dev_err(&priv->spi->dev, "irq GPIO request failed: %d", ret);
 638                goto err_free_common;
 639        }
 640
 641        gpio_direction_output(p54spi_gpio_power, 0);
 642        gpio_direction_input(p54spi_gpio_irq);
 643
 644        ret = request_irq(gpio_to_irq(p54spi_gpio_irq),
 645                          p54spi_interrupt, IRQF_DISABLED, "p54spi",
 646                          priv->spi);
 647        if (ret < 0) {
 648                dev_err(&priv->spi->dev, "request_irq() failed");
 649                goto err_free_common;
 650        }
 651
 652        irq_set_irq_type(gpio_to_irq(p54spi_gpio_irq), IRQ_TYPE_EDGE_RISING);
 653
 654        disable_irq(gpio_to_irq(p54spi_gpio_irq));
 655
 656        INIT_WORK(&priv->work, p54spi_work);
 657        init_completion(&priv->fw_comp);
 658        INIT_LIST_HEAD(&priv->tx_pending);
 659        mutex_init(&priv->mutex);
 660        SET_IEEE80211_DEV(hw, &spi->dev);
 661        priv->common.open = p54spi_op_start;
 662        priv->common.stop = p54spi_op_stop;
 663        priv->common.tx = p54spi_op_tx;
 664
 665        ret = p54spi_request_firmware(hw);
 666        if (ret < 0)
 667                goto err_free_common;
 668
 669        ret = p54spi_request_eeprom(hw);
 670        if (ret)
 671                goto err_free_common;
 672
 673        ret = p54_register_common(hw, &priv->spi->dev);
 674        if (ret)
 675                goto err_free_common;
 676
 677        return 0;
 678
 679err_free_common:
 680        p54_free_common(priv->hw);
 681        return ret;
 682}
 683
 684static int __devexit p54spi_remove(struct spi_device *spi)
 685{
 686        struct p54s_priv *priv = dev_get_drvdata(&spi->dev);
 687
 688        p54_unregister_common(priv->hw);
 689
 690        free_irq(gpio_to_irq(p54spi_gpio_irq), spi);
 691
 692        gpio_free(p54spi_gpio_power);
 693        gpio_free(p54spi_gpio_irq);
 694        release_firmware(priv->firmware);
 695
 696        mutex_destroy(&priv->mutex);
 697
 698        p54_free_common(priv->hw);
 699
 700        return 0;
 701}
 702
 703
 704static struct spi_driver p54spi_driver = {
 705        .driver = {
 706                .name           = "p54spi",
 707                .bus            = &spi_bus_type,
 708                .owner          = THIS_MODULE,
 709        },
 710
 711        .probe          = p54spi_probe,
 712        .remove         = __devexit_p(p54spi_remove),
 713};
 714
 715static int __init p54spi_init(void)
 716{
 717        int ret;
 718
 719        ret = spi_register_driver(&p54spi_driver);
 720        if (ret < 0) {
 721                printk(KERN_ERR "failed to register SPI driver: %d", ret);
 722                goto out;
 723        }
 724
 725out:
 726        return ret;
 727}
 728
 729static void __exit p54spi_exit(void)
 730{
 731        spi_unregister_driver(&p54spi_driver);
 732}
 733
 734module_init(p54spi_init);
 735module_exit(p54spi_exit);
 736
 737MODULE_LICENSE("GPL");
 738MODULE_AUTHOR("Christian Lamparter <chunkeey@web.de>");
 739MODULE_ALIAS("spi:cx3110x");
 740MODULE_ALIAS("spi:p54spi");
 741