1. 程式人生 > >Linux kernel 有關 spi 設備樹參數解析

Linux kernel 有關 spi 設備樹參數解析

-c enable pre ann driver error ola state AC

  • 最近做了一個 spi 設備驅動從板級設備驅動升級到設備樹設備驅動,這其中要了解 spi 設備樹代碼的解析。

  • 設備樹配置如下:

    503 &spi0 {
    504     status = "okay";
    505     pinctrl-name = "default";
    506     pinctrl-0 = <&spi0_pins>;
    507     ti,pindir-d0-out-d1-in;
    508
    509     wk2124A {
    510         compatible = "wk2124A";    //  匹配字符串
    511 reg = <0>; // cs 512 # spi-cpha = <1>; // 配置 spi 的模式 513 # spi-tx-bus-width = <1>; // 這是是 spi-tx 的總線寬度 514 # spi-rx-bus-width = <1>; 515 spi-max-frequency = <10000000>; // spi 最大速率配置 516 }; 517 };
  • 代碼跟蹤

    // drivers/spi/spi.c
    2772 postcore_initcall(spi_init);
    
    2733 static int __init spi_init(void)
    2734 {
    2735     int status;
    2736
    2737     buf = kmalloc(SPI_BUFSIZ, GFP_KERNEL);
    2738     if (!buf) {
    2739         status = -ENOMEM;
    2740         goto err0;
    2741     }
    2742
    2743     status = bus_register(&spi_bus_type);
    2744
    if (status < 0) 2745 goto err1; 2746 2747 status = class_register(&spi_master_class); 2748 if (status < 0) 2749 goto err2; 2750 2751 if (IS_ENABLED(CONFIG_OF_DYNAMIC)) 2752 WARN_ON(of_reconfig_notifier_register(&spi_of_notifier)); 2753 2754 return 0; 2755 2756 err2: 2757 bus_unregister(&spi_bus_type); 2758 err1: 2759 kfree(buf); 2760 buf = NULL; 2761 err0: 2762 return status; 2763 } 2726 static struct notifier_block spi_of_notifier = { 2727 .notifier_call = of_spi_notify, 2728 }; 2686 static int of_spi_notify(struct notifier_block *nb, unsigned long action, 2687 void *arg) 2688 { 2689 struct of_reconfig_data *rd = arg; 2690 struct spi_master *master; 2691 struct spi_device *spi; 2692 2693 switch (of_reconfig_get_state_change(action, arg)) { 2694 case OF_RECONFIG_CHANGE_ADD: 2695 master = of_find_spi_master_by_node(rd->dn->parent); 2696 if (master == NULL) 2697 return NOTIFY_OK; /* not for us */ 2698 2699 spi = of_register_spi_device(master, rd->dn); // ---> 註冊設備 2700 put_device(&master->dev); // ... ... 2722 2723 return NOTIFY_OK; 2724 } 1428 #if defined(CONFIG_OF) 1429 static struct spi_device * 1430 of_register_spi_device(struct spi_master *master, struct device_node *nc) 1431 { 1432 struct spi_device *spi; 1433 int rc; 1434 u32 value; 1435 1436 /* Alloc an spi_device */ 1437 spi = spi_alloc_device(master); 1438 if (!spi) { 1439 dev_err(&master->dev, "spi_device alloc error for %s\n", 1440 nc->full_name); 1441 rc = -ENOMEM; 1442 goto err_out; 1443 } 1444 1445 /* Select device driver */ 1446 rc = of_modalias_node(nc, spi->modalias, 1447 sizeof(spi->modalias)); 1448 if (rc < 0) { 1449 dev_err(&master->dev, "cannot find modalias for %s\n", 1450 nc->full_name); 1451 goto err_out; 1452 } 1453 1454 /* Device address */ 1455 rc = of_property_read_u32(nc, "reg", &value); 1456 if (rc) { 1457 dev_err(&master->dev, "%s has no valid 'reg' property (%d)\n", 1458 nc->full_name, rc); 1459 goto err_out; 1460 } 1461 spi->chip_select = value; 1462 1463 /* Mode (clock phase/polarity/etc.) */ 1464 if (of_find_property(nc, "spi-cpha", NULL)) 1465 spi->mode |= SPI_CPHA; 1466 if (of_find_property(nc, "spi-cpol", NULL)) 1467 spi->mode |= SPI_CPOL; 1468 if (of_find_property(nc, "spi-cs-high", NULL)) 1469 spi->mode |= SPI_CS_HIGH; 1470 if (of_find_property(nc, "spi-3wire", NULL)) 1471 spi->mode |= SPI_3WIRE; 1472 if (of_find_property(nc, "spi-lsb-first", NULL)) 1473 spi->mode |= SPI_LSB_FIRST; 1474 1475 /* Device DUAL/QUAD mode */ 1476 if (!of_property_read_u32(nc, "spi-tx-bus-width", &value)) { 1477 switch (value) { 1478 case 1: 1479 break; 1480 case 2: 1481 spi->mode |= SPI_TX_DUAL; 1482 break; 1483 case 4: 1484 spi->mode |= SPI_TX_QUAD; 1485 break; 1486 default: 1487 dev_warn(&master->dev, 1488 "spi-tx-bus-width %d not supported\n", 1489 value); 1490 break; 1491 } 1492 } 1493 1494 if (!of_property_read_u32(nc, "spi-rx-bus-width", &value)) { 1495 switch (value) { 1496 case 1: 1497 break; 1498 case 2: 1499 spi->mode |= SPI_RX_DUAL; 1500 break; 1501 case 4: 1502 spi->mode |= SPI_RX_QUAD; 1503 break; 1504 default: 1505 dev_warn(&master->dev, 1506 "spi-rx-bus-width %d not supported\n", 1507 value); 1508 break; 1509 } 1510 } 1511 1512 /* Device speed */ 1513 rc = of_property_read_u32(nc, "spi-max-frequency", &value); 1514 if (rc) { 1515 dev_err(&master->dev, "%s has no valid 'spi-max-frequency' property (%d)\n", 1516 nc->full_name, rc); 1517 goto err_out; 1518 } 1519 spi->max_speed_hz = value; 1520 1521 /* Store a pointer to the node in the device structure */ 1522 of_node_get(nc); 1523 spi->dev.of_node = nc; 1524 1525 /* Register the new device */ 1526 rc = spi_add_device(spi); 1527 if (rc) { 1528 dev_err(&master->dev, "spi_device register error %s\n", 1529 nc->full_name); 1530 goto err_out; 1531 } 1532 1533 return spi; 1534 1535 err_out: 1536 spi_dev_put(spi); 1537 return ERR_PTR(rc); 1538 }

Linux kernel 有關 spi 設備樹參數解析