spi.c 10.8 KB
Newer Older
L
Luciano Coelho 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
 * This file is part of wl1271
 *
 * Copyright (C) 2008-2009 Nokia Corporation
 *
 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * 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., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 *
 */

24
#include <linux/irq.h>
L
Luciano Coelho 已提交
25 26 27
#include <linux/module.h>
#include <linux/crc7.h>
#include <linux/spi/spi.h>
28
#include <linux/wl12xx.h>
29
#include <linux/slab.h>
L
Luciano Coelho 已提交
30

S
Shahar Levi 已提交
31
#include "wl12xx.h"
L
Luciano Coelho 已提交
32
#include "wl12xx_80211.h"
S
Shahar Levi 已提交
33
#include "io.h"
L
Luciano Coelho 已提交
34

S
Shahar Levi 已提交
35
#include "reg.h"
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

#define WSPI_CMD_READ                 0x40000000
#define WSPI_CMD_WRITE                0x00000000
#define WSPI_CMD_FIXED                0x20000000
#define WSPI_CMD_BYTE_LENGTH          0x1FFE0000
#define WSPI_CMD_BYTE_LENGTH_OFFSET   17
#define WSPI_CMD_BYTE_ADDR            0x0001FFFF

#define WSPI_INIT_CMD_CRC_LEN       5

#define WSPI_INIT_CMD_START         0x00
#define WSPI_INIT_CMD_TX            0x40
/* the extra bypass bit is sampled by the TNET as '1' */
#define WSPI_INIT_CMD_BYPASS_BIT    0x80
#define WSPI_INIT_CMD_FIXEDBUSY_LEN 0x07
#define WSPI_INIT_CMD_EN_FIXEDBUSY  0x80
#define WSPI_INIT_CMD_DIS_FIXEDBUSY 0x00
#define WSPI_INIT_CMD_IOD           0x40
#define WSPI_INIT_CMD_IP            0x20
#define WSPI_INIT_CMD_CS            0x10
#define WSPI_INIT_CMD_WS            0x08
#define WSPI_INIT_CMD_WSPI          0x01
#define WSPI_INIT_CMD_END           0x01

#define WSPI_INIT_CMD_LEN           8

#define HW_ACCESS_WSPI_FIXED_BUSY_LEN \
		((WL1271_BUSY_WORD_LEN - 4) / sizeof(u32))
#define HW_ACCESS_WSPI_INIT_CMD_MASK  0

I
Ido Yariv 已提交
66 67 68 69 70
/* HW limitation: maximum possible chunk size is 4095 bytes */
#define WSPI_MAX_CHUNK_SIZE    4092

#define WSPI_MAX_NUM_OF_CHUNKS (WL1271_AGGR_BUFFER_SIZE / WSPI_MAX_CHUNK_SIZE)

T
Teemu Paasikivi 已提交
71
static inline struct spi_device *wl_to_spi(struct wl1271 *wl)
72 73 74 75 76 77 78 79
{
	return wl->if_priv;
}

static struct device *wl1271_spi_wl_to_dev(struct wl1271 *wl)
{
	return &(wl_to_spi(wl)->dev);
}
L
Luciano Coelho 已提交
80

81
static void wl1271_spi_disable_interrupts(struct wl1271 *wl)
82 83 84 85
{
	disable_irq(wl->irq);
}

86
static void wl1271_spi_enable_interrupts(struct wl1271 *wl)
87 88 89 90
{
	enable_irq(wl->irq);
}

