lkml.org 
[lkml]   [2004]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH] I2C update for 2.6.9
    Date
    From
    ChangeSet 1.1832.73.7, 2004/09/08 13:17:56-07:00, johnpol@2ka.mipt.ru

    [PATCH] w1: Added slave->ttl - time to live for the registered slave.

    Added slave->ttl - time to live for the registered slave.
    When slave was not found we will not remove it immediately but wait until ->ttl attempts were done.
    It prevents various debouncing effects(problems with pull-up, power).

    Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
    Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>


    drivers/w1/w1.c | 9 +++++++--
    drivers/w1/w1.h | 2 ++
    drivers/w1/w1_int.c | 6 ++++--
    drivers/w1/w1_int.h | 2 +-
    4 files changed, 14 insertions(+), 5 deletions(-)


    diff -Nru a/drivers/w1/w1.c b/drivers/w1/w1.c
    --- a/drivers/w1/w1.c 2004-10-19 16:55:31 -07:00
    +++ b/drivers/w1/w1.c 2004-10-19 16:55:31 -07:00
    @@ -47,9 +47,11 @@

    static int w1_timeout = 10;
    int w1_max_slave_count = 10;
    +int w1_max_slave_ttl = 10;

    module_param_named(timeout, w1_timeout, int, 0);
    module_param_named(max_slave_count, w1_max_slave_count, int, 0);
    +module_param_named(slave_ttl, w1_max_slave_ttl, int, 0);

    spinlock_t w1_mlock = SPIN_LOCK_UNLOCKED;
    LIST_HEAD(w1_masters);
    @@ -431,6 +433,7 @@
    return err;
    }

    + sl->ttl = dev->slave_ttl;
    dev->slave_count++;

    memcpy(&msg.id.id, rn, sizeof(msg.id.id));
    @@ -569,7 +572,7 @@
    }

    if (slave_count == dev->slave_count &&
    - ((rn >> 56) & 0xff) == w1_calc_crc8((u8 *)&rn, 7)) {
    + rn && ((rn >> 56) & 0xff) == w1_calc_crc8((u8 *)&rn, 7)) {
    w1_attach_slave_device(dev, (struct w1_reg_num *) &rn);
    }
    }
    @@ -718,7 +721,7 @@
    list_for_each_safe(ent, n, &dev->slist) {
    sl = list_entry(ent, struct w1_slave, w1_slave_entry);

    - if (sl && !test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags)) {
    + if (sl && !test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags) && !--sl->ttl) {
    list_del (&sl->w1_slave_entry);

    w1_slave_detach (sl);
    @@ -726,6 +729,8 @@

    dev->slave_count--;
    }
    + else if (test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags))
    + sl->ttl = dev->slave_ttl;
    }
    up(&dev->mutex);
    }
    diff -Nru a/drivers/w1/w1.h b/drivers/w1/w1.h
    --- a/drivers/w1/w1.h 2004-10-19 16:55:31 -07:00
    +++ b/drivers/w1/w1.h 2004-10-19 16:55:31 -07:00
    @@ -63,6 +63,7 @@
    atomic_t refcnt;
    u8 rom[9];
    u32 flags;
    + int ttl;

    struct w1_master *master;
    struct w1_family *family;
    @@ -99,6 +100,7 @@
    struct list_head slist;
    int max_slave_count, slave_count;
    unsigned long attempts;
    + int slave_ttl;
    int initialized;
    u32 id;

    diff -Nru a/drivers/w1/w1_int.c b/drivers/w1/w1_int.c
    --- a/drivers/w1/w1_int.c 2004-10-19 16:55:31 -07:00
    +++ b/drivers/w1/w1_int.c 2004-10-19 16:55:31 -07:00
    @@ -32,12 +32,13 @@
    extern struct bus_type w1_bus_type;
    extern struct device w1_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 *);

    -struct w1_master * w1_alloc_dev(u32 id, int slave_count,
    +struct w1_master * w1_alloc_dev(u32 id, int slave_count, int slave_ttl,
    struct device_driver *driver, struct device *device)
    {
    struct w1_master *dev;
    @@ -65,6 +66,7 @@
    dev->kpid = -1;
    dev->initialized = 0;
    dev->id = id;
    + dev->slave_ttl = slave_ttl;

    atomic_set(&dev->refcnt, 2);

    @@ -121,7 +123,7 @@
    int retval = 0;
    struct w1_netlink_msg msg;

    - dev = w1_alloc_dev(w1_ids++, w1_max_slave_count, &w1_driver, &w1_device);
    + dev = w1_alloc_dev(w1_ids++, w1_max_slave_count, w1_max_slave_ttl, &w1_driver, &w1_device);
    if (!dev)
    return -ENOMEM;

    diff -Nru a/drivers/w1/w1_int.h b/drivers/w1/w1_int.h
    --- a/drivers/w1/w1_int.h 2004-10-19 16:55:31 -07:00
    +++ b/drivers/w1/w1_int.h 2004-10-19 16:55:31 -07:00
    @@ -27,7 +27,7 @@

    #include "w1.h"

    -struct w1_master * w1_alloc_dev(int, struct device_driver *, struct device *);
    +struct w1_master * w1_alloc_dev(u32, int, int, struct device_driver *, struct device *);
    void w1_free_dev(struct w1_master *dev);
    int w1_add_master_device(struct w1_bus_master *);
    void w1_remove_master_device(struct w1_bus_master *);
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 14:07    [W:0.026 / U:152.092 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site