Lines Matching refs:priv
116 static inline u32 dw_read(struct dw_spi_priv *priv, u32 offset) in dw_read() argument
118 return __raw_readl(priv->regs + offset); in dw_read()
121 static inline void dw_write(struct dw_spi_priv *priv, u32 offset, u32 val) in dw_write() argument
123 __raw_writel(val, priv->regs + offset); in dw_write()
129 struct dw_spi_priv *priv = dev_get_priv(bus); in request_gpio_cs() local
133 ret = gpio_request_by_name(bus, "cs-gpio", 0, &priv->cs_gpio, 0); in request_gpio_cs()
142 if (dm_gpio_is_valid(&priv->cs_gpio)) { in request_gpio_cs()
143 dm_gpio_set_dir_flags(&priv->cs_gpio, in request_gpio_cs()
169 static inline void spi_enable_chip(struct dw_spi_priv *priv, int enable) in spi_enable_chip() argument
171 dw_write(priv, DW_SPI_SSIENR, (enable ? 1 : 0)); in spi_enable_chip()
175 static void spi_hw_init(struct dw_spi_priv *priv) in spi_hw_init() argument
177 spi_enable_chip(priv, 0); in spi_hw_init()
178 dw_write(priv, DW_SPI_IMR, 0xff); in spi_hw_init()
179 spi_enable_chip(priv, 1); in spi_hw_init()
185 if (!priv->fifo_len) { in spi_hw_init()
189 dw_write(priv, DW_SPI_TXFLTR, fifo); in spi_hw_init()
190 if (fifo != dw_read(priv, DW_SPI_TXFLTR)) in spi_hw_init()
194 priv->fifo_len = (fifo == 1) ? 0 : fifo; in spi_hw_init()
195 dw_write(priv, DW_SPI_TXFLTR, 0); in spi_hw_init()
197 debug("%s: fifo_len=%d\n", __func__, priv->fifo_len); in spi_hw_init()
207 struct dw_spi_priv *priv = dev_get_priv(bus); in dw_spi_get_clk() local
210 ret = clk_get_by_index(bus, 0, &priv->clk); in dw_spi_get_clk()
214 ret = clk_enable(&priv->clk); in dw_spi_get_clk()
218 *rate = clk_get_rate(&priv->clk); in dw_spi_get_clk()
228 clk_disable(&priv->clk); in dw_spi_get_clk()
229 clk_free(&priv->clk); in dw_spi_get_clk()
237 struct dw_spi_priv *priv = dev_get_priv(bus); in dw_spi_probe() local
240 priv->regs = plat->regs; in dw_spi_probe()
241 priv->freq = plat->frequency; in dw_spi_probe()
243 ret = dw_spi_get_clk(bus, &priv->bus_clk_rate); in dw_spi_probe()
248 priv->bits_per_word = 8; in dw_spi_probe()
250 priv->tmode = 0; /* Tx & Rx */ in dw_spi_probe()
253 spi_hw_init(priv); in dw_spi_probe()
259 static inline u32 tx_max(struct dw_spi_priv *priv) in tx_max() argument
263 tx_left = (priv->tx_end - priv->tx) / (priv->bits_per_word >> 3); in tx_max()
264 tx_room = priv->fifo_len - dw_read(priv, DW_SPI_TXFLR); in tx_max()
274 rxtx_gap = ((priv->rx_end - priv->rx) - (priv->tx_end - priv->tx)) / in tx_max()
275 (priv->bits_per_word >> 3); in tx_max()
277 return min3(tx_left, tx_room, (u32)(priv->fifo_len - rxtx_gap)); in tx_max()
281 static inline u32 rx_max(struct dw_spi_priv *priv) in rx_max() argument
283 u32 rx_left = (priv->rx_end - priv->rx) / (priv->bits_per_word >> 3); in rx_max()
285 return min_t(u32, rx_left, dw_read(priv, DW_SPI_RXFLR)); in rx_max()
288 static void dw_writer(struct dw_spi_priv *priv) in dw_writer() argument
290 u32 max = tx_max(priv); in dw_writer()
295 if (priv->tx_end - priv->len) { in dw_writer()
296 if (priv->bits_per_word == 8) in dw_writer()
297 txw = *(u8 *)(priv->tx); in dw_writer()
299 txw = *(u16 *)(priv->tx); in dw_writer()
301 dw_write(priv, DW_SPI_DR, txw); in dw_writer()
303 priv->tx += priv->bits_per_word >> 3; in dw_writer()
307 static void dw_reader(struct dw_spi_priv *priv) in dw_reader() argument
309 u32 max = rx_max(priv); in dw_reader()
313 rxw = dw_read(priv, DW_SPI_DR); in dw_reader()
317 if (priv->rx_end - priv->len) { in dw_reader()
318 if (priv->bits_per_word == 8) in dw_reader()
319 *(u8 *)(priv->rx) = rxw; in dw_reader()
321 *(u16 *)(priv->rx) = rxw; in dw_reader()
323 priv->rx += priv->bits_per_word >> 3; in dw_reader()
327 static int poll_transfer(struct dw_spi_priv *priv) in poll_transfer() argument
330 dw_writer(priv); in poll_transfer()
331 dw_reader(priv); in poll_transfer()
332 } while (priv->rx_end > priv->rx); in poll_transfer()
340 struct dw_spi_priv *priv = dev_get_priv(dev->parent); in external_cs_manage() local
342 if (!dm_gpio_is_valid(&priv->cs_gpio)) in external_cs_manage()
345 dm_gpio_set_value(&priv->cs_gpio, on ? 1 : 0); in external_cs_manage()
353 struct dw_spi_priv *priv = dev_get_priv(bus); in dw_spi_xfer() local
371 cr0 = (priv->bits_per_word - 1) | (priv->type << SPI_FRF_OFFSET) | in dw_spi_xfer()
372 (priv->mode << SPI_MODE_OFFSET) | in dw_spi_xfer()
373 (priv->tmode << SPI_TMOD_OFFSET); in dw_spi_xfer()
376 priv->tmode = SPI_TMOD_TR; in dw_spi_xfer()
378 priv->tmode = SPI_TMOD_RO; in dw_spi_xfer()
384 priv->tmode = SPI_TMOD_TR; in dw_spi_xfer()
387 cr0 |= (priv->tmode << SPI_TMOD_OFFSET); in dw_spi_xfer()
389 priv->len = bitlen >> 3; in dw_spi_xfer()
390 debug("%s: rx=%p tx=%p len=%d [bytes]\n", __func__, rx, tx, priv->len); in dw_spi_xfer()
392 priv->tx = (void *)tx; in dw_spi_xfer()
393 priv->tx_end = priv->tx + priv->len; in dw_spi_xfer()
394 priv->rx = rx; in dw_spi_xfer()
395 priv->rx_end = priv->rx + priv->len; in dw_spi_xfer()
398 spi_enable_chip(priv, 0); in dw_spi_xfer()
402 if (dw_read(priv, DW_SPI_CTRL0) != cr0) in dw_spi_xfer()
403 dw_write(priv, DW_SPI_CTRL0, cr0); in dw_spi_xfer()
411 dw_write(priv, DW_SPI_SER, 1 << cs); in dw_spi_xfer()
414 spi_enable_chip(priv, 1); in dw_spi_xfer()
417 ret = poll_transfer(priv); in dw_spi_xfer()
426 if (readl_poll_timeout(priv->regs + DW_SPI_SR, val, in dw_spi_xfer()
442 struct dw_spi_priv *priv = dev_get_priv(bus); in dw_spi_set_speed() local
449 spi_enable_chip(priv, 0); in dw_spi_set_speed()
452 clk_div = priv->bus_clk_rate / speed; in dw_spi_set_speed()
454 dw_write(priv, DW_SPI_BAUDR, clk_div); in dw_spi_set_speed()
457 spi_enable_chip(priv, 1); in dw_spi_set_speed()
459 priv->freq = speed; in dw_spi_set_speed()
460 debug("%s: regs=%p speed=%d clk_div=%d\n", __func__, priv->regs, in dw_spi_set_speed()
461 priv->freq, clk_div); in dw_spi_set_speed()
468 struct dw_spi_priv *priv = dev_get_priv(bus); in dw_spi_set_mode() local
475 priv->mode = mode; in dw_spi_set_mode()
476 debug("%s: regs=%p, mode=%d\n", __func__, priv->regs, priv->mode); in dw_spi_set_mode()