Skip to content

Commit 00250f7

Browse files
alexaringholtmann
authored andcommitted
mrf24j40: add tx power support
This patch supports setting of transmit power for the mrf24j40ma transceiver only. The mrf24j40mc has some amplifier to change the transmit power, I am currently not sure how the mapping for this amplifier looks like. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
1 parent e33a0f9 commit 00250f7

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed

drivers/net/ieee802154/mrf24j40.c

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -864,6 +864,65 @@ static int mrf24j40_set_cca_ed_level(struct ieee802154_hw *hw, s32 mbm)
864864
return -EINVAL;
865865
}
866866

867+
static const s32 mrf24j40ma_powers[] = {
868+
0, -50, -120, -190, -280, -370, -490, -630, -1000, -1050, -1120, -1190,
869+
-1280, -1370, -1490, -1630, -2000, -2050, -2120, -2190, -2280, -2370,
870+
-2490, -2630, -3000, -3050, -3120, -3190, -3280, -3370, -3490, -3630,
871+
};
872+
873+
static int mrf24j40_set_txpower(struct ieee802154_hw *hw, s32 mbm)
874+
{
875+
struct mrf24j40 *devrec = hw->priv;
876+
s32 small_scale;
877+
u8 val;
878+
879+
if (0 >= mbm && mbm > -1000) {
880+
val = 0;
881+
small_scale = mbm;
882+
} else if (-1000 >= mbm && mbm > -2000) {
883+
val = 0x40;
884+
small_scale = mbm + 1000;
885+
} else if (-2000 >= mbm && mbm > -3000) {
886+
val = 0x80;
887+
small_scale = mbm + 2000;
888+
} else if (-3000 >= mbm && mbm > -4000) {
889+
val = 0xc0;
890+
small_scale = mbm + 3000;
891+
} else {
892+
return -EINVAL;
893+
}
894+
895+
switch (small_scale) {
896+
case 0:
897+
break;
898+
case -50:
899+
val |= 0x08;
900+
break;
901+
case -120:
902+
val |= 0x10;
903+
break;
904+
case -190:
905+
val |= 0x18;
906+
break;
907+
case -280:
908+
val |= 0x20;
909+
break;
910+
case -370:
911+
val |= 0x28;
912+
break;
913+
case -490:
914+
val |= 0x30;
915+
break;
916+
case -630:
917+
val |= 0x38;
918+
break;
919+
default:
920+
return -EINVAL;
921+
}
922+
923+
return regmap_update_bits(devrec->regmap_long, REG_RFCON3, 0xf8, val);
924+
}
925+
867926
static const struct ieee802154_ops mrf24j40_ops = {
868927
.owner = THIS_MODULE,
869928
.xmit_async = mrf24j40_tx,
@@ -875,6 +934,7 @@ static const struct ieee802154_ops mrf24j40_ops = {
875934
.set_csma_params = mrf24j40_csma_params,
876935
.set_cca_mode = mrf24j40_set_cca_mode,
877936
.set_cca_ed_level = mrf24j40_set_cca_ed_level,
937+
.set_txpower = mrf24j40_set_txpower,
878938
};
879939

880940
static void mrf24j40_intstat_complete(void *context)
@@ -1088,6 +1148,17 @@ static void mrf24j40_phy_setup(struct mrf24j40 *devrec)
10881148
devrec->hw->phy->cca_ed_level = -6900;
10891149
devrec->hw->phy->supported.cca_ed_levels = mrf24j40_ed_levels;
10901150
devrec->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(mrf24j40_ed_levels);
1151+
1152+
switch (spi_get_device_id(devrec->spi)->driver_data) {
1153+
case MRF24J40:
1154+
case MRF24J40MA:
1155+
devrec->hw->phy->supported.tx_powers = mrf24j40ma_powers;
1156+
devrec->hw->phy->supported.tx_powers_size = ARRAY_SIZE(mrf24j40ma_powers);
1157+
devrec->hw->phy->flags |= WPAN_PHY_FLAG_TXPOWER;
1158+
break;
1159+
default:
1160+
break;
1161+
}
10911162
}
10921163

10931164
static int mrf24j40_probe(struct spi_device *spi)

0 commit comments

Comments
 (0)