Lines Matching refs:spicc
178 static void meson_spicc_oen_enable(struct meson_spicc_device *spicc)
182 if (!spicc->data->has_oen) {
184 spicc->pins_idle_high = pinctrl_lookup_state(spicc->pinctrl,
186 if (IS_ERR(spicc->pins_idle_high)) {
187 dev_warn(&spicc->pdev->dev, "can't get idle-high pinctrl\n");
188 spicc->pins_idle_high = NULL;
190 spicc->pins_idle_low = pinctrl_lookup_state(spicc->pinctrl,
192 if (IS_ERR(spicc->pins_idle_low)) {
193 dev_warn(&spicc->pdev->dev, "can't get idle-low pinctrl\n");
194 spicc->pins_idle_low = NULL;
199 conf = readl_relaxed(spicc->base + SPICC_ENH_CTL0) |
202 writel_relaxed(conf, spicc->base + SPICC_ENH_CTL0);
205 static inline bool meson_spicc_txfull(struct meson_spicc_device *spicc)
208 readl_relaxed(spicc->base + SPICC_STATREG));
211 static inline bool meson_spicc_rxready(struct meson_spicc_device *spicc)
214 readl_relaxed(spicc->base + SPICC_STATREG));
217 static inline u32 meson_spicc_pull_data(struct meson_spicc_device *spicc)
219 unsigned int bytes = spicc->bytes_per_word;
225 byte = *spicc->tx_buf++;
230 spicc->tx_remain--;
234 static inline void meson_spicc_push_data(struct meson_spicc_device *spicc,
237 unsigned int bytes = spicc->bytes_per_word;
243 *spicc->rx_buf++ = byte;
247 spicc->rx_remain--;
250 static inline void meson_spicc_rx(struct meson_spicc_device *spicc)
253 while (spicc->rx_remain &&
254 meson_spicc_rxready(spicc))
255 meson_spicc_push_data(spicc,
256 readl_relaxed(spicc->base + SPICC_RXDATA));
259 static inline void meson_spicc_tx(struct meson_spicc_device *spicc)
262 while (spicc->tx_remain &&
263 !meson_spicc_txfull(spicc))
264 writel_relaxed(meson_spicc_pull_data(spicc),
265 spicc->base + SPICC_TXDATA);
268 static inline void meson_spicc_setup_burst(struct meson_spicc_device *spicc)
272 spicc->xfer_remain /
273 spicc->bytes_per_word,
274 spicc->data->fifo_size);
276 spicc->tx_remain = burst_len;
277 spicc->rx_remain = burst_len;
278 spicc->xfer_remain -= burst_len * spicc->bytes_per_word;
284 spicc->base + SPICC_CONREG);
287 meson_spicc_tx(spicc);
292 struct meson_spicc_device *spicc = (void *) data;
294 writel_bits_relaxed(SPICC_TC, SPICC_TC, spicc->base + SPICC_STATREG);
297 meson_spicc_rx(spicc);
299 if (!spicc->xfer_remain) {
301 writel(0, spicc->base + SPICC_INTREG);
303 complete(&spicc->done);
309 meson_spicc_setup_burst(spicc);
312 writel_bits_relaxed(SPICC_XCH, SPICC_XCH, spicc->base + SPICC_CONREG);
317 static void meson_spicc_auto_io_delay(struct meson_spicc_device *spicc)
323 if (spicc->data->has_enhance_clk_div) {
325 readl_relaxed(spicc->base + SPICC_ENH_CTL0));
330 readl_relaxed(spicc->base + SPICC_CONREG));
337 hz = clk_get_rate(spicc->clk);
352 conf = readl_relaxed(spicc->base + SPICC_TESTREG);
357 writel_relaxed(conf, spicc->base + SPICC_TESTREG);
360 static void meson_spicc_setup_xfer(struct meson_spicc_device *spicc,
366 conf = conf_orig = readl_relaxed(spicc->base + SPICC_CONREG);
371 (spicc->bytes_per_word << 3) - 1);
375 writel_relaxed(conf, spicc->base + SPICC_CONREG);
377 clk_set_rate(spicc->clk, xfer->speed_hz);
379 meson_spicc_auto_io_delay(spicc);
381 writel_relaxed(0, spicc->base + SPICC_DMAREG);
384 static void meson_spicc_reset_fifo(struct meson_spicc_device *spicc)
386 if (spicc->data->has_oen)
389 spicc->base + SPICC_ENH_CTL0);
392 spicc->base + SPICC_TESTREG);
394 while (meson_spicc_rxready(spicc))
395 readl_relaxed(spicc->base + SPICC_RXDATA);
397 if (spicc->data->has_oen)
399 spicc->base + SPICC_ENH_CTL0);
406 struct meson_spicc_device *spicc = spi_master_get_devdata(master);
410 spicc->xfer = xfer;
413 spicc->tx_buf = (u8 *)xfer->tx_buf;
414 spicc->rx_buf = (u8 *)xfer->rx_buf;
415 spicc->xfer_remain = xfer->len;
418 spicc->bytes_per_word =
419 DIV_ROUND_UP(spicc->xfer->bits_per_word, 8);
421 if (xfer->len % spicc->bytes_per_word)
425 meson_spicc_setup_xfer(spicc, xfer);
427 meson_spicc_reset_fifo(spicc);
430 meson_spicc_setup_burst(spicc);
433 reinit_completion(&spicc->done);
446 writel_bits_relaxed(SPICC_XCH, SPICC_XCH, spicc->base + SPICC_CONREG);
449 writel_relaxed(SPICC_TC_EN, spicc->base + SPICC_INTREG);
451 if (!wait_for_completion_timeout(&spicc->done, msecs_to_jiffies(timeout)))
460 struct meson_spicc_device *spicc = spi_master_get_devdata(master);
462 u32 conf = readl_relaxed(spicc->base + SPICC_CONREG) & SPICC_DATARATE_MASK;
465 spicc->message = message;
479 if (!spicc->data->has_oen) {
481 if (spicc->pins_idle_high)
482 pinctrl_select_state(spicc->pinctrl, spicc->pins_idle_high);
484 if (spicc->pins_idle_low)
485 pinctrl_select_state(spicc->pinctrl, spicc->pins_idle_low);
512 writel_relaxed(conf, spicc->base + SPICC_CONREG);
515 writel_relaxed(0, spicc->base + SPICC_PERIODREG);
517 writel_bits_relaxed(SPICC_LBC_W1, 0, spicc->base + SPICC_TESTREG);
524 struct meson_spicc_device *spicc = spi_master_get_devdata(master);
525 u32 conf = readl_relaxed(spicc->base + SPICC_CONREG) & SPICC_DATARATE_MASK;
528 writel(0, spicc->base + SPICC_INTREG);
530 device_reset_optional(&spicc->pdev->dev);
533 writel_relaxed(conf, spicc->base + SPICC_CONREG);
535 if (!spicc->data->has_oen)
536 pinctrl_select_default_state(&spicc->pdev->dev);
586 struct meson_spicc_device *spicc = pow2_clk_to_spicc(divider);
588 if (!spicc->master->cur_msg)
598 struct meson_spicc_device *spicc = pow2_clk_to_spicc(divider);
600 if (!spicc->master->cur_msg)
610 struct meson_spicc_device *spicc = pow2_clk_to_spicc(divider);
612 if (!spicc->master->cur_msg)
624 static int meson_spicc_pow2_clk_init(struct meson_spicc_device *spicc)
626 struct device *dev = &spicc->pdev->dev;
648 if (spicc->data->has_pclk)
649 parent_data[0].hw = __clk_get_hw(spicc->pclk);
651 parent_data[0].hw = __clk_get_hw(spicc->core);
673 spicc->pow2_div.shift = 16,
674 spicc->pow2_div.width = 3,
675 spicc->pow2_div.flags = CLK_DIVIDER_POWER_OF_TWO,
676 spicc->pow2_div.reg = spicc->base + SPICC_CONREG;
677 spicc->pow2_div.hw.init = &init;
679 spicc->clk = devm_clk_register(dev, &spicc->pow2_div.hw);
680 if (WARN_ON(IS_ERR(spicc->clk)))
681 return PTR_ERR(spicc->clk);
686 static int meson_spicc_enh_clk_init(struct meson_spicc_device *spicc)
688 struct device *dev = &spicc->pdev->dev;
712 if (spicc->data->has_pclk)
713 parent_data[0].hw = __clk_get_hw(spicc->pclk);
715 parent_data[0].hw = __clk_get_hw(spicc->core);
739 enh_div->reg = spicc->base + SPICC_ENH_CTL0;
753 parent_data[0].hw = &spicc->pow2_div.hw;
760 mux->reg = spicc->base + SPICC_ENH_CTL0;
763 spicc->clk = devm_clk_register(dev, &mux->hw);
764 if (WARN_ON(IS_ERR(spicc->clk)))
765 return PTR_ERR(spicc->clk);
773 struct meson_spicc_device *spicc;
776 master = spi_alloc_master(&pdev->dev, sizeof(*spicc));
781 spicc = spi_master_get_devdata(master);
782 spicc->master = master;
784 spicc->data = of_device_get_match_data(&pdev->dev);
785 if (!spicc->data) {
791 spicc->pdev = pdev;
792 platform_set_drvdata(pdev, spicc);
794 init_completion(&spicc->done);
796 spicc->base = devm_platform_ioremap_resource(pdev, 0);
797 if (IS_ERR(spicc->base)) {
799 ret = PTR_ERR(spicc->base);
805 spicc->base + SPICC_CONREG);
808 writel_relaxed(0, spicc->base + SPICC_INTREG);
817 0, NULL, spicc);
823 spicc->core = devm_clk_get(&pdev->dev, "core");
824 if (IS_ERR(spicc->core)) {
826 ret = PTR_ERR(spicc->core);
830 if (spicc->data->has_pclk) {
831 spicc->pclk = devm_clk_get(&pdev->dev, "pclk");
832 if (IS_ERR(spicc->pclk)) {
834 ret = PTR_ERR(spicc->pclk);
839 ret = clk_prepare_enable(spicc->core);
845 ret = clk_prepare_enable(spicc->pclk);
851 spicc->pinctrl = devm_pinctrl_get(&pdev->dev);
852 if (IS_ERR(spicc->pinctrl)) {
853 ret = PTR_ERR(spicc->pinctrl);
867 master->min_speed_hz = spicc->data->min_speed_hz;
868 master->max_speed_hz = spicc->data->max_speed_hz;
876 meson_spicc_oen_enable(spicc);
878 ret = meson_spicc_pow2_clk_init(spicc);
884 if (spicc->data->has_enhance_clk_div) {
885 ret = meson_spicc_enh_clk_init(spicc);
901 clk_disable_unprepare(spicc->pclk);
904 clk_disable_unprepare(spicc->core);
914 struct meson_spicc_device *spicc = platform_get_drvdata(pdev);
917 writel(0, spicc->base + SPICC_CONREG);
919 clk_disable_unprepare(spicc->core);
920 clk_disable_unprepare(spicc->pclk);
922 spi_master_put(spicc->master);
950 .compatible = "amlogic,meson-gx-spicc",
954 .compatible = "amlogic,meson-axg-spicc",
958 .compatible = "amlogic,meson-g12a-spicc",
969 .name = "meson-spicc",