Lines Matching refs:priv

117 static inline u32 dw_read(struct dw_spi_priv *priv, u32 offset)  in dw_read()  argument
119 return __raw_readl(priv->regs + offset); in dw_read()
122 static inline void dw_write(struct dw_spi_priv *priv, u32 offset, u32 val) in dw_write() argument
124 __raw_writel(val, priv->regs + offset); in dw_write()
130 struct dw_spi_priv *priv = dev_get_priv(bus); in request_gpio_cs() local
134 ret = gpio_request_by_name(bus, "cs-gpio", 0, &priv->cs_gpio, 0); in request_gpio_cs()
143 if (dm_gpio_is_valid(&priv->cs_gpio)) { in request_gpio_cs()
144 dm_gpio_set_dir_flags(&priv->cs_gpio, in request_gpio_cs()
170 static inline void spi_enable_chip(struct dw_spi_priv *priv, int enable) in spi_enable_chip() argument
172 dw_write(priv, DW_SPI_SSIENR, (enable ? 1 : 0)); in spi_enable_chip()
176 static void spi_hw_init(struct dw_spi_priv *priv) in spi_hw_init() argument
178 spi_enable_chip(priv, 0); in spi_hw_init()
179 dw_write(priv, DW_SPI_IMR, 0xff); in spi_hw_init()
180 spi_enable_chip(priv, 1); in spi_hw_init()
186 if (!priv->fifo_len) { in spi_hw_init()
190 dw_write(priv, DW_SPI_TXFLTR, fifo); in spi_hw_init()
191 if (fifo != dw_read(priv, DW_SPI_TXFLTR)) in spi_hw_init()
195 priv->fifo_len = (fifo == 1) ? 0 : fifo; in spi_hw_init()
196 dw_write(priv, DW_SPI_TXFLTR, 0); in spi_hw_init()
198 debug("%s: fifo_len=%d\n", __func__, priv->fifo_len); in spi_hw_init()
208 struct dw_spi_priv *priv = dev_get_priv(bus); in dw_spi_get_clk() local
211 ret = clk_get_by_index(bus, 0, &priv->clk); in dw_spi_get_clk()
215 ret = clk_enable(&priv->clk); in dw_spi_get_clk()
219 *rate = clk_get_rate(&priv->clk); in dw_spi_get_clk()
229 clk_disable(&priv->clk); in dw_spi_get_clk()
230 clk_free(&priv->clk); in dw_spi_get_clk()
238 struct dw_spi_priv *priv = dev_get_priv(bus); in dw_spi_probe() local
241 priv->regs = plat->regs; in dw_spi_probe()
242 priv->freq = plat->frequency; in dw_spi_probe()
244 ret = dw_spi_get_clk(bus, &priv->bus_clk_rate); in dw_spi_probe()
249 priv->bits_per_word = 8; in dw_spi_probe()
251 priv->tmode = 0; /* Tx & Rx */ in dw_spi_probe()
254 spi_hw_init(priv); in dw_spi_probe()
260 static inline u32 tx_max(struct dw_spi_priv *priv) in tx_max() argument
264 tx_left = (priv->tx_end - priv->tx) / (priv->bits_per_word >> 3); in tx_max()
265 tx_room = priv->fifo_len - dw_read(priv, DW_SPI_TXFLR); in tx_max()
275 rxtx_gap = ((priv->rx_end - priv->rx) - (priv->tx_end - priv->tx)) / in tx_max()
276 (priv->bits_per_word >> 3); in tx_max()
278 return min3(tx_left, tx_room, (u32)(priv->fifo_len - rxtx_gap)); in tx_max()
282 static inline u32 rx_max(struct dw_spi_priv *priv) in rx_max() argument
284 u32 rx_left = (priv->rx_end - priv->rx) / (priv->bits_per_word >> 3); in rx_max()
286 return min_t(u32, rx_left, dw_read(priv, DW_SPI_RXFLR)); in rx_max()
289 static void dw_writer(struct dw_spi_priv *priv) in dw_writer() argument
291 u32 max = tx_max(priv); in dw_writer()
296 if (priv->tx_end - priv->len) { in dw_writer()
297 if (priv->bits_per_word == 8) in dw_writer()
298 txw = *(u8 *)(priv->tx); in dw_writer()
300 txw = *(u16 *)(priv->tx); in dw_writer()
302 dw_write(priv, DW_SPI_DR, txw); in dw_writer()
304 priv->tx += priv->bits_per_word >> 3; in dw_writer()
308 static void dw_reader(struct dw_spi_priv *priv) in dw_reader() argument
310 u32 max = rx_max(priv); in dw_reader()
314 rxw = dw_read(priv, DW_SPI_DR); in dw_reader()
318 if (priv->rx_end - priv->len) { in dw_reader()
319 if (priv->bits_per_word == 8) in dw_reader()
320 *(u8 *)(priv->rx) = rxw; in dw_reader()
322 *(u16 *)(priv->rx) = rxw; in dw_reader()
324 priv->rx += priv->bits_per_word >> 3; in dw_reader()
328 static int poll_transfer(struct dw_spi_priv *priv) in poll_transfer() argument
331 dw_writer(priv); in poll_transfer()
332 dw_reader(priv); in poll_transfer()
333 } while (priv->rx_end > priv->rx); in poll_transfer()
341 struct dw_spi_priv *priv = dev_get_priv(dev->parent); in external_cs_manage() local
343 if (!dm_gpio_is_valid(&priv->cs_gpio)) in external_cs_manage()
346 dm_gpio_set_value(&priv->cs_gpio, on ? 1 : 0); in external_cs_manage()
354 struct dw_spi_priv *priv = dev_get_priv(bus); in dw_spi_xfer() local
372 cr0 = (priv->bits_per_word - 1) | (priv->type << SPI_FRF_OFFSET) | in dw_spi_xfer()
373 (priv->mode << SPI_MODE_OFFSET) | in dw_spi_xfer()
374 (priv->tmode << SPI_TMOD_OFFSET); in dw_spi_xfer()
377 priv->tmode = SPI_TMOD_TR; in dw_spi_xfer()
379 priv->tmode = SPI_TMOD_RO; in dw_spi_xfer()
385 priv->tmode = SPI_TMOD_TR; in dw_spi_xfer()
388 cr0 |= (priv->tmode << SPI_TMOD_OFFSET); in dw_spi_xfer()
390 priv->len = bitlen >> 3; in dw_spi_xfer()
391 debug("%s: rx=%p tx=%p len=%d [bytes]\n", __func__, rx, tx, priv->len); in dw_spi_xfer()
393 priv->tx = (void *)tx; in dw_spi_xfer()
394 priv->tx_end = priv->tx + priv->len; in dw_spi_xfer()
395 priv->rx = rx; in dw_spi_xfer()
396 priv->rx_end = priv->rx + priv->len; in dw_spi_xfer()
399 spi_enable_chip(priv, 0); in dw_spi_xfer()
403 if (dw_read(priv, DW_SPI_CTRL0) != cr0) in dw_spi_xfer()
404 dw_write(priv, DW_SPI_CTRL0, cr0); in dw_spi_xfer()
412 dw_write(priv, DW_SPI_SER, 1 << cs); in dw_spi_xfer()
415 spi_enable_chip(priv, 1); in dw_spi_xfer()
418 ret = poll_transfer(priv); in dw_spi_xfer()
427 if (readl_poll_timeout(priv->regs + DW_SPI_SR, val, in dw_spi_xfer()
443 struct dw_spi_priv *priv = dev_get_priv(bus); in dw_spi_set_speed() local
450 spi_enable_chip(priv, 0); in dw_spi_set_speed()
453 clk_div = priv->bus_clk_rate / speed; in dw_spi_set_speed()
455 dw_write(priv, DW_SPI_BAUDR, clk_div); in dw_spi_set_speed()
458 spi_enable_chip(priv, 1); in dw_spi_set_speed()
460 priv->freq = speed; in dw_spi_set_speed()
461 debug("%s: regs=%p speed=%d clk_div=%d\n", __func__, priv->regs, in dw_spi_set_speed()
462 priv->freq, clk_div); in dw_spi_set_speed()
469 struct dw_spi_priv *priv = dev_get_priv(bus); in dw_spi_set_mode() local
476 priv->mode = mode; in dw_spi_set_mode()
477 debug("%s: regs=%p, mode=%d\n", __func__, priv->regs, priv->mode); in dw_spi_set_mode()