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