diff options
author | David S. Miller <davem@davemloft.net> | 2015-03-02 14:47:12 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-02 14:47:12 -0500 |
commit | 70c836a4d15f12aa50195937083b30a6945c2556 (patch) | |
tree | f76867215487fd7626acae395b412056eb8fde74 /drivers/net | |
parent | b4844353c0577bef6db54e5b276ede1acbed5b3d (diff) | |
parent | c91799c50a14137ecee6d60d2f1d9ab8bc895e52 (diff) |
Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next
Johan Hedberg says:
====================
pull request: bluetooth-next 2015-03-02
Here's the first bluetooth-next pull request targeting the 4.1 kernel:
- ieee802154/6lowpan cleanups
- SCO routing to host interface support for the btmrvl driver
- AMP code cleanups
- Fixes to AMP HCI init sequence
- Refactoring of the HCI callback mechanism
- Added shutdown routine for Intel controllers in the btusb driver
- New config option to enable/disable Bluetooth debugfs information
- Fix for early data reception on L2CAP fixed channels
Please let me know if there are any issues pulling. Thanks.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ieee802154/at86rf230.c | 120 |
1 files changed, 85 insertions, 35 deletions
diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index 7b051eacb7f1..1d438bc54189 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c | |||
@@ -46,8 +46,6 @@ struct at86rf2xx_chip_data { | |||
46 | u16 t_off_to_tx_on; | 46 | u16 t_off_to_tx_on; |
47 | u16 t_frame; | 47 | u16 t_frame; |
48 | u16 t_p_ack; | 48 | u16 t_p_ack; |
49 | /* completion timeout for tx in msecs */ | ||
50 | u16 t_tx_timeout; | ||
51 | int rssi_base_val; | 49 | int rssi_base_val; |
52 | 50 | ||
53 | int (*set_channel)(struct at86rf230_local *, u8, u8); | 51 | int (*set_channel)(struct at86rf230_local *, u8, u8); |
@@ -689,7 +687,7 @@ at86rf230_sync_state_change_complete(void *context) | |||
689 | static int | 687 | static int |
690 | at86rf230_sync_state_change(struct at86rf230_local *lp, unsigned int state) | 688 | at86rf230_sync_state_change(struct at86rf230_local *lp, unsigned int state) |
691 | { | 689 | { |
692 | int rc; | 690 | unsigned long rc; |
693 | 691 | ||
694 | at86rf230_async_state_change(lp, &lp->state, state, | 692 | at86rf230_async_state_change(lp, &lp->state, state, |
695 | at86rf230_sync_state_change_complete, | 693 | at86rf230_sync_state_change_complete, |
@@ -1281,7 +1279,6 @@ static struct at86rf2xx_chip_data at86rf233_data = { | |||
1281 | .t_off_to_tx_on = 80, | 1279 | .t_off_to_tx_on = 80, |
1282 | .t_frame = 4096, | 1280 | .t_frame = 4096, |
1283 | .t_p_ack = 545, | 1281 | .t_p_ack = 545, |
1284 | .t_tx_timeout = 2000, | ||
1285 | .rssi_base_val = -91, | 1282 | .rssi_base_val = -91, |
1286 | .set_channel = at86rf23x_set_channel, | 1283 | .set_channel = at86rf23x_set_channel, |
1287 | .get_desense_steps = at86rf23x_get_desens_steps | 1284 | .get_desense_steps = at86rf23x_get_desens_steps |
@@ -1295,7 +1292,6 @@ static struct at86rf2xx_chip_data at86rf231_data = { | |||
1295 | .t_off_to_tx_on = 110, | 1292 | .t_off_to_tx_on = 110, |
1296 | .t_frame = 4096, | 1293 | .t_frame = 4096, |
1297 | .t_p_ack = 545, | 1294 | .t_p_ack = 545, |
1298 | .t_tx_timeout = 2000, | ||
1299 | .rssi_base_val = -91, | 1295 | .rssi_base_val = -91, |
1300 | .set_channel = at86rf23x_set_channel, | 1296 | .set_channel = at86rf23x_set_channel, |
1301 | .get_desense_steps = at86rf23x_get_desens_steps | 1297 | .get_desense_steps = at86rf23x_get_desens_steps |
@@ -1309,13 +1305,12 @@ static struct at86rf2xx_chip_data at86rf212_data = { | |||
1309 | .t_off_to_tx_on = 200, | 1305 | .t_off_to_tx_on = 200, |
1310 | .t_frame = 4096, | 1306 | .t_frame = 4096, |
1311 | .t_p_ack = 545, | 1307 | .t_p_ack = 545, |
1312 | .t_tx_timeout = 2000, | ||
1313 | .rssi_base_val = -100, | 1308 | .rssi_base_val = -100, |
1314 | .set_channel = at86rf212_set_channel, | 1309 | .set_channel = at86rf212_set_channel, |
1315 | .get_desense_steps = at86rf212_get_desens_steps | 1310 | .get_desense_steps = at86rf212_get_desens_steps |
1316 | }; | 1311 | }; |
1317 | 1312 | ||
1318 | static int at86rf230_hw_init(struct at86rf230_local *lp) | 1313 | static int at86rf230_hw_init(struct at86rf230_local *lp, u8 xtal_trim) |
1319 | { | 1314 | { |
1320 | int rc, irq_type, irq_pol = IRQ_ACTIVE_HIGH; | 1315 | int rc, irq_type, irq_pol = IRQ_ACTIVE_HIGH; |
1321 | unsigned int dvdd; | 1316 | unsigned int dvdd; |
@@ -1326,7 +1321,12 @@ static int at86rf230_hw_init(struct at86rf230_local *lp) | |||
1326 | return rc; | 1321 | return rc; |
1327 | 1322 | ||
1328 | irq_type = irq_get_trigger_type(lp->spi->irq); | 1323 | irq_type = irq_get_trigger_type(lp->spi->irq); |
1329 | if (irq_type == IRQ_TYPE_EDGE_FALLING) | 1324 | if (irq_type == IRQ_TYPE_EDGE_RISING || |
1325 | irq_type == IRQ_TYPE_EDGE_FALLING) | ||
1326 | dev_warn(&lp->spi->dev, | ||
1327 | "Using edge triggered irq's are not recommended!\n"); | ||
1328 | if (irq_type == IRQ_TYPE_EDGE_FALLING || | ||
1329 | irq_type == IRQ_TYPE_LEVEL_LOW) | ||
1330 | irq_pol = IRQ_ACTIVE_LOW; | 1330 | irq_pol = IRQ_ACTIVE_LOW; |
1331 | 1331 | ||
1332 | rc = at86rf230_write_subreg(lp, SR_IRQ_POLARITY, irq_pol); | 1332 | rc = at86rf230_write_subreg(lp, SR_IRQ_POLARITY, irq_pol); |
@@ -1341,6 +1341,11 @@ static int at86rf230_hw_init(struct at86rf230_local *lp) | |||
1341 | if (rc) | 1341 | if (rc) |
1342 | return rc; | 1342 | return rc; |
1343 | 1343 | ||
1344 | /* reset values differs in at86rf231 and at86rf233 */ | ||
1345 | rc = at86rf230_write_subreg(lp, SR_IRQ_MASK_MODE, 0); | ||
1346 | if (rc) | ||
1347 | return rc; | ||
1348 | |||
1344 | get_random_bytes(csma_seed, ARRAY_SIZE(csma_seed)); | 1349 | get_random_bytes(csma_seed, ARRAY_SIZE(csma_seed)); |
1345 | rc = at86rf230_write_subreg(lp, SR_CSMA_SEED_0, csma_seed[0]); | 1350 | rc = at86rf230_write_subreg(lp, SR_CSMA_SEED_0, csma_seed[0]); |
1346 | if (rc) | 1351 | if (rc) |
@@ -1362,6 +1367,45 @@ static int at86rf230_hw_init(struct at86rf230_local *lp) | |||
1362 | usleep_range(lp->data->t_sleep_cycle, | 1367 | usleep_range(lp->data->t_sleep_cycle, |
1363 | lp->data->t_sleep_cycle + 100); | 1368 | lp->data->t_sleep_cycle + 100); |
1364 | 1369 | ||
1370 | /* xtal_trim value is calculated by: | ||
1371 | * CL = 0.5 * (CX + CTRIM + CPAR) | ||
1372 | * | ||
1373 | * whereas: | ||
1374 | * CL = capacitor of used crystal | ||
1375 | * CX = connected capacitors at xtal pins | ||
1376 | * CPAR = in all at86rf2xx datasheets this is a constant value 3 pF, | ||
1377 | * but this is different on each board setup. You need to fine | ||
1378 | * tuning this value via CTRIM. | ||
1379 | * CTRIM = variable capacitor setting. Resolution is 0.3 pF range is | ||
1380 | * 0 pF upto 4.5 pF. | ||
1381 | * | ||
1382 | * Examples: | ||
1383 | * atben transceiver: | ||
1384 | * | ||
1385 | * CL = 8 pF | ||
1386 | * CX = 12 pF | ||
1387 | * CPAR = 3 pF (We assume the magic constant from datasheet) | ||
1388 | * CTRIM = 0.9 pF | ||
1389 | * | ||
1390 | * (12+0.9+3)/2 = 7.95 which is nearly at 8 pF | ||
1391 | * | ||
1392 | * xtal_trim = 0x3 | ||
1393 | * | ||
1394 | * openlabs transceiver: | ||
1395 | * | ||
1396 | * CL = 16 pF | ||
1397 | * CX = 22 pF | ||
1398 | * CPAR = 3 pF (We assume the magic constant from datasheet) | ||
1399 | * CTRIM = 4.5 pF | ||
1400 | * | ||
1401 | * (22+4.5+3)/2 = 14.75 which is the nearest value to 16 pF | ||
1402 | * | ||
1403 | * xtal_trim = 0xf | ||
1404 | */ | ||
1405 | rc = at86rf230_write_subreg(lp, SR_XTAL_TRIM, xtal_trim); | ||
1406 | if (rc) | ||
1407 | return rc; | ||
1408 | |||
1365 | rc = at86rf230_read_subreg(lp, SR_DVDD_OK, &dvdd); | 1409 | rc = at86rf230_read_subreg(lp, SR_DVDD_OK, &dvdd); |
1366 | if (rc) | 1410 | if (rc) |
1367 | return rc; | 1411 | return rc; |
@@ -1377,24 +1421,30 @@ static int at86rf230_hw_init(struct at86rf230_local *lp) | |||
1377 | return at86rf230_write_subreg(lp, SR_SLOTTED_OPERATION, 0); | 1421 | return at86rf230_write_subreg(lp, SR_SLOTTED_OPERATION, 0); |
1378 | } | 1422 | } |
1379 | 1423 | ||
1380 | static struct at86rf230_platform_data * | 1424 | static int |
1381 | at86rf230_get_pdata(struct spi_device *spi) | 1425 | at86rf230_get_pdata(struct spi_device *spi, int *rstn, int *slp_tr, |
1426 | u8 *xtal_trim) | ||
1382 | { | 1427 | { |
1383 | struct at86rf230_platform_data *pdata; | 1428 | struct at86rf230_platform_data *pdata = spi->dev.platform_data; |
1429 | int ret; | ||
1384 | 1430 | ||
1385 | if (!IS_ENABLED(CONFIG_OF) || !spi->dev.of_node) | 1431 | if (!IS_ENABLED(CONFIG_OF) || !spi->dev.of_node) { |
1386 | return spi->dev.platform_data; | 1432 | if (!pdata) |
1433 | return -ENOENT; | ||
1387 | 1434 | ||
1388 | pdata = devm_kzalloc(&spi->dev, sizeof(*pdata), GFP_KERNEL); | 1435 | *rstn = pdata->rstn; |
1389 | if (!pdata) | 1436 | *slp_tr = pdata->slp_tr; |
1390 | goto done; | 1437 | *xtal_trim = pdata->xtal_trim; |
1438 | return 0; | ||
1439 | } | ||
1391 | 1440 | ||
1392 | pdata->rstn = of_get_named_gpio(spi->dev.of_node, "reset-gpio", 0); | 1441 | *rstn = of_get_named_gpio(spi->dev.of_node, "reset-gpio", 0); |
1393 | pdata->slp_tr = of_get_named_gpio(spi->dev.of_node, "sleep-gpio", 0); | 1442 | *slp_tr = of_get_named_gpio(spi->dev.of_node, "sleep-gpio", 0); |
1443 | ret = of_property_read_u8(spi->dev.of_node, "xtal-trim", xtal_trim); | ||
1444 | if (ret < 0 && ret != -EINVAL) | ||
1445 | return ret; | ||
1394 | 1446 | ||
1395 | spi->dev.platform_data = pdata; | 1447 | return 0; |
1396 | done: | ||
1397 | return pdata; | ||
1398 | } | 1448 | } |
1399 | 1449 | ||
1400 | static int | 1450 | static int |
@@ -1501,43 +1551,43 @@ at86rf230_setup_spi_messages(struct at86rf230_local *lp) | |||
1501 | 1551 | ||
1502 | static int at86rf230_probe(struct spi_device *spi) | 1552 | static int at86rf230_probe(struct spi_device *spi) |
1503 | { | 1553 | { |
1504 | struct at86rf230_platform_data *pdata; | ||
1505 | struct ieee802154_hw *hw; | 1554 | struct ieee802154_hw *hw; |
1506 | struct at86rf230_local *lp; | 1555 | struct at86rf230_local *lp; |
1507 | unsigned int status; | 1556 | unsigned int status; |
1508 | int rc, irq_type; | 1557 | int rc, irq_type, rstn, slp_tr; |
1558 | u8 xtal_trim; | ||
1509 | 1559 | ||
1510 | if (!spi->irq) { | 1560 | if (!spi->irq) { |
1511 | dev_err(&spi->dev, "no IRQ specified\n"); | 1561 | dev_err(&spi->dev, "no IRQ specified\n"); |
1512 | return -EINVAL; | 1562 | return -EINVAL; |
1513 | } | 1563 | } |
1514 | 1564 | ||
1515 | pdata = at86rf230_get_pdata(spi); | 1565 | rc = at86rf230_get_pdata(spi, &rstn, &slp_tr, &xtal_trim); |
1516 | if (!pdata) { | 1566 | if (rc < 0) { |
1517 | dev_err(&spi->dev, "no platform_data\n"); | 1567 | dev_err(&spi->dev, "failed to parse platform_data: %d\n", rc); |
1518 | return -EINVAL; | 1568 | return rc; |
1519 | } | 1569 | } |
1520 | 1570 | ||
1521 | if (gpio_is_valid(pdata->rstn)) { | 1571 | if (gpio_is_valid(rstn)) { |
1522 | rc = devm_gpio_request_one(&spi->dev, pdata->rstn, | 1572 | rc = devm_gpio_request_one(&spi->dev, rstn, |
1523 | GPIOF_OUT_INIT_HIGH, "rstn"); | 1573 | GPIOF_OUT_INIT_HIGH, "rstn"); |
1524 | if (rc) | 1574 | if (rc) |
1525 | return rc; | 1575 | return rc; |
1526 | } | 1576 | } |
1527 | 1577 | ||
1528 | if (gpio_is_valid(pdata->slp_tr)) { | 1578 | if (gpio_is_valid(slp_tr)) { |
1529 | rc = devm_gpio_request_one(&spi->dev, pdata->slp_tr, | 1579 | rc = devm_gpio_request_one(&spi->dev, slp_tr, |
1530 | GPIOF_OUT_INIT_LOW, "slp_tr"); | 1580 | GPIOF_OUT_INIT_LOW, "slp_tr"); |
1531 | if (rc) | 1581 | if (rc) |
1532 | return rc; | 1582 | return rc; |
1533 | } | 1583 | } |
1534 | 1584 | ||
1535 | /* Reset */ | 1585 | /* Reset */ |
1536 | if (gpio_is_valid(pdata->rstn)) { | 1586 | if (gpio_is_valid(rstn)) { |
1537 | udelay(1); | 1587 | udelay(1); |
1538 | gpio_set_value(pdata->rstn, 0); | 1588 | gpio_set_value(rstn, 0); |
1539 | udelay(1); | 1589 | udelay(1); |
1540 | gpio_set_value(pdata->rstn, 1); | 1590 | gpio_set_value(rstn, 1); |
1541 | usleep_range(120, 240); | 1591 | usleep_range(120, 240); |
1542 | } | 1592 | } |
1543 | 1593 | ||
@@ -1571,7 +1621,7 @@ static int at86rf230_probe(struct spi_device *spi) | |||
1571 | 1621 | ||
1572 | spi_set_drvdata(spi, lp); | 1622 | spi_set_drvdata(spi, lp); |
1573 | 1623 | ||
1574 | rc = at86rf230_hw_init(lp); | 1624 | rc = at86rf230_hw_init(lp, xtal_trim); |
1575 | if (rc) | 1625 | if (rc) |
1576 | goto free_dev; | 1626 | goto free_dev; |
1577 | 1627 | ||