From patchwork Fri Feb 28 23:03:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gustavo Silva X-Patchwork-Id: 13997224 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (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 07C351DF258; Fri, 28 Feb 2025 23:03:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740783841; cv=none; b=PmOk3aARHQ8upVFhBU3Af22v/rAV2e04OfQ1JoJVdDGdnQYcf/yvMfw44uO4InQDwK00MTIGBJ8OJLZnAiHuNyqiEV0NnCFS1XILzW40oP/Xx5KdW/vlVkEFAPTj3nUyZRH1Bc2AyR1gudwenlPMGc3MvBShv+zaNNNxsKTC7yE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740783841; c=relaxed/simple; bh=cJUQOIbTN8eNND6lP9f5LF7Pa3D404GKy0353pPAVm8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BT6vb63c680nEgu6aZCnlsbYjIhG+O9lt5xe7ATOh8fjzDKtKW28tIjsCgV1n8TCGnITZ3PvwCy6XbqBQMr1ubcH00G58F0rTAAviqb+WSSVm4rD/C2VHW5eO/czExHamypc4tvTF2oQPsWHPuqYpkJHRSnv5sGA/zm59gltBHg= 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=Bkf1H6yc; arc=none smtp.client-ip=209.85.214.182 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="Bkf1H6yc" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-22339936bbfso41398655ad.1; Fri, 28 Feb 2025 15:03:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740783839; x=1741388639; darn=vger.kernel.org; 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=+7O/hrvstZvHUG+IHHgHeJpWw8FZjuMGEnoX2VM0mCs=; b=Bkf1H6ycrYaF1lEKOysWgUfATxrqJdhvnSeyWMxYPuUozr6pdoUFHzSMLa6/OHhh6v 6rlnqoeFg3yvuERblkDSpj0zMIUsv55lygQsSblxasMDVntgjAXAT8+YD+Cx8S6UViH5 XgAnWfBtfNIM9nLQ9ErDSO5B87YduIi8GIzhAnoxfVcQbfQijX98dAA8LRcJDctaA9M8 75h7LU2vopWasF/4jZb58p6hb3TCsPVV5Qwu2pMDdvOyoVhAyE4jxpAngnMfzrTsfWJE Aow6f2lj9eqjY1iyPXFkZx46yVdyav5EukDDkyslhfmf/iuKdPyEA+DpjT12rAU+JWcp qHZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740783839; x=1741388639; 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=+7O/hrvstZvHUG+IHHgHeJpWw8FZjuMGEnoX2VM0mCs=; b=l3cjXf76vJHlH34qmlDON+lX+W/yvforKA7V0csApTIjGMnN8Mum8CyT5JXeRVesCZ h4GCb59aQlRwVopkSMs3N0DjIZQjR+/khpy9qdj85EFB2MhtOuX20f3fBRGPl+Udz5jb +rCT9POAK9T6UV+nvhrxppSOaieieLBM6jIArg1jFbr3QxsviXa9WK5jdN4fprxnKUPk 54LAav9r40Or+5OfWRMgroHdK1nkZmsppAQlurbQQhn85qePags6Oq+1Br7zrD4Cl6A0 07uzMtsMJVdW4gDm8CabRcB4408CPMgSCvYs1yuaXcFEDo4GnB7Ar75w3UynLz95IWMx D40g== X-Forwarded-Encrypted: i=1; AJvYcCUEGL7bKeyyj8rk68rBJ0stYqjMu9QIIO9fA+KLHJS1v53qBLf0NorWT3Re2tVMSM6D+A2DoRKSxoteNu4=@vger.kernel.org X-Gm-Message-State: AOJu0YwP2te6xU2gJVKq8RCidpOwZXwKIfcdvM7zq+VBUWhuc3QVsrYM rODyyoBCCa4kEXgLfUfjyyictKpRl39FmJ3ZPgUyhXmozytS1CN8 X-Gm-Gg: ASbGnctTUYd60D1epZEAWaikxmIZG2hnGz8fzR4uUS40YO5ARL/8WYtS6ayGkWASNoF EtcxjYC+qCee5StVE+fH+e4dwwBERq3lZG9dDP4o9kJ0uKrxllikZ/U+0fKhfMl/FxI7nnNRzVt m839BwRrBtw0SlBI/BySC3iMvsBFAqYVSxhru8Q3JkgzXw2OHYvoMhqKjnUFpGY0/1n+pJk0it+ iBWxdpxp3OE0BG01u2wQKBb1OP0z/rxGeGQOCurtEciADklH3lJx8RzL66e46FxVOYL3jleWe6f LlqYPLJnVWSlLdRJBxf7mJSGGmUgIL/Ydh+SuQ== X-Google-Smtp-Source: AGHT+IEjA+cAN8ALBBrLiwmHv8vkXM9NNJFqNVl9vrB+2sSCTnoUb6qc3mhcILuRy+wsyR0GVpPTIg== X-Received: by 2002:a05:6a20:734b:b0:1ee:d418:f758 with SMTP id adf61e73a8af0-1f2f4cdb421mr8917377637.17.1740783839155; Fri, 28 Feb 2025 15:03:59 -0800 (PST) Received: from [192.168.0.107] ([2804:14d:90a8:854f::10dc]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-aee7ddf230dsm3974875a12.8.2025.02.28.15.03.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Feb 2025 15:03:58 -0800 (PST) From: Gustavo Silva Date: Fri, 28 Feb 2025 20:03:48 -0300 Subject: [PATCH v2 1/3] iio: imu: bmi270: move private struct declaration to source file Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250228-bmi270-irq-v2-1-3f97a4e8f551@gmail.com> References: <20250228-bmi270-irq-v2-0-3f97a4e8f551@gmail.com> In-Reply-To: <20250228-bmi270-irq-v2-0-3f97a4e8f551@gmail.com> To: Alex Lanzano , Jonathan Cameron , Lars-Peter Clausen Cc: linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, Gustavo Silva X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1740783831; l=2465; i=gustavograzs@gmail.com; s=20250111; h=from:subject:message-id; bh=cJUQOIbTN8eNND6lP9f5LF7Pa3D404GKy0353pPAVm8=; b=XTHQ8Nmvg2Ja8S6ciWdeEKquDHmZ2bwb1PmuPW4PuFZKhQvhXiAXPjwt6tCYviYB6wH8Nk9xg gLoVsyxe+18AdQY/OPWV2xX5RI2A2iPGid4hwjkUdqmzIcxMdFDZ6vi X-Developer-Key: i=gustavograzs@gmail.com; a=ed25519; pk=g2TFXpo1jMCOCN+rzVoM9NDFNfSMOgVyY0rlyvk4RTM= The device's private data struct is currently declared in the header file, but it does not need to be exposed there. Move it to the driver's core source file to avoid unnecessary #include directives or forward declarations in the header. Acked-by: Alex Lanzano Signed-off-by: Gustavo Silva --- drivers/iio/imu/bmi270/bmi270.h | 17 +---------------- drivers/iio/imu/bmi270/bmi270_core.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/drivers/iio/imu/bmi270/bmi270.h b/drivers/iio/imu/bmi270/bmi270.h index fdfad5784cc52043475b6816286619fac5824684..d94525f6aee85f21cc9e9ae1bc9c1db0dc00b927 100644 --- a/drivers/iio/imu/bmi270/bmi270.h +++ b/drivers/iio/imu/bmi270/bmi270.h @@ -6,22 +6,6 @@ #include #include -struct device; -struct bmi270_data { - struct device *dev; - struct regmap *regmap; - const struct bmi270_chip_info *chip_info; - - /* - * Where IIO_DMA_MINALIGN may be larger than 8 bytes, align to - * that to ensure a DMA safe buffer. - */ - struct { - __le16 channels[6]; - aligned_s64 timestamp; - } data __aligned(IIO_DMA_MINALIGN); -}; - struct bmi270_chip_info { const char *name; int chip_id; @@ -32,6 +16,7 @@ extern const struct regmap_config bmi270_regmap_config; extern const struct bmi270_chip_info bmi260_chip_info; extern const struct bmi270_chip_info bmi270_chip_info; +struct device; int bmi270_core_probe(struct device *dev, struct regmap *regmap, const struct bmi270_chip_info *chip_info); diff --git a/drivers/iio/imu/bmi270/bmi270_core.c b/drivers/iio/imu/bmi270/bmi270_core.c index 464dcdd657c4ba27fdb7620c80e9f05e2a831910..9f24d4044ed6f00f67fd3a8f5adda821c3140a18 100644 --- a/drivers/iio/imu/bmi270/bmi270_core.c +++ b/drivers/iio/imu/bmi270/bmi270_core.c @@ -78,6 +78,21 @@ #define BMI260_INIT_DATA_FILE "bmi260-init-data.fw" #define BMI270_INIT_DATA_FILE "bmi270-init-data.fw" +struct bmi270_data { + struct device *dev; + struct regmap *regmap; + const struct bmi270_chip_info *chip_info; + + /* + * Where IIO_DMA_MINALIGN may be larger than 8 bytes, align to + * that to ensure a DMA safe buffer. + */ + struct { + __le16 channels[6]; + aligned_s64 timestamp; + } data __aligned(IIO_DMA_MINALIGN); +}; + enum bmi270_scan { BMI270_SCAN_ACCEL_X, BMI270_SCAN_ACCEL_Y, From patchwork Fri Feb 28 23:03:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gustavo Silva X-Patchwork-Id: 13997225 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (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 6CF0D1DF726; Fri, 28 Feb 2025 23:04:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740783845; cv=none; b=pDFjGPtnsgC7cfC7k1E2Cvy0Cgn4EuqUuBr9HhWWnipqT9eWAgZ/mz4RZLJsci6BVt28rlGRG+wHhxRu8t7V25PJ9wjO7RyZAvI17OzLEq/JpSL3IYigp0ysNBV7Skx1cWkvlqzk6rg+TaiFatAx2ZfmFVXHDAqpV+WkMhX7Z24= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740783845; c=relaxed/simple; bh=S2I+5zrHkIJWgW/x1cmFQ21bTNoC3IzmEyR94oY7aJE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tX42IxbyxuXCBqE9oXx5P0DyqPDiV2pBjSkAWYBHz2d78l4VopxGvfkwnfIK8gOWzSy96niPEWxt+DZ2oQkpjcBAVOiRU8KPyL6dLkyVPwT/0L88Ie4YwW/YyeYO7YACbFKhAQBD7wUix0yPxXv2EGv+3DIIk6sv1QX7i6n+tq0= 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=B9eG5y5n; arc=none smtp.client-ip=209.85.214.169 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="B9eG5y5n" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2232aead377so51523065ad.0; Fri, 28 Feb 2025 15:04:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740783843; x=1741388643; darn=vger.kernel.org; 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=Wqniwqp268BOuKTlqpS+CRRTqpiMUjFZRa/CVRrwA44=; b=B9eG5y5n+l4JDEyuvlsYncgOD4NlsmoVvmE0hrz9iL9OP6fW2C9GFRbdN6tgxaTw5x XfEQVN1rCUOYhBLVSPcMQI75/lsvk3A2kfHpV3xtvWMZVaVBn1slH6TKZR/Hohdj0uiO iCbJcXr7kvbzYBdUiJ6ne/30Hekj/VmuHqnUf08+iThMs3Hsu189l3zTINv3GNsolBUz 7+RO6dcVWQuDdbIypIrF/qQ/hpLIVicDMGfTVcJKKIB8eQZRUEJJJ0fIuCWPKIbP1H+o dDbmBzIUckrS4pxVmjYJDeUtnB7qWaP70sHOxJvXozE1FU8kksX/uDfIVMotARIatYJy DZoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740783843; x=1741388643; 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=Wqniwqp268BOuKTlqpS+CRRTqpiMUjFZRa/CVRrwA44=; b=v7i8vunq76ellPpVzmbEZlcUz91VEDNiWBJQm8HEj/7ivhE3fYDL6Iej+3OZo5x9yM /YacRRg+OGPmDqbY61FzWiuTQaO46YfpGv6aA7mz0+ZBtdf3bIrGI0FOa52vtwOUR3Ts nfKqJ1hVaL6ZRodcsqpGu7j/Pq4u7AxVz16JxEGBApyWcZrRoY8yTQGags+CYoKai6HZ ms3HR2GCxYvA0linLnqWRyK8cSsTaxp1jVDUXyXeH0v0+udlwP15OhKI6W7SFaq9uZ+1 U/Uf/5Inp8Yc0x3kQU+sE0VcudY7W2aICaVTFlKdovzX6/YHbDevilsyCxfe24bD/pH4 rkwg== X-Forwarded-Encrypted: i=1; AJvYcCUd/D5koH+hCJJPm/AdMLkdMUngzw0AHsmuYC9WEQyIVc+Eccz5I/iQmbO+e4LkTAyy/Ur0t0Yluu9T0LU=@vger.kernel.org X-Gm-Message-State: AOJu0Yxl5lTT+tFzvs6dqaKgam0BikiML+FvkuPKk5d3WXRQ2FWFRVQs gBEfeulnTXgOzTXAwh/946RpTWQlWkNk3OB47t44NTih5yKWe9S6 X-Gm-Gg: ASbGncs8Z2P/gSY9fI5ecdh4EiUW2skLfKfdxnarisSJiz/T6SpIg6eb9xAIM4mL5Ol kCQAvlkvoHUVcAD6KZXN+dE1j1uux3ujOoweSRcXpwFF8yVg3VVshd1vfELF35qpewXVcK7C7nD k4sUk5a7Ci17IuzXJkAGKVdUvYG+d4nuiV+O7ZfM3reTLVSx1tDUHqlOXkzVTo/zVmalZevl2wq kWgKctUtilcfBxZ+pgPYRwoMBnBgdhMf5pAUfsg48+/0yLMPtDBffMeMW1pFRyh74diisnn9cME 35U3UVCgK6Ko/V/uPmwisqOXJdkqMM3bjc9rqw== X-Google-Smtp-Source: AGHT+IGQrPappHqX1wrTaZCZeKkRXP+Q5JZAiFzEP+LdfrmZbuJkONTHL0PwfyWv+Yeqjb+XOWbujw== X-Received: by 2002:a05:6a21:696:b0:1ee:5cf2:9c07 with SMTP id adf61e73a8af0-1f2f4c98064mr10361226637.3.1740783842632; Fri, 28 Feb 2025 15:04:02 -0800 (PST) Received: from [192.168.0.107] ([2804:14d:90a8:854f::10dc]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-aee7ddf230dsm3974875a12.8.2025.02.28.15.03.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Feb 2025 15:04:02 -0800 (PST) From: Gustavo Silva Date: Fri, 28 Feb 2025 20:03:49 -0300 Subject: [PATCH v2 2/3] iio: imu: bmi270: rename variable bmi270_device to data Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250228-bmi270-irq-v2-2-3f97a4e8f551@gmail.com> References: <20250228-bmi270-irq-v2-0-3f97a4e8f551@gmail.com> In-Reply-To: <20250228-bmi270-irq-v2-0-3f97a4e8f551@gmail.com> To: Alex Lanzano , Jonathan Cameron , Lars-Peter Clausen Cc: linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, Gustavo Silva X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1740783832; l=8485; i=gustavograzs@gmail.com; s=20250111; h=from:subject:message-id; bh=S2I+5zrHkIJWgW/x1cmFQ21bTNoC3IzmEyR94oY7aJE=; b=zPb6sa4VX67w7zqlACZh3gy4c+5LHGv0q4o2s/SSFyF7fg7oYElFMOs4hcAScgVYeZjZ8VZ4u 4JIUM//qc68Ckrv8wJR8TeeJwV5ay9+a6UZOfz5/3Qc7d7wzgayRmzX X-Developer-Key: i=gustavograzs@gmail.com; a=ed25519; pk=g2TFXpo1jMCOCN+rzVoM9NDFNfSMOgVyY0rlyvk4RTM= Rename all instances of 'struct bmi270_data' to 'data', to ensure consistency across the driver. Also rename bmi270_data::data to bmi270_data::buffer to avoid naming conflicts. Acked-by: Alex Lanzano Signed-off-by: Gustavo Silva --- drivers/iio/imu/bmi270/bmi270_core.c | 85 +++++++++++++++++------------------- 1 file changed, 41 insertions(+), 44 deletions(-) diff --git a/drivers/iio/imu/bmi270/bmi270_core.c b/drivers/iio/imu/bmi270/bmi270_core.c index 9f24d4044ed6f00f67fd3a8f5adda821c3140a18..16deda12a5c1aba6d366f7fcb134266c490d3a75 100644 --- a/drivers/iio/imu/bmi270/bmi270_core.c +++ b/drivers/iio/imu/bmi270/bmi270_core.c @@ -90,7 +90,7 @@ struct bmi270_data { struct { __le16 channels[6]; aligned_s64 timestamp; - } data __aligned(IIO_DMA_MINALIGN); + } buffer __aligned(IIO_DMA_MINALIGN); }; enum bmi270_scan { @@ -284,8 +284,8 @@ static int bmi270_set_scale(struct bmi270_data *data, int chan_type, int uscale) return -EINVAL; } -static int bmi270_get_scale(struct bmi270_data *bmi270_device, int chan_type, - int *scale, int *uscale) +static int bmi270_get_scale(struct bmi270_data *data, int chan_type, int *scale, + int *uscale) { int ret; unsigned int val; @@ -293,8 +293,7 @@ static int bmi270_get_scale(struct bmi270_data *bmi270_device, int chan_type, switch (chan_type) { case IIO_ACCEL: - ret = regmap_read(bmi270_device->regmap, - BMI270_ACC_CONF_RANGE_REG, &val); + ret = regmap_read(data->regmap, BMI270_ACC_CONF_RANGE_REG, &val); if (ret) return ret; @@ -302,8 +301,7 @@ static int bmi270_get_scale(struct bmi270_data *bmi270_device, int chan_type, bmi270_scale_item = bmi270_scale_table[BMI270_ACCEL]; break; case IIO_ANGL_VEL: - ret = regmap_read(bmi270_device->regmap, - BMI270_GYR_CONF_RANGE_REG, &val); + ret = regmap_read(data->regmap, BMI270_GYR_CONF_RANGE_REG, &val); if (ret) return ret; @@ -403,25 +401,25 @@ static irqreturn_t bmi270_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; - struct bmi270_data *bmi270_device = iio_priv(indio_dev); + struct bmi270_data *data = iio_priv(indio_dev); int ret; - ret = regmap_bulk_read(bmi270_device->regmap, BMI270_ACCEL_X_REG, - &bmi270_device->data.channels, - sizeof(bmi270_device->data.channels)); + ret = regmap_bulk_read(data->regmap, BMI270_ACCEL_X_REG, + &data->buffer.channels, + sizeof(data->buffer.channels)); if (ret) goto done; - iio_push_to_buffers_with_timestamp(indio_dev, &bmi270_device->data, + iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer, pf->timestamp); done: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; } -static int bmi270_get_data(struct bmi270_data *bmi270_device, - int chan_type, int axis, int *val) +static int bmi270_get_data(struct bmi270_data *data, int chan_type, int axis, + int *val) { __le16 sample; int reg; @@ -441,7 +439,7 @@ static int bmi270_get_data(struct bmi270_data *bmi270_device, return -EINVAL; } - ret = regmap_bulk_read(bmi270_device->regmap, reg, &sample, sizeof(sample)); + ret = regmap_bulk_read(data->regmap, reg, &sample, sizeof(sample)); if (ret) return ret; @@ -455,17 +453,17 @@ static int bmi270_read_raw(struct iio_dev *indio_dev, int *val, int *val2, long mask) { int ret; - struct bmi270_data *bmi270_device = iio_priv(indio_dev); + struct bmi270_data *data = iio_priv(indio_dev); switch (mask) { case IIO_CHAN_INFO_RAW: - ret = bmi270_get_data(bmi270_device, chan->type, chan->channel2, val); + ret = bmi270_get_data(data, chan->type, chan->channel2, val); if (ret) return ret; return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: - ret = bmi270_get_scale(bmi270_device, chan->type, val, val2); + ret = bmi270_get_scale(data, chan->type, val, val2); return ret ? ret : IIO_VAL_INT_PLUS_MICRO; case IIO_CHAN_INFO_OFFSET: switch (chan->type) { @@ -476,7 +474,7 @@ static int bmi270_read_raw(struct iio_dev *indio_dev, return -EINVAL; } case IIO_CHAN_INFO_SAMP_FREQ: - ret = bmi270_get_odr(bmi270_device, chan->type, val, val2); + ret = bmi270_get_odr(data, chan->type, val, val2); return ret ? ret : IIO_VAL_INT_PLUS_MICRO; default: return -EINVAL; @@ -599,12 +597,12 @@ static const struct iio_chan_spec bmi270_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(BMI270_SCAN_TIMESTAMP), }; -static int bmi270_validate_chip_id(struct bmi270_data *bmi270_device) +static int bmi270_validate_chip_id(struct bmi270_data *data) { int chip_id; int ret; - struct device *dev = bmi270_device->dev; - struct regmap *regmap = bmi270_device->regmap; + struct device *dev = data->dev; + struct regmap *regmap = data->regmap; ret = regmap_read(regmap, BMI270_CHIP_ID_REG, &chip_id); if (ret) @@ -618,24 +616,24 @@ static int bmi270_validate_chip_id(struct bmi270_data *bmi270_device) if (chip_id == BMI160_CHIP_ID_VAL) return -ENODEV; - if (chip_id != bmi270_device->chip_info->chip_id) + if (chip_id != data->chip_info->chip_id) dev_info(dev, "Unexpected chip id 0x%x", chip_id); if (chip_id == bmi260_chip_info.chip_id) - bmi270_device->chip_info = &bmi260_chip_info; + data->chip_info = &bmi260_chip_info; else if (chip_id == bmi270_chip_info.chip_id) - bmi270_device->chip_info = &bmi270_chip_info; + data->chip_info = &bmi270_chip_info; return 0; } -static int bmi270_write_calibration_data(struct bmi270_data *bmi270_device) +static int bmi270_write_calibration_data(struct bmi270_data *data) { int ret; int status = 0; const struct firmware *init_data; - struct device *dev = bmi270_device->dev; - struct regmap *regmap = bmi270_device->regmap; + struct device *dev = data->dev; + struct regmap *regmap = data->regmap; ret = regmap_clear_bits(regmap, BMI270_PWR_CONF_REG, BMI270_PWR_CONF_ADV_PWR_SAVE_MSK); @@ -656,8 +654,7 @@ static int bmi270_write_calibration_data(struct bmi270_data *bmi270_device) return dev_err_probe(dev, ret, "Failed to prepare device to load init data"); - ret = request_firmware(&init_data, - bmi270_device->chip_info->fw_name, dev); + ret = request_firmware(&init_data, data->chip_info->fw_name, dev); if (ret) return dev_err_probe(dev, ret, "Failed to load init data file"); @@ -689,11 +686,11 @@ static int bmi270_write_calibration_data(struct bmi270_data *bmi270_device) return 0; } -static int bmi270_configure_imu(struct bmi270_data *bmi270_device) +static int bmi270_configure_imu(struct bmi270_data *data) { int ret; - struct device *dev = bmi270_device->dev; - struct regmap *regmap = bmi270_device->regmap; + struct device *dev = data->dev; + struct regmap *regmap = data->regmap; ret = regmap_set_bits(regmap, BMI270_PWR_CTRL_REG, BMI270_PWR_CTRL_AUX_EN_MSK | @@ -730,38 +727,38 @@ static int bmi270_configure_imu(struct bmi270_data *bmi270_device) return 0; } -static int bmi270_chip_init(struct bmi270_data *bmi270_device) +static int bmi270_chip_init(struct bmi270_data *data) { int ret; - ret = bmi270_validate_chip_id(bmi270_device); + ret = bmi270_validate_chip_id(data); if (ret) return ret; - ret = bmi270_write_calibration_data(bmi270_device); + ret = bmi270_write_calibration_data(data); if (ret) return ret; - return bmi270_configure_imu(bmi270_device); + return bmi270_configure_imu(data); } int bmi270_core_probe(struct device *dev, struct regmap *regmap, const struct bmi270_chip_info *chip_info) { int ret; - struct bmi270_data *bmi270_device; + struct bmi270_data *data; struct iio_dev *indio_dev; - indio_dev = devm_iio_device_alloc(dev, sizeof(*bmi270_device)); + indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); if (!indio_dev) return -ENOMEM; - bmi270_device = iio_priv(indio_dev); - bmi270_device->dev = dev; - bmi270_device->regmap = regmap; - bmi270_device->chip_info = chip_info; + data = iio_priv(indio_dev); + data->dev = dev; + data->regmap = regmap; + data->chip_info = chip_info; - ret = bmi270_chip_init(bmi270_device); + ret = bmi270_chip_init(data); if (ret) return ret; From patchwork Fri Feb 28 23:03:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gustavo Silva X-Patchwork-Id: 13997226 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (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 05E9D1DF96C; Fri, 28 Feb 2025 23:04:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740783848; cv=none; b=NNdO1otwsHuxA2MgSl6ZWRjbsU1DMBjItduEj6aGhAcwe8ZZbg4yQ6w9Mktb/lBVDLEDQiNRDqPmvgeM3Y0QL8h4sCmHN4iw6b3VJSY0LzHoN6NyOMB3Btn9N0gw4rXhcOAjrTLT38OzERTPznfqQTnsKU8ejtfrunqKdljqtjw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740783848; c=relaxed/simple; bh=rWhoABnjRIWuNQdC70sbA5ayHjGWEK9aSj/rOgtyOGI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gMIkJDKL0AwXv1iiNvzWeKT9xstWhYKg/CJJRAKMmi2uyKJbvIvlte6V9fOkorNfNfMszFzR4gxqHGfydU/pgI9xluNrfSON8evp442eDw0Hl+zcVEM0B0/13u+uIkDqiwuZ5min6RJCZWFiVEKtBYebhF7gWYuUTSM86P55fPs= 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=jxRah8Q+; arc=none smtp.client-ip=209.85.214.182 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="jxRah8Q+" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-22334203781so58881445ad.0; Fri, 28 Feb 2025 15:04:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740783846; x=1741388646; darn=vger.kernel.org; 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=gX+TVLxUjYh9ZXVQaWkExjl0H0sS3BoVnGkX5XmjCUY=; b=jxRah8Q+0CKb37fLL/HS4jTEgf83sK53Ih++0elsRhGRq3O/sQxdU3wQHMqf3324QF q+AzqgPP4aUZ1OuRrRHRy+HvTtDdxl+ADoX0cJGdKK3+Z/7ByX2nBu603xP1r5D4pHGy 7ssG/0tiv6oG5VLWNTGqMVeDBK7AlcTGYpSdfx9ymdrIIg2bz0swGNRSfB+4XJ1Z7MWn vnzNb9uVwDfZcYtiicHQQxlO6MiR/GSK2x5Zz2lxOi26UqBOsEDUfDYrUcWy8BvQn6BS taJhhYuBmNSkZeG+q0OvnMsqKxa4tAQ1ZX132+CWCp4mlrwaReFP2PZvmxBwhsoSu7Tn +afQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740783846; x=1741388646; 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=gX+TVLxUjYh9ZXVQaWkExjl0H0sS3BoVnGkX5XmjCUY=; b=tVVmMe/GLxdVFcEOwLVI1QLlXqLNyzkMMHrbLzUH1TGwocs8y+2ehmz+7Vs5YRUJa5 dOHVZeSEXEfQT4t1qoxO7yRnukbMX8taLGEYKBaJ+wKWMsenLOYhYSxUa+WaLu3fkeJI KLCAWESgeqX8u9GODSJsiRm4KdBTlKpyzRuK+Qb3SGEcpyMtlVuOTv4sXElkBeL27s+9 YYn3+VR9dC3uWIrN6WDKz9fG2vdXdMrP8AZs542jew7M5lmGVTFwcu7GWroBT/IxXuKJ XqvvIP++n7dzeQwHlWeCJD+omxAFPNaJoXRY9RbuQE+qV/FI6UMbtchBsfLo7mvZKD/e bh/Q== X-Forwarded-Encrypted: i=1; AJvYcCXZQlVTAYG6mb9qXVY5huyEp9nlKAvWz7/T+r1RsPKBJ2yxbE2qU3Z2bH+ZnCsLFgoD67aN43uR4uFWS78=@vger.kernel.org X-Gm-Message-State: AOJu0YxEqtqJCQZXne34tHHrPJQ0NizPPPGzngMjBpSgoAbBWqqHa7Hp q1GUyou6PBJsnUlUuguD1L5DmXQwNRIXwOtQv5WgmrPuaBae0r9/ X-Gm-Gg: ASbGncvGLKNc5AGbdvSyJdkkuNZwXhJCHTTc2Zm18JowgIC+JvoPxau4ORe/6RxZG8u wsZbIrEXpVoWTQKvn6VSg2576MqxXBZCnhgjeMDyVVp3In7YmNtdKqNM03+qP0DqeoZIuiNjqdx TIPXxaASP9pTAJfRhxND45QROn2Oba6QhQ02oDdnF87JzpnDx3mmcPN8ULu/pmbPYgqJPmsktNY ZRJJtqRGQ0e6B5DJUgFbxseHwhytMNzYhWWXnQDPDizbSSLr49hShjQCY+a8vkmRRnj7vuUGIwf kMWqDNgEziyDt2EZ4vc0nzKRYg93ge0iYenRhg== X-Google-Smtp-Source: AGHT+IHTxT9CuN87cgCP9q3s6v66hAnqJq5K9QlU4dE7udqDKj7GLv95InfDgqeMjNJClih3Tk7a0w== X-Received: by 2002:a05:6a20:8407:b0:1f0:e6db:b382 with SMTP id adf61e73a8af0-1f2e3875ba6mr15041684637.8.1740783846265; Fri, 28 Feb 2025 15:04:06 -0800 (PST) Received: from [192.168.0.107] ([2804:14d:90a8:854f::10dc]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-aee7ddf230dsm3974875a12.8.2025.02.28.15.04.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Feb 2025 15:04:05 -0800 (PST) From: Gustavo Silva Date: Fri, 28 Feb 2025 20:03:50 -0300 Subject: [PATCH v2 3/3] iio: imu: bmi270: add support for data ready interrupt trigger Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250228-bmi270-irq-v2-3-3f97a4e8f551@gmail.com> References: <20250228-bmi270-irq-v2-0-3f97a4e8f551@gmail.com> In-Reply-To: <20250228-bmi270-irq-v2-0-3f97a4e8f551@gmail.com> To: Alex Lanzano , Jonathan Cameron , Lars-Peter Clausen Cc: linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, Gustavo Silva X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1740783832; l=11585; i=gustavograzs@gmail.com; s=20250111; h=from:subject:message-id; bh=rWhoABnjRIWuNQdC70sbA5ayHjGWEK9aSj/rOgtyOGI=; b=3ak+z9a9AmLSLgaRUGAJnoBpOwYT3RYouZxOeL7SohQCEVdbyx2/0X0hLQ2AXiZfPQ+/q1k7i jp/yoSbmayHALrHqHzlHG+1miQAMX/QDlVxKIHTV076mmrjCje+tGOK X-Developer-Key: i=gustavograzs@gmail.com; a=ed25519; pk=g2TFXpo1jMCOCN+rzVoM9NDFNfSMOgVyY0rlyvk4RTM= The BMI270 sensor provides two interrupt pins that can be used for different interrupt sources, including a data ready signal. Add support for configuring one the pins as a trigger source. The interrupt pin can be configured with various options: active high or low, push-pull or open-drain, and latched or non-latched. Acked-by: Alex Lanzano Signed-off-by: Gustavo Silva --- drivers/iio/imu/bmi270/bmi270_core.c | 234 +++++++++++++++++++++++++++++++++-- 1 file changed, 227 insertions(+), 7 deletions(-) diff --git a/drivers/iio/imu/bmi270/bmi270_core.c b/drivers/iio/imu/bmi270/bmi270_core.c index 16deda12a5c1aba6d366f7fcb134266c490d3a75..a86be5af5ccb1f010f2282ee31c47f284c1bcc86 100644 --- a/drivers/iio/imu/bmi270/bmi270_core.c +++ b/drivers/iio/imu/bmi270/bmi270_core.c @@ -4,11 +4,13 @@ #include #include #include +#include #include #include #include #include +#include #include #include @@ -26,6 +28,9 @@ #define BMI270_ACCEL_X_REG 0x0c #define BMI270_ANG_VEL_X_REG 0x12 +#define BMI270_INT_STATUS_1_REG 0x1d +#define BMI270_INT_STATUS_1_ACC_GYR_DRDY_MSK GENMASK(7, 6) + #define BMI270_INTERNAL_STATUS_REG 0x21 #define BMI270_INTERNAL_STATUS_MSG_MSK GENMASK(3, 0) #define BMI270_INTERNAL_STATUS_MSG_INIT_OK 0x01 @@ -55,6 +60,20 @@ #define BMI270_GYR_CONF_RANGE_REG 0x43 #define BMI270_GYR_CONF_RANGE_MSK GENMASK(2, 0) +#define BMI270_INT1_IO_CTRL_REG 0x53 +#define BMI270_INT2_IO_CTRL_REG 0x54 +#define BMI270_INT_IO_CTRL_LVL_MSK BIT(1) +#define BMI270_INT_IO_CTRL_OD_MSK BIT(2) +#define BMI270_INT_IO_CTRL_OP_MSK BIT(3) +#define BMI270_INT_IO_LVL_OD_OP_MSK GENMASK(3, 1) + +#define BMI270_INT_LATCH_REG 0x55 +#define BMI270_INT_LATCH_REG_MSK BIT(0) + +#define BMI270_INT_MAP_DATA_REG 0x58 +#define BMI270_INT_MAP_DATA_DRDY_INT1_MSK BIT(2) +#define BMI270_INT_MAP_DATA_DRDY_INT2_MSK BIT(6) + #define BMI270_INIT_CTRL_REG 0x59 #define BMI270_INIT_CTRL_LOAD_DONE_MSK BIT(0) @@ -78,10 +97,20 @@ #define BMI260_INIT_DATA_FILE "bmi260-init-data.fw" #define BMI270_INIT_DATA_FILE "bmi270-init-data.fw" +enum bmi270_irq_pin { + BMI270_IRQ_DISABLED, + BMI270_IRQ_INT1, + BMI270_IRQ_INT2, +}; + struct bmi270_data { struct device *dev; struct regmap *regmap; const struct bmi270_chip_info *chip_info; + enum bmi270_irq_pin irq_pin; + struct iio_trigger *trig; + /* Protect device's private data from concurrent access */ + struct mutex mutex; /* * Where IIO_DMA_MINALIGN may be larger than 8 bytes, align to @@ -274,6 +303,8 @@ static int bmi270_set_scale(struct bmi270_data *data, int chan_type, int uscale) return -EINVAL; } + guard(mutex)(&data->mutex); + for (i = 0; i < bmi270_scale_item.num; i++) { if (bmi270_scale_item.tbl[i].uscale != uscale) continue; @@ -291,6 +322,8 @@ static int bmi270_get_scale(struct bmi270_data *data, int chan_type, int *scale, unsigned int val; struct bmi270_scale_item bmi270_scale_item; + guard(mutex)(&data->mutex); + switch (chan_type) { case IIO_ACCEL: ret = regmap_read(data->regmap, BMI270_ACC_CONF_RANGE_REG, &val); @@ -346,6 +379,8 @@ static int bmi270_set_odr(struct bmi270_data *data, int chan_type, int odr, return -EINVAL; } + guard(mutex)(&data->mutex); + for (i = 0; i < bmi270_odr_item.num; i++) { if (bmi270_odr_item.tbl[i].odr != odr || bmi270_odr_item.tbl[i].uodr != uodr) @@ -364,6 +399,8 @@ static int bmi270_get_odr(struct bmi270_data *data, int chan_type, int *odr, int i, val, ret; struct bmi270_odr_item bmi270_odr_item; + guard(mutex)(&data->mutex); + switch (chan_type) { case IIO_ACCEL: ret = regmap_read(data->regmap, BMI270_ACC_CONF_REG, &val); @@ -397,6 +434,60 @@ static int bmi270_get_odr(struct bmi270_data *data, int chan_type, int *odr, return -EINVAL; } +static irqreturn_t bmi270_irq_thread_handler(int irq, void *private) +{ + struct iio_dev *indio_dev = private; + struct bmi270_data *data = iio_priv(indio_dev); + unsigned int status; + int ret; + + scoped_guard(mutex, &data->mutex) { + ret = regmap_read(data->regmap, BMI270_INT_STATUS_1_REG, + &status); + if (ret) + return IRQ_NONE; + } + + if (FIELD_GET(BMI270_INT_STATUS_1_ACC_GYR_DRDY_MSK, status)) + iio_trigger_poll_nested(data->trig); + + return IRQ_HANDLED; +} + +static int bmi270_data_rdy_trigger_set_state(struct iio_trigger *trig, + bool state) +{ + struct bmi270_data *data = iio_trigger_get_drvdata(trig); + unsigned int field_value = 0; + unsigned int mask; + + guard(mutex)(&data->mutex); + + switch (data->irq_pin) { + case BMI270_IRQ_INT1: + mask = BMI270_INT_MAP_DATA_DRDY_INT1_MSK; + set_mask_bits(&field_value, BMI270_INT_MAP_DATA_DRDY_INT1_MSK, + FIELD_PREP(BMI270_INT_MAP_DATA_DRDY_INT1_MSK, + state)); + break; + case BMI270_IRQ_INT2: + mask = BMI270_INT_MAP_DATA_DRDY_INT2_MSK; + set_mask_bits(&field_value, BMI270_INT_MAP_DATA_DRDY_INT2_MSK, + FIELD_PREP(BMI270_INT_MAP_DATA_DRDY_INT2_MSK, + state)); + break; + default: + return -EINVAL; + } + + return regmap_update_bits(data->regmap, BMI270_INT_MAP_DATA_REG, mask, + field_value); +} + +static const struct iio_trigger_ops bmi270_trigger_ops = { + .set_trigger_state = &bmi270_data_rdy_trigger_set_state, +}; + static irqreturn_t bmi270_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; @@ -404,6 +495,8 @@ static irqreturn_t bmi270_trigger_handler(int irq, void *p) struct bmi270_data *data = iio_priv(indio_dev); int ret; + guard(mutex)(&data->mutex); + ret = regmap_bulk_read(data->regmap, BMI270_ACCEL_X_REG, &data->buffer.channels, sizeof(data->buffer.channels)); @@ -439,13 +532,15 @@ static int bmi270_get_data(struct bmi270_data *data, int chan_type, int axis, return -EINVAL; } + guard(mutex)(&data->mutex); + ret = regmap_bulk_read(data->regmap, reg, &sample, sizeof(sample)); if (ret) return ret; *val = sign_extend32(le16_to_cpu(sample), 15); - return 0; + return IIO_VAL_INT; } static int bmi270_read_raw(struct iio_dev *indio_dev, @@ -457,11 +552,11 @@ static int bmi270_read_raw(struct iio_dev *indio_dev, switch (mask) { case IIO_CHAN_INFO_RAW: + if (!iio_device_claim_direct(indio_dev)) + return -EBUSY; ret = bmi270_get_data(data, chan->type, chan->channel2, val); - if (ret) - return ret; - - return IIO_VAL_INT; + iio_device_release_direct(indio_dev); + return ret; case IIO_CHAN_INFO_SCALE: ret = bmi270_get_scale(data, chan->type, val, val2); return ret ? ret : IIO_VAL_INT_PLUS_MICRO; @@ -486,12 +581,21 @@ static int bmi270_write_raw(struct iio_dev *indio_dev, int val, int val2, long mask) { struct bmi270_data *data = iio_priv(indio_dev); + int ret; switch (mask) { case IIO_CHAN_INFO_SCALE: - return bmi270_set_scale(data, chan->type, val2); + if (!iio_device_claim_direct(indio_dev)) + return -EBUSY; + ret = bmi270_set_scale(data, chan->type, val2); + iio_device_release_direct(indio_dev); + return ret; case IIO_CHAN_INFO_SAMP_FREQ: - return bmi270_set_odr(data, chan->type, val, val2); + if (!iio_device_claim_direct(indio_dev)) + return -EBUSY; + ret = bmi270_set_odr(data, chan->type, val, val2); + iio_device_release_direct(indio_dev); + return ret; default: return -EINVAL; } @@ -597,6 +701,116 @@ static const struct iio_chan_spec bmi270_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(BMI270_SCAN_TIMESTAMP), }; +static int bmi270_int_pin_config(struct bmi270_data *data, + enum bmi270_irq_pin irq_pin, + bool active_high, bool open_drain, bool latch) +{ + unsigned int reg, field_value; + int ret; + + ret = regmap_update_bits(data->regmap, BMI270_INT_LATCH_REG, + BMI270_INT_LATCH_REG_MSK, + FIELD_PREP(BMI270_INT_LATCH_REG_MSK, latch)); + if (ret) + return ret; + + switch (irq_pin) { + case BMI270_IRQ_INT1: + reg = BMI270_INT1_IO_CTRL_REG; + break; + case BMI270_IRQ_INT2: + reg = BMI270_INT2_IO_CTRL_REG; + break; + default: + return -EINVAL; + } + + field_value = FIELD_PREP(BMI270_INT_IO_CTRL_LVL_MSK, active_high) | + FIELD_PREP(BMI270_INT_IO_CTRL_OD_MSK, open_drain) | + FIELD_PREP(BMI270_INT_IO_CTRL_OP_MSK, 1); + return regmap_update_bits(data->regmap, reg, + BMI270_INT_IO_LVL_OD_OP_MSK, field_value); +} + +static int bmi270_trigger_probe(struct bmi270_data *data, + struct iio_dev *indio_dev) +{ + bool open_drain, active_high, latch; + struct fwnode_handle *fwnode; + enum bmi270_irq_pin irq_pin; + int ret, irq, irq_type; + + fwnode = dev_fwnode(data->dev); + if (!fwnode) + return -ENODEV; + + irq = fwnode_irq_get_byname(fwnode, "INT1"); + if (irq > 0) { + irq_pin = BMI270_IRQ_INT1; + } else { + irq = fwnode_irq_get_byname(fwnode, "INT2"); + if (irq < 0) + return 0; + + irq_pin = BMI270_IRQ_INT2; + } + + irq_type = irq_get_trigger_type(irq); + switch (irq_type) { + case IRQF_TRIGGER_RISING: + latch = false; + active_high = true; + break; + case IRQF_TRIGGER_HIGH: + latch = true; + active_high = true; + break; + case IRQF_TRIGGER_FALLING: + latch = false; + active_high = false; + break; + case IRQF_TRIGGER_LOW: + latch = true; + active_high = false; + break; + default: + return dev_err_probe(data->dev, -EINVAL, + "Invalid interrupt type 0x%x specified\n", + irq_type); + } + + open_drain = fwnode_property_read_bool(fwnode, "drive-open-drain"); + + ret = bmi270_int_pin_config(data, irq_pin, active_high, open_drain, + latch); + if (ret) + return dev_err_probe(data->dev, ret, + "Failed to configure irq line\n"); + + data->trig = devm_iio_trigger_alloc(data->dev, "%s-trig-%d", + indio_dev->name, irq_pin); + if (!data->trig) + return -ENOMEM; + + data->trig->ops = &bmi270_trigger_ops; + iio_trigger_set_drvdata(data->trig, data); + + ret = devm_request_threaded_irq(data->dev, irq, NULL, + bmi270_irq_thread_handler, + IRQF_ONESHOT, "bmi270-int", indio_dev); + if (ret) + return dev_err_probe(data->dev, ret, "Failed to request IRQ\n"); + + ret = devm_iio_trigger_register(data->dev, data->trig); + if (ret) + return dev_err_probe(data->dev, ret, + "Trigger registration failed\n"); + + data->irq_pin = irq_pin; + + return 0; +} + static int bmi270_validate_chip_id(struct bmi270_data *data) { int chip_id; @@ -757,6 +971,8 @@ int bmi270_core_probe(struct device *dev, struct regmap *regmap, data->dev = dev; data->regmap = regmap; data->chip_info = chip_info; + data->irq_pin = BMI270_IRQ_DISABLED; + mutex_init(&data->mutex); ret = bmi270_chip_init(data); if (ret) @@ -769,6 +985,10 @@ int bmi270_core_probe(struct device *dev, struct regmap *regmap, indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->info = &bmi270_info; + ret = bmi270_trigger_probe(data, indio_dev); + if (ret) + return ret; + ret = devm_iio_triggered_buffer_setup(dev, indio_dev, iio_pollfunc_store_time, bmi270_trigger_handler, NULL);