xref: /linux/drivers/net/wireless/st/cw1200/cw1200_spi.c (revision 6a143a7cf94730f57544ea14a987dc025364dbb8)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Mac80211 SPI driver for ST-Ericsson CW1200 device
4  *
5  * Copyright (c) 2011, Sagrad Inc.
6  * Author:  Solomon Peachy <speachy@sagrad.com>
7  *
8  * Based on cw1200_sdio.c
9  * Copyright (c) 2010, ST-Ericsson
10  * Author: Dmitry Tarnyagin <dmitry.tarnyagin@lockless.no>
11  */
12 
13 #include <linux/module.h>
14 #include <linux/gpio.h>
15 #include <linux/delay.h>
16 #include <linux/spinlock.h>
17 #include <linux/interrupt.h>
18 #include <net/mac80211.h>
19 
20 #include <linux/spi/spi.h>
21 #include <linux/device.h>
22 
23 #include "cw1200.h"
24 #include "hwbus.h"
25 #include <linux/platform_data/net-cw1200.h>
26 #include "hwio.h"
27 
28 MODULE_AUTHOR("Solomon Peachy <speachy@sagrad.com>");
29 MODULE_DESCRIPTION("mac80211 ST-Ericsson CW1200 SPI driver");
30 MODULE_LICENSE("GPL");
31 MODULE_ALIAS("spi:cw1200_wlan_spi");
32 
33 /* #define SPI_DEBUG */
34 
35 struct hwbus_priv {
36 	struct spi_device	*func;
37 	struct cw1200_common	*core;
38 	const struct cw1200_platform_data_spi *pdata;
39 	spinlock_t		lock; /* Serialize all bus operations */
40 	wait_queue_head_t       wq;
41 	int claimed;
42 };
43 
44 #define SDIO_TO_SPI_ADDR(addr) ((addr & 0x1f)>>2)
45 #define SET_WRITE 0x7FFF /* usage: and operation */
46 #define SET_READ 0x8000  /* usage: or operation */
47 
48 /* Notes on byte ordering:
49    LE:  B0 B1 B2 B3
50    BE:  B3 B2 B1 B0
51 
52    Hardware expects 32-bit data to be written as 16-bit BE words:
53 
54    B1 B0 B3 B2
55 */
56 
57 static int cw1200_spi_memcpy_fromio(struct hwbus_priv *self,
58 				     unsigned int addr,
59 				     void *dst, int count)
60 {
61 	int ret, i;
62 	u16 regaddr;
63 	struct spi_message      m;
64 
65 	struct spi_transfer     t_addr = {
66 		.tx_buf         = &regaddr,
67 		.len            = sizeof(regaddr),
68 	};
69 	struct spi_transfer     t_msg = {
70 		.rx_buf         = dst,
71 		.len            = count,
72 	};
73 
74 	regaddr = (SDIO_TO_SPI_ADDR(addr))<<12;
75 	regaddr |= SET_READ;
76 	regaddr |= (count>>1);
77 
78 #ifdef SPI_DEBUG
79 	pr_info("READ : %04d from 0x%02x (%04x)\n", count, addr, regaddr);
80 #endif
81 
82 	/* Header is LE16 */
83 	regaddr = cpu_to_le16(regaddr);
84 
85 	/* We have to byteswap if the SPI bus is limited to 8b operation
86 	   or we are running on a Big Endian system
87 	*/
88 #if defined(__LITTLE_ENDIAN)
89 	if (self->func->bits_per_word == 8)
90 #endif
91 		regaddr = swab16(regaddr);
92 
93 	spi_message_init(&m);
94 	spi_message_add_tail(&t_addr, &m);
95 	spi_message_add_tail(&t_msg, &m);
96 	ret = spi_sync(self->func, &m);
97 
98 #ifdef SPI_DEBUG
99 	pr_info("READ : ");
100 	for (i = 0; i < t_addr.len; i++)
101 		printk("%02x ", ((u8 *)t_addr.tx_buf)[i]);
102 	printk(" : ");
103 	for (i = 0; i < t_msg.len; i++)
104 		printk("%02x ", ((u8 *)t_msg.rx_buf)[i]);
105 	printk("\n");
106 #endif
107 
108 	/* We have to byteswap if the SPI bus is limited to 8b operation
109 	   or we are running on a Big Endian system
110 	*/
111 #if defined(__LITTLE_ENDIAN)
112 	if (self->func->bits_per_word == 8)
113 #endif
114 	{
115 		uint16_t *buf = (uint16_t *)dst;
116 		for (i = 0; i < ((count + 1) >> 1); i++)
117 			buf[i] = swab16(buf[i]);
118 	}
119 
120 	return ret;
121 }
122 
123 static int cw1200_spi_memcpy_toio(struct hwbus_priv *self,
124 				   unsigned int addr,
125 				   const void *src, int count)
126 {
127 	int rval, i;
128 	u16 regaddr;
129 	struct spi_transfer     t_addr = {
130 		.tx_buf         = &regaddr,
131 		.len            = sizeof(regaddr),
132 	};
133 	struct spi_transfer     t_msg = {
134 		.tx_buf         = src,
135 		.len            = count,
136 	};
137 	struct spi_message      m;
138 
139 	regaddr = (SDIO_TO_SPI_ADDR(addr))<<12;
140 	regaddr &= SET_WRITE;
141 	regaddr |= (count>>1);
142 
143 #ifdef SPI_DEBUG
144 	pr_info("WRITE: %04d  to  0x%02x (%04x)\n", count, addr, regaddr);
145 #endif
146 
147 	/* Header is LE16 */
148 	regaddr = cpu_to_le16(regaddr);
149 
150 	/* We have to byteswap if the SPI bus is limited to 8b operation
151 	   or we are running on a Big Endian system
152 	*/
153 #if defined(__LITTLE_ENDIAN)
154 	if (self->func->bits_per_word == 8)
155 #endif
156 	{
157 		uint16_t *buf = (uint16_t *)src;
158 	        regaddr = swab16(regaddr);
159 		for (i = 0; i < ((count + 1) >> 1); i++)
160 			buf[i] = swab16(buf[i]);
161 	}
162 
163 #ifdef SPI_DEBUG
164 	pr_info("WRITE: ");
165 	for (i = 0; i < t_addr.len; i++)
166 		printk("%02x ", ((u8 *)t_addr.tx_buf)[i]);
167 	printk(" : ");
168 	for (i = 0; i < t_msg.len; i++)
169 		printk("%02x ", ((u8 *)t_msg.tx_buf)[i]);
170 	printk("\n");
171 #endif
172 
173 	spi_message_init(&m);
174 	spi_message_add_tail(&t_addr, &m);
175 	spi_message_add_tail(&t_msg, &m);
176 	rval = spi_sync(self->func, &m);
177 
178 #ifdef SPI_DEBUG
179 	pr_info("WROTE: %d\n", m.actual_length);
180 #endif
181 
182 #if defined(__LITTLE_ENDIAN)
183 	/* We have to byteswap if the SPI bus is limited to 8b operation */
184 	if (self->func->bits_per_word == 8)
185 #endif
186 	{
187 		uint16_t *buf = (uint16_t *)src;
188 		for (i = 0; i < ((count + 1) >> 1); i++)
189 			buf[i] = swab16(buf[i]);
190 	}
191 	return rval;
192 }
193 
194 static void cw1200_spi_lock(struct hwbus_priv *self)
195 {
196 	unsigned long flags;
197 
198 	DECLARE_WAITQUEUE(wait, current);
199 
200 	might_sleep();
201 
202 	add_wait_queue(&self->wq, &wait);
203 	spin_lock_irqsave(&self->lock, flags);
204 	while (1) {
205 		set_current_state(TASK_UNINTERRUPTIBLE);
206 		if (!self->claimed)
207 			break;
208 		spin_unlock_irqrestore(&self->lock, flags);
209 		schedule();
210 		spin_lock_irqsave(&self->lock, flags);
211 	}
212 	set_current_state(TASK_RUNNING);
213 	self->claimed = 1;
214 	spin_unlock_irqrestore(&self->lock, flags);
215 	remove_wait_queue(&self->wq, &wait);
216 
217 	return;
218 }
219 
220 static void cw1200_spi_unlock(struct hwbus_priv *self)
221 {
222 	unsigned long flags;
223 
224 	spin_lock_irqsave(&self->lock, flags);
225 	self->claimed = 0;
226 	spin_unlock_irqrestore(&self->lock, flags);
227 	wake_up(&self->wq);
228 
229 	return;
230 }
231 
232 static irqreturn_t cw1200_spi_irq_handler(int irq, void *dev_id)
233 {
234 	struct hwbus_priv *self = dev_id;
235 
236 	if (self->core) {
237 		cw1200_spi_lock(self);
238 		cw1200_irq_handler(self->core);
239 		cw1200_spi_unlock(self);
240 		return IRQ_HANDLED;
241 	} else {
242 		return IRQ_NONE;
243 	}
244 }
245 
246 static int cw1200_spi_irq_subscribe(struct hwbus_priv *self)
247 {
248 	int ret;
249 
250 	pr_debug("SW IRQ subscribe\n");
251 
252 	ret = request_threaded_irq(self->func->irq, NULL,
253 				   cw1200_spi_irq_handler,
254 				   IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
255 				   "cw1200_wlan_irq", self);
256 	if (WARN_ON(ret < 0))
257 		goto exit;
258 
259 	ret = enable_irq_wake(self->func->irq);
260 	if (WARN_ON(ret))
261 		goto free_irq;
262 
263 	return 0;
264 
265 free_irq:
266 	free_irq(self->func->irq, self);
267 exit:
268 	return ret;
269 }
270 
271 static void cw1200_spi_irq_unsubscribe(struct hwbus_priv *self)
272 {
273 	pr_debug("SW IRQ unsubscribe\n");
274 	disable_irq_wake(self->func->irq);
275 	free_irq(self->func->irq, self);
276 }
277 
278 static int cw1200_spi_off(const struct cw1200_platform_data_spi *pdata)
279 {
280 	if (pdata->reset) {
281 		gpio_set_value(pdata->reset, 0);
282 		msleep(30); /* Min is 2 * CLK32K cycles */
283 		gpio_free(pdata->reset);
284 	}
285 
286 	if (pdata->power_ctrl)
287 		pdata->power_ctrl(pdata, false);
288 	if (pdata->clk_ctrl)
289 		pdata->clk_ctrl(pdata, false);
290 
291 	return 0;
292 }
293 
294 static int cw1200_spi_on(const struct cw1200_platform_data_spi *pdata)
295 {
296 	/* Ensure I/Os are pulled low */
297 	if (pdata->reset) {
298 		gpio_request(pdata->reset, "cw1200_wlan_reset");
299 		gpio_direction_output(pdata->reset, 0);
300 	}
301 	if (pdata->powerup) {
302 		gpio_request(pdata->powerup, "cw1200_wlan_powerup");
303 		gpio_direction_output(pdata->powerup, 0);
304 	}
305 	if (pdata->reset || pdata->powerup)
306 		msleep(10); /* Settle time? */
307 
308 	/* Enable 3v3 and 1v8 to hardware */
309 	if (pdata->power_ctrl) {
310 		if (pdata->power_ctrl(pdata, true)) {
311 			pr_err("power_ctrl() failed!\n");
312 			return -1;
313 		}
314 	}
315 
316 	/* Enable CLK32K */
317 	if (pdata->clk_ctrl) {
318 		if (pdata->clk_ctrl(pdata, true)) {
319 			pr_err("clk_ctrl() failed!\n");
320 			return -1;
321 		}
322 		msleep(10); /* Delay until clock is stable for 2 cycles */
323 	}
324 
325 	/* Enable POWERUP signal */
326 	if (pdata->powerup) {
327 		gpio_set_value(pdata->powerup, 1);
328 		msleep(250); /* or more..? */
329 	}
330 	/* Enable RSTn signal */
331 	if (pdata->reset) {
332 		gpio_set_value(pdata->reset, 1);
333 		msleep(50); /* Or more..? */
334 	}
335 	return 0;
336 }
337 
338 static size_t cw1200_spi_align_size(struct hwbus_priv *self, size_t size)
339 {
340 	return size & 1 ? size + 1 : size;
341 }
342 
343 static int cw1200_spi_pm(struct hwbus_priv *self, bool suspend)
344 {
345 	return irq_set_irq_wake(self->func->irq, suspend);
346 }
347 
348 static const struct hwbus_ops cw1200_spi_hwbus_ops = {
349 	.hwbus_memcpy_fromio	= cw1200_spi_memcpy_fromio,
350 	.hwbus_memcpy_toio	= cw1200_spi_memcpy_toio,
351 	.lock			= cw1200_spi_lock,
352 	.unlock			= cw1200_spi_unlock,
353 	.align_size		= cw1200_spi_align_size,
354 	.power_mgmt		= cw1200_spi_pm,
355 };
356 
357 /* Probe Function to be called by SPI stack when device is discovered */
358 static int cw1200_spi_probe(struct spi_device *func)
359 {
360 	const struct cw1200_platform_data_spi *plat_data =
361 		dev_get_platdata(&func->dev);
362 	struct hwbus_priv *self;
363 	int status;
364 
365 	/* Sanity check speed */
366 	if (func->max_speed_hz > 52000000)
367 		func->max_speed_hz = 52000000;
368 	if (func->max_speed_hz < 1000000)
369 		func->max_speed_hz = 1000000;
370 
371 	/* Fix up transfer size */
372 	if (plat_data->spi_bits_per_word)
373 		func->bits_per_word = plat_data->spi_bits_per_word;
374 	if (!func->bits_per_word)
375 		func->bits_per_word = 16;
376 
377 	/* And finally.. */
378 	func->mode = SPI_MODE_0;
379 
380 	pr_info("cw1200_wlan_spi: Probe called (CS %d M %d BPW %d CLK %d)\n",
381 		func->chip_select, func->mode, func->bits_per_word,
382 		func->max_speed_hz);
383 
384 	if (cw1200_spi_on(plat_data)) {
385 		pr_err("spi_on() failed!\n");
386 		return -1;
387 	}
388 
389 	if (spi_setup(func)) {
390 		pr_err("spi_setup() failed!\n");
391 		return -1;
392 	}
393 
394 	self = devm_kzalloc(&func->dev, sizeof(*self), GFP_KERNEL);
395 	if (!self) {
396 		pr_err("Can't allocate SPI hwbus_priv.");
397 		return -ENOMEM;
398 	}
399 
400 	self->pdata = plat_data;
401 	self->func = func;
402 	spin_lock_init(&self->lock);
403 
404 	spi_set_drvdata(func, self);
405 
406 	init_waitqueue_head(&self->wq);
407 
408 	status = cw1200_spi_irq_subscribe(self);
409 
410 	status = cw1200_core_probe(&cw1200_spi_hwbus_ops,
411 				   self, &func->dev, &self->core,
412 				   self->pdata->ref_clk,
413 				   self->pdata->macaddr,
414 				   self->pdata->sdd_file,
415 				   self->pdata->have_5ghz);
416 
417 	if (status) {
418 		cw1200_spi_irq_unsubscribe(self);
419 		cw1200_spi_off(plat_data);
420 	}
421 
422 	return status;
423 }
424 
425 /* Disconnect Function to be called by SPI stack when device is disconnected */
426 static int cw1200_spi_disconnect(struct spi_device *func)
427 {
428 	struct hwbus_priv *self = spi_get_drvdata(func);
429 
430 	if (self) {
431 		cw1200_spi_irq_unsubscribe(self);
432 		if (self->core) {
433 			cw1200_core_release(self->core);
434 			self->core = NULL;
435 		}
436 	}
437 	cw1200_spi_off(dev_get_platdata(&func->dev));
438 
439 	return 0;
440 }
441 
442 static int __maybe_unused cw1200_spi_suspend(struct device *dev)
443 {
444 	struct hwbus_priv *self = spi_get_drvdata(to_spi_device(dev));
445 
446 	if (!cw1200_can_suspend(self->core))
447 		return -EAGAIN;
448 
449 	/* XXX notify host that we have to keep CW1200 powered on? */
450 	return 0;
451 }
452 
453 static SIMPLE_DEV_PM_OPS(cw1200_pm_ops, cw1200_spi_suspend, NULL);
454 
455 static struct spi_driver spi_driver = {
456 	.probe		= cw1200_spi_probe,
457 	.remove		= cw1200_spi_disconnect,
458 	.driver = {
459 		.name		= "cw1200_wlan_spi",
460 		.pm		= IS_ENABLED(CONFIG_PM) ? &cw1200_pm_ops : NULL,
461 	},
462 };
463 
464 module_spi_driver(spi_driver);
465