Lines Matching refs:priv
123 static void omap3_spi_write_chconf(struct omap3_spi_priv *priv, int val) in omap3_spi_write_chconf() argument
125 writel(val, &priv->regs->channel[priv->cs].chconf); in omap3_spi_write_chconf()
127 readl(&priv->regs->channel[priv->cs].chconf); in omap3_spi_write_chconf()
130 static void omap3_spi_set_enable(struct omap3_spi_priv *priv, int enable) in omap3_spi_set_enable() argument
132 writel(enable, &priv->regs->channel[priv->cs].chctrl); in omap3_spi_set_enable()
134 readl(&priv->regs->channel[priv->cs].chctrl); in omap3_spi_set_enable()
137 static int omap3_spi_write(struct omap3_spi_priv *priv, unsigned int len, in omap3_spi_write() argument
143 chconf = readl(&priv->regs->channel[priv->cs].chconf); in omap3_spi_write()
146 omap3_spi_set_enable(priv, OMAP3_MCSPI_CHCTRL_EN); in omap3_spi_write()
149 chconf |= (priv->wordlen - 1) << 7; in omap3_spi_write()
152 omap3_spi_write_chconf(priv, chconf); in omap3_spi_write()
157 while (!(readl(&priv->regs->channel[priv->cs].chstat) & in omap3_spi_write()
161 readl(&priv->regs->channel[priv->cs].chstat)); in omap3_spi_write()
166 unsigned int *tx = &priv->regs->channel[priv->cs].tx; in omap3_spi_write()
167 if (priv->wordlen > 16) in omap3_spi_write()
169 else if (priv->wordlen > 8) in omap3_spi_write()
176 while ((readl(&priv->regs->channel[priv->cs].chstat) & in omap3_spi_write()
182 omap3_spi_set_enable(priv, OMAP3_MCSPI_CHCTRL_DIS); in omap3_spi_write()
187 omap3_spi_write_chconf(priv, chconf); in omap3_spi_write()
192 static int omap3_spi_read(struct omap3_spi_priv *priv, unsigned int len, in omap3_spi_read() argument
198 chconf = readl(&priv->regs->channel[priv->cs].chconf); in omap3_spi_read()
201 omap3_spi_set_enable(priv, OMAP3_MCSPI_CHCTRL_EN); in omap3_spi_read()
204 chconf |= (priv->wordlen - 1) << 7; in omap3_spi_read()
207 omap3_spi_write_chconf(priv, chconf); in omap3_spi_read()
209 writel(0, &priv->regs->channel[priv->cs].tx); in omap3_spi_read()
214 while (!(readl(&priv->regs->channel[priv->cs].chstat) & in omap3_spi_read()
218 readl(&priv->regs->channel[priv->cs].chstat)); in omap3_spi_read()
225 omap3_spi_set_enable(priv, OMAP3_MCSPI_CHCTRL_DIS); in omap3_spi_read()
228 unsigned int *rx = &priv->regs->channel[priv->cs].rx; in omap3_spi_read()
229 if (priv->wordlen > 16) in omap3_spi_read()
231 else if (priv->wordlen > 8) in omap3_spi_read()
239 omap3_spi_write_chconf(priv, chconf); in omap3_spi_read()
246 static int omap3_spi_txrx(struct omap3_spi_priv *priv, unsigned int len, in omap3_spi_txrx() argument
252 chconf = readl(&priv->regs->channel[priv->cs].chconf); in omap3_spi_txrx()
255 omap3_spi_set_enable(priv, OMAP3_MCSPI_CHCTRL_EN); in omap3_spi_txrx()
259 chconf |= (priv->wordlen - 1) << 7; in omap3_spi_txrx()
261 omap3_spi_write_chconf(priv, chconf); in omap3_spi_txrx()
267 while (!(readl(&priv->regs->channel[priv->cs].chstat) & in omap3_spi_txrx()
271 readl(&priv->regs->channel[priv->cs].chstat)); in omap3_spi_txrx()
276 unsigned int *tx = &priv->regs->channel[priv->cs].tx; in omap3_spi_txrx()
277 if (priv->wordlen > 16) in omap3_spi_txrx()
279 else if (priv->wordlen > 8) in omap3_spi_txrx()
286 while (!(readl(&priv->regs->channel[priv->cs].chstat) & in omap3_spi_txrx()
290 readl(&priv->regs->channel[priv->cs].chstat)); in omap3_spi_txrx()
295 unsigned int *rx = &priv->regs->channel[priv->cs].rx; in omap3_spi_txrx()
296 if (priv->wordlen > 16) in omap3_spi_txrx()
298 else if (priv->wordlen > 8) in omap3_spi_txrx()
304 omap3_spi_set_enable(priv, OMAP3_MCSPI_CHCTRL_DIS); in omap3_spi_txrx()
309 omap3_spi_write_chconf(priv, chconf); in omap3_spi_txrx()
315 static int _spi_xfer(struct omap3_spi_priv *priv, unsigned int bitlen, in _spi_xfer() argument
321 if (priv->wordlen < 4 || priv->wordlen > 32) { in _spi_xfer()
322 printf("omap3_spi: invalid wordlen %d\n", priv->wordlen); in _spi_xfer()
326 if (bitlen % priv->wordlen) in _spi_xfer()
329 len = bitlen / priv->wordlen; in _spi_xfer()
332 int chconf = readl(&priv->regs->channel[priv->cs].chconf); in _spi_xfer()
335 omap3_spi_set_enable(priv, OMAP3_MCSPI_CHCTRL_EN); in _spi_xfer()
337 omap3_spi_write_chconf(priv, chconf); in _spi_xfer()
341 omap3_spi_write_chconf(priv, chconf); in _spi_xfer()
342 omap3_spi_set_enable(priv, OMAP3_MCSPI_CHCTRL_DIS); in _spi_xfer()
347 ret = omap3_spi_txrx(priv, len, dout, din, flags); in _spi_xfer()
349 ret = omap3_spi_write(priv, len, dout, flags); in _spi_xfer()
351 ret = omap3_spi_read(priv, len, din, flags); in _spi_xfer()
356 static void _omap3_spi_set_speed(struct omap3_spi_priv *priv) in _omap3_spi_set_speed() argument
360 confr = readl(&priv->regs->channel[priv->cs].chconf); in _omap3_spi_set_speed()
363 if (priv->freq) { in _omap3_spi_set_speed()
365 > priv->freq) in _omap3_spi_set_speed()
375 omap3_spi_write_chconf(priv, confr); in _omap3_spi_set_speed()
378 static void _omap3_spi_set_mode(struct omap3_spi_priv *priv) in _omap3_spi_set_mode() argument
382 confr = readl(&priv->regs->channel[priv->cs].chconf); in _omap3_spi_set_mode()
387 if (priv->pin_dir == MCSPI_PINDIR_D0_IN_D1_OUT) { in _omap3_spi_set_mode()
397 if (priv->mode & SPI_CPHA) in _omap3_spi_set_mode()
399 if (priv->mode & SPI_CPOL) in _omap3_spi_set_mode()
403 if (!(priv->mode & SPI_CS_HIGH)) in _omap3_spi_set_mode()
411 omap3_spi_write_chconf(priv, confr); in _omap3_spi_set_mode()
414 static void _omap3_spi_set_wordlen(struct omap3_spi_priv *priv) in _omap3_spi_set_wordlen() argument
419 confr = readl(&priv->regs->channel[priv->wordlen].chconf); in _omap3_spi_set_wordlen()
423 confr |= (priv->wordlen - 1) << 7; in _omap3_spi_set_wordlen()
425 omap3_spi_write_chconf(priv, confr); in _omap3_spi_set_wordlen()
444 static void _omap3_spi_claim_bus(struct omap3_spi_priv *priv) in _omap3_spi_claim_bus() argument
448 spi_reset(priv->regs); in _omap3_spi_claim_bus()
454 conf = readl(&priv->regs->modulctrl); in _omap3_spi_claim_bus()
458 writel(conf, &priv->regs->modulctrl); in _omap3_spi_claim_bus()
475 struct omap3_spi_priv *priv = to_omap3_spi(slave); in spi_free_slave() local
477 free(priv); in spi_free_slave()
482 struct omap3_spi_priv *priv = to_omap3_spi(slave); in spi_claim_bus() local
484 _omap3_spi_claim_bus(priv); in spi_claim_bus()
485 _omap3_spi_set_wordlen(priv); in spi_claim_bus()
486 _omap3_spi_set_mode(priv); in spi_claim_bus()
487 _omap3_spi_set_speed(priv); in spi_claim_bus()
494 struct omap3_spi_priv *priv = to_omap3_spi(slave); in spi_release_bus() local
497 spi_reset(priv->regs); in spi_release_bus()
503 struct omap3_spi_priv *priv; in spi_setup_slave() local
558 priv = spi_alloc_slave(struct omap3_spi_priv, bus, cs); in spi_setup_slave()
559 if (!priv) { in spi_setup_slave()
564 priv->regs = regs; in spi_setup_slave()
565 priv->cs = cs; in spi_setup_slave()
566 priv->freq = max_hz; in spi_setup_slave()
567 priv->mode = mode; in spi_setup_slave()
568 priv->wordlen = priv->slave.wordlen; in spi_setup_slave()
571 priv->pin_dir = MCSPI_PINDIR_D0_OUT_D1_IN; in spi_setup_slave()
574 return &priv->slave; in spi_setup_slave()
580 struct omap3_spi_priv *priv = to_omap3_spi(slave); in spi_xfer() local
582 return _spi_xfer(priv, bitlen, dout, din, flags); in spi_xfer()
590 struct omap3_spi_priv *priv = dev_get_priv(bus); in omap3_spi_claim_bus() local
593 priv->cs = slave_plat->cs; in omap3_spi_claim_bus()
594 _omap3_spi_claim_bus(priv); in omap3_spi_claim_bus()
602 struct omap3_spi_priv *priv = dev_get_priv(bus); in omap3_spi_release_bus() local
605 spi_reset(priv->regs); in omap3_spi_release_bus()
613 struct omap3_spi_priv *priv = dev_get_priv(bus); in omap3_spi_set_wordlen() local
616 priv->cs = slave_plat->cs; in omap3_spi_set_wordlen()
617 priv->wordlen = wordlen; in omap3_spi_set_wordlen()
618 _omap3_spi_set_wordlen(priv); in omap3_spi_set_wordlen()
625 struct omap3_spi_priv *priv = dev_get_priv(dev); in omap3_spi_probe() local
632 priv->regs = (struct mcspi *)(devfdt_get_addr(dev) + data->regs_offset); in omap3_spi_probe()
634 priv->pin_dir = MCSPI_PINDIR_D0_OUT_D1_IN; in omap3_spi_probe()
636 priv->pin_dir = MCSPI_PINDIR_D0_IN_D1_OUT; in omap3_spi_probe()
637 priv->wordlen = SPI_DEFAULT_WORDLEN; in omap3_spi_probe()
645 struct omap3_spi_priv *priv = dev_get_priv(bus); in omap3_spi_xfer() local
647 return _spi_xfer(priv, bitlen, dout, din, flags); in omap3_spi_xfer()
653 struct omap3_spi_priv *priv = dev_get_priv(bus); in omap3_spi_set_speed() local
656 priv->cs = slave_plat->cs; in omap3_spi_set_speed()
657 priv->freq = slave_plat->max_hz; in omap3_spi_set_speed()
658 _omap3_spi_set_speed(priv); in omap3_spi_set_speed()
666 struct omap3_spi_priv *priv = dev_get_priv(bus); in omap3_spi_set_mode() local
669 priv->cs = slave_plat->cs; in omap3_spi_set_mode()
670 priv->mode = slave_plat->mode; in omap3_spi_set_mode()
671 _omap3_spi_set_mode(priv); in omap3_spi_set_mode()