All of lore.kernel.org
 help / color / mirror / Atom feed
From: matthieu castet <castet.matthieu-GANU6spQydw@public.gmane.org>
To: linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: i2c probing
Date: Sun, 21 Mar 2010 15:22:00 +0100	[thread overview]
Message-ID: <4BA62B88.8080903@free.fr> (raw)

Hi,

Do you know why there is 2 methods of probing i2c [1] and [2], with different quirks for eeprom.
Why can't they be merged together ?


Thanks

Matthieu

PS : please keep me in CC


[1]
i2c_detect_address

    /* Make sure the address is valid */
    if (addr < 0x03 || addr > 0x77) {
        dev_warn(&adapter->dev, "Invalid probe address 0x%02x\n",
             addr);
        return -EINVAL;
    }

    /* Skip if already in use */
    if (i2c_check_addr(adapter, addr))
        return 0;

    /* Make sure there is something at this address */
    if (i2c_smbus_xfer(adapter, addr, 0, 0, 0, I2C_SMBUS_QUICK, NULL) < 0)
        return 0;

    /* Prevent 24RF08 corruption */
    if ((addr & ~0x0f) == 0x50)
        i2c_smbus_xfer(adapter, addr, 0, 0, 0, I2C_SMBUS_QUICK, NULL);

[2]
i2c_new_probed_device
        if (addr_list[i] < 0x03 || addr_list[i] > 0x77) {
            dev_warn(&adap->dev, "Invalid 7-bit address "
                 "0x%02x\n", addr_list[i]);
            continue;
        }

        /* Check address availability */
        if (i2c_check_addr(adap, addr_list[i])) {
            dev_dbg(&adap->dev, "Address 0x%02x already in "
                "use, not probing\n", addr_list[i]);
            continue;
        }

        /* Test address responsiveness
           The default probe method is a quick write, but it is known
           to corrupt the 24RF08 EEPROMs due to a state machine bug,
           and could also irreversibly write-protect some EEPROMs, so
           for address ranges 0x30-0x37 and 0x50-0x5f, we use a byte
           read instead. Also, some bus drivers don't implement
           quick write, so we fallback to a byte read it that case
           too. */
        if ((addr_list[i] & ~0x07) == 0x30
         || (addr_list[i] & ~0x0f) == 0x50
         || !i2c_check_functionality(adap, I2C_FUNC_SMBUS_QUICK)) {
            union i2c_smbus_data data;

            if (i2c_smbus_xfer(adap, addr_list[i], 0,
                       I2C_SMBUS_READ, 0,
                       I2C_SMBUS_BYTE, &data) >= 0)
                break;
        } else {
            if (i2c_smbus_xfer(adap, addr_list[i], 0,
                       I2C_SMBUS_WRITE, 0,
                       I2C_SMBUS_QUICK, NULL) >= 0)
                break;
        }

             reply	other threads:[~2010-03-21 14:22 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-21 14:22 matthieu castet [this message]
     [not found] ` <4BA62B88.8080903-GANU6spQydw@public.gmane.org>
2010-03-23 13:13   ` i2c probing Jean Delvare

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4BA62B88.8080903@free.fr \
    --to=castet.matthieu-ganu6spqydw@public.gmane.org \
    --cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.