Lines Matching refs:spi_st
56 struct spi_st { struct
71 static int spi_st_clk_enable(struct spi_st *spi_st) in spi_st_clk_enable() argument
81 return clk_prepare_enable(spi_st->clk); in spi_st_clk_enable()
84 static void spi_st_clk_disable(struct spi_st *spi_st) in spi_st_clk_disable() argument
94 clk_disable_unprepare(spi_st->clk); in spi_st_clk_disable()
98 static void ssc_write_tx_fifo(struct spi_st *spi_st) in ssc_write_tx_fifo() argument
103 if (spi_st->words_remaining > FIFO_SIZE) in ssc_write_tx_fifo()
106 count = spi_st->words_remaining; in ssc_write_tx_fifo()
109 if (spi_st->tx_ptr) { in ssc_write_tx_fifo()
110 if (spi_st->bytes_per_word == 1) { in ssc_write_tx_fifo()
111 word = *spi_st->tx_ptr++; in ssc_write_tx_fifo()
113 word = *spi_st->tx_ptr++; in ssc_write_tx_fifo()
114 word = *spi_st->tx_ptr++ | (word << 8); in ssc_write_tx_fifo()
117 writel_relaxed(word, spi_st->base + SSC_TBUF); in ssc_write_tx_fifo()
122 static void ssc_read_rx_fifo(struct spi_st *spi_st) in ssc_read_rx_fifo() argument
127 if (spi_st->words_remaining > FIFO_SIZE) in ssc_read_rx_fifo()
130 count = spi_st->words_remaining; in ssc_read_rx_fifo()
133 word = readl_relaxed(spi_st->base + SSC_RBUF); in ssc_read_rx_fifo()
135 if (spi_st->rx_ptr) { in ssc_read_rx_fifo()
136 if (spi_st->bytes_per_word == 1) { in ssc_read_rx_fifo()
137 *spi_st->rx_ptr++ = (uint8_t)word; in ssc_read_rx_fifo()
139 *spi_st->rx_ptr++ = (word >> 8); in ssc_read_rx_fifo()
140 *spi_st->rx_ptr++ = word & 0xff; in ssc_read_rx_fifo()
144 spi_st->words_remaining -= count; in ssc_read_rx_fifo()
150 struct spi_st *spi_st = spi_master_get_devdata(master); in spi_st_transfer_one() local
154 spi_st->tx_ptr = t->tx_buf; in spi_st_transfer_one()
155 spi_st->rx_ptr = t->rx_buf; in spi_st_transfer_one()
162 spi_st->bytes_per_word = 2; in spi_st_transfer_one()
163 spi_st->words_remaining = t->len / 2; in spi_st_transfer_one()
170 spi_st->bytes_per_word = 2; in spi_st_transfer_one()
171 spi_st->words_remaining = t->len / 2; in spi_st_transfer_one()
174 ctl = readl_relaxed(spi_st->base + SSC_CTL); in spi_st_transfer_one()
175 writel_relaxed((ctl | 0xf), spi_st->base + SSC_CTL); in spi_st_transfer_one()
177 readl_relaxed(spi_st->base + SSC_RBUF); in spi_st_transfer_one()
180 spi_st->bytes_per_word = 1; in spi_st_transfer_one()
181 spi_st->words_remaining = t->len; in spi_st_transfer_one()
184 reinit_completion(&spi_st->done); in spi_st_transfer_one()
187 ssc_write_tx_fifo(spi_st); in spi_st_transfer_one()
188 writel_relaxed(SSC_IEN_TEEN, spi_st->base + SSC_IEN); in spi_st_transfer_one()
191 wait_for_completion(&spi_st->done); in spi_st_transfer_one()
195 writel_relaxed(ctl, spi_st->base + SSC_CTL); in spi_st_transfer_one()
214 struct spi_st *spi_st = spi_master_get_devdata(spi->master); in spi_st_setup() local
239 spi_st_clk = clk_get_rate(spi_st->clk); in spi_st_setup()
249 spi_st->baud = spi_st_clk / (2 * sscbrg); in spi_st_setup()
253 writel_relaxed(sscbrg, spi_st->base + SSC_BRG); in spi_st_setup()
257 hz, spi_st->baud, sscbrg); in spi_st_setup()
260 var = readl_relaxed(spi_st->base + SSC_CTL); in spi_st_setup()
289 writel_relaxed(var, spi_st->base + SSC_CTL); in spi_st_setup()
292 readl_relaxed(spi_st->base + SSC_RBUF); in spi_st_setup()
300 struct spi_st *spi_st = (struct spi_st *)dev_id; in spi_st_irq() local
303 ssc_read_rx_fifo(spi_st); in spi_st_irq()
306 if (spi_st->words_remaining) { in spi_st_irq()
307 ssc_write_tx_fifo(spi_st); in spi_st_irq()
310 writel_relaxed(0x0, spi_st->base + SSC_IEN); in spi_st_irq()
315 readl(spi_st->base + SSC_IEN); in spi_st_irq()
316 complete(&spi_st->done); in spi_st_irq()
327 struct spi_st *spi_st; in spi_st_probe() local
331 master = spi_alloc_master(&pdev->dev, sizeof(*spi_st)); in spi_st_probe()
343 spi_st = spi_master_get_devdata(master); in spi_st_probe()
345 spi_st->clk = devm_clk_get(&pdev->dev, "ssc"); in spi_st_probe()
346 if (IS_ERR(spi_st->clk)) { in spi_st_probe()
348 return PTR_ERR(spi_st->clk); in spi_st_probe()
351 ret = spi_st_clk_enable(spi_st); in spi_st_probe()
355 init_completion(&spi_st->done); in spi_st_probe()
359 spi_st->base = devm_ioremap_resource(&pdev->dev, res); in spi_st_probe()
360 if (IS_ERR(spi_st->base)) { in spi_st_probe()
361 ret = PTR_ERR(spi_st->base); in spi_st_probe()
366 writel_relaxed(0x0, spi_st->base + SSC_I2C); in spi_st_probe()
367 var = readw_relaxed(spi_st->base + SSC_CTL); in spi_st_probe()
369 writel_relaxed(var, spi_st->base + SSC_CTL); in spi_st_probe()
372 var = readl_relaxed(spi_st->base + SSC_CTL); in spi_st_probe()
374 writel_relaxed(var, spi_st->base + SSC_CTL); in spi_st_probe()
377 var = readl_relaxed(spi_st->base + SSC_CTL); in spi_st_probe()
379 writel_relaxed(var, spi_st->base + SSC_CTL); in spi_st_probe()
389 pdev->name, spi_st); in spi_st_probe()
410 spi_st_clk_disable(spi_st); in spi_st_probe()
418 struct spi_st *spi_st = spi_master_get_devdata(master); in spi_st_remove() local
420 spi_st_clk_disable(spi_st); in spi_st_remove()
431 struct spi_st *spi_st = spi_master_get_devdata(master); in spi_st_runtime_suspend() local
433 writel_relaxed(0, spi_st->base + SSC_IEN); in spi_st_runtime_suspend()
436 spi_st_clk_disable(spi_st); in spi_st_runtime_suspend()
444 struct spi_st *spi_st = spi_master_get_devdata(master); in spi_st_runtime_resume() local
447 ret = spi_st_clk_enable(spi_st); in spi_st_runtime_resume()