• Home
  • Raw
  • Download

Lines Matching refs:dws

39 	struct dw_spi *dws = file->private_data;  in dw_spi_show_regs()  local
49 "%s registers:\n", dev_name(&dws->master->dev)); in dw_spi_show_regs()
53 "CTRL0: \t\t0x%08x\n", dw_readl(dws, DW_SPI_CTRL0)); in dw_spi_show_regs()
55 "CTRL1: \t\t0x%08x\n", dw_readl(dws, DW_SPI_CTRL1)); in dw_spi_show_regs()
57 "SSIENR: \t0x%08x\n", dw_readl(dws, DW_SPI_SSIENR)); in dw_spi_show_regs()
59 "SER: \t\t0x%08x\n", dw_readl(dws, DW_SPI_SER)); in dw_spi_show_regs()
61 "BAUDR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_BAUDR)); in dw_spi_show_regs()
63 "TXFTLR: \t0x%08x\n", dw_readl(dws, DW_SPI_TXFLTR)); in dw_spi_show_regs()
65 "RXFTLR: \t0x%08x\n", dw_readl(dws, DW_SPI_RXFLTR)); in dw_spi_show_regs()
67 "TXFLR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_TXFLR)); in dw_spi_show_regs()
69 "RXFLR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_RXFLR)); in dw_spi_show_regs()
71 "SR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_SR)); in dw_spi_show_regs()
73 "IMR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_IMR)); in dw_spi_show_regs()
75 "ISR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_ISR)); in dw_spi_show_regs()
77 "DMACR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_DMACR)); in dw_spi_show_regs()
79 "DMATDLR: \t0x%08x\n", dw_readl(dws, DW_SPI_DMATDLR)); in dw_spi_show_regs()
81 "DMARDLR: \t0x%08x\n", dw_readl(dws, DW_SPI_DMARDLR)); in dw_spi_show_regs()
97 static int dw_spi_debugfs_init(struct dw_spi *dws) in dw_spi_debugfs_init() argument
101 snprintf(name, 32, "dw_spi%d", dws->master->bus_num); in dw_spi_debugfs_init()
102 dws->debugfs = debugfs_create_dir(name, NULL); in dw_spi_debugfs_init()
103 if (!dws->debugfs) in dw_spi_debugfs_init()
107 dws->debugfs, (void *)dws, &dw_spi_regs_ops); in dw_spi_debugfs_init()
111 static void dw_spi_debugfs_remove(struct dw_spi *dws) in dw_spi_debugfs_remove() argument
113 debugfs_remove_recursive(dws->debugfs); in dw_spi_debugfs_remove()
117 static inline int dw_spi_debugfs_init(struct dw_spi *dws) in dw_spi_debugfs_init() argument
122 static inline void dw_spi_debugfs_remove(struct dw_spi *dws) in dw_spi_debugfs_remove() argument
129 struct dw_spi *dws = spi_controller_get_devdata(spi->controller); in dw_spi_set_cs() local
137 dw_writel(dws, DW_SPI_SER, BIT(spi->chip_select)); in dw_spi_set_cs()
138 else if (dws->cs_override) in dw_spi_set_cs()
139 dw_writel(dws, DW_SPI_SER, 0); in dw_spi_set_cs()
144 static inline u32 tx_max(struct dw_spi *dws) in tx_max() argument
148 tx_left = (dws->tx_end - dws->tx) / dws->n_bytes; in tx_max()
149 tx_room = dws->fifo_len - dw_readl(dws, DW_SPI_TXFLR); in tx_max()
159 rxtx_gap = ((dws->rx_end - dws->rx) - (dws->tx_end - dws->tx)) in tx_max()
160 / dws->n_bytes; in tx_max()
162 return min3(tx_left, tx_room, (u32) (dws->fifo_len - rxtx_gap)); in tx_max()
166 static inline u32 rx_max(struct dw_spi *dws) in rx_max() argument
168 u32 rx_left = (dws->rx_end - dws->rx) / dws->n_bytes; in rx_max()
170 return min_t(u32, rx_left, dw_readl(dws, DW_SPI_RXFLR)); in rx_max()
173 static void dw_writer(struct dw_spi *dws) in dw_writer() argument
178 spin_lock(&dws->buf_lock); in dw_writer()
179 max = tx_max(dws); in dw_writer()
182 if (dws->tx_end - dws->len) { in dw_writer()
183 if (dws->n_bytes == 1) in dw_writer()
184 txw = *(u8 *)(dws->tx); in dw_writer()
186 txw = *(u16 *)(dws->tx); in dw_writer()
188 dw_write_io_reg(dws, DW_SPI_DR, txw); in dw_writer()
189 dws->tx += dws->n_bytes; in dw_writer()
191 spin_unlock(&dws->buf_lock); in dw_writer()
194 static void dw_reader(struct dw_spi *dws) in dw_reader() argument
199 spin_lock(&dws->buf_lock); in dw_reader()
200 max = rx_max(dws); in dw_reader()
202 rxw = dw_read_io_reg(dws, DW_SPI_DR); in dw_reader()
204 if (dws->rx_end - dws->len) { in dw_reader()
205 if (dws->n_bytes == 1) in dw_reader()
206 *(u8 *)(dws->rx) = rxw; in dw_reader()
208 *(u16 *)(dws->rx) = rxw; in dw_reader()
210 dws->rx += dws->n_bytes; in dw_reader()
212 spin_unlock(&dws->buf_lock); in dw_reader()
215 static void int_error_stop(struct dw_spi *dws, const char *msg) in int_error_stop() argument
217 spi_reset_chip(dws); in int_error_stop()
219 dev_err(&dws->master->dev, "%s\n", msg); in int_error_stop()
220 dws->master->cur_msg->status = -EIO; in int_error_stop()
221 spi_finalize_current_transfer(dws->master); in int_error_stop()
224 static irqreturn_t interrupt_transfer(struct dw_spi *dws) in interrupt_transfer() argument
226 u16 irq_status = dw_readl(dws, DW_SPI_ISR); in interrupt_transfer()
230 dw_readl(dws, DW_SPI_ICR); in interrupt_transfer()
231 int_error_stop(dws, "interrupt_transfer: fifo overrun/underrun"); in interrupt_transfer()
235 dw_reader(dws); in interrupt_transfer()
236 if (dws->rx_end == dws->rx) { in interrupt_transfer()
237 spi_mask_intr(dws, SPI_INT_TXEI); in interrupt_transfer()
238 spi_finalize_current_transfer(dws->master); in interrupt_transfer()
242 spi_mask_intr(dws, SPI_INT_TXEI); in interrupt_transfer()
243 dw_writer(dws); in interrupt_transfer()
245 spi_umask_intr(dws, SPI_INT_TXEI); in interrupt_transfer()
254 struct dw_spi *dws = spi_controller_get_devdata(master); in dw_spi_irq() local
255 u16 irq_status = dw_readl(dws, DW_SPI_ISR) & 0x3f; in dw_spi_irq()
261 spi_mask_intr(dws, SPI_INT_TXEI); in dw_spi_irq()
265 return dws->transfer_handler(dws); in dw_spi_irq()
269 static int poll_transfer(struct dw_spi *dws) in poll_transfer() argument
272 dw_writer(dws); in poll_transfer()
273 dw_reader(dws); in poll_transfer()
275 } while (dws->rx_end > dws->rx); in poll_transfer()
283 struct dw_spi *dws = spi_controller_get_devdata(master); in dw_spi_transfer_one() local
291 dws->dma_mapped = 0; in dw_spi_transfer_one()
292 spin_lock_irqsave(&dws->buf_lock, flags); in dw_spi_transfer_one()
293 dws->tx = (void *)transfer->tx_buf; in dw_spi_transfer_one()
294 dws->tx_end = dws->tx + transfer->len; in dw_spi_transfer_one()
295 dws->rx = transfer->rx_buf; in dw_spi_transfer_one()
296 dws->rx_end = dws->rx + transfer->len; in dw_spi_transfer_one()
297 dws->len = transfer->len; in dw_spi_transfer_one()
298 spin_unlock_irqrestore(&dws->buf_lock, flags); in dw_spi_transfer_one()
300 spi_enable_chip(dws, 0); in dw_spi_transfer_one()
303 if (transfer->speed_hz != dws->current_freq) { in dw_spi_transfer_one()
306 chip->clk_div = (DIV_ROUND_UP(dws->max_freq, transfer->speed_hz) + 1) & 0xfffe; in dw_spi_transfer_one()
309 dws->current_freq = transfer->speed_hz; in dw_spi_transfer_one()
310 spi_set_clk(dws, chip->clk_div); in dw_spi_transfer_one()
313 dws->n_bytes = DIV_ROUND_UP(transfer->bits_per_word, BITS_PER_BYTE); in dw_spi_transfer_one()
314 dws->dma_width = DIV_ROUND_UP(transfer->bits_per_word, BITS_PER_BYTE); in dw_spi_transfer_one()
329 if (dws->rx && dws->tx) in dw_spi_transfer_one()
331 else if (dws->rx) in dw_spi_transfer_one()
340 dw_writel(dws, DW_SPI_CTRL0, cr0); in dw_spi_transfer_one()
344 dws->dma_mapped = master->cur_msg_mapped; in dw_spi_transfer_one()
347 spi_mask_intr(dws, 0xff); in dw_spi_transfer_one()
353 if (dws->dma_mapped) { in dw_spi_transfer_one()
354 ret = dws->dma_ops->dma_setup(dws, transfer); in dw_spi_transfer_one()
356 spi_enable_chip(dws, 1); in dw_spi_transfer_one()
360 txlevel = min_t(u16, dws->fifo_len / 2, dws->len / dws->n_bytes); in dw_spi_transfer_one()
361 dw_writel(dws, DW_SPI_TXFLTR, txlevel); in dw_spi_transfer_one()
366 spi_umask_intr(dws, imask); in dw_spi_transfer_one()
368 dws->transfer_handler = interrupt_transfer; in dw_spi_transfer_one()
371 spi_enable_chip(dws, 1); in dw_spi_transfer_one()
373 if (dws->dma_mapped) { in dw_spi_transfer_one()
374 ret = dws->dma_ops->dma_transfer(dws, transfer); in dw_spi_transfer_one()
380 return poll_transfer(dws); in dw_spi_transfer_one()
388 struct dw_spi *dws = spi_controller_get_devdata(master); in dw_spi_handle_err() local
390 if (dws->dma_mapped) in dw_spi_handle_err()
391 dws->dma_ops->dma_stop(dws); in dw_spi_handle_err()
393 spi_reset_chip(dws); in dw_spi_handle_err()
440 static void spi_hw_init(struct device *dev, struct dw_spi *dws) in spi_hw_init() argument
442 spi_reset_chip(dws); in spi_hw_init()
448 if (!dws->fifo_len) { in spi_hw_init()
452 dw_writel(dws, DW_SPI_TXFLTR, fifo); in spi_hw_init()
453 if (fifo != dw_readl(dws, DW_SPI_TXFLTR)) in spi_hw_init()
456 dw_writel(dws, DW_SPI_TXFLTR, 0); in spi_hw_init()
458 dws->fifo_len = (fifo == 1) ? 0 : fifo; in spi_hw_init()
459 dev_dbg(dev, "Detected FIFO size: %u bytes\n", dws->fifo_len); in spi_hw_init()
463 if (dws->cs_override) in spi_hw_init()
464 dw_writel(dws, DW_SPI_CS_OVERRIDE, 0xF); in spi_hw_init()
467 int dw_spi_add_host(struct device *dev, struct dw_spi *dws) in dw_spi_add_host() argument
472 BUG_ON(dws == NULL); in dw_spi_add_host()
478 dws->master = master; in dw_spi_add_host()
479 dws->type = SSI_MOTO_SPI; in dw_spi_add_host()
480 dws->dma_inited = 0; in dw_spi_add_host()
481 dws->dma_addr = (dma_addr_t)(dws->paddr + DW_SPI_DR); in dw_spi_add_host()
482 spin_lock_init(&dws->buf_lock); in dw_spi_add_host()
484 spi_controller_set_devdata(master, dws); in dw_spi_add_host()
486 ret = request_irq(dws->irq, dw_spi_irq, IRQF_SHARED, dev_name(dev), in dw_spi_add_host()
496 master->bus_num = dws->bus_num; in dw_spi_add_host()
497 master->num_chipselect = dws->num_cs; in dw_spi_add_host()
503 master->max_speed_hz = dws->max_freq; in dw_spi_add_host()
508 if (dws->set_cs) in dw_spi_add_host()
509 master->set_cs = dws->set_cs; in dw_spi_add_host()
512 spi_hw_init(dev, dws); in dw_spi_add_host()
514 if (dws->dma_ops && dws->dma_ops->dma_init) { in dw_spi_add_host()
515 ret = dws->dma_ops->dma_init(dws); in dw_spi_add_host()
518 dws->dma_inited = 0; in dw_spi_add_host()
520 master->can_dma = dws->dma_ops->can_dma; in dw_spi_add_host()
530 dw_spi_debugfs_init(dws); in dw_spi_add_host()
534 if (dws->dma_ops && dws->dma_ops->dma_exit) in dw_spi_add_host()
535 dws->dma_ops->dma_exit(dws); in dw_spi_add_host()
536 spi_enable_chip(dws, 0); in dw_spi_add_host()
537 free_irq(dws->irq, master); in dw_spi_add_host()
544 void dw_spi_remove_host(struct dw_spi *dws) in dw_spi_remove_host() argument
546 dw_spi_debugfs_remove(dws); in dw_spi_remove_host()
548 if (dws->dma_ops && dws->dma_ops->dma_exit) in dw_spi_remove_host()
549 dws->dma_ops->dma_exit(dws); in dw_spi_remove_host()
551 spi_shutdown_chip(dws); in dw_spi_remove_host()
553 free_irq(dws->irq, dws->master); in dw_spi_remove_host()
557 int dw_spi_suspend_host(struct dw_spi *dws) in dw_spi_suspend_host() argument
561 ret = spi_controller_suspend(dws->master); in dw_spi_suspend_host()
565 spi_shutdown_chip(dws); in dw_spi_suspend_host()
570 int dw_spi_resume_host(struct dw_spi *dws) in dw_spi_resume_host() argument
572 spi_hw_init(&dws->master->dev, dws); in dw_spi_resume_host()
573 return spi_controller_resume(dws->master); in dw_spi_resume_host()