a3700_spi 117 drivers/spi/spi-armada-3700.c static u32 spireg_read(struct a3700_spi *a3700_spi, u32 offset) a3700_spi 119 drivers/spi/spi-armada-3700.c return readl(a3700_spi->base + offset); a3700_spi 122 drivers/spi/spi-armada-3700.c static void spireg_write(struct a3700_spi *a3700_spi, u32 offset, u32 data) a3700_spi 124 drivers/spi/spi-armada-3700.c writel(data, a3700_spi->base + offset); a3700_spi 127 drivers/spi/spi-armada-3700.c static void a3700_spi_auto_cs_unset(struct a3700_spi *a3700_spi) a3700_spi 131 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 133 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 136 drivers/spi/spi-armada-3700.c static void a3700_spi_activate_cs(struct a3700_spi *a3700_spi, unsigned int cs) a3700_spi 140 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG); a3700_spi 142 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CTRL_REG, val); a3700_spi 145 drivers/spi/spi-armada-3700.c static void a3700_spi_deactivate_cs(struct a3700_spi *a3700_spi, a3700_spi 150 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG); a3700_spi 152 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CTRL_REG, val); a3700_spi 155 drivers/spi/spi-armada-3700.c static int a3700_spi_pin_mode_set(struct a3700_spi *a3700_spi, a3700_spi 160 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 177 drivers/spi/spi-armada-3700.c dev_err(&a3700_spi->master->dev, "wrong pin mode %u", pin_mode); a3700_spi 181 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 186 drivers/spi/spi-armada-3700.c static void a3700_spi_fifo_mode_set(struct a3700_spi *a3700_spi, bool enable) a3700_spi 190 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 195 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 198 drivers/spi/spi-armada-3700.c static void a3700_spi_mode_set(struct a3700_spi *a3700_spi, a3700_spi 203 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 215 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 218 drivers/spi/spi-armada-3700.c static void a3700_spi_clock_set(struct a3700_spi *a3700_spi, a3700_spi 224 drivers/spi/spi-armada-3700.c prescale = DIV_ROUND_UP(clk_get_rate(a3700_spi->clk), speed_hz); a3700_spi 233 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 237 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 240 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_TIME_REG); a3700_spi 242 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_TIME_REG, val); a3700_spi 246 drivers/spi/spi-armada-3700.c static void a3700_spi_bytelen_set(struct a3700_spi *a3700_spi, unsigned int len) a3700_spi 250 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 255 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 257 drivers/spi/spi-armada-3700.c a3700_spi->byte_len = len; a3700_spi 260 drivers/spi/spi-armada-3700.c static int a3700_spi_fifo_flush(struct a3700_spi *a3700_spi) a3700_spi 265 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 267 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 270 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 279 drivers/spi/spi-armada-3700.c static int a3700_spi_init(struct a3700_spi *a3700_spi) a3700_spi 281 drivers/spi/spi-armada-3700.c struct spi_master *master = a3700_spi->master; a3700_spi 286 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 288 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 292 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 294 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 297 drivers/spi/spi-armada-3700.c a3700_spi_auto_cs_unset(a3700_spi); a3700_spi 299 drivers/spi/spi-armada-3700.c a3700_spi_deactivate_cs(a3700_spi, i); a3700_spi 302 drivers/spi/spi-armada-3700.c a3700_spi_fifo_mode_set(a3700_spi, true); a3700_spi 305 drivers/spi/spi-armada-3700.c a3700_spi_mode_set(a3700_spi, master->mode_bits); a3700_spi 308 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_HDR_CNT_REG, 0); a3700_spi 309 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_DIN_CNT_REG, 0); a3700_spi 312 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_INT_MASK_REG, 0); a3700_spi 313 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_INT_STAT_REG, ~0U); a3700_spi 321 drivers/spi/spi-armada-3700.c struct a3700_spi *a3700_spi; a3700_spi 324 drivers/spi/spi-armada-3700.c a3700_spi = spi_master_get_devdata(master); a3700_spi 327 drivers/spi/spi-armada-3700.c cause = spireg_read(a3700_spi, A3700_SPI_INT_STAT_REG); a3700_spi 329 drivers/spi/spi-armada-3700.c if (!cause || !(a3700_spi->wait_mask & cause)) a3700_spi 333 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_INT_MASK_REG, 0); a3700_spi 334 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_INT_STAT_REG, cause); a3700_spi 337 drivers/spi/spi-armada-3700.c complete(&a3700_spi->done); a3700_spi 344 drivers/spi/spi-armada-3700.c struct a3700_spi *a3700_spi; a3700_spi 349 drivers/spi/spi-armada-3700.c a3700_spi = spi_master_get_devdata(spi->master); a3700_spi 357 drivers/spi/spi-armada-3700.c ctrl_reg = spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG); a3700_spi 358 drivers/spi/spi-armada-3700.c if (a3700_spi->wait_mask & ctrl_reg) a3700_spi 361 drivers/spi/spi-armada-3700.c reinit_completion(&a3700_spi->done); a3700_spi 363 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_INT_MASK_REG, a3700_spi 364 drivers/spi/spi-armada-3700.c a3700_spi->wait_mask); a3700_spi 367 drivers/spi/spi-armada-3700.c timeout = wait_for_completion_timeout(&a3700_spi->done, a3700_spi 370 drivers/spi/spi-armada-3700.c a3700_spi->wait_mask = 0; a3700_spi 383 drivers/spi/spi-armada-3700.c ctrl_reg = spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG); a3700_spi 384 drivers/spi/spi-armada-3700.c if (a3700_spi->wait_mask & ctrl_reg) a3700_spi 387 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_INT_MASK_REG, 0); a3700_spi 396 drivers/spi/spi-armada-3700.c struct a3700_spi *a3700_spi; a3700_spi 398 drivers/spi/spi-armada-3700.c a3700_spi = spi_master_get_devdata(spi->master); a3700_spi 399 drivers/spi/spi-armada-3700.c a3700_spi->wait_mask = bit_mask; a3700_spi 404 drivers/spi/spi-armada-3700.c static void a3700_spi_fifo_thres_set(struct a3700_spi *a3700_spi, a3700_spi 409 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 414 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 420 drivers/spi/spi-armada-3700.c struct a3700_spi *a3700_spi; a3700_spi 422 drivers/spi/spi-armada-3700.c a3700_spi = spi_master_get_devdata(spi->master); a3700_spi 424 drivers/spi/spi-armada-3700.c a3700_spi_clock_set(a3700_spi, xfer->speed_hz); a3700_spi 429 drivers/spi/spi-armada-3700.c a3700_spi_bytelen_set(a3700_spi, 4); a3700_spi 432 drivers/spi/spi-armada-3700.c a3700_spi->tx_buf = xfer->tx_buf; a3700_spi 433 drivers/spi/spi-armada-3700.c a3700_spi->rx_buf = xfer->rx_buf; a3700_spi 434 drivers/spi/spi-armada-3700.c a3700_spi->buf_len = xfer->len; a3700_spi 439 drivers/spi/spi-armada-3700.c struct a3700_spi *a3700_spi = spi_master_get_devdata(spi->master); a3700_spi 442 drivers/spi/spi-armada-3700.c a3700_spi_activate_cs(a3700_spi, spi->chip_select); a3700_spi 444 drivers/spi/spi-armada-3700.c a3700_spi_deactivate_cs(a3700_spi, spi->chip_select); a3700_spi 447 drivers/spi/spi-armada-3700.c static void a3700_spi_header_set(struct a3700_spi *a3700_spi) a3700_spi 453 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_INST_REG, 0); a3700_spi 454 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_ADDR_REG, 0); a3700_spi 455 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_RMODE_REG, 0); a3700_spi 456 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_HDR_CNT_REG, 0); a3700_spi 459 drivers/spi/spi-armada-3700.c if (a3700_spi->tx_buf) { a3700_spi 468 drivers/spi/spi-armada-3700.c addr_cnt = a3700_spi->buf_len % 4; a3700_spi 472 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_HDR_CNT_REG, val); a3700_spi 475 drivers/spi/spi-armada-3700.c a3700_spi->buf_len -= addr_cnt; a3700_spi 480 drivers/spi/spi-armada-3700.c val = (val << 8) | a3700_spi->tx_buf[0]; a3700_spi 481 drivers/spi/spi-armada-3700.c a3700_spi->tx_buf++; a3700_spi 483 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_ADDR_REG, val); a3700_spi 488 drivers/spi/spi-armada-3700.c static int a3700_is_wfifo_full(struct a3700_spi *a3700_spi) a3700_spi 492 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG); a3700_spi 496 drivers/spi/spi-armada-3700.c static int a3700_spi_fifo_write(struct a3700_spi *a3700_spi) a3700_spi 500 drivers/spi/spi-armada-3700.c while (!a3700_is_wfifo_full(a3700_spi) && a3700_spi->buf_len) { a3700_spi 501 drivers/spi/spi-armada-3700.c val = *(u32 *)a3700_spi->tx_buf; a3700_spi 502 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_DATA_OUT_REG, val); a3700_spi 503 drivers/spi/spi-armada-3700.c a3700_spi->buf_len -= 4; a3700_spi 504 drivers/spi/spi-armada-3700.c a3700_spi->tx_buf += 4; a3700_spi 510 drivers/spi/spi-armada-3700.c static int a3700_is_rfifo_empty(struct a3700_spi *a3700_spi) a3700_spi 512 drivers/spi/spi-armada-3700.c u32 val = spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG); a3700_spi 517 drivers/spi/spi-armada-3700.c static int a3700_spi_fifo_read(struct a3700_spi *a3700_spi) a3700_spi 521 drivers/spi/spi-armada-3700.c while (!a3700_is_rfifo_empty(a3700_spi) && a3700_spi->buf_len) { a3700_spi 522 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_DATA_IN_REG); a3700_spi 523 drivers/spi/spi-armada-3700.c if (a3700_spi->buf_len >= 4) { a3700_spi 525 drivers/spi/spi-armada-3700.c memcpy(a3700_spi->rx_buf, &val, 4); a3700_spi 527 drivers/spi/spi-armada-3700.c a3700_spi->buf_len -= 4; a3700_spi 528 drivers/spi/spi-armada-3700.c a3700_spi->rx_buf += 4; a3700_spi 535 drivers/spi/spi-armada-3700.c while (a3700_spi->buf_len) { a3700_spi 536 drivers/spi/spi-armada-3700.c *a3700_spi->rx_buf = val & 0xff; a3700_spi 539 drivers/spi/spi-armada-3700.c a3700_spi->buf_len--; a3700_spi 540 drivers/spi/spi-armada-3700.c a3700_spi->rx_buf++; a3700_spi 548 drivers/spi/spi-armada-3700.c static void a3700_spi_transfer_abort_fifo(struct a3700_spi *a3700_spi) a3700_spi 553 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 555 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 558 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 564 drivers/spi/spi-armada-3700.c a3700_spi_fifo_flush(a3700_spi); a3700_spi 567 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 573 drivers/spi/spi-armada-3700.c struct a3700_spi *a3700_spi = spi_master_get_devdata(master); a3700_spi 577 drivers/spi/spi-armada-3700.c ret = clk_enable(a3700_spi->clk); a3700_spi 584 drivers/spi/spi-armada-3700.c ret = a3700_spi_fifo_flush(a3700_spi); a3700_spi 588 drivers/spi/spi-armada-3700.c a3700_spi_mode_set(a3700_spi, spi->mode); a3700_spi 597 drivers/spi/spi-armada-3700.c struct a3700_spi *a3700_spi = spi_master_get_devdata(master); a3700_spi 603 drivers/spi/spi-armada-3700.c a3700_spi_fifo_mode_set(a3700_spi, true); a3700_spi 607 drivers/spi/spi-armada-3700.c a3700_spi_fifo_thres_set(a3700_spi, byte_len); a3700_spi 614 drivers/spi/spi-armada-3700.c a3700_spi_pin_mode_set(a3700_spi, nbits, xfer->rx_buf ? true : false); a3700_spi 617 drivers/spi/spi-armada-3700.c a3700_spi_fifo_flush(a3700_spi); a3700_spi 620 drivers/spi/spi-armada-3700.c a3700_spi_header_set(a3700_spi); a3700_spi 626 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_DATA_OUT_REG, 0); a3700_spi 629 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_DIN_CNT_REG, a3700_spi 630 drivers/spi/spi-armada-3700.c a3700_spi->buf_len); a3700_spi 632 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 635 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 638 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 640 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 648 drivers/spi/spi-armada-3700.c a3700_spi->xmit_data = (a3700_spi->buf_len != 0); a3700_spi 651 drivers/spi/spi-armada-3700.c while (a3700_spi->buf_len) { a3700_spi 652 drivers/spi/spi-armada-3700.c if (a3700_spi->tx_buf) { a3700_spi 662 drivers/spi/spi-armada-3700.c ret = a3700_spi_fifo_write(a3700_spi); a3700_spi 665 drivers/spi/spi-armada-3700.c } else if (a3700_spi->rx_buf) { a3700_spi 675 drivers/spi/spi-armada-3700.c ret = a3700_spi_fifo_read(a3700_spi); a3700_spi 693 drivers/spi/spi-armada-3700.c if (a3700_spi->tx_buf) { a3700_spi 694 drivers/spi/spi-armada-3700.c if (a3700_spi->xmit_data) { a3700_spi 712 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 714 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 718 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG); a3700_spi 731 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val); a3700_spi 735 drivers/spi/spi-armada-3700.c a3700_spi_transfer_abort_fifo(a3700_spi); a3700_spi 746 drivers/spi/spi-armada-3700.c struct a3700_spi *a3700_spi = spi_master_get_devdata(master); a3700_spi 750 drivers/spi/spi-armada-3700.c a3700_spi_fifo_mode_set(a3700_spi, false); a3700_spi 752 drivers/spi/spi-armada-3700.c while (a3700_spi->buf_len) { a3700_spi 757 drivers/spi/spi-armada-3700.c if (a3700_spi->buf_len < 4) a3700_spi 758 drivers/spi/spi-armada-3700.c a3700_spi_bytelen_set(a3700_spi, 1); a3700_spi 760 drivers/spi/spi-armada-3700.c if (a3700_spi->byte_len == 1) a3700_spi 761 drivers/spi/spi-armada-3700.c val = *a3700_spi->tx_buf; a3700_spi 763 drivers/spi/spi-armada-3700.c val = *(u32 *)a3700_spi->tx_buf; a3700_spi 765 drivers/spi/spi-armada-3700.c spireg_write(a3700_spi, A3700_SPI_DATA_OUT_REG, val); a3700_spi 768 drivers/spi/spi-armada-3700.c while (!(spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG) & a3700_spi 772 drivers/spi/spi-armada-3700.c val = spireg_read(a3700_spi, A3700_SPI_DATA_IN_REG); a3700_spi 774 drivers/spi/spi-armada-3700.c memcpy(a3700_spi->rx_buf, &val, a3700_spi->byte_len); a3700_spi 776 drivers/spi/spi-armada-3700.c a3700_spi->buf_len -= a3700_spi->byte_len; a3700_spi 777 drivers/spi/spi-armada-3700.c a3700_spi->tx_buf += a3700_spi->byte_len; a3700_spi 778 drivers/spi/spi-armada-3700.c a3700_spi->rx_buf += a3700_spi->byte_len; a3700_spi 802 drivers/spi/spi-armada-3700.c struct a3700_spi *a3700_spi = spi_master_get_devdata(master); a3700_spi 804 drivers/spi/spi-armada-3700.c clk_disable(a3700_spi->clk); a3700_spi 821 drivers/spi/spi-armada-3700.c struct a3700_spi *spi; a3700_spi 853 drivers/spi/spi-armada-3700.c memset(spi, 0, sizeof(struct a3700_spi)); a3700_spi 919 drivers/spi/spi-armada-3700.c struct a3700_spi *spi = spi_master_get_devdata(master);