91
static void wl1271_spi_reset(struct wl1271 *wl)
L
Luciano Coelho 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
{
	u8 *cmd;
	struct spi_transfer t;
	struct spi_message m;

	cmd = kzalloc(WSPI_INIT_CMD_LEN, GFP_KERNEL);
	if (!cmd) {
		wl1271_error("could not allocate cmd for spi reset");
		return;
	}

	memset(&t, 0, sizeof(t));
	spi_message_init(&m);

	memset(cmd, 0xff, WSPI_INIT_CMD_LEN);

	t.tx_buf = cmd;
	t.len = WSPI_INIT_CMD_LEN;
	spi_message_add_tail(&t, &m);

112
	spi_sync(wl_to_spi(wl), &m);
L
Luciano Coelho 已提交
113 114

	wl1271_dump(DEBUG_SPI, "spi reset -> ", cmd, WSPI_INIT_CMD_LEN);
115
	kfree(cmd);
L
Luciano Coelho 已提交
116 117
}

118
static void wl1271_spi_init(struct wl1271 *wl)
L
Luciano Coelho 已提交
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
{
	u8 crc[WSPI_INIT_CMD_CRC_LEN], *cmd;
	struct spi_transfer t;
	struct spi_message m;

	cmd = kzalloc(WSPI_INIT_CMD_LEN, GFP_KERNEL);
	if (!cmd) {
		wl1271_error("could not allocate cmd for spi init");
		return;
	}

	memset(crc, 0, sizeof(crc));
	memset(&t, 0, sizeof(t));
	spi_message_init(&m);

	/*
	 * Set WSPI_INIT_COMMAND
	 * the data is being send from the MSB to LSB
	 */
	cmd[2] = 0xff;
	cmd[3] = 0xff;
	cmd[1] = WSPI_INIT_CMD_START | WSPI_INIT_CMD_TX;
	cmd[0] = 0;
	cmd[7] = 0;
	cmd[6] |= HW_ACCESS_WSPI_INIT_CMD_MASK << 3;
	cmd[6] |= HW_ACCESS_WSPI_FIXED_BUSY_LEN & WSPI_INIT_CMD_FIXEDBUSY_LEN;

	if (HW_ACCESS_WSPI_FIXED_BUSY_LEN == 0)
		cmd[5] |=  WSPI_INIT_CMD_DIS_FIXEDBUSY;
	else
		cmd[5] |= WSPI_INIT_CMD_EN_FIXEDBUSY;

	cmd[5] |= WSPI_INIT_CMD_IOD | WSPI_INIT_CMD_IP | WSPI_INIT_CMD_CS
		| WSPI_INIT_CMD_WSPI | WSPI_INIT_CMD_WS;

	crc[0] = cmd[1];
	crc[1] = cmd[0];
	crc[2] = cmd[7];
	crc[3] = cmd[6];
	crc[4] = cmd[5];

	cmd[4] |= crc7(0, crc, WSPI_INIT_CMD_CRC_LEN) << 1;
	cmd[4] |= WSPI_INIT_CMD_END;

	t.tx_buf = cmd;
	t.len = WSPI_INIT_CMD_LEN;
	spi_message_add_tail(&t, &m);

167
	spi_sync(wl_to_spi(wl), &m);
L
Luciano Coelho 已提交
168
	wl1271_dump(DEBUG_SPI, "spi init -> ", cmd, WSPI_INIT_CMD_LEN);
169
	kfree(cmd);
L
Luciano Coelho 已提交
170 171
}

172 173
#define WL1271_BUSY_WORD_TIMEOUT 1000

174
static int wl1271_spi_read_busy(struct wl1271 *wl)
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
{
	struct spi_transfer t[1];
	struct spi_message m;
	u32 *busy_buf;
	int num_busy_bytes = 0;

	/*
	 * Read further busy words from SPI until a non-busy word is
	 * encountered, then read the data itself into the buffer.
	 */

	num_busy_bytes = WL1271_BUSY_WORD_TIMEOUT;
	busy_buf = wl->buffer_busyword;
	while (num_busy_bytes) {
		num_busy_bytes--;
		spi_message_init(&m);
		memset(t, 0, sizeof(t));
		t[0].rx_buf = busy_buf;
		t[0].len = sizeof(u32);
194
		t[0].cs_change = true;
195
		spi_message_add_tail(&t[0], &m);
196
		spi_sync(wl_to_spi(wl), &m);
197

198 199
		if (*busy_buf & 0x1)
			return 0;
200 201 202 203
	}

	/* The SPI bus is unresponsive, the read failed. */
	wl1271_error("SPI read busy-word timeout!\n");
204
	return -ETIMEDOUT;
205 206
}

