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 --- |