Lines Matching refs:priv

208 cc2520_cmd_strobe(struct cc2520_private *priv, u8 cmd)  in cc2520_cmd_strobe()  argument
215 .tx_buf = priv->buf, in cc2520_cmd_strobe()
216 .rx_buf = priv->buf, in cc2520_cmd_strobe()
222 mutex_lock(&priv->buffer_mutex); in cc2520_cmd_strobe()
223 priv->buf[xfer.len++] = cmd; in cc2520_cmd_strobe()
224 dev_vdbg(&priv->spi->dev, in cc2520_cmd_strobe()
226 priv->buf[0]); in cc2520_cmd_strobe()
228 ret = spi_sync(priv->spi, &msg); in cc2520_cmd_strobe()
230 status = priv->buf[0]; in cc2520_cmd_strobe()
231 dev_vdbg(&priv->spi->dev, in cc2520_cmd_strobe()
232 "buf[0] = %02x\n", priv->buf[0]); in cc2520_cmd_strobe()
233 mutex_unlock(&priv->buffer_mutex); in cc2520_cmd_strobe()
239 cc2520_get_status(struct cc2520_private *priv, u8 *status) in cc2520_get_status() argument
245 .tx_buf = priv->buf, in cc2520_get_status()
246 .rx_buf = priv->buf, in cc2520_get_status()
252 mutex_lock(&priv->buffer_mutex); in cc2520_get_status()
253 priv->buf[xfer.len++] = CC2520_CMD_SNOP; in cc2520_get_status()
254 dev_vdbg(&priv->spi->dev, in cc2520_get_status()
255 "get status command buf[0] = %02x\n", priv->buf[0]); in cc2520_get_status()
257 ret = spi_sync(priv->spi, &msg); in cc2520_get_status()
259 *status = priv->buf[0]; in cc2520_get_status()
260 dev_vdbg(&priv->spi->dev, in cc2520_get_status()
261 "buf[0] = %02x\n", priv->buf[0]); in cc2520_get_status()
262 mutex_unlock(&priv->buffer_mutex); in cc2520_get_status()
268 cc2520_write_register(struct cc2520_private *priv, u8 reg, u8 value) in cc2520_write_register() argument
274 .tx_buf = priv->buf, in cc2520_write_register()
275 .rx_buf = priv->buf, in cc2520_write_register()
281 mutex_lock(&priv->buffer_mutex); in cc2520_write_register()
284 priv->buf[xfer.len++] = CC2520_CMD_REGISTER_WRITE | reg; in cc2520_write_register()
285 priv->buf[xfer.len++] = value; in cc2520_write_register()
287 priv->buf[xfer.len++] = CC2520_CMD_MEMORY_WRITE; in cc2520_write_register()
288 priv->buf[xfer.len++] = reg; in cc2520_write_register()
289 priv->buf[xfer.len++] = value; in cc2520_write_register()
291 status = spi_sync(priv->spi, &msg); in cc2520_write_register()
295 mutex_unlock(&priv->buffer_mutex); in cc2520_write_register()
301 cc2520_write_ram(struct cc2520_private *priv, u16 reg, u8 len, u8 *data) in cc2520_write_ram() argument
307 .tx_buf = priv->buf, in cc2520_write_ram()
308 .rx_buf = priv->buf, in cc2520_write_ram()
316 mutex_lock(&priv->buffer_mutex); in cc2520_write_ram()
317 priv->buf[xfer_head.len++] = (CC2520_CMD_MEMORY_WRITE | in cc2520_write_ram()
319 priv->buf[xfer_head.len++] = reg & 0xff; in cc2520_write_ram()
325 status = spi_sync(priv->spi, &msg); in cc2520_write_ram()
326 dev_dbg(&priv->spi->dev, "spi status = %d\n", status); in cc2520_write_ram()
330 mutex_unlock(&priv->buffer_mutex); in cc2520_write_ram()
335 cc2520_read_register(struct cc2520_private *priv, u8 reg, u8 *data) in cc2520_read_register() argument
341 .tx_buf = priv->buf, in cc2520_read_register()
342 .rx_buf = priv->buf, in cc2520_read_register()
354 mutex_lock(&priv->buffer_mutex); in cc2520_read_register()
355 priv->buf[xfer1.len++] = CC2520_CMD_MEMORY_READ; in cc2520_read_register()
356 priv->buf[xfer1.len++] = reg; in cc2520_read_register()
358 status = spi_sync(priv->spi, &msg); in cc2520_read_register()
359 dev_dbg(&priv->spi->dev, in cc2520_read_register()
364 mutex_unlock(&priv->buffer_mutex); in cc2520_read_register()
370 cc2520_write_txfifo(struct cc2520_private *priv, u8 *data, u8 len) in cc2520_write_txfifo() argument
383 .tx_buf = priv->buf, in cc2520_write_txfifo()
384 .rx_buf = priv->buf, in cc2520_write_txfifo()
400 mutex_lock(&priv->buffer_mutex); in cc2520_write_txfifo()
401 priv->buf[xfer_head.len++] = CC2520_CMD_TXBUF; in cc2520_write_txfifo()
402 dev_vdbg(&priv->spi->dev, in cc2520_write_txfifo()
403 "TX_FIFO cmd buf[0] = %02x\n", priv->buf[0]); in cc2520_write_txfifo()
405 status = spi_sync(priv->spi, &msg); in cc2520_write_txfifo()
406 dev_vdbg(&priv->spi->dev, "status = %d\n", status); in cc2520_write_txfifo()
409 dev_vdbg(&priv->spi->dev, "status = %d\n", status); in cc2520_write_txfifo()
410 dev_vdbg(&priv->spi->dev, "buf[0] = %02x\n", priv->buf[0]); in cc2520_write_txfifo()
411 mutex_unlock(&priv->buffer_mutex); in cc2520_write_txfifo()
417 cc2520_read_rxfifo(struct cc2520_private *priv, u8 *data, u8 len, u8 *lqi) in cc2520_read_rxfifo() argument
424 .tx_buf = priv->buf, in cc2520_read_rxfifo()
425 .rx_buf = priv->buf, in cc2520_read_rxfifo()
436 mutex_lock(&priv->buffer_mutex); in cc2520_read_rxfifo()
437 priv->buf[xfer_head.len++] = CC2520_CMD_RXBUF; in cc2520_read_rxfifo()
439 dev_vdbg(&priv->spi->dev, "read rxfifo buf[0] = %02x\n", priv->buf[0]); in cc2520_read_rxfifo()
440 dev_vdbg(&priv->spi->dev, "buf[1] = %02x\n", priv->buf[1]); in cc2520_read_rxfifo()
442 status = spi_sync(priv->spi, &msg); in cc2520_read_rxfifo()
443 dev_vdbg(&priv->spi->dev, "status = %d\n", status); in cc2520_read_rxfifo()
446 dev_vdbg(&priv->spi->dev, "status = %d\n", status); in cc2520_read_rxfifo()
447 dev_vdbg(&priv->spi->dev, in cc2520_read_rxfifo()
448 "return status buf[0] = %02x\n", priv->buf[0]); in cc2520_read_rxfifo()
449 dev_vdbg(&priv->spi->dev, "length buf[1] = %02x\n", priv->buf[1]); in cc2520_read_rxfifo()
451 mutex_unlock(&priv->buffer_mutex); in cc2520_read_rxfifo()
458 return cc2520_cmd_strobe(hw->priv, CC2520_CMD_SRXON); in cc2520_start()
463 cc2520_cmd_strobe(hw->priv, CC2520_CMD_SRFOFF); in cc2520_stop()
469 struct cc2520_private *priv = hw->priv; in cc2520_tx() local
474 rc = cc2520_cmd_strobe(priv, CC2520_CMD_SFLUSHTX); in cc2520_tx()
478 rc = cc2520_write_txfifo(priv, skb->data, skb->len); in cc2520_tx()
482 rc = cc2520_get_status(priv, &status); in cc2520_tx()
487 dev_err(&priv->spi->dev, "cc2520 tx underflow exception\n"); in cc2520_tx()
491 spin_lock_irqsave(&priv->lock, flags); in cc2520_tx()
492 BUG_ON(priv->is_tx); in cc2520_tx()
493 priv->is_tx = 1; in cc2520_tx()
494 spin_unlock_irqrestore(&priv->lock, flags); in cc2520_tx()
496 rc = cc2520_cmd_strobe(priv, CC2520_CMD_STXONCCA); in cc2520_tx()
500 rc = wait_for_completion_interruptible(&priv->tx_complete); in cc2520_tx()
504 cc2520_cmd_strobe(priv, CC2520_CMD_SFLUSHTX); in cc2520_tx()
505 cc2520_cmd_strobe(priv, CC2520_CMD_SRXON); in cc2520_tx()
509 spin_lock_irqsave(&priv->lock, flags); in cc2520_tx()
510 priv->is_tx = 0; in cc2520_tx()
511 spin_unlock_irqrestore(&priv->lock, flags); in cc2520_tx()
516 static int cc2520_rx(struct cc2520_private *priv) in cc2520_rx() argument
521 cc2520_read_rxfifo(priv, &len, bytes, &lqi); in cc2520_rx()
530 if (cc2520_read_rxfifo(priv, skb_put(skb, len), len, &lqi)) { in cc2520_rx()
531 dev_dbg(&priv->spi->dev, "frame reception failed\n"); in cc2520_rx()
538 ieee802154_rx_irqsafe(priv->hw, skb, lqi); in cc2520_rx()
540 dev_vdbg(&priv->spi->dev, "RXFIFO: %x %x\n", len, lqi); in cc2520_rx()
548 struct cc2520_private *priv = hw->priv; in cc2520_ed() local
553 ret = cc2520_read_register(priv, CC2520_RSSISTAT, &status); in cc2520_ed()
560 ret = cc2520_read_register(priv, CC2520_RSSI, &rssi); in cc2520_ed()
573 struct cc2520_private *priv = hw->priv; in cc2520_set_channel() local
576 dev_dbg(&priv->spi->dev, "trying to set channel\n"); in cc2520_set_channel()
582 ret = cc2520_write_register(priv, CC2520_FREQCTRL, in cc2520_set_channel()
592 struct cc2520_private *priv = hw->priv; in cc2520_filter() local
598 dev_vdbg(&priv->spi->dev, in cc2520_filter()
600 ret = cc2520_write_ram(priv, CC2520RAM_PANID, in cc2520_filter()
605 dev_vdbg(&priv->spi->dev, in cc2520_filter()
607 ret = cc2520_write_ram(priv, CC2520RAM_IEEEADDR, in cc2520_filter()
615 dev_vdbg(&priv->spi->dev, in cc2520_filter()
617 ret = cc2520_write_ram(priv, CC2520RAM_SHORTADDR, in cc2520_filter()
622 dev_vdbg(&priv->spi->dev, in cc2520_filter()
625 ret = cc2520_write_register(priv, CC2520_FRMFILT0, in cc2520_filter()
628 ret = cc2520_write_register(priv, CC2520_FRMFILT0, in cc2520_filter()
635 static inline int cc2520_set_tx_power(struct cc2520_private *priv, s32 mbm) in cc2520_set_tx_power() argument
671 return cc2520_write_register(priv, CC2520_TXPOWER, power); in cc2520_set_tx_power()
674 static inline int cc2520_cc2591_set_tx_power(struct cc2520_private *priv, in cc2520_cc2591_set_tx_power() argument
702 return cc2520_write_register(priv, CC2520_TXPOWER, power); in cc2520_cc2591_set_tx_power()
718 struct cc2520_private *priv = hw->priv; in cc2520_set_txpower() local
720 if (!priv->amplified) in cc2520_set_txpower()
721 return cc2520_set_tx_power(priv, mbm); in cc2520_set_txpower()
723 return cc2520_cc2591_set_tx_power(priv, mbm); in cc2520_set_txpower()
737 static int cc2520_register(struct cc2520_private *priv) in cc2520_register() argument
741 priv->hw = ieee802154_alloc_hw(sizeof(*priv), &cc2520_ops); in cc2520_register()
742 if (!priv->hw) in cc2520_register()
745 priv->hw->priv = priv; in cc2520_register()
746 priv->hw->parent = &priv->spi->dev; in cc2520_register()
747 priv->hw->extra_tx_headroom = 0; in cc2520_register()
748 ieee802154_random_extended_addr(&priv->hw->phy->perm_extended_addr); in cc2520_register()
751 priv->hw->phy->supported.channels[0] = 0x7FFF800; in cc2520_register()
752 priv->hw->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AFILT; in cc2520_register()
754 priv->hw->phy->flags = WPAN_PHY_FLAG_TXPOWER; in cc2520_register()
756 if (!priv->amplified) { in cc2520_register()
757 priv->hw->phy->supported.tx_powers = cc2520_powers; in cc2520_register()
758 priv->hw->phy->supported.tx_powers_size = ARRAY_SIZE(cc2520_powers); in cc2520_register()
759 priv->hw->phy->transmit_power = priv->hw->phy->supported.tx_powers[4]; in cc2520_register()
761 priv->hw->phy->supported.tx_powers = cc2520_cc2591_powers; in cc2520_register()
762 priv->hw->phy->supported.tx_powers_size = ARRAY_SIZE(cc2520_cc2591_powers); in cc2520_register()
763 priv->hw->phy->transmit_power = priv->hw->phy->supported.tx_powers[0]; in cc2520_register()
766 priv->hw->phy->current_channel = 11; in cc2520_register()
768 dev_vdbg(&priv->spi->dev, "registered cc2520\n"); in cc2520_register()
769 ret = ieee802154_register_hw(priv->hw); in cc2520_register()
776 ieee802154_free_hw(priv->hw); in cc2520_register()
783 struct cc2520_private *priv in cc2520_fifop_irqwork() local
786 dev_dbg(&priv->spi->dev, "fifop interrupt received\n"); in cc2520_fifop_irqwork()
788 if (gpio_get_value(priv->fifo_pin)) in cc2520_fifop_irqwork()
789 cc2520_rx(priv); in cc2520_fifop_irqwork()
791 dev_dbg(&priv->spi->dev, "rxfifo overflow\n"); in cc2520_fifop_irqwork()
793 cc2520_cmd_strobe(priv, CC2520_CMD_SFLUSHRX); in cc2520_fifop_irqwork()
794 cc2520_cmd_strobe(priv, CC2520_CMD_SFLUSHRX); in cc2520_fifop_irqwork()
799 struct cc2520_private *priv = data; in cc2520_fifop_isr() local
801 schedule_work(&priv->fifop_irqwork); in cc2520_fifop_isr()
808 struct cc2520_private *priv = data; in cc2520_sfd_isr() local
811 spin_lock_irqsave(&priv->lock, flags); in cc2520_sfd_isr()
812 if (priv->is_tx) { in cc2520_sfd_isr()
813 priv->is_tx = 0; in cc2520_sfd_isr()
814 spin_unlock_irqrestore(&priv->lock, flags); in cc2520_sfd_isr()
815 dev_dbg(&priv->spi->dev, "SFD for TX\n"); in cc2520_sfd_isr()
816 complete(&priv->tx_complete); in cc2520_sfd_isr()
818 spin_unlock_irqrestore(&priv->lock, flags); in cc2520_sfd_isr()
819 dev_dbg(&priv->spi->dev, "SFD for RX\n"); in cc2520_sfd_isr()
829 struct cc2520_private *priv = spi_get_drvdata(spi); in cc2520_get_platform_data() local
836 priv->fifo_pin = pdata->fifo; in cc2520_get_platform_data()
841 priv->fifo_pin = pdata->fifo; in cc2520_get_platform_data()
852 priv->amplified = true; in cc2520_get_platform_data()
857 static int cc2520_hw_init(struct cc2520_private *priv) in cc2520_hw_init() argument
864 ret = cc2520_get_platform_data(priv->spi, &pdata); in cc2520_hw_init()
868 ret = cc2520_read_register(priv, CC2520_FSMSTAT1, &state); in cc2520_hw_init()
876 ret = cc2520_get_status(priv, &status); in cc2520_hw_init()
881 dev_err(&priv->spi->dev, "oscillator start failed!\n"); in cc2520_hw_init()
887 dev_vdbg(&priv->spi->dev, "oscillator brought up\n"); in cc2520_hw_init()
895 if (priv->amplified) { in cc2520_hw_init()
896 ret = cc2520_write_register(priv, CC2520_AGCCTRL1, 0x16); in cc2520_hw_init()
900 ret = cc2520_write_register(priv, CC2520_GPIOCTRL0, 0x46); in cc2520_hw_init()
904 ret = cc2520_write_register(priv, CC2520_GPIOCTRL5, 0x47); in cc2520_hw_init()
908 ret = cc2520_write_register(priv, CC2520_GPIOPOLARITY, 0x1e); in cc2520_hw_init()
912 ret = cc2520_write_register(priv, CC2520_TXCTRL, 0xc1); in cc2520_hw_init()
916 ret = cc2520_write_register(priv, CC2520_AGCCTRL1, 0x11); in cc2520_hw_init()
922 ret = cc2520_write_register(priv, CC2520_CCACTRL0, 0x1A); in cc2520_hw_init()
926 ret = cc2520_write_register(priv, CC2520_MDMCTRL0, 0x85); in cc2520_hw_init()
930 ret = cc2520_write_register(priv, CC2520_MDMCTRL1, 0x14); in cc2520_hw_init()
934 ret = cc2520_write_register(priv, CC2520_RXCTRL, 0x3f); in cc2520_hw_init()
938 ret = cc2520_write_register(priv, CC2520_FSCTRL, 0x5a); in cc2520_hw_init()
942 ret = cc2520_write_register(priv, CC2520_FSCAL1, 0x2b); in cc2520_hw_init()
946 ret = cc2520_write_register(priv, CC2520_ADCTEST0, 0x10); in cc2520_hw_init()
950 ret = cc2520_write_register(priv, CC2520_ADCTEST1, 0x0e); in cc2520_hw_init()
954 ret = cc2520_write_register(priv, CC2520_ADCTEST2, 0x03); in cc2520_hw_init()
958 ret = cc2520_write_register(priv, CC2520_FRMCTRL0, 0x60); in cc2520_hw_init()
962 ret = cc2520_write_register(priv, CC2520_FRMCTRL1, 0x03); in cc2520_hw_init()
966 ret = cc2520_write_register(priv, CC2520_FRMFILT0, 0x00); in cc2520_hw_init()
970 ret = cc2520_write_register(priv, CC2520_FIFOPCTRL, 127); in cc2520_hw_init()
982 struct cc2520_private *priv; in cc2520_probe() local
986 priv = devm_kzalloc(&spi->dev, sizeof(*priv), GFP_KERNEL); in cc2520_probe()
987 if (!priv) in cc2520_probe()
990 spi_set_drvdata(spi, priv); in cc2520_probe()
998 priv->spi = spi; in cc2520_probe()
1000 priv->buf = devm_kzalloc(&spi->dev, in cc2520_probe()
1002 if (!priv->buf) in cc2520_probe()
1005 mutex_init(&priv->buffer_mutex); in cc2520_probe()
1006 INIT_WORK(&priv->fifop_irqwork, cc2520_fifop_irqwork); in cc2520_probe()
1007 spin_lock_init(&priv->lock); in cc2520_probe()
1008 init_completion(&priv->tx_complete); in cc2520_probe()
1011 priv->amplified = false; in cc2520_probe()
1086 ret = cc2520_hw_init(priv); in cc2520_probe()
1096 priv); in cc2520_probe()
1108 priv); in cc2520_probe()
1114 ret = cc2520_register(priv); in cc2520_probe()
1121 mutex_destroy(&priv->buffer_mutex); in cc2520_probe()
1122 flush_work(&priv->fifop_irqwork); in cc2520_probe()
1128 struct cc2520_private *priv = spi_get_drvdata(spi); in cc2520_remove() local
1130 mutex_destroy(&priv->buffer_mutex); in cc2520_remove()
1131 flush_work(&priv->fifop_irqwork); in cc2520_remove()
1133 ieee802154_unregister_hw(priv->hw); in cc2520_remove()
1134 ieee802154_free_hw(priv->hw); in cc2520_remove()