2 * w1-gpio - GPIO w1 bus master driver
4 * Copyright (C) 2007 Ville Syrjala <syrjala@sci.fi>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2
8 * as published by the Free Software Foundation.
11 #include <linux/init.h>
12 #include <linux/module.h>
13 #include <linux/platform_device.h>
14 #include <linux/slab.h>
15 #include <linux/w1-gpio.h>
16 #include <linux/gpio.h>
17 #include <linux/of_platform.h>
18 #include <linux/of_gpio.h>
19 #include <linux/err.h>
21 #include <linux/delay.h>
24 #include "../w1_int.h"
26 static u8
w1_gpio_set_pullup(void *data
, int delay
)
28 struct w1_gpio_platform_data
*pdata
= data
;
31 pdata
->pullup_duration
= delay
;
33 if (pdata
->pullup_duration
) {
34 gpio_direction_output(pdata
->pin
, 1);
36 msleep(pdata
->pullup_duration
);
38 gpio_direction_input(pdata
->pin
);
40 pdata
->pullup_duration
= 0;
46 static void w1_gpio_write_bit_dir(void *data
, u8 bit
)
48 struct w1_gpio_platform_data
*pdata
= data
;
51 gpio_direction_input(pdata
->pin
);
53 gpio_direction_output(pdata
->pin
, 0);
56 static void w1_gpio_write_bit_val(void *data
, u8 bit
)
58 struct w1_gpio_platform_data
*pdata
= data
;
60 gpio_set_value(pdata
->pin
, bit
);
63 static u8
w1_gpio_read_bit(void *data
)
65 struct w1_gpio_platform_data
*pdata
= data
;
67 return gpio_get_value(pdata
->pin
) ? 1 : 0;
70 #if defined(CONFIG_OF)
71 static const struct of_device_id w1_gpio_dt_ids
[] = {
72 { .compatible
= "w1-gpio" },
75 MODULE_DEVICE_TABLE(of
, w1_gpio_dt_ids
);
78 static int w1_gpio_probe_dt(struct platform_device
*pdev
)
80 struct w1_gpio_platform_data
*pdata
= dev_get_platdata(&pdev
->dev
);
81 struct device_node
*np
= pdev
->dev
.of_node
;
84 pdata
= devm_kzalloc(&pdev
->dev
, sizeof(*pdata
), GFP_KERNEL
);
88 if (of_get_property(np
, "linux,open-drain", NULL
))
89 pdata
->is_open_drain
= 1;
91 gpio
= of_get_gpio(np
, 0);
93 if (gpio
!= -EPROBE_DEFER
)
95 "Failed to parse gpio property for data pin (%d)\n",
102 gpio
= of_get_gpio(np
, 1);
103 if (gpio
== -EPROBE_DEFER
)
105 /* ignore other errors as the pullup gpio is optional */
106 pdata
->ext_pullup_enable_pin
= gpio
;
108 pdev
->dev
.platform_data
= pdata
;
113 static int w1_gpio_probe(struct platform_device
*pdev
)
115 struct w1_bus_master
*master
;
116 struct w1_gpio_platform_data
*pdata
;
119 if (of_have_populated_dt()) {
120 err
= w1_gpio_probe_dt(pdev
);
125 pdata
= dev_get_platdata(&pdev
->dev
);
128 dev_err(&pdev
->dev
, "No configuration data\n");
132 master
= devm_kzalloc(&pdev
->dev
, sizeof(struct w1_bus_master
),
135 dev_err(&pdev
->dev
, "Out of memory\n");
139 err
= devm_gpio_request(&pdev
->dev
, pdata
->pin
, "w1");
141 dev_err(&pdev
->dev
, "gpio_request (pin) failed\n");
145 if (gpio_is_valid(pdata
->ext_pullup_enable_pin
)) {
146 err
= devm_gpio_request_one(&pdev
->dev
,
147 pdata
->ext_pullup_enable_pin
, GPIOF_INIT_LOW
,
150 dev_err(&pdev
->dev
, "gpio_request_one "
151 "(ext_pullup_enable_pin) failed\n");
156 master
->data
= pdata
;
157 master
->read_bit
= w1_gpio_read_bit
;
159 if (pdata
->is_open_drain
) {
160 gpio_direction_output(pdata
->pin
, 1);
161 master
->write_bit
= w1_gpio_write_bit_val
;
163 gpio_direction_input(pdata
->pin
);
164 master
->write_bit
= w1_gpio_write_bit_dir
;
165 master
->set_pullup
= w1_gpio_set_pullup
;
168 err
= w1_add_master_device(master
);
170 dev_err(&pdev
->dev
, "w1_add_master device failed\n");
174 if (pdata
->enable_external_pullup
)
175 pdata
->enable_external_pullup(1);
177 if (gpio_is_valid(pdata
->ext_pullup_enable_pin
))
178 gpio_set_value(pdata
->ext_pullup_enable_pin
, 1);
180 platform_set_drvdata(pdev
, master
);
185 static int w1_gpio_remove(struct platform_device
*pdev
)
187 struct w1_bus_master
*master
= platform_get_drvdata(pdev
);
188 struct w1_gpio_platform_data
*pdata
= dev_get_platdata(&pdev
->dev
);
190 if (pdata
->enable_external_pullup
)
191 pdata
->enable_external_pullup(0);
193 if (gpio_is_valid(pdata
->ext_pullup_enable_pin
))
194 gpio_set_value(pdata
->ext_pullup_enable_pin
, 0);
196 w1_remove_master_device(master
);
201 static int __maybe_unused
w1_gpio_suspend(struct device
*dev
)
203 struct w1_gpio_platform_data
*pdata
= dev_get_platdata(dev
);
205 if (pdata
->enable_external_pullup
)
206 pdata
->enable_external_pullup(0);
211 static int __maybe_unused
w1_gpio_resume(struct device
*dev
)
213 struct w1_gpio_platform_data
*pdata
= dev_get_platdata(dev
);
215 if (pdata
->enable_external_pullup
)
216 pdata
->enable_external_pullup(1);
221 static SIMPLE_DEV_PM_OPS(w1_gpio_pm_ops
, w1_gpio_suspend
, w1_gpio_resume
);
223 static struct platform_driver w1_gpio_driver
= {
226 .pm
= &w1_gpio_pm_ops
,
227 .of_match_table
= of_match_ptr(w1_gpio_dt_ids
),
229 .probe
= w1_gpio_probe
,
230 .remove
= w1_gpio_remove
,
233 module_platform_driver(w1_gpio_driver
);
235 MODULE_DESCRIPTION("GPIO w1 bus master driver");
236 MODULE_AUTHOR("Ville Syrjala <syrjala@sci.fi>");
237 MODULE_LICENSE("GPL");