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/w1-gpio.h>
17 #include "../w1_int.h"
21 static void w1_gpio_write_bit_dir(void *data
, u8 bit
)
23 struct w1_gpio_platform_data
*pdata
= data
;
26 gpio_direction_input(pdata
->pin
);
28 gpio_direction_output(pdata
->pin
, 0);
31 static void w1_gpio_write_bit_val(void *data
, u8 bit
)
33 struct w1_gpio_platform_data
*pdata
= data
;
35 gpio_set_value(pdata
->pin
, bit
);
38 static u8
w1_gpio_read_bit(void *data
)
40 struct w1_gpio_platform_data
*pdata
= data
;
42 return gpio_get_value(pdata
->pin
) ? 1 : 0;
45 static int __init
w1_gpio_probe(struct platform_device
*pdev
)
47 struct w1_bus_master
*master
;
48 struct w1_gpio_platform_data
*pdata
= pdev
->dev
.platform_data
;
54 master
= kzalloc(sizeof(struct w1_bus_master
), GFP_KERNEL
);
58 err
= gpio_request(pdata
->pin
, "w1");
63 master
->read_bit
= w1_gpio_read_bit
;
65 if (pdata
->is_open_drain
) {
66 gpio_direction_output(pdata
->pin
, 1);
67 master
->write_bit
= w1_gpio_write_bit_val
;
69 gpio_direction_input(pdata
->pin
);
70 master
->write_bit
= w1_gpio_write_bit_dir
;
73 err
= w1_add_master_device(master
);
77 if (pdata
->enable_external_pullup
)
78 pdata
->enable_external_pullup(1);
80 platform_set_drvdata(pdev
, master
);
85 gpio_free(pdata
->pin
);
92 static int __exit
w1_gpio_remove(struct platform_device
*pdev
)
94 struct w1_bus_master
*master
= platform_get_drvdata(pdev
);
95 struct w1_gpio_platform_data
*pdata
= pdev
->dev
.platform_data
;
97 if (pdata
->enable_external_pullup
)
98 pdata
->enable_external_pullup(0);
100 w1_remove_master_device(master
);
101 gpio_free(pdata
->pin
);
109 static int w1_gpio_suspend(struct platform_device
*pdev
, pm_message_t state
)
111 struct w1_gpio_platform_data
*pdata
= pdev
->dev
.platform_data
;
113 if (pdata
->enable_external_pullup
)
114 pdata
->enable_external_pullup(0);
119 static int w1_gpio_resume(struct platform_device
*pdev
)
121 struct w1_gpio_platform_data
*pdata
= pdev
->dev
.platform_data
;
123 if (pdata
->enable_external_pullup
)
124 pdata
->enable_external_pullup(1);
130 #define w1_gpio_suspend NULL
131 #define w1_gpio_resume NULL
134 static struct platform_driver w1_gpio_driver
= {
137 .owner
= THIS_MODULE
,
139 .remove
= __exit_p(w1_gpio_remove
),
140 .suspend
= w1_gpio_suspend
,
141 .resume
= w1_gpio_resume
,
144 static int __init
w1_gpio_init(void)
146 return platform_driver_probe(&w1_gpio_driver
, w1_gpio_probe
);
149 static void __exit
w1_gpio_exit(void)
151 platform_driver_unregister(&w1_gpio_driver
);
154 module_init(w1_gpio_init
);
155 module_exit(w1_gpio_exit
);
157 MODULE_DESCRIPTION("GPIO w1 bus master driver");
158 MODULE_AUTHOR("Ville Syrjala <syrjala@sci.fi>");
159 MODULE_LICENSE("GPL");