PINE64
Some problems with kernel module und device tree.. - Printable Version

+- PINE64 (https://forum.pine64.org)
+-- Forum: General (https://forum.pine64.org/forumdisplay.php?fid=1)
+--- Forum: General (https://forum.pine64.org/forumdisplay.php?fid=74)
+--- Thread: Some problems with kernel module und device tree.. (/showthread.php?tid=6062)



Some problems with kernel module und device tree.. - Osiander - 05-14-2018

Hello guys,

I'm developing a kernel driver for a MOST NIC and have got some problems by reading the chip configuration from device tree.

Here is the configuration:

Code:
&i2c2 {
    pinctrl-names = "default";
    pinctrl-0 = <&i2c2_pins_a>;
    status = "okay";
    
    os8104: os8104@41 {
        compatible = "smsc,os8104";
        reg = <0x41>;
        master = <0>;
        bypass = <0>;
        
        gpio_reset = <&pio 8 17>;    /* PI17 */
        gpio_int = <&pio 8 16>;        /* PI16 */
        gpio_aint = <&pio 8 19>;    /* PI19 */
        gpio_error = <&pio 8 18>;    /* PI18 */
    };
};

My NIC (os8104) is connected to i2c-2. 

And here is the corresponding code in LKM:

Code:
static int os8104_probe(struct i2c_client *client, const struct i2c_device_id *id) {
    struct device_node *dn;
    int rc;
    int master = 0, bypass = 0;
    struct os8104 *priv;

    dn = of_find_node_by_name(NULL, os8104_driver.driver.name);
    if (dn == NULL) {
        return -ENODEV;
    }

    rc = of_property_read_u32(dn, "master", &master);
    pr_err("rc = %d, master = %11d\n", rc, master);
    
    rc = of_property_read_u32(dn, "bypass", &bypass);
    pr_err("rc = %d, bypass = %11d\n", rc, bypass);

    priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL);

    if (!priv) {
        return -ENOMEM;
    }

    priv->adapter = to_i2c_adapter(client->dev.parent);
    priv->client = client;
    priv->mode = val;
    
    priv->gpio_reset = of_get_named_gpio(dn, "gpio_reset", 0);
    priv->gpio_int = of_get_named_gpio(dn, "gpio_int", 0);
    priv->gpio_aint = of_get_named_gpio(dn, "gpio_aint", 0);
    priv->gpio_error = of_get_named_gpio(dn, "gpio_error", 0);
    
    return 0;
}

If I'm loading the module, the function of_find_node_by_name find my os8104 node, then I'm able to read the both properties (master and bypass). 

But, if I do an of_get_named_gpio(dn, "gpio_reset", 0), I get for each of four gpio-properties

Quote:[ 1610.330108] OF: /soc@01c00000/i2c@01c2b400/os8104@41: arguments longer than property

in dmesg.

Any ideas?

Kernel version is 4.14.39 and SBC is a BananaPRO (Allwinner A20 SoC).

Many thanks. Smile