From patchwork Mon May 6 11:43:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arthur Becker X-Patchwork-Id: 13655336 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 395201DFE4 for ; Mon, 6 May 2024 11:43:58 +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=1714995842; cv=fail; b=aAX2LgGhc24+KP7npSf54VdLw7gyECtHKTT4EVdjM3vzR/MiBDpnt32yphHVJo0QEcckCX5R25OFZjwaw/sJivB4CZShrPuoOmwOeGkVKBAnWE3TH5BIpR1uBmhqn/x0EqvqB9U54zCjVTMMUxH7XbxfPz8pUtYj3TpVj1tAvqs= ARC-Message-Signature: i=3; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714995842; c=relaxed/simple; bh=kHRov5QxNfSL8hQEDlblPHZt0i/2hBmS+IoA6dI32AA=; h=From:To:CC:Subject:Date:Message-ID:Content-Type:MIME-Version; b=QycijrSnY62U66kiS2nZYwSnKG0GOk0FPuoBD/9k0In1OJTEzJSjxFaqP6np3AB3ec7IharoBGyvM5/9luTS4KvDKC5qIXs3rVdyQGm7WZ7j2p61y5B1CuiKXHW1bAyhK33IrDdz2ZCsZ5JYnB9/Xc6a9tDd+6BG0uR4mCn+s0s= 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=CnVt+EZb; dkim=pass (1024-bit key) header.d=sentec.com header.i=@sentec.com header.b=CnVt+EZb; 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="CnVt+EZb"; dkim=pass (1024-bit key) header.d=sentec.com header.i=@sentec.com header.b="CnVt+EZb" ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=fUQzgJYZW84IqLg1fvCUwCH67clCLi/cHbyAtH6qrdXZVhgtJFYclTfjmSuid/H2ydhpzZ1qCCoEhKP1SrQro/38YvIgZ3OQ8lOzUaZxtfQ0pmHXRf6KTj7dj3Vjqf8K67BhBuibE/evaWu2cluGW/dODnRkRujAXHTNbiENvXWSKQz+qMW2OAbet4VZ4SdThnQujmRwm210ZNcysEWYFh5hRe+6o/38xBq6Ed3qz+tAwFzEQIbkSEoiZejI1w4voUACslZXZaZ1TTsPdzCZUGq16PMNkzmXHoKIauQklfndNi1le2ANeDkpUszhdBmxDFjV7dpzi/JJc+RFFDkkPA== 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=kh8PC8fxrdGGFChO8Z32Gh0ibOPKVMRmJZqXGbL3Ljo=; b=cylAmIv4UJ+HC+GeoblvKMjSVB1HIxNHcdaar9DyJ7xX9IdyGS59bDdFkoVJwoYIC/ah5iIy3WpCfIAwOsf+l5V5DjuehtIdbiyTP+0w+2VBNtJJGt5THPZ7tlOlK6ZM1LnM8orSES/Qgug98I5PbiMxX1ulcKhYnZIVLS7/wwMU+BKfJF/rMNw223AkPdqzRpBxUwHoJkzpHZCFQucrPlP0m8rt9oRiMfpcBkvKH1ScK337CYPQbQfMu7K0wxPWbiHymU5Xspmun1ZH9/ellAjZrOCYus+AScKAEJFY1azauJBk9rRgotEeT98ga+0w9uTHpbZidzTOf2c5zjEmAA== 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=kh8PC8fxrdGGFChO8Z32Gh0ibOPKVMRmJZqXGbL3Ljo=; b=CnVt+EZbR2mHkTjcuTtSS/GFMs7j3IedkBDL7ts/nT8qj+cS+c/QsI4sDsjLXBSL6KlV7ZImARcVeDr5X3wOm9DK0STkPuds+ixuPOg3lfYoPUmHerVsyAqxbLbnwJgSQWmA84/Uf3UUu/RbKc8R6XbgyrgiSLVrJbg7qkVDS3E= Received: from DUZPR01CA0143.eurprd01.prod.exchangelabs.com (2603:10a6:10:4bd::8) by GV0P278MB0968.CHEP278.PROD.OUTLOOK.COM (2603:10a6:710:54::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.42; Mon, 6 May 2024 11:43:55 +0000 Received: from DU2PEPF0001E9BF.eurprd03.prod.outlook.com (2603:10a6:10:4bd:cafe::2f) by DUZPR01CA0143.outlook.office365.com (2603:10a6:10:4bd::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.27 via Frontend Transport; Mon, 6 May 2024 11:43:55 +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 DU2PEPF0001E9BF.mail.protection.outlook.com (10.167.8.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7519.19 via Frontend Transport; Mon, 6 May 2024 11:43:54 +0000 Received: from ZR1P278CU001.outbound.protection.outlook.com (40.93.85.10) by eu21-emailsignatures-cloud.codetwo.com with CodeTwo SMTP Server (TLS12) via SMTP; Mon, 06 May 2024 11:43:54 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VbRRzP8RFw55LC3kqSuZIMyrP7+51GiTdAtap9quxelpiEwaJbhr0vOhV9AhCsa/2OKHgqIgMjoAZEkbvOS0Qz7Lc/BpV7wTH7wk4ggYu1ohsqQkyI9/wAiVmpbnEod/dP6ib9Uuf4ELMaqVBjkR33B0pP5d5pAP2YF7zR6L2+JG2vgiAGjAxikREWPycO2JbKSVLQTvHCO2MDrKsJ+Zgwg5R6FtkKgvLNxH+Mpe7zPqqEAGQaXWm2fiVRTJdxKCJaTmNsT/9bboLxdZa0EvBz9RLcp+8qP6USjBuoVl5pgiu8cy/HkxFzPcHLEAeluDtRvHW4qhpKqQszq8xMVPYw== 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=kh8PC8fxrdGGFChO8Z32Gh0ibOPKVMRmJZqXGbL3Ljo=; b=HoVwHnisp/RAszAQo4xZHpgdxTvpd9coILOPn1JsdPfxzgcufPtecGIwMQ/Ojuv76qwJXsvRbK3w7TVo9etJSxgISe1Wgy9UAg8G8NN0csz6Nw/IaoQBVQ/uoNlUaEhAGrUP3f1hSiJPsuVlPCjY/bQ9jDYbBpniR0wJpXqzMkfF2Cu7qSinhgaJVy5hytUx5KrJU7rE2Q0Q+SKnVHX01AkEPbpNY99HzO0Y/ujmiJNut5yw5napasz6Wi9FG8CfcQO/w70rijwErQlvZTPRcI6HoIAxNIdFAa5OHlAj1r9vAk3ZjhhDKGB5Ut+PFhHD62MI5g0tLTNbu8RfkcY5gQ== 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=kh8PC8fxrdGGFChO8Z32Gh0ibOPKVMRmJZqXGbL3Ljo=; b=CnVt+EZbR2mHkTjcuTtSS/GFMs7j3IedkBDL7ts/nT8qj+cS+c/QsI4sDsjLXBSL6KlV7ZImARcVeDr5X3wOm9DK0STkPuds+ixuPOg3lfYoPUmHerVsyAqxbLbnwJgSQWmA84/Uf3UUu/RbKc8R6XbgyrgiSLVrJbg7qkVDS3E= Received: from ZR1P278MB1117.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:58::13) by ZR2P278MB1053.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:5d::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.41; Mon, 6 May 2024 11:43:52 +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.041; Mon, 6 May 2024 11:43:52 +0000 From: Arthur Becker To: Jonathan Cameron CC: "linux-iio@vger.kernel.org" Subject: [PATCH] iio: light: driver for Vishay VEML6040 Thread-Topic: [PATCH] iio: light: driver for Vishay VEML6040 Thread-Index: AQHan6iN9MdWOVBjQ0y2Op+4FC4vyw== Date: Mon, 6 May 2024 11:43:51 +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_|ZR2P278MB1053:EE_|DU2PEPF0001E9BF:EE_|GV0P278MB0968:EE_ X-MS-Office365-Filtering-Correlation-Id: f43e020c-5681-4000-61bf-08dc6dc1cf04 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0;ARA:13230031|366007|376005|1800799015|38070700009; X-Microsoft-Antispam-Message-Info-Original: =?iso-8859-1?q?nO7IUjZOpFLlf/ZgL?= =?iso-8859-1?q?dR378Ozz3krgMJScJJA81HOeSgukyVDUrSxbU29irH8/z90EeADcTXu5xbu3?= =?iso-8859-1?q?nlzdP1ZRILI/N86TTpNxbXPbq5P4mWAoo3W2oAq9NMsRDSfT7QVjnlTTL7Eq?= =?iso-8859-1?q?aYwc5YdYlx9kHcBKmQuJ+b8E0qEUf/i7GHnCiF5DlYO2tspjvuNuTy0YerfG?= =?iso-8859-1?q?EhuOUQUEj4cgDR5PPZLtYKkadiH6nHJQFZVcec875y2BBEZlJApvp02zK3U4?= =?iso-8859-1?q?rgoirMpuHviJqb5q/yfep/0Ls2Qr6wgBgF4uJ7snoDPq20a/R+zTWmdzr0E6?= =?iso-8859-1?q?NNMw5AzQ//TNaglW/kWYSZ3AqTyRW60EcVKk/x6Mqt09WcIqjMi03pJp/i0D?= =?iso-8859-1?q?oxDS/fDj5T7RRKTOCCv2DIuF0PwFqUBlt7n+usdu87jjURutwxtSZ481LeLJ?= =?iso-8859-1?q?RVUlZiKWbK4/NBd1jc8WJdzsAiJidHZ/6pRygVTJucdJkZebe4AbUyARlm/5?= =?iso-8859-1?q?zdSs87PFA4IbeJUFBNurtjrhnjoPY5GDznOAvz4FfoO9khe/9mi7ziJWMf0M?= =?iso-8859-1?q?DkiEJqUsZLh2uVAP+zdeRgQT8wRS7IvRhbKss0K2NhEOvahfwyOmSRa9Pv4d?= =?iso-8859-1?q?L+OHCzUadSnzBRCaIOg85LHEHMC0IB2ZrT4BCH9VPfqe+7t898bfbNgieUND?= =?iso-8859-1?q?ZfBEhOmBqyz3Nhy9qdgPZTOzDjaXeDXhVF7fgEPlNZ+DyxBX1ObWPcaICzo6?= =?iso-8859-1?q?Sch/Z7+F5Lpv6c3Pd2NMvM8b6DOWtOCz2Nny4W8samn/1Gpke6GWeK8zOUPh?= =?iso-8859-1?q?27YxuTOJG1ciy+mayYNlo4A+WVSvlX0Mnc0bRkDljC6DzUBZfwd8dEMeISxl?= =?iso-8859-1?q?6L81QbaP4t5jUXgbT5nEVSnaAweq30ZFHMccIvCiLJi5LQQZXvshNVOIHogH?= =?iso-8859-1?q?J41N8FBWSoNADk/VD7E9lMxFfrkyblyYfwzXUBmOysOddayn/Fj3uQENf72i?= =?iso-8859-1?q?OwfzV8mSis5gslAOQqbtNHWDSJTMq5rC1BUiFbLlEUDcKi1k20BURI1NID43?= =?iso-8859-1?q?JWZXlFkUN+ntqStDZW9chNEtqxuf/3DB3UeMXqTCK7rf/ye2cLDxzML9iz6r?= =?iso-8859-1?q?5NR2CInZAErNlc5MPzS1jRE68gcaKqH4arqCdmDnRzSN4W9N3I89W9sZ9LcN?= =?iso-8859-1?q?BwvsxEl3HQe85Wa6dLtDK9wcMmhKm5ZPl5s/M+o+gLBoyVkTf5Hq98HhAAFh?= =?iso-8859-1?q?UlwGFJJK8DYTtWel+QSJWDj4PL0eWs7oPJ43dnJ+iK4dKXcSFXpd9dBq6kKY?= =?iso-8859-1?q?jIsnbmLtFjqDnbMlbxr7nLc7Q=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)(366007)(376005)(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: ZR2P278MB1053 X-CodeTwo-MessageID: 902d3f41-4d8c-4a18-8fdc-8b480f0bca37.20240506114354@eu21-emailsignatures-cloud.codetwo.com X-CodeTwoProcessed: true X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DU2PEPF0001E9BF.eurprd03.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 896c6b24-6ea6-44dc-229f-08dc6dc1cd44 X-Microsoft-Antispam: BCL:0;ARA:13230031|376005|36860700004|1800799015|35042699013|82310400017; X-Microsoft-Antispam-Message-Info: =?iso-8859-1?q?Cwrt5pr5riMBX6MmLl1W/Oxglp?= =?iso-8859-1?q?vo0fgLBU/1904Ds+KwnpsOOmseQaK1Cs0+/EHUycACxunefjrsJEZjD0COc3?= =?iso-8859-1?q?pYuKE5kQR/uKN5xuUA7552nENHbpTahPz//90bBU/9u+HGfUOMFpGG32Y5Oi?= =?iso-8859-1?q?33nHWTEM8mfnlKsmO43buUYB6mwqzainW6fE//bjsrB+tlbFXma30H35qoKv?= =?iso-8859-1?q?91uPJ7hg35ZwnQ+Nzh56I3NYDnM3xZ8VxnKUSx/yD6JavYeoxVwm1/Ugp+9l?= =?iso-8859-1?q?m6XFXVTKeg5iPNO1p8K6mCtdg14BCtu346CJrF6bwGzZua0vMnYrmeIJIcAI?= =?iso-8859-1?q?vGsIQYIzDBuoPC7Jjd5zild8i6xJrxNOQv2brXmYqT9MGiq6hlQ3WU1Ngw7Y?= =?iso-8859-1?q?Q/XS/1oHHlC5ukuZa6hqcEC9tUtXBAnF9+KrqaqErgFTSEOnDzLIoQ5AcUDz?= =?iso-8859-1?q?NA31zrCBKrqNoc29uXwIeMG2qofCc14uQck5BFBPGM5SSEuqRy3aBEdjs7Tw?= =?iso-8859-1?q?xgwJDcdo8q70+1pqpv9vrLgIKAGB4ZqHcmoUEda6Qz4SimgmuWojQKmqVDPA?= =?iso-8859-1?q?2SU9rbvDW1UzUOjLF0SrBnrgSqk/NC26l8JjfcfAqQ6GAXLbhsUGSn3cIwVR?= =?iso-8859-1?q?aZ9/6zPMVKgSb/M6xjAkcBit9O0DrEE7hQ1rrayTal8SX5D5RaEUPVzhrJXa?= =?iso-8859-1?q?UwFFbPOl8CyndeEm/JP4VadFajgZfCVwV3k4jNxzH3BP6s+shWI6MZetLjnb?= =?iso-8859-1?q?SnOELrkk/72z65Iq7qYyh54JECEaf4qxAf/MNDqU/xdaa3tX3ErUU2GBCo9h?= =?iso-8859-1?q?27pp+SAkzHVBQ0eYWORGbdW9czjq6M4zpqSUfyYaAN4cAywJcq+BywdH4FYT?= =?iso-8859-1?q?I1lIh3sVD+f7PnLNbeH6dkWzb+LgEvYOsqbO9fmIvwaLXJWsVpZS8lwL6glM?= =?iso-8859-1?q?lI5kzAl5vJ9VYNeWlJKo5iG0eHXfsiIDiS8Xg7T77pSNDUWJsgLiYrdS2RHN?= =?iso-8859-1?q?uuYozX1MD4zeUFAaEe9CduNL/3Mpd0RRnlNMd1DO5lnSImaWbmeNsEyOZrxG?= =?iso-8859-1?q?NhbyaFMBlZD7rlAjvXxpTILcb4TtZ2YVxhORo39s03bRhHa8evFt2cHpgmdP?= =?iso-8859-1?q?jz8QnOYYUdlgZ6CBiCJ7oA3iR07Lww1xlUDSfjLHR2L+4M6tV0utjIOXL3kf?= =?iso-8859-1?q?S9qDJTQ+eF8qzmbhCzmUQBWc/oVRAWfVMWarPFqJE3x4C1Lj16IepZXSffk7?= =?iso-8859-1?q?yxgQpR+mUJt8XUXuL0Uv0IWcgJaz8+MESFmXdsOtKsHNU8k07B0QsBhM48vD?= =?iso-8859-1?q?0dbo57y4hN/CATnCIMBciWXfu/5lWbtiiBb2XK1rVbpy1NNI4Iejet0MXL?= 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)(376005)(36860700004)(1800799015)(35042699013)(82310400017);DIR:OUT;SFP:1102; X-OriginatorOrg: sentec.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 May 2024 11:43:54.8429 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f43e020c-5681-4000-61bf-08dc6dc1cf04 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: DU2PEPF0001E9BF.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV0P278MB0968 From: Arthur Becker Subject: [PATCH] iio: light: driver for Vishay VEML6040 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 'Active Force' (Auto measurements off, and adding a measurement trigger) Datasheet: https://www.vishay.com/docs/84276/veml6040.pdf signed-off-by: Arthur Becker --- drivers/iio/light/Kconfig | 11 ++ drivers/iio/light/Makefile | 1 + drivers/iio/light/veml6040.c | 338 +++++++++++++++++++++++++++++++++++ 3 files changed, 350 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..7effb712820f --- /dev/null +++ b/drivers/iio/light/veml6040.c @@ -0,0 +1,338 @@ +#include +#include +#include +#include +#include +#include + +#define VEML6040_DRV_NAME "veml6040" + +#define VEML6040_SLAVE_ADDR 0x10 + +/* VEML6040 Registers */ +#define VEML6040_REG_CONF_RW 0x00 +#define VEML6040_REG_R_RO 0x08 +#define VEML6040_REG_G_RO 0x09 +#define VEML6040_REG_B_RO 0x0A +#define VEML6040_REG_W_RO 0x0B + +/* Bit masks for specific functionality */ +#define VEML6040_MASK_IT GENMASK(6, 4) /* bit mask integration time */ +#define VEML6040_MASK_SD BIT(0) /* Shutdown */ +#define VEML6040_MASK_AF \ + BIT(1) /* Active Force (Auto Measurements 0:on, 1:off) */ +#define VEML6040_MASK_TRIG BIT(2) /* Trigger Measurement (when AF Bit is set) */ + +/* VEML6040 Command Codes for Integration Time in Milliseconds */ +#define VEML6040_IT_40 0x00 +#define VEML6040_IT_80 0x10 +#define VEML6040_IT_160 0x20 +#define VEML6040_IT_320 0x30 +#define VEML6040_IT_640 0x40 +#define VEML6040_IT_1280 0x50 + +static const int veml6040_int_time_avail[] = { 40, 80, 160, 320, 640, 1280 }; + +static const int veml6040_int_time_codes[] = { + VEML6040_IT_40, VEML6040_IT_80, VEML6040_IT_160, + VEML6040_IT_320, VEML6040_IT_640, VEML6040_IT_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_enable(struct veml6040_data *data) +{ + return regmap_update_bits(data->regmap, VEML6040_REG_CONF_RW, + VEML6040_MASK_SD, 0x00); +} + +static int veml6040_shutdown(struct veml6040_data *data) +{ + return regmap_update_bits(data->regmap, VEML6040_REG_CONF_RW, + VEML6040_MASK_SD, 0xFF); +} + +static int veml6040_set_automode(struct veml6040_data *data) +{ + return regmap_update_bits(data->regmap, VEML6040_REG_CONF_RW, + VEML6040_MASK_AF, 0x00); +} + +static int veml6040_set_forcemode(struct veml6040_data *data) +{ + return regmap_update_bits(data->regmap, VEML6040_REG_CONF_RW, + VEML6040_MASK_AF, 0xFF); +} + +static int veml6040_reset_measurement_trig(struct veml6040_data *data) +{ + return regmap_update_bits(data->regmap, VEML6040_REG_CONF_RW, + VEML6040_MASK_TRIG, 0x00); +} + +static int veml6040_trig_measurement(struct veml6040_data *data) +{ + return regmap_update_bits(data->regmap, VEML6040_REG_CONF_RW, + VEML6040_MASK_TRIG, 0xFF); +} + +static int veml6040_set_it(struct veml6040_data *data, int it_code) +{ + return regmap_update_bits(data->regmap, VEML6040_REG_CONF_RW, + VEML6040_MASK_IT, it_code); +} + +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; + } + break; + + case IIO_CHAN_INFO_INT_TIME: + ret = regmap_read(regmap, VEML6040_REG_CONF_RW, ®); + it_index = (reg & VEML6040_MASK_IT) >> 4; + reg = veml6040_int_time_avail[it_index]; + break; + + default: + return -EINVAL; + } + + if (ret < 0) { + dev_err(dev, "iio-veml6040 - Can't read data %d\n", ret); + return ret; + } + *val = reg; + return IIO_VAL_INT; +} + +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 veml6040_set_it( + data, veml6040_int_time_codes[i]); + } + } + 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) +{ + printk("iio-veml6040 - read_avail\n"); + 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 = true, + .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 = true, + .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 = true, + .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 = true, + .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_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct veml6040_data *data; + struct iio_dev *indio_dev; + struct regmap *regmap; + int ret; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, + "iio-veml6040 - i2c adapter doesn't support plain i2c\n"); + return -EOPNOTSUPP; + } + + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); + if (!indio_dev) { + dev_err(&client->dev, "iio-veml6040 - Error! Out of memory\n"); + return -ENOMEM; + } + + regmap = devm_regmap_init_i2c(client, &veml6040_regmap_config); + if (IS_ERR(regmap)) { + dev_err(&client->dev, + "iio-veml6040 - Error! Can't setup regmap\n"); + return PTR_ERR(regmap); + } + + data = iio_priv(indio_dev); + i2c_set_clientdata(client, indio_dev); + data->client = client; + data->regmap = regmap; + + indio_dev->name = VEML6040_DRV_NAME; + indio_dev->info = &veml6040_info; + indio_dev->channels = veml6040_channels; + indio_dev->num_channels = ARRAY_SIZE(veml6040_channels); + indio_dev->modes = INDIO_DIRECT_MODE; + + /* Initialize config register */ + ret = veml6040_set_it(data, VEML6040_IT_40); + if (ret < 0) { + dev_err(&client->dev, + "iio-veml6040 - Could not set Integration Time: %d\n", + ret); + return ret; + } + + ret = veml6040_set_automode(data); + if (ret < 0) { + dev_err(&client->dev, + "iio-veml6040 - Could not set Automode: %d\n", ret); + return ret; + } + + ret = veml6040_enable(data); + if (ret < 0) { + dev_err(&client->dev, + "iio-veml6040 - Could not set Enable: %d\n", ret); + return ret; + } + + return devm_iio_device_register(&client->dev, indio_dev); +} + +static const struct i2c_device_id veml6040_id_table[] = { + { VEML6040_DRV_NAME, 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 void veml6040_remove(struct i2c_client *client) +{ + struct iio_dev *indio_dev; + struct veml6040_data *data; + + /* Set device to power down mode */ + indio_dev = i2c_get_clientdata(client); + data = iio_priv(indio_dev); + veml6040_shutdown(data); +} + +static struct i2c_driver veml6040_driver = { + .probe = veml6040_probe, + .remove = veml6040_remove, + .id_table = veml6040_id_table, + .driver = { + .name = VEML6040_DRV_NAME, + .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");