Lines Matching +full:spi +full:- +full:tx +full:- +full:bus +full:- +full:width

2  * Marvell Orion SPI controller driver
5 * Copyright (C) 2007-2008 Marvell Ltd.
18 #include <linux/spi/spi.h>
19 #include <linux/spi/orion_spi.h>
55 return orion_spi->base + reg; in spi_reg()
91 return -EINVAL; in orion_spi_set_transfer_size()
97 static int orion_spi_baudrate_set(struct spi_device *spi, unsigned int speed) in orion_spi_baudrate_set() argument
105 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_baudrate_set()
107 tclk_hz = orion_spi->spi_info->tclk; in orion_spi_baudrate_set()
118 return -EINVAL; in orion_spi_baudrate_set()
123 /* Convert the rate to SPI clock divisor value. */ in orion_spi_baudrate_set()
134 * called only when no transfer is active on the bus
137 orion_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) in orion_spi_setup_transfer() argument
140 unsigned int speed = spi->max_speed_hz; in orion_spi_setup_transfer()
141 unsigned int bits_per_word = spi->bits_per_word; in orion_spi_setup_transfer()
144 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_setup_transfer()
146 if ((t != NULL) && t->speed_hz) in orion_spi_setup_transfer()
147 speed = t->speed_hz; in orion_spi_setup_transfer()
149 if ((t != NULL) && t->bits_per_word) in orion_spi_setup_transfer()
150 bits_per_word = t->bits_per_word; in orion_spi_setup_transfer()
152 rc = orion_spi_baudrate_set(spi, speed); in orion_spi_setup_transfer()
178 return -1; in orion_spi_wait_till_ready()
182 orion_spi_write_read_8bit(struct spi_device *spi, in orion_spi_write_read_8bit() argument
188 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_write_read_8bit()
202 dev_err(&spi->dev, "TXS timed out\n"); in orion_spi_write_read_8bit()
203 return -1; in orion_spi_write_read_8bit()
213 orion_spi_write_read_16bit(struct spi_device *spi, in orion_spi_write_read_16bit() argument
219 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_write_read_16bit()
233 dev_err(&spi->dev, "TXS timed out\n"); in orion_spi_write_read_16bit()
234 return -1; in orion_spi_write_read_16bit()
244 orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer) in orion_spi_write_read() argument
250 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_write_read()
251 word_len = spi->bits_per_word; in orion_spi_write_read()
252 count = xfer->len; in orion_spi_write_read()
255 const u8 *tx = xfer->tx_buf; in orion_spi_write_read() local
256 u8 *rx = xfer->rx_buf; in orion_spi_write_read()
259 if (orion_spi_write_read_8bit(spi, &tx, &rx) < 0) in orion_spi_write_read()
261 count--; in orion_spi_write_read()
264 const u16 *tx = xfer->tx_buf; in orion_spi_write_read() local
265 u16 *rx = xfer->rx_buf; in orion_spi_write_read()
268 if (orion_spi_write_read_16bit(spi, &tx, &rx) < 0) in orion_spi_write_read()
270 count -= 2; in orion_spi_write_read()
275 return xfer->len - count; in orion_spi_write_read()
284 spin_lock_irq(&orion_spi->lock); in orion_spi_work()
285 while (!list_empty(&orion_spi->msg_queue)) { in orion_spi_work()
287 struct spi_device *spi; in orion_spi_work() local
293 m = container_of(orion_spi->msg_queue.next, struct spi_message, in orion_spi_work()
296 list_del_init(&m->queue); in orion_spi_work()
297 spin_unlock_irq(&orion_spi->lock); in orion_spi_work()
299 spi = m->spi; in orion_spi_work()
302 status = orion_spi_setup_transfer(spi, NULL); in orion_spi_work()
307 list_for_each_entry(t, &m->transfers, transfer_list) { in orion_spi_work()
308 if (par_override || t->speed_hz || t->bits_per_word) { in orion_spi_work()
310 status = orion_spi_setup_transfer(spi, t); in orion_spi_work()
313 if (!t->speed_hz && !t->bits_per_word) in orion_spi_work()
322 if (t->len) in orion_spi_work()
323 m->actual_length += in orion_spi_work()
324 orion_spi_write_read(spi, t); in orion_spi_work()
326 if (t->delay_usecs) in orion_spi_work()
327 udelay(t->delay_usecs); in orion_spi_work()
329 if (t->cs_change) { in orion_spi_work()
339 m->status = status; in orion_spi_work()
340 m->complete(m->context); in orion_spi_work()
342 spin_lock_irq(&orion_spi->lock); in orion_spi_work()
345 spin_unlock_irq(&orion_spi->lock); in orion_spi_work()
356 static int orion_spi_setup(struct spi_device *spi) in orion_spi_setup() argument
360 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_setup()
363 if (orion_spi->spi_info->enable_clock_fix) in orion_spi_setup()
367 if ((spi->max_speed_hz == 0) in orion_spi_setup()
368 || (spi->max_speed_hz > orion_spi->max_speed)) in orion_spi_setup()
369 spi->max_speed_hz = orion_spi->max_speed; in orion_spi_setup()
371 if (spi->max_speed_hz < orion_spi->min_speed) { in orion_spi_setup()
372 dev_err(&spi->dev, "setup: requested speed too low %d Hz\n", in orion_spi_setup()
373 spi->max_speed_hz); in orion_spi_setup()
374 return -EINVAL; in orion_spi_setup()
378 * baudrate & width will be set orion_spi_setup_transfer in orion_spi_setup()
383 static int orion_spi_transfer(struct spi_device *spi, struct spi_message *m) in orion_spi_transfer() argument
389 m->actual_length = 0; in orion_spi_transfer()
390 m->status = 0; in orion_spi_transfer()
393 if (list_empty(&m->transfers) || !m->complete) in orion_spi_transfer()
394 return -EINVAL; in orion_spi_transfer()
396 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_transfer()
398 list_for_each_entry(t, &m->transfers, transfer_list) { in orion_spi_transfer()
399 unsigned int bits_per_word = spi->bits_per_word; in orion_spi_transfer()
401 if (t->tx_buf == NULL && t->rx_buf == NULL && t->len) { in orion_spi_transfer()
402 dev_err(&spi->dev, in orion_spi_transfer()
408 if (t->bits_per_word) in orion_spi_transfer()
409 bits_per_word = t->bits_per_word; in orion_spi_transfer()
412 dev_err(&spi->dev, in orion_spi_transfer()
419 if ((t->bits_per_word == 16) && (t->len & 1)) { in orion_spi_transfer()
420 dev_err(&spi->dev, in orion_spi_transfer()
423 t->len); in orion_spi_transfer()
427 if (t->speed_hz && t->speed_hz < orion_spi->min_speed) { in orion_spi_transfer()
428 dev_err(&spi->dev, in orion_spi_transfer()
432 orion_spi->min_speed, t->speed_hz); in orion_spi_transfer()
438 spin_lock_irqsave(&orion_spi->lock, flags); in orion_spi_transfer()
439 list_add_tail(&m->queue, &orion_spi->msg_queue); in orion_spi_transfer()
440 queue_work(orion_spi_wq, &orion_spi->work); in orion_spi_transfer()
441 spin_unlock_irqrestore(&orion_spi->lock, flags); in orion_spi_transfer()
446 m->status = -EINVAL; in orion_spi_transfer()
447 if (m->complete) in orion_spi_transfer()
448 m->complete(m->context); in orion_spi_transfer()
449 return -EINVAL; in orion_spi_transfer()
455 struct orion_spi *spi; in orion_spi_probe() local
460 spi_info = pdev->dev.platform_data; in orion_spi_probe()
462 master = spi_alloc_master(&pdev->dev, sizeof *spi); in orion_spi_probe()
464 dev_dbg(&pdev->dev, "master allocation failed\n"); in orion_spi_probe()
465 return -ENOMEM; in orion_spi_probe()
468 if (pdev->id != -1) in orion_spi_probe()
469 master->bus_num = pdev->id; in orion_spi_probe()
472 master->mode_bits = 0; in orion_spi_probe()
474 master->setup = orion_spi_setup; in orion_spi_probe()
475 master->transfer = orion_spi_transfer; in orion_spi_probe()
476 master->num_chipselect = ORION_NUM_CHIPSELECTS; in orion_spi_probe()
478 dev_set_drvdata(&pdev->dev, master); in orion_spi_probe()
480 spi = spi_master_get_devdata(master); in orion_spi_probe()
481 spi->master = master; in orion_spi_probe()
482 spi->spi_info = spi_info; in orion_spi_probe()
484 spi->max_speed = DIV_ROUND_UP(spi_info->tclk, 4); in orion_spi_probe()
485 spi->min_speed = DIV_ROUND_UP(spi_info->tclk, 30); in orion_spi_probe()
489 status = -ENODEV; in orion_spi_probe()
493 if (!request_mem_region(r->start, resource_size(r), in orion_spi_probe()
494 dev_name(&pdev->dev))) { in orion_spi_probe()
495 status = -EBUSY; in orion_spi_probe()
498 spi->base = ioremap(r->start, SZ_1K); in orion_spi_probe()
500 INIT_WORK(&spi->work, orion_spi_work); in orion_spi_probe()
502 spin_lock_init(&spi->lock); in orion_spi_probe()
503 INIT_LIST_HEAD(&spi->msg_queue); in orion_spi_probe()
505 if (orion_spi_reset(spi) < 0) in orion_spi_probe()
515 release_mem_region(r->start, resource_size(r)); in orion_spi_probe()
526 struct orion_spi *spi; in orion_spi_remove() local
529 master = dev_get_drvdata(&pdev->dev); in orion_spi_remove()
530 spi = spi_master_get_devdata(master); in orion_spi_remove()
532 cancel_work_sync(&spi->work); in orion_spi_remove()
535 release_mem_region(r->start, resource_size(r)); in orion_spi_remove()
557 return -ENOMEM; in orion_spi_init()
572 MODULE_DESCRIPTION("Orion SPI driver");