From nobody Wed Dec 17 10:59:00 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 42FF4C4167B for ; Mon, 27 Nov 2023 20:19:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233204AbjK0UTO (ORCPT ); Mon, 27 Nov 2023 15:19:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55896 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233187AbjK0UTI (ORCPT ); Mon, 27 Nov 2023 15:19:08 -0500 Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B5A96D4B for ; Mon, 27 Nov 2023 12:19:14 -0800 (PST) Received: by mail-wm1-x329.google.com with SMTP id 5b1f17b1804b1-4079ed65471so36954625e9.1 for ; Mon, 27 Nov 2023 12:19:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1701116353; x=1701721153; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OilnCkUOcXAx+nYBX9A7TYy/ZEalaKAFOMCP+QsH9zE=; b=jw+tWW9yUeax+X1b7rmteNTgY/Xhu/HCvcAzE09iao1BksgmkF4gFfUsc1gZhShW6w ZCEUn4KrbqibsXmFSUk59HzhQ83Rc3utZHRrgxNGG6MRAibfVgMb0OTMzYpRr8t9+c27 nP3jkxisAJTewgXodMtCf6tX4I8OtJf/mFtzQP6Ktf9WkG8jjyK+SxPiy7olyr5ougo1 hLJKU4RdZaKKcvJs4qSkYxtfGm2TdxoHIBVx99C8XswzK3lGqRyx0LlV9gOxqX/lblVh eK5tYSVl0UpyN7oGD8CQtAEw+INEMvXH1lZI7zd2/CglVqYb81cWObFr6lerFAXXAd+d MGQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701116353; x=1701721153; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OilnCkUOcXAx+nYBX9A7TYy/ZEalaKAFOMCP+QsH9zE=; b=FLmlz3TNJuhNQTwjT+JZKi1HYpPYOCIcRnX/uNfI6zCn1NV6ErOZjdIkcJYWVNxA7X yRBKATFlXS93LOgA07hzW26nJmEytYmgji5qLRr27cMPRY0l4KGsti0KuqktihCanUyI yooFKviGI3tYIsrgAUGoqilahiniT0ePdETD9OA+VBF0ukcNqFOgwKIiDA6dBamnoUvh ZYyPsmaBB1XA6Y3ANZhIL8fus0SRKmSqCD6XdBG75vUufwZdW4rQSHScoEslaOw8Ui4Q yq2BYV+wEOdJtbSW40qRow6WmFPTav8qdsSJpR0LGpG25IfqhQADPEV0K/uWwmnf17rE EvYQ== X-Gm-Message-State: AOJu0Yx57BEmvsaUcyxHqs5fGhs+maZAbJ139Ynft/lOQ+oJ9X0AhUxy 1xilaWzVMy6wk1eR7q1zcTgNCKihvpc= X-Google-Smtp-Source: AGHT+IEJVlAsmF5wdo9kjz94aYZL09MziyHZQqCIObiRpXqEPVxFcVgRVh3IA0j6xeRxK/Jmu3Sl1Q== X-Received: by 2002:a05:600c:1987:b0:409:1841:3f42 with SMTP id t7-20020a05600c198700b0040918413f42mr9475534wmq.13.1701116352806; Mon, 27 Nov 2023 12:19:12 -0800 (PST) Received: from mfe-desktop.Sonatest.net (ipagstaticip-d73c7528-4de5-0861-800b-03d8b15e3869.sdsl.bell.ca. [174.94.156.236]) by smtp.googlemail.com with ESMTPSA id k32-20020a05600c1ca000b0040839fcb217sm15224619wms.8.2023.11.27.12.19.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Nov 2023 12:19:12 -0800 (PST) From: marc.ferland@gmail.com X-Google-Original-From: marc.ferland@sonatest.com To: krzysztof.kozlowski@linaro.org Cc: gregkh@linuxfoundation.org, marc.ferland@sonatest.com, jeff.dagenais@gmail.com, rdunlap@infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/5] w1: ds2490: support block sizes larger than 128 bytes in ds_read_block Date: Mon, 27 Nov 2023 15:18:52 -0500 Message-Id: <20231127201856.3836178-2-marc.ferland@sonatest.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231127201856.3836178-1-marc.ferland@sonatest.com> References: <20231117192909.98944-1-marc.ferland@sonatest.com> <20231127201856.3836178-1-marc.ferland@sonatest.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Marc Ferland The current ds_read_block function only supports block sizes up to 128 bytes, which is the depth of the 'data out' fifo on the ds2490. Reading larger blocks will fail with a: -110 (ETIMEDOUT) from usb_control_msg(). Example: $ dd if=3D/sys/bus/w1/devices/43-000000478756/eeprom bs=3D256 count=3D1 yields to the following message from the kernel: usb 5-1: Failed to write 1-wire data to ep0x2: err=3D-110. I discovered this issue while implementing support for the ds28ec20 eeprom in the w1-2433 driver. This driver accepts reading blocks of sizes up to the size of the entire memory (2560 bytes in the case of the ds28ec20). Note that this issue _does not_ arises when the kernel is configured with CONFIG_W1_SLAVE_DS2433_CRC enabled since in this mode the driver reads one 32 byte block at a time (a single memory page). Also, from the ds2490 datasheet (2995.pdf, page 22, BLOCK I/O command): For a block write sequence the EP2 FIFO must be pre-filled with data before command execution. Additionally, for block sizes greater then the FIFO size, the FIFO content status must be monitored by host SW so that additional data can be sent to the FIFO when necessary. A similar EP3 FIFO content monitoring requirement exists for block read sequences. During a block read the number of bytes loaded into the EP3 FIFO must be monitored so that the data can be read before the FIFO overflows. Breaking the buffer in 128 bytes blocks and simply calling the original code sequence has solved the issue for me. Tested with a DS1490F usb<->one-wire adapter and both the DS28EC20 and DS2433 eeprom memories. Note: The v1 of this patch changed both the ds_read_block and ds_write_block functions, but since I don't have any way to test the 'write' part with writes bigger than a page size (maximum accepted by my eeprom), I preferred not to make any assumptions and I just removed that part. Signed-off-by: Marc Ferland --- drivers/w1/masters/ds2490.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/w1/masters/ds2490.c b/drivers/w1/masters/ds2490.c index 5f5b97e24700..b6e244992c15 100644 --- a/drivers/w1/masters/ds2490.c +++ b/drivers/w1/masters/ds2490.c @@ -98,6 +98,8 @@ #define ST_EPOF 0x80 /* Status transfer size, 16 bytes status, 16 byte result flags */ #define ST_SIZE 0x20 +/* 1-wire data i/o fifo size, 128 bytes */ +#define FIFO_SIZE 0x80 =20 /* Result Register flags */ #define RR_DETECT 0xA5 /* New device detected */ @@ -614,14 +616,11 @@ static int ds_read_byte(struct ds_device *dev, u8 *by= te) return 0; } =20 -static int ds_read_block(struct ds_device *dev, u8 *buf, int len) +static int __read_block(struct ds_device *dev, u8 *buf, int len) { struct ds_status st; int err; =20 - if (len > 64*1024) - return -E2BIG; - memset(buf, 0xFF, len); =20 err =3D ds_send_data(dev, buf, len); @@ -640,6 +639,24 @@ static int ds_read_block(struct ds_device *dev, u8 *bu= f, int len) return err; } =20 +static int ds_read_block(struct ds_device *dev, u8 *buf, int len) +{ + int err, to_read, rem =3D len; + + if (len > 64*1024) + return -E2BIG; + + do { + to_read =3D rem <=3D FIFO_SIZE ? rem : FIFO_SIZE; + err =3D __read_block(dev, &buf[len - rem], to_read); + if (err < 0) + return err; + rem -=3D to_read; + } while (rem); + + return err; +} + static int ds_write_block(struct ds_device *dev, u8 *buf, int len) { int err; --=20 2.34.1 From nobody Wed Dec 17 10:59:00 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 15D57C4167B for ; Mon, 27 Nov 2023 20:19:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233217AbjK0UTQ (ORCPT ); Mon, 27 Nov 2023 15:19:16 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55914 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233160AbjK0UTK (ORCPT ); Mon, 27 Nov 2023 15:19:10 -0500 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B5906D59 for ; Mon, 27 Nov 2023 12:19:16 -0800 (PST) Received: by mail-wm1-x32b.google.com with SMTP id 5b1f17b1804b1-40859dee28cso37932385e9.0 for ; Mon, 27 Nov 2023 12:19:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1701116355; x=1701721155; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vh8fgHf4VbVXQAtoSfn0NqPkk1fZpC4zX2ISfWKVIQM=; b=Ukylmb1MOXdJQd/VE/Dc4BeBZigvINLYJ6EF2cY+i9Qqg4CR8RYJXhVEoiVnANVrCI Op2RkdjtzM0/AnziiZcqzRIbY4XoN3xVUgaock5J/H1hCdze0/7KbOh5E9qJQ5qnAMOe MO3Wu6MRXdq4mQk8IrMo/g49Yw8gJPkY8lMmgs5FbCAt7ednXwLg0GMHOZJrcdFnNxYv GfdxUawekaHXee2ZJPSIt/GFlJNX1PaEZL9XOpNLZXLjImiTOydx9bGqC5BDY6kQ0gdQ D9uR1ts0+0/aeqmPe8AbmY2Tonxr2t9kOxX94g9fov3lsOorpbIFxBySApqzqSnSFK1d CAbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701116355; x=1701721155; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vh8fgHf4VbVXQAtoSfn0NqPkk1fZpC4zX2ISfWKVIQM=; b=qz97EgGhRdpBWLnHUDeA0cx+xvwbNP4I+ZORI3xd7PpyrRfc/QOGT0Nxfxuf8WEixE sxpBzAYSfKLY/Z8WyruJFiyCubneoteOgtKUt6Vi1lvIbKBFK7qYMTmV/1kkSb8GNI9z aEy2DD6XoHUq2YitL7MeN9+UNyaRrTD1FPSXfGN7pobXXWP82wQqrzM2C8ZjdmH/402/ LuQytxZeRsiyoSU9SG+75NTz+SH7ql4ZWw21MUy6sReb2WnPO9iLB29hDBDYUwjK7lyy 1Mfat1qlzyY5yvXdn6rcQTbqB7HAlMz0hsC2Qc4B3a7GCtmcBTsuT5dHFp8YkMIly5H4 w/Mw== X-Gm-Message-State: AOJu0YzsWNZjYLq0PxErjMEo7e7ldz8qC8Ho7HhJoyYPHsuobA7+23fL TeZqWZyxldOeSuoeVTBjFeY= X-Google-Smtp-Source: AGHT+IGMGwwVCx10gzcRAqG5np2WYc67335sitXCPn8L8pVcCa1x2vhkFU6IztE/ZaP4pcbe9MHUQw== X-Received: by 2002:a05:600c:3ca2:b0:40b:2a69:6c37 with SMTP id bg34-20020a05600c3ca200b0040b2a696c37mr10335004wmb.4.1701116354875; Mon, 27 Nov 2023 12:19:14 -0800 (PST) Received: from mfe-desktop.Sonatest.net (ipagstaticip-d73c7528-4de5-0861-800b-03d8b15e3869.sdsl.bell.ca. [174.94.156.236]) by smtp.googlemail.com with ESMTPSA id k32-20020a05600c1ca000b0040839fcb217sm15224619wms.8.2023.11.27.12.19.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Nov 2023 12:19:13 -0800 (PST) From: marc.ferland@gmail.com X-Google-Original-From: marc.ferland@sonatest.com To: krzysztof.kozlowski@linaro.org Cc: gregkh@linuxfoundation.org, marc.ferland@sonatest.com, jeff.dagenais@gmail.com, rdunlap@infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/5] w1: ds2433: remove unused definition Date: Mon, 27 Nov 2023 15:18:53 -0500 Message-Id: <20231127201856.3836178-3-marc.ferland@sonatest.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231127201856.3836178-1-marc.ferland@sonatest.com> References: <20231117192909.98944-1-marc.ferland@sonatest.com> <20231127201856.3836178-1-marc.ferland@sonatest.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Marc Ferland W1_F23_TIME isn't used anywhere, get rid of it. Signed-off-by: Marc Ferland --- drivers/w1/slaves/w1_ds2433.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/w1/slaves/w1_ds2433.c b/drivers/w1/slaves/w1_ds2433.c index 9f21fd98f799..e18523ef8c45 100644 --- a/drivers/w1/slaves/w1_ds2433.c +++ b/drivers/w1/slaves/w1_ds2433.c @@ -30,8 +30,6 @@ #define W1_PAGE_BITS 5 #define W1_PAGE_MASK 0x1F =20 -#define W1_F23_TIME 300 - #define W1_F23_READ_EEPROM 0xF0 #define W1_F23_WRITE_SCRATCH 0x0F #define W1_F23_READ_SCRATCH 0xAA --=20 2.34.1 From nobody Wed Dec 17 10:59:00 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 26254C4167B for ; Mon, 27 Nov 2023 20:19:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233248AbjK0UTT (ORCPT ); Mon, 27 Nov 2023 15:19:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54266 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233192AbjK0UTN (ORCPT ); Mon, 27 Nov 2023 15:19:13 -0500 Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2F508D63 for ; Mon, 27 Nov 2023 12:19:18 -0800 (PST) Received: by mail-wm1-x32c.google.com with SMTP id 5b1f17b1804b1-4079ed65471so36954955e9.1 for ; Mon, 27 Nov 2023 12:19:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1701116356; x=1701721156; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4jPqJAoT2VW6Xw934SGmT3qvNdjOvu6oesgMdO97hOc=; b=E4YRU50hf5D3ULeyXW7RwbeHESMQJkGkw5MsIYJFfJ0FSEYZn8hsf0xRmcBKOARdWQ iYr7tSEWa3PXGVaOmRMt85NfzJdMI8xTdbDzsGEZNeeZBOqy5jBrsvIZsdhfD5e0wL/k SdD/R0/NReeVA2oIY1wMUP4eJ04RbkPfsKgiYxqlXZD5M7mZFSTVsXHTOslYzCrmr8tn r575CM6N2Tmnz+AY0xKwIYEaHGuuGwIvplNWyZ3FHyoJ5QwCpTy9MZsZVU/lHElcXyHm Gj1Q9wzM5D0DuQbFMkBsCMPyszaPOie5Xl4AN3K7boNhKEQ39KpcWMjWkDNmG+mc9IM+ EKhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701116356; x=1701721156; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4jPqJAoT2VW6Xw934SGmT3qvNdjOvu6oesgMdO97hOc=; b=C2UOrNxujdm7zY6ogZwLcW3f4RKzjXPQKfXjzWFVgtp1HWlI8qJ77E1O0DT+IpocJa mSEBodehDB1tb6sUc39Eh/qTXmg83S1R71/A+65iM0nUzNk68XrDfNF0Ub1jW2oGR6kg eFwnvoPD0jHlP7PcWIwgnqAWQRUVP8I5dz63jcQZozYaZrgLELXLIOH4XqXisX7ItxN/ FUscULcdD7znR0qBhZ3kWdmeVvGM6/QhdlnvhnZ+IijW5Ba+q4/83sMqIttHeQmzP94s KdSjW830hUgbZ+4s2f/bfusBZgbPP193M71W1zi6oBiPzofwcDSBXnKk+BCkpBI1R1WR Cm6Q== X-Gm-Message-State: AOJu0YwxbZ0UC7vqmuQpwf9vlE2SC7sNk+IMwiS9hNGhQjg25xUESgv4 Yv9EEMN3pg9q0lyZwCG7Lkg= X-Google-Smtp-Source: AGHT+IFyEhlAz+prj6XrNUV/HDNZx1kcLYt4zLJZnwh2YL4M4ml/C2Usw+67k6n+JzM3kmbNzTRyvA== X-Received: by 2002:a05:600c:3213:b0:408:cd96:7164 with SMTP id r19-20020a05600c321300b00408cd967164mr10621661wmp.9.1701116356438; Mon, 27 Nov 2023 12:19:16 -0800 (PST) Received: from mfe-desktop.Sonatest.net (ipagstaticip-d73c7528-4de5-0861-800b-03d8b15e3869.sdsl.bell.ca. [174.94.156.236]) by smtp.googlemail.com with ESMTPSA id k32-20020a05600c1ca000b0040839fcb217sm15224619wms.8.2023.11.27.12.19.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Nov 2023 12:19:16 -0800 (PST) From: marc.ferland@gmail.com X-Google-Original-From: marc.ferland@sonatest.com To: krzysztof.kozlowski@linaro.org Cc: gregkh@linuxfoundation.org, marc.ferland@sonatest.com, jeff.dagenais@gmail.com, rdunlap@infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/5] w1: ds2433: introduce a configuration structure Date: Mon, 27 Nov 2023 15:18:54 -0500 Message-Id: <20231127201856.3836178-4-marc.ferland@sonatest.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231127201856.3836178-1-marc.ferland@sonatest.com> References: <20231117192909.98944-1-marc.ferland@sonatest.com> <20231127201856.3836178-1-marc.ferland@sonatest.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Marc Ferland Add a ds2433_config structure for parameters that are different between the ds2433 and the ds28ec20. The goal is to reuse the same code for both chips. A pointer to this config structure is added to w1_f23_data and the CONFIG_W1_SLAVE_DS2433_CRC ifdefs are adjusted since now both driver configurations (with or without crc support) will make use of w1_f23_data. Also, the 'memory' buffer is now dynamically allocated based on the size specififed in the config structure to help support memories of different sizes. Signed-off-by: Marc Ferland --- drivers/w1/slaves/w1_ds2433.c | 47 ++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/drivers/w1/slaves/w1_ds2433.c b/drivers/w1/slaves/w1_ds2433.c index e18523ef8c45..7d4d9fc1a9c4 100644 --- a/drivers/w1/slaves/w1_ds2433.c +++ b/drivers/w1/slaves/w1_ds2433.c @@ -25,7 +25,7 @@ #define W1_EEPROM_DS2433 0x23 =20 #define W1_EEPROM_SIZE 512 -#define W1_PAGE_COUNT 16 + #define W1_PAGE_SIZE 32 #define W1_PAGE_BITS 5 #define W1_PAGE_MASK 0x1F @@ -35,9 +35,24 @@ #define W1_F23_READ_SCRATCH 0xAA #define W1_F23_COPY_SCRATCH 0x55 =20 +struct ds2433_config { + size_t eeprom_size; /* eeprom size in bytes */ + unsigned int page_count; /* number of 256 bits pages */ + unsigned int tprog; /* time in ms for page programming */ +}; + +static const struct ds2433_config config_f23 =3D { + .eeprom_size =3D W1_EEPROM_SIZE, + .page_count =3D 16, + .tprog =3D 5, +}; + struct w1_f23_data { - u8 memory[W1_EEPROM_SIZE]; +#ifdef CONFIG_W1_SLAVE_DS2433_CRC + u8 *memory; u32 validcrc; +#endif + const struct ds2433_config *cfg; }; =20 /* @@ -96,7 +111,7 @@ static ssize_t eeprom_read(struct file *filp, struct kob= ject *kobj, u8 wrbuf[3]; #endif =20 - count =3D w1_f23_fix_count(off, count, W1_EEPROM_SIZE); + count =3D w1_f23_fix_count(off, count, bin_attr->size); if (!count) return 0; =20 @@ -151,9 +166,7 @@ static ssize_t eeprom_read(struct file *filp, struct ko= bject *kobj, */ static int w1_f23_write(struct w1_slave *sl, int addr, int len, const u8 *= data) { -#ifdef CONFIG_W1_SLAVE_DS2433_CRC struct w1_f23_data *f23 =3D sl->family_data; -#endif u8 wrbuf[4]; u8 rdbuf[W1_PAGE_SIZE + 3]; u8 es =3D (addr + len - 1) & 0x1f; @@ -189,8 +202,8 @@ static int w1_f23_write(struct w1_slave *sl, int addr, = int len, const u8 *data) wrbuf[3] =3D es; w1_write_block(sl->master, wrbuf, 4); =20 - /* Sleep for 5 ms to wait for the write to complete */ - msleep(5); + /* Sleep for tprog ms to wait for the write to complete */ + msleep(f23->cfg->tprog); =20 /* Reset the bus to wake up the EEPROM (this may not be needed) */ w1_reset_bus(sl->master); @@ -207,7 +220,7 @@ static ssize_t eeprom_write(struct file *filp, struct k= object *kobj, struct w1_slave *sl =3D kobj_to_w1_slave(kobj); int addr, len, idx; =20 - count =3D w1_f23_fix_count(off, count, W1_EEPROM_SIZE); + count =3D w1_f23_fix_count(off, count, bin_attr->size); if (!count) return 0; =20 @@ -269,24 +282,34 @@ static const struct attribute_group *w1_f23_groups[] = =3D { =20 static int w1_f23_add_slave(struct w1_slave *sl) { -#ifdef CONFIG_W1_SLAVE_DS2433_CRC struct w1_f23_data *data; =20 data =3D kzalloc(sizeof(struct w1_f23_data), GFP_KERNEL); if (!data) return -ENOMEM; + + data->cfg =3D &config_f23; + +#ifdef CONFIG_W1_SLAVE_DS2433_CRC + data->memory =3D kzalloc(data->cfg->eeprom_size, GFP_KERNEL); + if (!data->memory) { + kfree(data); + return -ENOMEM; + } +#endif /* CONFIG_W1_SLAVE_DS2433_CRC */ sl->family_data =3D data; =20 -#endif /* CONFIG_W1_SLAVE_DS2433_CRC */ return 0; } =20 static void w1_f23_remove_slave(struct w1_slave *sl) { + struct w1_f23_data *data =3D sl->family_data; #ifdef CONFIG_W1_SLAVE_DS2433_CRC - kfree(sl->family_data); + kfree(data->memory); +#endif /* CONFIG_W1_SLAVE_DS2433_CRC */ + kfree(data); sl->family_data =3D NULL; -#endif /* CONFIG_W1_SLAVE_DS2433_CRC */ } =20 static const struct w1_family_ops w1_f23_fops =3D { --=20 2.34.1 From nobody Wed Dec 17 10:59:00 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 627A3C4167B for ; Mon, 27 Nov 2023 20:19:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233285AbjK0UTW (ORCPT ); Mon, 27 Nov 2023 15:19:22 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54292 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233199AbjK0UTN (ORCPT ); Mon, 27 Nov 2023 15:19:13 -0500 Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 185411BD for ; Mon, 27 Nov 2023 12:19:20 -0800 (PST) Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-40b2ad4953cso32125915e9.0 for ; Mon, 27 Nov 2023 12:19:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1701116358; x=1701721158; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=22flK2ZnV7fxAF7GRABs1AemQfTsdiwJ7rqNojXeu70=; b=Ve0VW7cqKcsavX8LhFcxno2L+PaqU2f4JJOqYHkwF6Fq/lZk8vTZ2UkzcXfYneBfq9 JVG3qb43CwgFEfDb19mtw1abG3SKgvLbJNKLZ/1ZZrgoNHW3PbvhRAx3/FQETyTNJdgy FMroq42rOMNTyLoVPJsV/JXYOG4knM+7bW5l2oiIyYVuhvqxxQ1+npYWFEk8HFEMArlO HXywsf0J6umJ6N4jCEVaSuZc+sSV4zxhXHuwdaNFykqSO0yLyl66dDyk30HHXyDCzVcF bNJD2y2ye17wKItVRy2Xv6GSSB5ykKAi5H3z8t8bJVRJkwIQ8WsW+XeYugY9J+eV2aRT 7jnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701116358; x=1701721158; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=22flK2ZnV7fxAF7GRABs1AemQfTsdiwJ7rqNojXeu70=; b=aUrG2xk0PidBVoMUMCelitowHk/VBgoh90vzC9LwvoH1Cvkid1OhCSKrNzQFpYlX54 uLDTzHL2KRdLTyEPapTQjNYlQTTKTwTqJzfwn+Rpi8qzsbEPQ7ymTT4DaiY3MDwCVJBZ tzHk8SLXpQE1UwUJiU4DDJNVPSAaYp5YZ4KrR5Q4hSyLvIEGGALR58qKlpZ8kYfFRdwy Wps0TUAKuGHj7D5tj+lp/bgUsbijrWCTRTUTIz+NqhfuliKA11BCriFw4+tt8H/x3DHB e8gpvZLmMwAJl12FRfJLW058LYDT5bA8pyiPdPV0TpwrfWh3lZhnlXCOt7PelbpYeC2P XZjw== X-Gm-Message-State: AOJu0YyYOJ4sXWAojLt+J4MJNWoDR5z+dRYr/ZRgYE+U0RlgpZUEmDki kzxEgXD+uO7Rwmzf0rYZ4vY= X-Google-Smtp-Source: AGHT+IGnP6VpWtQHp8+R3S/PWFlVREgkbZIFBLF9auMeuGRsDnHu3F9V237bUKQVUsiEeL6nsL0t1w== X-Received: by 2002:a05:600c:5106:b0:40b:47dc:9bb8 with SMTP id o6-20020a05600c510600b0040b47dc9bb8mr2779078wms.7.1701116358138; Mon, 27 Nov 2023 12:19:18 -0800 (PST) Received: from mfe-desktop.Sonatest.net (ipagstaticip-d73c7528-4de5-0861-800b-03d8b15e3869.sdsl.bell.ca. [174.94.156.236]) by smtp.googlemail.com with ESMTPSA id k32-20020a05600c1ca000b0040839fcb217sm15224619wms.8.2023.11.27.12.19.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Nov 2023 12:19:17 -0800 (PST) From: marc.ferland@gmail.com X-Google-Original-From: marc.ferland@sonatest.com To: krzysztof.kozlowski@linaro.org Cc: gregkh@linuxfoundation.org, marc.ferland@sonatest.com, jeff.dagenais@gmail.com, rdunlap@infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 4/5] w1: ds2433: use the kernel bitmap implementation Date: Mon, 27 Nov 2023 15:18:55 -0500 Message-Id: <20231127201856.3836178-5-marc.ferland@sonatest.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231127201856.3836178-1-marc.ferland@sonatest.com> References: <20231117192909.98944-1-marc.ferland@sonatest.com> <20231127201856.3836178-1-marc.ferland@sonatest.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Marc Ferland The ds2433 driver uses the 'validcrc' variable to mark out which pages have been successfully (crc is valid) retrieved from the eeprom and placed in the internal 'memory' buffer (see CONFIG_W1_SLAVE_DS2433_CRC). The current implementation assumes that the number of pages will never go beyond 32 pages (bit field is a u32). This is fine for the ds2433 since it only has 16 pages. Use a dynamically allocated bitmap so that we can support eeproms with more than 32 pages which is the case for the ds28ec20 (80 pages). As an added bonus, the code also gets easier on the eye. Signed-off-by: Marc Ferland --- drivers/w1/slaves/w1_ds2433.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/drivers/w1/slaves/w1_ds2433.c b/drivers/w1/slaves/w1_ds2433.c index 7d4d9fc1a9c4..63ed03191137 100644 --- a/drivers/w1/slaves/w1_ds2433.c +++ b/drivers/w1/slaves/w1_ds2433.c @@ -49,8 +49,8 @@ static const struct ds2433_config config_f23 =3D { =20 struct w1_f23_data { #ifdef CONFIG_W1_SLAVE_DS2433_CRC - u8 *memory; - u32 validcrc; + u8 *memory; + unsigned long *validcrc; #endif const struct ds2433_config *cfg; }; @@ -77,11 +77,11 @@ static int w1_f23_refresh_block(struct w1_slave *sl, st= ruct w1_f23_data *data, u8 wrbuf[3]; int off =3D block * W1_PAGE_SIZE; =20 - if (data->validcrc & (1 << block)) + if (test_bit(block, data->validcrc)) return 0; =20 if (w1_reset_select_slave(sl)) { - data->validcrc =3D 0; + bitmap_zero(data->validcrc, data->cfg->page_count); return -EIO; } =20 @@ -93,7 +93,7 @@ static int w1_f23_refresh_block(struct w1_slave *sl, stru= ct w1_f23_data *data, =20 /* cache the block if the CRC is valid */ if (crc16(CRC16_INIT, &data->memory[off], W1_PAGE_SIZE) =3D=3D CRC16_VALI= D) - data->validcrc |=3D (1 << block); + set_bit(block, data->validcrc); =20 return 0; } @@ -208,7 +208,7 @@ static int w1_f23_write(struct w1_slave *sl, int addr, = int len, const u8 *data) /* Reset the bus to wake up the EEPROM (this may not be needed) */ w1_reset_bus(sl->master); #ifdef CONFIG_W1_SLAVE_DS2433_CRC - f23->validcrc &=3D ~(1 << (addr >> W1_PAGE_BITS)); + clear_bit(addr >> W1_PAGE_BITS, f23->validcrc); #endif return 0; } @@ -296,6 +296,13 @@ static int w1_f23_add_slave(struct w1_slave *sl) kfree(data); return -ENOMEM; } + data->validcrc =3D bitmap_zalloc(data->cfg->page_count, + GFP_KERNEL); + if (!data->validcrc) { + kfree(data->memory); + kfree(data); + return -ENOMEM; + } #endif /* CONFIG_W1_SLAVE_DS2433_CRC */ sl->family_data =3D data; =20 @@ -307,6 +314,7 @@ static void w1_f23_remove_slave(struct w1_slave *sl) struct w1_f23_data *data =3D sl->family_data; #ifdef CONFIG_W1_SLAVE_DS2433_CRC kfree(data->memory); + bitmap_free(data->validcrc); #endif /* CONFIG_W1_SLAVE_DS2433_CRC */ kfree(data); sl->family_data =3D NULL; --=20 2.34.1 From nobody Wed Dec 17 10:59:00 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2C4D2C4167B for ; Mon, 27 Nov 2023 20:19:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233318AbjK0UTZ (ORCPT ); Mon, 27 Nov 2023 15:19:25 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54334 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233205AbjK0UTQ (ORCPT ); Mon, 27 Nov 2023 15:19:16 -0500 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 55126D59 for ; Mon, 27 Nov 2023 12:19:21 -0800 (PST) Received: by mail-wm1-x32b.google.com with SMTP id 5b1f17b1804b1-4079ed65582so32894595e9.1 for ; Mon, 27 Nov 2023 12:19:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1701116360; x=1701721160; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=DzCWC63D/h6//8PScKXUzeHvcD/O+lCbOIGXiWj5l+M=; b=aA+6yKKLV6JViMKlqG1+5KMtnVqVpM+sfmVtRYGoweRuXPIjDq17GA0D6NtnwmDrQd DW09M0mIrghL04OwvUQKxibrEDcLfaAXTF+PmdD3gSdZkI/olwmmjpO0+bBv2voY0D8m dumggEwMzq40bseVL+k1OOFqpH+rAsoywA/0wLpqS8Neu6xjAiqXKk6YnQz8cqB32ggN /OqJsb8/DMTwfGUS/1GVnfwvzO3YXnIlQBmaZBAF2v768DFrZHIZQPLdVL9QOXq0JFub bEl/lL2RUBxdgTOrSo3g/JbwElDaBzYqu3nGmWv9MtRShWNJgR1kfkDgmkqk7HU4eZPU FjcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701116360; x=1701721160; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DzCWC63D/h6//8PScKXUzeHvcD/O+lCbOIGXiWj5l+M=; b=NPI0OUzY844nsP1BX6Dbw+v6f0MoXTCf+i62j5b6O1nT/iJavJy0WI/K/vaas5sXmJ YnoKEXsrW2qudwZ0U8imm1FUzEv7NsUfl8VdK4MMMBXSvZU0SWijraaHtwVHPp+Mivgp C+1actwVBYGA5PA5gwt9qNFIF4W6jo83LER8GjWxZIfqcciiUJgG6VtKuHIyxcEeKYUl M9ixiHzO9RhF78FDuFLUUwMumexwGRJ12LOBxx2QbmKdz7Nj2BZ2t6Mi4z0E38ntKkpQ XKBmb5etbFLxQFxDAVV9Ptj3IXSEqmSbYIZx66VKZKbjdavthNO0zSkhVN59k++TPaHC 3XtA== X-Gm-Message-State: AOJu0YwQ8tfuOc2Z2U3AU3J7dFrQMyhshwrKNtJE5bDIIRBme8wevUHw pQ61Zvk4cR6HGGCNTv3fhKY= X-Google-Smtp-Source: AGHT+IExYIfQFMjj5mHpsakuzc9XntzBbiWNCXueW6pyDw1hg6C6tgmu2SnSKJmj8WarbCN05r/GFQ== X-Received: by 2002:a05:600c:4f8a:b0:40b:4520:45a6 with SMTP id n10-20020a05600c4f8a00b0040b452045a6mr3590184wmq.8.1701116359790; Mon, 27 Nov 2023 12:19:19 -0800 (PST) Received: from mfe-desktop.Sonatest.net (ipagstaticip-d73c7528-4de5-0861-800b-03d8b15e3869.sdsl.bell.ca. [174.94.156.236]) by smtp.googlemail.com with ESMTPSA id k32-20020a05600c1ca000b0040839fcb217sm15224619wms.8.2023.11.27.12.19.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Nov 2023 12:19:19 -0800 (PST) From: marc.ferland@gmail.com X-Google-Original-From: marc.ferland@sonatest.com To: krzysztof.kozlowski@linaro.org Cc: gregkh@linuxfoundation.org, marc.ferland@sonatest.com, jeff.dagenais@gmail.com, rdunlap@infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 5/5] w1: ds2433: add support for ds28ec20 eeprom Date: Mon, 27 Nov 2023 15:18:56 -0500 Message-Id: <20231127201856.3836178-6-marc.ferland@sonatest.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231127201856.3836178-1-marc.ferland@sonatest.com> References: <20231117192909.98944-1-marc.ferland@sonatest.com> <20231127201856.3836178-1-marc.ferland@sonatest.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Marc Ferland The ds28ec20 eeprom is (almost) backward compatible with the ds2433. The only differences are: - the eeprom size is now 2560 bytes instead of 512; - the number of pages is now 80 (same page size as the ds2433: 256 bits); - the programming time has increased from 5ms to 10ms; This patch adds support for the ds28ec20 to the ds2433 driver. From the datasheet: The DS28EC20 provides a high degree of backward compatibility with the DS2433. Besides the different family codes, the only protocol change that is required on an existing DS2433 implementation is a lengthening of the programming duration (tPROG) from 5ms to 10ms. dmesg now returns: w1_master_driver w1_bus_master1: Attaching one wire slave 43.0000004787= 56 crc e0 instead of: w1_master_driver w1_bus_master1: Attaching one wire slave 43.0000004787= 56 crc e0 w1_master_driver w1_bus_master1: Family 43 for 43.000000478756.e0 is no= t registered. Test script writing/reading random data (CONFIG_W1_SLAVE_DS2433_CRC is not set): #!/bin/sh EEPROM=3D/sys/bus/w1/devices/43-000000478756/eeprom BINFILE1=3D/home/root/file1.bin BINFILE2=3D/home/root/file2.bin for BS in 1 2 3 4 8 16 32 64 128 256 512 1024 2560; do dd if=3D/dev/random of=3D${BINFILE1} bs=3D${BS} count=3D1 status=3D= none dd if=3D${BINFILE1} of=3D${EEPROM} status=3Dnone dd if=3D${EEPROM} of=3D${BINFILE2} bs=3D${BS} count=3D1 status=3Dno= ne if ! cmp --silent ${BINFILE1} ${BINFILE2}; then echo file1 hexdump ${BINFILE1} echo file2 hexdump ${BINFILE2} echo FAIL exit 1 fi echo "${BS} OK!" done Results: # ./test.sh 1 OK! 2 OK! 3 OK! 4 OK! 8 OK! 16 OK! 32 OK! 64 OK! 128 OK! 256 OK! 512 OK! 1024 OK! 2560 OK! Tests with CONFIG_W1_SLAVE_DS2433_CRC=3Dy: $ cat /proc/config.gz | gunzip | grep CONFIG_W1_SLAVE_DS2433 CONFIG_W1_SLAVE_DS2433=3Dm CONFIG_W1_SLAVE_DS2433_CRC=3Dy # create a 32 bytes block with a crc, i.e.: 00000000 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 |123456789:= ;<=3D>?@| 00000010 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e ba 63 |ABCDEFGHIJ= KLMN.c| # fill all 80 blocks $ dd if=3Dtest.bin of=3D/sys/bus/w1/devices/43-000000478756/eeprom bs= =3D32 count=3D80 # read back all blocks, i.e.: $ hexdump -C /sys/bus/w1/devices/43-000000478756/eeprom 00000000 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 |123456789:= ;<=3D>?@| 00000010 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e ba 63 |ABCDEFGHIJ= KLMN.c| 00000020 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 |123456789:= ;<=3D>?@| 00000030 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e ba 63 |ABCDEFGHIJ= KLMN.c| ... 000009e0 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 |123456789:= ;<=3D>?@| 000009f0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e ba 63 |ABCDEFGHIJ= KLMN.c| 00000a00 Note: both memories (ds2433 and ds28ec20) have been tested with the new driver. Signed-off-by: Marc Ferland Co-developed-by: Jean-Francois Dagenais Signed-off-by: Jean-Francois Dagenais --- drivers/w1/slaves/w1_ds2433.c | 98 ++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 8 deletions(-) diff --git a/drivers/w1/slaves/w1_ds2433.c b/drivers/w1/slaves/w1_ds2433.c index 63ed03191137..ab1491a7854a 100644 --- a/drivers/w1/slaves/w1_ds2433.c +++ b/drivers/w1/slaves/w1_ds2433.c @@ -1,8 +1,9 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * w1_ds2433.c - w1 family 23 (DS2433) driver + * w1_ds2433.c - w1 family 23 (DS2433) & 43 (DS28EC20) eeprom driver * * Copyright (c) 2005 Ben Gardner + * Copyright (c) 2023 Marc Ferland */ =20 #include @@ -23,8 +24,10 @@ #include =20 #define W1_EEPROM_DS2433 0x23 +#define W1_EEPROM_DS28EC20 0x43 =20 -#define W1_EEPROM_SIZE 512 +#define W1_EEPROM_DS2433_SIZE 512 +#define W1_EEPROM_DS28EC20_SIZE 2560 =20 #define W1_PAGE_SIZE 32 #define W1_PAGE_BITS 5 @@ -42,11 +45,17 @@ struct ds2433_config { }; =20 static const struct ds2433_config config_f23 =3D { - .eeprom_size =3D W1_EEPROM_SIZE, + .eeprom_size =3D W1_EEPROM_DS2433_SIZE, .page_count =3D 16, .tprog =3D 5, }; =20 +static const struct ds2433_config config_f43 =3D { + .eeprom_size =3D W1_EEPROM_DS28EC20_SIZE, + .page_count =3D 80, + .tprog =3D 10, +}; + struct w1_f23_data { #ifdef CONFIG_W1_SLAVE_DS2433_CRC u8 *memory; @@ -264,10 +273,22 @@ static ssize_t eeprom_write(struct file *filp, struct= kobject *kobj, return count; } =20 -static BIN_ATTR_RW(eeprom, W1_EEPROM_SIZE); +static struct bin_attribute bin_attr_f23_eeprom =3D { + .attr =3D { .name =3D "eeprom", .mode =3D 0644 }, + .read =3D eeprom_read, + .write =3D eeprom_write, + .size =3D W1_EEPROM_DS2433_SIZE, +}; + +static struct bin_attribute bin_attr_f43_eeprom =3D { + .attr =3D { .name =3D "eeprom", .mode =3D 0644 }, + .read =3D eeprom_read, + .write =3D eeprom_write, + .size =3D W1_EEPROM_DS28EC20_SIZE, +}; =20 static struct bin_attribute *w1_f23_bin_attributes[] =3D { - &bin_attr_eeprom, + &bin_attr_f23_eeprom, NULL, }; =20 @@ -280,6 +301,20 @@ static const struct attribute_group *w1_f23_groups[] = =3D { NULL, }; =20 +static struct bin_attribute *w1_f43_bin_attributes[] =3D { + &bin_attr_f43_eeprom, + NULL, +}; + +static const struct attribute_group w1_f43_group =3D { + .bin_attrs =3D w1_f43_bin_attributes, +}; + +static const struct attribute_group *w1_f43_groups[] =3D { + &w1_f43_group, + NULL, +}; + static int w1_f23_add_slave(struct w1_slave *sl) { struct w1_f23_data *data; @@ -288,7 +323,14 @@ static int w1_f23_add_slave(struct w1_slave *sl) if (!data) return -ENOMEM; =20 - data->cfg =3D &config_f23; + switch (sl->family->fid) { + case W1_EEPROM_DS2433: + data->cfg =3D &config_f23; + break; + case W1_EEPROM_DS28EC20: + data->cfg =3D &config_f43; + break; + } =20 #ifdef CONFIG_W1_SLAVE_DS2433_CRC data->memory =3D kzalloc(data->cfg->eeprom_size, GFP_KERNEL); @@ -326,13 +368,53 @@ static const struct w1_family_ops w1_f23_fops =3D { .groups =3D w1_f23_groups, }; =20 +static const struct w1_family_ops w1_f43_fops =3D { + .add_slave =3D w1_f23_add_slave, + .remove_slave =3D w1_f23_remove_slave, + .groups =3D w1_f43_groups, +}; + static struct w1_family w1_family_23 =3D { .fid =3D W1_EEPROM_DS2433, .fops =3D &w1_f23_fops, }; -module_w1_family(w1_family_23); + +static struct w1_family w1_family_43 =3D { + .fid =3D W1_EEPROM_DS28EC20, + .fops =3D &w1_f43_fops, +}; + +static int __init w1_ds2433_init(void) +{ + int err; + + err =3D w1_register_family(&w1_family_23); + if (err) + return err; + + err =3D w1_register_family(&w1_family_43); + if (err) + goto err_43; + + return 0; + +err_43: + w1_unregister_family(&w1_family_23); + return err; +} + +static void __exit w1_ds2433_exit(void) +{ + w1_unregister_family(&w1_family_23); + w1_unregister_family(&w1_family_43); +} + +module_init(w1_ds2433_init); +module_exit(w1_ds2433_exit); =20 MODULE_AUTHOR("Ben Gardner "); -MODULE_DESCRIPTION("w1 family 23 driver for DS2433, 4kb EEPROM"); +MODULE_AUTHOR("Marc Ferland "); +MODULE_DESCRIPTION("w1 family 23/43 driver for DS2433 (4kb) and DS28EC20 (= 20kb)"); MODULE_LICENSE("GPL"); MODULE_ALIAS("w1-family-" __stringify(W1_EEPROM_DS2433)); +MODULE_ALIAS("w1-family-" __stringify(W1_EEPROM_DS28EC20)); --=20 2.34.1