207
static void wl1271_spi_raw_read(struct wl1271 *wl, int addr, void *buf,
208
				size_t len, bool fixed)
L
Luciano Coelho 已提交
209
{
I
Ido Yariv 已提交
210
	struct spi_transfer t[2];
L
Luciano Coelho 已提交
211
	struct spi_message m;
212
	u32 *busy_buf;
L
Luciano Coelho 已提交
213
	u32 *cmd;
I
Ido Yariv 已提交
214
	u32 chunk_len;
L
Luciano Coelho 已提交
215

I
Ido Yariv 已提交
216 217
	while (len > 0) {
		chunk_len = min((size_t)WSPI_MAX_CHUNK_SIZE, len);
L
Luciano Coelho 已提交
218

I
Ido Yariv 已提交
219 220
		cmd = &wl->buffer_cmd;
		busy_buf = wl->buffer_busyword;
L
Luciano Coelho 已提交
221

I
Ido Yariv 已提交
222 223 224 225 226
		*cmd = 0;
		*cmd |= WSPI_CMD_READ;
		*cmd |= (chunk_len << WSPI_CMD_BYTE_LENGTH_OFFSET) &
			WSPI_CMD_BYTE_LENGTH;
		*cmd |= addr & WSPI_CMD_BYTE_ADDR;
L
Luciano Coelho 已提交
227

I
Ido Yariv 已提交
228 229
		if (fixed)
			*cmd |= WSPI_CMD_FIXED;
L
Luciano Coelho 已提交
230

I
Ido Yariv 已提交
231 232
		spi_message_init(&m);
		memset(t, 0, sizeof(t));
L
Luciano Coelho 已提交
233

I
Ido Yariv 已提交
234 235 236 237
		t[0].tx_buf = cmd;
		t[0].len = 4;
		t[0].cs_change = true;
		spi_message_add_tail(&t[0], &m);
L
Luciano Coelho 已提交
238

I
Ido Yariv 已提交
239 240 241 242 243
		/* Busy and non busy words read */
		t[1].rx_buf = busy_buf;
		t[1].len = WL1271_BUSY_WORD_LEN;
		t[1].cs_change = true;
		spi_message_add_tail(&t[1], &m);
L
Luciano Coelho 已提交
244

I
Ido Yariv 已提交
245
		spi_sync(wl_to_spi(wl), &m);
246

I
Ido Yariv 已提交
247 248 249 250 251
		if (!(busy_buf[WL1271_BUSY_WORD_CNT - 1] & 0x1) &&
		    wl1271_spi_read_busy(wl)) {
			memset(buf, 0, chunk_len);
			return;
		}
252

I
Ido Yariv 已提交
253 254
		spi_message_init(&m);
		memset(t, 0, sizeof(t));
255

I
Ido Yariv 已提交
256 257 258 259 260 261
		t[0].rx_buf = buf;
		t[0].len = chunk_len;
		t[0].cs_change = true;
		spi_message_add_tail(&t[0], &m);

		spi_sync(wl_to_spi(wl), &m);
L
Luciano Coelho 已提交
262

I
Ido Yariv 已提交
263 264 265 266 267 268 269 270
		wl1271_dump(DEBUG_SPI, "spi_read cmd -> ", cmd, sizeof(*cmd));
		wl1271_dump(DEBUG_SPI, "spi_read buf <- ", buf, chunk_len);

		if (!fixed)
			addr += chunk_len;
		buf += chunk_len;
		len -= chunk_len;
	}
L
Luciano Coelho 已提交
271 272
}

