Lines Matching +full:spi +full:- +full:tx +full:- +full:delay +full:- +full:us
11 * Copyright (C) 2005 David Brownell (ported to 2.6 SPI interface)
38 #include <linux/delay.h>
46 #include <linux/spi/spi.h>
47 #include <linux/spi/spi_bitbang.h>
54 #include <asm/mach-types.h>
161 return -1; in wait_uwire_csr_flag()
180 static void uwire_chipselect(struct spi_device *spi, int value) in uwire_chipselect() argument
182 struct uwire_state *ust = spi->controller_state; in uwire_chipselect()
191 if (value == BITBANG_CS_INACTIVE || old_cs != spi->chip_select) { in uwire_chipselect()
198 uwire_set_clk1_div(ust->div1_idx); in uwire_chipselect()
200 if (spi->mode & SPI_CPOL) in uwire_chipselect()
205 w = spi->chip_select << 10; in uwire_chipselect()
211 static int uwire_txrx(struct spi_device *spi, struct spi_transfer *t) in uwire_txrx() argument
213 struct uwire_state *ust = spi->controller_state; in uwire_txrx()
214 unsigned len = t->len; in uwire_txrx()
215 unsigned bits = ust->bits_per_word; in uwire_txrx()
220 if (!t->tx_buf && !t->rx_buf) in uwire_txrx()
224 if (t->tx_buf && t->rx_buf) in uwire_txrx()
225 return -EPERM; in uwire_txrx()
227 w = spi->chip_select << 10; in uwire_txrx()
230 if (t->tx_buf) { in uwire_txrx()
231 const u8 *buf = t->tx_buf; in uwire_txrx()
233 /* NOTE: DMA could be used for TX transfers */ in uwire_txrx()
237 /* tx bit 15 is first sent; we byteswap multibyte words in uwire_txrx()
238 * (msb-first) on the way out from memory. in uwire_txrx()
246 val <<= 16 - bits; in uwire_txrx()
249 pr_debug("%s: write-%d =%04x\n", in uwire_txrx()
250 dev_name(&spi->dev), bits, val); in uwire_txrx()
261 len -= bytes; in uwire_txrx()
277 } else if (t->rx_buf) { in uwire_txrx()
278 u8 *buf = t->rx_buf; in uwire_txrx()
290 len -= bytes; in uwire_txrx()
303 val &= (1 << bits) - 1; in uwire_txrx()
309 pr_debug("%s: read-%d =%04x\n", in uwire_txrx()
310 dev_name(&spi->dev), bits, val); in uwire_txrx()
317 return -EIO; in uwire_txrx()
320 static int uwire_setup_transfer(struct spi_device *spi, struct spi_transfer *t) in uwire_setup_transfer() argument
322 struct uwire_state *ust = spi->controller_state; in uwire_setup_transfer()
333 uwire = spi_master_get_devdata(spi->master); in uwire_setup_transfer()
335 if (spi->chip_select > 3) { in uwire_setup_transfer()
336 pr_debug("%s: cs%d?\n", dev_name(&spi->dev), spi->chip_select); in uwire_setup_transfer()
337 status = -ENODEV; in uwire_setup_transfer()
341 bits = spi->bits_per_word; in uwire_setup_transfer()
342 if (t != NULL && t->bits_per_word) in uwire_setup_transfer()
343 bits = t->bits_per_word; in uwire_setup_transfer()
346 pr_debug("%s: wordsize %d?\n", dev_name(&spi->dev), bits); in uwire_setup_transfer()
347 status = -ENODEV; in uwire_setup_transfer()
350 ust->bits_per_word = bits; in uwire_setup_transfer()
356 if (spi->mode & SPI_CS_HIGH) in uwire_setup_transfer()
359 if (spi->mode & SPI_CPOL) in uwire_setup_transfer()
362 switch (spi->mode & (SPI_CPOL | SPI_CPHA)) { in uwire_setup_transfer()
374 rate = clk_get_rate(uwire->ck); in uwire_setup_transfer()
376 hz = spi->max_speed_hz; in uwire_setup_transfer()
377 if (t != NULL && t->speed_hz) in uwire_setup_transfer()
378 hz = t->speed_hz; in uwire_setup_transfer()
381 pr_debug("%s: zero speed?\n", dev_name(&spi->dev)); in uwire_setup_transfer()
382 status = -EINVAL; in uwire_setup_transfer()
403 div2 = (rate / div1 + hz - 1) / hz; in uwire_setup_transfer()
409 dev_name(&spi->dev), rate / 10 / 8, hz); in uwire_setup_transfer()
410 status = -EDOM; in uwire_setup_transfer()
416 * us */ in uwire_setup_transfer()
417 ust->div1_idx = div1_idx; in uwire_setup_transfer()
442 omap_uwire_configure_mode(spi->chip_select, flags); in uwire_setup_transfer()
445 clk_get_rate(uwire->ck) / 1000, in uwire_setup_transfer()
452 static int uwire_setup(struct spi_device *spi) in uwire_setup() argument
454 struct uwire_state *ust = spi->controller_state; in uwire_setup()
459 return -ENOMEM; in uwire_setup()
460 spi->controller_state = ust; in uwire_setup()
463 return uwire_setup_transfer(spi, NULL); in uwire_setup()
466 static void uwire_cleanup(struct spi_device *spi) in uwire_cleanup() argument
468 kfree(spi->controller_state); in uwire_cleanup()
474 clk_disable(uwire->ck); in uwire_off()
475 clk_put(uwire->ck); in uwire_off()
476 spi_master_put(uwire->bitbang.master); in uwire_off()
485 master = spi_alloc_master(&pdev->dev, sizeof *uwire); in uwire_probe()
487 return -ENODEV; in uwire_probe()
493 dev_dbg(&pdev->dev, "can't ioremap UWIRE\n"); in uwire_probe()
495 return -ENOMEM; in uwire_probe()
498 dev_set_drvdata(&pdev->dev, uwire); in uwire_probe()
500 uwire->ck = clk_get(&pdev->dev, "fck"); in uwire_probe()
501 if (IS_ERR(uwire->ck)) { in uwire_probe()
502 status = PTR_ERR(uwire->ck); in uwire_probe()
503 dev_dbg(&pdev->dev, "no functional clock?\n"); in uwire_probe()
507 clk_enable(uwire->ck); in uwire_probe()
516 /* the spi->mode bits understood by this driver: */ in uwire_probe()
517 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; in uwire_probe()
519 master->flags = SPI_MASTER_HALF_DUPLEX; in uwire_probe()
521 master->bus_num = 2; /* "official" */ in uwire_probe()
522 master->num_chipselect = 4; in uwire_probe()
523 master->setup = uwire_setup; in uwire_probe()
524 master->cleanup = uwire_cleanup; in uwire_probe()
526 uwire->bitbang.master = master; in uwire_probe()
527 uwire->bitbang.chipselect = uwire_chipselect; in uwire_probe()
528 uwire->bitbang.setup_transfer = uwire_setup_transfer; in uwire_probe()
529 uwire->bitbang.txrx_bufs = uwire_txrx; in uwire_probe()
531 status = spi_bitbang_start(&uwire->bitbang); in uwire_probe()
541 struct uwire_spi *uwire = dev_get_drvdata(&pdev->dev); in uwire_remove()
546 status = spi_bitbang_stop(&uwire->bitbang); in uwire_remove()