Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f3d1382 authored by Daniel Mack's avatar Daniel Mack Committed by Greg Kroah-Hartman
Browse files

onewire: w1-gpio: add DT bindings



This patch add DT bindings to the w1-gpio driver, along with some
documentation on how to use them.

Signed-off-by: default avatarDaniel Mack <zonque@gmail.com>
Acked-by: default avatarEvgeniy Polyakov <zbr@ioremap.net>
Acked-by: default avatarVille Syrjälä <syrjala@sci.fi>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 73f2989d
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
w1-gpio devicetree bindings

Required properties:

 - compatible: "w1-gpio"
 - gpios: one or two GPIO specs:
		- the first one is used as data I/O pin
		- the second one is optional. If specified, it is used as
		  enable pin for an external pin pullup.

Optional properties:

 - linux,open-drain: if specified, the data pin is considered in
		     open-drain mode.

Examples:

	onewire@0 {
		compatible = "w1-gpio";
		gpios = <&gpio 126 0>, <&gpio 105 0>;
	};
+47 −1
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@
#include <linux/slab.h>
#include <linux/w1-gpio.h>
#include <linux/gpio.h>
#include <linux/of_platform.h>
#include <linux/of_gpio.h>

#include "../w1.h"
#include "../w1_int.h"
@@ -42,12 +44,55 @@ static u8 w1_gpio_read_bit(void *data)
	return gpio_get_value(pdata->pin) ? 1 : 0;
}

#ifdef CONFIG_OF
static struct of_device_id w1_gpio_dt_ids[] = {
	{ .compatible = "w1-gpio" },
	{}
};
MODULE_DEVICE_TABLE(of, w1_gpio_dt_ids);

static int w1_gpio_probe_dt(struct platform_device *pdev)
{
	struct w1_gpio_platform_data *pdata = pdev->dev.platform_data;
	struct device_node *np = pdev->dev.of_node;
	const struct of_device_id *of_id =
			of_match_device(w1_gpio_dt_ids, &pdev->dev);

	if (!of_id)
		return 0;

	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
	if (!pdata)
		return -ENOMEM;

	if (of_get_property(np, "linux,open-drain", NULL))
		pdata->is_open_drain = 1;

	pdata->pin = of_get_gpio(np, 0);
	pdata->ext_pullup_enable_pin = of_get_gpio(np, 1);
	pdev->dev.platform_data = pdata;

	return 0;
}
#else
static int w1_gpio_probe_dt(struct platform_device *pdev)
{
	return 0;
}
#endif

static int __init w1_gpio_probe(struct platform_device *pdev)
{
	struct w1_bus_master *master;
	struct w1_gpio_platform_data *pdata = pdev->dev.platform_data;
	struct w1_gpio_platform_data *pdata;
	int err;

	err = w1_gpio_probe_dt(pdev);
	if (err < 0)
		return err;

	pdata = pdev->dev.platform_data;

	if (!pdata)
		return -ENXIO;

@@ -135,6 +180,7 @@ static struct platform_driver w1_gpio_driver = {
	.driver = {
		.name	= "w1-gpio",
		.owner	= THIS_MODULE,
		.of_match_table = of_match_ptr(w1_gpio_dt_ids),
	},
	.remove	= __exit_p(w1_gpio_remove),
	.suspend = w1_gpio_suspend,