Lines Matching refs:sspi
95 static inline u32 sun6i_spi_read(struct sun6i_spi *sspi, u32 reg) in sun6i_spi_read() argument
97 return readl(sspi->base_addr + reg); in sun6i_spi_read()
100 static inline void sun6i_spi_write(struct sun6i_spi *sspi, u32 reg, u32 value) in sun6i_spi_write() argument
102 writel(value, sspi->base_addr + reg); in sun6i_spi_write()
105 static inline void sun6i_spi_drain_fifo(struct sun6i_spi *sspi, int len) in sun6i_spi_drain_fifo() argument
111 reg = sun6i_spi_read(sspi, SUN6I_FIFO_STA_REG); in sun6i_spi_drain_fifo()
119 byte = readb(sspi->base_addr + SUN6I_RXDATA_REG); in sun6i_spi_drain_fifo()
120 if (sspi->rx_buf) in sun6i_spi_drain_fifo()
121 *sspi->rx_buf++ = byte; in sun6i_spi_drain_fifo()
125 static inline void sun6i_spi_fill_fifo(struct sun6i_spi *sspi, int len) in sun6i_spi_fill_fifo() argument
129 if (len > sspi->len) in sun6i_spi_fill_fifo()
130 len = sspi->len; in sun6i_spi_fill_fifo()
133 byte = sspi->tx_buf ? *sspi->tx_buf++ : 0; in sun6i_spi_fill_fifo()
134 writeb(byte, sspi->base_addr + SUN6I_TXDATA_REG); in sun6i_spi_fill_fifo()
135 sspi->len--; in sun6i_spi_fill_fifo()
141 struct sun6i_spi *sspi = spi_master_get_devdata(spi->master); in sun6i_spi_set_cs() local
144 reg = sun6i_spi_read(sspi, SUN6I_TFR_CTL_REG); in sun6i_spi_set_cs()
153 sun6i_spi_write(sspi, SUN6I_TFR_CTL_REG, reg); in sun6i_spi_set_cs()
161 struct sun6i_spi *sspi = spi_master_get_devdata(master); in sun6i_spi_transfer_one() local
171 reinit_completion(&sspi->done); in sun6i_spi_transfer_one()
172 sspi->tx_buf = tfr->tx_buf; in sun6i_spi_transfer_one()
173 sspi->rx_buf = tfr->rx_buf; in sun6i_spi_transfer_one()
174 sspi->len = tfr->len; in sun6i_spi_transfer_one()
177 sun6i_spi_write(sspi, SUN6I_INT_STA_REG, ~0); in sun6i_spi_transfer_one()
180 sun6i_spi_write(sspi, SUN6I_FIFO_CTL_REG, in sun6i_spi_transfer_one()
187 reg = sun6i_spi_read(sspi, SUN6I_TFR_CTL_REG); in sun6i_spi_transfer_one()
208 if (sspi->rx_buf) in sun6i_spi_transfer_one()
216 sun6i_spi_write(sspi, SUN6I_TFR_CTL_REG, reg); in sun6i_spi_transfer_one()
219 mclk_rate = clk_get_rate(sspi->mclk); in sun6i_spi_transfer_one()
221 clk_set_rate(sspi->mclk, 2 * spi->max_speed_hz); in sun6i_spi_transfer_one()
222 mclk_rate = clk_get_rate(sspi->mclk); in sun6i_spi_transfer_one()
250 sun6i_spi_write(sspi, SUN6I_CLK_CTL_REG, reg); in sun6i_spi_transfer_one()
253 if (sspi->tx_buf) in sun6i_spi_transfer_one()
257 sun6i_spi_write(sspi, SUN6I_BURST_CNT_REG, SUN6I_BURST_CNT(tfr->len)); in sun6i_spi_transfer_one()
258 sun6i_spi_write(sspi, SUN6I_XMIT_CNT_REG, SUN6I_XMIT_CNT(tx_len)); in sun6i_spi_transfer_one()
259 sun6i_spi_write(sspi, SUN6I_BURST_CTL_CNT_REG, in sun6i_spi_transfer_one()
263 sun6i_spi_fill_fifo(sspi, SUN6I_FIFO_DEPTH); in sun6i_spi_transfer_one()
266 sun6i_spi_write(sspi, SUN6I_INT_CTL_REG, SUN6I_INT_CTL_TC); in sun6i_spi_transfer_one()
269 reg = sun6i_spi_read(sspi, SUN6I_TFR_CTL_REG); in sun6i_spi_transfer_one()
270 sun6i_spi_write(sspi, SUN6I_TFR_CTL_REG, reg | SUN6I_TFR_CTL_XCH); in sun6i_spi_transfer_one()
272 timeout = wait_for_completion_timeout(&sspi->done, in sun6i_spi_transfer_one()
279 sun6i_spi_drain_fifo(sspi, SUN6I_FIFO_DEPTH); in sun6i_spi_transfer_one()
282 sun6i_spi_write(sspi, SUN6I_INT_CTL_REG, 0); in sun6i_spi_transfer_one()
289 struct sun6i_spi *sspi = dev_id; in sun6i_spi_handler() local
290 u32 status = sun6i_spi_read(sspi, SUN6I_INT_STA_REG); in sun6i_spi_handler()
294 sun6i_spi_write(sspi, SUN6I_INT_STA_REG, SUN6I_INT_CTL_TC); in sun6i_spi_handler()
295 complete(&sspi->done); in sun6i_spi_handler()
305 struct sun6i_spi *sspi = spi_master_get_devdata(master); in sun6i_spi_runtime_resume() local
308 ret = clk_prepare_enable(sspi->hclk); in sun6i_spi_runtime_resume()
314 ret = clk_prepare_enable(sspi->mclk); in sun6i_spi_runtime_resume()
320 ret = reset_control_deassert(sspi->rstc); in sun6i_spi_runtime_resume()
326 sun6i_spi_write(sspi, SUN6I_GBL_CTL_REG, in sun6i_spi_runtime_resume()
332 clk_disable_unprepare(sspi->mclk); in sun6i_spi_runtime_resume()
334 clk_disable_unprepare(sspi->hclk); in sun6i_spi_runtime_resume()
342 struct sun6i_spi *sspi = spi_master_get_devdata(master); in sun6i_spi_runtime_suspend() local
344 reset_control_assert(sspi->rstc); in sun6i_spi_runtime_suspend()
345 clk_disable_unprepare(sspi->mclk); in sun6i_spi_runtime_suspend()
346 clk_disable_unprepare(sspi->hclk); in sun6i_spi_runtime_suspend()
354 struct sun6i_spi *sspi; in sun6i_spi_probe() local
365 sspi = spi_master_get_devdata(master); in sun6i_spi_probe()
368 sspi->base_addr = devm_ioremap_resource(&pdev->dev, res); in sun6i_spi_probe()
369 if (IS_ERR(sspi->base_addr)) { in sun6i_spi_probe()
370 ret = PTR_ERR(sspi->base_addr); in sun6i_spi_probe()
382 0, "sun6i-spi", sspi); in sun6i_spi_probe()
388 sspi->master = master; in sun6i_spi_probe()
397 sspi->hclk = devm_clk_get(&pdev->dev, "ahb"); in sun6i_spi_probe()
398 if (IS_ERR(sspi->hclk)) { in sun6i_spi_probe()
400 ret = PTR_ERR(sspi->hclk); in sun6i_spi_probe()
404 sspi->mclk = devm_clk_get(&pdev->dev, "mod"); in sun6i_spi_probe()
405 if (IS_ERR(sspi->mclk)) { in sun6i_spi_probe()
407 ret = PTR_ERR(sspi->mclk); in sun6i_spi_probe()
411 init_completion(&sspi->done); in sun6i_spi_probe()
413 sspi->rstc = devm_reset_control_get(&pdev->dev, NULL); in sun6i_spi_probe()
414 if (IS_ERR(sspi->rstc)) { in sun6i_spi_probe()
416 ret = PTR_ERR(sspi->rstc); in sun6i_spi_probe()