at86rf230.c (4ca24aca55fe1e2a61f3ffaac9015d9c45204729) at86rf230.c (5a50439775853a8d565115edb63a5ab4bb780479)
1/*
2 * AT86RF230/RF231 driver
3 *
4 * Copyright (C) 2009-2012 Siemens AG
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2
8 * as published by the Free Software Foundation.

--- 63 unchanged lines hidden (view full) ---

72 u8 to_state;
73
74 bool irq_enable;
75};
76
77struct at86rf230_local {
78 struct spi_device *spi;
79
1/*
2 * AT86RF230/RF231 driver
3 *
4 * Copyright (C) 2009-2012 Siemens AG
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2
8 * as published by the Free Software Foundation.

--- 63 unchanged lines hidden (view full) ---

72 u8 to_state;
73
74 bool irq_enable;
75};
76
77struct at86rf230_local {
78 struct spi_device *spi;
79
80 struct ieee802154_dev *dev;
80 struct ieee802154_hw *hw;
81 struct at86rf2xx_chip_data *data;
82 struct regmap *regmap;
83
84 struct completion state_complete;
85 struct at86rf230_state_change state;
86
87 struct at86rf230_state_change irq;
88

--- 714 unchanged lines hidden (view full) ---

803 return;
804 }
805
806 memcpy(skb_put(skb, len), rx_local_buf, len);
807
808 /* We do not put CRC into the frame */
809 skb_trim(skb, len - 2);
810
81 struct at86rf2xx_chip_data *data;
82 struct regmap *regmap;
83
84 struct completion state_complete;
85 struct at86rf230_state_change state;
86
87 struct at86rf230_state_change irq;
88

--- 714 unchanged lines hidden (view full) ---

