2015-05-27 3 views
2

У меня есть устройство i2c (сенсорный контроллер). Обычно я хотел бы добавить его в .dts файл, как это, когда он подключен к ведущему SoC i2c (чип Tegra в моем случае):Дерево устройств Linux (DTS): устройство i2c на мосте USB-I2C

[email protected] { 
      st1332: [email protected] { 
        compatible = "sitronix,st1232"; 
        reg = <0x55>; 
        interrupt-parent = <&gpio>; 
        interrupts = <189 IRQ_TYPE_EDGE_FALLING>; 
      };  
    }; 

С i2c [email protected] контроллера определяется в файле .dtsi СОВ в :

i2c1: [email protected] { 
      #address-cells = <1>; 
      #size-cells = <0>; 
      compatible = "nvidia,tegra124-i2c"; 
      reg = <0x0 0x7000c000 0x0 0x100>; 
      interrupts = <0 38 0x04>; 
      scl-gpio = <&gpio 20 0>; /* gpio PC4 */ 
      sda-gpio = <&gpio 21 0>; /* gpio PC5 */ 
      nvidia,memory-clients = <14>; 
      status = "okay"; 
      clock-frequency = <400000>; 
    }; 

Однако, я не хочу, чтобы подключить сенсорный контроллер к одному из i2c мастеров из SoC. Вместо этого я подключил его к мосту cp2112 USB to i2c.

Драйвер cp2112 отлично работает: я могу использовать команды, такие как i2cget, для доступа к нему из командной строки. Но как добавить его в файл .dts, чтобы драйвер сенсорного контроллера говорил с ним?

Поскольку устройства USB перечислены автоматически, у меня нет узла в моем .dts-файле, который я могу использовать в качестве родителя для узла сенсорного контроллера. Я бы предположил, что мне нужно создать узел-заполнитель в файле .dts под контроллером usb ([email protected]0000 в моем случае), который затем связан с указанным USB-устройством ядром и перемещает сенсорный контроллер в этот узел, но Я не знаю, как это сделать. Как выглядит такой узел для устройства USB? Или есть совершенно другое решение проблемы?

Я запускаю Linux 3.10.40 с помощью backpeded версии hid-cp2112 из Linux v4.1.0-rc5.

ответ

1

Поскольку драйвер hid-cp2112 проверен на перечисление устройства USB, он даже не пытается найти себя в дереве устройств. Я создал следующий патч для hid-cp2112.c, который связывает найденное устройство cp2112 с узлом /[email protected] в дереве devie. (Это, конечно, работает только в ситуациях, когда существует только один cp2112 чип на USB.)

diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c 
index 2bd7f97..fa88590 100644 
--- a/drivers/hid/hid-cp2112.c 
+++ b/drivers/hid/hid-cp2112.c 
@@ -31,6 +31,8 @@ 
#include <linux/module.h> 
#include <linux/nls.h> 
#include <linux/usb/ch9.h> 
+#include <linux/of.h> 
+#include <linux/of_i2c.h> 
#include "hid-ids.h" 

enum { 
@@ -1014,6 +1016,7 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id) 
    dev->adap.algo  = &smbus_algorithm; 
    dev->adap.algo_data = dev; 
    dev->adap.dev.parent = &hdev->dev; 
+ dev->adap.dev.of_node = of_find_node_by_path("/[email protected]"); 
    snprintf(dev->adap.name, sizeof(dev->adap.name), 
     "CP2112 SMBus Bridge on hiddev%d", hdev->minor); 
    init_waitqueue_head(&dev->wait); 
@@ -1029,6 +1032,8 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id) 

    hid_dbg(hdev, "adapter registered\n"); 

+ of_i2c_register_devices(&dev->adap); 
+ 
    dev->gc.label   = "cp2112_gpio"; 
    dev->gc.direction_input  = cp2112_gpio_direction_input; 
    dev->gc.direction_output = cp2112_gpio_direction_output; 

Запись в файл .dts для сенсорного контроллера выглядит следующим образом:

[email protected] { 
      #address-cells = <1>; 
      #size-cells = <0>; 
      st1332: [email protected] { 
        compatible = "sitronix,st1232"; 
        reg = <0x55>; 
        interrupt-parent = <&gpio>; 
        interrupts = <189 IRQ_TYPE_EDGE_FALLING>; 
      }; 
    }; 
2

As ссылка для тех, кто может столкнуться с аналогичными проблемами, отмечает, что Clifford был backportingcp2112 водитель от Linux 4+ назад до v3.10.40.

Если вы посмотрите на источник ядра для шин i2c, кажется, им пришлось регистрироваться с помощью of_i2c_register_devices, но эта необходимость была удалена из ядра v3.12 и далее. Вот почему драйвер cp2112 не звонит of_i2c_register_devices.

Смежные вопросы