Lines Matching refs:hw
67 struct tiny_spi *hw = tiny_spi_to_hw(spi); in tiny_spi_baud() local
69 return min(DIV_ROUND_UP(hw->freq, hz * 2), (1U << hw->baudwidth)) - 1; in tiny_spi_baud()
74 struct tiny_spi *hw = tiny_spi_to_hw(spi); in tiny_spi_chipselect() local
76 if (hw->gpio_cs_count > 0) { in tiny_spi_chipselect()
77 gpio_set_value(hw->gpio_cs[spi->chip_select], in tiny_spi_chipselect()
85 struct tiny_spi *hw = tiny_spi_to_hw(spi); in tiny_spi_setup_transfer() local
86 unsigned int baud = hw->baud; in tiny_spi_setup_transfer()
89 if (t->speed_hz && t->speed_hz != hw->speed_hz) in tiny_spi_setup_transfer()
92 writel(baud, hw->base + TINY_SPI_BAUD); in tiny_spi_setup_transfer()
93 writel(hw->mode, hw->base + TINY_SPI_CONTROL); in tiny_spi_setup_transfer()
99 struct tiny_spi *hw = tiny_spi_to_hw(spi); in tiny_spi_setup() local
101 if (spi->max_speed_hz != hw->speed_hz) { in tiny_spi_setup()
102 hw->speed_hz = spi->max_speed_hz; in tiny_spi_setup()
103 hw->baud = tiny_spi_baud(spi, hw->speed_hz); in tiny_spi_setup()
105 hw->mode = spi->mode & (SPI_CPOL | SPI_CPHA); in tiny_spi_setup()
109 static inline void tiny_spi_wait_txr(struct tiny_spi *hw) in tiny_spi_wait_txr() argument
111 while (!(readb(hw->base + TINY_SPI_STATUS) & in tiny_spi_wait_txr()
116 static inline void tiny_spi_wait_txe(struct tiny_spi *hw) in tiny_spi_wait_txe() argument
118 while (!(readb(hw->base + TINY_SPI_STATUS) & in tiny_spi_wait_txe()
125 struct tiny_spi *hw = tiny_spi_to_hw(spi); in tiny_spi_txrx_bufs() local
130 if (hw->irq >= 0) { in tiny_spi_txrx_bufs()
132 hw->len = t->len; in tiny_spi_txrx_bufs()
133 hw->txp = t->tx_buf; in tiny_spi_txrx_bufs()
134 hw->rxp = t->rx_buf; in tiny_spi_txrx_bufs()
135 hw->txc = 0; in tiny_spi_txrx_bufs()
136 hw->rxc = 0; in tiny_spi_txrx_bufs()
140 writeb(hw->txp ? *hw->txp++ : 0, in tiny_spi_txrx_bufs()
141 hw->base + TINY_SPI_TXDATA); in tiny_spi_txrx_bufs()
142 hw->txc++; in tiny_spi_txrx_bufs()
143 writeb(hw->txp ? *hw->txp++ : 0, in tiny_spi_txrx_bufs()
144 hw->base + TINY_SPI_TXDATA); in tiny_spi_txrx_bufs()
145 hw->txc++; in tiny_spi_txrx_bufs()
146 writeb(TINY_SPI_STATUS_TXR, hw->base + TINY_SPI_STATUS); in tiny_spi_txrx_bufs()
148 writeb(hw->txp ? *hw->txp++ : 0, in tiny_spi_txrx_bufs()
149 hw->base + TINY_SPI_TXDATA); in tiny_spi_txrx_bufs()
150 hw->txc++; in tiny_spi_txrx_bufs()
151 writeb(TINY_SPI_STATUS_TXE, hw->base + TINY_SPI_STATUS); in tiny_spi_txrx_bufs()
154 wait_for_completion(&hw->done); in tiny_spi_txrx_bufs()
157 writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA); in tiny_spi_txrx_bufs()
159 writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA); in tiny_spi_txrx_bufs()
162 tiny_spi_wait_txr(hw); in tiny_spi_txrx_bufs()
164 *rxp++ = readb(hw->base + TINY_SPI_TXDATA); in tiny_spi_txrx_bufs()
166 tiny_spi_wait_txe(hw); in tiny_spi_txrx_bufs()
168 *rxp++ = readb(hw->base + TINY_SPI_RXDATA); in tiny_spi_txrx_bufs()
176 struct tiny_spi *hw = dev; in tiny_spi_irq() local
178 writeb(0, hw->base + TINY_SPI_STATUS); in tiny_spi_irq()
179 if (hw->rxc + 1 == hw->len) { in tiny_spi_irq()
180 if (hw->rxp) in tiny_spi_irq()
181 *hw->rxp++ = readb(hw->base + TINY_SPI_RXDATA); in tiny_spi_irq()
182 hw->rxc++; in tiny_spi_irq()
183 complete(&hw->done); in tiny_spi_irq()
185 if (hw->rxp) in tiny_spi_irq()
186 *hw->rxp++ = readb(hw->base + TINY_SPI_TXDATA); in tiny_spi_irq()
187 hw->rxc++; in tiny_spi_irq()
188 if (hw->txc < hw->len) { in tiny_spi_irq()
189 writeb(hw->txp ? *hw->txp++ : 0, in tiny_spi_irq()
190 hw->base + TINY_SPI_TXDATA); in tiny_spi_irq()
191 hw->txc++; in tiny_spi_irq()
193 hw->base + TINY_SPI_STATUS); in tiny_spi_irq()
196 hw->base + TINY_SPI_STATUS); in tiny_spi_irq()
207 struct tiny_spi *hw = platform_get_drvdata(pdev); in tiny_spi_of_probe() local
214 hw->gpio_cs_count = of_gpio_count(np); in tiny_spi_of_probe()
215 if (hw->gpio_cs_count > 0) { in tiny_spi_of_probe()
216 hw->gpio_cs = devm_kzalloc(&pdev->dev, in tiny_spi_of_probe()
217 hw->gpio_cs_count * sizeof(unsigned int), in tiny_spi_of_probe()
219 if (!hw->gpio_cs) in tiny_spi_of_probe()
222 for (i = 0; i < hw->gpio_cs_count; i++) { in tiny_spi_of_probe()
223 hw->gpio_cs[i] = of_get_gpio_flags(np, i, NULL); in tiny_spi_of_probe()
224 if (hw->gpio_cs[i] < 0) in tiny_spi_of_probe()
227 hw->bitbang.master->dev.of_node = pdev->dev.of_node; in tiny_spi_of_probe()
229 hw->freq = val; in tiny_spi_of_probe()
231 hw->baudwidth = val; in tiny_spi_of_probe()
244 struct tiny_spi *hw; in tiny_spi_probe() local
260 hw = spi_master_get_devdata(master); in tiny_spi_probe()
261 platform_set_drvdata(pdev, hw); in tiny_spi_probe()
264 hw->bitbang.master = master; in tiny_spi_probe()
265 hw->bitbang.setup_transfer = tiny_spi_setup_transfer; in tiny_spi_probe()
266 hw->bitbang.chipselect = tiny_spi_chipselect; in tiny_spi_probe()
267 hw->bitbang.txrx_bufs = tiny_spi_txrx_bufs; in tiny_spi_probe()
271 hw->base = devm_ioremap_resource(&pdev->dev, res); in tiny_spi_probe()
272 if (IS_ERR(hw->base)) { in tiny_spi_probe()
273 err = PTR_ERR(hw->base); in tiny_spi_probe()
277 hw->irq = platform_get_irq(pdev, 0); in tiny_spi_probe()
278 if (hw->irq >= 0) { in tiny_spi_probe()
279 init_completion(&hw->done); in tiny_spi_probe()
280 err = devm_request_irq(&pdev->dev, hw->irq, tiny_spi_irq, 0, in tiny_spi_probe()
281 pdev->name, hw); in tiny_spi_probe()
287 hw->gpio_cs_count = platp->gpio_cs_count; in tiny_spi_probe()
288 hw->gpio_cs = platp->gpio_cs; in tiny_spi_probe()
293 hw->freq = platp->freq; in tiny_spi_probe()
294 hw->baudwidth = platp->baudwidth; in tiny_spi_probe()
300 for (i = 0; i < hw->gpio_cs_count; i++) { in tiny_spi_probe()
301 err = gpio_request(hw->gpio_cs[i], dev_name(&pdev->dev)); in tiny_spi_probe()
304 gpio_direction_output(hw->gpio_cs[i], 1); in tiny_spi_probe()
306 hw->bitbang.master->num_chipselect = max(1, hw->gpio_cs_count); in tiny_spi_probe()
309 err = spi_bitbang_start(&hw->bitbang); in tiny_spi_probe()
312 dev_info(&pdev->dev, "base %p, irq %d\n", hw->base, hw->irq); in tiny_spi_probe()
318 gpio_free(hw->gpio_cs[i]); in tiny_spi_probe()
326 struct tiny_spi *hw = platform_get_drvdata(pdev); in tiny_spi_remove() local
327 struct spi_master *master = hw->bitbang.master; in tiny_spi_remove()
330 spi_bitbang_stop(&hw->bitbang); in tiny_spi_remove()
331 for (i = 0; i < hw->gpio_cs_count; i++) in tiny_spi_remove()
332 gpio_free(hw->gpio_cs[i]); in tiny_spi_remove()