Received: by 2002:ab2:1149:0:b0:1f3:1f8c:d0c6 with SMTP id z9csp1304035lqz; Mon, 1 Apr 2024 01:40:14 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCUDK3lRvzl2niTSgZok/y9Y3ifbBPPNjIM6kqgna2rbiL5Z/ozcGzhW5lhiW+FnO0Fqdi7wqsETYdKrexfRR8tcMXv8K278/x4ZXGXyCw== X-Google-Smtp-Source: AGHT+IHGOFvVAcGwM4d9G0vem+1nmXMUdailQn3MKOUQj9wO+au2je1q7umoyxAwPrTRsPj7G2pU X-Received: by 2002:a05:6870:458a:b0:22d:fcf9:f771 with SMTP id y10-20020a056870458a00b0022dfcf9f771mr9175264oao.25.1711960813838; Mon, 01 Apr 2024 01:40:13 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711960813; cv=pass; d=google.com; s=arc-20160816; b=RMb25CEMnW+IuN+6HYQZmcizJsYyW/RIbN+zdUfjSXY1AfgOO1vTiq45295L4EKcSQ j5Ga0pBqDGuX/JzgYBzNUOb5tgpxb+35Su/k1omL6fZtj9HhJnoGxwhUdwtltNcpPDLD 1C+H9Om/WMbKZiSXaJ79Xfe40ZcK/MOUMoQWDLKMbqoM2VvrVBT2ic+jH20FNMudT5rj MfQbIjcWXabdikL/z+BvQSHwICg7jde/lw+PXSuPtfFZS5VPuaUyfjUtu2XN1c1bXDn7 P39AaWiJgsPQnp/rZ12qEaDNcump4vOlOOI/MrBzp2D3iqUVcCZlw2KkKbuVSwkJHeT4 k5ag== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=reply-to:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:subject:date:from:dkim-signature; bh=G5hYDULzRV3+2ayHfgDOfLqG8oSLFP3X+tOcN5V8LI8=; fh=l6rc4kBqB5BIJXKtBKlXhhVNE9vCrUtDtHtR+D9X2I8=; b=YwcAt3pH7Tbsin4O/X4AjYrNj9MZKgglnh8tFH/SNp1Dql54/3RLKkqUROZMTVvlDc 8XVnsfwJvKH5hXVs70ZEJyqz4pBLMIzFEi+EkCBP64i1tAtnF/n4ibAe3vNu5uC8QuAw Tg28aBS+nlf3yhBzJ35/qK9/JPr6vVty5ghAXPWUz9IEpgax9y9JGyprHzu4xBXxHe3X 5z5mqzuOyaiyE0bFyfFJhSrXqKNs9EPPtD6tQ74+BSzXyHlztQQ37mnxmtLD7TIaIcnm oAYcRJLO6+tEd9XWml3odV9d1bPmXZC+85lJoUyxitrXmulmUWc079SKgSAiHrjrNVmO Wf9Q==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=YLKVOU1F; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-126526-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-126526-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id d26-20020aa7869a000000b006e6880bdccbsi8775356pfo.388.2024.04.01.01.40.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Apr 2024 01:40:13 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-126526-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=YLKVOU1F; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-126526-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-126526-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 70CBA281C26 for ; Mon, 1 Apr 2024 08:40:13 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 10E4E10A25; Mon, 1 Apr 2024 08:39:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YLKVOU1F" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DE7FDBA49; Mon, 1 Apr 2024 08:39:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711960780; cv=none; b=htkjAv4AkcT/tLOYW3MobmyRrRCD3xKPggvbXtdMxGc50LMHz+zwhapbSKprPGqM3OolKfiqMWPNA9DyBGntMMrsnwm/YA4NAaqAAoYKgXhoA+qjY0Jw5QQHiBR+mwPvMeRKorD0RpMKFZ7fxT0If2c4FjBx5TYuVYf5TISsGxI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711960780; c=relaxed/simple; bh=T0Mfp3WVqeIB8i82ULSnxmrq7ZBFSs8aBDtdvf2WgnI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ogszAJh7ohuhXDTcqbCqUrwn1Eh5ghGWTSVbV+0fKcFcCgLx9V/5MHzJfFOXuo7XsRwX9ZarlbIn8FF/fdUtWuRuGRdmUKgoZ35JPrZuIoKcxfnPWZEeTdYfqlGWZa4x5S+/C8co+TmiU9cw6tnrVHLz823x/jhp1qBowT7UMTY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YLKVOU1F; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPS id 993A6C433B2; Mon, 1 Apr 2024 08:39:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1711960779; bh=T0Mfp3WVqeIB8i82ULSnxmrq7ZBFSs8aBDtdvf2WgnI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=YLKVOU1FX0386yqcsNvKVWx7DGKQ8Rkqlor+hgTHggLLHD9D6IPZJIEMK0I0Xfv/M Tt36eg6xRKPPDdDv2QJioAX6qbyTuUI/i99bVczTVzYN8CT8cKRM7h7V4Nq6ZenuJ9 nHuHtyEYx+R3DDdFSnPnMMpZB+zrXJG0tAlXaPhR0rvsZFdaU+YjtYunMM/nYkZnBN x/jqN6JKG3f/gma0upLW3BoKaBfqglra29M4YQviHgJ+whI6byrq7PqTBqWvaSQ84d DEe8OEqLFlwDoQEuo9PbZZoWQbCxqUglEAY5sPqTF4DhVK7gPesn5/xPb97bKhe1ce HtcC+q4QczBUw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8C88ACD1292; Mon, 1 Apr 2024 08:39:39 +0000 (UTC) From: Fenglin Wu via B4 Relay Date: Mon, 01 Apr 2024 16:38:52 +0800 Subject: [PATCH v8 3/3] input: pm8xxx-vibrator: add new SPMI vibrator support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20240401-pm8xxx-vibrator-new-design-v8-3-6f2b8b03b4c7@quicinc.com> References: <20240401-pm8xxx-vibrator-new-design-v8-0-6f2b8b03b4c7@quicinc.com> In-Reply-To: <20240401-pm8xxx-vibrator-new-design-v8-0-6f2b8b03b4c7@quicinc.com> To: kernel@quicinc.com, Andy Gross , Bjorn Andersson , Konrad Dybcio , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Dmitry Baryshkov Cc: linux-arm-msm@vger.kernel.org, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Fenglin Wu X-Mailer: b4 0.13-dev-83828 X-Developer-Signature: v=1; a=ed25519-sha256; t=1711960777; l=4499; i=quic_fenglinw@quicinc.com; s=20240327; h=from:subject:message-id; bh=KTKY6pvIVjfzHLnLf3c7IEWevUabtEPHzFZQuRWIpJU=; b=ckVKAUUpGCn6CBayzxswtJaUk5uvqlZf+zx9drwGyK2zmg6H1U8+Ut4ZTH/kV736rxzpAAEkH LCPWeKoHWJ4ACwQDB112nC5c+5VNwiXlyj3hTRLn9/A8i+MDAt/7QVQ X-Developer-Key: i=quic_fenglinw@quicinc.com; a=ed25519; pk=BF8SA4IVDk8/EBCwlBehKtn2hp6kipuuAuDAHh9s+K4= X-Endpoint-Received: by B4 Relay for quic_fenglinw@quicinc.com/20240327 with auth_id=146 X-Original-From: Fenglin Wu Reply-To: quic_fenglinw@quicinc.com From: Fenglin Wu Add support for a new SPMI vibrator module which is very similar to the vibrator module inside PM8916 but has a finer drive voltage step and different output voltage range, its drive level control is expanded across 2 registers. The vibrator module can be found in following Qualcomm PMICs: PMI632, PM7250B, PM7325B, PM7550BA. Signed-off-by: Fenglin Wu --- drivers/input/misc/pm8xxx-vibrator.c | 49 +++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/drivers/input/misc/pm8xxx-vibrator.c b/drivers/input/misc/pm8xxx-vibrator.c index 3b6a2e949f30..59548cd9331c 100644 --- a/drivers/input/misc/pm8xxx-vibrator.c +++ b/drivers/input/misc/pm8xxx-vibrator.c @@ -12,9 +12,9 @@ #include #include -#define VIB_MAX_LEVEL_mV (3100) -#define VIB_MIN_LEVEL_mV (1200) -#define VIB_MAX_LEVELS (VIB_MAX_LEVEL_mV - VIB_MIN_LEVEL_mV) +#define VIB_MAX_LEVEL_mV(vib) (vib->drv2_addr ? (3544) : (3100)) +#define VIB_MIN_LEVEL_mV(vib) (vib->drv2_addr ? (1504) : (1200)) +#define VIB_MAX_LEVELS(vib) (VIB_MAX_LEVEL_mV(vib) - VIB_MIN_LEVEL_mV(vib)) #define MAX_FF_SPEED 0xff @@ -25,6 +25,9 @@ struct pm8xxx_regs { unsigned int drv_offset; unsigned int drv_mask; unsigned int drv_shift; + unsigned int drv2_offset; + unsigned int drv2_mask; + unsigned int drv2_shift; unsigned int drv_en_manual_mask; }; @@ -44,6 +47,18 @@ static struct pm8xxx_regs pm8916_regs = { .drv_en_manual_mask = 0, }; +static struct pm8xxx_regs pmi632_regs = { + .enable_offset = 0x46, + .enable_mask = BIT(7), + .drv_offset = 0x40, + .drv_mask = 0xFF, + .drv_shift = 0, + .drv2_offset = 0x41, + .drv2_mask = 0x0F, + .drv2_shift = 8, + .drv_en_manual_mask = 0, +}; + /** * struct pm8xxx_vib - structure to hold vibrator data * @vib_input_dev: input device supporting force feedback @@ -52,6 +67,7 @@ static struct pm8xxx_regs pm8916_regs = { * @regs: registers' info * @enable_addr: vibrator enable register * @drv_addr: vibrator drive strength register + * @drv2_addr: vibrator drive strength upper byte register * @speed: speed of vibration set from userland * @active: state of vibrator * @level: level of vibration to set in the chip @@ -64,6 +80,7 @@ struct pm8xxx_vib { const struct pm8xxx_regs *regs; unsigned int enable_addr; unsigned int drv_addr; + unsigned int drv2_addr; int speed; int level; bool active; @@ -92,6 +109,16 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on) vib->reg_vib_drv = val; + if (regs->drv2_mask) { + if (on) + val = (vib->level << regs->drv2_shift) & regs->drv2_mask; + else + val = 0; + rc = regmap_write(vib->regmap, vib->drv2_addr, val); + if (rc < 0) + return rc; + } + if (regs->enable_mask) rc = regmap_update_bits(vib->regmap, vib->enable_addr, regs->enable_mask, on ? ~0 : 0); @@ -114,19 +141,22 @@ static void pm8xxx_work_handler(struct work_struct *work) return; /* - * pmic vibrator supports voltage ranges from 1.2 to 3.1V, so + * pmic vibrator supports voltage ranges from MIN_LEVEL to MAX_LEVEL, so * scale the level to fit into these ranges. */ if (vib->speed) { vib->active = true; - vib->level = ((VIB_MAX_LEVELS * vib->speed) / MAX_FF_SPEED) + - VIB_MIN_LEVEL_mV; - vib->level /= 100; + vib->level = ((VIB_MAX_LEVELS(vib) * vib->speed) / MAX_FF_SPEED) + + VIB_MIN_LEVEL_mV(vib); } else { vib->active = false; - vib->level = VIB_MIN_LEVEL_mV / 100; + vib->level = VIB_MIN_LEVEL_mV(vib); + } + if (!vib->drv2_addr) + vib->level /= 100; + pm8xxx_vib_set(vib, vib->active); } @@ -202,7 +232,7 @@ static int pm8xxx_vib_probe(struct platform_device *pdev) vib->enable_addr = reg_base + regs->enable_offset; vib->drv_addr = reg_base + regs->drv_offset; - + vib->drv2_addr = reg_base + regs->drv2_offset; /* operate in manual mode */ error = regmap_read(vib->regmap, vib->drv_addr, &val); if (error < 0) @@ -256,6 +286,7 @@ static const struct of_device_id pm8xxx_vib_id_table[] = { { .compatible = "qcom,pm8058-vib", .data = &pm8058_regs }, { .compatible = "qcom,pm8921-vib", .data = &pm8058_regs }, { .compatible = "qcom,pm8916-vib", .data = &pm8916_regs }, + { .compatible = "qcom,pmi632-vib", .data = &pmi632_regs }, { } }; MODULE_DEVICE_TABLE(of, pm8xxx_vib_id_table); -- 2.25.1