Lines Matching refs:priv

207 cc2520_cmd_strobe(struct cc2520_private *priv, u8 cmd)  in cc2520_cmd_strobe()  argument
214 .tx_buf = priv->buf, in cc2520_cmd_strobe()
215 .rx_buf = priv->buf, in cc2520_cmd_strobe()
221 mutex_lock(&priv->buffer_mutex); in cc2520_cmd_strobe()
222 priv->buf[xfer.len++] = cmd; in cc2520_cmd_strobe()
223 dev_vdbg(&priv->spi->dev, in cc2520_cmd_strobe()
225 priv->buf[0]); in cc2520_cmd_strobe()
227 ret = spi_sync(priv->spi, &msg); in cc2520_cmd_strobe()
229 status = priv->buf[0]; in cc2520_cmd_strobe()
230 dev_vdbg(&priv->spi->dev, in cc2520_cmd_strobe()
231 "buf[0] = %02x\n", priv->buf[0]); in cc2520_cmd_strobe()
232 mutex_unlock(&priv->buffer_mutex); in cc2520_cmd_strobe()
238 cc2520_get_status(struct cc2520_private *priv, u8 *status) in cc2520_get_status() argument
244 .tx_buf = priv->buf, in cc2520_get_status()
245 .rx_buf = priv->buf, in cc2520_get_status()
251 mutex_lock(&priv->buffer_mutex); in cc2520_get_status()
252 priv->buf[xfer.len++] = CC2520_CMD_SNOP; in cc2520_get_status()
253 dev_vdbg(&priv->spi->dev, in cc2520_get_status()
254 "get status command buf[0] = %02x\n", priv->buf[0]); in cc2520_get_status()
256 ret = spi_sync(priv->spi, &msg); in cc2520_get_status()
258 *status = priv->buf[0]; in cc2520_get_status()
259 dev_vdbg(&priv->spi->dev, in cc2520_get_status()
260 "buf[0] = %02x\n", priv->buf[0]); in cc2520_get_status()
261 mutex_unlock(&priv->buffer_mutex); in cc2520_get_status()
267 cc2520_write_register(struct cc2520_private *priv, u8 reg, u8 value) in cc2520_write_register() argument
273 .tx_buf = priv->buf, in cc2520_write_register()
274 .rx_buf = priv->buf, in cc2520_write_register()
280 mutex_lock(&priv->buffer_mutex); in cc2520_write_register()
283 priv->buf[xfer.len++] = CC2520_CMD_REGISTER_WRITE | reg; in cc2520_write_register()
284 priv->buf[xfer.len++] = value; in cc2520_write_register()
286 priv->buf[xfer.len++] = CC2520_CMD_MEMORY_WRITE; in cc2520_write_register()
287 priv->buf[xfer.len++] = reg; in cc2520_write_register()
288 priv->buf[xfer.len++] = value; in cc2520_write_register()
290 status = spi_sync(priv->spi, &msg); in cc2520_write_register()
294 mutex_unlock(&priv->buffer_mutex); in cc2520_write_register()
300 cc2520_write_ram(struct cc2520_private *priv, u16 reg, u8 len, u8 *data) in cc2520_write_ram() argument
306 .tx_buf = priv->buf, in cc2520_write_ram()
307 .rx_buf = priv->buf, in cc2520_write_ram()
315 mutex_lock(&priv->buffer_mutex); in cc2520_write_ram()
316 priv->buf[xfer_head.len++] = (CC2520_CMD_MEMORY_WRITE | in cc2520_write_ram()
318 priv->buf[xfer_head.len++] = reg & 0xff; in cc2520_write_ram()
324 status = spi_sync(priv->spi, &msg); in cc2520_write_ram()
325 dev_dbg(&priv->spi->dev, "spi status = %d\n", status); in cc2520_write_ram()
329 mutex_unlock(&priv->buffer_mutex); in cc2520_write_ram()
334 cc2520_read_register(struct cc2520_private *priv, u8 reg, u8 *data) in cc2520_read_register() argument
340 .tx_buf = priv->buf, in cc2520_read_register()
341 .rx_buf = priv->buf, in cc2520_read_register()
353 mutex_lock(&priv->buffer_mutex); in cc2520_read_register()
354 priv->buf[xfer1.len++] = CC2520_CMD_MEMORY_READ; in cc2520_read_register()
355 priv->buf[xfer1.len++] = reg; in cc2520_read_register()
357 status = spi_sync(priv->spi, &msg); in cc2520_read_register()
358 dev_dbg(&priv->spi->dev, in cc2520_read_register()
363 mutex_unlock(&priv->buffer_mutex); in cc2520_read_register()
369 cc2520_write_txfifo(struct cc2520_private *priv, u8 *data, u8 len) in cc2520_write_txfifo() argument
382 .tx_buf = priv->buf, in cc2520_write_txfifo()
383 .rx_buf = priv->buf, in cc2520_write_txfifo()
399 mutex_lock(&priv->buffer_mutex); in cc2520_write_txfifo()
400 priv->buf[xfer_head.len++] = CC2520_CMD_TXBUF; in cc2520_write_txfifo()
401 dev_vdbg(&priv->spi->dev, in cc2520_write_txfifo()
402 "TX_FIFO cmd buf[0] = %02x\n", priv->buf[0]); in cc2520_write_txfifo()
404 status = spi_sync(priv->spi, &msg); in cc2520_write_txfifo()
405 dev_vdbg(&priv->spi->dev, "status = %d\n", status); in cc2520_write_txfifo()
408 dev_vdbg(&priv->spi->dev, "status = %d\n", status); in cc2520_write_txfifo()
409 dev_vdbg(&priv->spi->dev, "buf[0] = %02x\n", priv->buf[0]); in cc2520_write_txfifo()
410 mutex_unlock(&priv->buffer_mutex); in cc2520_write_txfifo()
416 cc2520_read_rxfifo(struct cc2520_private *priv, u8 *data, u8 len, u8 *lqi) in cc2520_read_rxfifo() argument
423 .tx_buf = priv->buf, in cc2520_read_rxfifo()
424 .rx_buf = priv->buf, in cc2520_read_rxfifo()
435 mutex_lock(&priv->buffer_mutex); in cc2520_read_rxfifo()
436 priv->buf[xfer_head.len++] = CC2520_CMD_RXBUF; in cc2520_read_rxfifo()
438 dev_vdbg(&priv->spi->dev, "read rxfifo buf[0] = %02x\n", priv->buf[0]); in cc2520_read_rxfifo()
439 dev_vdbg(&priv->spi->dev, "buf[1] = %02x\n", priv->buf[1]); in cc2520_read_rxfifo()
441 status = spi_sync(priv->spi, &msg); in cc2520_read_rxfifo()
442 dev_vdbg(&priv->spi->dev, "status = %d\n", status); in cc2520_read_rxfifo()
445 dev_vdbg(&priv->spi->dev, "status = %d\n", status); in cc2520_read_rxfifo()
446 dev_vdbg(&priv->spi->dev, in cc2520_read_rxfifo()
447 "return status buf[0] = %02x\n", priv->buf[0]); in cc2520_read_rxfifo()
448 dev_vdbg(&priv->spi->dev, "length buf[1] = %02x\n", priv->buf[1]); in cc2520_read_rxfifo()
450 mutex_unlock(&priv->buffer_mutex); in cc2520_read_rxfifo()
457 return cc2520_cmd_strobe(hw->priv, CC2520_CMD_SRXON); in cc2520_start()
462 cc2520_cmd_strobe(hw->priv, CC2520_CMD_SRFOFF); in cc2520_stop()
468 struct cc2520_private *priv = hw->priv; in cc2520_tx() local
473 rc = cc2520_cmd_strobe(priv, CC2520_CMD_SFLUSHTX); in cc2520_tx()
477 rc = cc2520_write_txfifo(priv, skb->data, skb->len); in cc2520_tx()
481 rc = cc2520_get_status(priv, &status); in cc2520_tx()
486 dev_err(&priv->spi->dev, "cc2520 tx underflow exception\n"); in cc2520_tx()
490 spin_lock_irqsave(&priv->lock, flags); in cc2520_tx()
491 BUG_ON(priv->is_tx); in cc2520_tx()
492 priv->is_tx = 1; in cc2520_tx()
493 spin_unlock_irqrestore(&priv->lock, flags); in cc2520_tx()
495 rc = cc2520_cmd_strobe(priv, CC2520_CMD_STXONCCA); in cc2520_tx()
499 rc = wait_for_completion_interruptible(&priv->tx_complete); in cc2520_tx()
503 cc2520_cmd_strobe(priv, CC2520_CMD_SFLUSHTX); in cc2520_tx()
504 cc2520_cmd_strobe(priv, CC2520_CMD_SRXON); in cc2520_tx()
508 spin_lock_irqsave(&priv->lock, flags); in cc2520_tx()
509 priv->is_tx = 0; in cc2520_tx()
510 spin_unlock_irqrestore(&priv->lock, flags); in cc2520_tx()
515 static int cc2520_rx(struct cc2520_private *priv) in cc2520_rx() argument
520 cc2520_read_rxfifo(priv, &len, bytes, &lqi); in cc2520_rx()
529 if (cc2520_read_rxfifo(priv, skb_put(skb, len), len, &lqi)) { in cc2520_rx()
530 dev_dbg(&priv->spi->dev, "frame reception failed\n"); in cc2520_rx()
537 ieee802154_rx_irqsafe(priv->hw, skb, lqi); in cc2520_rx()
539 dev_vdbg(&priv->spi->dev, "RXFIFO: %x %x\n", len, lqi); in cc2520_rx()
547 struct cc2520_private *priv = hw->priv; in cc2520_ed() local
552 ret = cc2520_read_register(priv, CC2520_RSSISTAT, &status); in cc2520_ed()
559 ret = cc2520_read_register(priv, CC2520_RSSI, &rssi); in cc2520_ed()
572 struct cc2520_private *priv = hw->priv; in cc2520_set_channel() local
575 dev_dbg(&priv->spi->dev, "trying to set channel\n"); in cc2520_set_channel()
581 ret = cc2520_write_register(priv, CC2520_FREQCTRL, in cc2520_set_channel()
591 struct cc2520_private *priv = hw->priv; in cc2520_filter() local
596 dev_vdbg(&priv->spi->dev, in cc2520_filter()
598 cc2520_write_ram(priv, CC2520RAM_PANID, in cc2520_filter()
603 dev_vdbg(&priv->spi->dev, in cc2520_filter()
605 cc2520_write_ram(priv, CC2520RAM_IEEEADDR, in cc2520_filter()
613 dev_vdbg(&priv->spi->dev, in cc2520_filter()
615 cc2520_write_ram(priv, CC2520RAM_SHORTADDR, in cc2520_filter()
620 dev_vdbg(&priv->spi->dev, in cc2520_filter()
623 cc2520_write_register(priv, CC2520_FRMFILT0, 0x02); in cc2520_filter()
625 cc2520_write_register(priv, CC2520_FRMFILT0, 0x00); in cc2520_filter()
641 static int cc2520_register(struct cc2520_private *priv) in cc2520_register() argument
645 priv->hw = ieee802154_alloc_hw(sizeof(*priv), &cc2520_ops); in cc2520_register()
646 if (!priv->hw) in cc2520_register()
649 priv->hw->priv = priv; in cc2520_register()
650 priv->hw->parent = &priv->spi->dev; in cc2520_register()
651 priv->hw->extra_tx_headroom = 0; in cc2520_register()
652 priv->hw->vif_data_size = sizeof(*priv); in cc2520_register()
653 ieee802154_random_extended_addr(&priv->hw->phy->perm_extended_addr); in cc2520_register()
656 priv->hw->phy->channels_supported[0] = 0x7FFF800; in cc2520_register()
657 priv->hw->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AACK | in cc2520_register()
660 dev_vdbg(&priv->spi->dev, "registered cc2520\n"); in cc2520_register()
661 ret = ieee802154_register_hw(priv->hw); in cc2520_register()
668 ieee802154_free_hw(priv->hw); in cc2520_register()
675 struct cc2520_private *priv in cc2520_fifop_irqwork() local
678 dev_dbg(&priv->spi->dev, "fifop interrupt received\n"); in cc2520_fifop_irqwork()
680 if (gpio_get_value(priv->fifo_pin)) in cc2520_fifop_irqwork()
681 cc2520_rx(priv); in cc2520_fifop_irqwork()
683 dev_dbg(&priv->spi->dev, "rxfifo overflow\n"); in cc2520_fifop_irqwork()
685 cc2520_cmd_strobe(priv, CC2520_CMD_SFLUSHRX); in cc2520_fifop_irqwork()
686 cc2520_cmd_strobe(priv, CC2520_CMD_SFLUSHRX); in cc2520_fifop_irqwork()
691 struct cc2520_private *priv = data; in cc2520_fifop_isr() local
693 schedule_work(&priv->fifop_irqwork); in cc2520_fifop_isr()
700 struct cc2520_private *priv = data; in cc2520_sfd_isr() local
703 spin_lock_irqsave(&priv->lock, flags); in cc2520_sfd_isr()
704 if (priv->is_tx) { in cc2520_sfd_isr()
705 priv->is_tx = 0; in cc2520_sfd_isr()
706 spin_unlock_irqrestore(&priv->lock, flags); in cc2520_sfd_isr()
707 dev_dbg(&priv->spi->dev, "SFD for TX\n"); in cc2520_sfd_isr()
708 complete(&priv->tx_complete); in cc2520_sfd_isr()
710 spin_unlock_irqrestore(&priv->lock, flags); in cc2520_sfd_isr()
711 dev_dbg(&priv->spi->dev, "SFD for RX\n"); in cc2520_sfd_isr()
721 struct cc2520_private *priv = spi_get_drvdata(spi); in cc2520_get_platform_data() local
732 priv->fifo_pin = pdata->fifo; in cc2520_get_platform_data()
746 static int cc2520_hw_init(struct cc2520_private *priv) in cc2520_hw_init() argument
753 ret = cc2520_get_platform_data(priv->spi, &pdata); in cc2520_hw_init()
757 ret = cc2520_read_register(priv, CC2520_FSMSTAT1, &state); in cc2520_hw_init()
765 ret = cc2520_get_status(priv, &status); in cc2520_hw_init()
770 dev_err(&priv->spi->dev, "oscillator start failed!\n"); in cc2520_hw_init()
776 dev_vdbg(&priv->spi->dev, "oscillator brought up\n"); in cc2520_hw_init()
785 ret = cc2520_write_register(priv, CC2520_TXPOWER, 0xF9); in cc2520_hw_init()
789 ret = cc2520_write_register(priv, CC2520_AGCCTRL1, 0x16); in cc2520_hw_init()
793 ret = cc2520_write_register(priv, CC2520_GPIOCTRL0, 0x46); in cc2520_hw_init()
797 ret = cc2520_write_register(priv, CC2520_GPIOCTRL5, 0x47); in cc2520_hw_init()
801 ret = cc2520_write_register(priv, CC2520_GPIOPOLARITY, 0x1e); in cc2520_hw_init()
805 ret = cc2520_write_register(priv, CC2520_TXCTRL, 0xc1); in cc2520_hw_init()
809 ret = cc2520_write_register(priv, CC2520_TXPOWER, 0xF7); in cc2520_hw_init()
813 ret = cc2520_write_register(priv, CC2520_AGCCTRL1, 0x11); in cc2520_hw_init()
819 ret = cc2520_write_register(priv, CC2520_CCACTRL0, 0x1A); in cc2520_hw_init()
823 ret = cc2520_write_register(priv, CC2520_MDMCTRL0, 0x85); in cc2520_hw_init()
827 ret = cc2520_write_register(priv, CC2520_MDMCTRL1, 0x14); in cc2520_hw_init()
831 ret = cc2520_write_register(priv, CC2520_RXCTRL, 0x3f); in cc2520_hw_init()
835 ret = cc2520_write_register(priv, CC2520_FSCTRL, 0x5a); in cc2520_hw_init()
839 ret = cc2520_write_register(priv, CC2520_FSCAL1, 0x2b); in cc2520_hw_init()
843 ret = cc2520_write_register(priv, CC2520_ADCTEST0, 0x10); in cc2520_hw_init()
847 ret = cc2520_write_register(priv, CC2520_ADCTEST1, 0x0e); in cc2520_hw_init()
851 ret = cc2520_write_register(priv, CC2520_ADCTEST2, 0x03); in cc2520_hw_init()
855 ret = cc2520_write_register(priv, CC2520_FRMCTRL0, 0x60); in cc2520_hw_init()
859 ret = cc2520_write_register(priv, CC2520_FRMCTRL1, 0x03); in cc2520_hw_init()
863 ret = cc2520_write_register(priv, CC2520_FRMFILT0, 0x00); in cc2520_hw_init()
867 ret = cc2520_write_register(priv, CC2520_FIFOPCTRL, 127); in cc2520_hw_init()
879 struct cc2520_private *priv; in cc2520_probe() local
883 priv = devm_kzalloc(&spi->dev, sizeof(*priv), GFP_KERNEL); in cc2520_probe()
884 if (!priv) in cc2520_probe()
887 spi_set_drvdata(spi, priv); in cc2520_probe()
895 priv->spi = spi; in cc2520_probe()
897 priv->buf = devm_kzalloc(&spi->dev, in cc2520_probe()
899 if (!priv->buf) in cc2520_probe()
902 mutex_init(&priv->buffer_mutex); in cc2520_probe()
903 INIT_WORK(&priv->fifop_irqwork, cc2520_fifop_irqwork); in cc2520_probe()
904 spin_lock_init(&priv->lock); in cc2520_probe()
905 init_completion(&priv->tx_complete); in cc2520_probe()
980 ret = cc2520_hw_init(priv); in cc2520_probe()
990 priv); in cc2520_probe()
1002 priv); in cc2520_probe()
1008 ret = cc2520_register(priv); in cc2520_probe()
1015 mutex_destroy(&priv->buffer_mutex); in cc2520_probe()
1016 flush_work(&priv->fifop_irqwork); in cc2520_probe()
1022 struct cc2520_private *priv = spi_get_drvdata(spi); in cc2520_remove() local
1024 mutex_destroy(&priv->buffer_mutex); in cc2520_remove()
1025 flush_work(&priv->fifop_irqwork); in cc2520_remove()
1027 ieee802154_unregister_hw(priv->hw); in cc2520_remove()
1028 ieee802154_free_hw(priv->hw); in cc2520_remove()