Lines Matching +full:self +full:- +full:powered

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Mac80211 SPI driver for ST-Ericsson CW1200 device
9 * Copyright (c) 2010, ST-Ericsson
25 #include <linux/platform_data/net-cw1200.h>
29 MODULE_DESCRIPTION("mac80211 ST-Ericsson CW1200 SPI driver");
52 Hardware expects 32-bit data to be written as 16-bit BE words:
57 static int cw1200_spi_memcpy_fromio(struct hwbus_priv *self, in cw1200_spi_memcpy_fromio() argument
89 if (self->func->bits_per_word == 8) in cw1200_spi_memcpy_fromio()
96 ret = spi_sync(self->func, &m); in cw1200_spi_memcpy_fromio()
112 if (self->func->bits_per_word == 8) in cw1200_spi_memcpy_fromio()
123 static int cw1200_spi_memcpy_toio(struct hwbus_priv *self, in cw1200_spi_memcpy_toio() argument
154 if (self->func->bits_per_word == 8) in cw1200_spi_memcpy_toio()
176 rval = spi_sync(self->func, &m); in cw1200_spi_memcpy_toio()
184 if (self->func->bits_per_word == 8) in cw1200_spi_memcpy_toio()
194 static void cw1200_spi_lock(struct hwbus_priv *self) in cw1200_spi_lock() argument
202 add_wait_queue(&self->wq, &wait); in cw1200_spi_lock()
203 spin_lock_irqsave(&self->lock, flags); in cw1200_spi_lock()
206 if (!self->claimed) in cw1200_spi_lock()
208 spin_unlock_irqrestore(&self->lock, flags); in cw1200_spi_lock()
210 spin_lock_irqsave(&self->lock, flags); in cw1200_spi_lock()
213 self->claimed = 1; in cw1200_spi_lock()
214 spin_unlock_irqrestore(&self->lock, flags); in cw1200_spi_lock()
215 remove_wait_queue(&self->wq, &wait); in cw1200_spi_lock()
220 static void cw1200_spi_unlock(struct hwbus_priv *self) in cw1200_spi_unlock() argument
224 spin_lock_irqsave(&self->lock, flags); in cw1200_spi_unlock()
225 self->claimed = 0; in cw1200_spi_unlock()
226 spin_unlock_irqrestore(&self->lock, flags); in cw1200_spi_unlock()
227 wake_up(&self->wq); in cw1200_spi_unlock()
234 struct hwbus_priv *self = dev_id; in cw1200_spi_irq_handler() local
236 if (self->core) { in cw1200_spi_irq_handler()
237 cw1200_spi_lock(self); in cw1200_spi_irq_handler()
238 cw1200_irq_handler(self->core); in cw1200_spi_irq_handler()
239 cw1200_spi_unlock(self); in cw1200_spi_irq_handler()
246 static int cw1200_spi_irq_subscribe(struct hwbus_priv *self) in cw1200_spi_irq_subscribe() argument
252 ret = request_threaded_irq(self->func->irq, NULL, in cw1200_spi_irq_subscribe()
255 "cw1200_wlan_irq", self); in cw1200_spi_irq_subscribe()
259 ret = enable_irq_wake(self->func->irq); in cw1200_spi_irq_subscribe()
266 free_irq(self->func->irq, self); in cw1200_spi_irq_subscribe()
271 static void cw1200_spi_irq_unsubscribe(struct hwbus_priv *self) in cw1200_spi_irq_unsubscribe() argument
274 disable_irq_wake(self->func->irq); in cw1200_spi_irq_unsubscribe()
275 free_irq(self->func->irq, self); in cw1200_spi_irq_unsubscribe()
280 if (pdata->reset) { in cw1200_spi_off()
281 gpio_set_value(pdata->reset, 0); in cw1200_spi_off()
283 gpio_free(pdata->reset); in cw1200_spi_off()
286 if (pdata->power_ctrl) in cw1200_spi_off()
287 pdata->power_ctrl(pdata, false); in cw1200_spi_off()
288 if (pdata->clk_ctrl) in cw1200_spi_off()
289 pdata->clk_ctrl(pdata, false); in cw1200_spi_off()
297 if (pdata->reset) { in cw1200_spi_on()
298 gpio_request(pdata->reset, "cw1200_wlan_reset"); in cw1200_spi_on()
299 gpio_direction_output(pdata->reset, 0); in cw1200_spi_on()
301 if (pdata->powerup) { in cw1200_spi_on()
302 gpio_request(pdata->powerup, "cw1200_wlan_powerup"); in cw1200_spi_on()
303 gpio_direction_output(pdata->powerup, 0); in cw1200_spi_on()
305 if (pdata->reset || pdata->powerup) in cw1200_spi_on()
309 if (pdata->power_ctrl) { in cw1200_spi_on()
310 if (pdata->power_ctrl(pdata, true)) { in cw1200_spi_on()
312 return -1; in cw1200_spi_on()
317 if (pdata->clk_ctrl) { in cw1200_spi_on()
318 if (pdata->clk_ctrl(pdata, true)) { in cw1200_spi_on()
320 return -1; in cw1200_spi_on()
326 if (pdata->powerup) { in cw1200_spi_on()
327 gpio_set_value(pdata->powerup, 1); in cw1200_spi_on()
331 if (pdata->reset) { in cw1200_spi_on()
332 gpio_set_value(pdata->reset, 1); in cw1200_spi_on()
338 static size_t cw1200_spi_align_size(struct hwbus_priv *self, size_t size) in cw1200_spi_align_size() argument
343 static int cw1200_spi_pm(struct hwbus_priv *self, bool suspend) in cw1200_spi_pm() argument
345 return irq_set_irq_wake(self->func->irq, suspend); in cw1200_spi_pm()
361 dev_get_platdata(&func->dev); in cw1200_spi_probe()
362 struct hwbus_priv *self; in cw1200_spi_probe() local
366 if (func->max_speed_hz > 52000000) in cw1200_spi_probe()
367 func->max_speed_hz = 52000000; in cw1200_spi_probe()
368 if (func->max_speed_hz < 1000000) in cw1200_spi_probe()
369 func->max_speed_hz = 1000000; in cw1200_spi_probe()
372 if (plat_data->spi_bits_per_word) in cw1200_spi_probe()
373 func->bits_per_word = plat_data->spi_bits_per_word; in cw1200_spi_probe()
374 if (!func->bits_per_word) in cw1200_spi_probe()
375 func->bits_per_word = 16; in cw1200_spi_probe()
378 func->mode = SPI_MODE_0; in cw1200_spi_probe()
381 spi_get_chipselect(func, 0), func->mode, func->bits_per_word, in cw1200_spi_probe()
382 func->max_speed_hz); in cw1200_spi_probe()
386 return -1; in cw1200_spi_probe()
391 return -1; in cw1200_spi_probe()
394 self = devm_kzalloc(&func->dev, sizeof(*self), GFP_KERNEL); in cw1200_spi_probe()
395 if (!self) { in cw1200_spi_probe()
397 return -ENOMEM; in cw1200_spi_probe()
400 self->pdata = plat_data; in cw1200_spi_probe()
401 self->func = func; in cw1200_spi_probe()
402 spin_lock_init(&self->lock); in cw1200_spi_probe()
404 spi_set_drvdata(func, self); in cw1200_spi_probe()
406 init_waitqueue_head(&self->wq); in cw1200_spi_probe()
408 status = cw1200_spi_irq_subscribe(self); in cw1200_spi_probe()
411 self, &func->dev, &self->core, in cw1200_spi_probe()
412 self->pdata->ref_clk, in cw1200_spi_probe()
413 self->pdata->macaddr, in cw1200_spi_probe()
414 self->pdata->sdd_file, in cw1200_spi_probe()
415 self->pdata->have_5ghz); in cw1200_spi_probe()
418 cw1200_spi_irq_unsubscribe(self); in cw1200_spi_probe()
428 struct hwbus_priv *self = spi_get_drvdata(func); in cw1200_spi_disconnect() local
430 if (self) { in cw1200_spi_disconnect()
431 cw1200_spi_irq_unsubscribe(self); in cw1200_spi_disconnect()
432 if (self->core) { in cw1200_spi_disconnect()
433 cw1200_core_release(self->core); in cw1200_spi_disconnect()
434 self->core = NULL; in cw1200_spi_disconnect()
437 cw1200_spi_off(dev_get_platdata(&func->dev)); in cw1200_spi_disconnect()
442 struct hwbus_priv *self = spi_get_drvdata(to_spi_device(dev)); in cw1200_spi_suspend() local
444 if (!cw1200_can_suspend(self->core)) in cw1200_spi_suspend()
445 return -EAGAIN; in cw1200_spi_suspend()
447 /* XXX notify host that we have to keep CW1200 powered on? */ in cw1200_spi_suspend()