From patchwork Mon Jun 6 08:48:55 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bartosz Golaszewski X-Patchwork-Id: 69372 Delivered-To: patch@linaro.org Received: by 10.140.106.246 with SMTP id e109csp1375711qgf; Mon, 6 Jun 2016 01:50:34 -0700 (PDT) X-Received: by 10.98.65.92 with SMTP id o89mr24023955pfa.72.1465203034062; Mon, 06 Jun 2016 01:50:34 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d63si27226360pfd.93.2016.06.06.01.50.33; Mon, 06 Jun 2016 01:50:34 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-i2c-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@baylibre-com.20150623.gappssmtp.com; spf=pass (google.com: best guess record for domain of linux-i2c-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-i2c-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751524AbcFFIuD (ORCPT + 1 other); Mon, 6 Jun 2016 04:50:03 -0400 Received: from mail-wm0-f53.google.com ([74.125.82.53]:33648 "EHLO mail-wm0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752415AbcFFItV (ORCPT ); Mon, 6 Jun 2016 04:49:21 -0400 Received: by mail-wm0-f53.google.com with SMTP id r5so1224456wmr.0 for ; Mon, 06 Jun 2016 01:49:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+FZWjk299OLWcOCrixG0EbrELQvfinmKe/0lMMKAaDQ=; b=levYsViuZ+fZRxz+ECvSOGR2Hv8SP9SRlJf2TNT84M8LjvebpFivodL+sBuAr2pmbu GbzJtyn8if8hzEQk63rDyNC1zSQxjHGrKYtaENNWAO+XsWhOQ2VmNtaEqxyHkHiG8o2y UELgEZVC2DlwILeTxBr77kBpeFbNQ2ga+0K3yHHRxu8W8Sjk8jRbnHBUEwmRVNFUB1ax YQwjJYbRHcVzsUdsxMI4xmxu4d8ag9/MGBLPnxOBowZJndVojLAACtCraFRQ/8iZZi7M V3xr+6AMXab+fb60mE7cvVzREKN4zq/ECghxX/FkoNH9OhOtqqME8+Mc0S2VHFo16n0p epoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+FZWjk299OLWcOCrixG0EbrELQvfinmKe/0lMMKAaDQ=; b=UujsMnAf/rjbnAvlXi5JaSHiWnIcjCUEEPWdoEz8O1ATj7c8OvoGXrSgIqUVaoPCt3 84SsM5iIpKuCHSpqAOtTVZRqsJxCz+mq7xAso9RNtM3tazMz5ih0lZQSCzJfBFIHAJ2N y6dVw152Savt44R66wQsafmCzoGV7RyQfvVCo9lVB4Go27YRPw09BDAMlBQHfsyBuL2C aKiFwtQKEFLuW9t9szc/RbdFuls1z22O0d/7U1l/u7GM1QHTcEfkL55Wm4GiTYQvBppe R2s9XlMJDuKovzG5YVxMnBSZl80mhVchzA6TALo9o9a73cbo+lBmXdnxzMgd94WWMylS fh0A== X-Gm-Message-State: ALyK8tLJrWDaW6JsurcS6Q4XTsXqFeFa5sGUr4Fo4zWiRtsTke2q20jT6vgS3s4Klz+1tkcU X-Received: by 10.28.145.21 with SMTP id t21mr4900078wmd.21.1465202960317; Mon, 06 Jun 2016 01:49:20 -0700 (PDT) Received: from localhost.localdomain ([90.63.244.31]) by smtp.gmail.com with ESMTPSA id dd7sm19090384wjb.22.2016.06.06.01.49.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 06 Jun 2016 01:49:19 -0700 (PDT) From: Bartosz Golaszewski To: Wolfram Sang , linux-i2c , LKML , Andrew Lunn , Srinivas Kandagatla , Maxime Ripard , GregKH Cc: Bartosz Golaszewski Subject: [RESEND PATCH 13/14] eeprom: at24: add support for at24mac series Date: Mon, 6 Jun 2016 10:48:55 +0200 Message-Id: <1465202936-16832-14-git-send-email-bgolaszewski@baylibre.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1465202936-16832-1-git-send-email-bgolaszewski@baylibre.com> References: <1465202936-16832-1-git-send-email-bgolaszewski@baylibre.com> Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Add a new read function to the at24 driver allowing to retrieve the factory-programmed mac address embedded in chips from the at24mac family. These chips can be instantiated similarily to the at24cs family, except that there's no way of having access to both the serial number and the mac address at the same time - the user must instantiate either an at24cs or at24mac device as both special memory areas are accessible on the same slave address. Signed-off-by: Bartosz Golaszewski --- drivers/misc/eeprom/at24.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c index 0b5240d..b3afe15 100644 --- a/drivers/misc/eeprom/at24.c +++ b/drivers/misc/eeprom/at24.c @@ -347,6 +347,36 @@ static ssize_t at24_eeprom_read_serial(struct at24_data *at24, char *buf, return -ETIMEDOUT; } +static ssize_t at24_eeprom_read_mac(struct at24_data *at24, char *buf, + unsigned int offset, size_t count) +{ + unsigned long timeout, read_time; + struct i2c_client *client; + struct i2c_msg msg[2]; + u8 addrbuf[2]; + int status; + + client = at24_translate_offset(at24, &offset); + + memset(msg, 0, sizeof(msg)); + msg[0].addr = client->addr; + msg[0].buf = addrbuf; + addrbuf[0] = 0x90 + offset; + msg[0].len = 1; + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].buf = buf; + msg[1].len = count; + + loop_until_timeout(timeout, read_time) { + status = i2c_transfer(client->adapter, msg, 2); + if (status == 2) + return count; + } + + return -ETIMEDOUT; +} + /* * Note that if the hardware write-protect pin is pulled high, the whole * chip is normally write protected. But there are plenty of product @@ -648,8 +678,16 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) at24->chip = chip; at24->num_addresses = num_addresses; + if ((chip.flags & AT24_FLAG_SERIAL) && (chip.flags & AT24_FLAG_MAC)) { + dev_err(&client->dev, + "invalid device data - cannot have both AT24_FLAG_SERIAL & AT24_FLAG_MAC."); + return -EINVAL; + } + if (chip.flags & AT24_FLAG_SERIAL) { at24->read_func = at24_eeprom_read_serial; + } else if (chip.flags & AT24_FLAG_MAC) { + at24->read_func = at24_eeprom_read_mac; } else { at24->read_func = at24->use_smbus ? at24_eeprom_read_smbus : at24_eeprom_read_i2c;