cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

p54spi.c (16413B)


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