273
static void wl1271_spi_raw_write(struct wl1271 *wl, int addr, void *buf,
274
			  size_t len, bool fixed)
L
Luciano Coelho 已提交
275
{
I
Ido Yariv 已提交
276
	struct spi_transfer t[2 * WSPI_MAX_NUM_OF_CHUNKS];
L
Luciano Coelho 已提交
277
	struct spi_message m;
I
Ido Yariv 已提交
278
	u32 commands[WSPI_MAX_NUM_OF_CHUNKS];
L
Luciano Coelho 已提交
279
	u32 *cmd;
I
Ido Yariv 已提交
280 281
	u32 chunk_len;
	int i;
L
Luciano Coelho 已提交
282

I
Ido Yariv 已提交
283
	WARN_ON(len > WL1271_AGGR_BUFFER_SIZE);
L
Luciano Coelho 已提交
284 285 286 287

	spi_message_init(&m);
	memset(t, 0, sizeof(t));

I
Ido Yariv 已提交
288 289 290 291
	cmd = &commands[0];
	i = 0;
	while (len > 0) {
		chunk_len = min((size_t)WSPI_MAX_CHUNK_SIZE, len);
L
Luciano Coelho 已提交
292

I
Ido Yariv 已提交
293 294 295 296 297
		*cmd = 0;
		*cmd |= WSPI_CMD_WRITE;
		*cmd |= (chunk_len << WSPI_CMD_BYTE_LENGTH_OFFSET) &
			WSPI_CMD_BYTE_LENGTH;
		*cmd |= addr & WSPI_CMD_BYTE_ADDR;
L
Luciano Coelho 已提交
298

I
Ido Yariv 已提交
299 300 301 302 303 304 305 306 307 308
		if (fixed)
			*cmd |= WSPI_CMD_FIXED;

		t[i].tx_buf = cmd;
		t[i].len = sizeof(*cmd);
		spi_message_add_tail(&t[i++], &m);

		t[i].tx_buf = buf;
		t[i].len = chunk_len;
		spi_message_add_tail(&t[i++], &m);
L
Luciano Coelho 已提交
309

I
Ido Yariv 已提交
310 311 312 313 314 315 316 317 318 319 320
		wl1271_dump(DEBUG_SPI, "spi_write cmd -> ", cmd, sizeof(*cmd));
		wl1271_dump(DEBUG_SPI, "spi_write buf -> ", buf, chunk_len);

		if (!fixed)
			addr += chunk_len;
		buf += chunk_len;
		len -= chunk_len;
		cmd++;
	}

	spi_sync(wl_to_spi(wl), &m);
L
Luciano Coelho 已提交
321
}
322

323
static irqreturn_t wl1271_hardirq(int irq, void *cookie)
324
{
325
	struct wl1271 *wl = cookie;
326 327 328 329 330 331
	unsigned long flags;

	wl1271_debug(DEBUG_IRQ, "IRQ");

	/* complete the ELP completion */
	spin_lock_irqsave(&wl->wl_lock, flags);
332
	set_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
333 334 335 336 337 338
	if (wl->elp_compl) {
		complete(wl->elp_compl);
		wl->elp_compl = NULL;
	}
	spin_unlock_irqrestore(&wl->wl_lock, flags);

339
	return IRQ_WAKE_THREAD;
340 341
}

342
static int wl1271_spi_set_power(struct wl1271 *wl, bool enable)
343 344 345
{
	if (wl->set_power)
		wl->set_power(enable);
346 347

	return 0;
348 349
}

350 351 352 353 354
static struct wl1271_if_operations spi_ops = {
	.read		= wl1271_spi_raw_read,
	.write		= wl1271_spi_raw_write,
	.reset		= wl1271_spi_reset,
	.init		= wl1271_spi_init,
355
	.power		= wl1271_spi_set_power,
356 357 358 359 360
	.dev		= wl1271_spi_wl_to_dev,
	.enable_irq	= wl1271_spi_enable_interrupts,
	.disable_irq	= wl1271_spi_disable_interrupts
};

