Lines Matching full:hw
64 struct tiny_spi *hw = tiny_spi_to_hw(spi); in tiny_spi_baud() local
66 return min(DIV_ROUND_UP(hw->freq, hz * 2), (1U << hw->baudwidth)) - 1; in tiny_spi_baud()
71 struct tiny_spi *hw = tiny_spi_to_hw(spi); in tiny_spi_chipselect() local
73 if (hw->gpio_cs_count > 0) { in tiny_spi_chipselect()
74 gpio_set_value(hw->gpio_cs[spi->chip_select], in tiny_spi_chipselect()
82 struct tiny_spi *hw = tiny_spi_to_hw(spi); in tiny_spi_setup_transfer() local
83 unsigned int baud = hw->baud; in tiny_spi_setup_transfer()
86 if (t->speed_hz && t->speed_hz != hw->speed_hz) in tiny_spi_setup_transfer()
89 writel(baud, hw->base + TINY_SPI_BAUD); in tiny_spi_setup_transfer()
90 writel(hw->mode, hw->base + TINY_SPI_CONTROL); in tiny_spi_setup_transfer()
96 struct tiny_spi *hw = tiny_spi_to_hw(spi); in tiny_spi_setup() local
98 if (spi->max_speed_hz != hw->speed_hz) { in tiny_spi_setup()
99 hw->speed_hz = spi->max_speed_hz; in tiny_spi_setup()
100 hw->baud = tiny_spi_baud(spi, hw->speed_hz); in tiny_spi_setup()
102 hw->mode = spi->mode & (SPI_CPOL | SPI_CPHA); in tiny_spi_setup()
106 static inline void tiny_spi_wait_txr(struct tiny_spi *hw) in tiny_spi_wait_txr() argument
108 while (!(readb(hw->base + TINY_SPI_STATUS) & in tiny_spi_wait_txr()
113 static inline void tiny_spi_wait_txe(struct tiny_spi *hw) in tiny_spi_wait_txe() argument
115 while (!(readb(hw->base + TINY_SPI_STATUS) & in tiny_spi_wait_txe()
122 struct tiny_spi *hw = tiny_spi_to_hw(spi); in tiny_spi_txrx_bufs() local
127 if (hw->irq >= 0) { in tiny_spi_txrx_bufs()
129 hw->len = t->len; in tiny_spi_txrx_bufs()
130 hw->txp = t->tx_buf; in tiny_spi_txrx_bufs()
131 hw->rxp = t->rx_buf; in tiny_spi_txrx_bufs()
132 hw->txc = 0; in tiny_spi_txrx_bufs()
133 hw->rxc = 0; in tiny_spi_txrx_bufs()
137 writeb(hw->txp ? *hw->txp++ : 0, in tiny_spi_txrx_bufs()
138 hw->base + TINY_SPI_TXDATA); in tiny_spi_txrx_bufs()
139 hw->txc++; 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(TINY_SPI_STATUS_TXR, hw->base + TINY_SPI_STATUS); in tiny_spi_txrx_bufs()
145 writeb(hw->txp ? *hw->txp++ : 0, in tiny_spi_txrx_bufs()
146 hw->base + TINY_SPI_TXDATA); in tiny_spi_txrx_bufs()
147 hw->txc++; in tiny_spi_txrx_bufs()
148 writeb(TINY_SPI_STATUS_TXE, hw->base + TINY_SPI_STATUS); in tiny_spi_txrx_bufs()
151 wait_for_completion(&hw->done); in tiny_spi_txrx_bufs()
154 writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA); in tiny_spi_txrx_bufs()
156 writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA); in tiny_spi_txrx_bufs()
159 tiny_spi_wait_txr(hw); in tiny_spi_txrx_bufs()
161 *rxp++ = readb(hw->base + TINY_SPI_TXDATA); in tiny_spi_txrx_bufs()
163 tiny_spi_wait_txe(hw); in tiny_spi_txrx_bufs()
165 *rxp++ = readb(hw->base + TINY_SPI_RXDATA); in tiny_spi_txrx_bufs()
173 struct tiny_spi *hw = dev; in tiny_spi_irq() local
175 writeb(0, hw->base + TINY_SPI_STATUS); in tiny_spi_irq()
176 if (hw->rxc + 1 == hw->len) { in tiny_spi_irq()
177 if (hw->rxp) in tiny_spi_irq()
178 *hw->rxp++ = readb(hw->base + TINY_SPI_RXDATA); in tiny_spi_irq()
179 hw->rxc++; in tiny_spi_irq()
180 complete(&hw->done); in tiny_spi_irq()
182 if (hw->rxp) in tiny_spi_irq()
183 *hw->rxp++ = readb(hw->base + TINY_SPI_TXDATA); in tiny_spi_irq()
184 hw->rxc++; in tiny_spi_irq()
185 if (hw->txc < hw->len) { in tiny_spi_irq()
186 writeb(hw->txp ? *hw->txp++ : 0, in tiny_spi_irq()
187 hw->base + TINY_SPI_TXDATA); in tiny_spi_irq()
188 hw->txc++; in tiny_spi_irq()
190 hw->base + TINY_SPI_STATUS); in tiny_spi_irq()
193 hw->base + TINY_SPI_STATUS); in tiny_spi_irq()
204 struct tiny_spi *hw = platform_get_drvdata(pdev); in tiny_spi_of_probe() local
211 hw->gpio_cs_count = of_gpio_count(np); in tiny_spi_of_probe()
212 if (hw->gpio_cs_count > 0) { in tiny_spi_of_probe()
213 hw->gpio_cs = devm_kcalloc(&pdev->dev, in tiny_spi_of_probe()
214 hw->gpio_cs_count, sizeof(unsigned int), in tiny_spi_of_probe()
216 if (!hw->gpio_cs) in tiny_spi_of_probe()
219 for (i = 0; i < hw->gpio_cs_count; i++) { in tiny_spi_of_probe()
220 hw->gpio_cs[i] = of_get_gpio_flags(np, i, NULL); in tiny_spi_of_probe()
221 if (hw->gpio_cs[i] < 0) in tiny_spi_of_probe()
224 hw->bitbang.master->dev.of_node = pdev->dev.of_node; in tiny_spi_of_probe()
226 hw->freq = val; in tiny_spi_of_probe()
228 hw->baudwidth = val; in tiny_spi_of_probe()
241 struct tiny_spi *hw; in tiny_spi_probe() local
256 hw = spi_master_get_devdata(master); in tiny_spi_probe()
257 platform_set_drvdata(pdev, hw); in tiny_spi_probe()
260 hw->bitbang.master = master; in tiny_spi_probe()
261 hw->bitbang.setup_transfer = tiny_spi_setup_transfer; in tiny_spi_probe()
262 hw->bitbang.chipselect = tiny_spi_chipselect; in tiny_spi_probe()
263 hw->bitbang.txrx_bufs = tiny_spi_txrx_bufs; in tiny_spi_probe()
266 hw->base = devm_platform_ioremap_resource(pdev, 0); in tiny_spi_probe()
267 if (IS_ERR(hw->base)) { in tiny_spi_probe()
268 err = PTR_ERR(hw->base); in tiny_spi_probe()
272 hw->irq = platform_get_irq(pdev, 0); in tiny_spi_probe()
273 if (hw->irq >= 0) { in tiny_spi_probe()
274 init_completion(&hw->done); in tiny_spi_probe()
275 err = devm_request_irq(&pdev->dev, hw->irq, tiny_spi_irq, 0, in tiny_spi_probe()
276 pdev->name, hw); in tiny_spi_probe()
282 hw->gpio_cs_count = platp->gpio_cs_count; in tiny_spi_probe()
283 hw->gpio_cs = platp->gpio_cs; in tiny_spi_probe()
288 hw->freq = platp->freq; in tiny_spi_probe()
289 hw->baudwidth = platp->baudwidth; in tiny_spi_probe()
295 for (i = 0; i < hw->gpio_cs_count; i++) { in tiny_spi_probe()
296 err = gpio_request(hw->gpio_cs[i], dev_name(&pdev->dev)); in tiny_spi_probe()
299 gpio_direction_output(hw->gpio_cs[i], 1); in tiny_spi_probe()
301 hw->bitbang.master->num_chipselect = max(1, hw->gpio_cs_count); in tiny_spi_probe()
304 err = spi_bitbang_start(&hw->bitbang); in tiny_spi_probe()
307 dev_info(&pdev->dev, "base %p, irq %d\n", hw->base, hw->irq); in tiny_spi_probe()
313 gpio_free(hw->gpio_cs[i]); in tiny_spi_probe()
321 struct tiny_spi *hw = platform_get_drvdata(pdev); in tiny_spi_remove() local
322 struct spi_master *master = hw->bitbang.master; in tiny_spi_remove()
325 spi_bitbang_stop(&hw->bitbang); in tiny_spi_remove()
326 for (i = 0; i < hw->gpio_cs_count; i++) in tiny_spi_remove()
327 gpio_free(hw->gpio_cs[i]); in tiny_spi_remove()