From patchwork Mon May 13 14:33:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arthur Becker X-Patchwork-Id: 13663501 Received: from ZR1P278CU001.outbound.protection.outlook.com (mail-switzerlandnorthazon11022019.outbound.protection.outlook.com [52.101.186.19]) (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 533FB23BE for ; Mon, 13 May 2024 14:33:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.186.19 ARC-Seal: i=3; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715610830; cv=fail; b=oZT/z9wIrmZM4H8Dl13i5vS6jaPRrM+u288QZWVaizL6yTSRjhOmvTxBfBo/aG6P7kVVOi7/jVc3NlCEu4OTGgs3Rl3RFT/SsLSXjS2sDTvefWqi3jLuWItPY9ptBbxVhzEapL5rer26cwiiBT7zghshNqstL6gLqPLYP6MD388= ARC-Message-Signature: i=3; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715610830; c=relaxed/simple; bh=f5XuU3NLqwsJ+AK2oqdG3e9pFWvAwhsIVS3FwkKVoxM=; h=From:To:CC:Subject:Date:Message-ID:Content-Type:MIME-Version; b=VB1IVqtE1/OgHRml/Nz1urlNb3JVe2SxrqzQ1f4JT4HQqHztIglxKgvFvbvJb+xHrexvvsxoDBZe75DJgXZX50XDsSy19qg5BLSDnGxjrJj0fYo2GldO+oCuamGxodSwfL1LHRxOuNvU73f/No5hLgOIVMula4lLR4f8NPZhNvc= ARC-Authentication-Results: i=3; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=sentec.com; spf=pass smtp.mailfrom=sentec.com; dkim=pass (1024-bit key) header.d=sentec.com header.i=@sentec.com header.b=X+VKxO2e; dkim=pass (1024-bit key) header.d=sentec.com header.i=@sentec.com header.b=X+VKxO2e; arc=fail smtp.client-ip=52.101.186.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=sentec.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sentec.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=sentec.com header.i=@sentec.com header.b="X+VKxO2e"; dkim=pass (1024-bit key) header.d=sentec.com header.i=@sentec.com header.b="X+VKxO2e" ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=irllIzV68Z2hoy3F4Dc7ZtHjmyc/M4u9RsFv8UgnEUm98qmyn2zzt3TIqVHKc8mSFNuGidLOGBaOOwliI5O7vLBpgQ2ltDrTGnVy8wrJyteKlg9bvQeU4jAUA0eZZerZ+ro4yUyeKqZ4vc2dd8YOoKESr5iH2VU5iqwwr1e5P0psUq1fP9ECj/6J7lB2FADRoyhGZFRoDZAgTKmpOfhUpPkikSmNyZkt/VrgTrZ9/G6PvX6DeeX80MN0YlFZ5YfgdFUn4YGGT3jJJQuZhyGvEOykEKUUl9fVkMwUHpJDvvHqLp1dn1C7djRrwRm0NP1Q1wtOkz3w7O86bKFSO7LbFQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=6TYo++2Ns/jjo+O9Ao1DGC2nuDxzhCAxRxhHAbBu7RM=; b=HR8AfBWG7vVENbkW+83OuXzwQ7YOR+HqU54FvMa7lbo7pUZo5J/JX0mu6rGH5ksVXqF8/1g6dvKkTyvm3IcIKt5lYh1yoN9M4nKcqNGwCWzASwymgNCONZ7uK7x7y7FHO+LrtF8LQnZ9van3SGKm2lqSONoKE2ts1s7dP2GfvtBoXbuyUygS6TBjYwUWAAeHtZnQjXZ1LiekXrDqhKweEQzOIYFixfeVPZoXgbZ05H5i09f/f4zX6z8Gkp/hVgBRQ72iP70L/OmLa5ZNNbDKcCVS6RPEg0DoI4QaQ5rs1eJK/X9KbEkFZ83VE5mlW9zmluWDw9DK0u998SIE5fCUgw== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 13.74.137.176) smtp.rcpttodomain=kernel.org smtp.mailfrom=sentec.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=sentec.com; dkim=pass (signature was verified) header.d=sentec.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=sentec.com] dkim=[1,1,header.d=sentec.com] dmarc=[1,1,header.from=sentec.com]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sentec.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6TYo++2Ns/jjo+O9Ao1DGC2nuDxzhCAxRxhHAbBu7RM=; b=X+VKxO2em21bbls1MCRRpArgezExskgZgKw40ahVAFGVDgvLdYIrObFExo2Kg9QUYXsadAsfrlOXVHHaeXHDSn5HCcWZPQ4vTxKJick1lRsnB4PVE6fd+MTkNG+Z+JzpMQJz3BREgZGaKL0bd0yc120OwTIy+yNEmW5hMzWt7lQ= Received: from AS9PR05CA0038.eurprd05.prod.outlook.com (2603:10a6:20b:489::25) by GVAP278MB0150.CHEP278.PROD.OUTLOOK.COM (2603:10a6:710:3b::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.55; Mon, 13 May 2024 14:33:45 +0000 Received: from AMS0EPF00000191.eurprd05.prod.outlook.com (2603:10a6:20b:489:cafe::9b) by AS9PR05CA0038.outlook.office365.com (2603:10a6:20b:489::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.55 via Frontend Transport; Mon, 13 May 2024 14:33:44 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 13.74.137.176) smtp.mailfrom=sentec.com; dkim=pass (signature was verified) header.d=sentec.com;dmarc=pass action=none header.from=sentec.com; Received-SPF: Pass (protection.outlook.com: domain of sentec.com designates 13.74.137.176 as permitted sender) receiver=protection.outlook.com; client-ip=13.74.137.176; helo=eu21-emailsignatures-cloud.codetwo.com; pr=C Received: from eu21-emailsignatures-cloud.codetwo.com (13.74.137.176) by AMS0EPF00000191.mail.protection.outlook.com (10.167.16.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7587.21 via Frontend Transport; Mon, 13 May 2024 14:33:43 +0000 Received: from ZRAP278CU002.outbound.protection.outlook.com (40.93.85.1) by eu21-emailsignatures-cloud.codetwo.com with CodeTwo SMTP Server (TLS12) via SMTP; Mon, 13 May 2024 14:33:42 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LALiNpK8XKNgV8YkHqc1XZ3IU2ePke3hS+OOv4ERfnXbnYoUa27FjLmgyx8UJE2qmu0GlcDUJt2zWYk9hC9pLZghMoCcKTejAkvuuQzxo/21yhv5rzU1icaskj9Fz50mLseBgxMm63MTssf2HuEoDNWLamcbGrh1keOH7nWDZbZ0Z9dh3/fT68s3L5MVnoD6H1XvhMvzhk23yH5prVNqzDCLBSBLXJ8kPzLrKUHxuPb2Z2lebrTwvwNXsiYinjOqxIFkOWZ0NVP7xmLr7FMthSfODN7e1oYcU6tjnF1pT3I2Yf7I0q+c40IJKVroj8JLoD88kfyjS3J7a3mT0Fdgcw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=6TYo++2Ns/jjo+O9Ao1DGC2nuDxzhCAxRxhHAbBu7RM=; b=VHTVhogPccnL/J5VhsKq67Pwsyn6j75eyHuwrnOrya6dHSnKIkXlf2g4CR9+pKs4Nq1GF2VGyYxeLr5sC6TucwGol3VFi+1kTsrPeW03wvY5fTeORnl9/OLBYLrheQfCPdFPcTJysTmBEc4/JVps+AZmpzOYz/4zk9SyqtJsy071RKth5vZHC0YNPf5LyY571ZetI1ea50zh+FatJvKW0XY+fKpzQ/ZpOVuj4ONtLlFem6bNy/uuPVV8hnw6rdXhuM4JNTG86RqgsU+Ox8TW0Kjp812HyeoeqpwhBsphgSLWVZxKYPv0KKC7JzZWGRsQpssgrPBw8JZM/dqSs7DmGg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=sentec.com; dmarc=pass action=none header.from=sentec.com; dkim=pass header.d=sentec.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sentec.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6TYo++2Ns/jjo+O9Ao1DGC2nuDxzhCAxRxhHAbBu7RM=; b=X+VKxO2em21bbls1MCRRpArgezExskgZgKw40ahVAFGVDgvLdYIrObFExo2Kg9QUYXsadAsfrlOXVHHaeXHDSn5HCcWZPQ4vTxKJick1lRsnB4PVE6fd+MTkNG+Z+JzpMQJz3BREgZGaKL0bd0yc120OwTIy+yNEmW5hMzWt7lQ= Received: from ZR1P278MB1117.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:58::13) by ZR1P278MB1104.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:5b::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.55; Mon, 13 May 2024 14:33:39 +0000 Received: from ZR1P278MB1117.CHEP278.PROD.OUTLOOK.COM ([fe80::44a0:22a7:f760:f8f]) by ZR1P278MB1117.CHEP278.PROD.OUTLOOK.COM ([fe80::44a0:22a7:f760:f8f%6]) with mapi id 15.20.7544.052; Mon, 13 May 2024 14:33:39 +0000 From: Arthur Becker To: Jonathan Cameron CC: "linux-iio@vger.kernel.org" Subject: [PATCH V2] iio: light: driver for Vishay VEML6040 Thread-Topic: [PATCH V2] iio: light: driver for Vishay VEML6040 Thread-Index: AQHapT/pMyXRHcRfmUyP13y9qgd2bA== Date: Mon, 13 May 2024 14:33:39 +0000 Message-ID: Accept-Language: en-GB, de-DE, en-US Content-Language: en-GB X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=sentec.com; x-ms-traffictypediagnostic: ZR1P278MB1117:EE_|ZR1P278MB1104:EE_|AMS0EPF00000191:EE_|GVAP278MB0150:EE_ X-MS-Office365-Filtering-Correlation-Id: 6a3b3b54-2c2f-4fba-eaf6-08dc7359b169 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0;ARA:13230031|376005|366007|1800799015|38070700009; X-Microsoft-Antispam-Message-Info-Original: =?iso-8859-1?q?Zm+HigmgstkME278q?= =?iso-8859-1?q?ssJE1DAWW2nnUcAYN4A4a6YWSrbWwKKvv5KScsh7pytPWXzOD1L8FQXDENgc?= =?iso-8859-1?q?CA8jB1PXXmbkk9V4WIoE/jHHOIyIlVc4hfGSobMtq5MvTdqSh/cS6r8EX2ae?= =?iso-8859-1?q?aEp8cgPLGrqlFYdPB++5p2TenZHL6QkXXnscWLNTZ0lITKeZhrPt9Ifw9uMf?= =?iso-8859-1?q?HtBSzw+NH9/WLKVU/+yngre4XEFMDKYdywKP0Rq6RBpduh4sX1hrp9/9/qzN?= =?iso-8859-1?q?/JFniKWE7TtiBCmAsnva8qkmRjuEaO0YlyPhGyMBhTacNaZpRvuy9XtSbDlr?= =?iso-8859-1?q?X43fa1PHf/aZ++2/7e6TAIKCwj5/5vAl5NszGkZgfwbb2yKNbMvMQXtJNIYJ?= =?iso-8859-1?q?xBq0HxhraZWFv2PdxxU/3Jf0qUDHxqSfymZInfO1psg9Af5JhusEMN4BS/q1?= =?iso-8859-1?q?dFvW4MRsBMKhanO3sOdVft4Vqw4fELWKSb94b5vDzsETPsvp04pSf6G6B7az?= =?iso-8859-1?q?4RUWJJSNASxdohpx66IfdJwRr+bQcuNfyiyQexuja94Tb/sQ5LuauB2/w0f8?= =?iso-8859-1?q?zaw19mBZuSE5BdEu0d5gfDORJOwdLMZ3dvEHJGfq6/j0vFrNjbPWP8pXF8fG?= =?iso-8859-1?q?r/iH72W1/fbgkg8kREobyn46J4NPz9XUdNAP2jMO7WOv0geWSsru8+Vbvnqr?= =?iso-8859-1?q?ZImqepjYeou5FHoj4RW1QdkiEACQtnkK19U7p5nP968k2+iyxRYuAwVFX0AO?= =?iso-8859-1?q?6p3tiuvE+LZ8V0OPw+ZZKqEGYZz+kx6oic5gUAL9Df7dhQ5c5FlmUb5uABj+?= =?iso-8859-1?q?OKM98zfOefHOxuhOPYgTT0FYj1Gk+X8jc0I0UeyjaBZkqmxWutkRpVg3wZcF?= =?iso-8859-1?q?T1WU8W+IjYkXIckBMpeNAQOPuXRBkhuHM5hwjwuZTdLgmF+E0c2Hfm0rN8w4?= =?iso-8859-1?q?trfTscHRcZazrL8MS1ekXGQp/IVkKCr13tumX83Kqd+Q3HT3DQE4j0j41sVN?= =?iso-8859-1?q?bf2D1VBx/A8oHIm2isW/ninEfYS4FMFfwA7Nt+H9K80G5GUzqQ5FQBHbtOE+?= =?iso-8859-1?q?rsT+zHtm7vb3HKa6V1/sjBlaemCQWaNxiCSOIB12I0zJ028uTMravT02hnTf?= =?iso-8859-1?q?riaNBKZrxsfYZ/e6DFkq3JNiw9IsPdBqY6wDEypn3qS6eviDMdgUn3MnrO/j?= =?iso-8859-1?q?l0tDHz44Jr90bFs3y0jQG6eKK3c6aVyTXl03IA3vsqAW/qHhXz1lY4dEQFm3?= =?iso-8859-1?q?1dgItj0ysGimcSwemFm24DhoWjigExvVFtc8H4MQgrdohCL8Qn+eYno0PL7r?= =?iso-8859-1?q?4JQuTKOQlatRMAcVQ6TjZ6C3A=3D=3D?= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:ZR1P278MB1117.CHEP278.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230031)(376005)(366007)(1800799015)(38070700009);DIR:OUT;SFP:1102; Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: ZR1P278MB1104 X-CodeTwo-MessageID: 0a89adf5-497c-4802-8cfe-f701a679ee03.20240513143342@eu21-emailsignatures-cloud.codetwo.com X-CodeTwoProcessed: true X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AMS0EPF00000191.eurprd05.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 368e6584-5e3a-4292-0e9c-08dc7359ae85 X-Microsoft-Antispam: BCL:0;ARA:13230031|35042699013|82310400017|36860700004|376005|1800799015; X-Microsoft-Antispam-Message-Info: =?iso-8859-1?q?t5kwZBPBPC0rWF63mxJULfCbgy?= =?iso-8859-1?q?USmpw5bf+KPjjMjm/17wgmvWAqPvWbRtlDKU/aYed+LJejfQ9ydKgmOQgUhj?= =?iso-8859-1?q?Uxf6fWKKWupsWF6+hoj4xSldvT6pHwNlapkCKaeBwICfXzG5X3lak9lIng2+?= =?iso-8859-1?q?kojk+yLP8QtMkkBFtQ0BAheOLn/b6NPWBlalM5fMhhMgP9XcveFd4+lDf5uB?= =?iso-8859-1?q?3sg/ljtveJEmOY1xb3dD2a0ctlZOyvf7dYgz94hnj2uop7KZVXHZiRjpffES?= =?iso-8859-1?q?G4cR6PlJgM0ohtjCWvVDZiR9zBRBHwP7HwLKLVs1Ogk3c5ZrTloz/URV8HMq?= =?iso-8859-1?q?fM9e1D2INLaC9O8qLfCD1zJvWWCDpHZ4EP+i7pvyqic48d8Y8n36DF8rX7S1?= =?iso-8859-1?q?i1i009mOs/cqlH0Zc39j/JaAlETWDehrrICkDau6+fUeYahMQts+aphjDPRP?= =?iso-8859-1?q?646GbjO1SNsAgOjvNXXPVlXc7XRYVSdy4U7PaFFYrXBIrDtF0NncNm3tE82V?= =?iso-8859-1?q?hJkyzjKihX0IjBG6QD9IFD8NWa1lDGHY4CWCl7741NiRJ9qt5Ia6eVMeGxJH?= =?iso-8859-1?q?h2Zvug+1RB0HobROy+cC689pe0KA95ZIfQH3Th7YjdgP0Ga6CJSxg9arf62+?= =?iso-8859-1?q?cwlyCP3Z+7B5TaMeiPjTpe6piSsZbe4jwx4SVDUncC8CtiWFVr8Zbx+mE4u7?= =?iso-8859-1?q?wy6ptSqQ/Uz6DBCg4QJh/XNgrfF5MMguTUVp1zfTatybmuktjKvYyOnhXJVp?= =?iso-8859-1?q?kO++ipC3AOC71lAXAmv4KK2DBoJuWxVF2RKQj/03hD1vQqzOIlx54MmhYY4J?= =?iso-8859-1?q?F3jgu6heMzd4X4/LnHa9ltzdOhd7GsGM/XyW8md/mMMFDuC09kt6cYjfzlQO?= =?iso-8859-1?q?dG3jHNQFxu0R0iKXSGTiVd1j6FmcR4po6x8yxhLeGvRuyQQuomVFtRGlYJXB?= =?iso-8859-1?q?4m08J6kdaiHl0W2uQXj+x/cYV6RF0u+SzTP1RF8dtVPlDu4q+dDO55mICG15?= =?iso-8859-1?q?GvlP4gUyHOHbajwfr1tMTILeFSLbhdxytOg7wiomaEbZJa5cJ23GAZEQrcR6?= =?iso-8859-1?q?QiSpQ0qYwfRGr42IkuBvFGuymdRv8BPvHLYgIME8gu003hpHF0K4PUTj3VPB?= =?iso-8859-1?q?/xOSKpQr1AOq0Z0xQh2WIoXe7UqZ9IAw7dwdIxF9U6hdm52UEV1RDQ8s32tP?= =?iso-8859-1?q?O01yVpHTnbdKWtTumcyS9mBxVANRC9zXoW6XMpkIM0TGweHPsU/bvR84KfEF?= =?iso-8859-1?q?FVHwcXYE2aa3NjaT1O237L2uhzZTX4gIu5CbSYevuHFuBKdPf1zAWaEukPLv?= =?iso-8859-1?q?ocAitPVuFJd8RXIhoV+jYog0X/Dxp2nB1/2WkCpAhwLSmO8JBrAtl9NYVY?= X-Forefront-Antispam-Report: CIP:13.74.137.176;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:eu21-emailsignatures-cloud.codetwo.com;PTR:eu21-emailsignatures-cloud.codetwo.com;CAT:NONE;SFS:(13230031)(35042699013)(82310400017)(36860700004)(376005)(1800799015);DIR:OUT;SFP:1102; X-OriginatorOrg: sentec.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 May 2024 14:33:43.8997 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6a3b3b54-2c2f-4fba-eaf6-08dc7359b169 X-MS-Exchange-CrossTenant-Id: 0cfe5cb4-0f5d-4077-ac2f-a1a82ad165a3 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0cfe5cb4-0f5d-4077-ac2f-a1a82ad165a3;Ip=[13.74.137.176];Helo=[eu21-emailsignatures-cloud.codetwo.com] X-MS-Exchange-CrossTenant-AuthSource: AMS0EPF00000191.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: GVAP278MB0150 Implements driver for the Vishay VEML6040 rgbw light sensor. Included functionality: setting the integration time and reading the raw values for the four channels Not yet implemented: setting the measurements to 'Manual Force Mode' (Auto measurements off, and adding a measurement trigger) Datasheet: https://www.vishay.com/docs/84276/veml6040.pdf signed-off-by: Arthur Becker --- V1 -> V2: Addressed review comments. DT-bindings in separate patch drivers/iio/light/Kconfig | 11 ++ drivers/iio/light/Makefile | 1 + drivers/iio/light/veml6040.c | 307 +++++++++++++++++++++++++++++++++++ 3 files changed, 319 insertions(+) create mode 100644 drivers/iio/light/veml6040.c diff --git a/drivers/iio/light/Kconfig b/drivers/iio/light/Kconfig index fd5a9879a582..7ff517b728ec 100644 --- a/drivers/iio/light/Kconfig +++ b/drivers/iio/light/Kconfig @@ -654,6 +654,17 @@ config VEML6030 To compile this driver as a module, choose M here: the module will be called veml6030. +config VEML6040 + tristate "VEML6040 RGBW light sensor" + select REGMAP_I2C + depends on I2C + help + Say Y here if you want to build a driver for the Vishay VEML6040 + RGBW light sensor. + + To compile this driver as a module, choose M here: the + module will be called veml6040. + config VEML6070 tristate "VEML6070 UV A light sensor" depends on I2C diff --git a/drivers/iio/light/Makefile b/drivers/iio/light/Makefile index 2e5fdb33e0e9..ae957c88aa0c 100644 --- a/drivers/iio/light/Makefile +++ b/drivers/iio/light/Makefile @@ -61,6 +61,7 @@ obj-$(CONFIG_US5182D) += us5182d.o obj-$(CONFIG_VCNL4000) += vcnl4000.o obj-$(CONFIG_VCNL4035) += vcnl4035.o obj-$(CONFIG_VEML6030) += veml6030.o +obj-$(CONFIG_VEML6040) += veml6040.o obj-$(CONFIG_VEML6070) += veml6070.o obj-$(CONFIG_VEML6075) += veml6075.o obj-$(CONFIG_VL6180) += vl6180.o diff --git a/drivers/iio/light/veml6040.c b/drivers/iio/light/veml6040.c new file mode 100644 index 000000000000..9ce807d5484a --- /dev/null +++ b/drivers/iio/light/veml6040.c @@ -0,0 +1,307 @@ +#include +#include +#include +#include +#include +#include +#include + +/* VEML6040 Configuration Registers + * + * SD: Shutdown + * AF: Auto / Force Mode (Auto Measurements On:0, Off:1) + * TR: Trigger Measurement (when AF Bit is set) + * IT: Integration Time + */ +#define VEML6040_CONF_REG_RW 0x000 +#define VEML6040_CONF_SD_MSK BIT(0) +#define VEML6040_CONF_AF_MSK BIT(1) +#define VEML6040_CONF_TR_MSK BIT(2) +#define VEML6040_CONF_IT_MSK GENMASK(6, 4) +#define VEML6040_CONF_IT_40 0 +#define VEML6040_CONF_IT_80 1 +#define VEML6040_CONF_IT_160 2 +#define VEML6040_CONF_IT_320 3 +#define VEML6040_CONF_IT_640 4 +#define VEML6040_CONF_IT_1280 5 + +/* VEML6040 Read Only Registers */ +#define VEML6040_REG_R_RO 0x08 +#define VEML6040_REG_G_RO 0x09 +#define VEML6040_REG_B_RO 0x0A +#define VEML6040_REG_W_RO 0x0B + +static const int veml6040_int_time_avail[] = { 40, 80, 160, 320, 640, 1280 }; + +enum veml6040_chan { + CH_RED, + CH_GREEN, + CH_BLUE, + CH_WHITE, +}; + +struct veml6040_data { + struct i2c_client *client; + struct regmap *regmap; +}; + +static const struct regmap_config veml6040_regmap_config = { + .name = "veml6040_regmap", + .reg_bits = 8, + .val_bits = 16, + .max_register = VEML6040_REG_W_RO, + .val_format_endian = REGMAP_ENDIAN_LITTLE, +}; + +static int veml6040_read_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, int *val, + int *val2, long mask) +{ + int ret, reg, it_index; + struct veml6040_data *data = iio_priv(indio_dev); + struct regmap *regmap = data->regmap; + struct device *dev = &data->client->dev; + + switch (mask) { + case IIO_CHAN_INFO_RAW: + switch (chan->channel) { + case CH_RED: + ret = regmap_read(regmap, VEML6040_REG_R_RO, ®); + break; + case CH_GREEN: + ret = regmap_read(regmap, VEML6040_REG_G_RO, ®); + break; + case CH_BLUE: + ret = regmap_read(regmap, VEML6040_REG_B_RO, ®); + break; + case CH_WHITE: + ret = regmap_read(regmap, VEML6040_REG_W_RO, ®); + break; + default: + return -EINVAL; + } + if (ret) { + dev_err(dev, "iio-veml6040 - Can't read data %d\n", + ret); + return ret; + } + *val = reg; + return IIO_VAL_INT; + + case IIO_CHAN_INFO_INT_TIME: + ret = regmap_read(regmap, VEML6040_CONF_REG_RW, ®); + if (ret) { + dev_err(dev, "iio-veml6040 - Can't read data %d\n", + ret); + return ret; + } + it_index = FIELD_GET(VEML6040_CONF_IT_MSK, reg); + if (it_index >= ARRAY_SIZE(veml6040_int_time_avail)) { + dev_err(dev, + "iio-veml6040 - Invalid Integration Time Set"); + return -EINVAL; + } + *val = veml6040_int_time_avail[it_index]; + return IIO_VAL_INT; + + default: + return -EINVAL; + } +} + +static int veml6040_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, int val, + int val2, long mask) +{ + struct veml6040_data *data = iio_priv(indio_dev); + + switch (mask) { + case IIO_CHAN_INFO_INT_TIME: + for (int i = 0; i < ARRAY_SIZE(veml6040_int_time_avail); i++) { + if (veml6040_int_time_avail[i] == val) { + return regmap_update_bits( + data->regmap, VEML6040_CONF_REG_RW, + VEML6040_CONF_IT_MSK, + FIELD_PREP(VEML6040_CONF_IT_MSK, i)); + } + } + return -EINVAL; + default: + return -EINVAL; + } + return 0; +} + +static int veml6040_read_avail(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + const int **vals, int *type, int *length, + long mask) +{ + switch (mask) { + case IIO_CHAN_INFO_INT_TIME: + *length = ARRAY_SIZE(veml6040_int_time_avail); + *vals = veml6040_int_time_avail; + *type = IIO_VAL_INT; + return IIO_AVAIL_LIST; + + default: + return -EINVAL; + } +} + +static const struct iio_info veml6040_info = { + .read_raw = veml6040_read_raw, + .write_raw = veml6040_write_raw, + .read_avail = veml6040_read_avail, +}; + +static const struct iio_chan_spec veml6040_channels[] = { + { + .type = IIO_INTENSITY, + .channel = CH_RED, + .channel2 = IIO_MOD_LIGHT_RED, + .modified = 1, + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_INT_TIME), + .info_mask_shared_by_type_available = + BIT(IIO_CHAN_INFO_INT_TIME), + }, + { + .type = IIO_INTENSITY, + .channel = CH_GREEN, + .channel2 = IIO_MOD_LIGHT_GREEN, + .modified = 1, + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_INT_TIME), + .info_mask_shared_by_type_available = + BIT(IIO_CHAN_INFO_INT_TIME), + }, + { + .type = IIO_INTENSITY, + .channel = CH_BLUE, + .channel2 = IIO_MOD_LIGHT_BLUE, + .modified = 1, + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_INT_TIME), + .info_mask_shared_by_type_available = + BIT(IIO_CHAN_INFO_INT_TIME), + }, + { + .type = IIO_INTENSITY, + .channel = CH_WHITE, + .channel2 = IIO_MOD_LIGHT_CLEAR, + .modified = 1, + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_INT_TIME), + .info_mask_shared_by_type_available = + BIT(IIO_CHAN_INFO_INT_TIME), + } +}; + +static int veml6040_shutdown(struct veml6040_data *data) +{ + return regmap_update_bits(data->regmap, VEML6040_CONF_REG_RW, + VEML6040_CONF_SD_MSK, VEML6040_CONF_SD_MSK); +} + +static void veml6040_shutdown_action(void *data) +{ + veml6040_shutdown(data); +} + +static int veml6040_probe(struct i2c_client *client) +{ + struct veml6040_data *data; + struct iio_dev *indio_dev; + struct regmap *regmap; + int ret; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + return dev_err_probe(&client->dev, -EOPNOTSUPP, + "I2C adapter doesn't support plain I2C\n"); + } + + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); + if (!indio_dev) { + return dev_err_probe(&client->dev, -ENOMEM, + "IIO device allocation failed\n"); + } + + regmap = devm_regmap_init_i2c(client, &veml6040_regmap_config); + if (IS_ERR(regmap)) { + return dev_err_probe(&client->dev, PTR_ERR(regmap), + "Regmap setup failed\n"); + } + + data = iio_priv(indio_dev); + i2c_set_clientdata(client, indio_dev); + data->client = client; + data->regmap = regmap; + + indio_dev->name = "veml6040"; + indio_dev->info = &veml6040_info; + indio_dev->channels = veml6040_channels; + indio_dev->num_channels = ARRAY_SIZE(veml6040_channels); + indio_dev->modes = INDIO_DIRECT_MODE; + + ret = regmap_update_bits( + data->regmap, VEML6040_CONF_REG_RW, VEML6040_CONF_IT_MSK, + FIELD_PREP(VEML6040_CONF_IT_MSK, VEML6040_CONF_IT_40)); + + if (ret) { + return dev_err_probe(&client->dev, ret, + "Could not set Integration Time: %d\n", + ret); + } + + ret = regmap_update_bits(data->regmap, VEML6040_CONF_REG_RW, + VEML6040_CONF_AF_MSK, + FIELD_PREP(VEML6040_CONF_AF_MSK, 0)); + if (ret) { + return dev_err_probe(&client->dev, ret, + "Could not set Automode: %d\n", ret); + } + + ret = regmap_update_bits(data->regmap, VEML6040_CONF_REG_RW, + VEML6040_CONF_SD_MSK, + FIELD_PREP(VEML6040_CONF_SD_MSK, 0)); + if (ret) { + return dev_err_probe(&client->dev, ret, + "Could not set Enable: %d\n", ret); + } + + ret = devm_add_action_or_reset(&client->dev, veml6040_shutdown_action, + data); + if (ret) { + return dev_err_probe(&client->dev, ret, + "Could not add shutdown action: %d\n", + ret); + } + + return devm_iio_device_register(&client->dev, indio_dev); +} + +static const struct i2c_device_id veml6040_id_table[] = { { "veml6040", 0 }, + {} }; +MODULE_DEVICE_TABLE(i2c, veml6040_id_table); + +static const struct of_device_id veml6040_of_match[] = { + { .compatible = "vishay,veml6040" }, + {} +}; +MODULE_DEVICE_TABLE(of, veml6040_of_match); + +static struct i2c_driver veml6040_driver = { + .probe = veml6040_probe, + .id_table = veml6040_id_table, + .driver = { + .name = "veml6040", + .of_match_table = veml6040_of_match, + }, +}; + +module_i2c_driver(veml6040_driver); + +MODULE_DESCRIPTION("veml6040 RGBW light sensor driver"); +MODULE_AUTHOR("Arthur Becker "); +MODULE_LICENSE("GPL");