spicc 142 drivers/spi/spi-meson-spicc.c static inline bool meson_spicc_txfull(struct meson_spicc_device *spicc) spicc 145 drivers/spi/spi-meson-spicc.c readl_relaxed(spicc->base + SPICC_STATREG)); spicc 148 drivers/spi/spi-meson-spicc.c static inline bool meson_spicc_rxready(struct meson_spicc_device *spicc) spicc 151 drivers/spi/spi-meson-spicc.c readl_relaxed(spicc->base + SPICC_STATREG)); spicc 154 drivers/spi/spi-meson-spicc.c static inline u32 meson_spicc_pull_data(struct meson_spicc_device *spicc) spicc 156 drivers/spi/spi-meson-spicc.c unsigned int bytes = spicc->bytes_per_word; spicc 162 drivers/spi/spi-meson-spicc.c byte = *spicc->tx_buf++; spicc 167 drivers/spi/spi-meson-spicc.c spicc->tx_remain--; spicc 171 drivers/spi/spi-meson-spicc.c static inline void meson_spicc_push_data(struct meson_spicc_device *spicc, spicc 174 drivers/spi/spi-meson-spicc.c unsigned int bytes = spicc->bytes_per_word; spicc 180 drivers/spi/spi-meson-spicc.c *spicc->rx_buf++ = byte; spicc 184 drivers/spi/spi-meson-spicc.c spicc->rx_remain--; spicc 187 drivers/spi/spi-meson-spicc.c static inline void meson_spicc_rx(struct meson_spicc_device *spicc) spicc 190 drivers/spi/spi-meson-spicc.c while (spicc->rx_remain && spicc 191 drivers/spi/spi-meson-spicc.c meson_spicc_rxready(spicc)) spicc 192 drivers/spi/spi-meson-spicc.c meson_spicc_push_data(spicc, spicc 193 drivers/spi/spi-meson-spicc.c readl_relaxed(spicc->base + SPICC_RXDATA)); spicc 196 drivers/spi/spi-meson-spicc.c static inline void meson_spicc_tx(struct meson_spicc_device *spicc) spicc 199 drivers/spi/spi-meson-spicc.c while (spicc->tx_remain && spicc 200 drivers/spi/spi-meson-spicc.c !meson_spicc_txfull(spicc)) spicc 201 drivers/spi/spi-meson-spicc.c writel_relaxed(meson_spicc_pull_data(spicc), spicc 202 drivers/spi/spi-meson-spicc.c spicc->base + SPICC_TXDATA); spicc 205 drivers/spi/spi-meson-spicc.c static inline u32 meson_spicc_setup_rx_irq(struct meson_spicc_device *spicc, spicc 208 drivers/spi/spi-meson-spicc.c if (spicc->rx_remain > SPICC_FIFO_HALF) spicc 216 drivers/spi/spi-meson-spicc.c static inline void meson_spicc_setup_burst(struct meson_spicc_device *spicc, spicc 220 drivers/spi/spi-meson-spicc.c spicc->tx_remain = burst_len; spicc 221 drivers/spi/spi-meson-spicc.c spicc->rx_remain = burst_len; spicc 222 drivers/spi/spi-meson-spicc.c spicc->xfer_remain -= burst_len * spicc->bytes_per_word; spicc 223 drivers/spi/spi-meson-spicc.c spicc->is_burst_end = false; spicc 224 drivers/spi/spi-meson-spicc.c if (burst_len < SPICC_BURST_MAX || !spicc->xfer_remain) spicc 225 drivers/spi/spi-meson-spicc.c spicc->is_last_burst = true; spicc 227 drivers/spi/spi-meson-spicc.c spicc->is_last_burst = false; spicc 233 drivers/spi/spi-meson-spicc.c spicc->base + SPICC_CONREG); spicc 236 drivers/spi/spi-meson-spicc.c meson_spicc_tx(spicc); spicc 241 drivers/spi/spi-meson-spicc.c struct meson_spicc_device *spicc = (void *) data; spicc 242 drivers/spi/spi-meson-spicc.c u32 ctrl = readl_relaxed(spicc->base + SPICC_INTREG); spicc 243 drivers/spi/spi-meson-spicc.c u32 stat = readl_relaxed(spicc->base + SPICC_STATREG) & ctrl; spicc 248 drivers/spi/spi-meson-spicc.c meson_spicc_rx(spicc); spicc 251 drivers/spi/spi-meson-spicc.c if (!spicc->tx_remain && !spicc->rx_remain) { spicc 252 drivers/spi/spi-meson-spicc.c spicc->is_burst_end = true; spicc 258 drivers/spi/spi-meson-spicc.c stat = readl_relaxed(spicc->base + SPICC_STATREG) & ctrl; spicc 262 drivers/spi/spi-meson-spicc.c if ((stat & SPICC_TC) && spicc->is_burst_end) { spicc 266 drivers/spi/spi-meson-spicc.c writel_relaxed(SPICC_TC, spicc->base + SPICC_STATREG); spicc 271 drivers/spi/spi-meson-spicc.c if (spicc->is_last_burst) { spicc 273 drivers/spi/spi-meson-spicc.c writel(0, spicc->base + SPICC_INTREG); spicc 275 drivers/spi/spi-meson-spicc.c spi_finalize_current_transfer(spicc->master); spicc 281 drivers/spi/spi-meson-spicc.c spicc->xfer_remain / spicc->bytes_per_word, spicc 285 drivers/spi/spi-meson-spicc.c meson_spicc_setup_burst(spicc, burst_len); spicc 289 drivers/spi/spi-meson-spicc.c spicc->base + SPICC_CONREG); spicc 293 drivers/spi/spi-meson-spicc.c ctrl = meson_spicc_setup_rx_irq(spicc, ctrl); spicc 296 drivers/spi/spi-meson-spicc.c writel(ctrl, spicc->base + SPICC_INTREG); spicc 301 drivers/spi/spi-meson-spicc.c static u32 meson_spicc_setup_speed(struct meson_spicc_device *spicc, u32 conf, spicc 307 drivers/spi/spi-meson-spicc.c parent = clk_get_rate(spicc->core); spicc 321 drivers/spi/spi-meson-spicc.c dev_warn_once(&spicc->pdev->dev, "unable to get close to speed %u\n", spicc 326 drivers/spi/spi-meson-spicc.c dev_dbg(&spicc->pdev->dev, "parent %lu, speed %u -> %lu (%u)\n", spicc 335 drivers/spi/spi-meson-spicc.c static void meson_spicc_setup_xfer(struct meson_spicc_device *spicc, spicc 341 drivers/spi/spi-meson-spicc.c conf = conf_orig = readl_relaxed(spicc->base + SPICC_CONREG); spicc 344 drivers/spi/spi-meson-spicc.c conf = meson_spicc_setup_speed(spicc, conf, xfer->speed_hz); spicc 349 drivers/spi/spi-meson-spicc.c (spicc->bytes_per_word << 3) - 1); spicc 353 drivers/spi/spi-meson-spicc.c writel_relaxed(conf, spicc->base + SPICC_CONREG); spicc 360 drivers/spi/spi-meson-spicc.c struct meson_spicc_device *spicc = spi_master_get_devdata(master); spicc 365 drivers/spi/spi-meson-spicc.c spicc->xfer = xfer; spicc 368 drivers/spi/spi-meson-spicc.c spicc->tx_buf = (u8 *)xfer->tx_buf; spicc 369 drivers/spi/spi-meson-spicc.c spicc->rx_buf = (u8 *)xfer->rx_buf; spicc 370 drivers/spi/spi-meson-spicc.c spicc->xfer_remain = xfer->len; spicc 373 drivers/spi/spi-meson-spicc.c spicc->bytes_per_word = spicc 374 drivers/spi/spi-meson-spicc.c DIV_ROUND_UP(spicc->xfer->bits_per_word, 8); spicc 377 drivers/spi/spi-meson-spicc.c meson_spicc_setup_xfer(spicc, xfer); spicc 380 drivers/spi/spi-meson-spicc.c spicc->xfer_remain / spicc->bytes_per_word, spicc 383 drivers/spi/spi-meson-spicc.c meson_spicc_setup_burst(spicc, burst_len); spicc 385 drivers/spi/spi-meson-spicc.c irq = meson_spicc_setup_rx_irq(spicc, irq); spicc 388 drivers/spi/spi-meson-spicc.c writel_bits_relaxed(SPICC_XCH, SPICC_XCH, spicc->base + SPICC_CONREG); spicc 391 drivers/spi/spi-meson-spicc.c writel_relaxed(irq, spicc->base + SPICC_INTREG); spicc 399 drivers/spi/spi-meson-spicc.c struct meson_spicc_device *spicc = spi_master_get_devdata(master); spicc 404 drivers/spi/spi-meson-spicc.c spicc->message = message; spicc 443 drivers/spi/spi-meson-spicc.c writel_relaxed(conf, spicc->base + SPICC_CONREG); spicc 446 drivers/spi/spi-meson-spicc.c writel_relaxed(0, spicc->base + SPICC_PERIODREG); spicc 448 drivers/spi/spi-meson-spicc.c writel_bits_relaxed(BIT(24), BIT(24), spicc->base + SPICC_TESTREG); spicc 455 drivers/spi/spi-meson-spicc.c struct meson_spicc_device *spicc = spi_master_get_devdata(master); spicc 458 drivers/spi/spi-meson-spicc.c writel(0, spicc->base + SPICC_INTREG); spicc 461 drivers/spi/spi-meson-spicc.c writel_bits_relaxed(SPICC_ENABLE, 0, spicc->base + SPICC_CONREG); spicc 463 drivers/spi/spi-meson-spicc.c device_reset_optional(&spicc->pdev->dev); spicc 505 drivers/spi/spi-meson-spicc.c struct meson_spicc_device *spicc; spicc 508 drivers/spi/spi-meson-spicc.c master = spi_alloc_master(&pdev->dev, sizeof(*spicc)); spicc 513 drivers/spi/spi-meson-spicc.c spicc = spi_master_get_devdata(master); spicc 514 drivers/spi/spi-meson-spicc.c spicc->master = master; spicc 516 drivers/spi/spi-meson-spicc.c spicc->pdev = pdev; spicc 517 drivers/spi/spi-meson-spicc.c platform_set_drvdata(pdev, spicc); spicc 519 drivers/spi/spi-meson-spicc.c spicc->base = devm_platform_ioremap_resource(pdev, 0); spicc 520 drivers/spi/spi-meson-spicc.c if (IS_ERR(spicc->base)) { spicc 522 drivers/spi/spi-meson-spicc.c ret = PTR_ERR(spicc->base); spicc 527 drivers/spi/spi-meson-spicc.c writel_relaxed(0, spicc->base + SPICC_INTREG); spicc 531 drivers/spi/spi-meson-spicc.c 0, NULL, spicc); spicc 537 drivers/spi/spi-meson-spicc.c spicc->core = devm_clk_get(&pdev->dev, "core"); spicc 538 drivers/spi/spi-meson-spicc.c if (IS_ERR(spicc->core)) { spicc 540 drivers/spi/spi-meson-spicc.c ret = PTR_ERR(spicc->core); spicc 544 drivers/spi/spi-meson-spicc.c ret = clk_prepare_enable(spicc->core); spicc 549 drivers/spi/spi-meson-spicc.c rate = clk_get_rate(spicc->core); spicc 583 drivers/spi/spi-meson-spicc.c clk_disable_unprepare(spicc->core); spicc 593 drivers/spi/spi-meson-spicc.c struct meson_spicc_device *spicc = platform_get_drvdata(pdev); spicc 596 drivers/spi/spi-meson-spicc.c writel(0, spicc->base + SPICC_CONREG); spicc 598 drivers/spi/spi-meson-spicc.c clk_disable_unprepare(spicc->core);