From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751211AbeAVLhp (ORCPT ); Mon, 22 Jan 2018 06:37:45 -0500 Received: from mail-eopbgr10097.outbound.protection.outlook.com ([40.107.1.97]:27111 "EHLO EUR02-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751116AbeAVLhP (ORCPT ); Mon, 22 Jan 2018 06:37:15 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=peda@axentia.se; From: Peter Rosin To: Adrian Fiergolski Cc: Peter Rosin , Wolfram Sang , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 1/2] i2c: add i2c_get_device_id() to get the standard i2c device id Date: Mon, 22 Jan 2018 12:36:56 +0100 Message-Id: <20180122113657.32094-2-peda@axentia.se> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180122113657.32094-1-peda@axentia.se> References: <20180122113657.32094-1-peda@axentia.se> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [85.226.244.23] X-ClientProxiedBy: HE1PR0102CA0065.eurprd01.prod.exchangelabs.com (2603:10a6:7:7d::42) To AM4PR0202MB2771.eurprd02.prod.outlook.com (2603:10a6:200:8c::21) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e44ecded-4f3c-4c0f-8546-08d5618c79e8 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(7020095)(4652020)(7021125)(5600026)(4604075)(2017052603307)(7153060)(7193020);SRVR:AM4PR0202MB2771; X-Microsoft-Exchange-Diagnostics: 1;AM4PR0202MB2771;3:ZYnT+o1D3ceQ1To291/qjZn9B/aiQiemmXDB9MQetM65JH+7Eals9cdOkk7IV3av3K/2TlcE5A+gr6/Q1JYVj3w7XWZyjaOVWpczFKxLdxhrU7/OVcQ+jlIjcC7FSp8L6Qzgg5wpCRVLH0Qm4qX/7Q0soVLt4V3wWnhmSO5Ii5syaKRSotIri2B9c15MfmQwrjV1/gXKzCt5Lwyf6e5YIfZ+9EGE+RJ0tv/Ow9C+33RCBEY/yXKVtdBd+yK+xXfU;25:Bx+nfZgY3QHaX5TbpZabbQFk2Z19MIS2FB2ihTvf1kHA97w80yNvIMN9Iuu6bt0UVPp71mTKB12quZz1cZdBt2i1H4WginRrbI1mVZofQ5dYZOOZgenIJxYhhSx9yXCfpYQFjKjcLMliFRWOsADOGs7YNt5PSk5qhdR0HEPOy9vX11Ff1dgJHi8vunRk/GtblS7JDUtoyPC1+a3s321bxEMQDMeV3nyJa78hdSLrjFkAZQKnozDOSpAEFfdmgFMxgBM6nqzSPMeB4Wr8pVDhtEmBC8GVU3QRlhL1pMxOLrKvgCnFcdZUz0x6LqaIl/+3mKz/Ok6XMoA+wOrIv5c8TQ==;31:2pqhTzzB4Aa3pb85UF8CjDVzRTP7JF3qeQEMNUmD0YMowjG8pDEUzS8jcSbz/TGrq1B2E/wPL7NhXRBxzs+Xw/TlCY4XI3Unp30pvMGPc8tTYFM9FkUjeIxG0b+S5AX1+ehz1FXvpQAsdGxhMZCw/7j02kiVGVuJVvdtGfj1Hgjm/aghdmSE3Gm9vSAgnT1SXw4GKFPvmRrVN45VjRc1UCZAJl43JywMpBwUbJr+ZFw= X-MS-TrafficTypeDiagnostic: AM4PR0202MB2771: X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040501)(2401047)(8121501046)(5005006)(3231023)(2400081)(944501161)(93006095)(93001095)(10201501046)(3002001)(6041288)(20161123560045)(2016111802025)(20161123564045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6043046)(6072148)(201708071742011);SRVR:AM4PR0202MB2771;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:AM4PR0202MB2771; X-Microsoft-Exchange-Diagnostics: 1;AM4PR0202MB2771;4:4QUR84FGChZTYaf4oht35DXBKqlutk0xnLw3bhGQJUbs+cSEtWJVHhUEVBdAZsq/E7xKHSp+MSNr81wCC8w6YjJwf/sCzQntzcO+Nwnep8Rj2fOQWPQJfHLepEtfB7LFQHhX0xIZbJvVZfZf9HkGGSD4VEf6GBzfCfXilagpvOFBmcYvTyHTyDetdlIZOIhWxbjvAsQ+7DVydziUaG/PPCaHQ6tvJBiwP7KY4PV9z5KXTg4ytsmdko4B1bGGpeXYNBhpbo9WpxZDuVNzC/KYWA== X-Forefront-PRVS: 0560A2214D X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(366004)(39380400002)(346002)(39830400003)(396003)(376002)(199004)(189003)(5660300001)(16526018)(68736007)(305945005)(6116002)(3846002)(25786009)(7736002)(8936002)(2906002)(47776003)(6512007)(6916009)(2950100002)(81166006)(6486002)(50226002)(4326008)(36756003)(6666003)(53936002)(81156014)(106356001)(15760500003)(386003)(48376002)(59450400001)(8676002)(51416003)(1076002)(97736004)(74482002)(6506007)(5890100001)(316002)(105586002)(66066001)(26005)(54906003)(50466002)(478600001)(16586007)(76176011)(86362001)(52116002)(15583001)(217873001)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:AM4PR0202MB2771;H:orc.pedanet;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM4PR0202MB2771;23:tyx0Rb7IRdrD6om7lHUQWGR85Vc5DHyhcq3TBfT?= =?us-ascii?Q?ChF6VERBo/Bw15idMDk2bgbrJgbS116As9Tj9tGCh94jm/vwg/dx8NSKsQJt?= =?us-ascii?Q?7qXTcunmHSoTKG73HnmjZ9tlhoL/ASZ/N8/nEncSj6O5ckcGZObRLgbA31C4?= =?us-ascii?Q?BIJ/DwFc5Wv0ZnrdWE2wmDYvfJsju1jIWLeP+TdGS2Dzo9O220pnvNfs25AI?= =?us-ascii?Q?ZnVDklOHI6qJHz+rLPFMz8gFOQuN8xlZ4NZIlNveJL3EgevuNheISWOyLhp+?= =?us-ascii?Q?jKD/yWj/DuWDoROWbAaJXb7Y5ayNsFlaR9yLOpNAfR1t0H/YvusrlQgHEE7G?= =?us-ascii?Q?J29Fn/CvUI/N8kOzyTy3bopKSZgPkG5G96jF+8gI0ufc0bKRvgb8V5dmuKNB?= =?us-ascii?Q?t7ON4Y/OmrRDjw3bUW6TC/fjidQ6yvx1V4AnHu9dDuJAy4NZoYojUY8Xmskf?= =?us-ascii?Q?Wr2wP2Erai5Do0vCPbs1BzgbubrbePF4amFYWzmrL616RIVHqd3kJqshBVU5?= =?us-ascii?Q?hp+j1ziqgv99OAXXrUWvT99WLBJSyC6i2NrT4hiosboKDpgD6pVDD45JFiDA?= =?us-ascii?Q?2IAqo50Bi/WAZ0T1gAsadGNFZ6EzlG8pLeb3rKFwrGMciHfFT+Y1VwbRQwkN?= =?us-ascii?Q?YeZ34ux1u5eXcBp68/B4PoelnPfxYMEngaGpfkRy/3ntkoUjl0WbT0wtSazI?= =?us-ascii?Q?Kahoy0peHEwjCMbQun9tvWKVDGimTnNZJY5mOJn8ItjYhN/Hydrbq7g89QqH?= =?us-ascii?Q?6Sjyk+AOtdTXaDaVHP0YRU4cvhMeHcId2DDoY/FjyKt9ZQKNvN4vTPEPczEA?= =?us-ascii?Q?BiFNEh9jRy+ilh1NeOyckeUGhPHLCqFHkT84XhXiqE9LGSA++cdyon/tVlxo?= =?us-ascii?Q?EANG8k4iybCoYBE2BU+dTg67w1qUVf0nlHGTk+hmo9CCMDaORpQr983x5gDE?= =?us-ascii?Q?/lANJD8KvBiS60GdCesetyOqgdjvDeqBERguYKE6GmsuC2Hfbew01oOyuV25?= =?us-ascii?Q?IK9RntLykNj5jzzsVIy40n4MvGPw6KRww2EvlpWGIObo5boLSOjls7V78hhZ?= =?us-ascii?Q?uVVc4DteG6VGe9YzGAxENxviDjyIiPAuTcbacO5P6HMPkcXazzgku8ROHCIe?= =?us-ascii?Q?ZycA3JF7PUiGVObjf3ZcxwQCmGDVaw1L9SXQ19jT7/+FgkbKj57GS0loVvSl?= =?us-ascii?Q?hB+0FzmuHGFTC/Bzl37v7liWbDKD52IbQHxFyJDOL/xxijtZZQX3/oLG63Ut?= =?us-ascii?Q?vrSe+LCXo2HB8weyCCRuLuG7BzzDra1QRzQl0YpcraQyj/zFjdZkocstJmNP?= =?us-ascii?Q?jjQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM4PR0202MB2771;6:6OKBlPbY2Uwypc0O/FQx6CDqpYksHGgJ2KQUzPMZcZmXRAgJk/NezY1kspQJNC4NFcmGiGgNw8EvmA1RshDm1U1VJC44A/uJRVtGY4y8LNrpYzn65IOvZHMeFsCxoQ0fX7jfmumaqUI7yvSJIr8i0ITOldKayh6SbAFxA9DPlOPKYOGttHaAPBvZjyvAGUCXgZnPBkzo/9rJvvr6c0TP7NTjnvJIbFvfXShfWmwZGIB8MxF4IlQ1zQM5Hj1M8Qpbm/y2lKOO8x+tUXvyKv/auyjPDFu+apbMtHN+7rcf7t+f464U335HLY72bQM+yoWeGaPRTQ/aJkG0XVTDzkLxUoCldwFnnkwqkNpfWC0A1AQ=;5:T6MGPjQMcwSk0MSYWje6CEHdT9l/41O/xx5c7AhWYi8WkhJ7Hc/y/d0fjIw8/jvj7QHLjSTiiqR+on/ID+icDQfmBVsNPyqje3lPSUDdmU6lBMpJqKXpV3sQriyq/0Po/9hWl6buk3u/WhdNJF5hOf6nHcm7hK27/dIeUeV+m2U=;24:otiUu5MnQS/236jD6kx91F7xdIuVGPrjiWO5YzM38Gn9jbvQKmSiDpo3RSxwnA+P2vSY/XlwOYjWAIfWYbTjsmYAnDIDGoOzu6N91cIS2/4=;7:PANf4vTlTuBmQsLzkQF60N4wNFu2fvNA15U+y1fdFmdhJfhAlPddKC3oUu8mJq2p6K95iodpbI9FR0LoG7YCsgSgmLmGSltzEtyZjVWEYW9/Jtof9dUKHeQ7KZWEf2dZQoiCcjk2Rq921QF8RiPV2dgtBa5+1O+rCEIPuPNw0KpZ35VJ7wDoCOrETnHhQvEtnQeHWHwi8SxvdW8inm5WBi8vEc17E0J6g/ItAB2E0kSwysfjlmgpdU8NOdRMqq4m SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2018 11:37:10.7640 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e44ecded-4f3c-4c0f-8546-08d5618c79e8 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4ee68585-03e1-4785-942a-df9c1871a234 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR0202MB2771 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Can be used during probe to double check that the probed device is what is expected. Loosely based on code from Adrian Fiergolski . Signed-off-by: Peter Rosin --- 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, -- 2.11.0