summaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-03-02 14:47:12 -0500
committerDavid S. Miller <davem@davemloft.net>2015-03-02 14:47:12 -0500
commit70c836a4d15f12aa50195937083b30a6945c2556 (patch)
treef76867215487fd7626acae395b412056eb8fde74 /drivers/net
parentb4844353c0577bef6db54e5b276ede1acbed5b3d (diff)
parentc91799c50a14137ecee6d60d2f1d9ab8bc895e52 (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.c120
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)
689static int 687static int
690at86rf230_sync_state_change(struct at86rf230_local *lp, unsigned int state) 688at86rf230_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
1318static int at86rf230_hw_init(struct at86rf230_local *lp) 1313static 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
1380static struct at86rf230_platform_data * 1424static int
1381at86rf230_get_pdata(struct spi_device *spi) 1425at86rf230_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;
1396done:
1397 return pdata;
1398} 1448}
1399 1449
1400static int 1450static int
@@ -1501,43 +1551,43 @@ at86rf230_setup_spi_messages(struct at86rf230_local *lp)
1501 1551
1502static int at86rf230_probe(struct spi_device *spi) 1552static 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