Lines Matching full:hs
161 static int hisi_spi_debugfs_init(struct hisi_spi *hs) in hisi_spi_debugfs_init() argument
167 host = container_of(hs->dev, struct spi_controller, dev); in hisi_spi_debugfs_init()
169 hs->debugfs = debugfs_create_dir(name, NULL); in hisi_spi_debugfs_init()
170 if (IS_ERR(hs->debugfs)) in hisi_spi_debugfs_init()
173 hs->regset.regs = hisi_spi_regs; in hisi_spi_debugfs_init()
174 hs->regset.nregs = ARRAY_SIZE(hisi_spi_regs); in hisi_spi_debugfs_init()
175 hs->regset.base = hs->regs; in hisi_spi_debugfs_init()
176 debugfs_create_regset32("registers", 0400, hs->debugfs, &hs->regset); in hisi_spi_debugfs_init()
181 static u32 hisi_spi_busy(struct hisi_spi *hs) in hisi_spi_busy() argument
183 return readl(hs->regs + HISI_SPI_SR) & SR_BUSY; in hisi_spi_busy()
186 static u32 hisi_spi_rx_not_empty(struct hisi_spi *hs) in hisi_spi_rx_not_empty() argument
188 return readl(hs->regs + HISI_SPI_SR) & SR_RXNE; in hisi_spi_rx_not_empty()
191 static u32 hisi_spi_tx_not_full(struct hisi_spi *hs) in hisi_spi_tx_not_full() argument
193 return readl(hs->regs + HISI_SPI_SR) & SR_TXNF; in hisi_spi_tx_not_full()
196 static void hisi_spi_flush_fifo(struct hisi_spi *hs) in hisi_spi_flush_fifo() argument
201 while (hisi_spi_rx_not_empty(hs)) in hisi_spi_flush_fifo()
202 readl(hs->regs + HISI_SPI_DOUT); in hisi_spi_flush_fifo()
203 } while (hisi_spi_busy(hs) && limit--); in hisi_spi_flush_fifo()
207 static void hisi_spi_disable(struct hisi_spi *hs) in hisi_spi_disable() argument
209 writel(0, hs->regs + HISI_SPI_ENR); in hisi_spi_disable()
210 writel(IMR_MASK, hs->regs + HISI_SPI_IMR); in hisi_spi_disable()
211 writel(ICR_MASK, hs->regs + HISI_SPI_ICR); in hisi_spi_disable()
224 static void hisi_spi_reader(struct hisi_spi *hs) in hisi_spi_reader() argument
226 u32 max = min_t(u32, hs->rx_len, hs->fifo_len); in hisi_spi_reader()
229 while (hisi_spi_rx_not_empty(hs) && max--) { in hisi_spi_reader()
230 rxw = readl(hs->regs + HISI_SPI_DOUT); in hisi_spi_reader()
232 if (hs->rx) { in hisi_spi_reader()
233 switch (hs->n_bytes) { in hisi_spi_reader()
235 *(u8 *)(hs->rx) = rxw; in hisi_spi_reader()
238 *(u16 *)(hs->rx) = rxw; in hisi_spi_reader()
241 *(u32 *)(hs->rx) = rxw; in hisi_spi_reader()
244 hs->rx += hs->n_bytes; in hisi_spi_reader()
246 --hs->rx_len; in hisi_spi_reader()
250 static void hisi_spi_writer(struct hisi_spi *hs) in hisi_spi_writer() argument
252 u32 max = min_t(u32, hs->tx_len, hs->fifo_len); in hisi_spi_writer()
255 while (hisi_spi_tx_not_full(hs) && max--) { in hisi_spi_writer()
257 if (hs->tx) { in hisi_spi_writer()
258 switch (hs->n_bytes) { in hisi_spi_writer()
260 txw = *(u8 *)(hs->tx); in hisi_spi_writer()
263 txw = *(u16 *)(hs->tx); in hisi_spi_writer()
266 txw = *(u32 *)(hs->tx); in hisi_spi_writer()
269 hs->tx += hs->n_bytes; in hisi_spi_writer()
271 writel(txw, hs->regs + HISI_SPI_DIN); in hisi_spi_writer()
272 --hs->tx_len; in hisi_spi_writer()
323 static void hisi_spi_hw_init(struct hisi_spi *hs) in hisi_spi_hw_init() argument
325 hisi_spi_disable(hs); in hisi_spi_hw_init()
330 hs->regs + HISI_SPI_FIFOC); in hisi_spi_hw_init()
332 hs->fifo_len = 256; in hisi_spi_hw_init()
338 struct hisi_spi *hs = spi_controller_get_devdata(host); in hisi_spi_irq() local
339 u32 irq_status = readl(hs->regs + HISI_SPI_ISR) & ISR_MASK; in hisi_spi_irq()
349 dev_err(hs->dev, "interrupt_transfer: fifo overflow\n"); in hisi_spi_irq()
358 hisi_spi_reader(hs); in hisi_spi_irq()
359 if (!hs->rx_len) in hisi_spi_irq()
364 hisi_spi_writer(hs); in hisi_spi_irq()
369 hisi_spi_disable(hs); in hisi_spi_irq()
377 struct hisi_spi *hs = spi_controller_get_devdata(host); in hisi_spi_transfer_one() local
387 writel(cr, hs->regs + HISI_SPI_CR); in hisi_spi_transfer_one()
389 hisi_spi_flush_fifo(hs); in hisi_spi_transfer_one()
391 hs->n_bytes = hisi_spi_n_bytes(transfer); in hisi_spi_transfer_one()
392 hs->tx = transfer->tx_buf; in hisi_spi_transfer_one()
393 hs->tx_len = transfer->len / hs->n_bytes; in hisi_spi_transfer_one()
394 hs->rx = transfer->rx_buf; in hisi_spi_transfer_one()
395 hs->rx_len = hs->tx_len; in hisi_spi_transfer_one()
404 writel(~(u32)IMR_MASK, hs->regs + HISI_SPI_IMR); in hisi_spi_transfer_one()
405 writel(1, hs->regs + HISI_SPI_ENR); in hisi_spi_transfer_one()
413 struct hisi_spi *hs = spi_controller_get_devdata(host); in hisi_spi_handle_err() local
415 hisi_spi_disable(hs); in hisi_spi_handle_err()
454 struct hisi_spi *hs; in hisi_spi_probe() local
461 host = devm_spi_alloc_host(dev, sizeof(*hs)); in hisi_spi_probe()
467 hs = spi_controller_get_devdata(host); in hisi_spi_probe()
468 hs->dev = dev; in hisi_spi_probe()
469 hs->irq = irq; in hisi_spi_probe()
471 hs->regs = devm_platform_ioremap_resource(pdev, 0); in hisi_spi_probe()
472 if (IS_ERR(hs->regs)) in hisi_spi_probe()
473 return PTR_ERR(hs->regs); in hisi_spi_probe()
503 hisi_spi_hw_init(hs); in hisi_spi_probe()
505 ret = devm_request_irq(dev, hs->irq, hisi_spi_irq, 0, dev_name(dev), in hisi_spi_probe()
508 dev_err(dev, "failed to get IRQ=%d, ret=%d\n", hs->irq, ret); in hisi_spi_probe()
518 if (hisi_spi_debugfs_init(hs)) in hisi_spi_probe()
522 readl(hs->regs + HISI_SPI_VERSION), in hisi_spi_probe()
531 struct hisi_spi *hs = spi_controller_get_devdata(host); in hisi_spi_remove() local
533 debugfs_remove_recursive(hs->debugfs); in hisi_spi_remove()