Lines Matching refs:sspi

89 static inline u32 sun4i_spi_read(struct sun4i_spi *sspi, u32 reg)  in sun4i_spi_read()  argument
91 return readl(sspi->base_addr + reg); in sun4i_spi_read()
94 static inline void sun4i_spi_write(struct sun4i_spi *sspi, u32 reg, u32 value) in sun4i_spi_write() argument
96 writel(value, sspi->base_addr + reg); in sun4i_spi_write()
99 static inline void sun4i_spi_drain_fifo(struct sun4i_spi *sspi, int len) in sun4i_spi_drain_fifo() argument
105 reg = sun4i_spi_read(sspi, SUN4I_FIFO_STA_REG); in sun4i_spi_drain_fifo()
113 byte = readb(sspi->base_addr + SUN4I_RXDATA_REG); in sun4i_spi_drain_fifo()
114 if (sspi->rx_buf) in sun4i_spi_drain_fifo()
115 *sspi->rx_buf++ = byte; in sun4i_spi_drain_fifo()
119 static inline void sun4i_spi_fill_fifo(struct sun4i_spi *sspi, int len) in sun4i_spi_fill_fifo() argument
123 if (len > sspi->len) in sun4i_spi_fill_fifo()
124 len = sspi->len; in sun4i_spi_fill_fifo()
127 byte = sspi->tx_buf ? *sspi->tx_buf++ : 0; in sun4i_spi_fill_fifo()
128 writeb(byte, sspi->base_addr + SUN4I_TXDATA_REG); in sun4i_spi_fill_fifo()
129 sspi->len--; in sun4i_spi_fill_fifo()
135 struct sun4i_spi *sspi = spi_master_get_devdata(spi->master); in sun4i_spi_set_cs() local
138 reg = sun4i_spi_read(sspi, SUN4I_CTL_REG); in sun4i_spi_set_cs()
164 sun4i_spi_write(sspi, SUN4I_CTL_REG, reg); in sun4i_spi_set_cs()
171 struct sun4i_spi *sspi = spi_master_get_devdata(master); in sun4i_spi_transfer_one() local
181 reinit_completion(&sspi->done); in sun4i_spi_transfer_one()
182 sspi->tx_buf = tfr->tx_buf; in sun4i_spi_transfer_one()
183 sspi->rx_buf = tfr->rx_buf; in sun4i_spi_transfer_one()
184 sspi->len = tfr->len; in sun4i_spi_transfer_one()
187 sun4i_spi_write(sspi, SUN4I_INT_STA_REG, ~0); in sun4i_spi_transfer_one()
190 reg = sun4i_spi_read(sspi, SUN4I_CTL_REG); in sun4i_spi_transfer_one()
193 sun4i_spi_write(sspi, SUN4I_CTL_REG, in sun4i_spi_transfer_one()
220 if (sspi->rx_buf) in sun4i_spi_transfer_one()
228 sun4i_spi_write(sspi, SUN4I_CTL_REG, reg); in sun4i_spi_transfer_one()
231 mclk_rate = clk_get_rate(sspi->mclk); in sun4i_spi_transfer_one()
233 clk_set_rate(sspi->mclk, 2 * spi->max_speed_hz); in sun4i_spi_transfer_one()
234 mclk_rate = clk_get_rate(sspi->mclk); in sun4i_spi_transfer_one()
262 sun4i_spi_write(sspi, SUN4I_CLK_CTL_REG, reg); in sun4i_spi_transfer_one()
265 if (sspi->tx_buf) in sun4i_spi_transfer_one()
269 sun4i_spi_write(sspi, SUN4I_BURST_CNT_REG, SUN4I_BURST_CNT(tfr->len)); in sun4i_spi_transfer_one()
270 sun4i_spi_write(sspi, SUN4I_XMIT_CNT_REG, SUN4I_XMIT_CNT(tx_len)); in sun4i_spi_transfer_one()
273 sun4i_spi_fill_fifo(sspi, SUN4I_FIFO_DEPTH); in sun4i_spi_transfer_one()
276 sun4i_spi_write(sspi, SUN4I_INT_CTL_REG, SUN4I_INT_CTL_TC); in sun4i_spi_transfer_one()
279 reg = sun4i_spi_read(sspi, SUN4I_CTL_REG); in sun4i_spi_transfer_one()
280 sun4i_spi_write(sspi, SUN4I_CTL_REG, reg | SUN4I_CTL_XCH); in sun4i_spi_transfer_one()
282 timeout = wait_for_completion_timeout(&sspi->done, in sun4i_spi_transfer_one()
289 sun4i_spi_drain_fifo(sspi, SUN4I_FIFO_DEPTH); in sun4i_spi_transfer_one()
292 sun4i_spi_write(sspi, SUN4I_INT_CTL_REG, 0); in sun4i_spi_transfer_one()
299 struct sun4i_spi *sspi = dev_id; in sun4i_spi_handler() local
300 u32 status = sun4i_spi_read(sspi, SUN4I_INT_STA_REG); in sun4i_spi_handler()
304 sun4i_spi_write(sspi, SUN4I_INT_STA_REG, SUN4I_INT_CTL_TC); in sun4i_spi_handler()
305 complete(&sspi->done); in sun4i_spi_handler()
315 struct sun4i_spi *sspi = spi_master_get_devdata(master); in sun4i_spi_runtime_resume() local
318 ret = clk_prepare_enable(sspi->hclk); in sun4i_spi_runtime_resume()
324 ret = clk_prepare_enable(sspi->mclk); in sun4i_spi_runtime_resume()
330 sun4i_spi_write(sspi, SUN4I_CTL_REG, in sun4i_spi_runtime_resume()
336 clk_disable_unprepare(sspi->hclk); in sun4i_spi_runtime_resume()
344 struct sun4i_spi *sspi = spi_master_get_devdata(master); in sun4i_spi_runtime_suspend() local
346 clk_disable_unprepare(sspi->mclk); in sun4i_spi_runtime_suspend()
347 clk_disable_unprepare(sspi->hclk); in sun4i_spi_runtime_suspend()
355 struct sun4i_spi *sspi; in sun4i_spi_probe() local
366 sspi = spi_master_get_devdata(master); in sun4i_spi_probe()
369 sspi->base_addr = devm_ioremap_resource(&pdev->dev, res); in sun4i_spi_probe()
370 if (IS_ERR(sspi->base_addr)) { in sun4i_spi_probe()
371 ret = PTR_ERR(sspi->base_addr); in sun4i_spi_probe()
383 0, "sun4i-spi", sspi); in sun4i_spi_probe()
389 sspi->master = master; in sun4i_spi_probe()
398 sspi->hclk = devm_clk_get(&pdev->dev, "ahb"); in sun4i_spi_probe()
399 if (IS_ERR(sspi->hclk)) { in sun4i_spi_probe()
401 ret = PTR_ERR(sspi->hclk); in sun4i_spi_probe()
405 sspi->mclk = devm_clk_get(&pdev->dev, "mod"); in sun4i_spi_probe()
406 if (IS_ERR(sspi->mclk)) { in sun4i_spi_probe()
408 ret = PTR_ERR(sspi->mclk); in sun4i_spi_probe()
412 init_completion(&sspi->done); in sun4i_spi_probe()