diff -Nur a/drivers/w1/Kconfig b/drivers/w1/Kconfig --- a/drivers/w1/Kconfig 2015-01-27 03:29:32.000000000 +0100 +++ b/drivers/w1/Kconfig 2016-01-31 00:49:00.000000000 +0100 @@ -25,6 +25,32 @@ 2. Userspace commands. Includes read/write and search/alarm search commands. 3. Replies to userspace commands. +config W1_SUNXI + depends on GPIO_SUNXI + tristate "1-wire sunxi support" + default n + --- help --- + This adds a way to register a platform device for 1-wire bus. + It introduces a new section "[w1_para]" in the FEX to configure the + GPIO pin number used for the bus, with the attribute named "gpio". + The GPIO pin must also be defined in the "[gpio_para]" section. + + 1-wire device can then be accessed using the w1-gpio driver. + + Example configuration : + [w1_para] + gpio = 3 + + [gpio_para] + gpio_used = 1 + gpio_num = 3 + ... + gpio_pin_3 = port:PH7<0><0> + + It is also possible to configure the GPIO pin number with the + module paramerer "gpio". In this case, if the pin is valid, + it will be used instead of what is configured in the FEX script. + source drivers/w1/masters/Kconfig source drivers/w1/slaves/Kconfig diff -Nur a/drivers/w1/Makefile b/drivers/w1/Makefile --- a/drivers/w1/Makefile 2015-01-27 03:29:32.000000000 +0100 +++ b/drivers/w1/Makefile 2016-02-11 18:52:00.000000000 +0100 @@ -3,6 +3,7 @@ # obj-$(CONFIG_W1) += wire.o +obj-$(CONFIG_W1_SUNXI) += w1_sunxi.o wire-objs := w1.o w1_int.o w1_family.o w1_netlink.o w1_io.o obj-y += masters/ slaves/ diff -Nur a/drivers/w1/w1_sunxi.c b/drivers/w1/w1_sunxi.c --- a/drivers/w1/w1_sunxi.c 1970-01-01 01:00:00.000000000 +0100 +++ b/drivers/w1/w1_sunxi.c 2016-01-31 00:49:00.000000000 +0100 @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include +//#include +#include +#include + +static int gpio = -1; +module_param(gpio, int, 0444); +MODULE_PARM_DESC(gpio, "w1 gpio pin number"); + +static struct w1_gpio_platform_data w1_gpio_pdata = { + .pin = -1, + .is_open_drain = 0, +}; + +static void w1_gpio_release(struct device *dev) +{ + printk("w1_gpio_release good !\n"); +} + +static struct platform_device w1_device = { + .name = "w1-gpio", + .id = -1, + .dev = { + .platform_data = &w1_gpio_pdata, + .release = w1_gpio_release, + } +}; + +static int __init w1_sunxi_init(void) +{ + int ret; + script_item_u val; + script_item_value_type_e type; + + w1_gpio_pdata.pin = gpio; + + if (!gpio_is_valid(w1_gpio_pdata.pin)) { + // *** We have to determine the pin num from fex definition + /*val.val = 0; + type = script_get_item("w1_para", "w1_used", &val); + if((SCIRPT_ITEM_VALUE_TYPE_INT != type) || (val.val != 1)) { + printk(KERN_ERR "W1: not used in fex configuration (%d, %d - %d)\n", type, id, val.val); + return -EINVAL; + }*/ + + val.val = gpio; + type = script_get_item("w1_para", "gpio", &val); + if(SCIRPT_ITEM_VALUE_TYPE_INT != type) { + printk(KERN_ERR "W1_SUNXI: invalid gpio pin in fex configuration\n"); + return -EINVAL; + } + w1_gpio_pdata.pin = val.val; + if (!gpio_is_valid(w1_gpio_pdata.pin)) { + printk(KERN_ERR "W1_SUNXI: invalid gpio pin in fex configuration %d\n", val.val); + return -EINVAL; + } + } + ret = platform_device_register(&w1_device); + if (ret) { + printk(KERN_ERR "W1_SUNXI: error registering w1-gpio device on GPIO-%d\n", w1_gpio_pdata.pin); + return ret; + } + printk(KERN_INFO "W1_SUNXI: Added w1-gpio on GPIO-%d\n", w1_gpio_pdata.pin); + gpio_free(w1_gpio_pdata.pin); + return 0; +} + +static void __exit w1_sunxi_exit(void) +{ + platform_device_unregister(&w1_device); +} + +module_init(w1_sunxi_init); +module_exit(w1_sunxi_exit); + +MODULE_DESCRIPTION("GPIO w1 sunxi platform device"); +MODULE_AUTHOR("Damien Nicolet mod by LoBo