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>
23 #include "../w1_int.h"
25 static void w1_gpio_write_bit_dir(void *data
, u8 bit
)
27 struct w1_gpio_platform_data
*pdata
= data
;
30 gpio_direction_input(pdata
->pin
);
32 gpio_direction_output(pdata
->pin
, 0);
35 static void w1_gpio_write_bit_val(void *data
, u8 bit
)
37 struct w1_gpio_platform_data
*pdata
= data
;
39 gpio_set_value(pdata
->pin
, bit
);
42 static u8
w1_gpio_read_bit(void *data
)
44 struct w1_gpio_platform_data
*pdata
= data
;
46 return gpio_get_value(pdata
->pin
) ? 1 : 0;
49 #if defined(CONFIG_OF)
50 static struct of_device_id w1_gpio_dt_ids
[] = {
51 { .compatible
= "w1-gpio" },
54 MODULE_DEVICE_TABLE(of
, w1_gpio_dt_ids
);
57 static int w1_gpio_probe_dt(struct platform_device
*pdev
)
59 struct w1_gpio_platform_data
*pdata
= pdev
->dev
.platform_data
;
60 struct device_node
*np
= pdev
->dev
.of_node
;
63 pdata
= devm_kzalloc(&pdev
->dev
, sizeof(*pdata
), GFP_KERNEL
);
67 if (of_get_property(np
, "linux,open-drain", NULL
))
68 pdata
->is_open_drain
= 1;
70 gpio
= of_get_gpio(np
, 0);
75 pdata
->ext_pullup_enable_pin
= of_get_gpio(np
, 1);
76 pdev
->dev
.platform_data
= pdata
;
81 static int w1_gpio_probe(struct platform_device
*pdev
)
83 struct w1_bus_master
*master
;
84 struct w1_gpio_platform_data
*pdata
;
87 if (of_have_populated_dt()) {
88 err
= w1_gpio_probe_dt(pdev
);
90 dev_err(&pdev
->dev
, "Failed to parse DT\n");
95 pdata
= pdev
->dev
.platform_data
;
98 dev_err(&pdev
->dev
, "No configuration data\n");
102 master
= devm_kzalloc(&pdev
->dev
, sizeof(struct w1_bus_master
),
105 dev_err(&pdev
->dev
, "Out of memory\n");
109 err
= devm_gpio_request(&pdev
->dev
, pdata
->pin
, "w1");
111 dev_err(&pdev
->dev
, "gpio_request (pin) failed\n");
115 if (gpio_is_valid(pdata
->ext_pullup_enable_pin
)) {
116 err
= devm_gpio_request_one(&pdev
->dev
,
117 pdata
->ext_pullup_enable_pin
, GPIOF_INIT_LOW
,
120 dev_err(&pdev
->dev
, "gpio_request_one "
121 "(ext_pullup_enable_pin) failed\n");
126 master
->data
= pdata
;
127 master
->read_bit
= w1_gpio_read_bit
;
129 if (pdata
->is_open_drain
) {
130 gpio_direction_output(pdata
->pin
, 1);
131 master
->write_bit
= w1_gpio_write_bit_val
;
133 gpio_direction_input(pdata
->pin
);
134 master
->write_bit
= w1_gpio_write_bit_dir
;
137 err
= w1_add_master_device(master
);
139 dev_err(&pdev
->dev
, "w1_add_master device failed\n");
143 if (pdata
->enable_external_pullup
)
144 pdata
->enable_external_pullup(1);
146 if (gpio_is_valid(pdata
->ext_pullup_enable_pin
))
147 gpio_set_value(pdata
->ext_pullup_enable_pin
, 1);
149 platform_set_drvdata(pdev
, master
);
154 static int w1_gpio_remove(struct platform_device
*pdev
)
156 struct w1_bus_master
*master
= platform_get_drvdata(pdev
);
157 struct w1_gpio_platform_data
*pdata
= pdev
->dev
.platform_data
;
159 if (pdata
->enable_external_pullup
)
160 pdata
->enable_external_pullup(0);
162 if (gpio_is_valid(pdata
->ext_pullup_enable_pin
))
163 gpio_set_value(pdata
->ext_pullup_enable_pin
, 0);
165 w1_remove_master_device(master
);
172 static int w1_gpio_suspend(struct platform_device
*pdev
, pm_message_t state
)
174 struct w1_gpio_platform_data
*pdata
= pdev
->dev
.platform_data
;
176 if (pdata
->enable_external_pullup
)
177 pdata
->enable_external_pullup(0);
182 static int w1_gpio_resume(struct platform_device
*pdev
)
184 struct w1_gpio_platform_data
*pdata
= pdev
->dev
.platform_data
;
186 if (pdata
->enable_external_pullup
)
187 pdata
->enable_external_pullup(1);
193 #define w1_gpio_suspend NULL
194 #define w1_gpio_resume NULL
197 static struct platform_driver w1_gpio_driver
= {
200 .owner
= THIS_MODULE
,
201 .of_match_table
= of_match_ptr(w1_gpio_dt_ids
),
203 .probe
= w1_gpio_probe
,
204 .remove
= w1_gpio_remove
,
205 .suspend
= w1_gpio_suspend
,
206 .resume
= w1_gpio_resume
,
209 module_platform_driver(w1_gpio_driver
);
211 MODULE_DESCRIPTION("GPIO w1 bus master driver");
212 MODULE_AUTHOR("Ville Syrjala <syrjala@sci.fi>");
213 MODULE_LICENSE("GPL");