All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Rosin <peda@axentia.se>
To: Wolfram Sang <wsa@the-dreams.de>
Cc: Adrian Fiergolski <adrian.fiergolski@cern.ch>,
	linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH 1/2] i2c: add i2c_get_device_id() to get the standard i2c device id
Date: Sun, 4 Mar 2018 22:47:59 +0100	[thread overview]
Message-ID: <29c55bcc-8d14-dcff-d407-33cfb402af8a@axentia.se> (raw)
In-Reply-To: <20180122113657.32094-2-peda@axentia.se>

Hi Wolfram,

Did you have an opinion on this patch?

In case you like it, do you which to take it (don't forget to add a
Tested-by-tag from Adrian in that case), or should I take it and you
then get it in a pull request?

Cheers,
Peter

On 2018-01-22 12:36, Peter Rosin wrote:
> Can be used during probe to double check that the probed device is
> what is expected.
> 
> Loosely based on code from Adrian Fiergolski <adrian.fiergolski@cern.ch>.
> 
> Signed-off-by: Peter Rosin <peda@axentia.se>
> ---
>  drivers/i2c/i2c-core-base.c | 33 +++++++++++++++++++++++++++++++++
>  include/linux/i2c.h         | 30 ++++++++++++++++++++++++++++++
>  2 files changed, 63 insertions(+)
> 
> diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
> index 5a00bf443d06..f496b917529d 100644
> --- a/drivers/i2c/i2c-core-base.c
> +++ b/drivers/i2c/i2c-core-base.c
> @@ -58,6 +58,8 @@
>  #define I2C_ADDR_7BITS_MAX	0x77
>  #define I2C_ADDR_7BITS_COUNT	(I2C_ADDR_7BITS_MAX + 1)
>  
> +#define I2C_ADDR_DEVICE_ID	0x7c
> +
>  /*
>   * core_lock protects i2c_adapter_idr, and guarantees that device detection,
>   * deletion of detected devices, and attach_adapter calls are serialized
> @@ -1968,6 +1970,37 @@ int i2c_transfer_buffer_flags(const struct i2c_client *client, char *buf,
>  }
>  EXPORT_SYMBOL(i2c_transfer_buffer_flags);
>  
> +/**
> + * i2c_get_device_id - get manufacturer, part id and die revision of a device
> + * @client: The device to query
> + * @id: The queried information
> + *
> + * Returns negative errno on error, zero on success.
> + */
> +int i2c_get_device_id(const struct i2c_client *client,
> +		      struct i2c_device_identity *id)
> +{
> +	struct i2c_adapter *adap = client->adapter;
> +	union i2c_smbus_data raw_id;
> +	int ret;
> +
> +	if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_READ_I2C_BLOCK))
> +		return -EOPNOTSUPP;
> +
> +	raw_id.block[0] = 3;
> +	ret = i2c_smbus_xfer(adap, I2C_ADDR_DEVICE_ID, client->flags,
> +			     I2C_SMBUS_READ, client->addr << 1,
> +			     I2C_SMBUS_I2C_BLOCK_DATA, &raw_id);
> +	if (ret)
> +		return ret;
> +
> +	id->manufacturer_id = (raw_id.block[1] << 4) | (raw_id.block[2] >> 4);
> +	id->part_id = ((raw_id.block[2] & 0xf) << 5) | (raw_id.block[3] >> 3);
> +	id->die_revision = raw_id.block[3] & 0x7;
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(i2c_get_device_id);
> +
>  /* ----------------------------------------------------
>   * the i2c address scanning function
>   * Will not work for 10-bit addresses!
> diff --git a/include/linux/i2c.h b/include/linux/i2c.h
> index 419a38e7c315..44ad14e016b5 100644
> --- a/include/linux/i2c.h
> +++ b/include/linux/i2c.h
> @@ -47,6 +47,7 @@ struct i2c_algorithm;
>  struct i2c_adapter;
>  struct i2c_client;
>  struct i2c_driver;
> +struct i2c_device_identity;
>  union i2c_smbus_data;
>  struct i2c_board_info;
>  enum i2c_slave_event;
> @@ -186,8 +187,37 @@ extern s32 i2c_smbus_write_i2c_block_data(const struct i2c_client *client,
>  extern s32
>  i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client,
>  					  u8 command, u8 length, u8 *values);
> +int i2c_get_device_id(const struct i2c_client *client,
> +		      struct i2c_device_identity *id);
>  #endif /* I2C */
>  
> +/**
> + * struct i2c_device_identity - i2c client device identification
> + * @manufacturer_id: 0 - 4095, database maintained by NXP
> + * @part_id: 0 - 511, according to manufacturer
> + * @die_revision: 0 - 7, according to manufacturer
> + */
> +struct i2c_device_identity {
> +	u16 manufacturer_id;
> +#define I2C_DEVICE_ID_NXP_SEMICONDUCTORS                0
> +#define I2C_DEVICE_ID_NXP_SEMICONDUCTORS_1              1
> +#define I2C_DEVICE_ID_NXP_SEMICONDUCTORS_2              2
> +#define I2C_DEVICE_ID_NXP_SEMICONDUCTORS_3              3
> +#define I2C_DEVICE_ID_RAMTRON_INTERNATIONAL             4
> +#define I2C_DEVICE_ID_ANALOG_DEVICES                    5
> +#define I2C_DEVICE_ID_STMICROELECTRONICS                6
> +#define I2C_DEVICE_ID_ON_SEMICONDUCTOR                  7
> +#define I2C_DEVICE_ID_SPRINTEK_CORPORATION              8
> +#define I2C_DEVICE_ID_ESPROS_PHOTONICS_AG               9
> +#define I2C_DEVICE_ID_FUJITSU_SEMICONDUCTOR            10
> +#define I2C_DEVICE_ID_FLIR                             11
> +#define I2C_DEVICE_ID_O2MICRO                          12
> +#define I2C_DEVICE_ID_ATMEL                            13
> +#define I2C_DEVICE_ID_NONE                         0xffff
> +	u16 part_id;
> +	u8 die_revision;
> +};
> +
>  enum i2c_alert_protocol {
>  	I2C_PROTOCOL_SMBUS_ALERT,
>  	I2C_PROTOCOL_SMBUS_HOST_NOTIFY,
> 

  reply	other threads:[~2018-03-04 21:48 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-22 11:36 [RFC PATCH 0/2] check I2C device id for pca984x chips Peter Rosin
2018-01-22 11:36 ` [RFC PATCH 1/2] i2c: add i2c_get_device_id() to get the standard i2c device id Peter Rosin
2018-03-04 21:47   ` Peter Rosin [this message]
2018-03-05 15:51   ` Wolfram Sang
2018-03-05 16:06     ` Peter Rosin
2018-03-05 16:27       ` Wolfram Sang
2018-01-22 11:36 ` [RFC PATCH 2/2] i2c: mux: pca954x: verify the device id of the pca984x chips Peter Rosin
2018-03-05 15:53   ` Wolfram Sang
2018-03-05 15:55     ` Peter Rosin
2018-03-05 16:29       ` Wolfram Sang
2018-01-26 16:33 ` [RFC PATCH 0/2] check I2C device id for " Adrian Fiergolski
2018-01-26 16:33   ` Adrian Fiergolski
2018-01-27  8:37   ` Peter Rosin
2018-01-29 17:38     ` Adrian Fiergolski
2018-01-29 17:38       ` Adrian Fiergolski
2018-02-01 14:41       ` Peter Rosin

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=29c55bcc-8d14-dcff-d407-33cfb402af8a@axentia.se \
    --to=peda@axentia.se \
    --cc=adrian.fiergolski@cern.ch \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=wsa@the-dreams.de \
    /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.