From patchwork Fri Nov 29 09:09:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dzmitry Sankouski X-Patchwork-Id: 13888505 Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) (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 908771598EE for ; Fri, 29 Nov 2024 09:10:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732871412; cv=none; b=NA9vFIvOEbjOpVsv0iWI56adt2G0xRol6DpUSeMG33+pta05i2G3uMtLGxX6OFm8jO3XIXOqRfXLoeohYXNcIs9VWm3JXyxDI+IF+m4zZQbLtH9YB6B/hRAOYEQhnkWXA/zyfhJDfp4EXPrt0/iupsSJRZJsZbTvKJ/lQJI092g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732871412; c=relaxed/simple; bh=/EeD7LqHcTZ3/1Ng4iRA0q/Q9oTbn7vVY0BQy1PKauQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JAvM0BsvAtxsJcvc2pDQDgdynnClZjUw+LvN70AH5i5WvdZkw0rwyDsm50LomdM2FepKvXPZ2IhLaMdMZwQanQcC6/pio7moyuEvkZgqRzSgifwfHck1UMgl4mgcexLSbCUB9sFTkq6wDwadfpEzP2/tnC1C7bNbHa3KjXpCasg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=dTLSp1WT; arc=none smtp.client-ip=209.85.218.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com 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="dTLSp1WT" Received: by mail-ej1-f54.google.com with SMTP id a640c23a62f3a-aa5302a0901so185761566b.0 for ; Fri, 29 Nov 2024 01:10:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1732871409; x=1733476209; darn=lists.linux.dev; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=RwPuXDf5OOwhnI0ZOOII5GNLjUS47fPFuHS4/Stj1TM=; b=dTLSp1WTJSIDnBWIWYu9KkXjZxvJVi+25RhxofBKyjujVXCp7/dSNK78t+q07INFNW d3j91T8IMC05Yc1NpBPQlxyAV+6A3GL4b7lzVewEbCiS/N7njhVxIKBgcbEZjC108sND LoegQCJe1xiO20+gEM7qNcL0GZuGQI5PJyC3lQn1RwrXqR+nfudG8GnpOv+z7ULqIh+2 UR3DmHOSb/0/XRsXpSW+pKqGnFVd4e5khUNkz62DXIXIbiLcAozM7WG1fm4LNTIz32p/ Bquy0zT+53/Gq9Zp7MuNNubHWlg0EODqOVQCQoaRwDg++sy51REyOsUryfT1LoHI9Nws 9eow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732871409; x=1733476209; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RwPuXDf5OOwhnI0ZOOII5GNLjUS47fPFuHS4/Stj1TM=; b=Aco74YarWELBdRJGno+P0JlYZvvQ6zd4kVrAAzRvCoDhhuVYIFKgXxTNdbF7UppZbb /vyvuin9N9GG1iqVI6l4DgWZjQfq9LowQ6wLHN1Yy9FeUGH4v0eFA3rjyLhqNnCkfnMc RF14yGdmuu6G1gtx0VGRqYTy0J7gNwwXAD0xLz+rEiX7yu95mA1OhXXXCioKBrfTtIIX rFGNnxzk/Bjtl+XLJEVvKEZRnTyAtyCdUkIiom53/AOd4wSrarlLbfevtwfbu63HS104 CCtz0B0AU5nDhjkw5ePPmftJpVyr8ZAzw0P7ZNVHQfOo9p9q4mqIh3bfa859vuNLYRYE Krqw== X-Forwarded-Encrypted: i=1; AJvYcCUh1pF3qMom6PRd/E6UlM64PF6ZtkOM/ryzh58nRDfacPMtMlKoBArDcvrtvc1B7/0RqH4=@lists.linux.dev X-Gm-Message-State: AOJu0YzG52+iT64QlZDafs7uhKeeq3hzxC5y4kjy3TILZsp72/dBFXo5 tcxgojLxRl+9KzZI3yPxQA5BQZ6FOcjaNI5uNl6eveG7jhDm8TOUUZww5A== X-Gm-Gg: ASbGnctSrKVMwU+dYR35gnS7CyhI/cxr2nXzRMzxIoL53n5CQRocwShxpRo6JfrtfpM 9si21qYC2r3gY5+zL40Us6CSiwEnFvTurR0HsJcjZdlXr4LwEPArVcb8CtA1cogRIrPqCmV3Tpv qeyZthFXvImQdyqPeiRsAO8ub7kGG6kd9go2qqm4AzCxz87Rpx3ywBZeD3Jr+yL9QhXGFYzaFqu saRIKkkV4ct46/jWHSfk+lCGFCZfU8RRWN5DdueK9MDAO5B X-Google-Smtp-Source: AGHT+IGaSoNpYyEkF4MY0uin/iFl40YkpVFgMNLIjAQotNHq5x5X5IuG35tfQL+bge3PzeB+YGebeQ== X-Received: by 2002:a17:906:23ea:b0:aa5:451c:ce26 with SMTP id a640c23a62f3a-aa581074c05mr802310266b.51.1732871408811; Fri, 29 Nov 2024 01:10:08 -0800 (PST) Received: from [127.0.1.1] ([46.53.242.72]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-aa5999032c1sm152775766b.133.2024.11.29.01.10.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 29 Nov 2024 01:10:08 -0800 (PST) From: Dzmitry Sankouski Date: Fri, 29 Nov 2024 12:09:53 +0300 Subject: [PATCH v4 1/2] power: supply: max17042: make interrupt shared Precedence: bulk X-Mailing-List: imx@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20241108-b4-max17042-v4-1-87c6d99b3d3d@gmail.com> References: <20241108-b4-max17042-v4-0-87c6d99b3d3d@gmail.com> In-Reply-To: <20241108-b4-max17042-v4-0-87c6d99b3d3d@gmail.com> To: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , Sebastian Reichel , Rob Herring , Conor Dooley , Alim Akhtar , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Bjorn Andersson , Konrad Dybcio Cc: linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, imx@lists.linux.dev, linux-arm-msm@vger.kernel.org, Dzmitry Sankouski X-Mailer: b4 0.12.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1732871405; l=1055; i=dsankouski@gmail.com; s=20240619; h=from:subject:message-id; bh=/EeD7LqHcTZ3/1Ng4iRA0q/Q9oTbn7vVY0BQy1PKauQ=; b=EvyHOgNK4AahgKG5DWBHSPPcVTYoTJaiheiGNKsbrhG7AOhn0QFFuOhoAyU4v55mKxKIL2oN9 y0QTQM7oOgEAjn27raPOcOvSbj+ijsZ35rDRl/DiAFJeZ6tqZoApkdx X-Developer-Key: i=dsankouski@gmail.com; a=ed25519; pk=YJcXFcN1EWrzBYuiE2yi5Mn6WLn6L1H71J+f7X8fMag= Fuelgauge blocks often are incorporated in bigger chip, which may use only 1 line for interrupts. Make interrupt shared. Signed-off-by: Dzmitry Sankouski --- drivers/power/supply/max17042_battery.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c index 496c3e1f2ee6..99bf6915aa23 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -1103,14 +1103,7 @@ static int max17042_probe(struct i2c_client *client) } if (client->irq) { - unsigned int flags = IRQF_ONESHOT; - - /* - * On ACPI systems the IRQ may be handled by ACPI-event code, - * so we need to share (if the ACPI code is willing to share). - */ - if (acpi_id) - flags |= IRQF_SHARED | IRQF_PROBE_SHARED; + unsigned int flags = IRQF_ONESHOT | IRQF_SHARED | IRQF_PROBE_SHARED; ret = devm_request_threaded_irq(&client->dev, client->irq, NULL, From patchwork Fri Nov 29 09:09:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dzmitry Sankouski X-Patchwork-Id: 13888506 Received: from mail-ed1-f49.google.com (mail-ed1-f49.google.com [209.85.208.49]) (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 9427318453F for ; Fri, 29 Nov 2024 09:10:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732871414; cv=none; b=bNK/wFZhIr3TynFxvUifVemoZ9Yvygl1FQsWk6EhyVPnLTyaCSnpHksHWJG3DhQ7zudL6jtWBoq7E/hpLSOR+JOdlm/mU7J8gcJzKr67vr9htm1ou9lodA1cpMBg3zCa6MplsXiej42q4VfQ3lGeichDaBSVBScZ7kYXI5/v714= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732871414; c=relaxed/simple; bh=Xoh0dNQvawf15vqypI6tnCITiCXreyWsfUHe7gs4T+I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=p3Dpf+3vRMPyc3v+WlpaRHQKafVsgnSTbumYaVj1rtJct9JznC9In3dFZx9XY3+m9u7fFl+MnZ/D6ahedzXudL/YDbSYJ04LNox0necwpKJjEIIbi5831Wfa9koKhOJQgocLIVQhVxLFklEMqLraCv1uRMjmpqz1O+iUKAIOmqo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Jx4p3dsI; arc=none smtp.client-ip=209.85.208.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com 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="Jx4p3dsI" Received: by mail-ed1-f49.google.com with SMTP id 4fb4d7f45d1cf-5d0b922a637so345995a12.1 for ; Fri, 29 Nov 2024 01:10:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1732871411; x=1733476211; darn=lists.linux.dev; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=7qffHUQjyaEfcz46tUr2RiKjchrW1y0UWEygxoizXJc=; b=Jx4p3dsIVmnMCE8kkHJCcdIFFxC+uNe03LEGRMrJKngJa4jgVtIayhdr5roKGqqxwf b6//1ZXwnxYZ6eVUorR3hV2FAD4LSpH+vOU9k5W6Kgdh7I0y9gSArT6NwivFUKLm/KBm YyM5hda6jxCjAY9H4xGa830vzxF72QvYRaFf1RFgaOxTEUSe8W5BqRiDzBfb9c8kvy5y 3fk7yIfgbTFosUVgDa3YApU7tNAZZHL2h6bBCVoJZX1OKfLU7P6H9y4SkpOZTZwGBkXm fCrHwbQ5D0Ak0VKodmkYe/qvVNL2hZje/zo2zWYt5f6G3aWfSgsKS2JWm+mnL/gT0GnS do9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732871411; x=1733476211; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7qffHUQjyaEfcz46tUr2RiKjchrW1y0UWEygxoizXJc=; b=WxUX+oCOa0mScD+Zvp9BXO5/O3OX59n7C6zxq0FM3S1MFyyY4NYcULzSoRGicB4PvT vZPV7SVQNNUcx5HocpjPZ//Rw4dfmQmdiXD22hGej6JPkkwMVMZgZXjpqACWIemtkmbR j3ulcWAfF27yChqqgRKYmBJxqbvWGadjIwsWKX/Cedira/YVM+l7r5n4U0Y9UG5gTo6D YDyTmUnQar9NgFMuReZhR5NJJtPBfJ1td/9u/djM7RQeInPggXH8mYPU2pcKMHQR754i fyCA0iQoYao3lahu6YQZ9jpUa7ptYIJ8U8P2h9JhwiiB2R8FhMvbkRDg4ut6aXZAGc/Q KYSw== X-Forwarded-Encrypted: i=1; AJvYcCUoSAToTLhsiGpujfiaNSzIws16ugYGcfM2QbuJOdDbc+wD0FLg3LVeCcqishBEwzbmZ3Y=@lists.linux.dev X-Gm-Message-State: AOJu0Ywx8fYlCKIQixatf3OHquYZIN/ipF6zxxrIc6Bf5t70BH7WyUwi gWKL7EJKcb/ygp2KZhwEz9lvF9qHzLfUy3QpfYIwRQByhSt0mVPTNGBDLg== X-Gm-Gg: ASbGnctNiZiXsuv59LZJaUsibqqGrW9yOHOt+BN48C5XFvilrtCkVGtU1clKmgrazuA 2zemJJScQ0cLS8hd8itK7ARrzUjHc0/xOiTFLBPpsMtpQpD48YDvJlWGYtPMpHZTboP8qYZ9kV9 GuOGUvnKuPckd9Ux+GO2tutu3lcwqC6VdCdVEUSv3+Ojtu4VnrAWr2oT30eG9J0KtouMMh+ejVQ whkuBEQ5kG0qefHbGKYBIoDjc7d7z3sV64K9vOci29MYr6Z X-Google-Smtp-Source: AGHT+IF+8+7FD9JQHKcuuWDIftygodt95fHqaAV5VkuYytwoGIvRmqVc52WAavSmAZ/di3Xb4CIspA== X-Received: by 2002:a17:906:2189:b0:a99:4e35:9a25 with SMTP id a640c23a62f3a-aa5810295damr813757766b.44.1732871410553; Fri, 29 Nov 2024 01:10:10 -0800 (PST) Received: from [127.0.1.1] ([46.53.242.72]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-aa5999032c1sm152775766b.133.2024.11.29.01.10.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 29 Nov 2024 01:10:10 -0800 (PST) From: Dzmitry Sankouski Date: Fri, 29 Nov 2024 12:09:54 +0300 Subject: [PATCH v4 2/2] power: supply: max17042: add platform driver variant Precedence: bulk X-Mailing-List: imx@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20241108-b4-max17042-v4-2-87c6d99b3d3d@gmail.com> References: <20241108-b4-max17042-v4-0-87c6d99b3d3d@gmail.com> In-Reply-To: <20241108-b4-max17042-v4-0-87c6d99b3d3d@gmail.com> To: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , Sebastian Reichel , Rob Herring , Conor Dooley , Alim Akhtar , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Bjorn Andersson , Konrad Dybcio Cc: linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, imx@lists.linux.dev, linux-arm-msm@vger.kernel.org, Dzmitry Sankouski X-Mailer: b4 0.12.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1732871405; l=7965; i=dsankouski@gmail.com; s=20240619; h=from:subject:message-id; bh=Xoh0dNQvawf15vqypI6tnCITiCXreyWsfUHe7gs4T+I=; b=2kmNGWiDEP+cyNDTfytwY6c+N/rqi8tH2ZqGbskBd8Cx+UwTEPNv4T8pD/mWaNOpfxQBMEwPG Y84fW5qRo/qBq1P7HqBlnLmNaIdph/ff0iEFrgAxVxh0aEiUT+EK0dX X-Developer-Key: i=dsankouski@gmail.com; a=ed25519; pk=YJcXFcN1EWrzBYuiE2yi5Mn6WLn6L1H71J+f7X8fMag= Maxim PMICs may include fuel gauge with additional features, which is out of single Linux power supply driver scope. For example, in max77705 PMIC fuelgauge has additional registers, like IIN_REG, VSYS_REG, ISYS_REG. Those needed to measure PMIC input current, system voltage and current respectively. Those measurements cannot be bound to any of fuelgauge properties. The solution here add and option to use max17042 driver as a MFD sub device, thus allowing any additional functionality be implemented as another sub device. This will help to reduce code duplication in MFD fuel gauge drivers. Signed-off-by: Dzmitry Sankouski --- Changes in v4: - rename module_init and module_exit fuctions - rework max17042_init - assign chip_type in probe function - pass i2c_client as pointer on pointer, to use same pointer created in MFD. This allows devm_regmap_init_i2c to cleanup gracefully. Changes in v3: - pass dev pointer in max17042_probe - remove prints --- drivers/power/supply/max17042_battery.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 92 insertions(+), 24 deletions(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c index 99bf6915aa23..6a1bfc4a7b13 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -1029,14 +1030,12 @@ static const struct power_supply_desc max17042_no_current_sense_psy_desc = { .num_properties = ARRAY_SIZE(max17042_battery_props) - 2, }; -static int max17042_probe(struct i2c_client *client) +static int max17042_probe(struct i2c_client *client, struct device *dev, + enum max170xx_chip_type chip_type) { - const struct i2c_device_id *id = i2c_client_get_device_id(client); struct i2c_adapter *adapter = client->adapter; const struct power_supply_desc *max17042_desc = &max17042_psy_desc; struct power_supply_config psy_cfg = {}; - const struct acpi_device_id *acpi_id = NULL; - struct device *dev = &client->dev; struct max17042_chip *chip; int ret; int i; @@ -1045,33 +1044,25 @@ static int max17042_probe(struct i2c_client *client) if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) return -EIO; - chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); + chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL); if (!chip) return -ENOMEM; chip->client = client; - if (id) { - chip->chip_type = id->driver_data; - } else { - acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev); - if (!acpi_id) - return -ENODEV; - - chip->chip_type = acpi_id->driver_data; - } + chip->chip_type = chip_type; chip->regmap = devm_regmap_init_i2c(client, &max17042_regmap_config); if (IS_ERR(chip->regmap)) { - dev_err(&client->dev, "Failed to initialize regmap\n"); + dev_err(dev, "Failed to initialize regmap\n"); return -EINVAL; } chip->pdata = max17042_get_pdata(chip); if (!chip->pdata) { - dev_err(&client->dev, "no platform data provided\n"); + dev_err(dev, "no platform data provided\n"); return -EINVAL; } - i2c_set_clientdata(client, chip); + dev_set_drvdata(dev, chip); psy_cfg.drv_data = chip; psy_cfg.of_node = dev->of_node; @@ -1095,17 +1086,17 @@ static int max17042_probe(struct i2c_client *client) regmap_write(chip->regmap, MAX17042_LearnCFG, 0x0007); } - chip->battery = devm_power_supply_register(&client->dev, max17042_desc, + chip->battery = devm_power_supply_register(dev, max17042_desc, &psy_cfg); if (IS_ERR(chip->battery)) { - dev_err(&client->dev, "failed: power supply register\n"); + dev_err(dev, "failed: power supply register\n"); return PTR_ERR(chip->battery); } if (client->irq) { unsigned int flags = IRQF_ONESHOT | IRQF_SHARED | IRQF_PROBE_SHARED; - ret = devm_request_threaded_irq(&client->dev, client->irq, + ret = devm_request_threaded_irq(dev, client->irq, NULL, max17042_thread_handler, flags, chip->battery->desc->name, @@ -1118,7 +1109,7 @@ static int max17042_probe(struct i2c_client *client) } else { client->irq = 0; if (ret != -EBUSY) - dev_err(&client->dev, "Failed to get IRQ\n"); + dev_err(dev, "Failed to get IRQ\n"); } } /* Not able to update the charge threshold when exceeded? -> disable */ @@ -1127,7 +1118,7 @@ static int max17042_probe(struct i2c_client *client) regmap_read(chip->regmap, MAX17042_STATUS, &val); if (val & STATUS_POR_BIT) { - ret = devm_work_autocancel(&client->dev, &chip->work, + ret = devm_work_autocancel(dev, &chip->work, max17042_init_worker); if (ret) return ret; @@ -1139,6 +1130,38 @@ static int max17042_probe(struct i2c_client *client) return 0; } +static int max17042_i2c_probe(struct i2c_client *client) +{ + const struct i2c_device_id *id = i2c_client_get_device_id(client); + const struct acpi_device_id *acpi_id = NULL; + struct device *dev = &client->dev; + enum max170xx_chip_type chip_type; + + if (id) { + chip_type = id->driver_data; + } else { + acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev); + if (!acpi_id) + return -ENODEV; + + chip_type = acpi_id->driver_data; + } + + return max17042_probe(client, dev, chip_type); +} + +static int max17042_platform_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct i2c_client **i2c = dev_get_platdata(dev); + const struct platform_device_id *id = platform_get_device_id(pdev); + + if (!i2c) + return -EINVAL; + + return max17042_probe(*i2c, dev, id->driver_data); +} + #ifdef CONFIG_PM_SLEEP static int max17042_suspend(struct device *dev) { @@ -1204,6 +1227,16 @@ static const struct i2c_device_id max17042_id[] = { }; MODULE_DEVICE_TABLE(i2c, max17042_id); +static const struct platform_device_id max17042_platform_id[] = { + { "max17042", MAXIM_DEVICE_TYPE_MAX17042 }, + { "max17047", MAXIM_DEVICE_TYPE_MAX17047 }, + { "max17050", MAXIM_DEVICE_TYPE_MAX17050 }, + { "max17055", MAXIM_DEVICE_TYPE_MAX17055 }, + { "max77849-battery", MAXIM_DEVICE_TYPE_MAX17047 }, + { } +}; +MODULE_DEVICE_TABLE(platform, max17042_platform_id); + static struct i2c_driver max17042_i2c_driver = { .driver = { .name = "max17042", @@ -1211,10 +1244,45 @@ static struct i2c_driver max17042_i2c_driver = { .of_match_table = of_match_ptr(max17042_dt_match), .pm = &max17042_pm_ops, }, - .probe = max17042_probe, + .probe = max17042_i2c_probe, .id_table = max17042_id, }; -module_i2c_driver(max17042_i2c_driver); + +static struct platform_driver max17042_platform_driver = { + .driver = { + .name = "max17042", + .acpi_match_table = ACPI_PTR(max17042_acpi_match), + .of_match_table = of_match_ptr(max17042_dt_match), + .pm = &max17042_pm_ops, + }, + .probe = max17042_platform_probe, + .id_table = max17042_platform_id, +}; + +static int __init max17042_init(void) +{ + int ret; + + ret = platform_driver_register(&max17042_platform_driver); + if (ret) + return ret; + + ret = i2c_add_driver(&max17042_i2c_driver); + if (ret) { + platform_driver_unregister(&max17042_platform_driver); + return ret; + } + + return 0; +} +module_init(max17042_init); + +static void __exit max17042_exit(void) +{ + i2c_del_driver(&max17042_i2c_driver); + platform_driver_unregister(&max17042_platform_driver); +} +module_exit(max17042_exit); MODULE_AUTHOR("MyungJoo Ham "); MODULE_DESCRIPTION("MAX17042 Fuel Gauge");