From patchwork Tue Aug 27 15:34:45 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13779715 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3619626AFA for ; Tue, 27 Aug 2024 15:35:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772905; cv=none; b=A5WQ1Bi5p3Wp5hT7aoymqtJXLYgIY1AzF2Bv2TSf/lal9GbMhs3+SzDIPUYnu0tVXSpvrvWTrOXKj8dkCMFJiibGvRPj59YZCSJ7oP/h6X4u/Z28ziJCGzLi0OHbNvXbRfZTMA6NCdaIluHx2xuB54N89lu4MoVIauFgoV64yws= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772905; c=relaxed/simple; bh=GR999ATCFGzHTVLh/S/T3wP3m5hBIvXLK86oQnYhqIg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bYjEzbDp3L0Rt5Lgi0P/NwHHH2w6vyq72bx1W0BF/9CEQ9wzIyabzPkZYwSeNIU/XSKDWdGJGy+P/iPTgNAHA0vkY26bmj7dKG/di+lvoSJXeABU6tUnHSuMxXiSf9X9QpHQk35r/5cGs37Xcbar87FxAScERjR+DBjX+1KK8Ng= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=inZPm9eZ; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="inZPm9eZ" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-20219a0fe4dso55932745ad.2 for ; Tue, 27 Aug 2024 08:35:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724772901; x=1725377701; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=+iTKpaj6Gv0Ve05USrmRK649l9Ix4UjeH7sGMNvE0wU=; b=inZPm9eZsHfNNd4g4LlHtWgSJva79h29qQzlb56cXe8NwQGzwP4mxAlss2vzpJVJju 84/7YVVnnvmR4ZNyoMbuITVwLFIImtMtYKrJCJe12qGK4qeCLLOewtRMKdEhnz30+dYu J/rmArnocLQpBWASTwq2EzsVcHz0LCOhrOkSsMePeZ9LHx83hxwKVO7fmdThOo1j8J/f pNzITw+3FAlL2BcD7CHzmBGLZVeKkcyvX5MmFSMH7ROVqSVZa3x6vojbMKd4nfDZs5jk gsazA/O2MJosvHOWpp6df9MEj4+xBvkNMGLJOEZKqxd3RTtDorPWPhdDWGH6KzBAYI3b gHfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724772901; x=1725377701; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=+iTKpaj6Gv0Ve05USrmRK649l9Ix4UjeH7sGMNvE0wU=; b=aNHWRHHXBAO+MMCszkr/+ydpmtSjvuYoQG8DdFqQwcF70Ya6B6PbRscdO+evC4qZmN DcENX+55qA2Wp/2501xtZI66ApuyXKdVUncBLiIgk/hMkuM/6sTzihJs+GNl8H5cl00u dsvpsQNxcFcVQJUjpq6Kv+8fmO8/sGI/EvvXK08xnV5ehnv+BPF2H11j4fjn6AtB0Eud HgnurtUrVqrRsgt9ruZVEejoHx7AIA6dryNoHlbva0swUX8zcsmton89szhJPEYINLFW fqh2eFfLUJIiJ2/pTEjMJcq1tjjj7di8pPyjzMpi+e4QmEishl5pHoccLiyww91Y9xC9 lKGQ== X-Gm-Message-State: AOJu0Yz/Rr8yXI6rbhlM6IaMnKo7YsnMU3IecnlXVEoEm8S08Vah6Kvo Bl2eMJcbq3hwe4/OTF4BnAMp539aFEt4V+U6L3FiNh6+rwEQqZLKwHeSEA== X-Google-Smtp-Source: AGHT+IF8zIFB9yZsCJELOsfErMVskowdwfS451BOGpWFIGkToBY7lYP5P0VNOYIjl+Lf/itqX3oZRQ== X-Received: by 2002:a17:902:d481:b0:204:e4cb:5636 with SMTP id d9443c01a7336-204e4cb59e7mr26572875ad.11.1724772901077; Tue, 27 Aug 2024 08:35:01 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-203855dbf63sm85110145ad.176.2024.08.27.08.35.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Aug 2024 08:35:00 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Guenter Roeck Subject: [PATCH 01/11] hwmon: (ina2xx) Reorder include files to alphabetic order Date: Tue, 27 Aug 2024 08:34:45 -0700 Message-ID: <20240827153455.1344529-2-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240827153455.1344529-1-linux@roeck-us.net> References: <20240827153455.1344529-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Simplify driver maintenance by reordering include files to alphabetic order. Whule at it, drop unnecessary / unused jiffies.h. No functional change. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- drivers/hwmon/ina2xx.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 9ab4205622e2..a6a619a85eb6 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -22,19 +22,18 @@ * Thanks to Jan Volkering */ -#include -#include -#include +#include #include -#include -#include #include #include -#include +#include +#include +#include +#include #include -#include -#include #include +#include +#include #include From patchwork Tue Aug 27 15:34:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13779716 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D4B2E54648 for ; Tue, 27 Aug 2024 15:35:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772905; cv=none; b=aekBQUT/KqJErAQC41jErElHYc2XHpGsshk0dUvbzV0HR/6LgH/sJPjNz5uefv8UG/nVwPi1oSpmeA2D1ua/8aGjUAOYgJm9ysGL8t0/yHyfKy9kq/hEmQl+KA40v1azhTSkw+ODMKrCaTWGW7isjKyt2DB1gB5UNNJfOMRoDu0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772905; c=relaxed/simple; bh=zU544sauCmhAAftfMdopd1iefSmzWevMkMaQdkj2kCw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mYKLSrMW+nZwLdqacdPtzqUp5KRStFMz83W+miByNucXjL0w3JZXvOOCv0oh36h5kLgMLJ9lQeFSWbsrdTxgsHGCedGiaXr7L24XtAj5sszQwsE+tJ6wz/1t1uaH3DSeJWqAUxZnBPZtqXqBfMxDv/ah3JR1TY/qU7SpfsiExrY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Yinp1quH; arc=none smtp.client-ip=209.85.214.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Yinp1quH" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-20231aa8908so44790885ad.0 for ; Tue, 27 Aug 2024 08:35:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724772903; x=1725377703; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=D1usEK6oiQZgHdGaVmRFQBRMs/Z0qT5x3Rckeu5qgs0=; b=Yinp1quHCZ7zg50UyrG33mAKuhFEGcbFhpp7eXHbUc7pCCDcfm0mSDfqo+8K5+GTPI B9PjpzEH9EFAwHy7e5BMkIMvfSEoIz8mVDy/hTppN1W1MqUFSXzv1PTEgK2X7qCZZ4Uq ku8cMEH6z+Y6zvPQBQ+nCqmRoWD9UbuiBO/dqb0wqae+3+KMli/Mj5sb+O8MmkMdfdKe QYMTGf+nLPSw75DjwBQKM2S4zLbaXQJSRAb3PCtPcgQfPoutIrFRpDloA5d5eUs6/Dg0 I5KlYvEs2cQij1l/A8hSaeOJqUZDOoRWtEHW6FCswJS0EsoVMZ0FeYghLftIliP2PAYp zVzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724772903; x=1725377703; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=D1usEK6oiQZgHdGaVmRFQBRMs/Z0qT5x3Rckeu5qgs0=; b=Tr9/kR8SurmDKTPHIXBZmfNe3ljM3Jw1fEaChm0XfB6Grf63fI8oxw5+CgUGDvQWKV He3bS3wkLjjxeDT5JRziP731LHIcDKdRAUp1/fg/2yTymy59yjg3hnYy6GCFYKxAy/KI 8pGPKWbuNG7m5PGuuc/Bey2bDATB98uquLQhID9j+m13qmVdPXrhSw8E3/NEMqzx4xzG oJLbwJ8U228Z87niGeHstn73Vr2YXPUHWK7Vna7wqNxM3dAFZ1AocNX4ZzE5YphBirlS M2bjd6VFF97WVLWdEaCO5LzpMoH0ekuD/VhmVK77d53uJyfh5gijvrCMi4ezRk3GJ0GX 9j7Q== X-Gm-Message-State: AOJu0YxAHZ9eHzWJaxdGrn3aymDPVR3apASm14JjAZUWfANNMvG4QMA4 SNWW+npiCfb1qv5R/Ad33qzn044gyLOlX/R26zm1n96Fn4KETdKW2vKVWw== X-Google-Smtp-Source: AGHT+IF90ViNmye3eoYJjbpYtc78H0GxMqXHepXmXf6W3J8ScXmlcUmToejbivDzSvIQ0Dafcx38AA== X-Received: by 2002:a17:903:120d:b0:201:f853:3e73 with SMTP id d9443c01a7336-204df029dfcmr41766765ad.11.1724772902527; Tue, 27 Aug 2024 08:35:02 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-203859f02e0sm84444035ad.250.2024.08.27.08.35.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Aug 2024 08:35:02 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Guenter Roeck Subject: [PATCH 02/11] hwmon: (ina2xx) Replace platform data with device properties Date: Tue, 27 Aug 2024 08:34:46 -0700 Message-ID: <20240827153455.1344529-3-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240827153455.1344529-1-linux@roeck-us.net> References: <20240827153455.1344529-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 There are no in-tree users of ina2xx platform data. Drop it and support device properties instead as alternative if it should ever be needed. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- drivers/hwmon/ina2xx.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index a6a619a85eb6..897657f8d685 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -30,13 +30,11 @@ #include #include #include -#include +#include #include #include #include -#include - /* common register definitions */ #define INA2XX_CONFIG 0x00 #define INA2XX_SHUNT_VOLTAGE 0x01 /* readonly */ @@ -643,14 +641,8 @@ static int ina2xx_probe(struct i2c_client *client) data->config = &ina2xx_config[chip]; mutex_init(&data->config_lock); - if (of_property_read_u32(dev->of_node, "shunt-resistor", &val) < 0) { - struct ina2xx_platform_data *pdata = dev_get_platdata(dev); - - if (pdata) - val = pdata->shunt_uohms; - else - val = INA2XX_RSHUNT_DEFAULT; - } + if (device_property_read_u32(dev, "shunt-resistor", &val) < 0) + val = INA2XX_RSHUNT_DEFAULT; ina2xx_set_shunt(data, val); @@ -667,7 +659,7 @@ static int ina2xx_probe(struct i2c_client *client) return dev_err_probe(dev, ret, "failed to enable vs regulator\n"); if (chip == ina226) { - if (of_property_read_bool(dev->of_node, "ti,alert-polarity-active-high")) { + if (device_property_read_bool(dev, "ti,alert-polarity-active-high")) { ret = ina2xx_set_alert_polarity(data, INA226_ALERT_POL_HIGH); if (ret < 0) { From patchwork Tue Aug 27 15:34:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13779717 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E969E54648 for ; Tue, 27 Aug 2024 15:35:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772907; cv=none; b=AN4Cu4r/8JlXAnH0Vu+DVyPMcl/oxFu/n/TZm0lUaP1iEIMnPE5cCiwXKM8JRjA0N10hazZvxA0gDsvPw67okJTsl4XFczRtggdME/um2CSpveUl2CF+mF+gGBYwXGXWZDw4rYj0SsdMsLCaqPWXEpfa5S1nB8mR4CNiPO11uCE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772907; c=relaxed/simple; bh=jMWCfvRIr+IraEHoHKhUz/NfyGk3f9cYdr7LX2toYhc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YLoBB3H4mAHoMb6IeyvOq4cTrhOejiX3CgokijP6hlGKnm3RMtBLZpL40UdeA88bY36qMzr5y4KvMh/glEtXbU8U5FZb1hs4nvZx/UvUG8h1kEN3M2kx6G/HIpO1pJSWI7zF3iV2YEg+zQj5xjvgJfPG9H0gzAjRzJWg9aoDtpU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=jox3bVbZ; arc=none smtp.client-ip=209.85.214.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="jox3bVbZ" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2020ac89cabso51252475ad.1 for ; Tue, 27 Aug 2024 08:35:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724772904; x=1725377704; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=c6ScOz9Jn2r5dS7L3+066pRoXANnKdx/ds7JEWxymmg=; b=jox3bVbZeQvOCHMlSscxz+GGiynQ/0ri/a/5Hvvur7/xCOnz73TAjmAUDuKS370AIN HMZeEXeatdBtFpOTDXIpWICWkKuZimpDf0lbwjXtSR39i4q7A3g55eS7TyWZxo5yc+V3 PDhBrgeTZek65bQHiDA9JG/MVlU5Hrnzx/1pT27zw+facz6zZSOj/HtyfyH08Chyj3lk mMe76SkCMr1LntsccnXPvgRjxFSHHTU5aWIrZjC2HQkmnMNfF0/tkpvC0eOMjgNnfx1m Fjr6uSjUGeFgJZagK7/8jpnY1T3e47cZXFpKugxijcXD9Hgrr6JubNAXBN4JE1e3qYVV 2TMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724772904; x=1725377704; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=c6ScOz9Jn2r5dS7L3+066pRoXANnKdx/ds7JEWxymmg=; b=Q1FPjvhOM3FhB0nKVSeGake/LCr5YXTQcYBi2Yp4inTlFlWDVmHtybMfvzPllPlGg3 gtPzA77SDbyzho6VmkZHXFejKBKNUdflA1K6t9sRlNRyG1Tx84LdeCwmU05vPk1HpRBh LE6rZdNcO6uILFXQQfaeGszagEM1lqAoM7N5YFV+OCxkIgkcxwxRQw/qaZs3sWjqtMoa S8vfQk1eunQXhuMrwyKYc0iMIUFw4cvfN/CPkbj5fB3Nbr6rMefCQllI2GA/QKRPAZM4 Mcw8KRKvuwLYtidZBxVcOa+10lhwfJ+QHfXK2L+eX36eHOido2GOUN/YGDhWNZZcVPIh HCwg== X-Gm-Message-State: AOJu0Yw67JrhUilOX2fOFO0WrHaoSXZEEkJUpqG+EWDbD9ZVErB2LD1/ QYK/sPfmK8KLKiu73hMKxb4vJyRsfjBYnoyG5vepIvrJwFGoyUptKc95uw== X-Google-Smtp-Source: AGHT+IE9EyeUkmzasKkCgBozLxHC0EUsLF65XqX4Uw56ZeBRfQlEn2WhWAwc4I+EydVEjgTH0LD7Tg== X-Received: by 2002:a17:903:41d2:b0:202:4042:8520 with SMTP id d9443c01a7336-2039e4c6652mr141832965ad.37.1724772904280; Tue, 27 Aug 2024 08:35:04 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2038560e53dsm84611215ad.191.2024.08.27.08.35.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Aug 2024 08:35:03 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Guenter Roeck Subject: [PATCH 03/11] hwmon: (ina2xx) Use bit operations Date: Tue, 27 Aug 2024 08:34:47 -0700 Message-ID: <20240827153455.1344529-4-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240827153455.1344529-1-linux@roeck-us.net> References: <20240827153455.1344529-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Use bit operations where possible to make the code more generic and to align it with other drivers. Also use compile time conversion from bit to mask to reduce runtime overhead. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- drivers/hwmon/ina2xx.c | 84 +++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 897657f8d685..1b4170d02c94 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -22,6 +22,8 @@ * Thanks to Jan Volkering */ +#include +#include #include #include #include @@ -65,25 +67,23 @@ #define INA2XX_RSHUNT_DEFAULT 10000 /* bit mask for reading the averaging setting in the configuration register */ -#define INA226_AVG_RD_MASK 0x0E00 +#define INA226_AVG_RD_MASK GENMASK(11, 9) -#define INA226_READ_AVG(reg) (((reg) & INA226_AVG_RD_MASK) >> 9) -#define INA226_SHIFT_AVG(val) ((val) << 9) +#define INA226_READ_AVG(reg) FIELD_GET(INA226_AVG_RD_MASK, reg) -#define INA226_ALERT_POLARITY_MASK 0x0002 -#define INA226_SHIFT_ALERT_POLARITY(val) ((val) << 1) -#define INA226_ALERT_POL_LOW 0 -#define INA226_ALERT_POL_HIGH 1 +#define INA226_ALERT_POLARITY_MASK BIT(1) +#define INA226_ALERT_POL_LOW 0 +#define INA226_ALERT_POL_HIGH 1 /* bit number of alert functions in Mask/Enable Register */ -#define INA226_SHUNT_OVER_VOLTAGE_BIT 15 -#define INA226_SHUNT_UNDER_VOLTAGE_BIT 14 -#define INA226_BUS_OVER_VOLTAGE_BIT 13 -#define INA226_BUS_UNDER_VOLTAGE_BIT 12 -#define INA226_POWER_OVER_LIMIT_BIT 11 +#define INA226_SHUNT_OVER_VOLTAGE_MASK BIT(15) +#define INA226_SHUNT_UNDER_VOLTAGE_MASK BIT(14) +#define INA226_BUS_OVER_VOLTAGE_MASK BIT(13) +#define INA226_BUS_UNDER_VOLTAGE_MASK BIT(12) +#define INA226_POWER_OVER_LIMIT_MASK BIT(11) /* bit mask for alert config bits of Mask/Enable Register */ -#define INA226_ALERT_CONFIG_MASK 0xFC00 +#define INA226_ALERT_CONFIG_MASK GENMASK(15, 10) #define INA226_ALERT_FUNCTION_FLAG BIT(4) /* common attrs, ina226 attrs and NULL */ @@ -177,7 +177,7 @@ static u16 ina226_interval_to_reg(int interval) avg_bits = find_closest(avg, ina226_avg_tab, ARRAY_SIZE(ina226_avg_tab)); - return INA226_SHIFT_AVG(avg_bits); + return FIELD_PREP(INA226_AVG_RD_MASK, avg_bits); } static int ina2xx_set_alert_polarity(struct ina2xx_data *data, @@ -185,7 +185,7 @@ static int ina2xx_set_alert_polarity(struct ina2xx_data *data, { return regmap_update_bits(data->regmap, INA226_MASK_ENABLE, INA226_ALERT_POLARITY_MASK, - INA226_SHIFT_ALERT_POLARITY(val)); + FIELD_PREP(INA226_ALERT_POLARITY_MASK, val)); } /* @@ -322,20 +322,20 @@ static ssize_t ina2xx_value_show(struct device *dev, return sysfs_emit(buf, "%d\n", ina2xx_get_value(data, attr->index, regval)); } -static int ina226_reg_to_alert(struct ina2xx_data *data, u8 bit, u16 regval) +static int ina226_reg_to_alert(struct ina2xx_data *data, u32 mask, u16 regval) { int reg; - switch (bit) { - case INA226_SHUNT_OVER_VOLTAGE_BIT: - case INA226_SHUNT_UNDER_VOLTAGE_BIT: + switch (mask) { + case INA226_SHUNT_OVER_VOLTAGE_MASK: + case INA226_SHUNT_UNDER_VOLTAGE_MASK: reg = INA2XX_SHUNT_VOLTAGE; break; - case INA226_BUS_OVER_VOLTAGE_BIT: - case INA226_BUS_UNDER_VOLTAGE_BIT: + case INA226_BUS_OVER_VOLTAGE_MASK: + case INA226_BUS_UNDER_VOLTAGE_MASK: reg = INA2XX_BUS_VOLTAGE; break; - case INA226_POWER_OVER_LIMIT_BIT: + case INA226_POWER_OVER_LIMIT_MASK: reg = INA2XX_POWER; break; default: @@ -351,19 +351,19 @@ static int ina226_reg_to_alert(struct ina2xx_data *data, u8 bit, u16 regval) * Turns alert limit values into register values. * Opposite of the formula in ina2xx_get_value(). */ -static s16 ina226_alert_to_reg(struct ina2xx_data *data, u8 bit, int val) +static s16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, int val) { - switch (bit) { - case INA226_SHUNT_OVER_VOLTAGE_BIT: - case INA226_SHUNT_UNDER_VOLTAGE_BIT: + switch (mask) { + case INA226_SHUNT_OVER_VOLTAGE_MASK: + case INA226_SHUNT_UNDER_VOLTAGE_MASK: val *= data->config->shunt_div; return clamp_val(val, SHRT_MIN, SHRT_MAX); - case INA226_BUS_OVER_VOLTAGE_BIT: - case INA226_BUS_UNDER_VOLTAGE_BIT: + case INA226_BUS_OVER_VOLTAGE_MASK: + case INA226_BUS_UNDER_VOLTAGE_MASK: val = (val * 1000) << data->config->bus_voltage_shift; val = DIV_ROUND_CLOSEST(val, data->config->bus_voltage_lsb); return clamp_val(val, 0, SHRT_MAX); - case INA226_POWER_OVER_LIMIT_BIT: + case INA226_POWER_OVER_LIMIT_MASK: val = DIV_ROUND_CLOSEST(val, data->power_lsb_uW); return clamp_val(val, 0, USHRT_MAX); default: @@ -387,7 +387,7 @@ static ssize_t ina226_alert_show(struct device *dev, if (ret) goto abort; - if (regval & BIT(attr->index)) { + if (regval & attr->index) { ret = regmap_read(data->regmap, INA226_ALERT_LIMIT, ®val); if (ret) goto abort; @@ -432,7 +432,7 @@ static ssize_t ina226_alert_store(struct device *dev, if (val != 0) { ret = regmap_update_bits(data->regmap, INA226_MASK_ENABLE, INA226_ALERT_CONFIG_MASK, - BIT(attr->index)); + attr->index); if (ret < 0) goto abort; } @@ -456,7 +456,7 @@ static ssize_t ina226_alarm_show(struct device *dev, if (ret) return ret; - alarm = (regval & BIT(attr->index)) && + alarm = (regval & attr->index) && (regval & INA226_ALERT_FUNCTION_FLAG); return sysfs_emit(buf, "%d\n", alarm); } @@ -552,25 +552,25 @@ static ssize_t ina226_interval_show(struct device *dev, static SENSOR_DEVICE_ATTR_RO(in0_input, ina2xx_value, INA2XX_SHUNT_VOLTAGE); /* shunt voltage over/under voltage alert setting and alarm */ static SENSOR_DEVICE_ATTR_RW(in0_crit, ina226_alert, - INA226_SHUNT_OVER_VOLTAGE_BIT); + INA226_SHUNT_OVER_VOLTAGE_MASK); static SENSOR_DEVICE_ATTR_RW(in0_lcrit, ina226_alert, - INA226_SHUNT_UNDER_VOLTAGE_BIT); + INA226_SHUNT_UNDER_VOLTAGE_MASK); static SENSOR_DEVICE_ATTR_RO(in0_crit_alarm, ina226_alarm, - INA226_SHUNT_OVER_VOLTAGE_BIT); + INA226_SHUNT_OVER_VOLTAGE_MASK); static SENSOR_DEVICE_ATTR_RO(in0_lcrit_alarm, ina226_alarm, - INA226_SHUNT_UNDER_VOLTAGE_BIT); + INA226_SHUNT_UNDER_VOLTAGE_MASK); /* bus voltage */ static SENSOR_DEVICE_ATTR_RO(in1_input, ina2xx_value, INA2XX_BUS_VOLTAGE); /* bus voltage over/under voltage alert setting and alarm */ static SENSOR_DEVICE_ATTR_RW(in1_crit, ina226_alert, - INA226_BUS_OVER_VOLTAGE_BIT); + INA226_BUS_OVER_VOLTAGE_MASK); static SENSOR_DEVICE_ATTR_RW(in1_lcrit, ina226_alert, - INA226_BUS_UNDER_VOLTAGE_BIT); + INA226_BUS_UNDER_VOLTAGE_MASK); static SENSOR_DEVICE_ATTR_RO(in1_crit_alarm, ina226_alarm, - INA226_BUS_OVER_VOLTAGE_BIT); + INA226_BUS_OVER_VOLTAGE_MASK); static SENSOR_DEVICE_ATTR_RO(in1_lcrit_alarm, ina226_alarm, - INA226_BUS_UNDER_VOLTAGE_BIT); + INA226_BUS_UNDER_VOLTAGE_MASK); /* calculated current */ static SENSOR_DEVICE_ATTR_RO(curr1_input, ina2xx_value, INA2XX_CURRENT); @@ -579,9 +579,9 @@ static SENSOR_DEVICE_ATTR_RO(curr1_input, ina2xx_value, INA2XX_CURRENT); static SENSOR_DEVICE_ATTR_RO(power1_input, ina2xx_value, INA2XX_POWER); /* over-limit power alert setting and alarm */ static SENSOR_DEVICE_ATTR_RW(power1_crit, ina226_alert, - INA226_POWER_OVER_LIMIT_BIT); + INA226_POWER_OVER_LIMIT_MASK); static SENSOR_DEVICE_ATTR_RO(power1_crit_alarm, ina226_alarm, - INA226_POWER_OVER_LIMIT_BIT); + INA226_POWER_OVER_LIMIT_MASK); /* shunt resistance */ static SENSOR_DEVICE_ATTR_RW(shunt_resistor, ina2xx_shunt, INA2XX_CALIBRATION); From patchwork Tue Aug 27 15:34:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13779718 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F0B48D517 for ; Tue, 27 Aug 2024 15:35:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772908; cv=none; b=orTidXqqToWg8OY0Pk7G52uk/xFaf5ZzlYFtIeJvWQGTXKLidqMd1hw9LuHFoIWfqChQEIDDgRO3oV7hrx0yINQiP66WwL4QyZqAMGSFfzhWIC4EXqYN8+Otc/slshakLGk6VJkA7WEjbyfNSyc/Q6esB0KjkaT3TfwdxMkoCMA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772908; c=relaxed/simple; bh=QJuL1urQTqLi0RV/vO+ZUiWmT2TTgsdlTukrg6oA/w8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Vl68UvtqEV31Q4KEJ5/7EeOO/uukZG+JufADZQIVDFMpFBlS6jlI7yUOYtHrtFhUg4mWZKiC6zwcLmYSrIlrt9TbI6ZGgidJ+FS8E3SibmUZYwpgW/vKgt8Uo+kuODnEOPyeRuGyoQggRU6pKUOLskJ8U1ujtWynubEXxDMsF14= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=dLd4vQ3K; arc=none smtp.client-ip=209.85.210.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dLd4vQ3K" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-71423273c62so4091966b3a.0 for ; Tue, 27 Aug 2024 08:35:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724772906; x=1725377706; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=vzjaPJsXru0/maw2LmzdmhbHLjPNXrkm9DdhXyTj2tM=; b=dLd4vQ3K3JCY/iuSCdzYSwFDT4CDHquqLUHMyw/0oMwK0z8dw26kutZDzhuLQmG85D 63qUlfuehtNSofkK4xM2Li7pFVKMXMoSkqloZgMot2IlgvhOjbjRcOKspz3n/ZzWoZUq VtkYsjdgjbzTHPtVDqt4w5nykUYqZ0qGapgOPSRWALyaTP67j8yVSkpfEvCZEOPRg+fv mwOI7D7Rovt+Q2XpiKNYSu5Dt1T4r34IwXO0ToHZsconYQOl/iwhyT+Ad33/RKfnBCGC N3mo4zXLnfMZyWSN0CzCU6oEMQMPfryJBMvk0OsIC5u7XwLeVNLKej8ISz6MPmU9Mh12 Em8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724772906; x=1725377706; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=vzjaPJsXru0/maw2LmzdmhbHLjPNXrkm9DdhXyTj2tM=; b=m6XyyCrb13mFxAt1STVIJFZSqsJ87yAIsXs6rxLSTvJTj4Nue+0ku8qOBHXI49wXdO cQ2gQFCpgcYE6ftaJhjgvVUd5WBdzyninEoOUcew1IAGbncn6jOPmb9VqV/3AqBWlGfT 6uMj+PQ21qCNZUoyZsvwFU3PZKsdaV1XIpF0QhEK5xvk91HkCiRyrJrm1atQMQySwI0Y 6fRPu0qDHt5/jEAJbHcA9Y+fQ4qLk42rfW+i4XvSOYHvsg0wtNXXqPjCiYkx2V9TA2lG f64+D7WI7v6fDrhODsWA96HcjG0V+mPHCoEE1gnH05hD0udVB2MM2UmKHZnWdZRTiGpX Njkg== X-Gm-Message-State: AOJu0YzXvxTeJ5MKg54VU9U4Qw0f0tYHEh1TZD3oG23pys/PPbJHhLYR DudIO74iQQ82F5qZHDVhjZX0ZcaNawXs/zVlELiLb7AsbTq1sDrj9Ia91Q== X-Google-Smtp-Source: AGHT+IFa2eQdxz6idpcX43Sl4fUnjCLXw37rMHxS9XlxAFpR6G7254vMnfSOqPpWVBYLLDzmx4Ipkg== X-Received: by 2002:a05:6a20:c896:b0:1c9:1605:2a3a with SMTP id adf61e73a8af0-1cc8b0e74a1mr16375214637.0.1724772905817; Tue, 27 Aug 2024 08:35:05 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-71434236aeesm8716797b3a.30.2024.08.27.08.35.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Aug 2024 08:35:05 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Guenter Roeck Subject: [PATCH 04/11] hwmon: (ina2xx) Mark regmap_config as const Date: Tue, 27 Aug 2024 08:34:48 -0700 Message-ID: <20240827153455.1344529-5-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240827153455.1344529-1-linux@roeck-us.net> References: <20240827153455.1344529-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Recent versions of checkpatch complain that struct regmap_config should be declared as const. WARNING: struct regmap_config should normally be const Doing so reveals a potential problem in the driver: If both supported chips are present in a single system, the maximum number of registers may race when devic es are instantiated since max_registers is updated in the probe function. Solve the problem by setting .max_registers to the maximum register address of all supported chips. This does not make a practical difference while fixing the potential race condition and reducing code complexity. Signed-off-by: Guenter Roeck --- drivers/hwmon/ina2xx.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 1b4170d02c94..9d93190874d7 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -50,10 +50,6 @@ #define INA226_ALERT_LIMIT 0x07 #define INA226_DIE_ID 0xFF -/* register count */ -#define INA219_REGISTERS 6 -#define INA226_REGISTERS 8 - #define INA2XX_MAX_REGISTERS 8 /* settings - depend on use case */ @@ -95,9 +91,10 @@ */ #define INA226_TOTAL_CONV_TIME_DEFAULT 2200 -static struct regmap_config ina2xx_regmap_config = { +static const struct regmap_config ina2xx_regmap_config = { .reg_bits = 8, .val_bits = 16, + .max_register = INA2XX_MAX_REGISTERS, }; enum ina2xx_ids { ina219, ina226 }; @@ -105,7 +102,6 @@ enum ina2xx_ids { ina219, ina226 }; struct ina2xx_config { u16 config_default; int calibration_value; - int registers; int shunt_div; int bus_voltage_shift; int bus_voltage_lsb; /* uV */ @@ -128,7 +124,6 @@ static const struct ina2xx_config ina2xx_config[] = { [ina219] = { .config_default = INA219_CONFIG_DEFAULT, .calibration_value = 4096, - .registers = INA219_REGISTERS, .shunt_div = 100, .bus_voltage_shift = 3, .bus_voltage_lsb = 4000, @@ -137,7 +132,6 @@ static const struct ina2xx_config ina2xx_config[] = { [ina226] = { .config_default = INA226_CONFIG_DEFAULT, .calibration_value = 2048, - .registers = INA226_REGISTERS, .shunt_div = 400, .bus_voltage_shift = 0, .bus_voltage_lsb = 1250, @@ -646,8 +640,6 @@ static int ina2xx_probe(struct i2c_client *client) ina2xx_set_shunt(data, val); - ina2xx_regmap_config.max_register = data->config->registers; - data->regmap = devm_regmap_init_i2c(client, &ina2xx_regmap_config); if (IS_ERR(data->regmap)) { dev_err(dev, "failed to allocate register map\n"); From patchwork Tue Aug 27 15:34:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13779719 Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A9CFAD517 for ; Tue, 27 Aug 2024 15:35:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772910; cv=none; b=H4u0mozUh8C6tN5YfVfJXH7bTBVnSxvFO3ZacRzyMqHYmBAABvxLkTRDVYKTc33GucUB5aN65k825SeeC5bcPPRGPdhscwwRb6M2pUGhJEuP/EQIXrHo/pkUZFJOwNDeWQzVyIUTFgymT+o52mIRVV6MlC+ksIeZbYMxSGNvSss= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772910; c=relaxed/simple; bh=y0tTXUJ6fv3LfYehZWmN38T/L3SxXV5WI4L4dHBIfYM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NmUZ8RlciU3Xrtwg0mwb7T7pi/TJYNgD9d4Ds1C/9rOGWN4+f8g6JkzThCh6WL+X1GqegogyRiOGmhqlnmT/Yg4QRw+zz9cVNWtqjFz59tq2/mKkmRDh1iGxgtYfnivJ5F++jgg/NJ553rbgWPAiGJQ1fWH/CmhGKl27Vcftb9M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=C+L4e1XU; arc=none smtp.client-ip=209.85.215.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="C+L4e1XU" Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-7cd895682fcso2085299a12.0 for ; Tue, 27 Aug 2024 08:35:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724772907; x=1725377707; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=xGUq6JFJAztt1l0avpHLj1jlRL9d8APQ56On9hKVaj4=; b=C+L4e1XUVJODZT0KZOlRKVk/fg1l1RuHs7eKyd8ZEkn6l2cERVW8/ubPmoE05ocud2 0929eBKdUQ6CzRLrD9uG4owsdshpE68EAxOVoNSvgiaZ/tWKdbW1P14hgY8ONZWZiU1e a6UcEja5r+awOAOhpzt4m1P+muW3h1DF0e/nhrusf/tkw3HQj9+P3XchALl9ctJmVa3G BKGcHisPxcquqeTsu2ohz72di3wKay3E6FyPxTagjBGD8sDMoV3ZrRYPxuGdJc48z8bv w1dPgfOx4PFLUo1tFvyIX+c6Ki6IE94FYnDhXn40m+X9IkNJg4RSwj6H/boRmObWgszX 3YAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724772907; x=1725377707; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=xGUq6JFJAztt1l0avpHLj1jlRL9d8APQ56On9hKVaj4=; b=Wiwlx+T6sQEW4p7EMlHZQbjPdrKoKAP2M+sdQy9fM9jUn1VrJqq5KU0AMXFcwzLKCM ha36YH0UQ24z80Zs99fwbiUvvvDf830G7Qsw8LWVLZOzbbJeKHWULIb8SYkcX3vEt8ko WimLIhwP+ec266t3l0GZTOqk6HUU2ddNT/w0tRpgjthgY4xYKVYssI2wLLD2QoWYmiuv rzb9yElmCq41eBzYy9CUsdKoQpJDu7VERnsBmy/EdBbANNmWvrMwI3l96+2cy/j9eHDS pp4JPdOfkBRfr8sL+Yf6vnmFr66PC1pWPhj3wgjxZVFl8kU/o8SeizXZqZCzavirq0f2 ulcg== X-Gm-Message-State: AOJu0Yz0gwiE0VjzW+c2S0H747c6FtG+snDuPBEacbc72FBHnAVy8zwz i/i1fKoo+FiSKEyRex88rDmMIqBiI04+epTtkxLNtCR6XuS3RRWWwzeMsg== X-Google-Smtp-Source: AGHT+IG9Pkfj4RJLKIwMEt2GvYnuU1QbLZLeiInCoFC6/Yr8pvNxZ+KpaEobnISeqHcONoF2KiT95w== X-Received: by 2002:a17:90b:88d:b0:2c3:2557:3de8 with SMTP id 98e67ed59e1d1-2d646d24df4mr13101694a91.33.1724772907470; Tue, 27 Aug 2024 08:35:07 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2d5ebbb1726sm14497253a91.37.2024.08.27.08.35.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Aug 2024 08:35:06 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Guenter Roeck Subject: [PATCH 05/11] hwmon: (ina2xx) Use local regmap pointer if used more than once Date: Tue, 27 Aug 2024 08:34:49 -0700 Message-ID: <20240827153455.1344529-6-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240827153455.1344529-1-linux@roeck-us.net> References: <20240827153455.1344529-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 If regmap is accessed more than once in a function, declare and used local regmap variable. While at it, drop low value debug messages. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- drivers/hwmon/ina2xx.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 9d93190874d7..ed8764a29d3f 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -210,18 +210,14 @@ static int ina2xx_init(struct ina2xx_data *data) static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) { struct ina2xx_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; int ret, retry; - dev_dbg(dev, "Starting register %d read\n", reg); - for (retry = 5; retry; retry--) { - - ret = regmap_read(data->regmap, reg, regval); + ret = regmap_read(regmap, reg, regval); if (ret < 0) return ret; - dev_dbg(dev, "read %d, val = 0x%04x\n", reg, *regval); - /* * If the current value in the calibration register is 0, the * power and current registers will also remain at 0. In case @@ -233,8 +229,7 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) if (*regval == 0) { unsigned int cal; - ret = regmap_read(data->regmap, INA2XX_CALIBRATION, - &cal); + ret = regmap_read(regmap, INA2XX_CALIBRATION, &cal); if (ret < 0) return ret; @@ -372,17 +367,18 @@ static ssize_t ina226_alert_show(struct device *dev, { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct ina2xx_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; int regval; int val = 0; int ret; mutex_lock(&data->config_lock); - ret = regmap_read(data->regmap, INA226_MASK_ENABLE, ®val); + ret = regmap_read(regmap, INA226_MASK_ENABLE, ®val); if (ret) goto abort; if (regval & attr->index) { - ret = regmap_read(data->regmap, INA226_ALERT_LIMIT, ®val); + ret = regmap_read(regmap, INA226_ALERT_LIMIT, ®val); if (ret) goto abort; val = ina226_reg_to_alert(data, attr->index, regval); @@ -400,6 +396,7 @@ static ssize_t ina226_alert_store(struct device *dev, { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct ina2xx_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; unsigned long val; int ret; @@ -413,18 +410,18 @@ static ssize_t ina226_alert_store(struct device *dev, * if the value is non-zero. */ mutex_lock(&data->config_lock); - ret = regmap_update_bits(data->regmap, INA226_MASK_ENABLE, + ret = regmap_update_bits(regmap, INA226_MASK_ENABLE, INA226_ALERT_CONFIG_MASK, 0); if (ret < 0) goto abort; - ret = regmap_write(data->regmap, INA226_ALERT_LIMIT, + ret = regmap_write(regmap, INA226_ALERT_LIMIT, ina226_alert_to_reg(data, attr->index, val)); if (ret < 0) goto abort; if (val != 0) { - ret = regmap_update_bits(data->regmap, INA226_MASK_ENABLE, + ret = regmap_update_bits(regmap, INA226_MASK_ENABLE, INA226_ALERT_CONFIG_MASK, attr->index); if (ret < 0) From patchwork Tue Aug 27 15:34:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13779720 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 440EC1C689C for ; Tue, 27 Aug 2024 15:35:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772911; cv=none; b=r58Bg791MWb3RKtEvbSB6iWtWPePbDwpQ/NPmos2VZFlPJdaybbc+dJFVL4PvBV2/yNmy8fqY3R4A2FQTR10ib9NmkgNDBYJyb3Gv+b7lu52AuyJxm0q4R8MIaOL7O3YxHSssi32cmjz3/CJ0kcHuOTaT+omK9aVLkLLcZ7yZC8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772911; c=relaxed/simple; bh=DJlFRy411dZPu0MppiGQtfo/VVk7nUL9r/MODlPdWVM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fBe0DxcnS/WMKmbmTY8OT6timNOeUUh2bXRWtAc+vyw4hGNRxND4skP6PRJhr9+LZjS481kzCVH3F6LlfLXnYDcu9nH3vrF5tTkHxmh978DSNe69h6/+fSi+/fsdPYF1s7U0ABekrkyfPX1rcYXQZr47KcbpWuHHoRTIrgHYX9A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Sq2sWUPV; arc=none smtp.client-ip=209.85.210.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Sq2sWUPV" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-71456acebe8so2572688b3a.3 for ; Tue, 27 Aug 2024 08:35:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724772909; x=1725377709; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=sWlitGwRDhrBz7IK8sJ6XvrCc8HjGSB5nyxzSojWn2w=; b=Sq2sWUPV9DWdMMfZ316+LBCxHy8jSg/IOkq+TTmXQYT9+sfBRqu90bVUnm9kuyEcHQ jhEYvd/S+Qrdr4ar4ngbXO2J0g7j/6TZOy57Bz7I0FxUt356ZmxViY4A6AJLqaRua2Jg mLaFzcR2Cj9qwahv/zRremceBjn4Bb7+DcnAcFg6pv6NQwphtUTHfY6ZULTL3sGxOuuX l/z5JaG5kiruDeww5vuArs6rSdFaKeo2Q+r9yHx3KV8/j/mdx3cvyLKT7u76zfJ56FkG btIvwXVB30PnPak8pVQ5r9mCKkpkmPN2tx+b1X0zrz4RrutkfOSnjOgBXgiSe0suDYT0 FmMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724772909; x=1725377709; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=sWlitGwRDhrBz7IK8sJ6XvrCc8HjGSB5nyxzSojWn2w=; b=qLv3ItRoM32GN0FsUGiaIUJpIbyQ3A6YVEuuOdEqAD0eKtIdd/CB9DWII91CSDvEAP LHG5Q9rluhJtqACjEej6zc577z+x1I/i3pJq7tSNHbelWJoShWhNAYmCeLZci8FMcl3S aQG8GurJihIRqg/5oYn37ah8V1QixrVxG8mgXyjd2+Zm9VxYgktD7P/HNRd/Q5W3RkmT SUdVABUTcnMkWM4kOiS+tJgZw4q1yAxc0Ow2PdpX4V4yE9tow5cviiamHKPqM7xwMWPT ty/0slE398Hge5+QuBAYXUrevr1FI6GVfa2rgGQw9f5jZyDlO+ECbdk0cLpDBAoEiI8F p1sw== X-Gm-Message-State: AOJu0Yy1nBWlrkMk2fv3Rf+89cmB9uAZm1uhMEyYFsI92hfKAawshT8L Nll/4heDyo2hQeMyfiPB4mVNgVF7DOPR/9bRyJL4pEr+I/kg129+wPscDg== X-Google-Smtp-Source: AGHT+IGYRx5k75MlmIv0xVokQgItCpVeBrU+17od+LewRLdf6jB6G8z5voE0aGibejaJhPVJMqlaEg== X-Received: by 2002:a05:6a00:1301:b0:710:4d55:4d39 with SMTP id d2e1a72fcca58-7144575e329mr16549162b3a.4.1724772909031; Tue, 27 Aug 2024 08:35:09 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-71434336fb3sm8649061b3a.201.2024.08.27.08.35.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Aug 2024 08:35:08 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Guenter Roeck Subject: [PATCH 06/11] hwmon: (ina2xx) Re-initialize chip using regmap functions Date: Tue, 27 Aug 2024 08:34:50 -0700 Message-ID: <20240827153455.1344529-7-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240827153455.1344529-1-linux@roeck-us.net> References: <20240827153455.1344529-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 If it is necessary to re-initialize the chip, for example because it has been power cycled, use regmap functions to update register contents. This ensures that all registers, including the configuration register and alert registers, are updated to previously configured values without having to locally cache everything. For this to work, volatile registers have to be marked as volatile. Also, the cache needs to be bypassed when reading the calibration and mask_enable registers. While the calibration register is not volatile, it will be reset to 0 if the chip has been power cycled. Most of the bits in the mask_enable register are configuration bits, except for bit 4 which reports if an alert has ben observed. Both registers need to be marked as non-volatile to be updated after a power cycle, but it is necessary to bypass the cache when reading them to detect if the chip has been power cycled and to read the alert status. Another necessary change is to declare ina226_alert_to_reg() as u16. So far it returned an s16 which is sign extended to a large negative value which is then sent to regmap as unsigned int, causing an -EINVAL error return. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- drivers/hwmon/ina2xx.c | 48 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index ed8764a29d3f..f7d78588e579 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -91,10 +91,39 @@ */ #define INA226_TOTAL_CONV_TIME_DEFAULT 2200 +static bool ina2xx_writeable_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case INA2XX_CONFIG: + case INA2XX_CALIBRATION: + case INA226_MASK_ENABLE: + case INA226_ALERT_LIMIT: + return true; + default: + return false; + } +} + +static bool ina2xx_volatile_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case INA2XX_SHUNT_VOLTAGE: + case INA2XX_BUS_VOLTAGE: + case INA2XX_POWER: + case INA2XX_CURRENT: + return true; + default: + return false; + } +} + static const struct regmap_config ina2xx_regmap_config = { .reg_bits = 8, .val_bits = 16, .max_register = INA2XX_MAX_REGISTERS, + .cache_type = REGCACHE_MAPLE, + .volatile_reg = ina2xx_volatile_reg, + .writeable_reg = ina2xx_writeable_reg, }; enum ina2xx_ids { ina219, ina226 }; @@ -229,16 +258,16 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) if (*regval == 0) { unsigned int cal; - ret = regmap_read(regmap, INA2XX_CALIBRATION, &cal); + ret = regmap_read_bypassed(regmap, INA2XX_CALIBRATION, &cal); if (ret < 0) return ret; if (cal == 0) { dev_warn(dev, "chip not calibrated, reinitializing\n"); - ret = ina2xx_init(data); - if (ret < 0) - return ret; + regcache_mark_dirty(regmap); + regcache_sync(regmap); + /* * Let's make sure the power and current * registers have been updated before trying @@ -340,7 +369,7 @@ static int ina226_reg_to_alert(struct ina2xx_data *data, u32 mask, u16 regval) * Turns alert limit values into register values. * Opposite of the formula in ina2xx_get_value(). */ -static s16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, int val) +static u16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, int val) { switch (mask) { case INA226_SHUNT_OVER_VOLTAGE_MASK: @@ -439,16 +468,17 @@ static ssize_t ina226_alarm_show(struct device *dev, { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct ina2xx_data *data = dev_get_drvdata(dev); - int regval; + unsigned int mask; int alarm = 0; int ret; - ret = regmap_read(data->regmap, INA226_MASK_ENABLE, ®val); + ret = regmap_read_bypassed(data->regmap, INA226_MASK_ENABLE, &mask); if (ret) return ret; - alarm = (regval & attr->index) && - (regval & INA226_ALERT_FUNCTION_FLAG); + alarm = (mask & attr->index) && + (mask & INA226_ALERT_FUNCTION_FLAG); + return sysfs_emit(buf, "%d\n", alarm); } From patchwork Tue Aug 27 15:34:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13779721 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F165D1C6F49 for ; Tue, 27 Aug 2024 15:35:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772913; cv=none; b=R6AKd8vce0xBmXm5dOQRz78zXKVHvww6yokPuX2jDb/7ACWIE2j/FrOYhSwgsmKTwJ6NIR31O7IJVudCCiB1sj2lwXLMT9SZeLmCPwRwWegkGQMcIOwLYxafblASlQc9RGnwIpzC3KmkGnthKjv9pKKs4Ilh3Nt3RQAjnXxrI4o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772913; c=relaxed/simple; bh=ba3Yn0owiYZo8cZOJ6s3E24eC6i144xAg+9hPLo23LM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mXmZzps+eSR/wSSRA/AvqpZsiP3GLld1VLSdfw2baUHzQcoZN53UyEL6yfmNzdESDv9vFQrqcknR3ftN4Y+E3PtDMKf+pLV7mMfXzlRuTCJ3X3c+Jk9VnIaQYyoBmJRbMjf+k8aImUtD3tzhNPzY5JpM+yGK9Bf9ZzYgkZDE8Vo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=dE2uC8hu; arc=none smtp.client-ip=209.85.214.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dE2uC8hu" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-1fc47abc040so49146385ad.0 for ; Tue, 27 Aug 2024 08:35:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724772911; x=1725377711; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=ji4VkH3Wjf3aRSLR2EtWFne/rxYWA9ViEjpidP8oJq8=; b=dE2uC8huEmcP77XlmtPundw1WNiL17kbnTZlrEH1Xtx1ADXSd3+KhOBkcmhdZbUG8g WTYow0SxYtKo/OzLLUrVTQ6cpkI/BCC3AGrArGhKpcT/kNF56KPIlUs+cajIMfWF2Ggo 3Q/tJR0x/qrkTUDOIUEs0jFvpDAdKcAt8LbUlDnft6XpFwU2BU/WQAH96YpbIl9hi1eA 7QAqQ4l8KvLwXpDBVa4tx2P60DyFyUQ98v9JiSG3MZFoIeJ5WXdrOkKEYd4TC7YrfSM7 rBy8kSebq5wZIRXC5DOYbIrxP2N4bdaAisrzq4ThC9b7d5CvnZ6juT73LSbCKT+zVw3O JGlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724772911; x=1725377711; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ji4VkH3Wjf3aRSLR2EtWFne/rxYWA9ViEjpidP8oJq8=; b=YE4kQaravLHac2LjxMs/39HdHMwVIfh5I0d28wQiNG2AD2gEMCndrdpJaa1mo/tXKF FGiac+K3L1fhBH/hEE+wouCf45yK+UGc8+dWZ9FVwuO2H3HBM9cb1iz1OdED+27FpV8k QaJPy2twpSo64Dv7XZV9J46ccHF4iUoYq74LBjI1OL5fcokA0+SLOW5PjkUiZuLL9Lrz cYPn/jsWSEtprPuWnnuyjxOAZkQs9ykvYyFOAuodJqZbyTcHWsCatA6THItTEynhyVpP 1am03k6mCq41nutTleda5SbzOHbL+ZHZZGRkCJ7oKAyS4S2RaDMJIz9jQXXuhbpY/ceU f0Cg== X-Gm-Message-State: AOJu0Ywv8Jyp0DIXygTBE4iE1LWeyVeLY+Ujk0fCD7sqYtM2kf9hGRAL 7LcK6+/hoN//sK7r+tktL9F6jlgybDirpJFQO4+b4Cx/CPBWmYOEDQ6ihA== X-Google-Smtp-Source: AGHT+IHeDcRReBPwUSQtQ2vG2SqTY8eumnAVSrIignYOt7t8Ygz5K6Fz2R7sr8UCUoX4z3mYRItLBA== X-Received: by 2002:a17:902:c401:b0:203:a0ea:6266 with SMTP id d9443c01a7336-203a0ea6d13mr133084195ad.12.1724772910814; Tue, 27 Aug 2024 08:35:10 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2038557e7f4sm84683765ad.70.2024.08.27.08.35.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Aug 2024 08:35:10 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Guenter Roeck Subject: [PATCH 07/11] hwmon: (ina2xx) Set alert latch when enabling alerts Date: Tue, 27 Aug 2024 08:34:51 -0700 Message-ID: <20240827153455.1344529-8-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240827153455.1344529-1-linux@roeck-us.net> References: <20240827153455.1344529-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Alerts should only be cleared after reported, not immediately after the alert condition has been cleared. Set the latch enable bit to keep alerts latched until the alert register has been read from the chip. Signed-off-by: Guenter Roeck --- drivers/hwmon/ina2xx.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index f7d78588e579..9016c90f23c9 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -67,6 +67,7 @@ #define INA226_READ_AVG(reg) FIELD_GET(INA226_AVG_RD_MASK, reg) +#define INA226_ALERT_LATCH_ENABLE BIT(0) #define INA226_ALERT_POLARITY_MASK BIT(1) #define INA226_ALERT_POL_LOW 0 #define INA226_ALERT_POL_HIGH 1 @@ -440,7 +441,7 @@ static ssize_t ina226_alert_store(struct device *dev, */ mutex_lock(&data->config_lock); ret = regmap_update_bits(regmap, INA226_MASK_ENABLE, - INA226_ALERT_CONFIG_MASK, 0); + INA226_ALERT_CONFIG_MASK | INA226_ALERT_LATCH_ENABLE, 0); if (ret < 0) goto abort; @@ -451,8 +452,8 @@ static ssize_t ina226_alert_store(struct device *dev, if (val != 0) { ret = regmap_update_bits(regmap, INA226_MASK_ENABLE, - INA226_ALERT_CONFIG_MASK, - attr->index); + INA226_ALERT_CONFIG_MASK | INA226_ALERT_LATCH_ENABLE, + attr->index | INA226_ALERT_LATCH_ENABLE); if (ret < 0) goto abort; } From patchwork Tue Aug 27 15:34:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13779722 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9F2D8D517 for ; Tue, 27 Aug 2024 15:35:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772915; cv=none; b=A2HxNjSekJOhL7FZ1Kt7y+pWD7bewrrrDmiq56RWpJGtZ/uIP+IMFySSlMQltQC3eS33gcOeS7CF0MrH6h79YNB/lvc3Sbra4yvDEO+2UwZnUpvWjL8/UOlrnuSve5pFRnFrUWC5uIneu36PJVLg68qFbCBbw0OBhBsTs/fPsa4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772915; c=relaxed/simple; bh=ayy0m91L/UXKP4Xa9X0AO7SamC9ZIlIozwXecgQlUUw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OWnWoL+kIgnoPPHxtLcmTH1qrsDjFiKTuoB+u4UNX/aQYETdA+jvZq1EHu3x4ug2eDCHtVTkX8eW2QIZtQW43HS1qEYApXJqvtUQWFIWQW7DhMglaXu1c3ZqMWt9SVsXEpipPzX53CXtkRKzaPDXubNe1ZoGxYlXnb088w0jWVQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KXLw/TNK; arc=none smtp.client-ip=209.85.210.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KXLw/TNK" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-7142448aaf9so3850682b3a.1 for ; Tue, 27 Aug 2024 08:35:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724772912; x=1725377712; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=4Ue2oKiCaaPUDUMqc8W2WoO5gneM1Ci3wUm2JeGYt0o=; b=KXLw/TNK6xHufZXPhxD7mUBjYlHifjpz414PJcAzKBZMzDpPwm55BaXXABhMyctSA3 1b4CVTloz+0aHVTGtiacdCIk11F8dEKWpE3Jld73csX5FAWPQVDSmXDq0ynYieEZ14op KM5AmeccBeMatXBkF1JgulDJ+r7PKbVgEUhCWyyQ4E4qZh7gn6wn4u/WQR6/yLs4QSLA FF9+qmPw+DA2zd7sUcCkCdqCwpKLIQHI7jdPUW8vEpMiWZZbIi+6DB9WuwKWEnlxvCbD TnGx03cFsyERbhFFe2xsNvGq1viqU+JoD877skYVosFl2XldhT+1vrRzkO0DWrMyADv2 lRkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724772912; x=1725377712; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=4Ue2oKiCaaPUDUMqc8W2WoO5gneM1Ci3wUm2JeGYt0o=; b=vXT46xkVk7q6qKzMPDdOPGrIQmqIrKOWrBM8vIuZUT5M/Oz7DomXcdziisQiGKO1jA JixLeRqqvwJn1T9dNlVoiBaSRxmB9iMz/M4UoEtT/PU1XfcLnPNnHlmyBHmwkPKV/PR4 eL4CSIyVsbvxHQrtHRc9Ax82JWFCYxEWNlzDtb3OKpFXiOIiVy04f6i8lOV1a+wxACPH ebMkogNa1hUA6ZsmasxjInXF0OlTsmJ2SWI0pZTCoajFlXU7GPoDv5rpgBK2Q/EYfboA eRnZzVtRckN4c6EXIZsXSWKTaPVlBQud7XP2wgkrTBhOZQvih2eXGwwfpXSelqJ7WmEj 3Vjw== X-Gm-Message-State: AOJu0YzHFeTXoRbZRltoTN7IxU9H02Ot+hGXxy0ry3jcFEYhJezVriqI 4AliACtbTzxAHbeH48pIhA4ZAvxOQsTkuiyIe77TG9aI3D3WIJFMUWugbA== X-Google-Smtp-Source: AGHT+IHr/r0sptXjRe5d3TcwUADwuXDW7XiSA9uVhQPpmwfNNjBfEnv9jap5/WGdR8rTDQqrwURKtA== X-Received: by 2002:aa7:8fa7:0:b0:714:2371:7a02 with SMTP id d2e1a72fcca58-715bff087b8mr4436596b3a.5.1724772912419; Tue, 27 Aug 2024 08:35:12 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7cd9acab541sm8133535a12.22.2024.08.27.08.35.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Aug 2024 08:35:11 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Guenter Roeck Subject: [PATCH 08/11] hwmon: (ina2xx) Fix various overflow issues Date: Tue, 27 Aug 2024 08:34:52 -0700 Message-ID: <20240827153455.1344529-9-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240827153455.1344529-1-linux@roeck-us.net> References: <20240827153455.1344529-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Module tests show various overflow problems when writing limits and other attributes. in0_crit: Suspected overflow: [max=82, read 0, written 2147483648] in0_lcrit: Suspected overflow: [max=82, read 0, written 2147483648] in1_crit: Suspected overflow: [max=40959, read 0, written 2147483647] in1_lcrit: Suspected overflow: [max=40959, read 0, written 2147483647] power1_crit: Suspected overflow: [max=134218750, read 0, written 2147483648] update_interval: Suspected overflow: [max=2253, read 2, written 2147483647] Implement missing clamping on attribute write operations to avoid those problems. While at it, check in the probe function if the shunt resistor value passed from devicetree is valid, and bail out if it isn't. Also limit mutex use to the code calling ina2xx_set_shunt() since it isn't needed when called from the probe function. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- drivers/hwmon/ina2xx.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 9016c90f23c9..b40fc808bf3d 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -192,10 +192,16 @@ static int ina226_reg_to_interval(u16 config) * Return the new, shifted AVG field value of CONFIG register, * to use with regmap_update_bits */ -static u16 ina226_interval_to_reg(int interval) +static u16 ina226_interval_to_reg(unsigned long interval) { int avg, avg_bits; + /* + * The maximum supported interval is 1,024 * (2 * 8.244ms) ~= 16.8s. + * Clamp to 32 seconds before calculations to avoid overflows. + */ + interval = clamp_val(interval, 0, 32000); + avg = DIV_ROUND_CLOSEST(interval * 1000, INA226_TOTAL_CONV_TIME_DEFAULT); avg_bits = find_closest(avg, ina226_avg_tab, @@ -301,8 +307,8 @@ static int ina2xx_get_value(struct ina2xx_data *data, u8 reg, val = DIV_ROUND_CLOSEST((s16)regval, data->config->shunt_div); break; case INA2XX_BUS_VOLTAGE: - val = (regval >> data->config->bus_voltage_shift) - * data->config->bus_voltage_lsb; + val = (regval >> data->config->bus_voltage_shift) * + data->config->bus_voltage_lsb; val = DIV_ROUND_CLOSEST(val, 1000); break; case INA2XX_POWER: @@ -370,19 +376,22 @@ static int ina226_reg_to_alert(struct ina2xx_data *data, u32 mask, u16 regval) * Turns alert limit values into register values. * Opposite of the formula in ina2xx_get_value(). */ -static u16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, int val) +static u16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, unsigned long val) { switch (mask) { case INA226_SHUNT_OVER_VOLTAGE_MASK: case INA226_SHUNT_UNDER_VOLTAGE_MASK: + val = clamp_val(val, 0, SHRT_MAX * data->config->shunt_div); val *= data->config->shunt_div; - return clamp_val(val, SHRT_MIN, SHRT_MAX); + return clamp_val(val, 0, SHRT_MAX); case INA226_BUS_OVER_VOLTAGE_MASK: case INA226_BUS_UNDER_VOLTAGE_MASK: + val = clamp_val(val, 0, 200000); val = (val * 1000) << data->config->bus_voltage_shift; val = DIV_ROUND_CLOSEST(val, data->config->bus_voltage_lsb); - return clamp_val(val, 0, SHRT_MAX); + return clamp_val(val, 0, USHRT_MAX); case INA226_POWER_OVER_LIMIT_MASK: + val = clamp_val(val, 0, UINT_MAX - data->power_lsb_uW); val = DIV_ROUND_CLOSEST(val, data->power_lsb_uW); return clamp_val(val, 0, USHRT_MAX); default: @@ -489,19 +498,17 @@ static ssize_t ina226_alarm_show(struct device *dev, * to shunt_voltage_lsb = 1 / shunt_div multiplied by 10^9 in order * to keep the scale. */ -static int ina2xx_set_shunt(struct ina2xx_data *data, long val) +static int ina2xx_set_shunt(struct ina2xx_data *data, unsigned long val) { unsigned int dividend = DIV_ROUND_CLOSEST(1000000000, data->config->shunt_div); - if (val <= 0 || val > dividend) + if (!val || val > dividend) return -EINVAL; - mutex_lock(&data->config_lock); data->rshunt = val; data->current_lsb_uA = DIV_ROUND_CLOSEST(dividend, val); data->power_lsb_uW = data->config->power_lsb_factor * data->current_lsb_uA; - mutex_unlock(&data->config_lock); return 0; } @@ -526,7 +533,9 @@ static ssize_t ina2xx_shunt_store(struct device *dev, if (status < 0) return status; + mutex_lock(&data->config_lock); status = ina2xx_set_shunt(data, val); + mutex_unlock(&data->config_lock); if (status < 0) return status; return count; @@ -544,9 +553,6 @@ static ssize_t ina226_interval_store(struct device *dev, if (status < 0) return status; - if (val > INT_MAX || val == 0) - return -EINVAL; - status = regmap_update_bits(data->regmap, INA2XX_CONFIG, INA226_AVG_RD_MASK, ina226_interval_to_reg(val)); @@ -666,7 +672,9 @@ static int ina2xx_probe(struct i2c_client *client) if (device_property_read_u32(dev, "shunt-resistor", &val) < 0) val = INA2XX_RSHUNT_DEFAULT; - ina2xx_set_shunt(data, val); + ret = ina2xx_set_shunt(data, val); + if (ret < 0) + return dev_err_probe(dev, ret, "Invalid shunt resistor value\n"); data->regmap = devm_regmap_init_i2c(client, &ina2xx_regmap_config); if (IS_ERR(data->regmap)) { From patchwork Tue Aug 27 15:34:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13779723 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4CBB71C6F51 for ; Tue, 27 Aug 2024 15:35:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772916; cv=none; b=QpONfepROEuiffhoeALVDaNeKLqyVt9XpRQvSB0Oa+Jcijg9hapZM38pVlpeUS8bjVHq1aa60P7QrWfu5jCqCyI4dKZUAo9nXmIi/hvtWFc0Tp2WKQUzq8PoTk6fC3bYJSikFU8L1TiNrqy5mqSq5OKutCF+y2vAfVRnGwQWb1Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772916; c=relaxed/simple; bh=iAHZ1BPAf8KjIJlNHmXV8NqYSpdu5hb9jOib6LGQjvI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bSWRN8+j5cZBS8PVltd5CHtpFLaFdpFZVl81mTg/GipzMg7r5w0vAXupZAwCAdulEyIA7njakxhCO/JeOFI/CKnfFjK5ZaTUNUSPhy7lfoRWJC6kLc6fPii/NIx5pSFpuvImtFVGJQdaBuDpTKrZp5cz3ztS486P5VHp06+rQ8Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Yd8k4yx+; arc=none smtp.client-ip=209.85.214.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Yd8k4yx+" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-20231aa8908so44793305ad.0 for ; Tue, 27 Aug 2024 08:35:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724772914; x=1725377714; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=Sd+fkygrszA0ON7HMWWV6K7sBHbr7iMeM1Q+zp05ZV8=; b=Yd8k4yx+CO4DpdGuSBLmr6UnVelQlv8DX4wkz1A7Ak2Wt+Rs3SuidxQfCaa4iKe1Eu LSgo/uEuI6ZDZyEKvf59zoQJJuGnpEsXg16qG/j8J5nvL8uN72OoIpT/Bp/537SxjZYc Jc4Di8o8Qv1pWaSLpMQM+PZ2cuDF/9yFlz+RV0xb9apncNixyyzaANWU0E44/xjtIGSc Ck6dGI7R0dTEOlMdhqnJ3R/CIZVAteq3XmzpwTFPenNMR1Ogg/8qU9r7pEpkoSCGAdjX mIFljvwAXbO3C1SJ67OZKtM4L67TUnyyE3NSgZopS0s5zPfbQABqJ8WkUyaY+ouysfX5 mZ+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724772914; x=1725377714; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Sd+fkygrszA0ON7HMWWV6K7sBHbr7iMeM1Q+zp05ZV8=; b=WxmxDzl4fpYWd87BWu/sWWSJXwtrNWHX8FDR6HjI6HaoOp6TAr+W1kqcq7O1rzAn12 g8hIdVA+EHeujq+rZz9jF1I0MldKKrf95Vz2bzId0sL4kQP0/ok9z6MhnrAklkiB5KFs 2ec6+1LJx50eXVXhIobgQFabs4I8dTX2FQ0etALzXsKZeljR5i9M7HbzcmZXPJ0geA1y Md/8Lpx6095ZHWEenvd27D3+/oCweyVhgc3TN6chY+W8uVkX9LmTbFsYhzKhWsURM2ve ffN9CF4kc+qHF++5kvGqrLNyut85u4EqA5FJgtgKTH5vzssC31whCN1INxflL/Y2Hpbx w1OQ== X-Gm-Message-State: AOJu0YwK0syetuM1WsJKmrM45WUno83tje97rFZq6uuctjHu+4KmMf7G G4agQTp1DKc0P0JuEtxrSsWbZd2jFzPVWe8P80so/xOT7wkSSk6Bp4n4sQ== X-Google-Smtp-Source: AGHT+IESYxQLi3mc1izfL6UNkPygH+ZumiTByLUPyypBAJFLuluKPeUZFp58D7tFiV5HBWOeTA/prg== X-Received: by 2002:a17:903:1cd:b0:202:1b1e:c1e6 with SMTP id d9443c01a7336-204df4d3727mr27038585ad.44.1724772914107; Tue, 27 Aug 2024 08:35:14 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2038558137csm84501925ad.99.2024.08.27.08.35.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Aug 2024 08:35:13 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Guenter Roeck Subject: [PATCH 09/11] hwmon: (ina2xx) Consolidate chip initialization code Date: Tue, 27 Aug 2024 08:34:53 -0700 Message-ID: <20240827153455.1344529-10-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240827153455.1344529-1-linux@roeck-us.net> References: <20240827153455.1344529-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Move all chip initialization code into a single function. No functional change. Signed-off-by: Guenter Roeck --- drivers/hwmon/ina2xx.c | 109 ++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 68 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index b40fc808bf3d..d1bd998645b6 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -68,9 +68,7 @@ #define INA226_READ_AVG(reg) FIELD_GET(INA226_AVG_RD_MASK, reg) #define INA226_ALERT_LATCH_ENABLE BIT(0) -#define INA226_ALERT_POLARITY_MASK BIT(1) -#define INA226_ALERT_POL_LOW 0 -#define INA226_ALERT_POL_HIGH 1 +#define INA226_ALERT_POLARITY BIT(1) /* bit number of alert functions in Mask/Enable Register */ #define INA226_SHUNT_OVER_VOLTAGE_MASK BIT(15) @@ -140,6 +138,7 @@ struct ina2xx_config { struct ina2xx_data { const struct ina2xx_config *config; + enum ina2xx_ids chip; long rshunt; long current_lsb_uA; @@ -210,39 +209,6 @@ static u16 ina226_interval_to_reg(unsigned long interval) return FIELD_PREP(INA226_AVG_RD_MASK, avg_bits); } -static int ina2xx_set_alert_polarity(struct ina2xx_data *data, - unsigned long val) -{ - return regmap_update_bits(data->regmap, INA226_MASK_ENABLE, - INA226_ALERT_POLARITY_MASK, - FIELD_PREP(INA226_ALERT_POLARITY_MASK, val)); -} - -/* - * Calibration register is set to the best value, which eliminates - * truncation errors on calculating current register in hardware. - * According to datasheet (eq. 3) the best values are 2048 for - * ina226 and 4096 for ina219. They are hardcoded as calibration_value. - */ -static int ina2xx_calibrate(struct ina2xx_data *data) -{ - return regmap_write(data->regmap, INA2XX_CALIBRATION, - data->config->calibration_value); -} - -/* - * Initialize the configuration and calibration registers. - */ -static int ina2xx_init(struct ina2xx_data *data) -{ - int ret = regmap_write(data->regmap, INA2XX_CONFIG, - data->config->config_default); - if (ret < 0) - return ret; - - return ina2xx_calibrate(data); -} - static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) { struct ina2xx_data *data = dev_get_drvdata(dev); @@ -650,12 +616,46 @@ static const struct attribute_group ina226_group = { .attrs = ina226_attrs, }; +/* + * Initialize chip + */ +static int ina2xx_init(struct device *dev, struct ina2xx_data *data) +{ + u16 config = data->config->config_default; + struct regmap *regmap = data->regmap; + u32 shunt; + int ret; + + if (device_property_read_u32(dev, "shunt-resistor", &shunt) < 0) + shunt = INA2XX_RSHUNT_DEFAULT; + + ret = ina2xx_set_shunt(data, shunt); + if (ret < 0) + return ret; + + if (data->chip == ina226 && + device_property_read_bool(dev, "ti,alert-polarity-active-high")) + config |= INA226_ALERT_POLARITY; + + ret = regmap_write(regmap, INA2XX_CONFIG, config); + if (ret < 0) + return ret; + + /* + * Calibration register is set to the best value, which eliminates + * truncation errors on calculating current register in hardware. + * According to datasheet (eq. 3) the best values are 2048 for + * ina226 and 4096 for ina219. They are hardcoded as calibration_value. + */ + return regmap_write(regmap, INA2XX_CALIBRATION, + data->config->calibration_value); +} + static int ina2xx_probe(struct i2c_client *client) { struct device *dev = &client->dev; struct ina2xx_data *data; struct device *hwmon_dev; - u32 val; int ret, group = 0; enum ina2xx_ids chip; @@ -667,15 +667,9 @@ static int ina2xx_probe(struct i2c_client *client) /* set the device type */ data->config = &ina2xx_config[chip]; + data->chip = chip; mutex_init(&data->config_lock); - if (device_property_read_u32(dev, "shunt-resistor", &val) < 0) - val = INA2XX_RSHUNT_DEFAULT; - - ret = ina2xx_set_shunt(data, val); - if (ret < 0) - return dev_err_probe(dev, ret, "Invalid shunt resistor value\n"); - data->regmap = devm_regmap_init_i2c(client, &ina2xx_regmap_config); if (IS_ERR(data->regmap)) { dev_err(dev, "failed to allocate register map\n"); @@ -686,30 +680,9 @@ static int ina2xx_probe(struct i2c_client *client) if (ret) return dev_err_probe(dev, ret, "failed to enable vs regulator\n"); - if (chip == ina226) { - if (device_property_read_bool(dev, "ti,alert-polarity-active-high")) { - ret = ina2xx_set_alert_polarity(data, - INA226_ALERT_POL_HIGH); - if (ret < 0) { - return dev_err_probe(dev, ret, - "failed to set alert polarity active high\n"); - } - } else { - /* Set default value i.e active low */ - ret = ina2xx_set_alert_polarity(data, - INA226_ALERT_POL_LOW); - if (ret < 0) { - return dev_err_probe(dev, ret, - "failed to set alert polarity active low\n"); - } - } - } - - ret = ina2xx_init(data); - if (ret < 0) { - dev_err(dev, "error configuring the device: %d\n", ret); - return -ENODEV; - } + ret = ina2xx_init(dev, data); + if (ret < 0) + return dev_err_probe(dev, ret, "failed to configure device\n"); data->groups[group++] = &ina2xx_group; if (chip == ina226) From patchwork Tue Aug 27 15:34:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13779724 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD458D517 for ; Tue, 27 Aug 2024 15:35:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772918; cv=none; b=KH7BLrCeaSpNNXy35fbiG2Auyrsl0e22Zh1VQeXBS85hlPxDoqsuql5L4WYejxgUkxwc3RzyjW3kZcFraoug2HyaPQ/oA/S+bmFBurkTgN0JLC6Y2XSMDhpw33fxJtyygVkIZyCKUJH29n33MunC/K/oWxFpySS62ambx06izuU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772918; c=relaxed/simple; bh=XQO3Rmkm+S4gRt7La26cSFiBzrxz/ZBym+BmQ8phmDo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IeRh9+mYX60UUQdR260dEyBeDFuGj8ulU5wOCdl31r6hBhlQP9uwhM6mTFk9zlfSSvkv6aG+2JIUazU8gHzjX03kRw15TbfLBLiAC3IPyWZhdvpz1xiC0mugZ2wqJK24RIWiy83+94BGlNTaXjvQytsuh9kV/ioX/vyzElno5jE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Gb1kHDjf; arc=none smtp.client-ip=209.85.210.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Gb1kHDjf" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-7142a30e3bdso5009380b3a.0 for ; Tue, 27 Aug 2024 08:35:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724772916; x=1725377716; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=5qxgALiIyn4/A9wzNTEgJfVRrvX/dgsmnGtGQ2hZWps=; b=Gb1kHDjfGCxcGBy5hcUTJaJJ4scQBK0rGTc//qvzh2Y1uNJrhsugUZqvlIyAZdOXWP EEecKm6mFZHlGfqIfjEp6MiHvWW7CLO8pFLvvxYQv45cRSM9Q1mB2a8Z8BFm7WpvKo0q 3XxMvOmGgIST9PUtb76VjB/35s6EKpqMskH2GfiybtygxBXdbn9n8JOex6TpaPsjIF0S ph9yMBVeFqwt/G7teaCjStJiC5uJnjsuk6rMVoK7wd0kq54Dtu4BHpiO24rhLGw4aS7N f+OssgM4R2+NkDb/JPynfx/+rjNIU6n3pRp1UrSbemzCQuW5hlMsb0Tjws9b9djHvXw5 FxIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724772916; x=1725377716; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=5qxgALiIyn4/A9wzNTEgJfVRrvX/dgsmnGtGQ2hZWps=; b=iBfV7ofsABBUjdNmgUYHjEaL/6zM6PyXVjhW8hK//hTLuggpSvuzR/ecRg4IaPllil Mnq2Nm4uTnCLwX5vj1jzq6yXDKL0cCFAkDnUzwq6KbtxcVTFD1crT1oDenNYSBSx/j+c RDb0cFNCKSLXn5du3T1dO8bKfmf2H9r4S2xyl3D1SQDsfPI82h235c2RCZ3CsxNHGMIN xBPB01V14XzNj6tKWtsPD7RzEoC3oOnIktU1j4f0NxcO1+kW7XcY9AYGBRXTufSgPbwl 27KdwGghomRyRaryKA54DshfXP/vEg5qaJxJz/om/XaeIBeHB40Jy330xOoOjdLLSt87 LmxQ== X-Gm-Message-State: AOJu0YzVtDi3v41m8Y5ya7zjzWYodX9zoKqGyGN9eXR4POPftprC+KC5 ynt3tMh4cuOpTqqNn/J9/LZUkt0piM+XTnpfePr6HkiGz9d61evp8J8OgQ== X-Google-Smtp-Source: AGHT+IFZeNTz2Z0NY2AYtDxvpjxGAx9Dwaw9gdwpp7M7NpBZ1BfxTL6tkHZTf0F/d3iOs7U6oV+UGQ== X-Received: by 2002:a05:6a20:bc83:b0:1c2:8a69:338f with SMTP id adf61e73a8af0-1ccc024c2admr4727667637.12.1724772915705; Tue, 27 Aug 2024 08:35:15 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-714342314a6sm8704429b3a.21.2024.08.27.08.35.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Aug 2024 08:35:15 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Guenter Roeck Subject: [PATCH 10/11] hwmon: (ina2xx) Move ina2xx_get_value() Date: Tue, 27 Aug 2024 08:34:54 -0700 Message-ID: <20240827153455.1344529-11-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240827153455.1344529-1-linux@roeck-us.net> References: <20240827153455.1344529-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 ina2xx_get_value() will be needed earlier in the next patch, so move it. No functional change. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- drivers/hwmon/ina2xx.c | 72 +++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index d1bd998645b6..14136c96533f 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -209,6 +209,42 @@ static u16 ina226_interval_to_reg(unsigned long interval) return FIELD_PREP(INA226_AVG_RD_MASK, avg_bits); } +static int ina2xx_get_value(struct ina2xx_data *data, u8 reg, + unsigned int regval) +{ + int val; + + switch (reg) { + case INA2XX_SHUNT_VOLTAGE: + /* signed register */ + val = DIV_ROUND_CLOSEST((s16)regval, data->config->shunt_div); + break; + case INA2XX_BUS_VOLTAGE: + val = (regval >> data->config->bus_voltage_shift) * + data->config->bus_voltage_lsb; + val = DIV_ROUND_CLOSEST(val, 1000); + break; + case INA2XX_POWER: + val = regval * data->power_lsb_uW; + break; + case INA2XX_CURRENT: + /* signed register, result in mA */ + val = (s16)regval * data->current_lsb_uA; + val = DIV_ROUND_CLOSEST(val, 1000); + break; + case INA2XX_CALIBRATION: + val = regval; + break; + default: + /* programmer goofed */ + WARN_ON_ONCE(1); + val = 0; + break; + } + + return val; +} + static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) { struct ina2xx_data *data = dev_get_drvdata(dev); @@ -262,42 +298,6 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) return -ENODEV; } -static int ina2xx_get_value(struct ina2xx_data *data, u8 reg, - unsigned int regval) -{ - int val; - - switch (reg) { - case INA2XX_SHUNT_VOLTAGE: - /* signed register */ - val = DIV_ROUND_CLOSEST((s16)regval, data->config->shunt_div); - break; - case INA2XX_BUS_VOLTAGE: - val = (regval >> data->config->bus_voltage_shift) * - data->config->bus_voltage_lsb; - val = DIV_ROUND_CLOSEST(val, 1000); - break; - case INA2XX_POWER: - val = regval * data->power_lsb_uW; - break; - case INA2XX_CURRENT: - /* signed register, result in mA */ - val = (s16)regval * data->current_lsb_uA; - val = DIV_ROUND_CLOSEST(val, 1000); - break; - case INA2XX_CALIBRATION: - val = regval; - break; - default: - /* programmer goofed */ - WARN_ON_ONCE(1); - val = 0; - break; - } - - return val; -} - static ssize_t ina2xx_value_show(struct device *dev, struct device_attribute *da, char *buf) { From patchwork Tue Aug 27 15:34:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13779725 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 24825D517 for ; Tue, 27 Aug 2024 15:35:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772921; cv=none; b=ICW2FC/bCadUk+/q574iRNEQYsido8Qngj7BaW2pbiIGhUqP8BcWCNGJmDSQno4wC5UDGlpg9W8HdnotQrDwtzQ9OfOyQVgEMR7is9UWvb6TlTiaJPA2OfZlfRSKRezFo3itcBCr7NRsBxDiQRUCHtdNavicdILfJ23xVCFcc00= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724772921; c=relaxed/simple; bh=rQgWm9nBYgXwH0oZtidKEgB1Ao+4kAsKjSTVPdw1f9M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gAPuWFDYnM00u954gGq4mXT4bKK2TTHWeG8dAOOqZmPfz/qPtJ05WYJ5hetb8wXklxJBOZ5zzLUNx7irnTCT32z/a1XXj5Mr1HpdANRJgW+ZtTWZRdjIhXtZ00iOOXjzauSkuKIZV2+8XYDyFLWP10LfH+0smXAitIhOnG70BZI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=dibLC0R0; arc=none smtp.client-ip=209.85.214.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dibLC0R0" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-201df0b2df4so46075625ad.0 for ; Tue, 27 Aug 2024 08:35:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724772918; x=1725377718; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=7dx0Z14GfKG+JVcpyJljUwjH8cB+643AMo4RHT9MkWo=; b=dibLC0R04+OrGxLJU30yAfY+fJZ7b7fvBF4T6YO1vO4Qo+ybA8jo6TRaTS/XmVcNVW bjAiL4UGWdIXKnQs2YhkN9xUW+YDJlZwqjCgQmCbfjRiZ9FRKEimKYlJFrB0QvkrwI3C RAwPbGwnG75aPmc5DUyTy0+querHzYi77LalNCvmtZhiL1p+AQUpoEHfE1SOCqVpYN6Z MHpPcQdjxpP8oxuNQfv2aXWkv/Rc8P5eFqTjheZNMTumncuTbQ6HFuGOzohrLBU/M6Ov j/SyH+1Fsr1wGRPVzEQ7tPrD/zB/WYtc27rB6NWALg4YqCadE+9hNPqQvrwi18U8xj7b TtCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724772918; x=1725377718; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=7dx0Z14GfKG+JVcpyJljUwjH8cB+643AMo4RHT9MkWo=; b=UPUwzrh2641XFxOSadp/lVKIv34em93dgV4d8mKojowkd+988XVQyk7g+vsodNXRs5 ZQxj0fwiAAemEfRqk92FjqBSm4F1wwJGLK5V0fvU0uvGeSaWfT24L7jr6qv/vCE3vtGR m8iSglc1/8DytNvZdf1v94VkzkA8AtsITwPz6BLBDPgl/IoLs+QgEgjQYqCCiPgoCxwj qFmzmBlRLXvqx1G+W5c/PyWNoCUKGH0XOPtb38fPLkMsPwpUTXSdbdUBMQHF74eRNysU hDdJlUxAGjSFJzo5NKU01tpiaw3C9LZ9ZCj5hApPuhqQ5a2g9PF1JdyXzA2IPU9+DUGH biqw== X-Gm-Message-State: AOJu0YyLQ9GLufHhL9kKZQSTMgtz52RxdMiiNmDZ926NuYLEWVNctxER yC1t2XB2pwZ//xAdmu6NnBH0xwBI8AK6/SqTugdDfGwYKeHo3tETxVWRng== X-Google-Smtp-Source: AGHT+IH1OERXu/CtcHOP/KzQ3BcW5vcEt0RzopmiokpKDCVsDch6iEvkcYKzY1nabeWMsEu+PnyVLw== X-Received: by 2002:a17:902:d4ce:b0:202:dcd:d44 with SMTP id d9443c01a7336-2039e51b696mr160902775ad.54.1724772917621; Tue, 27 Aug 2024 08:35:17 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-203855665a8sm84736305ad.43.2024.08.27.08.35.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Aug 2024 08:35:16 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Guenter Roeck Subject: [PATCH 11/11] hwmon: (ina2xx) Convert to use with_info hwmon API Date: Tue, 27 Aug 2024 08:34:55 -0700 Message-ID: <20240827153455.1344529-12-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240827153455.1344529-1-linux@roeck-us.net> References: <20240827153455.1344529-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Convert driver to use the with_info hardware monitoring API to reduce its dependency on sysfs attribute functions. Signed-off-by: Guenter Roeck --- drivers/hwmon/ina2xx.c | 494 ++++++++++++++++++++++++----------------- 1 file changed, 293 insertions(+), 201 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 14136c96533f..e9e8482c32bc 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -25,9 +25,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -35,6 +35,7 @@ #include #include #include +#include #include /* common register definitions */ @@ -81,9 +82,6 @@ #define INA226_ALERT_CONFIG_MASK GENMASK(15, 10) #define INA226_ALERT_FUNCTION_FLAG BIT(4) -/* common attrs, ina226 attrs and NULL */ -#define INA2XX_MAX_ATTRIBUTE_GROUPS 3 - /* * Both bus voltage and shunt voltage conversion times for ina226 are set * to 0b0100 on POR, which translates to 2200 microseconds in total. @@ -145,8 +143,6 @@ struct ina2xx_data { long power_lsb_uW; struct mutex config_lock; struct regmap *regmap; - - const struct attribute_group *groups[INA2XX_MAX_ATTRIBUTE_GROUPS]; }; static const struct ina2xx_config ina2xx_config[] = { @@ -191,7 +187,7 @@ static int ina226_reg_to_interval(u16 config) * Return the new, shifted AVG field value of CONFIG register, * to use with regmap_update_bits */ -static u16 ina226_interval_to_reg(unsigned long interval) +static u16 ina226_interval_to_reg(long interval) { int avg, avg_bits; @@ -245,14 +241,19 @@ static int ina2xx_get_value(struct ina2xx_data *data, u8 reg, return val; } -static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) +/* + * Read and convert register value from chip. If the register value is 0, + * check if the chip has been power cycled or reset. If so, re-initialize it. + */ +static int ina2xx_read_init(struct device *dev, int reg, long *val) { struct ina2xx_data *data = dev_get_drvdata(dev); struct regmap *regmap = data->regmap; + unsigned int regval; int ret, retry; for (retry = 5; retry; retry--) { - ret = regmap_read(regmap, reg, regval); + ret = regmap_read(regmap, reg, ®val); if (ret < 0) return ret; @@ -264,7 +265,7 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) * We do that extra read of the calibration register if there * is some hint of a chip reset. */ - if (*regval == 0) { + if (regval == 0) { unsigned int cal; ret = regmap_read_bypassed(regmap, INA2XX_CALIBRATION, &cal); @@ -286,6 +287,7 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) continue; } } + *val = ina2xx_get_value(data, reg, regval); return 0; } @@ -298,46 +300,6 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) return -ENODEV; } -static ssize_t ina2xx_value_show(struct device *dev, - struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ina2xx_data *data = dev_get_drvdata(dev); - unsigned int regval; - - int err = ina2xx_read_reg(dev, attr->index, ®val); - - if (err < 0) - return err; - - return sysfs_emit(buf, "%d\n", ina2xx_get_value(data, attr->index, regval)); -} - -static int ina226_reg_to_alert(struct ina2xx_data *data, u32 mask, u16 regval) -{ - int reg; - - switch (mask) { - case INA226_SHUNT_OVER_VOLTAGE_MASK: - case INA226_SHUNT_UNDER_VOLTAGE_MASK: - reg = INA2XX_SHUNT_VOLTAGE; - break; - case INA226_BUS_OVER_VOLTAGE_MASK: - case INA226_BUS_UNDER_VOLTAGE_MASK: - reg = INA2XX_BUS_VOLTAGE; - break; - case INA226_POWER_OVER_LIMIT_MASK: - reg = INA2XX_POWER; - break; - default: - /* programmer goofed */ - WARN_ON_ONCE(1); - return 0; - } - - return ina2xx_get_value(data, reg, regval); -} - /* * Turns alert limit values into register values. * Opposite of the formula in ina2xx_get_value(). @@ -367,14 +329,10 @@ static u16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, unsigned long } } -static ssize_t ina226_alert_show(struct device *dev, - struct device_attribute *da, char *buf) +static int ina226_alert_limit_read(struct ina2xx_data *data, u32 mask, int reg, long *val) { - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ina2xx_data *data = dev_get_drvdata(dev); struct regmap *regmap = data->regmap; int regval; - int val = 0; int ret; mutex_lock(&data->config_lock); @@ -382,32 +340,26 @@ static ssize_t ina226_alert_show(struct device *dev, if (ret) goto abort; - if (regval & attr->index) { + if (regval & mask) { ret = regmap_read(regmap, INA226_ALERT_LIMIT, ®val); if (ret) goto abort; - val = ina226_reg_to_alert(data, attr->index, regval); + *val = ina2xx_get_value(data, reg, regval); + } else { + *val = 0; } - - ret = sysfs_emit(buf, "%d\n", val); abort: mutex_unlock(&data->config_lock); return ret; } -static ssize_t ina226_alert_store(struct device *dev, - struct device_attribute *da, - const char *buf, size_t count) +static int ina226_alert_limit_write(struct ina2xx_data *data, u32 mask, long val) { - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ina2xx_data *data = dev_get_drvdata(dev); struct regmap *regmap = data->regmap; - unsigned long val; int ret; - ret = kstrtoul(buf, 10, &val); - if (ret < 0) - return ret; + if (val < 0) + return -EINVAL; /* * Clear all alerts first to avoid accidentally triggering ALERT pin @@ -421,43 +373,286 @@ static ssize_t ina226_alert_store(struct device *dev, goto abort; ret = regmap_write(regmap, INA226_ALERT_LIMIT, - ina226_alert_to_reg(data, attr->index, val)); + ina226_alert_to_reg(data, mask, val)); if (ret < 0) goto abort; - if (val != 0) { + if (val) ret = regmap_update_bits(regmap, INA226_MASK_ENABLE, INA226_ALERT_CONFIG_MASK | INA226_ALERT_LATCH_ENABLE, - attr->index | INA226_ALERT_LATCH_ENABLE); - if (ret < 0) - goto abort; - } - - ret = count; + mask | INA226_ALERT_LATCH_ENABLE); abort: mutex_unlock(&data->config_lock); return ret; } -static ssize_t ina226_alarm_show(struct device *dev, - struct device_attribute *da, char *buf) +static int ina2xx_chip_read(struct device *dev, u32 attr, long *val) { - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct ina2xx_data *data = dev_get_drvdata(dev); - unsigned int mask; - int alarm = 0; + u32 regval; int ret; - ret = regmap_read_bypassed(data->regmap, INA226_MASK_ENABLE, &mask); + switch (attr) { + case hwmon_chip_update_interval: + ret = regmap_read(data->regmap, INA2XX_CONFIG, ®val); + if (ret) + return ret; + + *val = ina226_reg_to_interval(regval); + break; + default: + return -EOPNOTSUPP; + } + return 0; +} + +static int ina226_alert_read(struct regmap *regmap, u32 mask, long *val) +{ + unsigned int regval; + int ret; + + ret = regmap_read_bypassed(regmap, INA226_MASK_ENABLE, ®val); if (ret) return ret; - alarm = (mask & attr->index) && - (mask & INA226_ALERT_FUNCTION_FLAG); + *val = (regval & mask) && (regval & INA226_ALERT_FUNCTION_FLAG); - return sysfs_emit(buf, "%d\n", alarm); + return 0; } +static int ina2xx_in_read(struct device *dev, u32 attr, int channel, long *val) +{ + int voltage_reg = channel ? INA2XX_BUS_VOLTAGE : INA2XX_SHUNT_VOLTAGE; + u32 under_voltage_mask = channel ? INA226_BUS_UNDER_VOLTAGE_MASK + : INA226_SHUNT_UNDER_VOLTAGE_MASK; + u32 over_voltage_mask = channel ? INA226_BUS_OVER_VOLTAGE_MASK + : INA226_SHUNT_OVER_VOLTAGE_MASK; + struct ina2xx_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; + unsigned int regval; + int ret; + + switch (attr) { + case hwmon_in_input: + ret = regmap_read(regmap, voltage_reg, ®val); + if (ret) + return ret; + *val = ina2xx_get_value(data, voltage_reg, regval); + break; + case hwmon_in_lcrit: + return ina226_alert_limit_read(data, under_voltage_mask, + voltage_reg, val); + case hwmon_in_crit: + return ina226_alert_limit_read(data, over_voltage_mask, + voltage_reg, val); + case hwmon_in_lcrit_alarm: + return ina226_alert_read(regmap, under_voltage_mask, val); + case hwmon_in_crit_alarm: + return ina226_alert_read(regmap, over_voltage_mask, val); + default: + return -EOPNOTSUPP; + } + return 0; +} + +static int ina2xx_power_read(struct device *dev, u32 attr, long *val) +{ + struct ina2xx_data *data = dev_get_drvdata(dev); + + switch (attr) { + case hwmon_power_input: + return ina2xx_read_init(dev, INA2XX_POWER, val); + case hwmon_power_crit: + return ina226_alert_limit_read(data, INA226_POWER_OVER_LIMIT_MASK, + INA2XX_POWER, val); + case hwmon_power_crit_alarm: + return ina226_alert_read(data->regmap, INA226_POWER_OVER_LIMIT_MASK, val); + default: + return -EOPNOTSUPP; + } +} + +static int ina2xx_curr_read(struct device *dev, u32 attr, long *val) +{ + switch (attr) { + case hwmon_curr_input: + return ina2xx_read_init(dev, INA2XX_CURRENT, val); + default: + return -EOPNOTSUPP; + } +} + +static int ina2xx_read(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long *val) +{ + switch (type) { + case hwmon_chip: + return ina2xx_chip_read(dev, attr, val); + case hwmon_in: + return ina2xx_in_read(dev, attr, channel, val); + case hwmon_power: + return ina2xx_power_read(dev, attr, val); + case hwmon_curr: + return ina2xx_curr_read(dev, attr, val); + default: + return -EOPNOTSUPP; + } +} + +static int ina2xx_chip_write(struct device *dev, u32 attr, long val) +{ + struct ina2xx_data *data = dev_get_drvdata(dev); + + switch (attr) { + case hwmon_chip_update_interval: + return regmap_update_bits(data->regmap, INA2XX_CONFIG, + INA226_AVG_RD_MASK, + ina226_interval_to_reg(val)); + default: + return -EOPNOTSUPP; + } +} + +static int ina2xx_in_write(struct device *dev, u32 attr, int channel, long val) +{ + struct ina2xx_data *data = dev_get_drvdata(dev); + + switch (attr) { + case hwmon_in_lcrit: + return ina226_alert_limit_write(data, + channel ? INA226_BUS_UNDER_VOLTAGE_MASK : INA226_SHUNT_UNDER_VOLTAGE_MASK, + val); + case hwmon_in_crit: + return ina226_alert_limit_write(data, + channel ? INA226_BUS_OVER_VOLTAGE_MASK : INA226_SHUNT_OVER_VOLTAGE_MASK, + val); + default: + return -EOPNOTSUPP; + } + return 0; +} + +static int ina2xx_power_write(struct device *dev, u32 attr, long val) +{ + struct ina2xx_data *data = dev_get_drvdata(dev); + + switch (attr) { + case hwmon_power_crit: + return ina226_alert_limit_write(data, INA226_POWER_OVER_LIMIT_MASK, val); + default: + return -EOPNOTSUPP; + } + return 0; +} + +static int ina2xx_write(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long val) +{ + switch (type) { + case hwmon_chip: + return ina2xx_chip_write(dev, attr, val); + case hwmon_in: + return ina2xx_in_write(dev, attr, channel, val); + case hwmon_power: + return ina2xx_power_write(dev, attr, val); + default: + return -EOPNOTSUPP; + } +} + +static umode_t ina2xx_is_visible(const void *_data, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + const struct ina2xx_data *data = _data; + enum ina2xx_ids chip = data->chip; + + switch (type) { + case hwmon_in: + switch (attr) { + case hwmon_in_input: + return 0444; + case hwmon_in_lcrit: + case hwmon_in_crit: + if (chip == ina226) + return 0644; + break; + case hwmon_in_lcrit_alarm: + case hwmon_in_crit_alarm: + if (chip == ina226) + return 0444; + break; + default: + break; + } + break; + case hwmon_curr: + switch (attr) { + case hwmon_curr_input: + return 0444; + default: + break; + } + break; + case hwmon_power: + switch (attr) { + case hwmon_power_input: + return 0444; + case hwmon_power_crit: + if (chip == ina226) + return 0644; + break; + case hwmon_power_crit_alarm: + if (chip == ina226) + return 0444; + break; + default: + break; + } + break; + case hwmon_chip: + switch (attr) { + case hwmon_chip_update_interval: + if (chip == ina226) + return 0644; + break; + default: + break; + } + break; + default: + break; + } + return 0; +} + +static const struct hwmon_channel_info * const ina2xx_info[] = { + HWMON_CHANNEL_INFO(chip, + HWMON_C_UPDATE_INTERVAL), + HWMON_CHANNEL_INFO(in, + HWMON_I_INPUT | HWMON_I_CRIT | HWMON_I_CRIT_ALARM | + HWMON_I_LCRIT | HWMON_I_LCRIT_ALARM, + HWMON_I_INPUT | HWMON_I_CRIT | HWMON_I_CRIT_ALARM | + HWMON_I_LCRIT | HWMON_I_LCRIT_ALARM + ), + HWMON_CHANNEL_INFO(curr, HWMON_C_INPUT), + HWMON_CHANNEL_INFO(power, + HWMON_P_INPUT | HWMON_P_CRIT | HWMON_P_CRIT_ALARM), + NULL +}; + +static const struct hwmon_ops ina2xx_hwmon_ops = { + .is_visible = ina2xx_is_visible, + .read = ina2xx_read, + .write = ina2xx_write, +}; + +static const struct hwmon_chip_info ina2xx_chip_info = { + .ops = &ina2xx_hwmon_ops, + .info = ina2xx_info, +}; + +/* shunt resistance */ + /* * In order to keep calibration register value fixed, the product * of current_lsb and shunt_resistor should also be fixed and equal @@ -479,21 +674,21 @@ static int ina2xx_set_shunt(struct ina2xx_data *data, unsigned long val) return 0; } -static ssize_t ina2xx_shunt_show(struct device *dev, - struct device_attribute *da, char *buf) +static ssize_t shunt_resistor_show(struct device *dev, + struct device_attribute *da, char *buf) { struct ina2xx_data *data = dev_get_drvdata(dev); return sysfs_emit(buf, "%li\n", data->rshunt); } -static ssize_t ina2xx_shunt_store(struct device *dev, - struct device_attribute *da, - const char *buf, size_t count) +static ssize_t shunt_resistor_store(struct device *dev, + struct device_attribute *da, + const char *buf, size_t count) { + struct ina2xx_data *data = dev_get_drvdata(dev); unsigned long val; int status; - struct ina2xx_data *data = dev_get_drvdata(dev); status = kstrtoul(buf, 10, &val); if (status < 0) @@ -507,114 +702,14 @@ static ssize_t ina2xx_shunt_store(struct device *dev, return count; } -static ssize_t ina226_interval_store(struct device *dev, - struct device_attribute *da, - const char *buf, size_t count) -{ - struct ina2xx_data *data = dev_get_drvdata(dev); - unsigned long val; - int status; - - status = kstrtoul(buf, 10, &val); - if (status < 0) - return status; - - status = regmap_update_bits(data->regmap, INA2XX_CONFIG, - INA226_AVG_RD_MASK, - ina226_interval_to_reg(val)); - if (status < 0) - return status; - - return count; -} - -static ssize_t ina226_interval_show(struct device *dev, - struct device_attribute *da, char *buf) -{ - struct ina2xx_data *data = dev_get_drvdata(dev); - int status; - unsigned int regval; - - status = regmap_read(data->regmap, INA2XX_CONFIG, ®val); - if (status) - return status; - - return sysfs_emit(buf, "%d\n", ina226_reg_to_interval(regval)); -} - -/* shunt voltage */ -static SENSOR_DEVICE_ATTR_RO(in0_input, ina2xx_value, INA2XX_SHUNT_VOLTAGE); -/* shunt voltage over/under voltage alert setting and alarm */ -static SENSOR_DEVICE_ATTR_RW(in0_crit, ina226_alert, - INA226_SHUNT_OVER_VOLTAGE_MASK); -static SENSOR_DEVICE_ATTR_RW(in0_lcrit, ina226_alert, - INA226_SHUNT_UNDER_VOLTAGE_MASK); -static SENSOR_DEVICE_ATTR_RO(in0_crit_alarm, ina226_alarm, - INA226_SHUNT_OVER_VOLTAGE_MASK); -static SENSOR_DEVICE_ATTR_RO(in0_lcrit_alarm, ina226_alarm, - INA226_SHUNT_UNDER_VOLTAGE_MASK); - -/* bus voltage */ -static SENSOR_DEVICE_ATTR_RO(in1_input, ina2xx_value, INA2XX_BUS_VOLTAGE); -/* bus voltage over/under voltage alert setting and alarm */ -static SENSOR_DEVICE_ATTR_RW(in1_crit, ina226_alert, - INA226_BUS_OVER_VOLTAGE_MASK); -static SENSOR_DEVICE_ATTR_RW(in1_lcrit, ina226_alert, - INA226_BUS_UNDER_VOLTAGE_MASK); -static SENSOR_DEVICE_ATTR_RO(in1_crit_alarm, ina226_alarm, - INA226_BUS_OVER_VOLTAGE_MASK); -static SENSOR_DEVICE_ATTR_RO(in1_lcrit_alarm, ina226_alarm, - INA226_BUS_UNDER_VOLTAGE_MASK); - -/* calculated current */ -static SENSOR_DEVICE_ATTR_RO(curr1_input, ina2xx_value, INA2XX_CURRENT); - -/* calculated power */ -static SENSOR_DEVICE_ATTR_RO(power1_input, ina2xx_value, INA2XX_POWER); -/* over-limit power alert setting and alarm */ -static SENSOR_DEVICE_ATTR_RW(power1_crit, ina226_alert, - INA226_POWER_OVER_LIMIT_MASK); -static SENSOR_DEVICE_ATTR_RO(power1_crit_alarm, ina226_alarm, - INA226_POWER_OVER_LIMIT_MASK); - -/* shunt resistance */ -static SENSOR_DEVICE_ATTR_RW(shunt_resistor, ina2xx_shunt, INA2XX_CALIBRATION); - -/* update interval (ina226 only) */ -static SENSOR_DEVICE_ATTR_RW(update_interval, ina226_interval, 0); +static DEVICE_ATTR_RW(shunt_resistor); /* pointers to created device attributes */ static struct attribute *ina2xx_attrs[] = { - &sensor_dev_attr_in0_input.dev_attr.attr, - &sensor_dev_attr_in1_input.dev_attr.attr, - &sensor_dev_attr_curr1_input.dev_attr.attr, - &sensor_dev_attr_power1_input.dev_attr.attr, - &sensor_dev_attr_shunt_resistor.dev_attr.attr, + &dev_attr_shunt_resistor.attr, NULL, }; - -static const struct attribute_group ina2xx_group = { - .attrs = ina2xx_attrs, -}; - -static struct attribute *ina226_attrs[] = { - &sensor_dev_attr_in0_crit.dev_attr.attr, - &sensor_dev_attr_in0_lcrit.dev_attr.attr, - &sensor_dev_attr_in0_crit_alarm.dev_attr.attr, - &sensor_dev_attr_in0_lcrit_alarm.dev_attr.attr, - &sensor_dev_attr_in1_crit.dev_attr.attr, - &sensor_dev_attr_in1_lcrit.dev_attr.attr, - &sensor_dev_attr_in1_crit_alarm.dev_attr.attr, - &sensor_dev_attr_in1_lcrit_alarm.dev_attr.attr, - &sensor_dev_attr_power1_crit.dev_attr.attr, - &sensor_dev_attr_power1_crit_alarm.dev_attr.attr, - &sensor_dev_attr_update_interval.dev_attr.attr, - NULL, -}; - -static const struct attribute_group ina226_group = { - .attrs = ina226_attrs, -}; +ATTRIBUTE_GROUPS(ina2xx); /* * Initialize chip @@ -656,8 +751,8 @@ static int ina2xx_probe(struct i2c_client *client) struct device *dev = &client->dev; struct ina2xx_data *data; struct device *hwmon_dev; - int ret, group = 0; enum ina2xx_ids chip; + int ret; chip = (uintptr_t)i2c_get_match_data(client); @@ -684,12 +779,9 @@ static int ina2xx_probe(struct i2c_client *client) if (ret < 0) return dev_err_probe(dev, ret, "failed to configure device\n"); - data->groups[group++] = &ina2xx_group; - if (chip == ina226) - data->groups[group++] = &ina226_group; - - hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, - data, data->groups); + hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, + data, &ina2xx_chip_info, + ina2xx_groups); if (IS_ERR(hwmon_dev)) return PTR_ERR(hwmon_dev);