• Dmitry Torokhov's avatar
    gpiolib: add support for software nodes · e7f9ff5d
    Dmitry Torokhov authored
    Now that static device properties understand notion of child nodes and
    references, let's teach gpiolib to handle them:
    
    - GPIOs are represented as a references to software nodes representing
      gpiochip
    - references must have 2 arguments - GPIO number within the chip and
      GPIO flags (GPIO_ACTIVE_LOW/GPIO_ACTIVE_HIGH, etc)
    - a new PROPERTY_ENTRY_GPIO() macro is supplied to ensure the above
    - name of the software node representing gpiochip must match label of
      the gpiochip, as we use it to locate gpiochip structure at runtime
    
    The following illustrates use of software nodes to describe a "System"
    button that is currently specified via use of gpio_keys_platform_data
    in arch/mips/alchemy/board-mtx1.c. It follows bindings specified in
    Documentation/devicetree/bindings/input/gpio-keys.yaml.
    
    static const struct software_node mxt1_gpiochip2_node = {
    	.name = "alchemy-gpio2",
    };
    
    static const struct property_entry mtx1_gpio_button_props[] = {
    	PROPERTY_ENTRY_U32("linux,code", BTN_0),
    	PROPERTY_ENTRY_STRING("label", "System button"),
    	PROPERTY_ENTRY_GPIO("gpios", &mxt1_gpiochip2_node, 7, GPIO_ACTIVE_LOW),
    	{ }
    };
    
    Similarly, arch/arm/mach-tegra/board-paz00.c can be converted to:
    
    static const struct software_node tegra_gpiochip_node = {
    	.name = "tegra-gpio",
    };
    
    static struct property_entry wifi_rfkill_prop[] __initdata = {
    	PROPERTY_ENTRY_STRING("name", "wifi_rfkill"),
    	PROPERTY_ENTRY_STRING("type", "wlan"),
    	PROPERTY_ENTRY_GPIO("reset-gpios",
    			    &tegra_gpiochip_node, 25, GPIO_ACTIVE_HIGH);
    	PROPERTY_ENTRY_GPIO("shutdown-gpios",
    			    &tegra_gpiochip_node, 85, GPIO_ACTIVE_HIGH);
    	{ },
    };
    
    static struct platform_device wifi_rfkill_device = {
    	.name	= "rfkill_gpio",
    	.id	= -1,
    };
    
    ...
    
    	software_node_register(&tegra_gpiochip_node);
    	device_create_managed_software_node(&wifi_rfkill_device.dev,
    					    wifi_rfkill_prop, NULL);
    Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
    e7f9ff5d
gpiolib-swnode.c 3.22 KB