From nobody Thu Dec 26 09:53:06 2024 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (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 C32841474B8; Fri, 29 Nov 2024 15:36:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894581; cv=none; b=nui4kH6ipOyNvuXQFNMFMTFaxC4Y+uPB6bF8cjaQn2MymtNepVhwoqL1ySutkiZdAqJgPxOSCgLGEMxsbeLg+mo/jTTWYYEnEmPIg4H5cnLcvKNtOU58EUAow8Nr6sWR8aWIs5rra9ZP8aM31BanrEggIlwjTIyU2JlqaXkXWAw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894581; c=relaxed/simple; bh=YyP53DSamv5FMtyW/uudWwiK/S3uvFgF0JV1t1jlmLM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=MmxB2q1xbLctRGnJf0JOLx8bffvtg9X44kRKUr/H55CJc2Q2lwlJ7vhb9fgu+Pm3wc0PmDd56OCz1wP30nb5yfCUIKOULejk+ZgJS4qW4PYimXJ4s9E/c27ZkBItzKAcKQfWy/o8+FQ2Qxki9VcngdPOS0jmOoe7T+/8TQm9sAo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=KLlJUTeV; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="KLlJUTeV" Received: from pps.filterd (m0167088.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4ATBH9vE014508; Fri, 29 Nov 2024 10:36:15 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=3Ojxf 0kdY9HlGNVc+coKjhLF87B+fe/UDdpRN538xYM=; b=KLlJUTeVsChwqmxCR9l8u /VX/RxT+UPrb5qkuzAh0NHPpcuPFJK2uELGDC4uCimpuSi4mTx53uAffGxuMk9lC aId3iZKKHX9PnL9utBJwP2FV38rbKIwe+aisJLtoLZ0zf4FEeiWkOgR4DY9glKre 05A+2+f2YlTEqMLPfdgYWPzFJFGdOqKTijyYP+G8erZIQJopQIzTbrUzxWKuPaAS yk6qXRXYf5GupOxknJoY9eSlbo8CvWHsro1dk9O9UlN3PhnWp10MKr98Gj2Hd6wQ G5KO/5oM4NJZEKJovWLpayYUiJwKM5qIytb4zcVQvSxG1btjipAHl2RFgRxP/1oa w== Received: from nwd2mta3.analog.com ([137.71.173.56]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 436716tmxe-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 29 Nov 2024 10:36:15 -0500 (EST) Received: from ASHBMBX9.ad.analog.com (ASHBMBX9.ad.analog.com [10.64.17.10]) by nwd2mta3.analog.com (8.14.7/8.14.7) with ESMTP id 4ATFaE49008853 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 29 Nov 2024 10:36:14 -0500 Received: from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBMBX9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.14; Fri, 29 Nov 2024 10:36:13 -0500 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server id 15.2.986.14 via Frontend Transport; Fri, 29 Nov 2024 10:36:13 -0500 Received: from amiclaus-VirtualBox.ad.analog.com (AMICLAUS-L02.ad.analog.com [10.48.65.161]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 4ATFa0m4001167; Fri, 29 Nov 2024 10:36:06 -0500 From: Antoniu Miclaus To: , , , , , , , CC: Antoniu Miclaus Subject: [PATCH v7 1/8] iio: backend: add API for interface get Date: Fri, 29 Nov 2024 17:35:39 +0200 Message-ID: <20241129153546.63584-2-antoniu.miclaus@analog.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241129153546.63584-1-antoniu.miclaus@analog.com> References: <20241129153546.63584-1-antoniu.miclaus@analog.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: rRO7aMBugoXlFpI3ZwdXrvgQMgkElKyU X-Proofpoint-ORIG-GUID: rRO7aMBugoXlFpI3ZwdXrvgQMgkElKyU X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 mlxlogscore=999 adultscore=0 phishscore=0 mlxscore=0 lowpriorityscore=0 bulkscore=0 spamscore=0 impostorscore=0 suspectscore=0 malwarescore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2411120000 definitions=main-2411290127 Content-Type: text/plain; charset="utf-8" Add backend support for obtaining the interface type used. Reviewed-by: David Lechner Signed-off-by: Antoniu Miclaus --- no changes in v7. drivers/iio/industrialio-backend.c | 24 ++++++++++++++++++++++++ include/linux/iio/backend.h | 11 +++++++++++ 2 files changed, 35 insertions(+) diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio-= backend.c index 20b3b5212da7..c792cd1e24e8 100644 --- a/drivers/iio/industrialio-backend.c +++ b/drivers/iio/industrialio-backend.c @@ -636,6 +636,30 @@ ssize_t iio_backend_ext_info_set(struct iio_dev *indio= _dev, uintptr_t private, } EXPORT_SYMBOL_NS_GPL(iio_backend_ext_info_set, IIO_BACKEND); =20 +/** + * iio_backend_interface_type_get - get the interface type used. + * @back: Backend device + * @type: Interface type + * + * RETURNS: + * 0 on success, negative error number on failure. + */ +int iio_backend_interface_type_get(struct iio_backend *back, + enum iio_backend_interface_type *type) +{ + int ret; + + ret =3D iio_backend_op_call(back, interface_type_get, type); + if (ret) + return ret; + + if (*type >=3D IIO_BACKEND_INTERFACE_MAX) + return -EINVAL; + + return 0; +} +EXPORT_SYMBOL_NS_GPL(iio_backend_interface_type_get, IIO_BACKEND); + /** * iio_backend_extend_chan_spec - Extend an IIO channel * @back: Backend device diff --git a/include/linux/iio/backend.h b/include/linux/iio/backend.h index 37d56914d485..e5ea90f1c3e0 100644 --- a/include/linux/iio/backend.h +++ b/include/linux/iio/backend.h @@ -68,6 +68,12 @@ enum iio_backend_sample_trigger { IIO_BACKEND_SAMPLE_TRIGGER_MAX }; =20 +enum iio_backend_interface_type { + IIO_BACKEND_INTERFACE_SERIAL_LVDS, + IIO_BACKEND_INTERFACE_SERIAL_CMOS, + IIO_BACKEND_INTERFACE_MAX +}; + /** * struct iio_backend_ops - operations structure for an iio_backend * @enable: Enable backend. @@ -86,6 +92,7 @@ enum iio_backend_sample_trigger { * @extend_chan_spec: Extend an IIO channel. * @ext_info_set: Extended info setter. * @ext_info_get: Extended info getter. + * @interface_type_get: Interface type. * @read_raw: Read a channel attribute from a backend device * @debugfs_print_chan_status: Print channel status into a buffer. * @debugfs_reg_access: Read or write register value of backend. @@ -121,6 +128,8 @@ struct iio_backend_ops { const char *buf, size_t len); int (*ext_info_get)(struct iio_backend *back, uintptr_t private, const struct iio_chan_spec *chan, char *buf); + int (*interface_type_get)(struct iio_backend *back, + enum iio_backend_interface_type *type); int (*read_raw)(struct iio_backend *back, struct iio_chan_spec const *chan, int *val, int *val2, long mask); @@ -169,6 +178,8 @@ ssize_t iio_backend_ext_info_set(struct iio_dev *indio_= dev, uintptr_t private, const char *buf, size_t len); ssize_t iio_backend_ext_info_get(struct iio_dev *indio_dev, uintptr_t priv= ate, const struct iio_chan_spec *chan, char *buf); +int iio_backend_interface_type_get(struct iio_backend *back, + enum iio_backend_interface_type *type); int iio_backend_read_raw(struct iio_backend *back, struct iio_chan_spec const *chan, int *val, int *val2, long mask); --=20 2.47.1 From nobody Thu Dec 26 09:53:06 2024 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (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 AC138198E61; Fri, 29 Nov 2024 15:36:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894584; cv=none; b=PTMo2VXBzArrABHLJjXLDDFRtXQ0RV68/joML+T01RGjYORS0ruLb3UJptaM6xpnxnjGooPpiXktMaP7/7qi2fYCoH4yGUg/3W7NYJlsPhUEtrrBSa8h+zFTQnKVA61MZJJjxgg7pis0OqwYWIeATUfbYHV/KFf8gNh8fXt0/uc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894584; c=relaxed/simple; bh=lLc7Hnt9SwnkC3xN+fT0lrUFeReEslBEKLwt4pJsh0o=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=RkyHD3KO5HexjQSIQndujpnnJN6CCe15CIdmhlZ29X/cKBff7uyiUlKJoIrwX343bKFYr4ZQID8KvfBmygE1EX6psMqA8gU7r7Il5p2rgMhE4OsTaxljEaCF8uMAfcoeawVzYX55PgEdA5819vt3rzWb695zGKDyDTdgk1Bx4i4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=lCOA5fIG; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="lCOA5fIG" Received: from pps.filterd (m0167089.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4ATBkQ10018141; Fri, 29 Nov 2024 10:36:17 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=h3vXU vq0bB2n5Xd8OXqvxFyAQmffUQU+8hsJ2A2JDiM=; b=lCOA5fIG72d8Go6ra1yc/ k1U7Fp+Tv8we1PNBkazLS7FBjpIwAx5o6l1rYw25UWerYjI/vUBeZe2jLHbxhOWW 55jGheapmLvtcSJm8rDoQHx1t8D2VVyYtu2Uj94cLpBVGuis/0CUnTAye8u+zKmx YeU/PEAsRmzU96NTgDfSy0gJp3fL0qZR+gFZDp/Nzkyn9JkyZXQ2LQayF+nD+YVS 93h8e5P3jPF25ce0nUFujeEtZxfkt0sIRe191Se/qNbwCqyK+42MSEOC4FTgTiMm NfVJl8gHwATkLXLSKdezyiQdFMp0KZAYNYpbpcxv7/OhzFhiJHP5cX3yv999Js8x Q== Received: from nwd2mta3.analog.com ([137.71.173.56]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 436715tj52-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 29 Nov 2024 10:36:16 -0500 (EST) Received: from ASHBMBX9.ad.analog.com (ASHBMBX9.ad.analog.com [10.64.17.10]) by nwd2mta3.analog.com (8.14.7/8.14.7) with ESMTP id 4ATFaFWV008872 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 29 Nov 2024 10:36:15 -0500 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) by ASHBMBX9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.14; Fri, 29 Nov 2024 10:36:15 -0500 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.986.14 via Frontend Transport; Fri, 29 Nov 2024 10:36:15 -0500 Received: from amiclaus-VirtualBox.ad.analog.com (AMICLAUS-L02.ad.analog.com [10.48.65.161]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 4ATFa0m5001167; Fri, 29 Nov 2024 10:36:07 -0500 From: Antoniu Miclaus To: , , , , , , , CC: Antoniu Miclaus Subject: [PATCH v7 2/8] iio: backend: add support for data size set Date: Fri, 29 Nov 2024 17:35:40 +0200 Message-ID: <20241129153546.63584-3-antoniu.miclaus@analog.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241129153546.63584-1-antoniu.miclaus@analog.com> References: <20241129153546.63584-1-antoniu.miclaus@analog.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-ORIG-GUID: EyKIuDWwheHleoeh0hKJElOKlLFyb8Vw X-Proofpoint-GUID: EyKIuDWwheHleoeh0hKJElOKlLFyb8Vw X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 mlxlogscore=999 suspectscore=0 mlxscore=0 bulkscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 clxscore=1015 adultscore=0 priorityscore=1501 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2411120000 definitions=main-2411290127 Content-Type: text/plain; charset="utf-8" Add backend support for setting the data size used. This setting can be adjusted within the IP cores interfacing devices. Signed-off-by: Antoniu Miclaus --- no changes in v7. drivers/iio/industrialio-backend.c | 21 +++++++++++++++++++++ include/linux/iio/backend.h | 3 +++ 2 files changed, 24 insertions(+) diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio-= backend.c index c792cd1e24e8..ea184fc2c838 100644 --- a/drivers/iio/industrialio-backend.c +++ b/drivers/iio/industrialio-backend.c @@ -660,6 +660,27 @@ int iio_backend_interface_type_get(struct iio_backend = *back, } EXPORT_SYMBOL_NS_GPL(iio_backend_interface_type_get, IIO_BACKEND); =20 +/** + * iio_backend_data_size_set - set the data width/size in the data bus. + * @back: Backend device + * @size: Size in bits + * + * Some frontend devices can dynamically control the word/data size on the + * interface/data bus. Hence, the backend device needs to be aware of it so + * data can be correctly transferred. + * + * Return: + * 0 on success, negative error number on failure. + */ +int iio_backend_data_size_set(struct iio_backend *back, unsigned int size) +{ + if (!size) + return -EINVAL; + + return iio_backend_op_call(back, data_size_set, size); +} +EXPORT_SYMBOL_NS_GPL(iio_backend_data_size_set, IIO_BACKEND); + /** * iio_backend_extend_chan_spec - Extend an IIO channel * @back: Backend device diff --git a/include/linux/iio/backend.h b/include/linux/iio/backend.h index e5ea90f1c3e0..59b6651b7eaf 100644 --- a/include/linux/iio/backend.h +++ b/include/linux/iio/backend.h @@ -93,6 +93,7 @@ enum iio_backend_interface_type { * @ext_info_set: Extended info setter. * @ext_info_get: Extended info getter. * @interface_type_get: Interface type. + * @data_size_set: Data size. * @read_raw: Read a channel attribute from a backend device * @debugfs_print_chan_status: Print channel status into a buffer. * @debugfs_reg_access: Read or write register value of backend. @@ -130,6 +131,7 @@ struct iio_backend_ops { const struct iio_chan_spec *chan, char *buf); int (*interface_type_get)(struct iio_backend *back, enum iio_backend_interface_type *type); + int (*data_size_set)(struct iio_backend *back, unsigned int size); int (*read_raw)(struct iio_backend *back, struct iio_chan_spec const *chan, int *val, int *val2, long mask); @@ -180,6 +182,7 @@ ssize_t iio_backend_ext_info_get(struct iio_dev *indio_= dev, uintptr_t private, const struct iio_chan_spec *chan, char *buf); int iio_backend_interface_type_get(struct iio_backend *back, enum iio_backend_interface_type *type); +int iio_backend_data_size_set(struct iio_backend *back, unsigned int size); int iio_backend_read_raw(struct iio_backend *back, struct iio_chan_spec const *chan, int *val, int *val2, long mask); --=20 2.47.1 From nobody Thu Dec 26 09:53:06 2024 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (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 D677E14A098; Fri, 29 Nov 2024 15:36:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894582; cv=none; b=CeSNGrQXHQtOuvdrXzr0TzrNImyviUIjP/U/2s8t0Swt/rgf2+Y0HdhijcbBkEYKBK8zF3gQ+mndra7ULtfJBXvvoRXno8JPGCt4u7ahdHHkuzzDrTABseZosY+Pt0Ye0X8LlSqhTDS0RJHFKChqhp5CNoayFGWSO2rrorXJo70= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894582; c=relaxed/simple; bh=ERillEXi32TmO291ueMdNu9zSZGnkoxQ11og5QEiJMs=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=OyULiTDyf3UHDVd1JHIIH01HI2Ol60UB/N4aZDqTi6phDTQCZ/VUB6CiFQ8CpphrNX52jGrRHDVLM90icX+sssDCoJnOIIACjYisJMLulCf0gZp3qxXyfP9+KN6Jjwr8klFr43lujOgyWhaIRrVd4uhUFNhFhPlRptzOqfdW7Cg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=udr1oBug; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="udr1oBug" Received: from pps.filterd (m0167089.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4ATAbONY018135; Fri, 29 Nov 2024 10:36:16 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=b48RC y6VWcErH7vH95mW8mlryW/fGUCUB270Kp4aV38=; b=udr1oBugd2JI7CY2+XSVl 0fn5AgZVSyu2FitbtkCaAT516xhLZjuLowipFaQiZfO92tg6SLzFS9vLMvDeed1t PtYsbJZo/p1MHmoecHanniO0SXCHISdXQgwKJJhGe5lp+RYLqipL+lki75vriqqt jzpO0WmoMMGPUSWe7AZQVcBTZoaIE/LFTysP/cwcgKrmXmn7d4i48K0XqPhrHxoW ZoWIRNPb6H1YacsFvTQuZKQ65PO9r+cOmsYo/utVFkkmqxRCq9iwUpRpaSn4ua3/ Iyue9S2qg3J+iJKKUs1j4usoAsNqXvObNXiw3fX/hY5ghtUHhpgAGs1CP2uqbjEa Q== Received: from nwd2mta3.analog.com ([137.71.173.56]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 436715tj51-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 29 Nov 2024 10:36:16 -0500 (EST) Received: from ASHBMBX9.ad.analog.com (ASHBMBX9.ad.analog.com [10.64.17.10]) by nwd2mta3.analog.com (8.14.7/8.14.7) with ESMTP id 4ATFaFoD008863 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 29 Nov 2024 10:36:15 -0500 Received: from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBMBX9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.14; Fri, 29 Nov 2024 10:36:15 -0500 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server id 15.2.986.14 via Frontend Transport; Fri, 29 Nov 2024 10:36:15 -0500 Received: from amiclaus-VirtualBox.ad.analog.com (AMICLAUS-L02.ad.analog.com [10.48.65.161]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 4ATFa0m6001167; Fri, 29 Nov 2024 10:36:09 -0500 From: Antoniu Miclaus To: , , , , , , , CC: Antoniu Miclaus Subject: [PATCH v7 3/8] iio: backend: add API for oversampling Date: Fri, 29 Nov 2024 17:35:41 +0200 Message-ID: <20241129153546.63584-4-antoniu.miclaus@analog.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241129153546.63584-1-antoniu.miclaus@analog.com> References: <20241129153546.63584-1-antoniu.miclaus@analog.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-ORIG-GUID: Zg_4RRgZdAd8P1OKyM1auGfxakJUahoc X-Proofpoint-GUID: Zg_4RRgZdAd8P1OKyM1auGfxakJUahoc X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 mlxlogscore=999 suspectscore=0 mlxscore=0 bulkscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 clxscore=1015 adultscore=0 priorityscore=1501 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2411120000 definitions=main-2411290127 Content-Type: text/plain; charset="utf-8" Add backend support for enabling/disabling oversampling. Signed-off-by: Antoniu Miclaus --- changes in v7: - implement 2 callbacks iio_backend_oversampling_enable() iio_backend_oversampling_disable() drivers/iio/industrialio-backend.c | 26 ++++++++++++++++++++++++++ include/linux/iio/backend.h | 6 ++++++ 2 files changed, 32 insertions(+) diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio-= backend.c index ea184fc2c838..86237c1e7ab4 100644 --- a/drivers/iio/industrialio-backend.c +++ b/drivers/iio/industrialio-backend.c @@ -681,6 +681,32 @@ int iio_backend_data_size_set(struct iio_backend *back= , unsigned int size) } EXPORT_SYMBOL_NS_GPL(iio_backend_data_size_set, IIO_BACKEND); =20 +/** + * iio_backend_oversampling_enable - oversampling enable + * @back: Backend device + * + * Return: + * 0 on success, negative error number on failure. + */ +int iio_backend_oversampling_enable(struct iio_backend *back) +{ + return iio_backend_op_call(back, oversampling_enable); +} +EXPORT_SYMBOL_NS_GPL(iio_backend_oversampling_enable, IIO_BACKEND); + +/** + * iio_backend_oversampling_disable - oversampling disable + * @back: Backend device + * + * Return: + * 0 on success, negative error number on failure. + */ +int iio_backend_oversampling_disable(struct iio_backend *back) +{ + return iio_backend_op_call(back, oversampling_disable); +} +EXPORT_SYMBOL_NS_GPL(iio_backend_oversampling_disable, IIO_BACKEND); + /** * iio_backend_extend_chan_spec - Extend an IIO channel * @back: Backend device diff --git a/include/linux/iio/backend.h b/include/linux/iio/backend.h index 59b6651b7eaf..789fa9b586ec 100644 --- a/include/linux/iio/backend.h +++ b/include/linux/iio/backend.h @@ -94,6 +94,8 @@ enum iio_backend_interface_type { * @ext_info_get: Extended info getter. * @interface_type_get: Interface type. * @data_size_set: Data size. + * @oversampling_enable: Oversampling enable. + * @oversampling_disable: Oversampling disable. * @read_raw: Read a channel attribute from a backend device * @debugfs_print_chan_status: Print channel status into a buffer. * @debugfs_reg_access: Read or write register value of backend. @@ -132,6 +134,8 @@ struct iio_backend_ops { int (*interface_type_get)(struct iio_backend *back, enum iio_backend_interface_type *type); int (*data_size_set)(struct iio_backend *back, unsigned int size); + int (*oversampling_enable)(struct iio_backend *back); + int (*oversampling_disable)(struct iio_backend *back); int (*read_raw)(struct iio_backend *back, struct iio_chan_spec const *chan, int *val, int *val2, long mask); @@ -183,6 +187,8 @@ ssize_t iio_backend_ext_info_get(struct iio_dev *indio_= dev, uintptr_t private, int iio_backend_interface_type_get(struct iio_backend *back, enum iio_backend_interface_type *type); int iio_backend_data_size_set(struct iio_backend *back, unsigned int size); +int iio_backend_oversampling_enable(struct iio_backend *back); +int iio_backend_oversampling_disable(struct iio_backend *back); int iio_backend_read_raw(struct iio_backend *back, struct iio_chan_spec const *chan, int *val, int *val2, long mask); --=20 2.47.1 From nobody Thu Dec 26 09:53:06 2024 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (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 D67D114A0A3; Fri, 29 Nov 2024 15:36:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894582; cv=none; b=BbyjCIMkEYvJ/d1ortdPVr0mZ3Q2oSxqVn4V2E5HOUj/r43ZNsabHzF/M5k8nQ8R8hJHrXshCaPf3UThOvWRqE1yxUxpMSxenC0mZ1KzEP70Niy8Mu5DcyMXM8+2bshZnkujEvs2d+8j6I4bE6plOKoKB7CFGXTOekS7y0rBp2M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894582; c=relaxed/simple; bh=imrKFRzDsVisRtxwroN1tNwS+9DUo5RZDXiV+N4UiB4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=a6+JJndkap6D8ojvrTCqIqLA0nWNRTjEf1VR0zi26IgHbC1LilxKoelTYtWTMvhbuUyD23dl+nCTzRKKL1yVRN8/89PukeWf+NOD/zil0ckZfCRtCwqpyDpO7qKnTw3LBEteTnmrHJYquP4N40J90AvqF1mJMav2TMPKpkozZ1A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=ITBr13I5; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="ITBr13I5" Received: from pps.filterd (m0167088.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4ATF3Xd9014486; Fri, 29 Nov 2024 10:36:17 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=CnabR Ezf+gMwOuMQ6hk2crB6emfmLcK/HqHZpdNZQlw=; b=ITBr13I5PZjFy+nvxRIuq Wk5el73mrlOrgnZscOlT2vsqNzkGOn0+9vXD3V4wPTJ2pqplbsB9OJ/cSTmXM++C gSBemuNqRRT0+5Yc9CR4VV5Pf3jmOJT1a8lP/ttbFMcAKV4QFOGvapQNpcBZ98Ln O9A4/alL6/Y5qqq/jGd9taVqXvq4iDv6LWHCjKX8lTBlicBnf2zSe5APL2rQJmJn pQHI4c31eLVsNfS57QlKM+6bO2bd0vR8EVBhLnnskkdcALb8uDFKgWA7WYXQbqoF c2RG6IjtrdWMwQHqHnq2PsZ4K34qR1dPGccnrF2rpt4qtUEAV01OuqZVanaybM4s Q== Received: from nwd2mta3.analog.com ([137.71.173.56]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 436716tmxn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 29 Nov 2024 10:36:17 -0500 (EST) Received: from ASHBMBX9.ad.analog.com (ASHBMBX9.ad.analog.com [10.64.17.10]) by nwd2mta3.analog.com (8.14.7/8.14.7) with ESMTP id 4ATFaG88008875 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 29 Nov 2024 10:36:16 -0500 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) by ASHBMBX9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.14; Fri, 29 Nov 2024 10:36:16 -0500 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.986.14 via Frontend Transport; Fri, 29 Nov 2024 10:36:16 -0500 Received: from amiclaus-VirtualBox.ad.analog.com (AMICLAUS-L02.ad.analog.com [10.48.65.161]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 4ATFa0m7001167; Fri, 29 Nov 2024 10:36:10 -0500 From: Antoniu Miclaus To: , , , , , , , CC: Antoniu Miclaus Subject: [PATCH v7 4/8] iio: adc: adi-axi-adc: add interface type Date: Fri, 29 Nov 2024 17:35:42 +0200 Message-ID: <20241129153546.63584-5-antoniu.miclaus@analog.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241129153546.63584-1-antoniu.miclaus@analog.com> References: <20241129153546.63584-1-antoniu.miclaus@analog.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: sJooquBl2L05V9jW9gtJK3BSBlRHkO10 X-Proofpoint-ORIG-GUID: sJooquBl2L05V9jW9gtJK3BSBlRHkO10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 mlxlogscore=999 adultscore=0 phishscore=0 mlxscore=0 lowpriorityscore=0 bulkscore=0 spamscore=0 impostorscore=0 suspectscore=0 malwarescore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2411120000 definitions=main-2411290127 Content-Type: text/plain; charset="utf-8" Add support for getting the interface (CMOS or LVDS) used by the AXI ADC IP. Reviewed-by: David Lechner Signed-off-by: Antoniu Miclaus --- no changes in v7. drivers/iio/adc/adi-axi-adc.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c index 5c8c87eb36d1..f6475bc93796 100644 --- a/drivers/iio/adc/adi-axi-adc.c +++ b/drivers/iio/adc/adi-axi-adc.c @@ -39,6 +39,9 @@ #define ADI_AXI_REG_RSTN_MMCM_RSTN BIT(1) #define ADI_AXI_REG_RSTN_RSTN BIT(0) =20 +#define ADI_AXI_ADC_REG_CONFIG 0x000c +#define ADI_AXI_ADC_REG_CONFIG_CMOS_OR_LVDS_N BIT(7) + #define ADI_AXI_ADC_REG_CTRL 0x0044 #define ADI_AXI_ADC_CTRL_DDR_EDGESEL_MASK BIT(1) =20 @@ -290,6 +293,25 @@ static int axi_adc_chan_disable(struct iio_backend *ba= ck, unsigned int chan) ADI_AXI_REG_CHAN_CTRL_ENABLE); } =20 +static int axi_adc_interface_type_get(struct iio_backend *back, + enum iio_backend_interface_type *type) +{ + struct adi_axi_adc_state *st =3D iio_backend_get_priv(back); + unsigned int val; + int ret; + + ret =3D regmap_read(st->regmap, ADI_AXI_ADC_REG_CONFIG, &val); + if (ret) + return ret; + + if (val & ADI_AXI_ADC_REG_CONFIG_CMOS_OR_LVDS_N) + *type =3D IIO_BACKEND_INTERFACE_SERIAL_CMOS; + else + *type =3D IIO_BACKEND_INTERFACE_SERIAL_LVDS; + + return 0; +} + static struct iio_buffer *axi_adc_request_buffer(struct iio_backend *back, struct iio_dev *indio_dev) { @@ -337,6 +359,7 @@ static const struct iio_backend_ops adi_axi_adc_ops =3D= { .iodelay_set =3D axi_adc_iodelays_set, .test_pattern_set =3D axi_adc_test_pattern_set, .chan_status =3D axi_adc_chan_status, + .interface_type_get =3D axi_adc_interface_type_get, .debugfs_reg_access =3D iio_backend_debugfs_ptr(axi_adc_reg_access), .debugfs_print_chan_status =3D iio_backend_debugfs_ptr(axi_adc_debugfs_pr= int_chan_status), }; --=20 2.47.1 From nobody Thu Dec 26 09:53:06 2024 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (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 84AAE1990C1; Fri, 29 Nov 2024 15:36:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894586; cv=none; b=A1YO792AV3CCBkAZTsp1ZGtnht+WuHfe5xr2rKw3vViTcc7yF/AeTiozdiqs7Kib+63wT9OJLK/5P45p61AzfwKdx8FWQjSYfBIj6jAM50Fe78DX0/Upuc5PqiUtMee+frzKRkUtykxLQu38l3j1Zg9kkuX71vkrlHpAx6nDvtE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894586; c=relaxed/simple; bh=tCHNqR8foKicX7338XNQYaB0aLHK1t05i/R+a07ktpk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=GvghLd7KTCbkjCgvOiy1ccDt0guQ8xS4+wH5ZMmfw3Y3sZGbpS6yJwdcNMI1hk7ErPxZaZqTxBfdrNVHis819c3MU9WL+lD6U6vpWPLe0ZvrR52I/+R+nuKIRYX1hKglN1nuYNuygJy4KT1JSL2HAnlqakIDIlCHi4NgjmHAILk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=aa1tpTpC; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="aa1tpTpC" Received: from pps.filterd (m0167088.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4ATAn98T014488; Fri, 29 Nov 2024 10:36:21 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=ObIU2 P3qJjINYK+IJ8PgzMf+nYL6i34Lfd1P73XgKhw=; b=aa1tpTpCHXuYUa5z8bU2D jIun6UcKJ27KQWPPFCK31AJBGhZ2RdXwComFF7JEAEGbXW6eE7VL58fW5mtUOHzz zYubRO9vbwj+cwhTLsSOL/uNJHjc6GO0PtFBZZW+QdcpieobhvaeYsciG1hxxQr7 EWpjfR4UR5/PANxVLbtmltcsgM9EM5Zwm2Aid92CNqD3JLmtzFcGgOBFtTtoueob OURK2uo6hBHpTLutmE9wtwq5rUuQd3wPE2tuSdrVZf+lqbPe4thCgGGsrKXQttEP O6waRyOb6zrcNalqh5R/kFbO1uv8HyWKvQbbX7clzsKZvDhmGbcymXoz3KefG58X g== Received: from nwd2mta3.analog.com ([137.71.173.56]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 436716tmxx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 29 Nov 2024 10:36:21 -0500 (EST) Received: from ASHBMBX8.ad.analog.com (ASHBMBX8.ad.analog.com [10.64.17.5]) by nwd2mta3.analog.com (8.14.7/8.14.7) with ESMTP id 4ATFaKCm008899 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 29 Nov 2024 10:36:20 -0500 Received: from ASHBCASHYB4.ad.analog.com (10.64.17.132) by ASHBMBX8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.14; Fri, 29 Nov 2024 10:36:20 -0500 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) by ASHBCASHYB4.ad.analog.com (10.64.17.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.14; Fri, 29 Nov 2024 10:36:19 -0500 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.986.14 via Frontend Transport; Fri, 29 Nov 2024 10:36:19 -0500 Received: from amiclaus-VirtualBox.ad.analog.com (AMICLAUS-L02.ad.analog.com [10.48.65.161]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 4ATFa0m8001167; Fri, 29 Nov 2024 10:36:12 -0500 From: Antoniu Miclaus To: , , , , , , , CC: Antoniu Miclaus Subject: [PATCH v7 5/8] iio: adc: adi-axi-adc: set data format Date: Fri, 29 Nov 2024 17:35:43 +0200 Message-ID: <20241129153546.63584-6-antoniu.miclaus@analog.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241129153546.63584-1-antoniu.miclaus@analog.com> References: <20241129153546.63584-1-antoniu.miclaus@analog.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: Z1oVMqc3oxbUSiaxsREo9k0xaLpf47Vd X-Proofpoint-ORIG-GUID: Z1oVMqc3oxbUSiaxsREo9k0xaLpf47Vd X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 mlxlogscore=999 adultscore=0 phishscore=0 mlxscore=0 lowpriorityscore=0 bulkscore=0 spamscore=0 impostorscore=0 suspectscore=0 malwarescore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2411120000 definitions=main-2411290127 Content-Type: text/plain; charset="utf-8" Add support for selecting the data format within the AXI ADC ip. Signed-off-by: Antoniu Miclaus --- changes in v7: - add back 16-bit case drivers/iio/adc/adi-axi-adc.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c index f6475bc93796..cb3b8299a65e 100644 --- a/drivers/iio/adc/adi-axi-adc.c +++ b/drivers/iio/adc/adi-axi-adc.c @@ -45,6 +45,12 @@ #define ADI_AXI_ADC_REG_CTRL 0x0044 #define ADI_AXI_ADC_CTRL_DDR_EDGESEL_MASK BIT(1) =20 +#define ADI_AXI_ADC_REG_CNTRL_3 0x004c +#define AD485X_CNTRL_3_CUSTOM_CTRL_PACKET_FORMAT_MSK GENMASK(1, 0) +#define AD485X_PACKET_FORMAT_20BIT 0x0 +#define AD485X_PACKET_FORMAT_24BIT 0x1 +#define AD485X_PACKET_FORMAT_32BIT 0x2 + #define ADI_AXI_ADC_REG_DRP_STATUS 0x0074 #define ADI_AXI_ADC_DRP_LOCKED BIT(17) =20 @@ -312,6 +318,30 @@ static int axi_adc_interface_type_get(struct iio_backe= nd *back, return 0; } =20 +static int axi_adc_data_size_set(struct iio_backend *back, unsigned int si= ze) +{ + struct adi_axi_adc_state *st =3D iio_backend_get_priv(back); + unsigned int val; + + switch (size) { + case 16: + case 20: + val =3D AD485X_PACKET_FORMAT_20BIT; + break; + case 24: + val =3D AD485X_PACKET_FORMAT_24BIT; + break; + case 32: + val =3D AD485X_PACKET_FORMAT_32BIT; + break; + default: + return -EINVAL; + } + + return regmap_update_bits(st->regmap, ADI_AXI_ADC_REG_CNTRL_3, + AD485X_CNTRL_3_CUSTOM_CTRL_PACKET_FORMAT_MSK, val); +} + static struct iio_buffer *axi_adc_request_buffer(struct iio_backend *back, struct iio_dev *indio_dev) { @@ -360,6 +390,7 @@ static const struct iio_backend_ops adi_axi_adc_ops =3D= { .test_pattern_set =3D axi_adc_test_pattern_set, .chan_status =3D axi_adc_chan_status, .interface_type_get =3D axi_adc_interface_type_get, + .data_size_set =3D axi_adc_data_size_set, .debugfs_reg_access =3D iio_backend_debugfs_ptr(axi_adc_reg_access), .debugfs_print_chan_status =3D iio_backend_debugfs_ptr(axi_adc_debugfs_pr= int_chan_status), }; --=20 2.47.1 From nobody Thu Dec 26 09:53:06 2024 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (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 2E9C719E7D0; Fri, 29 Nov 2024 15:36:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894585; cv=none; b=iIC5gnu+AfuMgYc1BXYhS3+2pZVq9Gk3xTwtGvDKFesh9r9N54qQw0ta1u0LTtyAD40AVYATDLJJlkz5O961tNQkVaRh9zkZDAxhjy/GKQbsMTjvevbVMtkiDF3TM2i6mAZo1OqJKmtJ3eVxexlpbVvF7ISSKGnoAih3hVkZySI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894585; c=relaxed/simple; bh=6bHzNU5Cc8vo4RBFqXy7MlYas8XWIqB0djesH0SUplo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=j0P5J0NRpt+sYxW4quhdzudNDeo9ZvCnc9/TjWlaBScxzZIjr5fsKU+zAOI/V977hJj6owUZ2fzpgou6ZiDfoLjB4vT/RyqglRbjZYg1nDQrq8k35nVHziMlDFKM4kMOuwMEu7FkHUeNWI6eTCDf4w57Mv+hY7jFglLc/vXdzqs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=iVFnlpFt; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="iVFnlpFt" Received: from pps.filterd (m0167088.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4ATAFFXb015113; Fri, 29 Nov 2024 10:36:21 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=Ywic7 f26Z1aeVsvkG03G0PbRob9Lr/+dVGtrNWZlNpU=; b=iVFnlpFtH3pYbPitV+Vyj 125jjxDH2ymDBVeiADm4oIq7khX4kF5JFA/KjEXftserOuQ3n+C152keKHTbP8CF jBvdukBxU3x3uwpOiSAUDQCyzgrMrp4sokhxjL7CsrEoV+q6iHw+pG5GoQSvaK76 evriTCDF9yAGUXLgEAarpx/IeYOBwZs2OtWnVvWDA1ruseSef2dCfrXVBuFoFOus vcxzhovjINZTuSMqXECJuC0XJ2F0PqoSnCKKeOaAOuT/RgcOPWkqnSQ9UJPZw31+ IIVoPtkq1uHp1qt975+gI8xAlQx1AxC95j/4qm0aqFP1ujXPEjDvQkJE2W27zm/8 g== Received: from nwd2mta3.analog.com ([137.71.173.56]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 436716tmxv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 29 Nov 2024 10:36:20 -0500 (EST) Received: from ASHBMBX9.ad.analog.com (ASHBMBX9.ad.analog.com [10.64.17.10]) by nwd2mta3.analog.com (8.14.7/8.14.7) with ESMTP id 4ATFaJUH008895 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 29 Nov 2024 10:36:19 -0500 Received: from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBMBX9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.14; Fri, 29 Nov 2024 10:36:19 -0500 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server id 15.2.986.14 via Frontend Transport; Fri, 29 Nov 2024 10:36:19 -0500 Received: from amiclaus-VirtualBox.ad.analog.com (AMICLAUS-L02.ad.analog.com [10.48.65.161]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 4ATFa0m9001167; Fri, 29 Nov 2024 10:36:13 -0500 From: Antoniu Miclaus To: , , , , , , , CC: Antoniu Miclaus Subject: [PATCH v7 6/8] iio: adc: adi-axi-adc: add oversampling Date: Fri, 29 Nov 2024 17:35:44 +0200 Message-ID: <20241129153546.63584-7-antoniu.miclaus@analog.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241129153546.63584-1-antoniu.miclaus@analog.com> References: <20241129153546.63584-1-antoniu.miclaus@analog.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: 1gy318MqMJ6FK6GZSRVqonSsiLv47rvJ X-Proofpoint-ORIG-GUID: 1gy318MqMJ6FK6GZSRVqonSsiLv47rvJ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 mlxlogscore=880 adultscore=0 phishscore=0 mlxscore=0 lowpriorityscore=0 bulkscore=0 spamscore=0 impostorscore=0 suspectscore=0 malwarescore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2411120000 definitions=main-2411290127 Content-Type: text/plain; charset="utf-8" Add support for enabling/disabling oversampling. Signed-off-by: Antoniu Miclaus --- drivers/iio/adc/adi-axi-adc.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) changes in v7: - use regmap set/clear bits functions - use enable/disable functions diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c index cb3b8299a65e..3128e2543e22 100644 --- a/drivers/iio/adc/adi-axi-adc.c +++ b/drivers/iio/adc/adi-axi-adc.c @@ -46,6 +46,7 @@ #define ADI_AXI_ADC_CTRL_DDR_EDGESEL_MASK BIT(1) =20 #define ADI_AXI_ADC_REG_CNTRL_3 0x004c +#define AD485X_CNTRL_3_CUSTOM_CTRL_OS_EN_MSK BIT(2) #define AD485X_CNTRL_3_CUSTOM_CTRL_PACKET_FORMAT_MSK GENMASK(1, 0) #define AD485X_PACKET_FORMAT_20BIT 0x0 #define AD485X_PACKET_FORMAT_24BIT 0x1 @@ -342,6 +343,22 @@ static int axi_adc_data_size_set(struct iio_backend *b= ack, unsigned int size) AD485X_CNTRL_3_CUSTOM_CTRL_PACKET_FORMAT_MSK, val); } =20 +static int axi_adc_oversampling_enable(struct iio_backend *back) +{ + struct adi_axi_adc_state *st =3D iio_backend_get_priv(back); + + return regmap_set_bits(st->regmap, ADI_AXI_ADC_REG_CNTRL_3, + AD485X_CNTRL_3_CUSTOM_CTRL_OS_EN_MSK); +} + +static int axi_adc_oversampling_disable(struct iio_backend *back) +{ + struct adi_axi_adc_state *st =3D iio_backend_get_priv(back); + + return regmap_clear_bits(st->regmap, ADI_AXI_ADC_REG_CNTRL_3, + AD485X_CNTRL_3_CUSTOM_CTRL_OS_EN_MSK); +} + static struct iio_buffer *axi_adc_request_buffer(struct iio_backend *back, struct iio_dev *indio_dev) { @@ -391,6 +408,8 @@ static const struct iio_backend_ops adi_axi_adc_ops =3D= { .chan_status =3D axi_adc_chan_status, .interface_type_get =3D axi_adc_interface_type_get, .data_size_set =3D axi_adc_data_size_set, + .oversampling_enable =3D axi_adc_oversampling_enable, + .oversampling_disable =3D axi_adc_oversampling_disable, .debugfs_reg_access =3D iio_backend_debugfs_ptr(axi_adc_reg_access), .debugfs_print_chan_status =3D iio_backend_debugfs_ptr(axi_adc_debugfs_pr= int_chan_status), }; --=20 2.47.1 From nobody Thu Dec 26 09:53:06 2024 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (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 0145A1A0BE3; Fri, 29 Nov 2024 15:36:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894588; cv=none; b=upNsZA5flHmzgC6o+RppMbh8Zr/PASHWjhZZcG7Rkv4DiaJqw3vp+63+LqaOql57xhcHQPct21HemaQb0+VGazN77BVvLe0Lm2BjDyyCWvckZyhUINdclW5Gc05J4QKylxq/aRXkkKOyLHbfmyoW7DyASUCVzBc6RZ/ugl9K/kc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894588; c=relaxed/simple; bh=SJnA3nCd+j5BVty/Pj/mt5qSm1O0Ru9kryFCrp/n7Hg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cUuq8m1AXb3WMYhBMJYJmIfQAaCurJK/A32mRxpvA1A8ZqBoyGPYS6wUys4jQcQl1VQW2QuFUmjH0EUg253e45B8R3vZ1e0qEbiFp59yF25XMfZiko+dcy8/6NHuow5tN5VdtxtXOYBnWkBCRmizJmqAloYnCo2kca5liEs7OAM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=D0rJdWKC; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="D0rJdWKC" Received: from pps.filterd (m0167089.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4ATBkQ12018141; Fri, 29 Nov 2024 10:36:22 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=RGEVd jopX4vAuO2iqiklSBpk5Fqyp7ZyqX6p0GIAQKY=; b=D0rJdWKCbZtuqEkM0wahK x50h3eJQW7zyjLPNFdRym6LPNRzWyFlA1zEhfJ+4Vu5WlvKnkuP5q0fmbAOejHJp O2wwZzouaYwmPvauIBiB3NK0L2/eOu33sWbreiX8TpZj7rp6DMa9CsINTagZpKCS 8xsjdgZog9ZMNCQj5hejPUcmRDfrtO8SR2MJ7DtKy2hCkpVK1d2TP8YHS5p/86Jo zHMUUK1BqeM36gpYqmBeZXASB+TS8HynKmd/za5KLxfjlVPXB5+uBLAWGlyTBCqC B8n3nNOlhU9wJm4KrWBoUr9S0O4APSNOAy6UP0p3wnOC8wcA+Y2MnR4980UKifRt A== Received: from nwd2mta3.analog.com ([137.71.173.56]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 436715tj5b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 29 Nov 2024 10:36:22 -0500 (EST) Received: from ASHBMBX9.ad.analog.com (ASHBMBX9.ad.analog.com [10.64.17.10]) by nwd2mta3.analog.com (8.14.7/8.14.7) with ESMTP id 4ATFaK67008905 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 29 Nov 2024 10:36:20 -0500 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) by ASHBMBX9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.14; Fri, 29 Nov 2024 10:36:20 -0500 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.986.14 via Frontend Transport; Fri, 29 Nov 2024 10:36:20 -0500 Received: from amiclaus-VirtualBox.ad.analog.com (AMICLAUS-L02.ad.analog.com [10.48.65.161]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 4ATFa0mA001167; Fri, 29 Nov 2024 10:36:15 -0500 From: Antoniu Miclaus To: , , , , , , , CC: Antoniu Miclaus , Conor Dooley Subject: [PATCH v7 7/8] dt-bindings: iio: adc: add ad4851 Date: Fri, 29 Nov 2024 17:35:45 +0200 Message-ID: <20241129153546.63584-8-antoniu.miclaus@analog.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241129153546.63584-1-antoniu.miclaus@analog.com> References: <20241129153546.63584-1-antoniu.miclaus@analog.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-ORIG-GUID: TLNvQiUkKVbbumrSxrYUT5tgJEsTjXYT X-Proofpoint-GUID: TLNvQiUkKVbbumrSxrYUT5tgJEsTjXYT X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 mlxlogscore=999 suspectscore=0 mlxscore=0 bulkscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 clxscore=1015 adultscore=0 priorityscore=1501 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2411120000 definitions=main-2411290127 Content-Type: text/plain; charset="utf-8" Add devicetree bindings for ad485x family. Reviewed-by: Conor Dooley Signed-off-by: Antoniu Miclaus --- changes in v7: - add adc channels support .../bindings/iio/adc/adi,ad4851.yaml | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/adc/adi,ad4851.ya= ml diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad4851.yaml b/Do= cumentation/devicetree/bindings/iio/adc/adi,ad4851.yaml new file mode 100644 index 000000000000..57e5222dee71 --- /dev/null +++ b/Documentation/devicetree/bindings/iio/adc/adi,ad4851.yaml @@ -0,0 +1,139 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +# Copyright 2024 Analog Devices Inc. +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/adc/adi,ad4851.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Analog Devices AD485X family + +maintainers: + - Sergiu Cuciurean + - Dragos Bogdan + - Antoniu Miclaus + +description: | + Analog Devices AD485X fully buffered, 8-channel simultaneous sampling, + 16/20-bit, 1 MSPS data acquisition system (DAS) with differential, wide + common-mode range inputs. + + https://www.analog.com/media/en/technical-documentation/data-sheets/ad48= 55.pdf + https://www.analog.com/media/en/technical-documentation/data-sheets/ad48= 56.pdf + https://www.analog.com/media/en/technical-documentation/data-sheets/ad48= 57.pdf + https://www.analog.com/media/en/technical-documentation/data-sheets/ad48= 58.pdf + +$ref: /schemas/spi/spi-peripheral-props.yaml# + +properties: + compatible: + enum: + - adi,ad4851 + - adi,ad4852 + - adi,ad4853 + - adi,ad4854 + - adi,ad4855 + - adi,ad4856 + - adi,ad4857 + - adi,ad4858 + - adi,ad4858i + + reg: + maxItems: 1 + + vcc-supply: true + + vee-supply: true + + vdd-supply: true + + vddh-supply: true + + vddl-supply: true + + vio-supply: true + + vrefbuf-supply: true + + vrefio-supply: true + + pwms: + description: PWM connected to the CNV pin. + maxItems: 1 + + io-backends: + maxItems: 1 + + pd-gpios: + maxItems: 1 + + spi-max-frequency: + maximum: 25000000 + + '#address-cells': + const: 1 + + '#size-cells': + const: 0 + +patternProperties: + "^channel(@[0-7])?$": + $ref: adc.yaml + type: object + description: Represents the channels which are connected to the ADC. + + properties: + reg: + description: The channel number in single-ended mode. + minimum: 0 + maximum: 7 + + diff-channels: true + + required: + - reg + + additionalProperties: false + +required: + - compatible + - reg + - vcc-supply + - vee-supply + - vdd-supply + - vio-supply + - pwms + +unevaluatedProperties: false + +examples: + - | + spi { + #address-cells =3D <1>; + #size-cells =3D <0>; + + adc@0{ + #address-cells =3D <1>; + #size-cells =3D <0>; + compatible =3D "adi,ad4858"; + reg =3D <0>; + spi-max-frequency =3D <10000000>; + vcc-supply =3D <&vcc>; + vdd-supply =3D <&vdd>; + vee-supply =3D <&vee>; + vddh-supply =3D <&vddh>; + vddl-supply =3D <&vddl>; + vio-supply =3D <&vio>; + pwms =3D <&pwm_gen 0 0>; + io-backends =3D <&iio_backend>; + + channel@0 { + reg =3D <0>; + diff-channels =3D <0 8>; + }; + + channel@1 { + reg =3D <1>; + }; + }; + }; +... --=20 2.47.1 From nobody Thu Dec 26 09:53:06 2024 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (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 3315C1A303C; Fri, 29 Nov 2024 15:36:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894592; cv=none; b=NUlwNrSdFGjJ5OSSDCPeSMqZnQYDRCB2guFMkGeds4yNQ6xXiW7ppZzF2voPSqLJpc1b7CopudbjBBxQ0+3RUpmyewCbsRwIo7pZhAb9/pMo+vJVG2RlfelWFwzDmD9aZ1UMuBrgsKFsMrBpXSXEhA3tQ+QrOn8uUHg3BKBEq84= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732894592; c=relaxed/simple; bh=wx+0VTi2u/OFCG9JVhbaP7A8a7T5ghKhQAvoVlFunuk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=lSbWCH3USDGgem0hBIWnXiiMc7SjM3s5Sbyr9yj+tmNs7cprvJRBRxr1/4RsbnlAGeduCra0E4OtGMOJibKF7eYvcMIrfDDc+nIZg5zcMsJxTY5C7hAQjrUX+GefP6PD+4LFD7Pt/jiDdHExwthljGoJLKbtRhn1IsC9ox74rvM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=MIawjqyF; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="MIawjqyF" Received: from pps.filterd (m0167089.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4ATBkQ13018141; Fri, 29 Nov 2024 10:36:24 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=AtUcu 51GFu76fVDjFsrCXIbOLmWVN24WzbFbRHGmNVw=; b=MIawjqyFxVlzoMzudLSJb wvUjfHR4rhhUulQRlZd32Kb7PNuC31nFhnSjqLsq07MxSifB6D+qLN/vmEcNDQm+ jMeZwqD95qibvSJAy4RyUmvbGIm+qWYazG8PI6oUsldXz/cPYHkoG/v10jd9LwlN fOTX1dGS8+A4w1maSrYR8bcA/hWiFNDpnmlPzibFBrz8VE0Jd9rmK9+J+k5vgHP4 W/Z8YoklG3v5hPiAcq5nqPXGnPcSRUss7823ulORtqk7eM5O8GtUTVs4yvQXVpj7 k2vc6GYbLt7KdTSpE4/r4jD0t+NigtkUscGsMERCHIsLpOwb4sd6z8u+fT6uWbV7 A== Received: from nwd2mta3.analog.com ([137.71.173.56]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 436715tj5e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 29 Nov 2024 10:36:23 -0500 (EST) Received: from ASHBMBX9.ad.analog.com (ASHBMBX9.ad.analog.com [10.64.17.10]) by nwd2mta3.analog.com (8.14.7/8.14.7) with ESMTP id 4ATFaMue008910 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 29 Nov 2024 10:36:22 -0500 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) by ASHBMBX9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.14; Fri, 29 Nov 2024 10:36:22 -0500 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.986.14 via Frontend Transport; Fri, 29 Nov 2024 10:36:22 -0500 Received: from amiclaus-VirtualBox.ad.analog.com (AMICLAUS-L02.ad.analog.com [10.48.65.161]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 4ATFa0mB001167; Fri, 29 Nov 2024 10:36:18 -0500 From: Antoniu Miclaus To: , , , , , , , CC: Antoniu Miclaus Subject: [PATCH v7 8/8] iio: adc: ad4851: add ad485x driver Date: Fri, 29 Nov 2024 17:35:46 +0200 Message-ID: <20241129153546.63584-9-antoniu.miclaus@analog.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241129153546.63584-1-antoniu.miclaus@analog.com> References: <20241129153546.63584-1-antoniu.miclaus@analog.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-ORIG-GUID: z0jd7CvOwBM0RsJs2eMSwrQtgiluOp42 X-Proofpoint-GUID: z0jd7CvOwBM0RsJs2eMSwrQtgiluOp42 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 mlxlogscore=999 suspectscore=0 mlxscore=0 bulkscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 clxscore=1015 adultscore=0 priorityscore=1501 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2411120000 definitions=main-2411290127 Content-Type: text/plain; charset="utf-8" Add support for the AD485X a fully buffered, 8-channel simultaneous sampling, 16/20-bit, 1 MSPS data acquisition system (DAS) with differential, wide common-mode range inputs. Signed-off-by: Antoniu Miclaus --- changes in v7: - use new iio backend os enable/disable functions - implement separate scan_type for both signed and unsigned. - drop ext_scan_type for 16-bit chips - rework scan_index ordering. - add separate scales for diff/single-ended channels - parse iio channels via dts properties. drivers/iio/adc/Kconfig | 13 + drivers/iio/adc/Makefile | 1 + drivers/iio/adc/ad4851.c | 1346 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 1360 insertions(+) create mode 100644 drivers/iio/adc/ad4851.c diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 6c4e74420fd2..0d97cd760d90 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -61,6 +61,19 @@ config AD4695 To compile this driver as a module, choose M here: the module will be called ad4695. =20 +config AD4851 + tristate "Analog Device AD4851 DAS Driver" + depends on SPI + select REGMAP_SPI + select IIO_BACKEND + help + Say yes here to build support for Analog Devices AD4851, AD4852, + AD4853, AD4854, AD4855, AD4856, AD4857, AD4858, AD4858I high speed + data acquisition system (DAS). + + To compile this driver as a module, choose M here: the module will be + called ad4851. + config AD7091R tristate =20 diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile index 7b91cd98c0e0..d83df8b5925d 100644 --- a/drivers/iio/adc/Makefile +++ b/drivers/iio/adc/Makefile @@ -9,6 +9,7 @@ obj-$(CONFIG_AD_SIGMA_DELTA) +=3D ad_sigma_delta.o obj-$(CONFIG_AD4000) +=3D ad4000.o obj-$(CONFIG_AD4130) +=3D ad4130.o obj-$(CONFIG_AD4695) +=3D ad4695.o +obj-$(CONFIG_AD4851) +=3D ad4851.o obj-$(CONFIG_AD7091R) +=3D ad7091r-base.o obj-$(CONFIG_AD7091R5) +=3D ad7091r5.o obj-$(CONFIG_AD7091R8) +=3D ad7091r8.o diff --git a/drivers/iio/adc/ad4851.c b/drivers/iio/adc/ad4851.c new file mode 100644 index 000000000000..e8e5c0def29e --- /dev/null +++ b/drivers/iio/adc/ad4851.c @@ -0,0 +1,1346 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Analog Devices AD4851 DAS driver + * + * Copyright 2024 Analog Devices Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define AD4851_REG_INTERFACE_CONFIG_A 0x00 +#define AD4851_REG_INTERFACE_CONFIG_B 0x01 +#define AD4851_REG_PRODUCT_ID_L 0x04 +#define AD4851_REG_PRODUCT_ID_H 0x05 +#define AD4851_REG_DEVICE_CTRL 0x25 +#define AD4851_REG_PACKET 0x26 +#define AD4851_REG_OVERSAMPLE 0x27 + +#define AD4851_REG_CH_CONFIG_BASE 0x2A +#define AD4851_REG_CHX_SOFTSPAN(ch) ((0x12 * (ch)) + AD4851_REG_CH_CONFIG_= BASE) +#define AD4851_REG_CHX_OFFSET(ch) (AD4851_REG_CHX_SOFTSPAN(ch) + 0x01) +#define AD4851_REG_CHX_OFFSET_LSB(ch) AD4851_REG_CHX_OFFSET(ch) +#define AD4851_REG_CHX_OFFSET_MID(ch) (AD4851_REG_CHX_OFFSET_LSB(ch) + 0x0= 1) +#define AD4851_REG_CHX_OFFSET_MSB(ch) (AD4851_REG_CHX_OFFSET_MID(ch) + 0x0= 1) +#define AD4851_REG_CHX_GAIN(ch) (AD4851_REG_CHX_OFFSET(ch) + 0x03) +#define AD4851_REG_CHX_GAIN_LSB(ch) AD4851_REG_CHX_GAIN(ch) +#define AD4851_REG_CHX_GAIN_MSB(ch) (AD4851_REG_CHX_GAIN(ch) + 0x01) +#define AD4851_REG_CHX_PHASE(ch) (AD4851_REG_CHX_GAIN(ch) + 0x02) +#define AD4851_REG_CHX_PHASE_LSB(ch) AD4851_REG_CHX_PHASE(ch) +#define AD4851_REG_CHX_PHASE_MSB(ch) (AD4851_REG_CHX_PHASE_LSB(ch) + 0x01) + +#define AD4851_REG_TESTPAT_0(c) (0x38 + (c) * 0x12) +#define AD4851_REG_TESTPAT_1(c) (0x39 + (c) * 0x12) +#define AD4851_REG_TESTPAT_2(c) (0x3A + (c) * 0x12) +#define AD4851_REG_TESTPAT_3(c) (0x3B + (c) * 0x12) + +#define AD4851_SW_RESET (BIT(7) | BIT(0)) +#define AD4851_SDO_ENABLE BIT(4) +#define AD4851_SINGLE_INSTRUCTION BIT(7) +#define AD4851_REFBUF_PD BIT(2) +#define AD4851_REFSEL_PD BIT(1) +#define AD4851_ECHO_CLOCK_MODE BIT(0) + +#define AD4851_PACKET_FORMAT_0 0 +#define AD4851_PACKET_FORMAT_1 1 +#define AD4851_PACKET_FORMAT_MASK GENMASK(1, 0) + +#define AD4851_OS_EN_MSK BIT(7) +#define AD4851_OS_RATIO_MSK GENMASK(3, 0) + +#define AD4851_TEST_PAT BIT(2) + +#define AD4858_PACKET_SIZE_20 0 +#define AD4858_PACKET_SIZE_24 1 +#define AD4858_PACKET_SIZE_32 2 + +#define AD4857_PACKET_SIZE_16 0 +#define AD4857_PACKET_SIZE_24 1 + +#define AD4851_TESTPAT_0_DEFAULT 0x2A +#define AD4851_TESTPAT_1_DEFAULT 0x3C +#define AD4851_TESTPAT_2_DEFAULT 0xCE +#define AD4851_TESTPAT_3_DEFAULT(c) (0x0A + (0x10 * (c))) + +#define AD4851_SOFTSPAN_0V_2V5 0 +#define AD4851_SOFTSPAN_N2V5_2V5 1 +#define AD4851_SOFTSPAN_0V_5V 2 +#define AD4851_SOFTSPAN_N5V_5V 3 +#define AD4851_SOFTSPAN_0V_6V25 4 +#define AD4851_SOFTSPAN_N6V25_6V25 5 +#define AD4851_SOFTSPAN_0V_10V 6 +#define AD4851_SOFTSPAN_N10V_10V 7 +#define AD4851_SOFTSPAN_0V_12V5 8 +#define AD4851_SOFTSPAN_N12V5_12V5 9 +#define AD4851_SOFTSPAN_0V_20V 10 +#define AD4851_SOFTSPAN_N20V_20V 11 +#define AD4851_SOFTSPAN_0V_25V 12 +#define AD4851_SOFTSPAN_N25V_25V 13 +#define AD4851_SOFTSPAN_0V_40V 14 +#define AD4851_SOFTSPAN_N40V_40V 15 + +#define AD4851_MAX_LANES 8 +#define AD4851_MAX_IODELAY 32 + +#define AD4851_T_CNVH_NS 40 + +#define AD4841_MAX_SCALE_AVAIL 8 + +#define AD4851_MAX_CH_NR 8 +#define AD4851_CH_START 0 + +struct ad4851_scale { + unsigned int scale_val; + u8 reg_val; +}; + +static const struct ad4851_scale ad4851_scale_table_se[] =3D { + { 2500, 0x0 }, + { 5000, 0x2 }, + { 6250, 0x4 }, + { 10000, 0x6 }, + { 12500, 0x8 }, + { 20000, 0xA }, + { 25000, 0xC }, + { 40000, 0xE }, +}; + +static const struct ad4851_scale ad4851_scale_table_diff[] =3D { + { 5000, 0x1 }, + { 10000, 0x3 }, + { 12500, 0x5 }, + { 20000, 0x7 }, + { 25000, 0x9 }, + { 40000, 0xB }, + { 50000, 0xD }, + { 80000, 0xF }, +}; + +static const unsigned int ad4851_scale_avail_se[] =3D { + 2500, + 5000, + 6250, + 10000, + 12500, + 20000, + 25000, + 40000, +}; + +static const unsigned int ad4851_scale_avail_diff[] =3D { + 5000, + 10000, + 12500, + 20000, + 25000, + 40000, + 50000, + 80000, +}; + +struct ad4851_chip_info { + const char *name; + unsigned int product_id; + int num_scales; + const struct iio_chan_spec *channels; + unsigned int num_channels; + unsigned long max_sample_rate_hz; + unsigned int resolution; + int (*parse_channels)(struct iio_dev *indio_dev); +}; + +enum { + AD4851_SCAN_TYPE_NORMAL, + AD4851_SCAN_TYPE_RESOLUTION_BOOST, +}; + +struct ad4851_state { + struct spi_device *spi; + struct pwm_device *cnv; + struct iio_backend *back; + /* + * Synchronize access to members the of driver state, and ensure + * atomicity of consecutive regmap operations. + */ + struct mutex lock; + struct regmap *regmap; + struct regulator *vrefbuf; + struct regulator *vrefio; + const struct ad4851_chip_info *info; + struct gpio_desc *pd_gpio; + bool resolution_boost_enabled; + unsigned long sampling_freq; + unsigned int scales_se[AD4841_MAX_SCALE_AVAIL][2]; + unsigned int scales_diff[AD4841_MAX_SCALE_AVAIL][2]; +}; + +static int ad4851_reg_access(struct iio_dev *indio_dev, + unsigned int reg, + unsigned int writeval, + unsigned int *readval) +{ + struct ad4851_state *st =3D iio_priv(indio_dev); + + guard(mutex)(&st->lock); + + if (readval) + return regmap_read(st->regmap, reg, readval); + + return regmap_write(st->regmap, reg, writeval); +} + +static int ad4851_set_sampling_freq(struct ad4851_state *st, unsigned int = freq) +{ + struct pwm_state cnv_state =3D { + .duty_cycle =3D AD4851_T_CNVH_NS, + .enabled =3D true, + }; + int ret; + + freq =3D clamp(freq, 1, st->info->max_sample_rate_hz); + + cnv_state.period =3D DIV_ROUND_UP_ULL(NSEC_PER_SEC, freq); + + ret =3D pwm_apply_might_sleep(st->cnv, &cnv_state); + if (ret) + return ret; + + st->sampling_freq =3D freq; + + return 0; +} + +static const int ad4851_oversampling_ratios[] =3D { + 1, 2, 4, 8, 16, 32, 64, 128, + 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, + 65536, +}; + +static int ad4851_osr_to_regval(int ratio) +{ + int i; + + for (i =3D 1; i < ARRAY_SIZE(ad4851_oversampling_ratios); i++) + if (ratio =3D=3D ad4851_oversampling_ratios[i]) + return i - 1; + + return -EINVAL; +} + +static int ad4851_set_oversampling_ratio(struct ad4851_state *st, + const struct iio_chan_spec *chan, + unsigned int osr) +{ + unsigned int val; + int ret; + + guard(mutex)(&st->lock); + + if (osr =3D=3D 1) { + ret =3D regmap_clear_bits(st->regmap, AD4851_REG_OVERSAMPLE, + AD4851_OS_EN_MSK); + if (ret) + return ret; + + ret =3D iio_backend_oversampling_disable(st->back); + if (ret) + return ret; + } else { + val =3D ad4851_osr_to_regval(osr); + if (val < 0) + return -EINVAL; + + ret =3D regmap_set_bits(st->regmap, AD4851_REG_OVERSAMPLE, + AD4851_OS_EN_MSK); + if (ret) + return ret; + + ret =3D regmap_update_bits(st->regmap, AD4851_REG_OVERSAMPLE, + AD4851_OS_RATIO_MSK, val); + if (ret) + return ret; + + ret =3D iio_backend_oversampling_enable(st->back); + if (ret) + return ret; + } + + switch (chan->scan_type.realbits) { + case 20: + switch (osr) { + case 0: + return -EINVAL; + case 1: + val =3D 20; + break; + default: + val =3D 24; + break; + } + break; + case 16: + val =3D 16; + break; + default: + return -EINVAL; + } + + ret =3D iio_backend_data_size_set(st->back, val); + if (ret) + return ret; + + if (osr =3D=3D 1 || chan->scan_type.realbits =3D=3D 16) { + ret =3D regmap_clear_bits(st->regmap, AD4851_REG_PACKET, + AD4851_PACKET_FORMAT_MASK); + if (ret) + return ret; + + st->resolution_boost_enabled =3D false; + } else { + ret =3D regmap_update_bits(st->regmap, AD4851_REG_PACKET, + AD4851_PACKET_FORMAT_MASK, + FIELD_PREP(AD4851_PACKET_FORMAT_MASK, 1)); + if (ret) + return ret; + + st->resolution_boost_enabled =3D true; + } + + return 0; +} + +static int ad4851_get_oversampling_ratio(struct ad4851_state *st, unsigned= int *val) +{ + unsigned int osr; + int ret; + + guard(mutex)(&st->lock); + + ret =3D regmap_read(st->regmap, AD4851_REG_OVERSAMPLE, &osr); + if (ret) + return ret; + + if (!FIELD_GET(AD4851_OS_EN_MSK, osr)) + *val =3D 1; + else + *val =3D ad4851_oversampling_ratios[FIELD_GET(AD4851_OS_RATIO_MSK, osr)]; + + return IIO_VAL_INT; +} + +static void ad4851_reg_disable(void *data) +{ + regulator_disable(data); +} + +static void ad4851_pwm_disable(void *data) +{ + pwm_disable(data); +} + +static int ad4851_setup(struct ad4851_state *st) +{ + unsigned int product_id; + int ret; + + if (!IS_ERR(st->vrefbuf)) { + ret =3D regmap_set_bits(st->regmap, AD4851_REG_DEVICE_CTRL, + AD4851_REFBUF_PD); + if (ret) + return ret; + + ret =3D regulator_enable(st->vrefbuf); + if (ret) + return ret; + + ret =3D devm_add_action_or_reset(&st->spi->dev, ad4851_reg_disable, + st->vrefbuf); + if (ret) + return ret; + } + + if (!IS_ERR(st->vrefio)) { + ret =3D regmap_set_bits(st->regmap, AD4851_REG_DEVICE_CTRL, + AD4851_REFSEL_PD); + if (ret) + return ret; + + ret =3D regulator_enable(st->vrefio); + if (ret) + return ret; + + ret =3D devm_add_action_or_reset(&st->spi->dev, ad4851_reg_disable, + st->vrefio); + if (ret) + return ret; + } + + if (st->pd_gpio) { + /* To initiate a global reset, bring the PD pin high twice */ + gpiod_set_value(st->pd_gpio, 1); + fsleep(1); + gpiod_set_value(st->pd_gpio, 0); + fsleep(1); + gpiod_set_value(st->pd_gpio, 1); + fsleep(1); + gpiod_set_value(st->pd_gpio, 0); + fsleep(1000); + } else { + ret =3D regmap_set_bits(st->regmap, AD4851_REG_INTERFACE_CONFIG_A, + AD4851_SW_RESET); + if (ret) + return ret; + } + + ret =3D regmap_write(st->regmap, AD4851_REG_INTERFACE_CONFIG_B, + AD4851_SINGLE_INSTRUCTION); + if (ret) + return ret; + + ret =3D regmap_write(st->regmap, AD4851_REG_INTERFACE_CONFIG_A, + AD4851_SDO_ENABLE); + if (ret) + return ret; + + ret =3D regmap_read(st->regmap, AD4851_REG_PRODUCT_ID_L, &product_id); + if (ret) + return ret; + + if (product_id !=3D st->info->product_id) + dev_info(&st->spi->dev, "Unknown product ID: 0x%02X\n", + product_id); + + ret =3D regmap_set_bits(st->regmap, AD4851_REG_DEVICE_CTRL, + AD4851_ECHO_CLOCK_MODE); + if (ret) + return ret; + + return regmap_write(st->regmap, AD4851_REG_PACKET, 0); +} + +static int ad4851_find_opt(bool *field, u32 size, u32 *ret_start) +{ + unsigned int i, cnt =3D 0, max_cnt =3D 0, max_start =3D 0; + int start; + + for (i =3D 0, start =3D -1; i < size; i++) { + if (field[i] =3D=3D 0) { + if (start =3D=3D -1) + start =3D i; + cnt++; + } else { + if (cnt > max_cnt) { + max_cnt =3D cnt; + max_start =3D start; + } + start =3D -1; + cnt =3D 0; + } + } + /* + * Find the longest consecutive sequence of false values from field + * and return starting index. + */ + if (cnt > max_cnt) { + max_cnt =3D cnt; + max_start =3D start; + } + + if (!max_cnt) + return -ENOENT; + + *ret_start =3D max_start; + + return max_cnt; +} + +static int ad4851_calibrate(struct ad4851_state *st) +{ + unsigned int opt_delay, num_lanes, delay, i, s, c; + enum iio_backend_interface_type interface_type; + DECLARE_BITMAP(pn_status, AD4851_MAX_LANES * AD4851_MAX_IODELAY); + bool status; + int ret; + + ret =3D iio_backend_interface_type_get(st->back, &interface_type); + if (ret) + return ret; + + switch (interface_type) { + case IIO_BACKEND_INTERFACE_SERIAL_CMOS: + num_lanes =3D st->info->num_channels / 2; + break; + case IIO_BACKEND_INTERFACE_SERIAL_LVDS: + num_lanes =3D 1; + break; + default: + return -EINVAL; + } + + if (st->info->resolution =3D=3D 16) { + ret =3D iio_backend_data_size_set(st->back, 24); + if (ret) + return ret; + + ret =3D regmap_write(st->regmap, AD4851_REG_PACKET, + AD4851_TEST_PAT | AD4857_PACKET_SIZE_24); + if (ret) + return ret; + } else { + ret =3D iio_backend_data_size_set(st->back, 32); + if (ret) + return ret; + + ret =3D regmap_write(st->regmap, AD4851_REG_PACKET, + AD4851_TEST_PAT | AD4858_PACKET_SIZE_32); + if (ret) + return ret; + } + + for (i =3D 0; i < st->info->num_channels / 2; i++) { + ret =3D regmap_write(st->regmap, AD4851_REG_TESTPAT_0(i), + AD4851_TESTPAT_0_DEFAULT); + if (ret) + return ret; + + ret =3D regmap_write(st->regmap, AD4851_REG_TESTPAT_1(i), + AD4851_TESTPAT_1_DEFAULT); + if (ret) + return ret; + + ret =3D regmap_write(st->regmap, AD4851_REG_TESTPAT_2(i), + AD4851_TESTPAT_2_DEFAULT); + if (ret) + return ret; + + ret =3D regmap_write(st->regmap, AD4851_REG_TESTPAT_3(i), + AD4851_TESTPAT_3_DEFAULT(i)); + if (ret) + return ret; + + ret =3D iio_backend_chan_enable(st->back, i); + if (ret) + return ret; + } + + for (i =3D 0; i < num_lanes; i++) { + for (delay =3D 0; delay < AD4851_MAX_IODELAY; delay++) { + ret =3D iio_backend_iodelay_set(st->back, i, delay); + if (ret) + return ret; + + ret =3D iio_backend_chan_status(st->back, i, &status); + if (ret) + return ret; + + if (status) + set_bit(i * AD4851_MAX_IODELAY + delay, pn_status); + else + clear_bit(i * AD4851_MAX_IODELAY + delay, pn_status); + } + } + + for (i =3D 0; i < num_lanes; i++) { + status =3D test_bit(i * AD4851_MAX_IODELAY, pn_status); + c =3D ad4851_find_opt(&status, AD4851_MAX_IODELAY, &s); + if (c < 0) + return c; + + opt_delay =3D s + c / 2; + ret =3D iio_backend_iodelay_set(st->back, i, opt_delay); + if (ret) + return ret; + } + + for (i =3D 0; i < st->info->num_channels / 2; i++) { + ret =3D iio_backend_chan_disable(st->back, i); + if (ret) + return ret; + } + + ret =3D iio_backend_data_size_set(st->back, 20); + if (ret) + return ret; + + return regmap_write(st->regmap, AD4851_REG_PACKET, 0); +} + +static int ad4851_get_calibscale(struct ad4851_state *st, int ch, int *val= , int *val2) +{ + unsigned int reg_val; + int gain; + int ret; + + guard(mutex)(&st->lock); + + ret =3D regmap_read(st->regmap, AD4851_REG_CHX_GAIN_MSB(ch), ®_val); + if (ret) + return ret; + + gain =3D reg_val << 8; + + ret =3D regmap_read(st->regmap, AD4851_REG_CHX_GAIN_LSB(ch), ®_val); + if (ret) + return ret; + + gain |=3D reg_val; + + *val =3D gain; + *val2 =3D 32768; + + return IIO_VAL_FRACTIONAL; +} + +static int ad4851_set_calibscale(struct ad4851_state *st, int ch, int val, + int val2) +{ + u64 gain; + u8 buf[2]; + int ret; + + if (val < 0 || val2 < 0) + return -EINVAL; + + gain =3D val * MICRO + val2; + gain =3D DIV_U64_ROUND_CLOSEST(gain * 32768, MICRO); + + put_unaligned_be16(gain, buf); + + guard(mutex)(&st->lock); + + ret =3D regmap_write(st->regmap, AD4851_REG_CHX_GAIN_MSB(ch), buf[0]); + if (ret) + return ret; + + return regmap_write(st->regmap, AD4851_REG_CHX_GAIN_LSB(ch), buf[1]); +} + +static int ad4851_get_calibbias(struct ad4851_state *st, int ch, int *val) +{ + unsigned int lsb, mid, msb; + int ret; + + guard(mutex)(&st->lock); + + ret =3D regmap_read(st->regmap, AD4851_REG_CHX_OFFSET_MSB(ch), + &msb); + if (ret) + return ret; + + ret =3D regmap_read(st->regmap, AD4851_REG_CHX_OFFSET_MID(ch), + &mid); + if (ret) + return ret; + + ret =3D regmap_read(st->regmap, AD4851_REG_CHX_OFFSET_LSB(ch), + &lsb); + if (ret) + return ret; + + if (st->info->resolution =3D=3D 16) { + *val =3D msb << 8; + *val |=3D mid; + *val =3D sign_extend32(*val, 15); + } else { + *val =3D msb << 12; + *val |=3D mid << 4; + *val |=3D lsb >> 4; + *val =3D sign_extend32(*val, 19); + } + + return IIO_VAL_INT; +} + +static int ad4851_set_calibbias(struct ad4851_state *st, int ch, int val) +{ + u8 buf[3] =3D { 0 }; + int ret; + + if (val < 0) + return -EINVAL; + + if (st->info->resolution =3D=3D 16) + put_unaligned_be16(val, buf); + else + put_unaligned_be24(val << 4, buf); + + guard(mutex)(&st->lock); + + ret =3D regmap_write(st->regmap, AD4851_REG_CHX_OFFSET_LSB(ch), buf[2]); + if (ret) + return ret; + + ret =3D regmap_write(st->regmap, AD4851_REG_CHX_OFFSET_MID(ch), buf[1]); + if (ret) + return ret; + + return regmap_write(st->regmap, AD4851_REG_CHX_OFFSET_MSB(ch), buf[0]); +} + +static void __ad4851_get_scale(struct ad4851_state *st, int scale_tbl, + unsigned int *val, unsigned int *val2) +{ + const struct ad4851_chip_info *info =3D st->info; + const struct iio_chan_spec *chan =3D &info->channels[0]; + unsigned int tmp; + + tmp =3D ((unsigned long long)scale_tbl * MICRO) >> chan->scan_type.realbi= ts; + *val =3D tmp / MICRO; + *val2 =3D tmp % MICRO; +} + +static int ad4851_set_scale(struct ad4851_state *st, + const struct iio_chan_spec *chan, int val, int val2) +{ + unsigned int scale_val[2]; + unsigned int i; + const struct ad4851_scale *scale_table; + size_t table_size; + + if (chan->differential) { + scale_table =3D ad4851_scale_table_diff; + table_size =3D ARRAY_SIZE(ad4851_scale_table_diff); + } else { + scale_table =3D ad4851_scale_table_se; + table_size =3D ARRAY_SIZE(ad4851_scale_table_se); + } + + for (i =3D 0; i < table_size; i++) { + __ad4851_get_scale(st, scale_table[i].scale_val, + &scale_val[0], &scale_val[1]); + if (scale_val[0] !=3D val || scale_val[1] !=3D val2) + continue; + + return regmap_write(st->regmap, + AD4851_REG_CHX_SOFTSPAN(chan->channel), + scale_table[i].reg_val); + } + + return -EINVAL; +} + +static int ad4851_get_scale(struct ad4851_state *st, + const struct iio_chan_spec *chan, int *val, + int *val2) +{ + int i, softspan_val; + int ret; + const struct ad4851_scale *scale_table; + size_t table_size; + + if (chan->differential) { + scale_table =3D ad4851_scale_table_diff; + table_size =3D ARRAY_SIZE(ad4851_scale_table_diff); + } else { + scale_table =3D ad4851_scale_table_se; + table_size =3D ARRAY_SIZE(ad4851_scale_table_se); + } + + ret =3D regmap_read(st->regmap, AD4851_REG_CHX_SOFTSPAN(chan->channel), + &softspan_val); + if (ret) + return ret; + + for (i =3D 0; i < table_size; i++) { + if (softspan_val =3D=3D scale_table[i].reg_val) + break; + } + + if (i =3D=3D table_size) + return -EIO; + + __ad4851_get_scale(st, scale_table[i].scale_val, val, val2); + + return IIO_VAL_INT_PLUS_MICRO; +} + +static int ad4851_scale_fill(struct ad4851_state *st) +{ + unsigned int i, val1, val2; + + for (i =3D 0; i < ARRAY_SIZE(ad4851_scale_avail_se); i++) { + __ad4851_get_scale(st, ad4851_scale_avail_se[i], &val1, &val2); + st->scales_se[i][0] =3D val1; + st->scales_se[i][1] =3D val2; + } + + for (i =3D 0; i < ARRAY_SIZE(ad4851_scale_avail_diff); i++) { + __ad4851_get_scale(st, ad4851_scale_avail_diff[i], &val1, &val2); + st->scales_diff[i][0] =3D val1; + st->scales_diff[i][1] =3D val2; + } + + return 0; +} + +static int ad4851_read_raw(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + int *val, int *val2, long info) +{ + struct ad4851_state *st =3D iio_priv(indio_dev); + + switch (info) { + case IIO_CHAN_INFO_SAMP_FREQ: + *val =3D st->sampling_freq; + return IIO_VAL_INT; + case IIO_CHAN_INFO_CALIBSCALE: + return ad4851_get_calibscale(st, chan->channel, val, val2); + case IIO_CHAN_INFO_SCALE: + return ad4851_get_scale(st, chan, val, val2); + case IIO_CHAN_INFO_CALIBBIAS: + return ad4851_get_calibbias(st, chan->channel, val); + case IIO_CHAN_INFO_OVERSAMPLING_RATIO: + return ad4851_get_oversampling_ratio(st, val); + default: + return -EINVAL; + } +} + +static int ad4851_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int val, int val2, long info) +{ + struct ad4851_state *st =3D iio_priv(indio_dev); + + switch (info) { + case IIO_CHAN_INFO_SAMP_FREQ: + return ad4851_set_sampling_freq(st, val); + case IIO_CHAN_INFO_SCALE: + return ad4851_set_scale(st, chan, val, val2); + case IIO_CHAN_INFO_CALIBSCALE: + return ad4851_set_calibscale(st, chan->channel, val, val2); + case IIO_CHAN_INFO_CALIBBIAS: + return ad4851_set_calibbias(st, chan->channel, val); + case IIO_CHAN_INFO_OVERSAMPLING_RATIO: + return ad4851_set_oversampling_ratio(st, chan, val); + default: + return -EINVAL; + } +} + +static int ad4851_update_scan_mode(struct iio_dev *indio_dev, + const unsigned long *scan_mask) +{ + struct ad4851_state *st =3D iio_priv(indio_dev); + unsigned int c; + int ret; + + for (c =3D 0; c < st->info->num_channels / 2; c++) { + if (test_bit(c, scan_mask)) + ret =3D iio_backend_chan_enable(st->back, c); + else + ret =3D iio_backend_chan_disable(st->back, c); + if (ret) + return ret; + } + + return 0; +} + +static int ad4851_read_avail(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + const int **vals, int *type, int *length, + long mask) +{ + struct ad4851_state *st =3D iio_priv(indio_dev); + + switch (mask) { + case IIO_CHAN_INFO_SCALE: + if (chan->differential) { + *vals =3D (const int *)st->scales_diff; + *type =3D IIO_VAL_INT_PLUS_MICRO; + /* Values are stored in a 2D matrix */ + *length =3D ARRAY_SIZE(ad4851_scale_avail_diff) * 2; + } else { + *vals =3D (const int *)st->scales_se; + *type =3D IIO_VAL_INT_PLUS_MICRO; + /* Values are stored in a 2D matrix */ + *length =3D ARRAY_SIZE(ad4851_scale_avail_se) * 2; + } + return IIO_AVAIL_LIST; + case IIO_CHAN_INFO_OVERSAMPLING_RATIO: + *vals =3D ad4851_oversampling_ratios; + *length =3D ARRAY_SIZE(ad4851_oversampling_ratios); + *type =3D IIO_VAL_INT; + return IIO_AVAIL_LIST; + default: + return -EINVAL; + } +} + +static const struct iio_scan_type ad4851_scan_type_16 =3D { + .sign =3D 's', + .realbits =3D 16, + .storagebits =3D 16, +}; + +static const struct iio_scan_type ad4851_scan_type_20_0[] =3D { + [AD4851_SCAN_TYPE_NORMAL] =3D { + .sign =3D 'u', + .realbits =3D 20, + .storagebits =3D 32, + }, + [AD4851_SCAN_TYPE_RESOLUTION_BOOST] =3D { + .sign =3D 'u', + .realbits =3D 24, + .storagebits =3D 32, + }, +}; + +static const struct iio_scan_type ad4851_scan_type_20_1[] =3D { + [AD4851_SCAN_TYPE_NORMAL] =3D { + .sign =3D 's', + .realbits =3D 20, + .storagebits =3D 32, + }, + [AD4851_SCAN_TYPE_RESOLUTION_BOOST] =3D { + .sign =3D 's', + .realbits =3D 24, + .storagebits =3D 32, + }, +}; + +static int ad4851_get_current_scan_type(const struct iio_dev *indio_dev, + const struct iio_chan_spec *chan) +{ + struct ad4851_state *st =3D iio_priv(indio_dev); + + return st->resolution_boost_enabled ? AD4851_SCAN_TYPE_RESOLUTION_BOOST + : AD4851_SCAN_TYPE_NORMAL; +} + +#define AD4851_IIO_CHANNEL(index, ch, diff) \ + .type =3D IIO_VOLTAGE, \ + .info_mask_separate =3D BIT(IIO_CHAN_INFO_CALIBSCALE) | \ + BIT(IIO_CHAN_INFO_CALIBBIAS) | \ + BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all =3D BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ + .info_mask_shared_by_all_available =3D \ + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ + .info_mask_separate_available =3D BIT(IIO_CHAN_INFO_SCALE), \ + .indexed =3D 1, \ + .differential =3D diff, \ + .channel =3D ch, \ + .channel2 =3D ch + (diff * 8), \ + .scan_index =3D index, \ + +#define AD4858_IIO_CHANNEL(index, ch, diff, bits) \ +{ \ + AD4851_IIO_CHANNEL(index, ch, diff) \ + .ext_scan_type =3D ad4851_scan_type_##bits##_##diff, \ + .num_ext_scan_type =3D ARRAY_SIZE(ad4851_scan_type_##bits##_##diff), \ +} + +#define AD4857_IIO_CHANNEL(index, ch, diff, bits) \ +{ \ + AD4851_IIO_CHANNEL(index, ch, diff) \ + .scan_type =3D { \ + .sign =3D 's', \ + .realbits =3D bits, \ + .storagebits =3D bits, \ + }, \ +} + +static const struct iio_chan_spec ad4858_channels[] =3D { + AD4858_IIO_CHANNEL(0, 0, 0, 20), + AD4858_IIO_CHANNEL(1, 0, 1, 20), + AD4858_IIO_CHANNEL(2, 1, 0, 20), + AD4858_IIO_CHANNEL(3, 1, 1, 20), + AD4858_IIO_CHANNEL(4, 2, 0, 20), + AD4858_IIO_CHANNEL(5, 2, 1, 20), + AD4858_IIO_CHANNEL(6, 3, 0, 20), + AD4858_IIO_CHANNEL(7, 3, 1, 20), + AD4858_IIO_CHANNEL(8, 4, 0, 20), + AD4858_IIO_CHANNEL(9, 4, 1, 20), + AD4858_IIO_CHANNEL(10, 5, 0, 20), + AD4858_IIO_CHANNEL(11, 5, 1, 20), + AD4858_IIO_CHANNEL(12, 6, 0, 20), + AD4858_IIO_CHANNEL(13, 6, 1, 20), + AD4858_IIO_CHANNEL(14, 7, 0, 20), + AD4858_IIO_CHANNEL(15, 7, 1, 20), +}; + +static const struct iio_chan_spec ad4857_channels[] =3D { + AD4857_IIO_CHANNEL(0, 0, 0, 16), + AD4857_IIO_CHANNEL(1, 0, 1, 16), + AD4857_IIO_CHANNEL(2, 1, 0, 16), + AD4857_IIO_CHANNEL(3, 1, 1, 16), + AD4857_IIO_CHANNEL(4, 2, 0, 16), + AD4857_IIO_CHANNEL(5, 2, 1, 16), + AD4857_IIO_CHANNEL(6, 3, 0, 16), + AD4857_IIO_CHANNEL(7, 3, 1, 16), + AD4857_IIO_CHANNEL(8, 4, 0, 16), + AD4857_IIO_CHANNEL(9, 4, 1, 16), + AD4857_IIO_CHANNEL(10, 5, 0, 16), + AD4857_IIO_CHANNEL(11, 5, 1, 16), + AD4857_IIO_CHANNEL(12, 6, 0, 16), + AD4857_IIO_CHANNEL(13, 6, 1, 16), + AD4857_IIO_CHANNEL(14, 7, 0, 16), + AD4857_IIO_CHANNEL(15, 7, 1, 16), +}; + +static int ad4857_parse_channels(struct iio_dev *indio_dev) +{ + struct device *dev =3D indio_dev->dev.parent; + struct ad4851_state *st =3D iio_priv(indio_dev); + struct iio_chan_spec *ad4851_channels; + const struct iio_chan_spec ad4851_chan =3D AD4857_IIO_CHANNEL(0, 0, 0, 16= ); + const struct iio_chan_spec ad4851_chan_diff =3D AD4857_IIO_CHANNEL(0, 0, = 1, 16); + unsigned int num_channels, index =3D 0, reg; + int ret; + + num_channels =3D device_get_child_node_count(dev); + if (num_channels > AD4851_MAX_CH_NR) + return dev_err_probe(dev, -EINVAL, "Too many channels: %u\n", + num_channels); + + ad4851_channels =3D devm_kcalloc(dev, num_channels, + sizeof(*ad4851_channels), GFP_KERNEL); + if (!ad4851_channels) + return -ENOMEM; + + indio_dev->channels =3D ad4851_channels; + indio_dev->num_channels =3D num_channels; + + device_for_each_child_node_scoped(dev, child) { + ret =3D fwnode_property_read_u32(child, "reg", ®); + if (ret) + return dev_err_probe(dev, ret, + "Missing channel number\n"); + if (fwnode_property_present(child, "diff-channels")) { + *ad4851_channels =3D ad4851_chan_diff; + ad4851_channels->scan_index =3D index++; + ad4851_channels->channel =3D reg; + ad4851_channels->channel2 =3D reg + AD4851_MAX_CH_NR; + } else { + *ad4851_channels =3D ad4851_chan; + ad4851_channels->scan_index =3D index++; + ad4851_channels->channel =3D reg; + ret =3D regmap_write(st->regmap, AD4851_REG_CHX_SOFTSPAN(reg), + AD4851_SOFTSPAN_0V_40V); + if (ret) + return ret; + } + ad4851_channels++; + } + + return 0; +} + +static int ad4858_parse_channels(struct iio_dev *indio_dev) +{ + struct device *dev =3D indio_dev->dev.parent; + struct ad4851_state *st =3D iio_priv(indio_dev); + struct iio_chan_spec *ad4851_channels; + const struct iio_chan_spec ad4851_chan =3D AD4858_IIO_CHANNEL(0, 0, 0, 20= ); + const struct iio_chan_spec ad4851_chan_diff =3D AD4858_IIO_CHANNEL(0, 0, = 1, 20); + unsigned int num_channels, index =3D 0, reg; + int ret; + + num_channels =3D device_get_child_node_count(dev); + if (num_channels > AD4851_MAX_CH_NR) + return dev_err_probe(dev, -EINVAL, "Too many channels: %u\n", + num_channels); + + ad4851_channels =3D devm_kcalloc(dev, num_channels, + sizeof(*ad4851_channels), GFP_KERNEL); + if (!ad4851_channels) + return -ENOMEM; + + indio_dev->channels =3D ad4851_channels; + indio_dev->num_channels =3D num_channels; + + device_for_each_child_node_scoped(dev, child) { + ret =3D fwnode_property_read_u32(child, "reg", ®); + if (ret) + return dev_err_probe(dev, ret, + "Missing channel number\n"); + if (fwnode_property_present(child, "diff-channels")) { + *ad4851_channels =3D ad4851_chan_diff; + ad4851_channels->scan_index =3D index++; + ad4851_channels->channel =3D reg; + ad4851_channels->channel2 =3D reg + AD4851_MAX_CH_NR; + ad4851_channels->ext_scan_type =3D ad4851_scan_type_20_1; + ad4851_channels->num_ext_scan_type =3D ARRAY_SIZE(ad4851_scan_type_20_1= ); + + } else { + *ad4851_channels =3D ad4851_chan; + ad4851_channels->scan_index =3D index++; + ad4851_channels->channel =3D reg; + ad4851_channels->ext_scan_type =3D ad4851_scan_type_20_0; + ad4851_channels->num_ext_scan_type =3D ARRAY_SIZE(ad4851_scan_type_20_0= ); + ret =3D regmap_write(st->regmap, AD4851_REG_CHX_SOFTSPAN(reg), + AD4851_SOFTSPAN_0V_40V); + if (ret) + return ret; + } + ad4851_channels++; + } + + return 0; +} + +static const struct ad4851_chip_info ad4851_info =3D { + .name =3D "ad4851", + .product_id =3D 0x67, + .max_sample_rate_hz =3D 250 * KILO, + .resolution =3D 16, + .parse_channels =3D ad4857_parse_channels, +}; + +static const struct ad4851_chip_info ad4852_info =3D { + .name =3D "ad4852", + .product_id =3D 0x66, + .max_sample_rate_hz =3D 250 * KILO, + .resolution =3D 20, + .parse_channels =3D ad4858_parse_channels, +}; + +static const struct ad4851_chip_info ad4853_info =3D { + .name =3D "ad4853", + .product_id =3D 0x65, + .max_sample_rate_hz =3D 1 * MEGA, + .resolution =3D 16, + .parse_channels =3D ad4857_parse_channels, +}; + +static const struct ad4851_chip_info ad4854_info =3D { + .name =3D "ad4854", + .product_id =3D 0x64, + .max_sample_rate_hz =3D 1 * MEGA, + .resolution =3D 20, + .parse_channels =3D ad4858_parse_channels, +}; + +static const struct ad4851_chip_info ad4855_info =3D { + .name =3D "ad4855", + .product_id =3D 0x63, + .max_sample_rate_hz =3D 250 * KILO, + .resolution =3D 16, + .parse_channels =3D ad4857_parse_channels, +}; + +static const struct ad4851_chip_info ad4856_info =3D { + .name =3D "ad4856", + .product_id =3D 0x62, + .max_sample_rate_hz =3D 250 * KILO, + .resolution =3D 20, + .parse_channels =3D ad4858_parse_channels, +}; + +static const struct ad4851_chip_info ad4857_info =3D { + .name =3D "ad4857", + .product_id =3D 0x61, + .max_sample_rate_hz =3D 1 * MEGA, + .resolution =3D 16, + .channels =3D ad4857_channels, + .num_channels =3D ARRAY_SIZE(ad4857_channels), + .parse_channels =3D ad4857_parse_channels, +}; + +static const struct ad4851_chip_info ad4858_info =3D { + .name =3D "ad4858", + .product_id =3D 0x60, + .max_sample_rate_hz =3D 1 * MEGA, + .resolution =3D 20, + .parse_channels =3D ad4858_parse_channels, +}; + +static const struct ad4851_chip_info ad4858i_info =3D { + .name =3D "ad4858i", + .product_id =3D 0x6F, + .max_sample_rate_hz =3D 1 * MEGA, + .resolution =3D 20, + .parse_channels =3D ad4858_parse_channels, +}; + +static const struct iio_info ad4851_iio_info =3D { + .debugfs_reg_access =3D ad4851_reg_access, + .read_raw =3D ad4851_read_raw, + .write_raw =3D ad4851_write_raw, + .update_scan_mode =3D ad4851_update_scan_mode, + .get_current_scan_type =3D &ad4851_get_current_scan_type, + .read_avail =3D ad4851_read_avail, +}; + +static const struct regmap_config regmap_config =3D { + .reg_bits =3D 16, + .val_bits =3D 8, + .read_flag_mask =3D BIT(7), +}; + +static const char * const ad4851_power_supplies[] =3D { + "vcc", "vdd", "vee", "vio", +}; + +static int ad4851_probe(struct spi_device *spi) +{ + struct iio_dev *indio_dev; + struct device *dev =3D &spi->dev; + struct ad4851_state *st; + int ret; + + indio_dev =3D devm_iio_device_alloc(dev, sizeof(*st)); + if (!indio_dev) + return -ENOMEM; + + st =3D iio_priv(indio_dev); + st->spi =3D spi; + + ret =3D devm_mutex_init(dev, &st->lock); + if (ret) + return ret; + + ret =3D devm_regulator_bulk_get_enable(dev, + ARRAY_SIZE(ad4851_power_supplies), + ad4851_power_supplies); + if (ret) + return dev_err_probe(dev, ret, + "failed to get and enable supplies\n"); + + ret =3D devm_regulator_get_enable_optional(dev, "vddh"); + if (ret < 0 && ret !=3D -ENODEV) + return dev_err_probe(dev, ret, "failed to enable vddh voltage\n"); + + ret =3D devm_regulator_get_enable_optional(dev, "vddl"); + if (ret < 0 && ret !=3D -ENODEV) + return dev_err_probe(dev, ret, "failed to enable vddl voltage\n"); + + st->vrefbuf =3D devm_regulator_get_optional(dev, "vrefbuf"); + if (IS_ERR(st->vrefbuf)) { + if (PTR_ERR(st->vrefbuf) !=3D -ENODEV) + return dev_err_probe(dev, PTR_ERR(st->vrefbuf), + "Failed to get vrefbuf regulator\n"); + } + + st->vrefio =3D devm_regulator_get_optional(dev, "vrefio"); + if (IS_ERR(st->vrefio)) { + if (PTR_ERR(st->vrefio) !=3D -ENODEV) + return dev_err_probe(dev, PTR_ERR(st->vrefio), + "Failed to get vrefio regulator\n"); + } + + st->pd_gpio =3D devm_gpiod_get_optional(dev, "pd", GPIOD_OUT_LOW); + if (IS_ERR(st->pd_gpio)) + return dev_err_probe(dev, PTR_ERR(st->pd_gpio), + "Error on requesting pd GPIO\n"); + + st->cnv =3D devm_pwm_get(dev, NULL); + if (IS_ERR(st->cnv)) + return dev_err_probe(dev, PTR_ERR(st->cnv), + "Error on requesting pwm\n"); + + ret =3D devm_add_action_or_reset(&st->spi->dev, ad4851_pwm_disable, + st->cnv); + if (ret) + return ret; + + st->info =3D spi_get_device_match_data(spi); + if (!st->info) + return -ENODEV; + + st->regmap =3D devm_regmap_init_spi(spi, ®map_config); + if (IS_ERR(st->regmap)) + return PTR_ERR(st->regmap); + + ret =3D ad4851_scale_fill(st); + if (ret) + return ret; + + ret =3D ad4851_set_sampling_freq(st, HZ_PER_MHZ); + if (ret) + return ret; + + ret =3D ad4851_setup(st); + if (ret) + return ret; + + indio_dev->name =3D st->info->name; + indio_dev->info =3D &ad4851_iio_info; + indio_dev->modes =3D INDIO_DIRECT_MODE; + + ret =3D st->info->parse_channels(indio_dev); + if (ret) + return ret; + + st->back =3D devm_iio_backend_get(dev, NULL); + if (IS_ERR(st->back)) + return PTR_ERR(st->back); + + ret =3D devm_iio_backend_request_buffer(dev, st->back, indio_dev); + if (ret) + return ret; + + ret =3D devm_iio_backend_enable(dev, st->back); + if (ret) + return ret; + + ret =3D ad4851_calibrate(st); + if (ret) + return ret; + + return devm_iio_device_register(dev, indio_dev); +} + +static const struct of_device_id ad4851_of_match[] =3D { + { .compatible =3D "adi,ad4851", .data =3D &ad4851_info, }, + { .compatible =3D "adi,ad4852", .data =3D &ad4852_info, }, + { .compatible =3D "adi,ad4853", .data =3D &ad4853_info, }, + { .compatible =3D "adi,ad4854", .data =3D &ad4854_info, }, + { .compatible =3D "adi,ad4855", .data =3D &ad4855_info, }, + { .compatible =3D "adi,ad4856", .data =3D &ad4856_info, }, + { .compatible =3D "adi,ad4857", .data =3D &ad4857_info, }, + { .compatible =3D "adi,ad4858", .data =3D &ad4858_info, }, + { .compatible =3D "adi,ad4858i", .data =3D &ad4858i_info, }, + { } +}; + +static const struct spi_device_id ad4851_spi_id[] =3D { + { "ad4851", (kernel_ulong_t)&ad4851_info }, + { "ad4852", (kernel_ulong_t)&ad4852_info }, + { "ad4853", (kernel_ulong_t)&ad4853_info }, + { "ad4854", (kernel_ulong_t)&ad4854_info }, + { "ad4855", (kernel_ulong_t)&ad4855_info }, + { "ad4856", (kernel_ulong_t)&ad4856_info }, + { "ad4857", (kernel_ulong_t)&ad4857_info }, + { "ad4858", (kernel_ulong_t)&ad4858_info }, + { "ad4858i", (kernel_ulong_t)&ad4858i_info }, + { } +}; +MODULE_DEVICE_TABLE(spi, ad4851_spi_id); + +static struct spi_driver ad4851_driver =3D { + .probe =3D ad4851_probe, + .driver =3D { + .name =3D "ad4851", + .of_match_table =3D ad4851_of_match, + }, + .id_table =3D ad4851_spi_id, +}; +module_spi_driver(ad4851_driver); + +MODULE_AUTHOR("Sergiu Cuciurean "); +MODULE_AUTHOR("Dragos Bogdan "); +MODULE_AUTHOR("Antoniu Miclaus "); +MODULE_DESCRIPTION("Analog Devices AD4851 DAS driver"); +MODULE_LICENSE("GPL"); +MODULE_IMPORT_NS(IIO_BACKEND); --=20 2.47.1