Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux...
[linux/fpc-iii.git] / drivers / net / wireless / st / cw1200 / cw1200_spi.c
blob63f95e9c29922b46ec77cf188019e5b1880cbbad
1 /*
2 * Mac80211 SPI driver for ST-Ericsson CW1200 device
4 * Copyright (c) 2011, Sagrad Inc.
5 * Author: Solomon Peachy <speachy@sagrad.com>
7 * Based on cw1200_sdio.c
8 * Copyright (c) 2010, ST-Ericsson
9 * Author: Dmitry Tarnyagin <dmitry.tarnyagin@lockless.no>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
16 #include <linux/module.h>
17 #include <linux/gpio.h>
18 #include <linux/delay.h>
19 #include <linux/spinlock.h>
20 #include <linux/interrupt.h>
21 #include <net/mac80211.h>
23 #include <linux/spi/spi.h>
24 #include <linux/device.h>
26 #include "cw1200.h"
27 #include "hwbus.h"
28 #include <linux/platform_data/net-cw1200.h>
29 #include "hwio.h"
31 MODULE_AUTHOR("Solomon Peachy <speachy@sagrad.com>");
32 MODULE_DESCRIPTION("mac80211 ST-Ericsson CW1200 SPI driver");
33 MODULE_LICENSE("GPL");
34 MODULE_ALIAS("spi:cw1200_wlan_spi");
36 /* #define SPI_DEBUG */
38 struct hwbus_priv {
39 struct spi_device *func;
40 struct cw1200_common *core;
41 const struct cw1200_platform_data_spi *pdata;
42 spinlock_t lock; /* Serialize all bus operations */
43 wait_queue_head_t wq;
44 int claimed;
47 #define SDIO_TO_SPI_ADDR(addr) ((addr & 0x1f)>>2)
48 #define SET_WRITE 0x7FFF /* usage: and operation */
49 #define SET_READ 0x8000 /* usage: or operation */
51 /* Notes on byte ordering:
52 LE: B0 B1 B2 B3
53 BE: B3 B2 B1 B0
55 Hardware expects 32-bit data to be written as 16-bit BE words:
57 B1 B0 B3 B2
60 static int cw1200_spi_memcpy_fromio(struct hwbus_priv *self,
61 unsigned int addr,
62 void *dst, int count)
64 int ret, i;
65 u16 regaddr;
66 struct spi_message m;
68 struct spi_transfer t_addr = {
69 .tx_buf = &regaddr,
70 .len = sizeof(regaddr),
72 struct spi_transfer t_msg = {
73 .rx_buf = dst,
74 .len = count,
77 regaddr = (SDIO_TO_SPI_ADDR(addr))<<12;
78 regaddr |= SET_READ;
79 regaddr |= (count>>1);
81 #ifdef SPI_DEBUG
82 pr_info("READ : %04d from 0x%02x (%04x)\n", count, addr, regaddr);
83 #endif
85 /* Header is LE16 */
86 regaddr = cpu_to_le16(regaddr);
88 /* We have to byteswap if the SPI bus is limited to 8b operation
89 or we are running on a Big Endian system
91 #if defined(__LITTLE_ENDIAN)
92 if (self->func->bits_per_word == 8)
93 #endif
94 regaddr = swab16(regaddr);
96 spi_message_init(&m);
97 spi_message_add_tail(&t_addr, &m);
98 spi_message_add_tail(&t_msg, &m);
99 ret = spi_sync(self->func, &m);
101 #ifdef SPI_DEBUG
102 pr_info("READ : ");
103 for (i = 0; i < t_addr.len; i++)
104 printk("%02x ", ((u8 *)t_addr.tx_buf)[i]);
105 printk(" : ");
106 for (i = 0; i < t_msg.len; i++)
107 printk("%02x ", ((u8 *)t_msg.rx_buf)[i]);
108 printk("\n");
109 #endif
111 /* We have to byteswap if the SPI bus is limited to 8b operation
112 or we are running on a Big Endian system
114 #if defined(__LITTLE_ENDIAN)
115 if (self->func->bits_per_word == 8)
116 #endif
118 uint16_t *buf = (uint16_t *)dst;
119 for (i = 0; i < ((count + 1) >> 1); i++)
120 buf[i] = swab16(buf[i]);
123 return ret;
126 static int cw1200_spi_memcpy_toio(struct hwbus_priv *self,
127 unsigned int addr,
128 const void *src, int count)
130 int rval, i;
131 u16 regaddr;
132 struct spi_transfer t_addr = {
133 .tx_buf = &regaddr,
134 .len = sizeof(regaddr),
136 struct spi_transfer t_msg = {
137 .tx_buf = src,
138 .len = count,
140 struct spi_message m;
142 regaddr = (SDIO_TO_SPI_ADDR(addr))<<12;
143 regaddr &= SET_WRITE;
144 regaddr |= (count>>1);
146 #ifdef SPI_DEBUG
147 pr_info("WRITE: %04d to 0x%02x (%04x)\n", count, addr, regaddr);
148 #endif
150 /* Header is LE16 */
151 regaddr = cpu_to_le16(regaddr);
153 /* We have to byteswap if the SPI bus is limited to 8b operation
154 or we are running on a Big Endian system
156 #if defined(__LITTLE_ENDIAN)
157 if (self->func->bits_per_word == 8)
158 #endif
160 uint16_t *buf = (uint16_t *)src;
161 regaddr = swab16(regaddr);
162 for (i = 0; i < ((count + 1) >> 1); i++)
163 buf[i] = swab16(buf[i]);
166 #ifdef SPI_DEBUG
167 pr_info("WRITE: ");
168 for (i = 0; i < t_addr.len; i++)
169 printk("%02x ", ((u8 *)t_addr.tx_buf)[i]);
170 printk(" : ");
171 for (i = 0; i < t_msg.len; i++)
172 printk("%02x ", ((u8 *)t_msg.tx_buf)[i]);
173 printk("\n");
174 #endif
176 spi_message_init(&m);
177 spi_message_add_tail(&t_addr, &m);
178 spi_message_add_tail(&t_msg, &m);
179 rval = spi_sync(self->func, &m);
181 #ifdef SPI_DEBUG
182 pr_info("WROTE: %d\n", m.actual_length);
183 #endif
185 #if defined(__LITTLE_ENDIAN)
186 /* We have to byteswap if the SPI bus is limited to 8b operation */
187 if (self->func->bits_per_word == 8)
188 #endif
190 uint16_t *buf = (uint16_t *)src;
191 for (i = 0; i < ((count + 1) >> 1); i++)
192 buf[i] = swab16(buf[i]);
194 return rval;
197 static void cw1200_spi_lock(struct hwbus_priv *self)
199 unsigned long flags;
201 DECLARE_WAITQUEUE(wait, current);
203 might_sleep();
205 add_wait_queue(&self->wq, &wait);
206 spin_lock_irqsave(&self->lock, flags);
207 while (1) {
208 set_current_state(TASK_UNINTERRUPTIBLE);
209 if (!self->claimed)
210 break;
211 spin_unlock_irqrestore(&self->lock, flags);
212 schedule();
213 spin_lock_irqsave(&self->lock, flags);
215 set_current_state(TASK_RUNNING);
216 self->claimed = 1;
217 spin_unlock_irqrestore(&self->lock, flags);
218 remove_wait_queue(&self->wq, &wait);
220 return;
223 static void cw1200_spi_unlock(struct hwbus_priv *self)
225 unsigned long flags;
227 spin_lock_irqsave(&self->lock, flags);
228 self->claimed = 0;
229 spin_unlock_irqrestore(&self->lock, flags);
230 wake_up(&self->wq);
232 return;
235 static irqreturn_t cw1200_spi_irq_handler(int irq, void *dev_id)
237 struct hwbus_priv *self = dev_id;
239 if (self->core) {
240 cw1200_spi_lock(self);
241 cw1200_irq_handler(self->core);
242 cw1200_spi_unlock(self);
243 return IRQ_HANDLED;
244 } else {
245 return IRQ_NONE;
249 static int cw1200_spi_irq_subscribe(struct hwbus_priv *self)
251 int ret;
253 pr_debug("SW IRQ subscribe\n");
255 ret = request_threaded_irq(self->func->irq, NULL,
256 cw1200_spi_irq_handler,
257 IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
258 "cw1200_wlan_irq", self);
259 if (WARN_ON(ret < 0))
260 goto exit;
262 ret = enable_irq_wake(self->func->irq);
263 if (WARN_ON(ret))
264 goto free_irq;
266 return 0;
268 free_irq:
269 free_irq(self->func->irq, self);
270 exit:
271 return ret;
274 static int cw1200_spi_irq_unsubscribe(struct hwbus_priv *self)
276 int ret = 0;
278 pr_debug("SW IRQ unsubscribe\n");
279 disable_irq_wake(self->func->irq);
280 free_irq(self->func->irq, self);
282 return ret;
285 static int cw1200_spi_off(const struct cw1200_platform_data_spi *pdata)
287 if (pdata->reset) {
288 gpio_set_value(pdata->reset, 0);
289 msleep(30); /* Min is 2 * CLK32K cycles */
290 gpio_free(pdata->reset);
293 if (pdata->power_ctrl)
294 pdata->power_ctrl(pdata, false);
295 if (pdata->clk_ctrl)
296 pdata->clk_ctrl(pdata, false);
298 return 0;
301 static int cw1200_spi_on(const struct cw1200_platform_data_spi *pdata)
303 /* Ensure I/Os are pulled low */
304 if (pdata->reset) {
305 gpio_request(pdata->reset, "cw1200_wlan_reset");
306 gpio_direction_output(pdata->reset, 0);
308 if (pdata->powerup) {
309 gpio_request(pdata->powerup, "cw1200_wlan_powerup");
310 gpio_direction_output(pdata->powerup, 0);
312 if (pdata->reset || pdata->powerup)
313 msleep(10); /* Settle time? */
315 /* Enable 3v3 and 1v8 to hardware */
316 if (pdata->power_ctrl) {
317 if (pdata->power_ctrl(pdata, true)) {
318 pr_err("power_ctrl() failed!\n");
319 return -1;
323 /* Enable CLK32K */
324 if (pdata->clk_ctrl) {
325 if (pdata->clk_ctrl(pdata, true)) {
326 pr_err("clk_ctrl() failed!\n");
327 return -1;
329 msleep(10); /* Delay until clock is stable for 2 cycles */
332 /* Enable POWERUP signal */
333 if (pdata->powerup) {
334 gpio_set_value(pdata->powerup, 1);
335 msleep(250); /* or more..? */
337 /* Enable RSTn signal */
338 if (pdata->reset) {
339 gpio_set_value(pdata->reset, 1);
340 msleep(50); /* Or more..? */
342 return 0;
345 static size_t cw1200_spi_align_size(struct hwbus_priv *self, size_t size)
347 return size & 1 ? size + 1 : size;
350 static int cw1200_spi_pm(struct hwbus_priv *self, bool suspend)
352 return irq_set_irq_wake(self->func->irq, suspend);
355 static struct hwbus_ops cw1200_spi_hwbus_ops = {
356 .hwbus_memcpy_fromio = cw1200_spi_memcpy_fromio,
357 .hwbus_memcpy_toio = cw1200_spi_memcpy_toio,
358 .lock = cw1200_spi_lock,
359 .unlock = cw1200_spi_unlock,
360 .align_size = cw1200_spi_align_size,
361 .power_mgmt = cw1200_spi_pm,
364 /* Probe Function to be called by SPI stack when device is discovered */
365 static int cw1200_spi_probe(struct spi_device *func)
367 const struct cw1200_platform_data_spi *plat_data =
368 dev_get_platdata(&func->dev);
369 struct hwbus_priv *self;
370 int status;
372 /* Sanity check speed */
373 if (func->max_speed_hz > 52000000)
374 func->max_speed_hz = 52000000;
375 if (func->max_speed_hz < 1000000)
376 func->max_speed_hz = 1000000;
378 /* Fix up transfer size */
379 if (plat_data->spi_bits_per_word)
380 func->bits_per_word = plat_data->spi_bits_per_word;
381 if (!func->bits_per_word)
382 func->bits_per_word = 16;
384 /* And finally.. */
385 func->mode = SPI_MODE_0;
387 pr_info("cw1200_wlan_spi: Probe called (CS %d M %d BPW %d CLK %d)\n",
388 func->chip_select, func->mode, func->bits_per_word,
389 func->max_speed_hz);
391 if (cw1200_spi_on(plat_data)) {
392 pr_err("spi_on() failed!\n");
393 return -1;
396 if (spi_setup(func)) {
397 pr_err("spi_setup() failed!\n");
398 return -1;
401 self = devm_kzalloc(&func->dev, sizeof(*self), GFP_KERNEL);
402 if (!self) {
403 pr_err("Can't allocate SPI hwbus_priv.");
404 return -ENOMEM;
407 self->pdata = plat_data;
408 self->func = func;
409 spin_lock_init(&self->lock);
411 spi_set_drvdata(func, self);
413 init_waitqueue_head(&self->wq);
415 status = cw1200_spi_irq_subscribe(self);
417 status = cw1200_core_probe(&cw1200_spi_hwbus_ops,
418 self, &func->dev, &self->core,
419 self->pdata->ref_clk,
420 self->pdata->macaddr,
421 self->pdata->sdd_file,
422 self->pdata->have_5ghz);
424 if (status) {
425 cw1200_spi_irq_unsubscribe(self);
426 cw1200_spi_off(plat_data);
429 return status;
432 /* Disconnect Function to be called by SPI stack when device is disconnected */
433 static int cw1200_spi_disconnect(struct spi_device *func)
435 struct hwbus_priv *self = spi_get_drvdata(func);
437 if (self) {
438 cw1200_spi_irq_unsubscribe(self);
439 if (self->core) {
440 cw1200_core_release(self->core);
441 self->core = NULL;
444 cw1200_spi_off(dev_get_platdata(&func->dev));
446 return 0;
449 static int __maybe_unused cw1200_spi_suspend(struct device *dev)
451 struct hwbus_priv *self = spi_get_drvdata(to_spi_device(dev));
453 if (!cw1200_can_suspend(self->core))
454 return -EAGAIN;
456 /* XXX notify host that we have to keep CW1200 powered on? */
457 return 0;
460 static SIMPLE_DEV_PM_OPS(cw1200_pm_ops, cw1200_spi_suspend, NULL);
462 static struct spi_driver spi_driver = {
463 .probe = cw1200_spi_probe,
464 .remove = cw1200_spi_disconnect,
465 .driver = {
466 .name = "cw1200_wlan_spi",
467 .pm = IS_ENABLED(CONFIG_PM) ? &cw1200_pm_ops : NULL,
471 module_spi_driver(spi_driver);