803 return;
804 }
805
806 memcpy(skb_put(skb, len), rx_local_buf, len);
807
808 /* We do not put CRC into the frame */
809 skb_trim(skb, len - 2);
810
811 ieee802154_rx_irqsafe(lp->dev, skb, lqi);
811 ieee802154_rx_irqsafe(lp->hw, skb, lqi);
812}
813
814static void
815at86rf230_rx_read_frame_complete(void *context)
816{
817 struct at86rf230_state_change *ctx = context;
818 struct at86rf230_local *lp = ctx->lp;
819 const u8 *buf = lp->irq.buf;

--- 144 unchanged lines hidden (view full) ---

964 struct at86rf230_state_change *ctx = context;
965 struct at86rf230_local *lp = ctx->lp;
966
967 at86rf230_async_state_change(lp, ctx, STATE_TX_ARET_ON,
968 at86rf230_write_frame, false);
969}
970
971static int
812}
813
814static void
815at86rf230_rx_read_frame_complete(void *context)
816{
817 struct at86rf230_state_change *ctx = context;
818 struct at86rf230_local *lp = ctx->lp;
819 const u8 *buf = lp->irq.buf;

--- 144 unchanged lines hidden (view full) ---

964 struct at86rf230_state_change *ctx = context;
965 struct at86rf230_local *lp = ctx->lp;
966
967 at86rf230_async_state_change(lp, ctx, STATE_TX_ARET_ON,
968 at86rf230_write_frame, false);
969}
970
971static int
972at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb)
972at86rf230_xmit(struct ieee802154_hw *hw, struct sk_buff *skb)
973{
973{
974 struct at86rf230_local *lp = dev->priv;
974 struct at86rf230_local *lp = hw->priv;
975 struct at86rf230_state_change *ctx = &lp->tx;
976
977 void (*tx_complete)(void *context) = at86rf230_write_frame;
978 int rc;
979
980 lp->tx_skb = skb;
981
982 /* In ARET mode we need to go into STATE_TX_ARET_ON after we

--- 24 unchanged lines hidden (view full) ---

1007 usleep_range(lp->data->t_lifs, lp->data->t_lifs + 10);
1008 else
1009 usleep_range(lp->data->t_sifs, lp->data->t_sifs + 10);
1010
1011 return 0;
1012}
1013
1014static int
975 struct at86rf230_state_change *ctx = &lp->tx;
976
977 void (*tx_complete)(void *context) = at86rf230_write_frame;
978 int rc;
979
980 lp->tx_skb = skb;
981
982 /* In ARET mode we need to go into STATE_TX_ARET_ON after we

--- 24 unchanged lines hidden (view full) ---

1007 usleep_range(lp->data->t_lifs, lp->data->t_lifs + 10);
1008 else
1009 usleep_range(lp->data->t_sifs, lp->data->t_sifs + 10);
1010
1011 return 0;
1012}
1013
1014static int
1015at86rf230_ed(struct ieee802154_dev *dev, u8 *level)
1015at86rf230_ed(struct ieee802154_hw *hw, u8 *level)
1016{
1017 might_sleep();
1018 BUG_ON(!level);
1019 *level = 0xbe;
1020 return 0;
1021}
1022
1023static int
1016{
1017 might_sleep();
1018 BUG_ON(!level);
1019 *level = 0xbe;
1020 return 0;
1021}
1022
1023static int
1024at86rf230_start(struct ieee802154_dev *dev)
1024at86rf230_start(struct ieee802154_hw *hw)
1025{
1025{
1026 return at86rf230_sync_state_change(dev->priv, STATE_RX_AACK_ON);
1026 return at86rf230_sync_state_change(hw->priv, STATE_RX_AACK_ON);
1027}
1028
1029static void
1027}
1028
1029static void
1030at86rf230_stop(struct ieee802154_dev *dev)
1030at86rf230_stop(struct ieee802154_hw *hw)
1031{
1031{
1032 at86rf230_sync_state_change(dev->priv, STATE_FORCE_TRX_OFF);
1032 at86rf230_sync_state_change(hw->priv, STATE_FORCE_TRX_OFF);
1033}
1034
1035static int
1036at86rf23x_set_channel(struct at86rf230_local *lp, int page, int channel)
1037{
1038 return at86rf230_write_subreg(lp, SR_CHANNEL, channel);
1039}
1040

--- 18 unchanged lines hidden (view full) ---

1059 }
1060 if (rc < 0)
1061 return rc;
1062
1063 return at86rf230_write_subreg(lp, SR_CHANNEL, channel);
1064}
1065
1066static int
1033}
1034
1035static int
1036at86rf23x_set_channel(struct at86rf230_local *lp, int page, int channel)
1037{
1038 return at86rf230_write_subreg(lp, SR_CHANNEL, channel);
1039}
1040

--- 18 unchanged lines hidden (view full) ---

1059 }
1060 if (rc < 0)
1061 return rc;
1062
1063 return at86rf230_write_subreg(lp, SR_CHANNEL, channel);
1064}
1065
1066static int
1067at86rf230_channel(struct ieee802154_dev *dev, int page, int channel)
1067at86rf230_channel(struct ieee802154_hw *hw, int page, int channel)
1068{
1068{
1069 struct at86rf230_local *lp = dev->priv;
1069 struct at86rf230_local *lp = hw->priv;
1070 int rc;
1071
1072 might_sleep();
1073
1074 if (page < 0 || page > 31 ||
1070 int rc;
1071
1072 might_sleep();
1073
1074 if (page < 0 || page > 31 ||
1075 !(lp->dev->phy->channels_supported[page] & BIT(channel))) {
1075 !(lp->hw->phy->channels_supported[page] & BIT(channel))) {
1076 WARN_ON(1);
1077 return -EINVAL;
1078 }
1079
1080 rc = lp->data->set_channel(lp, page, channel);
1081 if (rc < 0)
1082 return rc;
1083
1084 /* Wait for PLL */
1085 usleep_range(lp->data->t_channel_switch,
1086 lp->data->t_channel_switch + 10);
1076 WARN_ON(1);
1077 return -EINVAL;
1078 }
1079
1080 rc = lp->data->set_channel(lp, page, channel);
1081 if (rc < 0)
1082 return rc;
1083
1084 /* Wait for PLL */
1085 usleep_range(lp->data->t_channel_switch,
1086 lp->data->t_channel_switch + 10);
1087 dev->phy->current_channel = channel;
1088 dev->phy->current_page = page;
1087 hw->phy->current_channel = channel;
1088 hw->phy->current_page = page;
1089
1090 return 0;
1091}
1092
1093static int
1089
1090 return 0;
1091}
1092
1093static int
1094at86rf230_set_hw_addr_filt(struct ieee802154_dev *dev,
1094at86rf230_set_hw_addr_filt(struct ieee802154_hw *hw,
1095 struct ieee802154_hw_addr_filt *filt,
1096 unsigned long changed)
1097{
1095 struct ieee802154_hw_addr_filt *filt,
1096 unsigned long changed)
1097{
1098 struct at86rf230_local *lp = dev->priv;
1098 struct at86rf230_local *lp = hw->priv;
1099
1100 if (changed & IEEE802154_AFILT_SADDR_CHANGED) {
1101 u16 addr = le16_to_cpu(filt->short_addr);
1102
1103 dev_vdbg(&lp->spi->dev,
1104 "at86rf230_set_hw_addr_filt called for saddr\n");
1105 __at86rf230_write(lp, RG_SHORT_ADDR_0, addr);
1106 __at86rf230_write(lp, RG_SHORT_ADDR_1, addr >> 8);

--- 26 unchanged lines hidden (view full) ---

1133 else
1134 at86rf230_write_subreg(lp, SR_AACK_I_AM_COORD, 0);
1135 }
1136
1137 return 0;
1138}
1139
1140static int
1099
1100 if (changed & IEEE802154_AFILT_SADDR_CHANGED) {
1101 u16 addr = le16_to_cpu(filt->short_addr);
1102
1103 dev_vdbg(&lp->spi->dev,
1104 "at86rf230_set_hw_addr_filt called for saddr\n");
1105 __at86rf230_write(lp, RG_SHORT_ADDR_0, addr);
1106 __at86rf230_write(lp, RG_SHORT_ADDR_1, addr >> 8);

--- 26 unchanged lines hidden (view full) ---

1133 else
1134 at86rf230_write_subreg(lp, SR_AACK_I_AM_COORD, 0);
1135 }
1136
1137 return 0;
1138}
1139
1140static int
1141at86rf230_set_txpower(struct ieee802154_dev *dev, int db)
1141at86rf230_set_txpower(struct ieee802154_hw *hw, int db)
1142{
1142{
1143 struct at86rf230_local *lp = dev->priv;
1143 struct at86rf230_local *lp = hw->priv;
1144
1145 /* typical maximum output is 5dBm with RG_PHY_TX_PWR 0x60, lower five
1146 * bits decrease power in 1dB steps. 0x60 represents extra PA gain of
1147 * 0dB.
1148 * thus, supported values for db range from -26 to 5, for 31dB of
1149 * reduction to 0dB of reduction.
1150 */
1151 if (db > 5 || db < -26)
1152 return -EINVAL;
1153
1154 db = -(db - 5);
1155
1156 return __at86rf230_write(lp, RG_PHY_TX_PWR, 0x60 | db);
1157}
1158
1159static int
1144
1145 /* typical maximum output is 5dBm with RG_PHY_TX_PWR 0x60, lower five
1146 * bits decrease power in 1dB steps. 0x60 represents extra PA gain of
1147 * 0dB.
1148 * thus, supported values for db range from -26 to 5, for 31dB of
1149 * reduction to 0dB of reduction.
1150 */
1151 if (db > 5 || db < -26)
1152 return -EINVAL;
1153
1154 db = -(db - 5);
1155
1156 return __at86rf230_write(lp, RG_PHY_TX_PWR, 0x60 | db);
1157}
1158
1159static int
1160at86rf230_set_lbt(struct ieee802154_dev *dev, bool on)
1160at86rf230_set_lbt(struct ieee802154_hw *hw, bool on)
1161{
1161{
1162 struct at86rf230_local *lp = dev->priv;
1162 struct at86rf230_local *lp = hw->priv;
1163
1164 return at86rf230_write_subreg(lp, SR_CSMA_LBT_MODE, on);
1165}
1166
1167static int
1163
1164 return at86rf230_write_subreg(lp, SR_CSMA_LBT_MODE, on);
1165}
1166
1167static int
1168at86rf230_set_cca_mode(struct ieee802154_dev *dev, u8 mode)
1168at86rf230_set_cca_mode(struct ieee802154_hw *hw, u8 mode)
1169{
1169{
1170 struct at86rf230_local *lp = dev->priv;
1170 struct at86rf230_local *lp = hw->priv;
1171
1172 return at86rf230_write_subreg(lp, SR_CCA_MODE, mode);
1173}
1174
1175static int
1176at86rf212_get_desens_steps(struct at86rf230_local *lp, s32 level)
1177{
1178 return (level - lp->data->rssi_base_val) * 100 / 207;
1179}
1180
1181static int
1182at86rf23x_get_desens_steps(struct at86rf230_local *lp, s32 level)
1183{
1184 return (level - lp->data->rssi_base_val) / 2;
1185}
1186
1187static int
1171
1172 return at86rf230_write_subreg(lp, SR_CCA_MODE, mode);
1173}
1174
1175static int
1176at86rf212_get_desens_steps(struct at86rf230_local *lp, s32 level)
1177{
1178 return (level - lp->data->rssi_base_val) * 100 / 207;
1179}
1180
1181static int
1182at86rf23x_get_desens_steps(struct at86rf230_local *lp, s32 level)
1183{
1184 return (level - lp->data->rssi_base_val) / 2;
1185}
1186
1187static int
1188at86rf230_set_cca_ed_level(struct ieee802154_dev *dev, s32 level)
1188at86rf230_set_cca_ed_level(struct ieee802154_hw *hw, s32 level)
1189{
1189{
1190 struct at86rf230_local *lp = dev->priv;
1190 struct at86rf230_local *lp = hw->priv;
1191
1192 if (level < lp->data->rssi_base_val || level > 30)
1193 return -EINVAL;
1194
1195 return at86rf230_write_subreg(lp, SR_CCA_ED_THRES,
1196 lp->data->get_desense_steps(lp, level));
1197}
1198
1199static int
1191
1192 if (level < lp->data->rssi_base_val || level > 30)
1193 return -EINVAL;
1194
1195 return at86rf230_write_subreg(lp, SR_CCA_ED_THRES,
1196 lp->data->get_desense_steps(lp, level));
1197}
1198
1199static int
1200at86rf230_set_csma_params(struct ieee802154_dev *dev, u8 min_be, u8 max_be,
1200at86rf230_set_csma_params(struct ieee802154_hw *hw, u8 min_be, u8 max_be,
1201 u8 retries)
1202{
1201 u8 retries)
1202{
1203 struct at86rf230_local *lp = dev->priv;
1203 struct at86rf230_local *lp = hw->priv;
1204 int rc;
1205
1206 if (min_be > max_be || max_be > 8 || retries > 5)
1207 return -EINVAL;
1208
1209 rc = at86rf230_write_subreg(lp, SR_MIN_BE, min_be);
1210 if (rc)
1211 return rc;
1212
1213 rc = at86rf230_write_subreg(lp, SR_MAX_BE, max_be);
1214 if (rc)
1215 return rc;
1216
1217 return at86rf230_write_subreg(lp, SR_MAX_CSMA_RETRIES, retries);
1218}
1219
1220static int
1204 int rc;
1205
1206 if (min_be > max_be || max_be > 8 || retries > 5)
1207 return -EINVAL;
1208
1209 rc = at86rf230_write_subreg(lp, SR_MIN_BE, min_be);
1210 if (rc)
1211 return rc;
1212
1213 rc = at86rf230_write_subreg(lp, SR_MAX_BE, max_be);
1214 if (rc)
1215 return rc;
1216
1217 return at86rf230_write_subreg(lp, SR_MAX_CSMA_RETRIES, retries);
1218}
1219
1220static int
1221at86rf230_set_frame_retries(struct ieee802154_dev *dev, s8 retries)
1221at86rf230_set_frame_retries(struct ieee802154_hw *hw, s8 retries)
1222{
1222{
1223 struct at86rf230_local *lp = dev->priv;
1223 struct at86rf230_local *lp = hw->priv;
1224 int rc = 0;
1225
1226 if (retries < -1 || retries > 15)
1227 return -EINVAL;
1228
1229 lp->tx_aret = retries >= 0;
1230 lp->max_frame_retries = retries;
1231

--- 172 unchanged lines hidden (view full) ---

1404 return rc;
1405
1406 if (man_id != 0x001f) {
1407 dev_err(&lp->spi->dev, "Non-Atmel dev found (MAN_ID %02x %02x)\n",
1408 man_id >> 8, man_id & 0xFF);
1409 return -EINVAL;
1410 }
1411
1224 int rc = 0;
1225
1226 if (retries < -1 || retries > 15)
1227 return -EINVAL;
1228
1229 lp->tx_aret = retries >= 0;
1230 lp->max_frame_retries = retries;
1231

--- 172 unchanged lines hidden (view full) ---

1404 return rc;
1405
1406 if (man_id != 0x001f) {
1407 dev_err(&lp->spi->dev, "Non-Atmel dev found (MAN_ID %02x %02x)\n",
1408 man_id >> 8, man_id & 0xFF);
1409 return -EINVAL;
1410 }
1411
1412 lp->dev->extra_tx_headroom = 0;
1413 lp->dev->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AACK |
1412 lp->hw->extra_tx_headroom = 0;
1413 lp->hw->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AACK |
1414 IEEE802154_HW_TXPOWER | IEEE802154_HW_CSMA;
1415
1416 switch (part) {
1417 case 2:
1418 chip = "at86rf230";
1419 rc = -ENOTSUPP;
1420 break;
1421 case 3:
1422 chip = "at86rf231";
1423 lp->data = &at86rf231_data;
1414 IEEE802154_HW_TXPOWER | IEEE802154_HW_CSMA;
1415
1416 switch (part) {
1417 case 2:
1418 chip = "at86rf230";
1419 rc = -ENOTSUPP;
1420 break;
1421 case 3:
1422 chip = "at86rf231";
1423 lp->data = &at86rf231_data;
1424 lp->dev->phy->channels_supported[0] = 0x7FFF800;
1424 lp->hw->phy->channels_supported[0] = 0x7FFF800;
1425 break;
1426 case 7:
1427 chip = "at86rf212";
1428 if (version == 1) {
1429 lp->data = &at86rf212_data;
1425 break;
1426 case 7:
1427 chip = "at86rf212";
1428 if (version == 1) {
1429 lp->data = &at86rf212_data;
1430 lp->dev->flags |= IEEE802154_HW_LBT;
1431 lp->dev->phy->channels_supported[0] = 0x00007FF;
1432 lp->dev->phy->channels_supported[2] = 0x00007FF;
1430 lp->hw->flags |= IEEE802154_HW_LBT;
1431 lp->hw->phy->channels_supported[0] = 0x00007FF;
1432 lp->hw->phy->channels_supported[2] = 0x00007FF;
1433 } else {
1434 rc = -ENOTSUPP;
1435 }
1436 break;
1437 case 11:
1438 chip = "at86rf233";
1439 lp->data = &at86rf233_data;
1433 } else {
1434 rc = -ENOTSUPP;
1435 }
1436 break;
1437 case 11:
1438 chip = "at86rf233";
1439 lp->data = &at86rf233_data;
1440 lp->dev->phy->channels_supported[0] = 0x7FFF800;
1440 lp->hw->phy->channels_supported[0] = 0x7FFF800;
1441 break;
1442 default:
1443 chip = "unkown";
1444 rc = -ENOTSUPP;
1445 break;
1446 }
1447
1448 dev_info(&lp->spi->dev, "Detected %s chip version %d\n", chip, version);

--- 24 unchanged lines hidden (view full) ---

1473 lp->tx.trx.tx_buf = lp->tx.buf;
1474 lp->tx.trx.rx_buf = lp->tx.buf;
1475 spi_message_add_tail(&lp->tx.trx, &lp->tx.msg);
1476}
1477
1478static int at86rf230_probe(struct spi_device *spi)
1479{
1480 struct at86rf230_platform_data *pdata;
1441 break;
1442 default:
1443 chip = "unkown";
1444 rc = -ENOTSUPP;
1445 break;
1446 }
1447
1448 dev_info(&lp->spi->dev, "Detected %s chip version %d\n", chip, version);

--- 24 unchanged lines hidden (view full) ---

1473 lp->tx.trx.tx_buf = lp->tx.buf;
1474 lp->tx.trx.rx_buf = lp->tx.buf;
1475 spi_message_add_tail(&lp->tx.trx, &lp->tx.msg);
1476}
1477
1478static int at86rf230_probe(struct spi_device *spi)
1479{
1480 struct at86rf230_platform_data *pdata;
1481 struct ieee802154_dev *dev;
1481 struct ieee802154_hw *hw;
1482 struct at86rf230_local *lp;
1483 unsigned int status;
1484 int rc, irq_type;
1485
1486 if (!spi->irq) {
1487 dev_err(&spi->dev, "no IRQ specified\n");
1488 return -EINVAL;
1489 }

--- 22 unchanged lines hidden (view full) ---

1512 if (gpio_is_valid(pdata->rstn)) {
1513 udelay(1);
1514 gpio_set_value(pdata->rstn, 0);
1515 udelay(1);
1516 gpio_set_value(pdata->rstn, 1);
1517 usleep_range(120, 240);
1518 }
1519
1482 struct at86rf230_local *lp;
1483 unsigned int status;
1484 int rc, irq_type;
1485
1486 if (!spi->irq) {
1487 dev_err(&spi->dev, "no IRQ specified\n");
1488 return -EINVAL;
1489 }

--- 22 unchanged lines hidden (view full) ---

1512 if (gpio_is_valid(pdata->rstn)) {
1513 udelay(1);
1514 gpio_set_value(pdata->rstn, 0);
1515 udelay(1);
1516 gpio_set_value(pdata->rstn, 1);
1517 usleep_range(120, 240);
1518 }
1519
1520 dev = ieee802154_alloc_device(sizeof(*lp), &at86rf230_ops);
1521 if (!dev)
1520 hw = ieee802154_alloc_hw(sizeof(*lp), &at86rf230_ops);
1521 if (!hw)
1522 return -ENOMEM;
1523
1522 return -ENOMEM;
1523
1524 lp = dev->priv;
1525 lp->dev = dev;
1524 lp = hw->priv;
1525 lp->hw = hw;
1526 lp->spi = spi;
1526 lp->spi = spi;
1527 dev->parent = &spi->dev;
1527 hw->parent = &spi->dev;
1528
1529 lp->regmap = devm_regmap_init_spi(spi, &at86rf230_regmap_spi_config);
1530 if (IS_ERR(lp->regmap)) {
1531 rc = PTR_ERR(lp->regmap);
1532 dev_err(&spi->dev, "Failed to allocate register map: %d\n",
1533 rc);
1534 goto free_dev;
1535 }

--- 23 unchanged lines hidden (view full) ---

1559 if (!irq_type)
1560 irq_type = IRQF_TRIGGER_RISING;
1561
1562 rc = devm_request_irq(&spi->dev, spi->irq, at86rf230_isr,
1563 IRQF_SHARED | irq_type, dev_name(&spi->dev), lp);
1564 if (rc)
1565 goto free_dev;
1566
1528
1529 lp->regmap = devm_regmap_init_spi(spi, &at86rf230_regmap_spi_config);
1530 if (IS_ERR(lp->regmap)) {
1531 rc = PTR_ERR(lp->regmap);
1532 dev_err(&spi->dev, "Failed to allocate register map: %d\n",
1533 rc);
1534 goto free_dev;
1535 }

--- 23 unchanged lines hidden (view full) ---

1559 if (!irq_type)
1560 irq_type = IRQF_TRIGGER_RISING;
1561
1562 rc = devm_request_irq(&spi->dev, spi->irq, at86rf230_isr,
1563 IRQF_SHARED | irq_type, dev_name(&spi->dev), lp);
1564 if (rc)
1565 goto free_dev;
1566
1567 rc = ieee802154_register_device(lp->dev);
1567 rc = ieee802154_register_hw(lp->hw);
1568 if (rc)
1569 goto free_dev;
1570
1571 return rc;
1572
1573free_dev:
1568 if (rc)
1569 goto free_dev;
1570
1571 return rc;
1572
1573free_dev:
1574 ieee802154_free_device(lp->dev);
1574 ieee802154_free_hw(lp->hw);
1575
1576 return rc;
1577}
1578
1579static int at86rf230_remove(struct spi_device *spi)
1580{
1581 struct at86rf230_local *lp = spi_get_drvdata(spi);
1582
1583 /* mask all at86rf230 irq's */
1584 at86rf230_write_subreg(lp, SR_IRQ_MASK, 0);
1575
1576 return rc;
1577}
1578
1579static int at86rf230_remove(struct spi_device *spi)
1580{
1581 struct at86rf230_local *lp = spi_get_drvdata(spi);
1582
1583 /* mask all at86rf230 irq's */
1584 at86rf230_write_subreg(lp, SR_IRQ_MASK, 0);
1585 ieee802154_unregister_device(lp->dev);
1586 ieee802154_free_device(lp->dev);
1585 ieee802154_unregister_hw(lp->hw);
1586 ieee802154_free_hw(lp->hw);
1587 dev_dbg(&spi->dev, "unregistered at86rf230\n");
1588
1589 return 0;
1590}
1591
1592static const struct of_device_id at86rf230_of_match[] = {
1593 { .compatible = "atmel,at86rf230", },
1594 { .compatible = "atmel,at86rf231", },

--- 30 unchanged lines hidden ---
1587 dev_dbg(&spi->dev, "unregistered at86rf230\n");
1588
1589 return 0;
1590}
1591
1592static const struct of_device_id at86rf230_of_match[] = {
1593 { .compatible = "atmel,at86rf230", },
1594 { .compatible = "atmel,at86rf231", },

--- 30 unchanged lines hidden ---