Lines Matching refs:spi_st
54 struct spi_st { struct
70 static void ssc_write_tx_fifo(struct spi_st *spi_st) in ssc_write_tx_fifo() argument
75 if (spi_st->words_remaining > FIFO_SIZE) in ssc_write_tx_fifo()
78 count = spi_st->words_remaining; in ssc_write_tx_fifo()
81 if (spi_st->tx_ptr) { in ssc_write_tx_fifo()
82 if (spi_st->bytes_per_word == 1) { in ssc_write_tx_fifo()
83 word = *spi_st->tx_ptr++; in ssc_write_tx_fifo()
85 word = *spi_st->tx_ptr++; in ssc_write_tx_fifo()
86 word = *spi_st->tx_ptr++ | (word << 8); in ssc_write_tx_fifo()
89 writel_relaxed(word, spi_st->base + SSC_TBUF); in ssc_write_tx_fifo()
94 static void ssc_read_rx_fifo(struct spi_st *spi_st) in ssc_read_rx_fifo() argument
99 if (spi_st->words_remaining > FIFO_SIZE) in ssc_read_rx_fifo()
102 count = spi_st->words_remaining; in ssc_read_rx_fifo()
105 word = readl_relaxed(spi_st->base + SSC_RBUF); in ssc_read_rx_fifo()
107 if (spi_st->rx_ptr) { in ssc_read_rx_fifo()
108 if (spi_st->bytes_per_word == 1) { in ssc_read_rx_fifo()
109 *spi_st->rx_ptr++ = (uint8_t)word; in ssc_read_rx_fifo()
111 *spi_st->rx_ptr++ = (word >> 8); in ssc_read_rx_fifo()
112 *spi_st->rx_ptr++ = word & 0xff; in ssc_read_rx_fifo()
116 spi_st->words_remaining -= count; in ssc_read_rx_fifo()
122 struct spi_st *spi_st = spi_master_get_devdata(master); in spi_st_transfer_one() local
126 spi_st->tx_ptr = t->tx_buf; in spi_st_transfer_one()
127 spi_st->rx_ptr = t->rx_buf; in spi_st_transfer_one()
134 spi_st->bytes_per_word = 2; in spi_st_transfer_one()
135 spi_st->words_remaining = t->len / 2; in spi_st_transfer_one()
142 spi_st->bytes_per_word = 2; in spi_st_transfer_one()
143 spi_st->words_remaining = t->len / 2; in spi_st_transfer_one()
146 ctl = readl_relaxed(spi_st->base + SSC_CTL); in spi_st_transfer_one()
147 writel_relaxed((ctl | 0xf), spi_st->base + SSC_CTL); in spi_st_transfer_one()
149 readl_relaxed(spi_st->base + SSC_RBUF); in spi_st_transfer_one()
152 spi_st->bytes_per_word = 1; in spi_st_transfer_one()
153 spi_st->words_remaining = t->len; in spi_st_transfer_one()
156 reinit_completion(&spi_st->done); in spi_st_transfer_one()
159 ssc_write_tx_fifo(spi_st); in spi_st_transfer_one()
160 writel_relaxed(SSC_IEN_TEEN, spi_st->base + SSC_IEN); in spi_st_transfer_one()
163 wait_for_completion(&spi_st->done); in spi_st_transfer_one()
167 writel_relaxed(ctl, spi_st->base + SSC_CTL); in spi_st_transfer_one()
183 struct spi_st *spi_st = spi_master_get_devdata(spi->master); in spi_st_setup() local
209 spi_st_clk = clk_get_rate(spi_st->clk); in spi_st_setup()
220 spi_st->baud = spi_st_clk / (2 * sscbrg); in spi_st_setup()
224 writel_relaxed(sscbrg, spi_st->base + SSC_BRG); in spi_st_setup()
228 hz, spi_st->baud, sscbrg); in spi_st_setup()
231 var = readl_relaxed(spi_st->base + SSC_CTL); in spi_st_setup()
260 writel_relaxed(var, spi_st->base + SSC_CTL); in spi_st_setup()
263 readl_relaxed(spi_st->base + SSC_RBUF); in spi_st_setup()
275 struct spi_st *spi_st = (struct spi_st *)dev_id; in spi_st_irq() local
278 ssc_read_rx_fifo(spi_st); in spi_st_irq()
281 if (spi_st->words_remaining) { in spi_st_irq()
282 ssc_write_tx_fifo(spi_st); in spi_st_irq()
285 writel_relaxed(0x0, spi_st->base + SSC_IEN); in spi_st_irq()
290 readl(spi_st->base + SSC_IEN); in spi_st_irq()
291 complete(&spi_st->done); in spi_st_irq()
301 struct spi_st *spi_st; in spi_st_probe() local
305 master = spi_alloc_master(&pdev->dev, sizeof(*spi_st)); in spi_st_probe()
317 spi_st = spi_master_get_devdata(master); in spi_st_probe()
319 spi_st->clk = devm_clk_get(&pdev->dev, "ssc"); in spi_st_probe()
320 if (IS_ERR(spi_st->clk)) { in spi_st_probe()
322 ret = PTR_ERR(spi_st->clk); in spi_st_probe()
326 ret = clk_prepare_enable(spi_st->clk); in spi_st_probe()
330 init_completion(&spi_st->done); in spi_st_probe()
333 spi_st->base = devm_platform_ioremap_resource(pdev, 0); in spi_st_probe()
334 if (IS_ERR(spi_st->base)) { in spi_st_probe()
335 ret = PTR_ERR(spi_st->base); in spi_st_probe()
340 writel_relaxed(0x0, spi_st->base + SSC_I2C); in spi_st_probe()
341 var = readw_relaxed(spi_st->base + SSC_CTL); in spi_st_probe()
343 writel_relaxed(var, spi_st->base + SSC_CTL); in spi_st_probe()
346 var = readl_relaxed(spi_st->base + SSC_CTL); in spi_st_probe()
348 writel_relaxed(var, spi_st->base + SSC_CTL); in spi_st_probe()
351 var = readl_relaxed(spi_st->base + SSC_CTL); in spi_st_probe()
353 writel_relaxed(var, spi_st->base + SSC_CTL); in spi_st_probe()
363 pdev->name, spi_st); in spi_st_probe()
386 clk_disable_unprepare(spi_st->clk); in spi_st_probe()
395 struct spi_st *spi_st = spi_master_get_devdata(master); in spi_st_remove() local
399 clk_disable_unprepare(spi_st->clk); in spi_st_remove()
410 struct spi_st *spi_st = spi_master_get_devdata(master); in spi_st_runtime_suspend() local
412 writel_relaxed(0, spi_st->base + SSC_IEN); in spi_st_runtime_suspend()
415 clk_disable_unprepare(spi_st->clk); in spi_st_runtime_suspend()
423 struct spi_st *spi_st = spi_master_get_devdata(master); in spi_st_runtime_resume() local
426 ret = clk_prepare_enable(spi_st->clk); in spi_st_runtime_resume()