Lines Matching refs:hw
72 struct nuc900_spi *hw = to_hw(spi); in nuc900_slave_select() local
78 spin_lock_irqsave(&hw->lock, flags); in nuc900_slave_select()
80 val = __raw_readl(hw->regs + USI_SSR); in nuc900_slave_select()
92 __raw_writel(val, hw->regs + USI_SSR); in nuc900_slave_select()
94 val = __raw_readl(hw->regs + USI_CNT); in nuc900_slave_select()
101 __raw_writel(val, hw->regs + USI_CNT); in nuc900_slave_select()
103 spin_unlock_irqrestore(&hw->lock, flags); in nuc900_slave_select()
119 static void nuc900_spi_setup_txnum(struct nuc900_spi *hw, unsigned int txnum) in nuc900_spi_setup_txnum() argument
124 spin_lock_irqsave(&hw->lock, flags); in nuc900_spi_setup_txnum()
126 val = __raw_readl(hw->regs + USI_CNT) & ~TXNUM; in nuc900_spi_setup_txnum()
131 __raw_writel(val, hw->regs + USI_CNT); in nuc900_spi_setup_txnum()
133 spin_unlock_irqrestore(&hw->lock, flags); in nuc900_spi_setup_txnum()
137 static void nuc900_spi_setup_txbitlen(struct nuc900_spi *hw, in nuc900_spi_setup_txbitlen() argument
143 spin_lock_irqsave(&hw->lock, flags); in nuc900_spi_setup_txbitlen()
145 val = __raw_readl(hw->regs + USI_CNT) & ~TXBITLEN; in nuc900_spi_setup_txbitlen()
149 __raw_writel(val, hw->regs + USI_CNT); in nuc900_spi_setup_txbitlen()
151 spin_unlock_irqrestore(&hw->lock, flags); in nuc900_spi_setup_txbitlen()
154 static void nuc900_spi_gobusy(struct nuc900_spi *hw) in nuc900_spi_gobusy() argument
159 spin_lock_irqsave(&hw->lock, flags); in nuc900_spi_gobusy()
161 val = __raw_readl(hw->regs + USI_CNT); in nuc900_spi_gobusy()
165 __raw_writel(val, hw->regs + USI_CNT); in nuc900_spi_gobusy()
167 spin_unlock_irqrestore(&hw->lock, flags); in nuc900_spi_gobusy()
170 static inline unsigned int hw_txbyte(struct nuc900_spi *hw, int count) in hw_txbyte() argument
172 return hw->tx ? hw->tx[count] : 0; in hw_txbyte()
177 struct nuc900_spi *hw = to_hw(spi); in nuc900_spi_txrx() local
179 hw->tx = t->tx_buf; in nuc900_spi_txrx()
180 hw->rx = t->rx_buf; in nuc900_spi_txrx()
181 hw->len = t->len; in nuc900_spi_txrx()
182 hw->count = 0; in nuc900_spi_txrx()
184 __raw_writel(hw_txbyte(hw, 0x0), hw->regs + USI_TX0); in nuc900_spi_txrx()
186 nuc900_spi_gobusy(hw); in nuc900_spi_txrx()
188 wait_for_completion(&hw->done); in nuc900_spi_txrx()
190 return hw->count; in nuc900_spi_txrx()
195 struct nuc900_spi *hw = dev; in nuc900_spi_irq() local
197 unsigned int count = hw->count; in nuc900_spi_irq()
199 status = __raw_readl(hw->regs + USI_CNT); in nuc900_spi_irq()
200 __raw_writel(status, hw->regs + USI_CNT); in nuc900_spi_irq()
203 hw->count++; in nuc900_spi_irq()
205 if (hw->rx) in nuc900_spi_irq()
206 hw->rx[count] = __raw_readl(hw->regs + USI_RX0); in nuc900_spi_irq()
209 if (count < hw->len) { in nuc900_spi_irq()
210 __raw_writel(hw_txbyte(hw, count), hw->regs + USI_TX0); in nuc900_spi_irq()
211 nuc900_spi_gobusy(hw); in nuc900_spi_irq()
213 complete(&hw->done); in nuc900_spi_irq()
219 complete(&hw->done); in nuc900_spi_irq()
223 static void nuc900_tx_edge(struct nuc900_spi *hw, unsigned int edge) in nuc900_tx_edge() argument
228 spin_lock_irqsave(&hw->lock, flags); in nuc900_tx_edge()
230 val = __raw_readl(hw->regs + USI_CNT); in nuc900_tx_edge()
236 __raw_writel(val, hw->regs + USI_CNT); in nuc900_tx_edge()
238 spin_unlock_irqrestore(&hw->lock, flags); in nuc900_tx_edge()
241 static void nuc900_rx_edge(struct nuc900_spi *hw, unsigned int edge) in nuc900_rx_edge() argument
246 spin_lock_irqsave(&hw->lock, flags); in nuc900_rx_edge()
248 val = __raw_readl(hw->regs + USI_CNT); in nuc900_rx_edge()
254 __raw_writel(val, hw->regs + USI_CNT); in nuc900_rx_edge()
256 spin_unlock_irqrestore(&hw->lock, flags); in nuc900_rx_edge()
259 static void nuc900_send_first(struct nuc900_spi *hw, unsigned int lsb) in nuc900_send_first() argument
264 spin_lock_irqsave(&hw->lock, flags); in nuc900_send_first()
266 val = __raw_readl(hw->regs + USI_CNT); in nuc900_send_first()
272 __raw_writel(val, hw->regs + USI_CNT); in nuc900_send_first()
274 spin_unlock_irqrestore(&hw->lock, flags); in nuc900_send_first()
277 static void nuc900_set_sleep(struct nuc900_spi *hw, unsigned int sleep) in nuc900_set_sleep() argument
282 spin_lock_irqsave(&hw->lock, flags); in nuc900_set_sleep()
284 val = __raw_readl(hw->regs + USI_CNT) & ~SLEEP; in nuc900_set_sleep()
289 __raw_writel(val, hw->regs + USI_CNT); in nuc900_set_sleep()
291 spin_unlock_irqrestore(&hw->lock, flags); in nuc900_set_sleep()
294 static void nuc900_enable_int(struct nuc900_spi *hw) in nuc900_enable_int() argument
299 spin_lock_irqsave(&hw->lock, flags); in nuc900_enable_int()
301 val = __raw_readl(hw->regs + USI_CNT); in nuc900_enable_int()
305 __raw_writel(val, hw->regs + USI_CNT); in nuc900_enable_int()
307 spin_unlock_irqrestore(&hw->lock, flags); in nuc900_enable_int()
310 static void nuc900_set_divider(struct nuc900_spi *hw) in nuc900_set_divider() argument
312 __raw_writel(hw->pdata->divider, hw->regs + USI_DIV); in nuc900_set_divider()
315 static void nuc900_init_spi(struct nuc900_spi *hw) in nuc900_init_spi() argument
317 clk_enable(hw->clk); in nuc900_init_spi()
318 spin_lock_init(&hw->lock); in nuc900_init_spi()
320 nuc900_tx_edge(hw, hw->pdata->txneg); in nuc900_init_spi()
321 nuc900_rx_edge(hw, hw->pdata->rxneg); in nuc900_init_spi()
322 nuc900_send_first(hw, hw->pdata->lsb); in nuc900_init_spi()
323 nuc900_set_sleep(hw, hw->pdata->sleep); in nuc900_init_spi()
324 nuc900_spi_setup_txbitlen(hw, hw->pdata->txbitlen); in nuc900_init_spi()
325 nuc900_spi_setup_txnum(hw, hw->pdata->txnum); in nuc900_init_spi()
326 nuc900_set_divider(hw); in nuc900_init_spi()
327 nuc900_enable_int(hw); in nuc900_init_spi()
332 struct nuc900_spi *hw; in nuc900_spi_probe() local
343 hw = spi_master_get_devdata(master); in nuc900_spi_probe()
344 hw->master = master; in nuc900_spi_probe()
345 hw->pdata = dev_get_platdata(&pdev->dev); in nuc900_spi_probe()
347 if (hw->pdata == NULL) { in nuc900_spi_probe()
353 platform_set_drvdata(pdev, hw); in nuc900_spi_probe()
354 init_completion(&hw->done); in nuc900_spi_probe()
357 if (hw->pdata->lsb) in nuc900_spi_probe()
359 master->num_chipselect = hw->pdata->num_cs; in nuc900_spi_probe()
360 master->bus_num = hw->pdata->bus_num; in nuc900_spi_probe()
361 hw->bitbang.master = hw->master; in nuc900_spi_probe()
362 hw->bitbang.chipselect = nuc900_spi_chipsel; in nuc900_spi_probe()
363 hw->bitbang.txrx_bufs = nuc900_spi_txrx; in nuc900_spi_probe()
366 hw->regs = devm_ioremap_resource(&pdev->dev, res); in nuc900_spi_probe()
367 if (IS_ERR(hw->regs)) { in nuc900_spi_probe()
368 err = PTR_ERR(hw->regs); in nuc900_spi_probe()
372 hw->irq = platform_get_irq(pdev, 0); in nuc900_spi_probe()
373 if (hw->irq < 0) { in nuc900_spi_probe()
379 err = devm_request_irq(&pdev->dev, hw->irq, nuc900_spi_irq, 0, in nuc900_spi_probe()
380 pdev->name, hw); in nuc900_spi_probe()
386 hw->clk = devm_clk_get(&pdev->dev, "spi"); in nuc900_spi_probe()
387 if (IS_ERR(hw->clk)) { in nuc900_spi_probe()
389 err = PTR_ERR(hw->clk); in nuc900_spi_probe()
394 nuc900_init_spi(hw); in nuc900_spi_probe()
396 err = spi_bitbang_start(&hw->bitbang); in nuc900_spi_probe()
405 clk_disable(hw->clk); in nuc900_spi_probe()
407 spi_master_put(hw->master); in nuc900_spi_probe()
413 struct nuc900_spi *hw = platform_get_drvdata(dev); in nuc900_spi_remove() local
415 spi_bitbang_stop(&hw->bitbang); in nuc900_spi_remove()
416 clk_disable(hw->clk); in nuc900_spi_remove()
417 spi_master_put(hw->master); in nuc900_spi_remove()