361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
static int __devinit wl1271_probe(struct spi_device *spi)
{
	struct wl12xx_platform_data *pdata;
	struct ieee80211_hw *hw;
	struct wl1271 *wl;
	int ret;

	pdata = spi->dev.platform_data;
	if (!pdata) {
		wl1271_error("no platform data");
		return -ENODEV;
	}

	hw = wl1271_alloc_hw();
	if (IS_ERR(hw))
		return PTR_ERR(hw);

	wl = hw->priv;

	dev_set_drvdata(&spi->dev, wl);
381 382 383
	wl->if_priv = spi;

	wl->if_ops = &spi_ops;
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401

	/* This is the only SPI value that we need to set here, the rest
	 * comes from the board-peripherals file */
	spi->bits_per_word = 32;

	ret = spi_setup(spi);
	if (ret < 0) {
		wl1271_error("spi_setup failed");
		goto out_free;
	}

	wl->set_power = pdata->set_power;
	if (!wl->set_power) {
		wl1271_error("set power function missing in platform data");
		ret = -ENODEV;
		goto out_free;
	}

402 403
	wl->ref_clock = pdata->board_ref_clock;

404 405 406 407 408 409 410
	wl->irq = spi->irq;
	if (wl->irq < 0) {
		wl1271_error("irq missing in platform data");
		ret = -ENODEV;
		goto out_free;
	}

411
	ret = request_threaded_irq(wl->irq, wl1271_hardirq, wl1271_irq,
412
				   IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
413
				   DRIVER_NAME, wl);
414 415 416 417 418 419 420 421 422
	if (ret < 0) {
		wl1271_error("request_irq() failed: %d", ret);
		goto out_free;
	}

	disable_irq(wl->irq);

	ret = wl1271_init_ieee80211(wl);
	if (ret)
423
		goto out_irq;
424 425 426

	ret = wl1271_register_hw(wl);
	if (ret)
427
		goto out_irq;
428 429 430 431 432 433 434 435 436

	wl1271_notice("initialized");

	return 0;

 out_irq:
	free_irq(wl->irq, wl);

 out_free:
437
	wl1271_free_hw(wl);
438 439 440 441 442 443 444 445

	return ret;
}

static int __devexit wl1271_remove(struct spi_device *spi)
{
	struct wl1271 *wl = dev_get_drvdata(&spi->dev);

446
	wl1271_unregister_hw(wl);
447
	free_irq(wl->irq, wl);
448 449 450 451 452 453 454 455
	wl1271_free_hw(wl);

	return 0;
}


static struct spi_driver wl1271_spi_driver = {
	.driver = {
456
		.name		= "wl1271_spi",
457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489
		.bus		= &spi_bus_type,
		.owner		= THIS_MODULE,
	},

	.probe		= wl1271_probe,
	.remove		= __devexit_p(wl1271_remove),
};

static int __init wl1271_init(void)
{
	int ret;

	ret = spi_register_driver(&wl1271_spi_driver);
	if (ret < 0) {
		wl1271_error("failed to register spi driver: %d", ret);
		goto out;
	}

out:
	return ret;
}

static void __exit wl1271_exit(void)
{
	spi_unregister_driver(&wl1271_spi_driver);

	wl1271_notice("unloaded");
}

module_init(wl1271_init);
module_exit(wl1271_exit);

MODULE_LICENSE("GPL");
490
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
491 492
MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
MODULE_FIRMWARE(WL1271_FW_NAME);
493
MODULE_FIRMWARE(WL128X_FW_NAME);
494
MODULE_FIRMWARE(WL1271_AP_FW_NAME);
495
MODULE_ALIAS("spi:wl1271");