* [PATCH] W1: Add the DS2482 I2C-to-w1 bridge driver. [not found] <11377372352083@kroah.com> @ 2006-01-20 6:07 ` Greg KH 2006-01-20 6:07 ` [PATCH] W1: misc cleanups Greg KH 0 siblings, 1 reply; 6+ messages in thread From: Greg KH @ 2006-01-20 6:07 UTC (permalink / raw) To: linux-kernel; +Cc: johnpol [PATCH] W1: Add the DS2482 I2C-to-w1 bridge driver. Signed-off-by: Ben Gardner <bgardner@wabtec.com> Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> --- commit 165f27bfefd691cb7d854379ea5ba9b4450ee510 tree 0ce370c7919f9646a25dc0db8729682a0ebadc0c parent 136853f9a8a390aa80f3725613ee3c75dc027802 author Evgeniy Polyakov <johnpol@2ka.mipt.ru> Tue, 06 Dec 2005 13:38:28 +0300 committer Greg Kroah-Hartman <gregkh@suse.de> Thu, 19 Jan 2006 21:53:26 -0800 Documentation/w1/masters/ds2482 | 31 ++ drivers/w1/masters/Kconfig | 10 + drivers/w1/masters/Makefile | 2 drivers/w1/masters/ds2482.c | 564 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 607 insertions(+), 0 deletions(-) diff --git a/Documentation/w1/masters/ds2482 b/Documentation/w1/masters/ds2482 new file mode 100644 index 0000000..c5d5478 --- /dev/null +++ b/Documentation/w1/masters/ds2482 @@ -0,0 +1,31 @@ +Kernel driver ds2482 +==================== + +Supported chips: + * Maxim DS2482-100, Maxim DS2482-800 + Prefix: 'ds2482' + Addresses scanned: None + Datasheets: + http://pdfserv.maxim-ic.com/en/ds/DS2482-100-DS2482S-100.pdf + http://pdfserv.maxim-ic.com/en/ds/DS2482-800-DS2482S-800.pdf + +Author: Ben Gardner <bgardner@wabtec.com> + + +Description +----------- + +The Maixm/Dallas Semiconductor DS2482 is a I2C device that provides +one (DS2482-100) or eight (DS2482-800) 1-wire busses. + + +General Remarks +--------------- + +Valid addresses are 0x18, 0x19, 0x1a, and 0x1b. +However, the device cannot be detected without writing to the i2c bus, so no +detection is done. +You should force the device address. + +$ modprobe ds2482 force=0,0x18 + diff --git a/drivers/w1/masters/Kconfig b/drivers/w1/masters/Kconfig index 51bd64d..1ff11b5 100644 --- a/drivers/w1/masters/Kconfig +++ b/drivers/w1/masters/Kconfig @@ -34,5 +34,15 @@ config W1_MASTER_DS9490_BRIDGE This support is also available as a module. If so, the module will be called ds_w1_bridge.ko. +config W1_MASTER_DS2482 + tristate "Maxim DS2482 I2C to 1-Wire bridge" + depends on I2C && W1 && EXPERIMENTAL + help + If you say yes here you get support for the Maxim DS2482 + I2C to 1-Wire bridge. + + This driver can also be built as a module. If so, the module + will be called ds2482. + endmenu diff --git a/drivers/w1/masters/Makefile b/drivers/w1/masters/Makefile index d9b84e5..1f3c8b9 100644 --- a/drivers/w1/masters/Makefile +++ b/drivers/w1/masters/Makefile @@ -9,3 +9,5 @@ ds9490r-objs := dscore.o obj-$(CONFIG_W1_MASTER_DS9490_BRIDGE) += ds_w1_bridge.o +obj-$(CONFIG_W1_MASTER_DS2482) += ds2482.o + diff --git a/drivers/w1/masters/ds2482.c b/drivers/w1/masters/ds2482.c new file mode 100644 index 0000000..d1cacd2 --- /dev/null +++ b/drivers/w1/masters/ds2482.c @@ -0,0 +1,564 @@ +/** + * ds2482.c - provides i2c to w1-master bridge(s) + * Copyright (C) 2005 Ben Gardner <bgardner@wabtec.com> + * + * The DS2482 is a sensor chip made by Dallas Semiconductor (Maxim). + * It is a I2C to 1-wire bridge. + * There are two variations: -100 and -800, which have 1 or 8 1-wire ports. + * The complete datasheet can be obtained from MAXIM's website at: + * http://www.maxim-ic.com/quick_view2.cfm/qv_pk/4382 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + */ + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/slab.h> +#include <linux/i2c.h> +#include <linux/delay.h> +#include <asm/delay.h> + +#include "../w1.h" +#include "../w1_int.h" + +/** + * Address is selected using 2 pins, resulting in 4 possible addresses. + * 0x18, 0x19, 0x1a, 0x1b + * However, the chip cannot be detected without doing an i2c write, + * so use the force module parameter. + */ +static unsigned short normal_i2c[] = {I2C_CLIENT_END}; + +/** + * Insmod parameters + */ +I2C_CLIENT_INSMOD_1(ds2482); + +/** + * The DS2482 registers - there are 3 registers that are addressed by a read + * pointer. The read pointer is set by the last command executed. + * + * To read the data, issue a register read for any address + */ +#define DS2482_CMD_RESET 0xF0 /* No param */ +#define DS2482_CMD_SET_READ_PTR 0xE1 /* Param: DS2482_PTR_CODE_xxx */ +#define DS2482_CMD_CHANNEL_SELECT 0xC3 /* Param: Channel byte - DS2482-800 only */ +#define DS2482_CMD_WRITE_CONFIG 0xD2 /* Param: Config byte */ +#define DS2482_CMD_1WIRE_RESET 0xB4 /* Param: None */ +#define DS2482_CMD_1WIRE_SINGLE_BIT 0x87 /* Param: Bit byte (bit7) */ +#define DS2482_CMD_1WIRE_WRITE_BYTE 0xA5 /* Param: Data byte */ +#define DS2482_CMD_1WIRE_READ_BYTE 0x96 /* Param: None */ +/* Note to read the byte, Set the ReadPtr to Data then read (any addr) */ +#define DS2482_CMD_1WIRE_TRIPLET 0x78 /* Param: Dir byte (bit7) */ + +/* Values for DS2482_CMD_SET_READ_PTR */ +#define DS2482_PTR_CODE_STATUS 0xF0 +#define DS2482_PTR_CODE_DATA 0xE1 +#define DS2482_PTR_CODE_CHANNEL 0xD2 /* DS2482-800 only */ +#define DS2482_PTR_CODE_CONFIG 0xC3 + +/** + * Configure Register bit definitions + * The top 4 bits always read 0. + * To write, the top nibble must be the 1's compl. of the low nibble. + */ +#define DS2482_REG_CFG_1WS 0x08 +#define DS2482_REG_CFG_SPU 0x04 +#define DS2482_REG_CFG_PPM 0x02 +#define DS2482_REG_CFG_APU 0x01 + + +/** + * Write and verify codes for the CHANNEL_SELECT command (DS2482-800 only). + * To set the channel, write the value at the index of the channel. + * Read and compare against the corresponding value to verify the change. + */ +static const u8 ds2482_chan_wr[8] = + { 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87 }; +static const u8 ds2482_chan_rd[8] = + { 0xB8, 0xB1, 0xAA, 0xA3, 0x9C, 0x95, 0x8E, 0x87 }; + + +/** + * Status Register bit definitions (read only) + */ +#define DS2482_REG_STS_DIR 0x80 +#define DS2482_REG_STS_TSB 0x40 +#define DS2482_REG_STS_SBR 0x20 +#define DS2482_REG_STS_RST 0x10 +#define DS2482_REG_STS_LL 0x08 +#define DS2482_REG_STS_SD 0x04 +#define DS2482_REG_STS_PPD 0x02 +#define DS2482_REG_STS_1WB 0x01 + + +static int ds2482_attach_adapter(struct i2c_adapter *adapter); +static int ds2482_detect(struct i2c_adapter *adapter, int address, int kind); +static int ds2482_detach_client(struct i2c_client *client); + + +/** + * Driver data (common to all clients) + */ +static struct i2c_driver ds2482_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "ds2482", + }, + .attach_adapter = ds2482_attach_adapter, + .detach_client = ds2482_detach_client, +}; + +/* + * Client data (each client gets its own) + */ + +struct ds2482_data; + +struct ds2482_w1_chan { + struct ds2482_data *pdev; + u8 channel; + struct w1_bus_master w1_bm; +}; + +struct ds2482_data { + struct i2c_client client; + struct semaphore access_lock; + + /* 1-wire interface(s) */ + int w1_count; /* 1 or 8 */ + struct ds2482_w1_chan w1_ch[8]; + + /* per-device values */ + u8 channel; + u8 read_prt; /* see DS2482_PTR_CODE_xxx */ + u8 reg_config; +}; + + +/** + * Sets the read pointer. + * @param pdev The ds2482 client pointer + * @param read_ptr see DS2482_PTR_CODE_xxx above + * @return -1 on failure, 0 on success + */ +static inline int ds2482_select_register(struct ds2482_data *pdev, u8 read_ptr) +{ + if (pdev->read_prt != read_ptr) { + if (i2c_smbus_write_byte_data(&pdev->client, + DS2482_CMD_SET_READ_PTR, + read_ptr) < 0) + return -1; + + pdev->read_prt = read_ptr; + } + return 0; +} + +/** + * Sends a command without a parameter + * @param pdev The ds2482 client pointer + * @param cmd DS2482_CMD_RESET, + * DS2482_CMD_1WIRE_RESET, + * DS2482_CMD_1WIRE_READ_BYTE + * @return -1 on failure, 0 on success + */ +static inline int ds2482_send_cmd(struct ds2482_data *pdev, u8 cmd) +{ + if (i2c_smbus_write_byte(&pdev->client, cmd) < 0) + return -1; + + pdev->read_prt = DS2482_PTR_CODE_STATUS; + return 0; +} + +/** + * Sends a command with a parameter + * @param pdev The ds2482 client pointer + * @param cmd DS2482_CMD_WRITE_CONFIG, + * DS2482_CMD_1WIRE_SINGLE_BIT, + * DS2482_CMD_1WIRE_WRITE_BYTE, + * DS2482_CMD_1WIRE_TRIPLET + * @param byte The data to send + * @return -1 on failure, 0 on success + */ +static inline int ds2482_send_cmd_data(struct ds2482_data *pdev, + u8 cmd, u8 byte) +{ + if (i2c_smbus_write_byte_data(&pdev->client, cmd, byte) < 0) + return -1; + + /* all cmds leave in STATUS, except CONFIG */ + pdev->read_prt = (cmd != DS2482_CMD_WRITE_CONFIG) ? + DS2482_PTR_CODE_STATUS : DS2482_PTR_CODE_CONFIG; + return 0; +} + + +/* + * 1-Wire interface code + */ + +#define DS2482_WAIT_IDLE_TIMEOUT 100 + +/** + * Waits until the 1-wire interface is idle (not busy) + * + * @param pdev Pointer to the device structure + * @return the last value read from status or -1 (failure) + */ +static int ds2482_wait_1wire_idle(struct ds2482_data *pdev) +{ + int temp = -1; + int retries = 0; + + if (!ds2482_select_register(pdev, DS2482_PTR_CODE_STATUS)) { + do { + temp = i2c_smbus_read_byte(&pdev->client); + } while ((temp >= 0) && (temp & DS2482_REG_STS_1WB) && + (++retries > DS2482_WAIT_IDLE_TIMEOUT)); + } + + if (retries > DS2482_WAIT_IDLE_TIMEOUT) + printk(KERN_ERR "%s: timeout on channel %d\n", + __func__, pdev->channel); + + return temp; +} + +/** + * Selects a w1 channel. + * The 1-wire interface must be idle before calling this function. + * + * @param pdev The ds2482 client pointer + * @param channel 0-7 + * @return -1 (failure) or 0 (success) + */ +static int ds2482_set_channel(struct ds2482_data *pdev, u8 channel) +{ + if (i2c_smbus_write_byte_data(&pdev->client, DS2482_CMD_CHANNEL_SELECT, + ds2482_chan_wr[channel]) < 0) + return -1; + + pdev->read_prt = DS2482_PTR_CODE_CHANNEL; + pdev->channel = -1; + if (i2c_smbus_read_byte(&pdev->client) == ds2482_chan_rd[channel]) { + pdev->channel = channel; + return 0; + } + return -1; +} + + +/** + * Performs the touch-bit function, which writes a 0 or 1 and reads the level. + * + * @param data The ds2482 channel pointer + * @param bit The level to write: 0 or non-zero + * @return The level read: 0 or 1 + */ +static u8 ds2482_w1_touch_bit(void *data, u8 bit) +{ + struct ds2482_w1_chan *pchan = data; + struct ds2482_data *pdev = pchan->pdev; + int status = -1; + + down(&pdev->access_lock); + + /* Select the channel */ + ds2482_wait_1wire_idle(pdev); + if (pdev->w1_count > 1) + ds2482_set_channel(pdev, pchan->channel); + + /* Send the touch command, wait until 1WB == 0, return the status */ + if (!ds2482_send_cmd_data(pdev, DS2482_CMD_1WIRE_SINGLE_BIT, + bit ? 0xFF : 0)) + status = ds2482_wait_1wire_idle(pdev); + + up(&pdev->access_lock); + + return (status & DS2482_REG_STS_SBR) ? 1 : 0; +} + +/** + * Performs the triplet function, which reads two bits and writes a bit. + * The bit written is determined by the two reads: + * 00 => dbit, 01 => 0, 10 => 1 + * + * @param data The ds2482 channel pointer + * @param dbit The direction to choose if both branches are valid + * @return b0=read1 b1=read2 b3=bit written + */ +static u8 ds2482_w1_triplet(void *data, u8 dbit) +{ + struct ds2482_w1_chan *pchan = data; + struct ds2482_data *pdev = pchan->pdev; + int status = (3 << 5); + + down(&pdev->access_lock); + + /* Select the channel */ + ds2482_wait_1wire_idle(pdev); + if (pdev->w1_count > 1) + ds2482_set_channel(pdev, pchan->channel); + + /* Send the triplet command, wait until 1WB == 0, return the status */ + if (!ds2482_send_cmd_data(pdev, DS2482_CMD_1WIRE_TRIPLET, + dbit ? 0xFF : 0)) + status = ds2482_wait_1wire_idle(pdev); + + up(&pdev->access_lock); + + /* Decode the status */ + return (status >> 5); +} + +/** + * Performs the write byte function. + * + * @param data The ds2482 channel pointer + * @param byte The value to write + */ +static void ds2482_w1_write_byte(void *data, u8 byte) +{ + struct ds2482_w1_chan *pchan = data; + struct ds2482_data *pdev = pchan->pdev; + + down(&pdev->access_lock); + + /* Select the channel */ + ds2482_wait_1wire_idle(pdev); + if (pdev->w1_count > 1) + ds2482_set_channel(pdev, pchan->channel); + + /* Send the write byte command */ + ds2482_send_cmd_data(pdev, DS2482_CMD_1WIRE_WRITE_BYTE, byte); + + up(&pdev->access_lock); +} + +/** + * Performs the read byte function. + * + * @param data The ds2482 channel pointer + * @return The value read + */ +static u8 ds2482_w1_read_byte(void *data) +{ + struct ds2482_w1_chan *pchan = data; + struct ds2482_data *pdev = pchan->pdev; + int result; + + down(&pdev->access_lock); + + /* Select the channel */ + ds2482_wait_1wire_idle(pdev); + if (pdev->w1_count > 1) + ds2482_set_channel(pdev, pchan->channel); + + /* Send the read byte command */ + ds2482_send_cmd(pdev, DS2482_CMD_1WIRE_READ_BYTE); + + /* Wait until 1WB == 0 */ + ds2482_wait_1wire_idle(pdev); + + /* Select the data register */ + ds2482_select_register(pdev, DS2482_PTR_CODE_DATA); + + /* Read the data byte */ + result = i2c_smbus_read_byte(&pdev->client); + + up(&pdev->access_lock); + + return result; +} + + +/** + * Sends a reset on the 1-wire interface + * + * @param data The ds2482 channel pointer + * @return 0=Device present, 1=No device present or error + */ +static u8 ds2482_w1_reset_bus(void *data) +{ + struct ds2482_w1_chan *pchan = data; + struct ds2482_data *pdev = pchan->pdev; + int err; + u8 retval = 1; + + down(&pdev->access_lock); + + /* Select the channel */ + ds2482_wait_1wire_idle(pdev); + if (pdev->w1_count > 1) + ds2482_set_channel(pdev, pchan->channel); + + /* Send the reset command */ + err = ds2482_send_cmd(pdev, DS2482_CMD_1WIRE_RESET); + if (err >= 0) { + /* Wait until the reset is complete */ + err = ds2482_wait_1wire_idle(pdev); + retval = !(err & DS2482_REG_STS_PPD); + + /* If the chip did reset since detect, re-config it */ + if (err & DS2482_REG_STS_RST) + ds2482_send_cmd_data(pdev, DS2482_CMD_WRITE_CONFIG, + 0xF0); + } + + up(&pdev->access_lock); + + return retval; +} + + +/** + * Called to see if the device exists on an i2c bus. + */ +static int ds2482_attach_adapter(struct i2c_adapter *adapter) +{ + return i2c_probe(adapter, &addr_data, ds2482_detect); +} + + +/* + * The following function does more than just detection. If detection + * succeeds, it also registers the new chip. + */ +static int ds2482_detect(struct i2c_adapter *adapter, int address, int kind) +{ + struct ds2482_data *data; + struct i2c_client *new_client; + int err = 0; + int temp1; + int idx; + + if (!i2c_check_functionality(adapter, + I2C_FUNC_SMBUS_WRITE_BYTE_DATA | + I2C_FUNC_SMBUS_BYTE)) + goto exit; + + if (!(data = kzalloc(sizeof(struct ds2482_data), GFP_KERNEL))) { + err = -ENOMEM; + goto exit; + } + + new_client = &data->client; + i2c_set_clientdata(new_client, data); + new_client->addr = address; + new_client->driver = &ds2482_driver; + new_client->adapter = adapter; + + /* Reset the device (sets the read_ptr to status) */ + if (ds2482_send_cmd(data, DS2482_CMD_RESET) < 0) { + dev_dbg(&adapter->dev, "DS2482 reset failed at 0x%02x.\n", + address); + goto exit_free; + } + + /* Sleep at least 525ns to allow the reset to complete */ + ndelay(525); + + /* Read the status byte - only reset bit and line should be set */ + temp1 = i2c_smbus_read_byte(new_client); + if (temp1 != (DS2482_REG_STS_LL | DS2482_REG_STS_RST)) { + dev_dbg(&adapter->dev, "DS2482 (0x%02x) reset status " + "0x%02X - not a DS2482\n", address, temp1); + goto exit_free; + } + + /* Detect the 8-port version */ + data->w1_count = 1; + if (ds2482_set_channel(data, 7) == 0) + data->w1_count = 8; + + /* Set all config items to 0 (off) */ + ds2482_send_cmd_data(data, DS2482_CMD_WRITE_CONFIG, 0xF0); + + /* We can fill in the remaining client fields */ + snprintf(new_client->name, sizeof(new_client->name), "ds2482-%d00", + data->w1_count); + + init_MUTEX(&data->access_lock); + + /* Tell the I2C layer a new client has arrived */ + if ((err = i2c_attach_client(new_client))) + goto exit_free; + + /* Register 1-wire interface(s) */ + for (idx = 0; idx < data->w1_count; idx++) { + data->w1_ch[idx].pdev = data; + data->w1_ch[idx].channel = idx; + + /* Populate all the w1 bus master stuff */ + data->w1_ch[idx].w1_bm.data = &data->w1_ch[idx]; + data->w1_ch[idx].w1_bm.read_byte = ds2482_w1_read_byte; + data->w1_ch[idx].w1_bm.write_byte = ds2482_w1_write_byte; + data->w1_ch[idx].w1_bm.touch_bit = ds2482_w1_touch_bit; + data->w1_ch[idx].w1_bm.triplet = ds2482_w1_triplet; + data->w1_ch[idx].w1_bm.reset_bus = ds2482_w1_reset_bus; + + err = w1_add_master_device(&data->w1_ch[idx].w1_bm); + if (err) { + data->w1_ch[idx].pdev = NULL; + goto exit_w1_remove; + } + } + + return 0; + +exit_w1_remove: + i2c_detach_client(new_client); + + for (idx = 0; idx < data->w1_count; idx++) { + if (data->w1_ch[idx].pdev != NULL) + w1_remove_master_device(&data->w1_ch[idx].w1_bm); + } +exit_free: + kfree(data); +exit: + return err; +} + +static int ds2482_detach_client(struct i2c_client *client) +{ + struct ds2482_data *data = i2c_get_clientdata(client); + int err, idx; + + /* Unregister the 1-wire bridge(s) */ + for (idx = 0; idx < data->w1_count; idx++) { + if (data->w1_ch[idx].pdev != NULL) + w1_remove_master_device(&data->w1_ch[idx].w1_bm); + } + + /* Detach the i2c device */ + if ((err = i2c_detach_client(client))) { + dev_err(&client->dev, + "Deregistration failed, client not detached.\n"); + return err; + } + + /* Free the memory */ + kfree(data); + return 0; +} + +static int __init sensors_ds2482_init(void) +{ + return i2c_add_driver(&ds2482_driver); +} + +static void __exit sensors_ds2482_exit(void) +{ + i2c_del_driver(&ds2482_driver); +} + +MODULE_AUTHOR("Ben Gardner <bgardner@wabtec.com>"); +MODULE_DESCRIPTION("DS2482 driver"); +MODULE_LICENSE("GPL"); + +module_init(sensors_ds2482_init); +module_exit(sensors_ds2482_exit); ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] W1: misc cleanups 2006-01-20 6:07 ` [PATCH] W1: Add the DS2482 I2C-to-w1 bridge driver Greg KH @ 2006-01-20 6:07 ` Greg KH 2006-01-20 6:07 ` [PATCH] W1: fix W1_MASTER_DS9490_BRIDGE dependencies Greg KH 0 siblings, 1 reply; 6+ messages in thread From: Greg KH @ 2006-01-20 6:07 UTC (permalink / raw) To: linux-kernel; +Cc: bunk [PATCH] W1: misc cleanups This patch contains the following cleanups: - make needlessly global code static - declarations for global code belong into header files - w1.c: #if 0 the unused struct w1_slave_device Signed-off-by: Adrian Bunk <bunk@stusta.de> Acked-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> --- commit 41e00d8d7535fc78425b8ac2436a7be3d4d2ccdf tree c9947399f54f028ea739dc4d550bd0d1a1e702c0 parent 165f27bfefd691cb7d854379ea5ba9b4450ee510 author Adrian Bunk <bunk@stusta.de> Tue, 13 Dec 2005 14:04:33 -0800 committer Greg Kroah-Hartman <gregkh@suse.de> Thu, 19 Jan 2006 21:53:26 -0800 drivers/w1/w1.c | 6 ++++-- drivers/w1/w1.h | 10 ++++++++++ drivers/w1/w1_family.c | 2 +- drivers/w1/w1_int.c | 13 ++----------- drivers/w1/w1_io.c | 2 +- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index f0b47fe..5def7fb 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c @@ -164,11 +164,12 @@ struct device w1_master_device = { .release = &w1_master_release }; -struct device_driver w1_slave_driver = { +static struct device_driver w1_slave_driver = { .name = "w1_slave_driver", .bus = &w1_bus_type, }; +#if 0 struct device w1_slave_device = { .parent = NULL, .bus = &w1_bus_type, @@ -176,6 +177,7 @@ struct device w1_slave_device = { .driver = &w1_slave_driver, .release = &w1_slave_release }; +#endif /* 0 */ static ssize_t w1_master_attribute_show_name(struct device *dev, struct device_attribute *attr, char *buf) { @@ -355,7 +357,7 @@ int w1_create_master_attributes(struct w return sysfs_create_group(&master->dev.kobj, &w1_master_defattr_group); } -void w1_destroy_master_attributes(struct w1_master *master) +static void w1_destroy_master_attributes(struct w1_master *master) { sysfs_remove_group(&master->dev.kobj, &w1_master_defattr_group); } diff --git a/drivers/w1/w1.h b/drivers/w1/w1.h index b62e771..5f09213 100644 --- a/drivers/w1/w1.h +++ b/drivers/w1/w1.h @@ -203,6 +203,16 @@ static inline struct w1_master* dev_to_w return container_of(dev, struct w1_master, dev); } +extern int w1_max_slave_count; +extern int w1_max_slave_ttl; +extern spinlock_t w1_mlock; +extern struct list_head w1_masters; +extern struct device_driver w1_master_driver; +extern struct device w1_master_device; + +int w1_process(void *data); +void w1_reconnect_slaves(struct w1_family *f); + #endif /* __KERNEL__ */ #endif /* __W1_H */ diff --git a/drivers/w1/w1_family.c b/drivers/w1/w1_family.c index 9e293e1..0e32c11 100644 --- a/drivers/w1/w1_family.c +++ b/drivers/w1/w1_family.c @@ -25,10 +25,10 @@ #include <linux/delay.h> #include "w1_family.h" +#include "w1.h" DEFINE_SPINLOCK(w1_flock); static LIST_HEAD(w1_families); -extern void w1_reconnect_slaves(struct w1_family *f); int w1_register_family(struct w1_family *newf) { diff --git a/drivers/w1/w1_int.c b/drivers/w1/w1_int.c index c3f67ea..4724693 100644 --- a/drivers/w1/w1_int.c +++ b/drivers/w1/w1_int.c @@ -26,19 +26,10 @@ #include "w1.h" #include "w1_log.h" #include "w1_netlink.h" +#include "w1_int.h" static u32 w1_ids = 1; -extern struct device_driver w1_master_driver; -extern struct bus_type w1_bus_type; -extern struct device w1_master_device; -extern int w1_max_slave_count; -extern int w1_max_slave_ttl; -extern struct list_head w1_masters; -extern spinlock_t w1_mlock; - -extern int w1_process(void *); - static struct w1_master * w1_alloc_dev(u32 id, int slave_count, int slave_ttl, struct device_driver *driver, struct device *device) @@ -103,7 +94,7 @@ static struct w1_master * w1_alloc_dev(u return dev; } -void w1_free_dev(struct w1_master *dev) +static void w1_free_dev(struct w1_master *dev) { device_unregister(&dev->dev); } diff --git a/drivers/w1/w1_io.c b/drivers/w1/w1_io.c index e2a0433..f7f7e8b 100644 --- a/drivers/w1/w1_io.c +++ b/drivers/w1/w1_io.c @@ -28,7 +28,7 @@ #include "w1_log.h" #include "w1_io.h" -int w1_delay_parm = 1; +static int w1_delay_parm = 1; module_param_named(delay_coef, w1_delay_parm, int, 0); static u8 w1_crc8_table[] = { ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] W1: fix W1_MASTER_DS9490_BRIDGE dependencies 2006-01-20 6:07 ` [PATCH] W1: misc cleanups Greg KH @ 2006-01-20 6:07 ` Greg KH 2006-01-20 6:07 ` [PATCH] W1: Remove incorrect MODULE_ALIAS Greg KH 0 siblings, 1 reply; 6+ messages in thread From: Greg KH @ 2006-01-20 6:07 UTC (permalink / raw) To: linux-kernel; +Cc: bunk [PATCH] W1: fix W1_MASTER_DS9490_BRIDGE dependencies W1_DS9490 was renamed to W1_MASTER_DS9490, but the entry in the dependencies of W1_MASTER_DS9490_BRIDGE was forgotten. Signed-off-by: Adrian Bunk <bunk@stusta.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> --- commit b6036c958a190777a16e89dc53088bd9fabfc2ff tree 1583be4e025a9574b08ae7d8041edee0dafd7dc9 parent 41e00d8d7535fc78425b8ac2436a7be3d4d2ccdf author Adrian Bunk <bunk@stusta.de> Fri, 06 Jan 2006 18:41:01 +0100 committer Greg Kroah-Hartman <gregkh@suse.de> Thu, 19 Jan 2006 21:53:26 -0800 drivers/w1/masters/Kconfig | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/w1/masters/Kconfig b/drivers/w1/masters/Kconfig index 1ff11b5..c6bad4d 100644 --- a/drivers/w1/masters/Kconfig +++ b/drivers/w1/masters/Kconfig @@ -26,7 +26,7 @@ config W1_MASTER_DS9490 config W1_MASTER_DS9490_BRIDGE tristate "DS9490R USB <-> W1 transport layer for 1-wire" - depends on W1_DS9490 + depends on W1_MASTER_DS9490 help Say Y here if you want to communicate with your 1-wire devices using DS9490R USB bridge. ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] W1: Remove incorrect MODULE_ALIAS 2006-01-20 6:07 ` [PATCH] W1: fix W1_MASTER_DS9490_BRIDGE dependencies Greg KH @ 2006-01-20 6:07 ` Greg KH 2006-01-20 6:07 ` [PATCH] W1: Change the type 'unsigned long' member of 'struct w1_bus_master' to 'void *' Greg KH 0 siblings, 1 reply; 6+ messages in thread From: Greg KH @ 2006-01-20 6:07 UTC (permalink / raw) To: linux-kernel; +Cc: kaber [PATCH] W1: Remove incorrect MODULE_ALIAS The w1 netlink socket is created by a hardware specific driver calling w1_add_master_device, so there is no point in including a module alias for netlink autoloading in the core. Signed-off-by: Patrick McHardy <kaber@trash.net> Acked-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> --- commit c8d1a16495d65c58ac1454e33b124105db9eb4fd tree d184d519cee36d595685abbcde303f4e9d2f164a parent b6036c958a190777a16e89dc53088bd9fabfc2ff author Patrick McHardy <kaber@trash.net> Sun, 08 Jan 2006 00:44:15 +0100 committer Greg Kroah-Hartman <gregkh@suse.de> Thu, 19 Jan 2006 21:53:26 -0800 drivers/w1/w1_int.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/drivers/w1/w1_int.c b/drivers/w1/w1_int.c index 4724693..a2f9065 100644 --- a/drivers/w1/w1_int.c +++ b/drivers/w1/w1_int.c @@ -208,5 +208,3 @@ void w1_remove_master_device(struct w1_b EXPORT_SYMBOL(w1_add_master_device); EXPORT_SYMBOL(w1_remove_master_device); - -MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_W1); ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] W1: Change the type 'unsigned long' member of 'struct w1_bus_master' to 'void *'. 2006-01-20 6:07 ` [PATCH] W1: Remove incorrect MODULE_ALIAS Greg KH @ 2006-01-20 6:07 ` Greg KH 2006-01-20 6:07 ` [PATCH] W1: u64 is not long long Greg KH 0 siblings, 1 reply; 6+ messages in thread From: Greg KH @ 2006-01-20 6:07 UTC (permalink / raw) To: linux-kernel; +Cc: johnpol [PATCH] W1: Change the type 'unsigned long' member of 'struct w1_bus_master' to 'void *'. Signed-off-by: Ben Gardner <bgardner@wabtec.com> Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> --- commit dc66784cd427bffa52cad9c615c409b1a597ed08 tree 7a79f765314178dbf716313537bf8dc6d5ed1940 parent 0f36b018b2e314d45af86449f1a97facb1fbe300 author Evgeniy Polyakov <johnpol@2ka.mipt.ru> Tue, 06 Dec 2005 13:38:27 +0300 committer Greg Kroah-Hartman <gregkh@suse.de> Thu, 19 Jan 2006 21:53:26 -0800 drivers/w1/ds_w1_bridge.c | 34 +++++++++++++++++----------------- drivers/w1/matrox_w1.c | 14 +++++++------- drivers/w1/w1.c | 8 ++++---- drivers/w1/w1.h | 24 ++++++++++++------------ 4 files changed, 40 insertions(+), 40 deletions(-) diff --git a/drivers/w1/ds_w1_bridge.c b/drivers/w1/ds_w1_bridge.c index a79d16d..29e01d5 100644 --- a/drivers/w1/ds_w1_bridge.c +++ b/drivers/w1/ds_w1_bridge.c @@ -29,10 +29,10 @@ static struct ds_device *ds_dev; static struct w1_bus_master *ds_bus_master; -static u8 ds9490r_touch_bit(unsigned long data, u8 bit) +static u8 ds9490r_touch_bit(void *data, u8 bit) { u8 ret; - struct ds_device *dev = (struct ds_device *)data; + struct ds_device *dev = data; if (ds_touch_bit(dev, bit, &ret)) return 0; @@ -40,23 +40,23 @@ static u8 ds9490r_touch_bit(unsigned lon return ret; } -static void ds9490r_write_bit(unsigned long data, u8 bit) +static void ds9490r_write_bit(void *data, u8 bit) { - struct ds_device *dev = (struct ds_device *)data; + struct ds_device *dev = data; ds_write_bit(dev, bit); } -static void ds9490r_write_byte(unsigned long data, u8 byte) +static void ds9490r_write_byte(void *data, u8 byte) { - struct ds_device *dev = (struct ds_device *)data; + struct ds_device *dev = data; ds_write_byte(dev, byte); } -static u8 ds9490r_read_bit(unsigned long data) +static u8 ds9490r_read_bit(void *data) { - struct ds_device *dev = (struct ds_device *)data; + struct ds_device *dev = data; int err; u8 bit = 0; @@ -70,9 +70,9 @@ static u8 ds9490r_read_bit(unsigned long return bit & 1; } -static u8 ds9490r_read_byte(unsigned long data) +static u8 ds9490r_read_byte(void *data) { - struct ds_device *dev = (struct ds_device *)data; + struct ds_device *dev = data; int err; u8 byte = 0; @@ -83,16 +83,16 @@ static u8 ds9490r_read_byte(unsigned lon return byte; } -static void ds9490r_write_block(unsigned long data, const u8 *buf, int len) +static void ds9490r_write_block(void *data, const u8 *buf, int len) { - struct ds_device *dev = (struct ds_device *)data; + struct ds_device *dev = data; ds_write_block(dev, (u8 *)buf, len); } -static u8 ds9490r_read_block(unsigned long data, u8 *buf, int len) +static u8 ds9490r_read_block(void *data, u8 *buf, int len) { - struct ds_device *dev = (struct ds_device *)data; + struct ds_device *dev = data; int err; err = ds_read_block(dev, buf, len); @@ -102,9 +102,9 @@ static u8 ds9490r_read_block(unsigned lo return len; } -static u8 ds9490r_reset(unsigned long data) +static u8 ds9490r_reset(void *data) { - struct ds_device *dev = (struct ds_device *)data; + struct ds_device *dev = data; struct ds_status st; int err; @@ -136,7 +136,7 @@ static int __devinit ds_w1_init(void) memset(ds_bus_master, 0, sizeof(*ds_bus_master)); - ds_bus_master->data = (unsigned long)ds_dev; + ds_bus_master->data = ds_dev; ds_bus_master->touch_bit = &ds9490r_touch_bit; ds_bus_master->read_bit = &ds9490r_read_bit; ds_bus_master->write_bit = &ds9490r_write_bit; diff --git a/drivers/w1/matrox_w1.c b/drivers/w1/matrox_w1.c index 0b03f8f..750a1aa 100644 --- a/drivers/w1/matrox_w1.c +++ b/drivers/w1/matrox_w1.c @@ -90,8 +90,8 @@ struct matrox_device struct w1_bus_master *bus_master; }; -static u8 matrox_w1_read_ddc_bit(unsigned long); -static void matrox_w1_write_ddc_bit(unsigned long, u8); +static u8 matrox_w1_read_ddc_bit(void *); +static void matrox_w1_write_ddc_bit(void *, u8); /* * These functions read and write DDC Data bit. @@ -122,10 +122,10 @@ static __inline__ void matrox_w1_write_r wmb(); } -static void matrox_w1_write_ddc_bit(unsigned long data, u8 bit) +static void matrox_w1_write_ddc_bit(void *data, u8 bit) { u8 ret; - struct matrox_device *dev = (struct matrox_device *) data; + struct matrox_device *dev = data; if (bit) bit = 0; @@ -137,10 +137,10 @@ static void matrox_w1_write_ddc_bit(unsi matrox_w1_write_reg(dev, MATROX_GET_DATA, 0x00); } -static u8 matrox_w1_read_ddc_bit(unsigned long data) +static u8 matrox_w1_read_ddc_bit(void *data) { u8 ret; - struct matrox_device *dev = (struct matrox_device *) data; + struct matrox_device *dev = data; ret = matrox_w1_read_reg(dev, MATROX_GET_DATA); @@ -198,7 +198,7 @@ static int __devinit matrox_w1_probe(str matrox_w1_hw_init(dev); - dev->bus_master->data = (unsigned long) dev; + dev->bus_master->data = dev; dev->bus_master->read_bit = &matrox_w1_read_ddc_bit; dev->bus_master->write_bit = &matrox_w1_write_ddc_bit; diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index 024206c..f0b47fe 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c @@ -552,7 +552,7 @@ static void w1_slave_detach(struct w1_sl kfree(sl); } -static struct w1_master *w1_search_master(unsigned long data) +static struct w1_master *w1_search_master(void *data) { struct w1_master *dev; int found = 0; @@ -583,7 +583,7 @@ void w1_reconnect_slaves(struct w1_famil spin_unlock_bh(&w1_mlock); } -static void w1_slave_found(unsigned long data, u64 rn) +static void w1_slave_found(void *data, u64 rn) { int slave_count; struct w1_slave *sl; @@ -595,8 +595,8 @@ static void w1_slave_found(unsigned long dev = w1_search_master(data); if (!dev) { - printk(KERN_ERR "Failed to find w1 master device for data %08lx, it is impossible.\n", - data); + printk(KERN_ERR "Failed to find w1 master device for data %p, " + "it is impossible.\n", data); return; } diff --git a/drivers/w1/w1.h b/drivers/w1/w1.h index d890078..b62e771 100644 --- a/drivers/w1/w1.h +++ b/drivers/w1/w1.h @@ -80,7 +80,7 @@ struct w1_slave struct completion released; }; -typedef void (* w1_slave_found_callback)(unsigned long, u64); +typedef void (* w1_slave_found_callback)(void *, u64); /** @@ -93,16 +93,16 @@ typedef void (* w1_slave_found_callback) struct w1_bus_master { /** the first parameter in all the functions below */ - unsigned long data; + void *data; /** * Sample the line level * @return the level read (0 or 1) */ - u8 (*read_bit)(unsigned long); + u8 (*read_bit)(void *); /** Sets the line level */ - void (*write_bit)(unsigned long, u8); + void (*write_bit)(void *, u8); /** * touch_bit is the lowest-level function for devices that really @@ -111,42 +111,42 @@ struct w1_bus_master * touch_bit(1) = write-1 / read cycle * @return the bit read (0 or 1) */ - u8 (*touch_bit)(unsigned long, u8); + u8 (*touch_bit)(void *, u8); /** * Reads a bytes. Same as 8 touch_bit(1) calls. * @return the byte read */ - u8 (*read_byte)(unsigned long); + u8 (*read_byte)(void *); /** * Writes a byte. Same as 8 touch_bit(x) calls. */ - void (*write_byte)(unsigned long, u8); + void (*write_byte)(void *, u8); /** * Same as a series of read_byte() calls * @return the number of bytes read */ - u8 (*read_block)(unsigned long, u8 *, int); + u8 (*read_block)(void *, u8 *, int); /** Same as a series of write_byte() calls */ - void (*write_block)(unsigned long, const u8 *, int); + void (*write_block)(void *, const u8 *, int); /** * Combines two reads and a smart write for ROM searches * @return bit0=Id bit1=comp_id bit2=dir_taken */ - u8 (*triplet)(unsigned long, u8); + u8 (*triplet)(void *, u8); /** * long write-0 with a read for the presence pulse detection * @return -1=Error, 0=Device present, 1=No device present */ - u8 (*reset_bus)(unsigned long); + u8 (*reset_bus)(void *); /** Really nice hardware can handles the ROM searches */ - void (*search)(unsigned long, w1_slave_found_callback); + void (*search)(void *, w1_slave_found_callback); }; #define W1_MASTER_NEED_EXIT 0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] W1: u64 is not long long 2006-01-20 6:07 ` [PATCH] W1: Change the type 'unsigned long' member of 'struct w1_bus_master' to 'void *' Greg KH @ 2006-01-20 6:07 ` Greg KH 0 siblings, 0 replies; 6+ messages in thread From: Greg KH @ 2006-01-20 6:07 UTC (permalink / raw) To: linux-kernel; +Cc: akpm [PATCH] W1: u64 is not long long You don't know what type a u64 is, hence you cannot print it without a cast. Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> --- commit 607d7b2cdf6922fe9f567db52115c62d22ba4925 tree 5d9072e66c18a92c35def2e55c0450c3cb9ef6d7 parent c8d1a16495d65c58ac1454e33b124105db9eb4fd author Andrew Morton <akpm@osdl.org> Sat, 14 Jan 2006 00:05:59 -0800 committer Greg Kroah-Hartman <gregkh@suse.de> Thu, 19 Jan 2006 21:53:27 -0800 drivers/w1/w1.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index 5def7fb..d640c1e 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c @@ -388,11 +388,14 @@ static int w1_uevent(struct device *dev, if (dev->driver != &w1_slave_driver || !sl) return 0; - err = add_uevent_var(envp, num_envp, &cur_index, buffer, buffer_size, &cur_len, "W1_FID=%02X", sl->reg_num.family); + err = add_uevent_var(envp, num_envp, &cur_index, buffer, buffer_size, + &cur_len, "W1_FID=%02X", sl->reg_num.family); if (err) return err; - err = add_uevent_var(envp, num_envp, &cur_index, buffer, buffer_size, &cur_len, "W1_SLAVE_ID=%024LX", (u64)sl->reg_num.id); + err = add_uevent_var(envp, num_envp, &cur_index, buffer, buffer_size, + &cur_len, "W1_SLAVE_ID=%024LX", + (unsigned long long)sl->reg_num.id); if (err) return err; ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2006-01-20 6:09 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <11377372352083@kroah.com>
2006-01-20 6:07 ` [PATCH] W1: Add the DS2482 I2C-to-w1 bridge driver Greg KH
2006-01-20 6:07 ` [PATCH] W1: misc cleanups Greg KH
2006-01-20 6:07 ` [PATCH] W1: fix W1_MASTER_DS9490_BRIDGE dependencies Greg KH
2006-01-20 6:07 ` [PATCH] W1: Remove incorrect MODULE_ALIAS Greg KH
2006-01-20 6:07 ` [PATCH] W1: Change the type 'unsigned long' member of 'struct w1_bus_master' to 'void *' Greg KH
2006-01-20 6:07 ` [PATCH] W1: u64 is not long long Greg KH
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.