From patchwork Fri Aug 12 21:54:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 596883 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3BB74C2BB45 for ; Fri, 12 Aug 2022 21:55:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233615AbiHLVzB (ORCPT ); Fri, 12 Aug 2022 17:55:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38282 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234678AbiHLVyq (ORCPT ); Fri, 12 Aug 2022 17:54:46 -0400 Received: from sonic305-21.consmr.mail.ir2.yahoo.com (sonic305-21.consmr.mail.ir2.yahoo.com [77.238.177.83]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A234EB443F for ; Fri, 12 Aug 2022 14:54:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1660341281; bh=TOc5+fd/W86tPI2FR+KwSdGnTCcDbKSyaiaUexNx5+8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=RB1mTijGMA+9zR1SMeH7s4VoC/ZAFCceKi8VAyfI5oeaQaRiQWbTGrZLhcN7Z4ZMctxp1nozTHhVdMmqNJ1UFEK/9YB5jIoF9QAQdeMkUMJFCCU0Z6dpmPbDYGQYf0mVCXTsAxREXOKeG0cAi9qzYq+gk8BDd5yc6QvNMW6qWT4Wd3NlflpL4CyPNu64A+aGtTP8jzc1U/+xcemWr0VZv5gaWdufwbvRY1KAJbMTLZRmgZQD75sHCVjkC2jOBFRGUaIlY+7NXGwZkDeDhFPmN+Yvv+kknkioJZ9mLc1AcxZJ9bJ6c0HHuGkgQ18PvLq+g01mbuxI9pIcjuS+HvSCOw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1660341282; bh=ugsI39zsbx5BdDFhwpHIOaB+pVmfXqIByIA1dXljgnS=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=W5idWDL1qt9vPTyr4QaKr+qSBA3/D6ZPqMyljiMkJEzXNK1hC+FFIchMIYmBKbFDBgnPgQS1UZ5SzekjtUQe5hOV11sbIWLYQoeZZ1GG36B43XacCH+9LF9n6XKwI1r/u6Z8qZfBPTG6TYjE9DmLUZmg+CzDo8roOX0hpT4ReKKRhlphqYjNL1wtvIvOaLKOy5vqd5K45CGOn5A2bKbwGhwvFcGN3N8uPGdNJm5AB2Au23qNu00/6rY3pOk70yNmCHfQY6z/7yhwtFM3/MqiPEQDVG3l10T9k9qXP/kJI2Up6xWMztsLyBNME0ZqBG0c3R4zl5qD+T0LtmMvPzHeHQ== X-YMail-OSG: cayUMGsVM1lKEiEFpcBqSSr3pTKnLUc816Ul5bT0130t3_LP11CUaD__OUAO8aF AJc2nOEvsfB64rBENBEscsjN5p2Reqrc1eaqdOfw_rYRa4xbT9gxwZnCUe8BSbSBSW1cJtNfPAXt JySsbuNzT5bYWjBV0P5TvHh2M.P0cEEk9o83LoZBenrdedoTbyL5znvCoDNQdQK78dJ6IfN0HHXm rhbE.U.7yT556WD2oWOinrla3Eq_MPPf1Ua_P8HugYhmcVJrv94xfSR1C3B0hO7yz2t6iBOFaImO .HfJODdypeXTck3mAabg4LTq1IQJBsehlJYua6EfPy1.UOZHuCHsP6_nFi0y6XAIJo_MEloNGGBI OizVQu468g.GJNhqnVqvOtXzXJC_ODCulPAMTE4Hdj2sPdqBsLdJ1fCetHrHEvcqRMa8jnNJOlgh 44pM8SHuLdjbBk0axQkEasxkIBeHg9CTI117JpOetRmbIvWvYyUPyu_qZKVBwfFoqPSbFU0SkUtZ 5F7NC0zDpMQBYhZXIM_FSkUdcqzDUKxL8F5DU7qN2UrLkS9N1AQaD3IwFP3GgvLhXV9czdtJRk0Z ndRRKypDkp3pkEXQDYb3VIptcBVq78b6eXZh9GbEM_aAfk76T8QXJ9R4q_T0ZZVWJyFVpnHZ9pIE tYtmTTqX7paSYKpKZ6Y3a9elFfLm75HhsjN0pMCZNtBWg_8zGm4LRg2UQHdfKNVTu0MFyNl7HjwM d9HmMONH6gmqxkNj6H3q7ssxmE2msQVSpbqzAyQLfBy0C2tgNa5IHhZO_kxMaLe_ck6ZIp1mxsZ. y0aBPLXC3OmAQsNQsqaFfvRr5ZWQhDQ58pBV2KGwvyeeZSnJMza7DsHuGztrW19.urQH5rMG6GsG GLqt7cdE5NQyWDE9q5EnTatsiVsLs_MwElZqGew81YOr_778CA8Eb0gbqukxDA6g_WZU3iqMjuoW e5LDvmPsVE7WUsHcTlkKG2YFNEkjjItztN04U7EwjNSpg34BRcniiqZ9PAUYrwMFPOgLj8WZ1SMT f8Td.v4syY_7FCAfXvTUFl3fp00MuNBzxulS2V4NTga9QjbduMpipeCy6YcfeBNNzmEDNIF7mZph VkgcYNqo_zIhBfjMfIs9ZszUxzqVlmoIcxTanJt3uaT90Tq6t086EPb9fZ3KqjT3kxFLeQdeq6dL Aq6YvNgU3jQUHquRptW5Uux1UWqZ84KT26dM4dXo14gTJEk63Ll84tFcNDJ7PfDVaMBrDncuzSvm n3Y1FwQ4WXUOKYmNKeFYSbCfkKLZpmTVhfrMsf2qeQ_1QKQsqcRNfSoanrY5JAEpZi0LnMioXg.M PO61.5Va8X99ijRnN35.y3nw.89mJ_kfJ.OYvHUfAt2WWHjf4Nc2rRylSW_SysZ4IZpcZhj2ckxG CcghovPb3z9LP9M0_.5TnL_MoVZujZNiOGZTPoPg3paK2GVQwcX0f6UOpMhEh7NkoOgA1r3zTLq6 P6bGzkrGtJZZA_rc_9SqDp73cKMXLhoEejUSWColSFHp4ZbSbkfKan3HZqJZoO1ECgtljgo34r70 p5g9kaPPyA6t0bdcdLT1VEXDTMzi23t9FTHXlxBU3GDS23HN2SCEXFwHgXAGBC6QRXzAbSL85nTY MItN2WbC3R2_xfW90QkHpY8Bf4OovvtUaqYZAdGMAnlmGl8t9iiYvBC7C4FqZiH8xRTiC_Q1rcxB X1TIIRJRUuERPmzvqgUd.vuYY8_mjUFjkKjLYn8OCueR.d34jZua6zVO_kMWCo6hOs8D.VgrWdxY CHe533avsIk8xGYWi1efSjAPhd8rBM460yhNzU7jWQHyCgDroJjtLv2xRfmahGilgQ8lPH_f5fAs 42NJtIrWHDqYqn99RzXa2Kna0O4YsH_6ApL.Q2B.4SwHDDfCc8QJJ_mOemejCbMJajXFHMM98_vq 6RJJtQaD60HMm7IzlfjPxfmPMViEiU14IEBAeSdxnqcyzBZs73tY9NEJ0e2s7PQEFoUyAwKK47.9 v7tuWX6dO5JI5tJ.UUZBzng5JVxjsG6et_L5XYTNmFk_gIsXoqbsipBUPL6XQNgTyIFmLFLeFFbN e3LXKzzuASL9U4h8S02tdtDgmBrf9fzvm3xGodvHoZGJm3TZ.s.htQkpem.vqCxztivDH6q.YuEA mEFO3AE_MyypJzljp2BINS6GYM.by_m2DncS75HdgJo.EXwlwUHBzqhnJAUbT8fyQQh2M9xiE6qz 0CJPuMJ070bUDKC2mifsopkV4xzXYk.2.5LUzYxHb8F0VJ4x3ery2dyTpm85kp5wf4x6oAqqeD9Z r0hM38CBtQnmYv1k- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic305.consmr.mail.ir2.yahoo.com with HTTP; Fri, 12 Aug 2022 21:54:41 +0000 Received: by hermes--canary-production-ir2-f74ffc99c-sqjll (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 4374eb8c565a32f837f1ffd0e5de4e7d; Fri, 12 Aug 2022 21:54:39 +0000 (UTC) From: Jakob Hauser To: Jonathan Cameron Cc: Lars-Peter Clausen , Linus Walleij , Andy Shevchenko , Hans de Goede , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Jakob Hauser Subject: [PATCH v6 02/14] iio: magnetometer: yas530: Change range of data in volatile register Date: Fri, 12 Aug 2022 23:54:07 +0200 Message-Id: X-Mailer: git-send-email 2.35.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org In function yas5xx_volatile_reg(), register "YAS5XX_MEASURE_DATA + 8" shouldn't be volatile as we count from 0 to 7 here. Instead of lowering the number from 8 to 7, the operator "<=" is replaced by "<". The size of the measure data array is 8, therefore it's more natural to use 8 as a constant. This change is of low importance as the "+ 8" register isn't called. Signed-off-by: Jakob Hauser Reviewed-by: Linus Walleij Reviewed-by: Andy Shevchenko --- drivers/iio/magnetometer/yamaha-yas530.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index d1f16729c60e..76bff4818461 100644 --- a/drivers/iio/magnetometer/yamaha-yas530.c +++ b/drivers/iio/magnetometer/yamaha-yas530.c @@ -527,7 +527,7 @@ static bool yas5xx_volatile_reg(struct device *dev, unsigned int reg) { return reg == YAS5XX_ACTUATE_INIT_COIL || reg == YAS5XX_MEASURE || - (reg >= YAS5XX_MEASURE_DATA && reg <= YAS5XX_MEASURE_DATA + 8); + (reg >= YAS5XX_MEASURE_DATA && reg < YAS5XX_MEASURE_DATA + 8); } /* TODO: enable regmap cache, using mark dirty and sync at runtime resume */ From patchwork Fri Aug 12 21:54:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 596884 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AB89EC2BB41 for ; Fri, 12 Aug 2022 21:55:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233732AbiHLVzA (ORCPT ); Fri, 12 Aug 2022 17:55:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38294 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234747AbiHLVyq (ORCPT ); Fri, 12 Aug 2022 17:54:46 -0400 Received: from sonic311-31.consmr.mail.ir2.yahoo.com (sonic311-31.consmr.mail.ir2.yahoo.com [77.238.176.163]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 98D7CB2854 for ; Fri, 12 Aug 2022 14:54:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1660341284; bh=znEE+x4/fs8ErVXvNtdEaKwQbVEdxjLwO/9+DaBezGM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=OZEC0TXwd/FgiPQ96ZTR/uEXRzCc2W6L0oAMxrJEGdZUcfFbcz8u7GHxjNnRl9HGwX6jDg4qtdKXwleMNHltG09McQAwFup4Qh5NuZTFU0q/iixIuK5yd/9mW+7v4BkE2KziO4jm2eSNF6VLtsGukFlt5oTl94iDxj3LaXNeopR3oBd7jlH+DtSTQZMdNMsWrKiuDwI4Uq356pIEiVUqf8A/m3pz440rO2AFOUX1kZBp7uEC95qogBhng1IqWGyi9A6/4yyv7OOSKalnmAPnAOx7iwKpvWbRbrihf7/lxS6I3OIyTWfC3Pu8hV0CFbYnbut+1GhgULpoSB+xEQCSew== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1660341284; bh=YiQ5izLVCi5X5plK+UxqefN164ywxzhPcImpky0vVl3=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=PeMjo2cp4wXnbwhaLVcR8pqSTHhKiaLkPnZG/ALmbMSPzXsqd2em4e6qkMdMSgl6BXcSsIq3Wd0zNRLOwW5GsnHb2tuipPVJHa+Y7Ung8+tYEiRsBrRPE0PL1MA9NT+EBCq3QwZfbFTy7PBgVnzEicEbwboGk+00mFgjhUqWtA0n/iI+7KZpc8HZ7dxVPmTRqORcBfMxRj0yompyZY21Z1LOpRBrFJ/11FZWhTMWcHFNno9Pxwqvexzn2kjWpzthXN+nyWxHzPLo0wHBWaM4e/ICgztut9C7D38OFQEwsuPW8kY5l8VIC0emB4e4nAeR3ngUCBPRxOFbuZzoITYEgg== X-YMail-OSG: 5wQgejMVM1nezeNgP.ulYGJutEp246Hm0X_MWNMeNVqk9JWNw7xUGdDLGRKTTcs gPFtGnsy1InJY5.ankLpC9COTNmB4q6IfZhXRFnY.QjcBuYuYAJ9gZLm4CecCK_3OvR2vtTl21Cz MYCHGOGYezFChPlVH9x_gL_PyR.bBNbCmFABlbqFSd48BEWTEX_bwF7DkhgAF_4V7TdA6uxcA.P1 DCDxiODPQNiVAohbCPZxQpheokxRQSOs1ai3M.YIliG5NQ2_69dG0VvPUDO8WLkMyz0dNty1diXY x_wpTgGm1Qe7.wUi9BxZHJk6WT0KCgmNyfSgTgHxJb3LBH3.JdbWdhLlq2xcUz9tP.nHoiajYDT_ RdoiZf3k32W8kriXEVPhx8R_3VKUlohPkxLxOv9nt_LNYhaMXM5Y3nLVJKYxzATk11Veo1O9VKGU 5YDt6E_H9ejLLzUb54f7BMmk0iCi26LZbhOymWMRxHrdoFN.MYFygRMkbRICNfF5FtuneuCN2PIR 3QJsF6h3Ny_4mmdtZS9ACwXLnjfPWPYqr4dyFwRSvC._mvu_yaBOpXC.niYJOugkmof.svVuZN3T 68mn1bv3wPbObEhfvd.zZba6XtZsC447ow8LRv4lHWdWd6r2o7Z.oU9RKB6XZe3DNfwZu2GRCn40 LLNyYJyiHb_RCxm7zL8mB_03PmjaIKbD7E7Xugdyc.l1o1v5yoSXSS_t.PXM6BJEGIePipSDuwob e67Vekif228iNtv1H3KZU4gEyLAvMEtXYTUwc1.ZYL5jRLttjzX2GXJM3U0dAqqY5o5TkVwn1AHr t6aZaHTgMTgEzXWRmm9V_mYJxLmHP1cSgMThpNq1qtH5Aow8ab1H3kx_1wZkd4bZJ1MfLa5vi5UL SLM3E1r8svIY7IwvDjjvg_oEf5Ng0M050m9kRRY4Nc_Ng_VPy3XRV0F6VSapz11rRxFUSbbAjTmD I_LC05YS80SgBf5755W8xEII8tZK.OcxHn8Uf2XZ7eJHsTAXQVxgVmiPY0osz3tlYaugxPcWgFO6 bEzR5o48IOTJz0u0A4XruOqat2KP5CERfgKwnE2XbhaTY5AHhnjApc4l0WzLWQfFI7Q__4YGKbD3 AVJcyJ67UUQTldj9OfK0xg33w905wgAoQI7a1zf06Fp9secz1kg4uIQSxo5UBrxQvlFmsUn3GqH9 3LuzqLg6GGXNEY0L9yG2Ohm3wasWtQxwLbkaeHrcn1SE5VKyGbqOZ.3KbGO83hXVRZUh1OV4cAXc SxgJ50wTQOhFvB1wM4LyvHfCqE.ZKQzmYS_UD4.96wSVNDGzSfEArsy2dBukyXVsF8pz5WK7EfoM Ncl10MIm8l3UoycNcYY3xbdL7s4gsK6q0n90uXhB80CnGGvcskwGXgYb9otLai.A804EObPao3CK uyeaAhlzBrM19kY9v61Cx27JkKZfvJ68CCy0kzwgJUh_PLXDLUFYZyaUpXVG09LrIZrR2Evfs0fR 4uUq.U3wyDoRJQ7PO1kCApsh7kt.znaqr06Ueew517Et_iIz908YFpnmUQTZYxWuOgk9einn2JjD WxkMCyHBJuDGJxrvdQGUc99gP70KcinPSUfykVqaLct0cJ2Txf8tkaW2DdDtGPo0432Z6nL4lVr9 3lvqUnIIgoD9G3cXkaSdZiAdwYSwWbA90kWie5xhoEf9lnge06CI..p7skXObmAkhPVwbl6mASX_ 0_EO4BDzpyu6DIJwj9CFG374JkWyircDLCW8LWz5GZHnNDIB4BhhNXVCCKRNleRuvcfrQIvD.df3 M2oP39dXJme1_R5jT2XmyijF2f2ZK5v6Y00sdUYLwACXU2fCKdBa2BvR9B0jv2OIbpYrhCp69OrR sk1lCac.qFwlEt.Hq3_bL0qTFN6w0KK97gtjUX6W3DNqcDRQkYTTcmgO8LOeBFNsH9bziX0dU6qv zy6wMz07_LrVDSa.CRgIAmd6ZsfYZcruCzuny25guupRBQw0CqRd4bbPHSNSq8dyAOulRCKPtOS8 AJrbIxjfdmRPKbyJ3emrfnypJGiYx_UWXW.ffPh00Jm5pIlMA5yKyO7N.tuFagkGZbfkM6ReTLrH MJc6jYdlI.wl4IU8pJeKF1HvI0t0YJHwfqOpwDPb0qUI4bC16ipf2xlxh8tlphqkepVF.twMu_5R mlMTSrElgrZ.ANOI2h3CVAH8LCNdiR9Ey2CsxQviRElqEppPZIAKNUCTocq4eB3okSG.Cwu0PUZI B1W4TX8SifNF8qDeVnBZS8o_0T6AEfQWx2M5ONCkpSDa26lzzn53YYQAoOozH97lU9HuSrilThx3 B6G90EvWrDmVRGD4- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic311.consmr.mail.ir2.yahoo.com with HTTP; Fri, 12 Aug 2022 21:54:44 +0000 Received: by hermes--canary-production-ir2-f74ffc99c-sqjll (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 4374eb8c565a32f837f1ffd0e5de4e7d; Fri, 12 Aug 2022 21:54:40 +0000 (UTC) From: Jakob Hauser To: Jonathan Cameron Cc: Lars-Peter Clausen , Linus Walleij , Andy Shevchenko , Hans de Goede , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Jakob Hauser Subject: [PATCH v6 03/14] iio: magnetometer: yas530: Correct scaling of magnetic axes Date: Fri, 12 Aug 2022 23:54:08 +0200 Message-Id: <053ab05cb9a0f6b0536ab5e0de57009f513c6f81.1660337264.git.jahau@rocketmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Looks like YAS530 raw values return picotesla and YAS532 nanotesla. Adapt comments and scaling. Signed-off-by: Jakob Hauser Reviewed-by: Linus Walleij Reviewed-by: Andy Shevchenko --- drivers/iio/magnetometer/yamaha-yas530.c | 31 ++++++++++++++++-------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index 76bff4818461..199d83013e6f 100644 --- a/drivers/iio/magnetometer/yamaha-yas530.c +++ b/drivers/iio/magnetometer/yamaha-yas530.c @@ -310,8 +310,6 @@ static s32 yas5xx_linearize(struct yas5xx *yas5xx, u16 val, int axis) * @yo: Y axis out * @zo: Z axis out * @return: 0 on success or error code - * - * Returned values are in nanotesla according to some code. */ static int yas5xx_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, s32 *zo) { @@ -417,14 +415,27 @@ static int yas5xx_read_raw(struct iio_dev *indio_dev, *val = 1; return IIO_VAL_INT; } - /* - * The axis values are in nanotesla according to the vendor - * drivers, but is clearly in microtesla according to - * experiments. Since 1 uT = 0.01 Gauss, we need to divide - * by 100000000 (10^8) to get to Gauss from the raw value. - */ - *val = 1; - *val2 = 100000000; + switch (yas5xx->devid) { + case YAS530_DEVICE_ID: + /* + * Raw values of YAS530 are in picotesla. Divide by + * 100000000 (10^8) to get Gauss. + */ + *val = 1; + *val2 = 100000000; + break; + case YAS532_DEVICE_ID: + /* + * Raw values of YAS532 are in nanotesla. Divide by + * 100000 (10^5) to get Gauss. + */ + *val = 1; + *val2 = 100000; + break; + default: + dev_err(yas5xx->dev, "unknown device type\n"); + return -EINVAL; + } return IIO_VAL_FRACTIONAL; default: /* Unknown request */ From patchwork Fri Aug 12 21:54:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 596882 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 75FA7C25B08 for ; Fri, 12 Aug 2022 21:56:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231569AbiHLV46 (ORCPT ); Fri, 12 Aug 2022 17:56:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41840 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230445AbiHLV45 (ORCPT ); Fri, 12 Aug 2022 17:56:57 -0400 Received: from sonic311-31.consmr.mail.ir2.yahoo.com (sonic311-31.consmr.mail.ir2.yahoo.com [77.238.176.163]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9729EB443C for ; Fri, 12 Aug 2022 14:56:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1660341414; bh=6EErivruwsgZKC+fXIpLXsbvYq9f75MRwEyexn+OXd0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=g4g304DONim6/WSBdq6apSzI0ADyDIuIyBY0pKHXJL4doqcMesrl8hdEL/mgksJwcGzYmRD5scvTDpq62jeOUhefrYlFsecQkyssRAdMmkfdXgVuCRtQgNNwnX7uFK0ajsfEP3hqdk29Q4wfKxigjKq9wrjb9X+a49LLzuAGyu+jlx9JshH7d9pj7Tt2H/dMTJ1sOTzI8ty7NMfUXy7wnx6G6/2Q2s35aL54i7YrvlTB/4kJHBmvgcv4mEdRJHjBo7TPHumWdgl4pzR9BAniGuhKwwcvKyQW5wL3+0cpjHWEs/RBHndxFoD79843fkDG59CF8ZryY5V+rTIcJ78Fkg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1660341414; bh=rpR8H/53ymVa+HXLXn/dDnxmnoH8soakZl+H2+loy/c=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=SC0WiAzIVJgQKEneYwMJ/SBNuzM9mgKSiv8NrdJTXK7sUH0vBbuAsfKeQIUcPewxdUMszcbTp4hSuwHQkrXl1cxGzmeHR1GuHW2jYAVf3K3BtvCgnaqPEFRAWJqLNPPF3Tiq1f71vgjCZA8YbwPvO1x+D+/N2CYIEPuxSlBgYxb3/gK9sEjpbLzlR3ZiDJawJU/aduGOyFox/80Q+WteJtSP2vFGY+a8Vc0siOsiBEvmAh2PQcj4ekbOxVOlLwXY6ODdo4vRAz+M9I4PmPgWWXhzIKLJ+IsMnD86uPz8xY6d2Xt7kSGGow5cKi1vrdEM+s66JiebM/vMF7OL4ga3pQ== X-YMail-OSG: KMCJDzYVM1kD_TJZOyZ8Mrt3fJhguf2R_mflQ_aTkaDMf7iUl5s77yNQscXx7K1 AFXoYnFWzQlSGqIW224OpN9YPq3FNR833T91NXltIt2A8MFYK1j7QHAOv0JXdG.PKF8actwHokxl zDkB4lU6VvSkssSGAlc9WWoQ.AO.ySg7n8iWefl2h0UvHz.DeVES0K_rA4kpKuNPjOvJY8SC5ILO bDGO7N9KH11z5P.RmUH4aX_UlUpELtN9MXv9ixuQd50_yP2rZpfCOT7t3vGGbGVqT1aiK2dRA5kF ioIOOBgoqpncPXpbJzQp3EuXEddS7TCgsRXCo3zAbKqUD.sE_LXBBXllhYGrl4z7jQetZ_XI9YTL qDK3wrSHbqPISHCY5TRT4PtecqX0fU4OWAi4QgR6iRPQT9lPsn9w5GLYlhyOCmxqLA3z9riDTa4w DtlOWj82aNVfJFq3EKfdcn2rFYm0t2wjpWy3nXT999lXNVUa9AwJduR9Ustjm8mecvbpQkecvEqY mL_R3.XnqBz37D3PQSN9NfsA620jHoyVRiWRG6Zoc93I1pAy3U66OE95n3hS94sj.Q2FSg3YrXp_ 11eb2D4SXghiRzmpw_LFgTk85u09joWb4fhZbC7tlKK9LXa33SG93xyRQopz_tDrJdeS0MDGER9j oxN70cBx5eimC91KypRcRcaMTgtE8W3ecUmvds4Z1ysCx0fPCVul8H71ktF9YAH7EEXQPvrIU9gk GbsAIIgsg2pUP6XUHTkKd3irpUzbaDVg8fn.NTljg0eIJD1w7hiwe60g7H05gD1cnuXX2KOwmQPV cMSZm__WmGUN8KILna_h2yFsBAvhBH99sgVq2fWbquYrsb5uz3EkZcIbZOlGZUsXVmDR7JBxYm5f VfiDJgf3C8Xzy2a569p6X3RYuebcuePY36J6AvAeAIp_qXkH6n1DyTdbUm.lMD0emFXS4Q2yGpqe G8IBtHRDGukBZiSxNQ0NBcsksT0L1Jf1DXQ3AL.thNPBjP8MsrSjM4gQjFchc9hxmkNRis_HuQjJ Rie.z.2eFrf3B6mUoZp9JdTUQtzGLA_D2qrmE13sUR6Vh7nPv7olTy_fgXl1I82ZYHgpB6kG8xLX o0G8ovfVZ4nYe_NJQuV3RfjL28R_Zvtg_IZpbcWnslY8ddCFr8dwHN5ZVV0DGkPikOuKrP7hrNet R_azD0XLTp0hEGGLhfpqGbhkucdln0r_QriMaiq9rZHwK1a7GYQCxRS4.3DvsMTrjFLPsK6NQG1T GHQfW4T1mcMLHdzOf4BXv8l171UkXJAwOg6TcgCu9F0DUwWqtM7yXzsifkFegTd.nOWICTTR4fRF XFp62s.0IYZLjuuWmPMV7mZSfScCbtWrTery6Pg4vjdn2VBzu2oIEUycMJSO5BVlug8cMxVwTZrp e9pvANSxTKhdThNSjLYGRE7NIvXe08_xl24MrgyTNknYuJzkq2_Yj9W1k1jjI55yCq7qyw3gbajL ITJAZVg7fNExejAaUufCFnUVVluJPugIDGZvnR99p.632BjMTfsm07mZtCPsTPO3m8_hyiGGXKcq tDfTZISBBZiCPvomfe_Hb4N5GrpyxWiWzE6NZrbKGwU2b7sdjsG3HVZh8kET_lT9aRfD0R.sgssb YncvVAH7Xx7zD1M0utjF32rRaMNKbRj8GX6eLrkD0uY8Eaga.iRBA0psS7vlK.KN1iNfsW_KFYOM 4oU_IPpDdqDpu4fW2XWnInedXTMcqqMiKWzMbr.zCHQQaywirCtMlkDj88lyvGls0EqV75rfogba 2kJKHpaelkCqfH8BZDjJU20433BOe4mBBv_qRSSY_aB0EUSfNAit592BSqPNBPYCxIfEK5.XLEsD zxE6MwFBfqlHEf8xml7qKYCnTTON1w8obl8__LdzPSdPNb1tO_Nuo6Gno5mRPNjTiS7LuvOw7oAS h_VzFddWIMYD4gcQYlVli_IpJLKu0jAyW7XWbSgX9TBZdHFiqE7LwgC_uZyjn2PiEk.QvnqtKH7F W5_PS4u7muOI_ppDH36cOs1KSUtAYszYrCZJiuIf7ak3CXizDu4ScfouylkGGuGT5a7QHSquBhSH edbuZZfpS_J4diOqwEJ1VaOuXpsVIhBDte_uf0Te9oZQMrAsiNp9lG51c8oPT6XKpiEHHauLRDbF cjcE40o05W9N4kQ3wPOf_cl_H75o6NytXVUEukg4qczEouRwZudRx6S.HIubSKgELL6gH.SW6Ccb eS_25lM.XRXLSV6s2g.O14NfhzsIYeoGKZnF7ea_oesns4yBMc96A7nH3HtVSiwRv_TchP9ylyNK XPjjxvifOKbGCxdU- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic311.consmr.mail.ir2.yahoo.com with HTTP; Fri, 12 Aug 2022 21:56:54 +0000 Received: by hermes--canary-production-ir2-f74ffc99c-2vqg6 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 15f5a750f82727a3561822ee8056ab25; Fri, 12 Aug 2022 21:56:52 +0000 (UTC) From: Jakob Hauser To: Jonathan Cameron Cc: Lars-Peter Clausen , Linus Walleij , Andy Shevchenko , Hans de Goede , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Jakob Hauser Subject: [PATCH v6 04/14] iio: magnetometer: yas530: Correct temperature handling Date: Fri, 12 Aug 2022 23:54:09 +0200 Message-Id: X-Mailer: git-send-email 2.35.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org The raw temperature value is a number of counts from a certain starting point. The resolution of the temperature counts is different for the YAS variants. Temperature compensation for YAS532 version AC seems to be handled differently. It uses the deviation from 20 degree Celsius [1] whereas YAS530 and older versions of YAS532 apply solely the t value as a multiplier [2][3]. In funtion yas5xx_read_raw(), add case IIO_CHAN_INFO_PROCESSED. Remove scale of temperature as this isn't applied. Additionally correct sign of temperature channel in iio_chan_spec. It's already defined that way in the yas5xx_get_measure() function. [1] https://github.com/msm8916-mainline/android_kernel_qcom_msm8916/blob/GT-I9195I/drivers/iio/magnetometer/yas_mag_drv-yas532.c#L442 [2] https://github.com/NovaFusion/android_kernel_samsung_golden/blob/cm-12.1/drivers/sensor/compass/yas_mag_driver-yas530.c#L881-L883 [3] https://github.com/LineageOS/android_kernel_samsung_msm8930-common/blob/lineage-18.1/drivers/sensors/geomagnetic/yas_mag_driver-yas53x.c#L856-L858 Signed-off-by: Jakob Hauser Reviewed-by: Linus Walleij Reviewed-by: Andy Shevchenko --- drivers/iio/magnetometer/yamaha-yas530.c | 99 ++++++++++++++++++------ 1 file changed, 76 insertions(+), 23 deletions(-) diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index 199d83013e6f..6296ea3140ef 100644 --- a/drivers/iio/magnetometer/yamaha-yas530.c +++ b/drivers/iio/magnetometer/yamaha-yas530.c @@ -77,6 +77,7 @@ #define YAS530_DATA_BITS 12 #define YAS530_DATA_CENTER BIT(YAS530_DATA_BITS - 1) #define YAS530_DATA_OVERFLOW (BIT(YAS530_DATA_BITS) - 1) +#define YAS530_20DEGREES 182 /* Counts starting at -62 °C */ #define YAS532_DEVICE_ID 0x02 /* YAS532/YAS533 (MS-3R/F) */ #define YAS532_VERSION_AB 0 /* YAS532/533 AB (MS-3R/F AB) */ @@ -88,7 +89,7 @@ #define YAS532_DATA_BITS 13 #define YAS532_DATA_CENTER BIT(YAS532_DATA_BITS - 1) #define YAS532_DATA_OVERFLOW (BIT(YAS532_DATA_BITS) - 1) -#define YAS532_20DEGREES 390 /* Looks like Kelvin */ +#define YAS532_20DEGREES 390 /* Counts starting at -50 °C */ /* These variant IDs are known from code dumps */ #define YAS537_DEVICE_ID 0x07 /* YAS537 (MS-3T) */ @@ -314,7 +315,7 @@ static s32 yas5xx_linearize(struct yas5xx *yas5xx, u16 val, int axis) static int yas5xx_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, s32 *zo) { struct yas5xx_calibration *c = &yas5xx->calibration; - u16 t, x, y1, y2; + u16 t_ref, t, x, y1, y2; /* These are "signed x, signed y1 etc */ s32 sx, sy1, sy2, sy, sz; int ret; @@ -329,16 +330,46 @@ static int yas5xx_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, sy1 = yas5xx_linearize(yas5xx, y1, 1); sy2 = yas5xx_linearize(yas5xx, y2, 2); - /* - * Temperature compensation for x, y1, y2 respectively: - * - * Cx * t - * x' = x - ------ - * 100 - */ - sx = sx - (c->Cx * t) / 100; - sy1 = sy1 - (c->Cy1 * t) / 100; - sy2 = sy2 - (c->Cy2 * t) / 100; + /* Set the temperature reference value (unit: counts) */ + switch (yas5xx->devid) { + case YAS530_DEVICE_ID: + t_ref = YAS530_20DEGREES; + break; + case YAS532_DEVICE_ID: + t_ref = YAS532_20DEGREES; + break; + default: + dev_err(yas5xx->dev, "unknown device type\n"); + return -EINVAL; + } + + /* Temperature compensation for x, y1, y2 respectively */ + if (yas5xx->devid == YAS532_DEVICE_ID && + yas5xx->version == YAS532_VERSION_AC) { + /* + * YAS532 version AC uses the temperature deviation as a + * multiplier. + * + * Cx * (t - t_ref) + * x' = x - ---------------- + * 100 + */ + sx = sx - (c->Cx * (t - t_ref)) / 100; + sy1 = sy1 - (c->Cy1 * (t - t_ref)) / 100; + sy2 = sy2 - (c->Cy2 * (t - t_ref)) / 100; + } else { + /* + * YAS530 and YAS532 version AB use solely the t value as a + * multiplier. + * + * Cx * t + * x' = x - ------ + * 100 + */ + sx = sx - (c->Cx * t) / 100; + sy1 = sy1 - (c->Cy1 * t) / 100; + sy2 = sy2 - (c->Cy2 * t) / 100; + } /* * Break y1 and y2 into y and z, y1 and y2 are apparently encoding @@ -347,11 +378,37 @@ static int yas5xx_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, sy = sy1 - sy2; sz = -sy1 - sy2; - /* - * FIXME: convert to Celsius? Just guessing this is given - * as 1/10:s of degrees so multiply by 100 to get millicentigrades. - */ - *to = t * 100; + /* Process temperature readout */ + switch (yas5xx->devid) { + case YAS530_DEVICE_ID: + /* + * Raw temperature value t is the number of counts starting + * at -62 °C. Reference value t_ref is the number of counts + * between -62 °C and 20 °C (82 °C range). + * + * Temperature in °C would be (82 / t_ref * t) - 62. + * + * Contrary to this, perform multiplication first and division + * second due to calculating with integers. + * + * To get a nicer result, calculate with 1/10:s degrees Celsius + * and finally multiply by 100 to return millidegrees Celsius. + */ + *to = ((820 * t / t_ref) - 620) * 100; + break; + case YAS532_DEVICE_ID: + /* + * Actually same procedure for YAS532 but the starting point is + * at -50 °C. Reference value t_ref is the number of counts + * between -50 °C and 20 °C (70 °C range). + */ + *to = ((700 * t / t_ref) - 500) * 100; + break; + default: + dev_err(yas5xx->dev, "unknown device type\n"); + return -EINVAL; + } + /* * Calibrate [x,y,z] with some formulas like this: * @@ -384,6 +441,7 @@ static int yas5xx_read_raw(struct iio_dev *indio_dev, int ret; switch (mask) { + case IIO_CHAN_INFO_PROCESSED: case IIO_CHAN_INFO_RAW: pm_runtime_get_sync(yas5xx->dev); ret = yas5xx_get_measure(yas5xx, &t, &x, &y, &z); @@ -410,11 +468,6 @@ static int yas5xx_read_raw(struct iio_dev *indio_dev, } return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: - if (chan->address == 0) { - /* Temperature is unscaled */ - *val = 1; - return IIO_VAL_INT; - } switch (yas5xx->devid) { case YAS530_DEVICE_ID: /* @@ -516,7 +569,7 @@ static const struct iio_chan_spec yas5xx_channels[] = { .address = 0, .scan_index = 0, .scan_type = { - .sign = 'u', + .sign = 's', .realbits = 32, .storagebits = 32, .endianness = IIO_CPU, From patchwork Fri Aug 12 21:54:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 596881 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7C5B3C28B2B for ; Fri, 12 Aug 2022 21:57:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230128AbiHLV5D (ORCPT ); Fri, 12 Aug 2022 17:57:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41936 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230445AbiHLV5B (ORCPT ); Fri, 12 Aug 2022 17:57:01 -0400 Received: from sonic308-18.consmr.mail.ir2.yahoo.com (sonic308-18.consmr.mail.ir2.yahoo.com [77.238.178.146]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 89EDEB5143 for ; Fri, 12 Aug 2022 14:56:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1660341417; bh=NHYENK3/2zrXtIKxNQM0pVoNCqaTCcdUoYVQRHxdJwQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=tN4RUISAr6O8OHTNmwebzcrXbHaqVhfrYtcy8bmUeuaw/gWXSd7MJNvsd1P+l5xaMw4ZyyXQVNAr+Nx92tXOI95VKfE60qW71ir7Vv8C9tzA2JmHMTvDwIhKf8P2V1Nlmoj9UJvZ2Y/yW0hs21pkZ3n8C9hX+zSbYB5y9uaGPKmmO9JWJrlX36Nq0txvWQi5scSCOQGe+JumcuPx2IO6dGka56SNUyQjUmW3vjDejzX6HusMtPvBwhg/LIkOcrfRYimltpKCD8rUh1WszXbN4SARYexK/wjSXOrJqnWMC0s37AbYROGdUYXkw6L8y5OhzcI64Jcc4f+qwA5OcdDp1w== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1660341417; bh=lXp/T7mL7tnuMqHKVc9INrCzk1ZxzsDVgPSSkGE+lgp=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=D+fNhGup1y+jAZQukYH1xtDPDS+ukN9xBo/ehlA1n+aXHxsBxk4LiJJjtsp+UFs5JNurFG0FbvZVUJRNUyKG3cawIiPEovDWyKwrEy+mGtaqQKfya/+/OJwmj/NHtBMG/u5dqiEkeIGCy6ALX6ZXDL3BUAdlAlFPHUvmgfxcrRFqlzjKNWxOG2nmXnqqy5MMQ3skCyCZOE3JJ0A8oPaDLzRocYTEtSl2Hx3G1Yhwt8sX1Vkz7oGwmRReK2/vsnSKVsgisRxRBB/antbVi8phDD9ihtLfIZcOvuEvhTKOKM7B2ayn0BS9OOwfx6zyz/o5vfySQnstr5xkIi37yJpLYg== X-YMail-OSG: RH58FRcVM1lR8bTmTV5waZVGXGr8mU_rVkx1uNp6Zpy3eQJsyTNXFVLbLOnGDc8 jriLa4OPTXVPvxr.Sl0dF3KxkCjuagyelpLFAdTJqHkhNsE0sq.rm.7ujePSPYUIbpsIQev7f6FV 8mmb9LEgpHT0VFpukzDuGjdv8ITN6jvmXssUA0bMSh5GLnNyN6aDZXG1pAWxQ_cblfhYVjUnV4mW F87CiluWBP85V1xYozC9YarSg6IXd9DhFp0ZjAQjzOEm6lOy3vPe.18.fluc8CJCbnBnENikQhfC DFLE408_Z3Sj.jYmYfiKQLQpRFGDgjzahSYUf4_Tw.4wvWgm.NpFafYzMx9Mju45OfvJ_lEr3BYo VxwCwESEYUeWiLCNiMWVBwSjm_ZiDfsuqS3COvtRo3a__Tefi.pZJMl3.XNVkKYmzbgavfGK4nG9 tI3Xi1VpUnnbi6BX9EIOTWYpgZWmL17iUSuYchQ8HzgWG_x078ViFHX.XZOdQORwKNxX6ixoLjN7 JddUM0d9LyOTmGHRiGmj.ONA28Rmrwre8FCQDrVhM844SNV2Qvek_Mc5YGJhwpr_pgZSfkf_y_jT 8zETapABhYv9yryoYcVL3JVBT5HAYl.yozOmG6vAbu6PIptOkJShu4iwnv1.2DAIpsUUwDg2nXJt mRf.HQ9AWHUygBBsZeXldWwteBJOXi5Dqv4Z.ddPGmJLsGIs5ukVjFm8deMP7v.blt43up7wlrQR kENsgLD9eIbulufMX1fsNLzyC7.dNPb33Iw3livc_sOmr24qufCUrMCojF7kxN_0vJOYKGmYZHR7 q5iZwGNYsiZ8uwOqpeobT4.o0wEvoX8Y4ph3dLwdtvLOiDPJMGaxqMA2jZEb71vqW2mwGQ5qk1g9 7jEE.cUXxJ28_J6ZIMzEb9R2jJuOVxgq7ViJpjW7aLoaaiUQEfNYGmRMCQfYDzanNMPgFjRGX_GL 6ZJEP2XJ_i3uJd8HFVBBmBp1r.ElXHi25rTIH.nPXTt5HfMC32PFlBjzu4nKDhr1FyKRHHdt1WO2 A.Z8gVXUrjtzq68iEp9N7ZwTODL2DHGPRyNg2eUKEBN_jSfrI_KarX8jjupo62fNqtZQbupCTG7H MLy1QLRkmOtUXDpg24wyCLixCDjMLpvP5T2fuWwWsN0aNR_E9XtZys2Hh_y10y0rIMYp2IVSb3jI qo0Wk.iRS0yO2.EnhejzUmatN6VhVBetO4dsIyQRM_b2l96aZa5wq.1BzNWIvcMgLc3qy0AXEBHJ 9TQor0tSZ7dV9acqAPCVA039sQiynV46d2MCxpR.bgDdM6Z5gosChXvXYErAF5GnwbhxrB.Alcho oQ2whA6qWonzjwei3otcl4p4anU3oLWqYEe1sv9ngzO5cHhtVL.zjCb5qv4IPc3e8DMdGPVlcOXz nMgHLqVWuGRH_AQ_5nqMeghVlkhOSo42Wsbgj2kmVvMpXEROPC_SFuvxpPyjoSPCBz_efuCGAYl7 k5.gy46ssBirxWiQfhPugBVJWXa.NI99c5Mw88rFsG67_SveKfNL2mBxy2o1h.E2A8c4xmgTf0N3 ymLXHpwa82YTRrjlcJw_bFy_zqj03YwH2PX0lQW4iGExWf3S5unBWMQwQSOpDnbLh978eHqqZGTQ 2bSgnlYsdGG3WJYMG3s__MO5FxOXgz_JrDqFLsiYDp92_WiHABNMZHo39RYaaAI8VCQzk0J4Hm97 MQJ1H1jher3ofEdcy21KngLt1u.3R7J.y1N3sfhSjKI1XjFjNeGHYc2T5Wd1h9yLEaZrL.PXeSSn A6xJmvLpv.k7hsnDLkmIXTP3Y8FjE7L_2mpE_PHDZPbOWf9ZvFHG_fvReLutnddCLcRt1PIvW6CH MLyszIRkxhWzs6uzmMFJsX70iWnsT4G2.d4Y9lP70vmEuHDEyYaztLj1F7DPEJJquWJ.2Sno2sqe SwJaUt6p_._D3M94_2qlrDJ_4UeNoHxZlr2bq55Ern6G9G2eu1Y92Jy.LF9YnH2hTkowLRWL2IYi hnFv1ZvCsOQuGJcNn7IDs6CAbmdoVdtoVK8yD33AMTWQri7h42WNFjp0kOb4Xmfb1.OR89X.AH5Y KwtI5Hjxe4S6tNLl7f4cBjgZmG_dpYrCEXcFseALJ7B2m2EvwTpiNkxw5LRJ0vxbwdJnNZsjA.IP SFFkQzOR9.Pyb0lmOZ9ZuhPW361qhg0PvUoXCI6BoO1W2GpJGDWj.sU552NFkJjYDC4zJbYkXZao _veMoiYqUhuBWd8J9vz_njW94V5OlvQzdSlUNozFkMPDnY4bEcsLoEpFCXULGaw5EjrRFYI8DJ8u LYPafjTuieDB6jcQXDPwU X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ir2.yahoo.com with HTTP; Fri, 12 Aug 2022 21:56:57 +0000 Received: by hermes--canary-production-ir2-f74ffc99c-2vqg6 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 15f5a750f82727a3561822ee8056ab25; Fri, 12 Aug 2022 21:56:54 +0000 (UTC) From: Jakob Hauser To: Jonathan Cameron Cc: Lars-Peter Clausen , Linus Walleij , Andy Shevchenko , Hans de Goede , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Jakob Hauser Subject: [PATCH v6 06/14] iio: magnetometer: yas530: Rename functions and registers Date: Fri, 12 Aug 2022 23:54:11 +0200 Message-Id: <344d3b2f5e050eab79ce9962c24781486774d9fb.1660337264.git.jahau@rocketmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org This is a preparation for adding the YAS537 variant. Functions that are used only by YAS530, YAS532 and YAS533 are renamed from yas5xx to yas530. Same for the registers. To avoid part listing in function and registers names, the name of the first variant is used. Where appropriate, comments were added that these functions are used by more than one variant. Functions that will be used by all variants including YAS537 remain in the naming scheme yas5xx. Or YAS5XX for registers, respectively. Signed-off-by: Jakob Hauser Reviewed-by: Linus Walleij Reviewed-by: Andy Shevchenko --- drivers/iio/magnetometer/yamaha-yas530.c | 126 +++++++++++++---------- 1 file changed, 70 insertions(+), 56 deletions(-) diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index a9d7cf3ad77f..40cd6bbc9952 100644 --- a/drivers/iio/magnetometer/yamaha-yas530.c +++ b/drivers/iio/magnetometer/yamaha-yas530.c @@ -40,20 +40,22 @@ #include -/* This register map covers YAS530 and YAS532 but differs in YAS 537 and YAS539 */ +/* Commonly used registers */ #define YAS5XX_DEVICE_ID 0x80 -#define YAS5XX_ACTUATE_INIT_COIL 0x81 -#define YAS5XX_MEASURE 0x82 -#define YAS5XX_CONFIG 0x83 -#define YAS5XX_MEASURE_INTERVAL 0x84 -#define YAS5XX_OFFSET_X 0x85 /* [-31 .. 31] */ -#define YAS5XX_OFFSET_Y1 0x86 /* [-31 .. 31] */ -#define YAS5XX_OFFSET_Y2 0x87 /* [-31 .. 31] */ -#define YAS5XX_TEST1 0x88 -#define YAS5XX_TEST2 0x89 -#define YAS5XX_CAL 0x90 #define YAS5XX_MEASURE_DATA 0xB0 +/* These registers are used by YAS530, YAS532 and YAS533 */ +#define YAS530_ACTUATE_INIT_COIL 0x81 +#define YAS530_MEASURE 0x82 +#define YAS530_CONFIG 0x83 +#define YAS530_MEASURE_INTERVAL 0x84 +#define YAS530_OFFSET_X 0x85 /* [-31 .. 31] */ +#define YAS530_OFFSET_Y1 0x86 /* [-31 .. 31] */ +#define YAS530_OFFSET_Y2 0x87 /* [-31 .. 31] */ +#define YAS530_TEST1 0x88 +#define YAS530_TEST2 0x89 +#define YAS530_CAL 0x90 + /* Bits in the YAS5xx config register */ #define YAS5XX_CONFIG_INTON BIT(0) /* Interrupt on? */ #define YAS5XX_CONFIG_INTHACT BIT(1) /* Interrupt active high? */ @@ -182,15 +184,17 @@ static u16 yas532_extract_axis(u8 *data) } /** - * yas5xx_measure() - Make a measure from the hardware + * yas530_measure() - Make a measure from the hardware * @yas5xx: The device state * @t: the raw temperature measurement * @x: the raw x axis measurement * @y1: the y1 axis measurement * @y2: the y2 axis measurement * @return: 0 on success or error code + * + * Used by YAS530, YAS532 and YAS533. */ -static int yas5xx_measure(struct yas5xx *yas5xx, u16 *t, u16 *x, u16 *y1, u16 *y2) +static int yas530_measure(struct yas5xx *yas5xx, u16 *t, u16 *x, u16 *y1, u16 *y2) { unsigned int busy; u8 data[8]; @@ -198,7 +202,7 @@ static int yas5xx_measure(struct yas5xx *yas5xx, u16 *t, u16 *x, u16 *y1, u16 *y u16 val; mutex_lock(&yas5xx->lock); - ret = regmap_write(yas5xx->map, YAS5XX_MEASURE, YAS5XX_MEASURE_START); + ret = regmap_write(yas5xx->map, YAS530_MEASURE, YAS5XX_MEASURE_START); if (ret < 0) goto out_unlock; @@ -264,7 +268,8 @@ static int yas5xx_measure(struct yas5xx *yas5xx, u16 *t, u16 *x, u16 *y1, u16 *y return ret; } -static s32 yas5xx_linearize(struct yas5xx *yas5xx, u16 val, int axis) +/* Used by YAS530, YAS532 and YAS533 */ +static s32 yas530_linearize(struct yas5xx *yas5xx, u16 val, int axis) { struct yas5xx_calibration *c = &yas5xx->calibration; static const s32 yas532ac_coef[] = { @@ -306,15 +311,17 @@ static s32 yas5xx_linearize(struct yas5xx *yas5xx, u16 val, int axis) } /** - * yas5xx_get_measure() - Measure a sample of all axis and process + * yas530_get_measure() - Measure a sample of all axis and process * @yas5xx: The device state * @to: Temperature out * @xo: X axis out * @yo: Y axis out * @zo: Z axis out * @return: 0 on success or error code + * + * Used by YAS530, YAS532 and YAS533. */ -static int yas5xx_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, s32 *zo) +static int yas530_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, s32 *zo) { struct yas5xx_calibration *c = &yas5xx->calibration; u16 t_ref, t, x, y1, y2; @@ -323,14 +330,14 @@ static int yas5xx_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, int ret; /* We first get raw data that needs to be translated to [x,y,z] */ - ret = yas5xx_measure(yas5xx, &t, &x, &y1, &y2); + ret = yas530_measure(yas5xx, &t, &x, &y1, &y2); if (ret) return ret; /* Do some linearization if available */ - sx = yas5xx_linearize(yas5xx, x, 0); - sy1 = yas5xx_linearize(yas5xx, y1, 1); - sy2 = yas5xx_linearize(yas5xx, y2, 2); + sx = yas530_linearize(yas5xx, x, 0); + sy1 = yas530_linearize(yas5xx, y1, 1); + sy2 = yas530_linearize(yas5xx, y2, 2); /* Set the temperature reference value (unit: counts) */ switch (yas5xx->devid) { @@ -446,7 +453,7 @@ static int yas5xx_read_raw(struct iio_dev *indio_dev, case IIO_CHAN_INFO_PROCESSED: case IIO_CHAN_INFO_RAW: pm_runtime_get_sync(yas5xx->dev); - ret = yas5xx_get_measure(yas5xx, &t, &x, &y, &z); + ret = yas530_get_measure(yas5xx, &t, &x, &y, &z); pm_runtime_mark_last_busy(yas5xx->dev); pm_runtime_put_autosuspend(yas5xx->dev); if (ret) @@ -505,7 +512,7 @@ static void yas5xx_fill_buffer(struct iio_dev *indio_dev) int ret; pm_runtime_get_sync(yas5xx->dev); - ret = yas5xx_get_measure(yas5xx, &t, &x, &y, &z); + ret = yas530_get_measure(yas5xx, &t, &x, &y, &z); pm_runtime_mark_last_busy(yas5xx->dev); pm_runtime_put_autosuspend(yas5xx->dev); if (ret) { @@ -591,8 +598,8 @@ static const struct iio_info yas5xx_info = { static bool yas5xx_volatile_reg(struct device *dev, unsigned int reg) { - return reg == YAS5XX_ACTUATE_INIT_COIL || - reg == YAS5XX_MEASURE || + return reg == YAS530_ACTUATE_INIT_COIL || + reg == YAS530_MEASURE || (reg >= YAS5XX_MEASURE_DATA && reg < YAS5XX_MEASURE_DATA + 8); } @@ -605,11 +612,13 @@ static const struct regmap_config yas5xx_regmap_config = { }; /** - * yas53x_extract_calibration() - extracts the a2-a9 and k calibration + * yas530_extract_calibration() - extracts the a2-a9 and k calibration * @data: the bitfield to use * @c: the calibration to populate + * + * Used by YAS530, YAS532 and YAS533. */ -static void yas53x_extract_calibration(u8 *data, struct yas5xx_calibration *c) +static void yas530_extract_calibration(u8 *data, struct yas5xx_calibration *c) { u64 val = get_unaligned_be64(data); @@ -647,12 +656,12 @@ static int yas530_get_calibration_data(struct yas5xx *yas5xx) int ret; /* Dummy read, first read is ALWAYS wrong */ - ret = regmap_bulk_read(yas5xx->map, YAS5XX_CAL, data, sizeof(data)); + ret = regmap_bulk_read(yas5xx->map, YAS530_CAL, data, sizeof(data)); if (ret) return ret; /* Actual calibration readout */ - ret = regmap_bulk_read(yas5xx->map, YAS5XX_CAL, data, sizeof(data)); + ret = regmap_bulk_read(yas5xx->map, YAS530_CAL, data, sizeof(data)); if (ret) return ret; dev_dbg(yas5xx->dev, "calibration data: %*ph\n", 14, data); @@ -664,7 +673,7 @@ static int yas530_get_calibration_data(struct yas5xx *yas5xx) c->Cx = data[0] * 6 - 768; c->Cy1 = data[1] * 6 - 768; c->Cy2 = data[2] * 6 - 768; - yas53x_extract_calibration(&data[3], c); + yas530_extract_calibration(&data[3], c); /* * Extract linearization: @@ -695,11 +704,11 @@ static int yas532_get_calibration_data(struct yas5xx *yas5xx) int ret; /* Dummy read, first read is ALWAYS wrong */ - ret = regmap_bulk_read(yas5xx->map, YAS5XX_CAL, data, sizeof(data)); + ret = regmap_bulk_read(yas5xx->map, YAS530_CAL, data, sizeof(data)); if (ret) return ret; /* Actual calibration readout */ - ret = regmap_bulk_read(yas5xx->map, YAS5XX_CAL, data, sizeof(data)); + ret = regmap_bulk_read(yas5xx->map, YAS530_CAL, data, sizeof(data)); if (ret) return ret; dev_dbg(yas5xx->dev, "calibration data: %*ph\n", 14, data); @@ -718,7 +727,7 @@ static int yas532_get_calibration_data(struct yas5xx *yas5xx) c->Cx = data[0] * 10 - 1280; c->Cy1 = data[1] * 10 - 1280; c->Cy2 = data[2] * 10 - 1280; - yas53x_extract_calibration(&data[3], c); + yas530_extract_calibration(&data[3], c); /* * Extract linearization: * Linearization layout in the 32 bits at byte 10: @@ -741,7 +750,8 @@ static int yas532_get_calibration_data(struct yas5xx *yas5xx) return 0; } -static void yas5xx_dump_calibration(struct yas5xx *yas5xx) +/* Used by YAS530, YAS532 and YAS533 */ +static void yas530_dump_calibration(struct yas5xx *yas5xx) { struct yas5xx_calibration *c = &yas5xx->calibration; @@ -764,20 +774,22 @@ static void yas5xx_dump_calibration(struct yas5xx *yas5xx) dev_dbg(yas5xx->dev, "dck = %d\n", c->dck); } -static int yas5xx_set_offsets(struct yas5xx *yas5xx, s8 ox, s8 oy1, s8 oy2) +/* Used by YAS530, YAS532 and YAS533 */ +static int yas530_set_offsets(struct yas5xx *yas5xx, s8 ox, s8 oy1, s8 oy2) { int ret; - ret = regmap_write(yas5xx->map, YAS5XX_OFFSET_X, ox); + ret = regmap_write(yas5xx->map, YAS530_OFFSET_X, ox); if (ret) return ret; - ret = regmap_write(yas5xx->map, YAS5XX_OFFSET_Y1, oy1); + ret = regmap_write(yas5xx->map, YAS530_OFFSET_Y1, oy1); if (ret) return ret; - return regmap_write(yas5xx->map, YAS5XX_OFFSET_Y2, oy2); + return regmap_write(yas5xx->map, YAS530_OFFSET_Y2, oy2); } -static s8 yas5xx_adjust_offset(s8 old, int bit, u16 center, u16 measure) +/* Used by YAS530, YAS532 and YAS533 */ +static s8 yas530_adjust_offset(s8 old, int bit, u16 center, u16 measure) { if (measure > center) return old + BIT(bit); @@ -786,7 +798,8 @@ static s8 yas5xx_adjust_offset(s8 old, int bit, u16 center, u16 measure) return old; } -static int yas5xx_meaure_offsets(struct yas5xx *yas5xx) +/* Used by YAS530, YAS532 and YAS533 */ +static int yas530_measure_offsets(struct yas5xx *yas5xx) { int ret; u16 center; @@ -795,7 +808,7 @@ static int yas5xx_meaure_offsets(struct yas5xx *yas5xx) int i; /* Actuate the init coil and measure offsets */ - ret = regmap_write(yas5xx->map, YAS5XX_ACTUATE_INIT_COIL, 0); + ret = regmap_write(yas5xx->map, YAS530_ACTUATE_INIT_COIL, 0); if (ret) return ret; @@ -829,26 +842,26 @@ static int yas5xx_meaure_offsets(struct yas5xx *yas5xx) oy2 = 0; for (i = 4; i >= 0; i--) { - ret = yas5xx_set_offsets(yas5xx, ox, oy1, oy2); + ret = yas530_set_offsets(yas5xx, ox, oy1, oy2); if (ret) return ret; - ret = yas5xx_measure(yas5xx, &t, &x, &y1, &y2); + ret = yas530_measure(yas5xx, &t, &x, &y1, &y2); if (ret) return ret; dev_dbg(yas5xx->dev, "measurement %d: x=%d, y1=%d, y2=%d\n", 5-i, x, y1, y2); - ox = yas5xx_adjust_offset(ox, i, center, x); - oy1 = yas5xx_adjust_offset(oy1, i, center, y1); - oy2 = yas5xx_adjust_offset(oy2, i, center, y2); + ox = yas530_adjust_offset(ox, i, center, x); + oy1 = yas530_adjust_offset(oy1, i, center, y1); + oy2 = yas530_adjust_offset(oy2, i, center, y2); } /* Needed for calibration algorithm */ yas5xx->hard_offsets[0] = ox; yas5xx->hard_offsets[1] = oy1; yas5xx->hard_offsets[2] = oy2; - ret = yas5xx_set_offsets(yas5xx, ox, oy1, oy2); + ret = yas530_set_offsets(yas5xx, ox, oy1, oy2); if (ret) return ret; @@ -857,27 +870,28 @@ static int yas5xx_meaure_offsets(struct yas5xx *yas5xx) return 0; } -static int yas5xx_power_on(struct yas5xx *yas5xx) +/* Used by YAS530, YAS532 and YAS533 */ +static int yas530_power_on(struct yas5xx *yas5xx) { unsigned int val; int ret; /* Zero the test registers */ - ret = regmap_write(yas5xx->map, YAS5XX_TEST1, 0); + ret = regmap_write(yas5xx->map, YAS530_TEST1, 0); if (ret) return ret; - ret = regmap_write(yas5xx->map, YAS5XX_TEST2, 0); + ret = regmap_write(yas5xx->map, YAS530_TEST2, 0); if (ret) return ret; /* Set up for no interrupts, calibrated clock divider */ val = FIELD_PREP(YAS5XX_CONFIG_CCK_MASK, yas5xx->calibration.dck); - ret = regmap_write(yas5xx->map, YAS5XX_CONFIG, val); + ret = regmap_write(yas5xx->map, YAS530_CONFIG, val); if (ret) return ret; /* Measure interval 0 (back-to-back?) */ - return regmap_write(yas5xx->map, YAS5XX_MEASURE_INTERVAL, 0); + return regmap_write(yas5xx->map, YAS530_MEASURE_INTERVAL, 0); } static int yas5xx_probe(struct i2c_client *i2c, @@ -959,11 +973,11 @@ static int yas5xx_probe(struct i2c_client *i2c, goto assert_reset; } - yas5xx_dump_calibration(yas5xx); - ret = yas5xx_power_on(yas5xx); + yas530_dump_calibration(yas5xx); + ret = yas530_power_on(yas5xx); if (ret) goto assert_reset; - ret = yas5xx_meaure_offsets(yas5xx); + ret = yas530_measure_offsets(yas5xx); if (ret) goto assert_reset; @@ -1062,7 +1076,7 @@ static int yas5xx_runtime_resume(struct device *dev) usleep_range(31000, 40000); gpiod_set_value_cansleep(yas5xx->reset, 0); - ret = yas5xx_power_on(yas5xx); + ret = yas530_power_on(yas5xx); if (ret) { dev_err(dev, "cannot power on\n"); goto out_reset; From patchwork Fri Aug 12 21:54:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 596880 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F00DAC25B0F for ; Fri, 12 Aug 2022 21:59:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233053AbiHLV7P (ORCPT ); Fri, 12 Aug 2022 17:59:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42790 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231424AbiHLV7O (ORCPT ); Fri, 12 Aug 2022 17:59:14 -0400 Received: from sonic302-21.consmr.mail.ir2.yahoo.com (sonic302-21.consmr.mail.ir2.yahoo.com [87.248.110.84]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 95996B5142 for ; Fri, 12 Aug 2022 14:59:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1660341551; bh=PuAzVUYJCPGAi2dhIABGwnKhY1GAm8cD88e7vvhikLU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=OltVJ0tmxCiDnGoMhiaZ3qPmI43swIgcOVWvlrRA/vhkEaOJ/neLM5vAimL/7/MviSbzfX4+XLFWon18M0umJCmurT7zu8cDqk+DIo9wN3OSa3h6bxHdNddh+oDPsIUHzHGQqAnOT4am58eEpUps2RwPpskN+n0uptMdOLqXWmojli+aN3qLfJ6LZ9Rg/YskZ4xrlOac4SECX28rs0m7xadaIihl1AHarH0/cq57fW97nvvlIEIhKBEuApvumMMd15pmvkhyj++sU9eDRQnK/4wOgl+lISMuquO6WU6RqMZk7Ymj1qw7X37gU2BeWQpn9x1O69jb+31P4Tyj7ckZhg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1660341551; bh=9cN/+z3JU59JYRqm84u99sfrH9t1C3/eaSCtTsUXhAP=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=PtlvbMwlBF5BU4hOQ5z+JWSz8zIp92vYrzLPIUPwoZ3aU5vBxdV/7O7FbFYKPADuur6o3rmZ3tAI3yOkJOjEbVkqlw6Os76N6h+AFj32e2FJOXpYPNlKEsbqMKuGbIf+/6pVvapld9ebKsHI6h7ByKg9L2WaDnREkrmMuDgiLhyi3ZowQDqeF2IWZLB6Mnzwxd+2NOKajTfx6dNsodRItQAVLblctmYJ+vSSwtnGdvRQf1QmKdix/5Ga+6vrhiMrdrIT3KdgOLP+C756rJNDks4twxpwf0VcJv0S1FksUX9r5Xt5LR4xEhw+nmn4UiJ5+SKuXvkKrD77jHs3B1FgVQ== X-YMail-OSG: tR7TvtEVM1mBr52ZL30JJNjTpDZSO7qgd1eTSJolFpvLQl0K42TikJHHeL3_ZJQ shX09qTYFBb44JCuqchLrW.OSo6nN4to2O5iebb5rpIy67HhwPLTcWBsZ.ZJnjXWVm0eGDImJQJy TrSPj9E4wppScAeJAovsxfMzo9scpCJCpQweIjmCDPE1WtVeCx3lQPwqMivfUcXXHn7Vj3lS7VC9 bYIHWHN.QlPGnkANBe7oiPxZYr.7MET4KXQfuC7N27LSSUx0SenJvupQZC4UydOarfHTbczRnRMK 6nj3ERvOCM.ZlTsRfoa1pgu6GilJaRPpA_qY7r9si6MkdBStO8hVRwbMo8fwMnnLaX7k2MVKS7SK 7iHofOQf_CQT5Lbxug1p__yUm5PJEgS.E3AbTev5pMIBGw6CPGV1VEO93GPstiFiCpyo2kHcV7MV qkD21WyfPbZnRxIqLlDZmgAXWI2DNXc3Rm0tjqDXSss6OngK7kA7dGYvZVb0rzrIFjEylUE4ROjp StND7SmOsww0s2isy57IXjTk_atOPtZ8SjQvhieQdRWh2.0xlCLIeobEkj.vUHmbXaZfFg27WOui emepDXK26IgtM9rx7CiZdR2coB_uOD6zMSVKqVmM1rx1lkjBY4c5ks5F5BIntReu0cWF7ZQV4UBZ vbCvi8u2oJOJ207qp.0UVSuNgW2u0wG3iWE3Ps.maFkhbYvT8A2T.kABUI66IGJ2u8ssJRwhnj6C jof.EDh2Ed1RaO_9OzxUmcvvnlXoPsxiMkhtG2h_goAUPaEyAj4Bak1wp6o3dKXGbFYf.nQzXvje uIZRIEiMogrrQcwp2CQrItgKz7vrm01t_rLDS9hKkeOqmqyJ9KSjSNKYShSCKJ3SR7kCM3xuPRbt 3qTMeAN0nymk3pMM81UhNb6dWymWN7f_E7jBFCEyBhzfEzY32.pH8eBzgeo6arDI0yCxJ.L4Jx2I T3uMvrEiZfhpMT0Qys9wry1Sj4dx_x4nxVza0AefIMX91jgdjNiwWdmiVABbg3_B1xEo0nXNsVND aXN7waWGCBPVKI0SoRLpJ0q828wCuXxFSgsW6HCYDAbOaC8bXpc2jnN.L8enpHB7gIaH_.JXwIbA fVXllEcX_PHrYmXxwSfJke0KDR.e7usNQOxwxJvaKB0OhxqUqj29.3hkWFfEmezLYHXhmWt02eaA MbWt33YOQugHRdl3WzFS4XSKpx5C1UxenC6awp9_.N848lpdyt0HKkVhtC2jqByRbOtCJvI2U5Bw NRRhbPeCVXU9JUSxzhZpalvYERk4ffdn8bKo3hzVOIbipkg7d0NLowCR2Dh4o7zxgr0P270___fX WLM7s4GhyPIRPfkvaqO39iooQW1qCo693.NKfH4hSXMng7vcNmw3L9.SIdBHcl1J4djHaRk0WrFl TM_3ycxi8.SvEV2.buaxqxVxXaSnedQyBgh05i16I57wY4kwGvP7SNUOEYe1dVsDkN5lXp37fr7D m3IIMMGSm9vXHK8hxKD5xRuSMWlpNbCYVlnewF3myMwXMcmunM17.Mlfk9bnVAYa71YaQ_gn1z_6 DEc92PqUKkt7YatAM0WtR5Gk_SwxyOa.89U7SyXiQw1lwCRwhSMb.jiQVg93Y42462oKXfpJD1H6 _RNSrOozG6B82DZtA2uHqEYR0s9J4KShHmhCQACT1Md7NoGXEghsJRlGu3_3hkcTS2.O9AYxnHWt 2hbBPWNTY5mTpZTkuHH_sQExScBhD5SBH7x.7A6.FOYouYDL8X9GGgJLdWpjEGsWZCed_OVwIaVb b_XYEQ3wPXA791cnALukAFYaxfQiK8XIv1JwNz4WY6QlE3pD1wsgRZiXxdsolvTVe7XDJAxUOAj1 C_8yT3POt.8xnkTJ5fVedPt_15kiYNTYdBncfXMMI6_Szhd1hLoBecIRY_9StSKgtWo2921UGagu 1j88vf7JRfBjckPaFqLaW4_NB0TTFGrJHM.pSzd8cAvHMbr6iXK0q6J9JFKYZmABA.4EbKXpdCMX WGpMbvne4f8lLn2Zg4m4gixoryD.RvUWDRfHoVFEvzdhTAa3QIYc3yUWYFX3fkx5HjjIoy6IksgG SFUPO2UAYhBLd_KwSsWLx4XMTbGbQWoco4VAepNyIUCdCWr.cpmSSHkvpwTWu4ShDW5JTuKYtqSL 8IcJ_wIxJktsPjMGq030yrmaCfqio1Yx6.1bPka5tysG9cuTSoNVA2bVKXDNR8nJN71v2uw2GQCI vpedZn8m4kjKzr6EfDc2z0qkblnvTaRQwfU_5unUQMDQ.19pwz93GJaEOXegMx.Sjhj0wfRrPv7d hps2MsV.chxrTBkms_A0- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic302.consmr.mail.ir2.yahoo.com with HTTP; Fri, 12 Aug 2022 21:59:11 +0000 Received: by hermes--canary-production-ir2-f74ffc99c-5bdfc (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID da2640015b5c2c3b63bd3f8312c2da46; Fri, 12 Aug 2022 21:59:07 +0000 (UTC) From: Jakob Hauser To: Jonathan Cameron Cc: Lars-Peter Clausen , Linus Walleij , Andy Shevchenko , Hans de Goede , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Jakob Hauser Subject: [PATCH v6 08/14] iio: magnetometer: yas530: Apply documentation and style fixes Date: Fri, 12 Aug 2022 23:54:13 +0200 Message-Id: <300e394a76eb30fa031ecb69b594e9f9a70dac42.1660337264.git.jahau@rocketmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org This commit gathers several minor changes. In the device examples, "Xiaomi" is too generic, specific devices should be listed here. E.g. Xiaomi Redmi 2 seems to have YAS537 but it's not fully clear if this applies to all its variants. Samsung Galaxy S7 is often quoted in conjunction with YAS537. Removed defines for device IDs of YAS537 and YAS539, they are not needed so far. Signed-off-by: Jakob Hauser Reviewed-by: Andy Shevchenko Reviewed-by: Linus Walleij --- drivers/iio/magnetometer/yamaha-yas530.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index beb48f3a959c..f81868de5995 100644 --- a/drivers/iio/magnetometer/yamaha-yas530.c +++ b/drivers/iio/magnetometer/yamaha-yas530.c @@ -10,7 +10,7 @@ * (YAS534 is a magnetic switch, not handled) * YAS535 MS-6C * YAS536 MS-3W - * YAS537 MS-3T (2015 Samsung Galaxy S6, Note 5, Xiaomi) + * YAS537 MS-3T (2015 Samsung Galaxy S6, Note 5, Galaxy S7) * YAS539 MS-3S (2018 Samsung Galaxy A7 SM-A750FN) * * Code functions found in the MPU3050 YAS530 and YAS532 drivers @@ -93,10 +93,6 @@ #define YAS532_DATA_OVERFLOW (BIT(YAS532_DATA_BITS) - 1) #define YAS532_20DEGREES 390 /* Counts starting at -50 °C */ -/* These variant IDs are known from code dumps */ -#define YAS537_DEVICE_ID 0x07 /* YAS537 (MS-3T) */ -#define YAS539_DEVICE_ID 0x08 /* YAS539 (MS-3S) */ - /* Turn off device regulators etc after 5 seconds of inactivity */ #define YAS5XX_AUTOSUSPEND_DELAY_MS 5000 @@ -325,7 +321,7 @@ static int yas530_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, { struct yas5xx_calibration *c = &yas5xx->calibration; u16 t_ref, t, x, y1, y2; - /* These are "signed x, signed y1 etc */ + /* These are signed x, signed y1 etc */ s32 sx, sy1, sy2, sy, sz; int ret; @@ -666,7 +662,10 @@ static int yas530_get_calibration_data(struct yas5xx *yas5xx) return ret; dev_dbg(yas5xx->dev, "calibration data: %16ph\n", data); + /* Contribute calibration data to the input pool for kernel entropy */ add_device_randomness(data, sizeof(data)); + + /* Extract version */ yas5xx->version = data[15] & GENMASK(1, 0); /* Extract the calibration from the bitfield */ @@ -693,6 +692,7 @@ static int yas530_get_calibration_data(struct yas5xx *yas5xx) c->r[0] = sign_extend32(FIELD_GET(GENMASK(28, 23), val), 5); c->r[1] = sign_extend32(FIELD_GET(GENMASK(20, 15), val), 5); c->r[2] = sign_extend32(FIELD_GET(GENMASK(12, 7), val), 5); + return 0; } @@ -714,12 +714,12 @@ static int yas532_get_calibration_data(struct yas5xx *yas5xx) dev_dbg(yas5xx->dev, "calibration data: %14ph\n", data); /* Sanity check, is this all zeroes? */ - if (memchr_inv(data, 0x00, 13) == NULL) { - if (!(data[13] & BIT(7))) - dev_warn(yas5xx->dev, "calibration is blank!\n"); - } + if (!memchr_inv(data, 0x00, 13) && !(data[13] & BIT(7))) + dev_warn(yas5xx->dev, "calibration is blank!\n"); + /* Contribute calibration data to the input pool for kernel entropy */ add_device_randomness(data, sizeof(data)); + /* Only one bit of version info reserved here as far as we know */ yas5xx->version = data[13] & BIT(0); @@ -728,6 +728,7 @@ static int yas532_get_calibration_data(struct yas5xx *yas5xx) c->Cy1 = data[1] * 10 - 1280; c->Cy2 = data[2] * 10 - 1280; yas530_extract_calibration(&data[3], c); + /* * Extract linearization: * Linearization layout in the 32 bits at byte 10: From patchwork Fri Aug 12 21:54:15 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 596879 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 60E33C2BB47 for ; Fri, 12 Aug 2022 21:59:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232433AbiHLV7S (ORCPT ); Fri, 12 Aug 2022 17:59:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42812 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233349AbiHLV7P (ORCPT ); Fri, 12 Aug 2022 17:59:15 -0400 Received: from sonic314-19.consmr.mail.ir2.yahoo.com (sonic314-19.consmr.mail.ir2.yahoo.com [77.238.177.145]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 84503B5148 for ; Fri, 12 Aug 2022 14:59:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1660341553; bh=soju2w1mmQ5qFukSEwLFpYSnFgCDfNKRtq3CDVaWa6I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=OrAlXbF6zndCrfQfQE8if0ulr1zFO28G38BmLvAuMtO18CDz3OgRvJerRnT9tRP9f0CCA6A/UydmFcMeAndLjz4WLz8dvdJKWbNjjnijmM3JZ2vIQ2F9jUwNzmq21wWJcTYKwLwVTFb2qKFcHfbQinZvRVH5XJzNb9xNU/f06udk0jDcAD3fJy7YHfhQH7MUD1f6x1qxb/bjYPsx+zl12ImzdjEue/wEH+P1Kr9xMaWHcU7KxAmccm9gFohf2HN74k9w12zCw7yHH1KRejaM+12N3tJ+EeO68XCeQ0QDIYiqWG4WZsNqrDSatPZXqkzu7+7z6jtZWRH99rMkOdIAPw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1660341553; bh=+sto39i1nGejNxdTEUzPOb32s1RoiXL/XKdYP0Bvqma=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=azEXT55hu4ZV9XiOzNoF4EnZse10bdKsH28O4wNKZraBR7BrEZJ/8lUttNsRG4Agbth4UL248Q0kLtcP2UlyYXo+0TloODinx96QdyiuIVOt0yWNQDKIlwGZ2ZBSntzDYeW16jqfMKkrOUrAItCfK4pGKysC5SlRrOJqaKdmiX+5rRLvvYxwCFB4j9ikDVAjVG6Dzvowt7V9vwklQCkkaMgQl5Az5Fe67ty/MHPIMv9TIwTPOh5FiqEZ+5w8E7DFsxbf7hSte4CIxq7iE+Wov/DSrhTbtkcFePbzPhdd+djG429FUbLgKe6PAyZmvIwPT4x3eNOBRxGtJVMoE8kuug== X-YMail-OSG: 3LhErrsVM1nvezyH2rTRju6bSrQYq5oSFOIIF2g9DBA_GlPsus8DmVaOsD7_1H2 13APOwMRjCOASJDQaVoNgzm3giD5O_HEzZU4nLFKBR0Cz4Pg1q5SaoPu0rKzpDK0RpuTk8JkPD9p 0TSkLs4g9qrOJrLh9PM8SEMIfCHJB.6sQOhTxlYZEjdNHtFWVPXdqwBbmn0S0RSRsZqsW0erulJJ EcbMfER.xf0W_e0a.RDMxZwkALZ0v2L3VQwuzNTo_GLJxOuNKqEIB9coe7HvGzKPrR.LWOaJCVzf AqKW.39izWw4.UZVEqff8Sn3lWy7sj10Yu8834pGQZENVLbwt5HZCn7iqmiVmucuZzIO5ypCO8sA HDzt6b_rT5nFFTm_bjV.ZO85M4v0FLDJAjAvZQQtv6Wz3PG.skA.hFL7g.l2nwNDuyTW1xYuuMF0 uEgFqGtiKkwZ53dAr84NxtxQp4ukYtKdH9LUhhAtBcxN2InjXDJ17WorkvEW5k.CNQaaYYLL7BdL AX7WrQ8huLh4Ux0x1dC.Aw9n3iHZKmX7CtmMAQ5.554Vk5KNsO3MWmCYqQCmn.28onMPWhAjn9pw EUEJ.ERTkl_UoPbNouehtOf8.SIm7l3S4P23BEk9Gh5iJ.uLlUW8VrdGFl1yS4744GsJlLjk9_9e OHwYFU0HL0o8PjdzneK0EEcIKm03mpoidPrLNmQdwUGMYb2cJBUl2NGOVeSY0bHtLW7e68Ui8OIq bhVNZuLnsKriKWKYL_HeUTXNsDZ6gSz_N36jVSeloSZ1qPNaa_PZncWrg2nAg.YayEq3UiB.vIH7 .AY4LPtiyDJR5r1KkV9arDuGRXsrs8ozYN6jlXqTiofV.rokeLQ4PdEo827Zu6qo8oIYe1h98Nyi OO8LaAdacPX_a09MvCklubnaK3xK._npEHKgSdLZh9ngVflg7GtCD61m0qcGdNxeoyqOQmPLn1tm coJzu0oEq9e_YCtQZsFuvS3vWJWU7vssH0grW_Pk57R_dRUZ75VjrkJMap5SO8t8BCr6GU7ZHNUz rid03LlH0DX33ebSM8uqg93nzf3P3tuhnIqchyJrH.mDd3Z_ud3d1WprUJoUp9qyy2OsqBfAXusS nefxDLct2TWPO_hE.HHY.WWhI6OV4XwRtkPMkW5NVUYPCUKZpDxf6RfQYRJxt8TMuf6OID8ABtw3 5WJn5LjdGv6gP0sGd4LfqequCsP0659msmvpEzR0M.BxJXqHp4hECu1gH755qGZO3SRFK18OZi2J mTrzecs8m1EMa06ojAjFviV9zhfT5AHAFi7pZtTru9y3db7Qg5MPcqxE7SROy7BoH8lW6YUw6alw .VxZJOusa7GEJe.n17MuIzI1WnMIu05VBYKO3v7MWxSCK32ELM1PDtCD_4Wp0CyTjhG2JSHDKNos AHBQ__KKMPAMdynevTJXNAD6olTvVBioVQNG8eT7QvUO19RvHstglGN8hwaR7Ic6d4eAS3jbnXFQ LaG18puKQOBxwDsFWWUlcyJEUv6I3ozC1J97SzD1kB2pJ4x9.NqoHjmdDuX7aZemTqY03ewOfbdf VT7ePt1b1vqLdLel30j1RAkkNqxrzhQRTcO026kxnCOFIFCFrpcqOMZr3bfHypXlK1Flx3ZrAsOV m_NUAyfla7drpLLOvTBXB4jC6vOQSzWl48itIFnumcN1YpAxC3djvW7OdHD6e_747xRRm0enxLOy dI_8e8U7XRc.sPFAT7bQWSUOBMat4FOVCr2oTRcs.WVj_C8Iv9yZ3y6xTLHCzanSwBuC3GFTtmde Z0IDNIGAQjAfNfGolSOlnStVS.ItP49UJiBdkg46ajYF1FwwFpu24VXnoYWqFCypNgorAE2CGBDG 2Z.f21eYrtv4hlU6sYGCFicvyvAlmFgFlUglk8qmCcegudgKdSkGuHPvTmiXOBDpA4SMKo8W1vdV 0NwrDGT44dD0kBSjg1LaCdCq2MUfC405iP2a.eR6WcEiMZtSnwr80SV3xdEtunfimGPxQJTLb1UB tifyu8Px1B_iXT47e0XA3KslS.6kdAfiurs7gPUwy.rZbr3zXo01KsjMKN2VFLv.vwnXfJ6WWdNG ZztMTnZkgUb.5NEokLRWQ17YnlictM92xcIlGbtkR7kB4lVc_tx_t3uMpDKpsHGfDsWz.ps2CC9C K.SmKvARNafDsneFl05srwX2hWLIea0K7NK1geBF2p0a5Xfbhjze9aGHvttfml6kgi6ltgwVrBKI 6n6nNBb_wCj1DgLO2Tvgi5bBEUKqCjDjzI8MiEJju94XoG_Ab_JZED0FAC1KKm.6x4KTUGvAodiz KQ03Ow1oQetvvBDjFO6o- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic314.consmr.mail.ir2.yahoo.com with HTTP; Fri, 12 Aug 2022 21:59:13 +0000 Received: by hermes--canary-production-ir2-f74ffc99c-5bdfc (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID da2640015b5c2c3b63bd3f8312c2da46; Fri, 12 Aug 2022 21:59:09 +0000 (UTC) From: Jakob Hauser To: Jonathan Cameron Cc: Lars-Peter Clausen , Linus Walleij , Andy Shevchenko , Hans de Goede , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Jakob Hauser Subject: [PATCH v6 10/14] iio: magnetometer: yas530: Add volatile registers to "chip_info" Date: Fri, 12 Aug 2022 23:54:15 +0200 Message-Id: X-Mailer: git-send-email 2.35.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Add volatile registers to the "chip_info" structure to ease the handling of different YAS variants. Signed-off-by: Jakob Hauser Reviewed-by: Andy Shevchenko --- drivers/iio/magnetometer/yamaha-yas530.c | 38 ++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index 4fe7e8c820c3..fa317b975f8f 100644 --- a/drivers/iio/magnetometer/yamaha-yas530.c +++ b/drivers/iio/magnetometer/yamaha-yas530.c @@ -102,6 +102,11 @@ enum chip_ids { yas533, }; +static const int yas530_volatile_reg[] = { + YAS530_ACTUATE_INIT_COIL, + YAS530_MEASURE, +}; + struct yas5xx_calibration { /* Linearization calibration x, y1, y2 */ s32 r[3]; @@ -123,11 +128,15 @@ struct yas5xx; * @devid: device ID number * @product_name: product name of the YAS variant * @version_names: version letters or namings + * @volatile_reg: device-specific volatile registers + * @volatile_reg_qty: quantity of device-specific volatile registers */ struct yas5xx_chip_info { unsigned int devid; char *product_name; char *version_names[2]; + const int *volatile_reg; + int volatile_reg_qty; }; /** @@ -616,9 +625,26 @@ static const struct iio_info yas5xx_info = { static bool yas5xx_volatile_reg(struct device *dev, unsigned int reg) { - return reg == YAS530_ACTUATE_INIT_COIL || - reg == YAS530_MEASURE || - (reg >= YAS5XX_MEASURE_DATA && reg < YAS5XX_MEASURE_DATA + 8); + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct yas5xx *yas5xx = iio_priv(indio_dev); + const struct yas5xx_chip_info *ci = yas5xx->chip_info; + int reg_qty; + int i; + + if (reg >= YAS5XX_MEASURE_DATA && reg < YAS5XX_MEASURE_DATA + 8) + return true; + + /* + * YAS versions share different registers on the same address, + * need to differentiate. + */ + reg_qty = ci->volatile_reg_qty; + for (i = 0; i < reg_qty; i++) { + if (reg == ci->volatile_reg[i]) + return true; + } + + return false; } /* TODO: enable regmap cache, using mark dirty and sync at runtime resume */ @@ -923,16 +949,22 @@ static const struct yas5xx_chip_info yas5xx_chip_info_tbl[] = { .devid = YAS530_DEVICE_ID, .product_name = "YAS530 MS-3E", .version_names = { "A", "B" }, + .volatile_reg = yas530_volatile_reg, + .volatile_reg_qty = ARRAY_SIZE(yas530_volatile_reg), }, [yas532] = { .devid = YAS532_DEVICE_ID, .product_name = "YAS532 MS-3R", .version_names = { "AB", "AC" }, + .volatile_reg = yas530_volatile_reg, + .volatile_reg_qty = ARRAY_SIZE(yas530_volatile_reg), }, [yas533] = { .devid = YAS532_DEVICE_ID, .product_name = "YAS533 MS-3F", .version_names = { "AB", "AC" }, + .volatile_reg = yas530_volatile_reg, + .volatile_reg_qty = ARRAY_SIZE(yas530_volatile_reg), }, }; From patchwork Fri Aug 12 22:05:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 596878 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EA746C282E7 for ; Fri, 12 Aug 2022 22:05:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236034AbiHLWF1 (ORCPT ); Fri, 12 Aug 2022 18:05:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49308 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231698AbiHLWFZ (ORCPT ); Fri, 12 Aug 2022 18:05:25 -0400 Received: from sonic301-22.consmr.mail.ir2.yahoo.com (sonic301-22.consmr.mail.ir2.yahoo.com [77.238.176.99]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7F0A75C9C9 for ; Fri, 12 Aug 2022 15:05:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1660341922; bh=jr2xytb/J/2n6Kd3wfYldek1d2bL7GKUO3ekuqQrFmw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=e7sTNEN7W6FMqKzxcT+x1SoTF9UjXmYSY0P/2R4sTjxP8wE9zAFgKdC6oLvCi0C2AxZfAAAdc2WprPKHO1DDtRgrxOAtB39cYCUVuCnHTv/DdWYaJjGxOv2SNEmdAXFu6skpy8LKy+IMujMCHbK1E4fjAXIbKoKfrvtaDpZBuVKIg0B2G/UWpCQlhV0BezJzU3pNp2bjSE8QEmtUD+rOLyacZ6jkmqinyRm/cr1d3RVgV0YYuGrGWXZ488Xuu2C4Bf/ZvpTXdMZdTqVEYZf8vA1JBdj6zzhuXpSZRrw0b4wQSDgtlLthJzGQlwifSUR7zaJwAlUE8nCW3rJV56NIJw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1660341922; bh=88yQBi06fqvxFRvHA8z5fmgPw6cYF6LDK4uthjBdXlk=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=FkO5/IZ8qckWqpqp1/ymXo1+dUIVFYb+mb9IFyDYQhsbPJj3C26p1YK2iGViwDyhs6pbj0Btm7Ky95NbAX+C04qwebZVn+kYyyfSI4DRBn2JUzO+WfKgByOYFCsWbrq6W+xuMLS8LFWKR7bKb6OgymGUV0yTaviZwSUcVmrOcZM38cS6RTPi6RFSZEfmepSiCwKr1lSn4pJMGoCpIyRSYkyaBKfZ0otczEPS9o2n/EX9ubwIvtHGniyp4F00He6tZGqmbf/56bQ+YjhqL9EBRr3BSB3QCu8x0l3VOxbvB8N46qmxsenX6gXwpJ9bA2s3UadhmgH6aQfft2LFyDPVDA== X-YMail-OSG: LlMz71oVM1m2cdm82sO9JqBSax_KJzNEBmUIKhOIu.y4YVIQyIRmtCn1cEwJBQk NfZs9ZxmAYG0Xl_DHBjz3VG8Rnb5V0djBgaYP4ZVEcFB_sWOEploa2sG4lFAjWgQkHIyGyxDbEZA RBsMCLYgnCRGbSgs4EVNu7oHo_HX14s9b7y11vp4iJYhH9rugUpKXd6TKc55nOnDl70OC.Bj__rC b8zgG9Ty.kP0qdTKUx8wAHBLf3uq4tzjxugJHJ5__YxgZPEXqNLKOyb_dTXGaFAucvFQ1rynJRiA _nfC89ExaTiWvHAmGjOLgo6BrnAz_zrrZZRgeyEVb43CKh8BXF5V0aJhsxsAK4413OCzY4xhmRNA ycDlVqYN.M9PFvKx0bh.4JEpUyb4eQIKgnLYO0JqmB8wwJwMlTKc0berTqJIJiIsrBGBwOQkOsGW yVRaBH2X5UWeCLTt9VQb_Zpb9fPVvTJx0kbwbhs.N7xMZA7aE.mo6zqc5ZCyd1XPo5_ALfJ0_OiA QbLPyY7wzWJqkNqSrhFv1IkLDYtehsyueLt8lP5js2xLdC9J7j24cFfgWb0C6CbiSQ8A_QX6sLrr aZx4I.1h9lzJofpjnHmbpdQBJkgAXZBXDjSx3wSZQ_voHyr0MghvNy9PuaAx_MArcL6Fb26EcxKB ePkOwETpwuZ5I_IiD_bMsYPXZvIsPM9OazYPfMoxjALz00LRMJgf3awNnUW7NB0DeufMYSWBT1O6 2YK_66wWlmZl_TbgP2nRkjFf2R59VIyMAXGdxFBubIkvOWI9ObnCn2xPawPi5iTyRONDxXHwYrL9 6pkNByIWURmC9Rq_iRRd1vOy_phn8EteIAUU66Ro4jpOCMEalhiTSaO2Gifl6cKaxhI7WN9sxmmA KfjZGnWTGLW7qUrOaEy8rBOOzVUomGRZg_AfCsdnV9ZehwWE4NV.YgsW8CjHou0gqeWcd8vdpTFH rFSu3D3a79mlJ.Trr0.RCRDpGOUnpsHNWWfCz8VdranUdjgRMFPeHZsjfOvkiVF2DBPIkjyKslGY nrqzcyLZZlZxsiCclv4NKak7SuXJh2Tm5xwTBKWW7B70KfBIBc7OKf7eSuCuG5lIpM0S.YcqPY9q NvXrTTOyfmhZjI2h9FyWl8A_Zf8mfu0r8odztuvhV9W6SJbpKSu.kY5eETNNI5Wy7b0jW19I5q9B p98YxcixvPiv6I6C0KCpkNj7X6rS3aZ_igjNzJtvqnbdjS1pjOAkBgMfATELlA3mQOK.6ezGZzj4 c08m.8Oj.cuj6pzhJ7_N8BeUeU8GAJn.MixTn5nC4Kt.8.9QB76ubhtenRUPZ37atfIahMRBRpGN yEnNNMsHvlpynEHXkxNd_43mgJgLHUDDRpFQentYNddYHcFs0tBBtEFuZhLImoeBEsbZZ9oBYGkQ _ipzI.6W0svDrw.L2flXqRAz00T8QzWdiaYQJhALmbeL9n9DyivxLyHus7pL.vT.9dOXjXM53vlm HSt3KFAiUlXMD_hdRZwpVncUrgDIda44DZAF.zZKPF.vvkxjUqv422pxmLw8mRR4ekzbmbC7k1UC x.9CFSlioSE6nW0WjA0x9msTxbVKhc4BJ2gGdbLvT6Ad9MaFGAWmT0m1fcsLm1eZKfRB4lBDuwep pRWlglBFo8ecEe.NMh7uFlOUPZe2tcW8NH._g.0XSnKvMVK6j2XzQ2L6rk4KpaBZsRjsOvrI9SFY P6NbjmlKpuvPGAxYE0y6Cg_HtRe.4A8Tdbov0YAsM5XT7YEr18QkJPrO0T8UYBQsETg4a_.xqco0 WCkcM27rYqWhJTQCCtiUiQkyBngqYamQ1weS6lAluaNQOVuhXgwW2kjedTJc2mmC.VNVs4UHSbeU V9BCFXGYNYBy5Ui6PUvxYhlm3iLPBbANR9RknyvkUefwDIhMwSSSSmvWXKuk9421APqNmxaC7Uav hJv291qMLbFMYrJKKLqERhz2rYijMtazJNygRaI2SQaJxiIAtTEqSkkOm9QtZoWFSi7F_8iDA37y WbwinyuLW4mis8u4ifYX9_ZlbAadNGhnQppryPikWeroeXdtVar8xnjNIGNwuVcMdD2Xv4aTsyHR TV2RQBIG0Xp9QevlNhIpNnLxsWJ.7rB5bIwkVh7r89NIFePbZNIAQOV4Vgofq2icUE_Uot7C0FGb zgwLM3wO812GuL6LvarEX0fVH_k876PtLdzeHKkrAUT82mrK5F55fte8eUpoH3KfFFElK6RX1zqU VePGSDwpvwnVEwyw2hM02MbQSyo.rDHESww6_GbK1DnOuHsBPd5iNVb7C.76_MrLXwztbZMl_Ty. UZCV4T43HsgWQJqU- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic301.consmr.mail.ir2.yahoo.com with HTTP; Fri, 12 Aug 2022 22:05:22 +0000 Received: by hermes--canary-production-ir2-f74ffc99c-48gl8 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID c89c964524cd385a78dd9672c65b4e57; Fri, 12 Aug 2022 22:05:21 +0000 (UTC) From: Jakob Hauser To: Jonathan Cameron Cc: Lars-Peter Clausen , Linus Walleij , Andy Shevchenko , Hans de Goede , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Jakob Hauser Subject: [PATCH v6 12/14] iio: magnetometer: yas530: Add temperature calculation to "chip_info" Date: Sat, 13 Aug 2022 00:05:01 +0200 Message-Id: <1a8bffdb7e807455620a73f2d61981e7f9aab8d5.1660337264.git.jahau@rocketmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Add temperature calculation to the "chip_info" structure to ease the handling of different YAS variants. Signed-off-by: Jakob Hauser --- drivers/iio/magnetometer/yamaha-yas530.c | 123 ++++++++++------------- 1 file changed, 54 insertions(+), 69 deletions(-) diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index af5c090098fb..a5d3f0bff024 100644 --- a/drivers/iio/magnetometer/yamaha-yas530.c +++ b/drivers/iio/magnetometer/yamaha-yas530.c @@ -79,7 +79,6 @@ #define YAS530_DATA_BITS 12 #define YAS530_DATA_CENTER BIT(YAS530_DATA_BITS - 1) #define YAS530_DATA_OVERFLOW (BIT(YAS530_DATA_BITS) - 1) -#define YAS530_20DEGREES 182 /* Counts starting at -62 °C */ #define YAS532_DEVICE_ID 0x02 /* YAS532/YAS533 (MS-3R/F) */ #define YAS532_VERSION_AB 0 /* YAS532/533 AB (MS-3R/F AB) */ @@ -91,7 +90,6 @@ #define YAS532_DATA_BITS 13 #define YAS532_DATA_CENTER BIT(YAS532_DATA_BITS - 1) #define YAS532_DATA_OVERFLOW (BIT(YAS532_DATA_BITS) - 1) -#define YAS532_20DEGREES 390 /* Counts starting at -50 °C */ /* Turn off device regulators etc after 5 seconds of inactivity */ #define YAS5XX_AUTOSUSPEND_DELAY_MS 5000 @@ -131,6 +129,14 @@ struct yas5xx; * @volatile_reg: device-specific volatile registers * @volatile_reg_qty: quantity of device-specific volatile registers * @scaling_val2: scaling value for IIO_CHAN_INFO_SCALE + * @t_ref: number of counts at reference temperature 20 °C + * @min_temp_x10: starting point of temperature counting in 1/10:s degrees Celsius + * + * The "t_ref" value for YAS532/533 is known from the Android driver. + * For YAS530 it was approximately measured. + * + * The temperatures "min_temp_x10" are derived from the temperature resolutions + * given in the data sheets. */ struct yas5xx_chip_info { unsigned int devid; @@ -139,6 +145,8 @@ struct yas5xx_chip_info { const int *volatile_reg; int volatile_reg_qty; u32 scaling_val2; + u16 t_ref; + s16 min_temp_x10; }; /** @@ -337,6 +345,22 @@ static s32 yas530_linearize(struct yas5xx *yas5xx, u16 val, int axis) (yas5xx->hard_offsets[axis] - c->r[axis]) * coef; } +static s32 yas5xx_calc_temperature(struct yas5xx *yas5xx, u16 t) +{ + const struct yas5xx_chip_info *ci = yas5xx->chip_info; + s32 to; + u16 t_ref; + s16 min_temp_x10; + int ref_temp_x10; + + t_ref = ci->t_ref; + min_temp_x10 = ci->min_temp_x10; + ref_temp_x10 = 200; + + to = (min_temp_x10 + ((ref_temp_x10 - min_temp_x10) * t / t_ref)) * 100; + return to; +} + /** * yas530_get_measure() - Measure a sample of all axis and process * @yas5xx: The device state @@ -352,7 +376,7 @@ static int yas530_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, { const struct yas5xx_chip_info *ci = yas5xx->chip_info; struct yas5xx_calibration *c = &yas5xx->calibration; - u16 t_ref, t, x, y1, y2; + u16 t_ref, t_comp, t, x, y1, y2; /* These are signed x, signed y1 etc */ s32 sx, sy1, sy2, sy, sz; int ret; @@ -367,47 +391,30 @@ static int yas530_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, sy1 = yas530_linearize(yas5xx, y1, 1); sy2 = yas530_linearize(yas5xx, y2, 2); - /* Set the temperature reference value (unit: counts) */ - switch (ci->devid) { - case YAS530_DEVICE_ID: - t_ref = YAS530_20DEGREES; - break; - case YAS532_DEVICE_ID: - t_ref = YAS532_20DEGREES; - break; - default: - dev_err(yas5xx->dev, "unknown device type\n"); - return -EINVAL; - } - - /* Temperature compensation for x, y1, y2 respectively */ + /* + * Set the temperature for compensation (unit: counts): + * YAS532/YAS533 version AC uses the temperature deviation as a + * multiplier. YAS530 and YAS532 version AB use solely the t value. + */ + t_ref = ci->t_ref; if (ci->devid == YAS532_DEVICE_ID && yas5xx->version == YAS532_VERSION_AC) { - /* - * YAS532 version AC uses the temperature deviation as a - * multiplier. - * - * Cx * (t - t_ref) - * x' = x - ---------------- - * 100 - */ - sx = sx - (c->Cx * (t - t_ref)) / 100; - sy1 = sy1 - (c->Cy1 * (t - t_ref)) / 100; - sy2 = sy2 - (c->Cy2 * (t - t_ref)) / 100; + t_comp = t - t_ref; } else { - /* - * YAS530 and YAS532 version AB use solely the t value as a - * multiplier. - * - * Cx * t - * x' = x - ------ - * 100 - */ - sx = sx - (c->Cx * t) / 100; - sy1 = sy1 - (c->Cy1 * t) / 100; - sy2 = sy2 - (c->Cy2 * t) / 100; + t_comp = t; } + /* + * Temperature compensation for x, y1, y2 respectively: + * + * Cx * t_comp + * x' = x - ----------- + * 100 + */ + sx = sx - (c->Cx * t_comp) / 100; + sy1 = sy1 - (c->Cy1 * t_comp) / 100; + sy2 = sy2 - (c->Cy2 * t_comp) / 100; + /* * Break y1 and y2 into y and z, y1 and y2 are apparently encoding * y and z. @@ -415,36 +422,8 @@ static int yas530_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, sy = sy1 - sy2; sz = -sy1 - sy2; - /* Process temperature readout */ - switch (ci->devid) { - case YAS530_DEVICE_ID: - /* - * Raw temperature value t is the number of counts starting - * at -62 °C. Reference value t_ref is the number of counts - * between -62 °C and 20 °C (82 °C range). - * - * Temperature in °C would be (82 / t_ref * t) - 62. - * - * Contrary to this, perform multiplication first and division - * second due to calculating with integers. - * - * To get a nicer result, calculate with 1/10:s degrees Celsius - * and finally multiply by 100 to return millidegrees Celsius. - */ - *to = ((820 * t / t_ref) - 620) * 100; - break; - case YAS532_DEVICE_ID: - /* - * Actually same procedure for YAS532 but the starting point is - * at -50 °C. Reference value t_ref is the number of counts - * between -50 °C and 20 °C (70 °C range). - */ - *to = ((700 * t / t_ref) - 500) * 100; - break; - default: - dev_err(yas5xx->dev, "unknown device type\n"); - return -EINVAL; - } + /* Calculate temperature readout */ + *to = yas5xx_calc_temperature(yas5xx, t); /* * Calibrate [x,y,z] with some formulas like this: @@ -935,6 +914,8 @@ static const struct yas5xx_chip_info yas5xx_chip_info_tbl[] = { .volatile_reg = yas530_volatile_reg, .volatile_reg_qty = ARRAY_SIZE(yas530_volatile_reg), .scaling_val2 = 100000000, /* picotesla to Gauss */ + .t_ref = 182, /* counts */ + .min_temp_x10 = -620, /* 1/10:s degrees Celsius */ }, [yas532] = { .devid = YAS532_DEVICE_ID, @@ -943,6 +924,8 @@ static const struct yas5xx_chip_info yas5xx_chip_info_tbl[] = { .volatile_reg = yas530_volatile_reg, .volatile_reg_qty = ARRAY_SIZE(yas530_volatile_reg), .scaling_val2 = 100000, /* nanotesla to Gauss */ + .t_ref = 390, /* counts */ + .min_temp_x10 = -500, /* 1/10:s degrees Celsius */ }, [yas533] = { .devid = YAS532_DEVICE_ID, @@ -951,6 +934,8 @@ static const struct yas5xx_chip_info yas5xx_chip_info_tbl[] = { .volatile_reg = yas530_volatile_reg, .volatile_reg_qty = ARRAY_SIZE(yas530_volatile_reg), .scaling_val2 = 100000, /* nanotesla to Gauss */ + .t_ref = 390, /* counts */ + .min_temp_x10 = -500, /* 1/10:s degrees Celsius */ }, }; From patchwork Fri Aug 12 22:05:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 596877 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 970A7C25B08 for ; Fri, 12 Aug 2022 22:05:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236205AbiHLWFd (ORCPT ); Fri, 12 Aug 2022 18:05:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49552 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231698AbiHLWFc (ORCPT ); Fri, 12 Aug 2022 18:05:32 -0400 Received: from sonic304-23.consmr.mail.ir2.yahoo.com (sonic304-23.consmr.mail.ir2.yahoo.com [77.238.179.148]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A7FB73913 for ; Fri, 12 Aug 2022 15:05:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1660341927; bh=rwrJBC1EN3No5MvFpujm/uDVSFGv9ifS8IkWpNzBRm8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=hcMETl6gu8yCjmlgnTY8Nza1aKfJCC4/Sq0EYl6Apyf+c7beA95fRAIS234Eir5XVBTjyqboH2yFD7iCYO7fNRdrNbQWohxxqtsn/uLMtwh5rAumSbV1d/TYUNfy1VBUILEb6XitvjxtVtWZDeBhrFBgqlzrXMxPcf9C5TOQdc2zPEIbEEU5mUuCJW5JNb5NnZyjlEar3itG35BchN0HUkMwWQ0h1gyQ6PenkIKV7oit3NBhHJiBkPdUInd1JEhrV/FN9ePE36DhWn1/gMf1EvS8tZmXe4L4UGQJdgq4Np0QsxHRhIAuwJSYZznbsc6BpJx3ryKpu4MlQbgx88hlsw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1660341927; bh=5kSy/aRPj1svObuf6SHFS4ytNbVyVxOyXpAE7DWAFj9=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=q60QeanD0NaFj6c/QeNsvqQxTSgjhs/VFjJTVDHnL+96XiWb8l/OI1nCk5PEp1pSVcgmeJi+ZzxJALZOmE8kn/fGocLtyOFYJNniCOTlRb5cfHC9J7PuBbqpyin4ibjeKphVS/mqadXwK1qa4HuS9bzBvXyo7HEyinGkmVWHz8wHSdO40AUdtWgNcP87PTr/gDrjq+HB+YqRv/4ZlUacE+lPFYr2hjnzijMDD4c/2yNd7AjeGEcgcms7hi/cR4VxHHB8kW9tv3GYXZnCZ7tDDCuY58irF3HbY4K8/QzBtL+hzrUWw4PMvohKMG1AGRybQ22T7/n3fNQ35Nw+xpvBQA== X-YMail-OSG: wM.pzMEVM1lwchGJ1R3Es.8apy8nDf8QQGcXJgNaJO3fY7k208SYv5TmEMrWacm qQJbX6kU3S9IwsE7q7xeEPwNmel50sU.4lNjxsW5Ab4Ry8CaxM9E7dMOiVlxD4zDQ8B7lWKSYuuR uY4YNkMKGbhohMEpNSrOmCv1M7YsY9S47Wp7736IjYyZyGBIjoQtIff_15u4.2pm8WeXfpha9Fk9 _CuyiN4SBiYOPPkhOJti_RpuChJ16kzpa_8K9JGdkXmSqZLt2QKlwpJOQlvk.EDF9ffOzF.Xfem7 kQs5O0cQnvuMHC57rBqo7227czOmTZbldycZeYVs12UjECeE7bm2f_FHJmoM5exu6yD3sw6hA6AO ecQVAI3trBAyMoXlX65FmixtOpqQFfgE9KvjD3qFJTsPYGMqfphSaTOdrMLeijDjvQ7HOchE9gqE h8TSu7ipe3atxHTdvkYnQIk7rpu8HFrwUisOydKzi.Eif.ucmVE2_OdsRdsr86BsWAhMr2qz3vhd EdcPvoj1SpCGAo.DRJN5T1G9Ln.zWVTxGkdo.giPGRL5vVtlVFjk7d1jqnAos81K46Wk.jNrWXTT 3Ek45EOmWeZmky39gJrghuj1b5iynjJ6acweOP1dPyFoHT8IyfE3IPRM7mR6gaN54sL.un3EkwMF ZXXnrOTIGEN9o4qFYDBaHNpXzOyrgedN1kznAcHJC5Qp.EzBIrkBwhLoWZuU74LWNrX12aWbIp8f _KbQT8bAZKN86_P7od52SXn0K9RbheCmM._QqIsJLmoC9LsdNp8Z4qPRIdvo8I1WT1GXgamJ_Hxe O3CsvoXWE1_QxUSo8RZp.B2yuINgLwVpzhSST9gAu4Aec.aLDYM6RSbJrE1S4FgatGgP6kN7CdHu TUMGrQN9F0qtz6pIgZ.6nRcIpJkdMx2jleCrJkFILir9opeOV7aHUQ_g.PObMvWAycKugzb0QznU 60WP1858UayAnqkk3YgT56jZ.RrLO04o06ehQO4GwJnynV5auToglK7dmAmyTORqFElnX1nRsDbV q.PEJZhJObbg.GLKrk777Sc4DA.KKHsH8OYK6voXGC6uKz0.SCguVjqUB1aFN.tmjqFDtAmm.0W1 E2qrrdbMx22wTEn2LPBZsMX5JLh8jeir8u9jpdkoLF.Ug74gcmk3DQyt_13pshiUkic_zNWTSs.L ASSj70yA6PgrexNNXj_1hPmqq6F5R0MVF3FbPbA2vXzjZuandb9TEXMvy7khOyPVX4nm2HrjESJ2 iV48ujwfXUT7CExFfPtU_AURZf4KUpRylKWCHx.L5tYBBgcMZTjVgnGG0lN.zQEeustcoP7LSBD2 9uM4tjpgimHvRVD6J5Onx0ZGfvAbBbPyvfloMyFNsFKWvNSH03ODDkPTIWS1nponwJawM1W9dKGd 3Fcx0nSVUnnF0oU7TiVylhQqQeL04lkFVkfyfrFjwAw2HT_wPkvxCXdveAmi4JV3uIopBcvuY7XS VnWKJCJjluBEGUPCkGsa4yIKlMUWFLwDQLcPMWC5y1dU9HK4XEQ6aRvFaYwdAsR4526bxTFVFmqb qjUxSx.sfVn3uxfIV61pfg8ugaXrtMLmkwBR7fcyTLY0TRPIE0i1vJL7rwduuUfNJaLNSMqQhtmK .uurSxnoVDInV2pizshqadtrrsqy0JeQvWOJ9IhKepz6SV5KB2675laxcemow1j8K9LMDkD48bMU mIDJl97apoXuNurVyXstDle8.hzzymO2FX5Ftc4p1bRR00BGXQKaDlTNI2A_oRuyMw3aeceEhOCe YM48.HE7ofdG_Pa.SDIB0QY_fINOjNcFOBcmzz9EpAxGIASnRr1wOoFrdRHG4p5vrvgdGAjvuBqI Rjbzprht8HgMwEmmohT1aYQ7GRZacJF8T2ZsLuNff0zOb_ZqZy5455ONr5p8brnoUk8EZ8DQwMiZ d9Pm4hBxARptE9jFWfPOVoyqeDiDmLY72BJDj2xopnRoMREnoKZkbHjEJJHtgk0OhOdsndo.cvro a.zEPMEz45xbgHRgBlarXxjzlGbjt.aMy5ss5efgnTArLp6vpYnUM8_fdSH6n0gOgRUFoidYdiY9 IJXh.BsmDSwYIUU4PgJ2x5crIdVipYF8P8QP3VHDqWG1E3CPI2uJ0EoxSDQmVyQi5JVlzQYuUhiD FGePG25iTjQoEUIhkjQJGzQe.nymptWYoU2HN8PedQ6Z.D3HekbcSeAWlfW1hC3j1qmfHAqEmvAo k1e5Lak.gdeGUEO36gHS9cxO01vS5TVr8Kk9Y1Ay6q7c2qKJL.Li0q.2E4AI7pMnFhKES2Qvwe20 U3fdtgQVvsW51zA-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic304.consmr.mail.ir2.yahoo.com with HTTP; Fri, 12 Aug 2022 22:05:27 +0000 Received: by hermes--canary-production-ir2-f74ffc99c-48gl8 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID c89c964524cd385a78dd9672c65b4e57; Fri, 12 Aug 2022 22:05:26 +0000 (UTC) From: Jakob Hauser To: Jonathan Cameron Cc: Lars-Peter Clausen , Linus Walleij , Andy Shevchenko , Hans de Goede , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Jakob Hauser Subject: [PATCH v6 14/14] iio: magnetometer: yas530: Add YAS537 variant Date: Sat, 13 Aug 2022 00:05:03 +0200 Message-Id: <264c6488733a5c32089c9ab406a5bcb808c48fef.1660337264.git.jahau@rocketmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Add support for the magnetometer Yamaha YAS537. The additions are based on comparison of Yamaha Android kernel drivers for YAS532 [1] and YAS537 [2]. In the Yamaha YAS537 Android driver, there is an overflow/underflow control implemented. For regular usage, this seems not necessary. A similar overflow/ underflow control of Yamaha YAS530/532 Android driver isn't integrated in the mainline driver. It is therefore skipped for YAS537 in the mainline too. Also in the Yamaha YAS537 Android driver, at the end of the reset_yas537() function, a measurement is saved in "last_after_rcoil". Later on, this is compared to current measurements. If the difference gets too big, a new reset is initialized. The difference in measurements needs to be quite big, it's hard to say if this is necessary for regular operation. Therefore this isn't integrated in the mainline driver either. [1] https://github.com/msm8916-mainline/android_kernel_qcom_msm8916/blob/GT-I9195I/drivers/iio/magnetometer/yas_mag_drv-yas532.c [2] https://github.com/msm8916-mainline/android_kernel_qcom_msm8916/blob/GT-I9195I/drivers/iio/magnetometer/yas_mag_drv-yas537.c Signed-off-by: Jakob Hauser Reviewed-by: Linus Walleij --- Result can be seen at: https://github.com/Jakko3/linux/blob/yas537_v6/drivers/iio/magnetometer/yamaha-yas530.c drivers/iio/magnetometer/Kconfig | 4 +- drivers/iio/magnetometer/yamaha-yas530.c | 422 ++++++++++++++++++++++- 2 files changed, 423 insertions(+), 3 deletions(-) diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/Kconfig index 07eb619bcfe8..b91fc5e6a26e 100644 --- a/drivers/iio/magnetometer/Kconfig +++ b/drivers/iio/magnetometer/Kconfig @@ -216,8 +216,8 @@ config YAMAHA_YAS530 select IIO_TRIGGERED_BUFFER help Say Y here to add support for the Yamaha YAS530 series of - 3-Axis Magnetometers. Right now YAS530, YAS532 and YAS533 are - fully supported. + 3-Axis Magnetometers. YAS530, YAS532, YAS533 and YAS537 are + supported. This driver can also be compiled as a module. To compile this driver as a module, choose M here: the module diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index 18933d8937ae..65bb34c24810 100644 --- a/drivers/iio/magnetometer/yamaha-yas530.c +++ b/drivers/iio/magnetometer/yamaha-yas530.c @@ -17,6 +17,9 @@ * named "inv_compass" in the Tegra Android kernel tree. * Copyright (C) 2012 InvenSense Corporation * + * Code functions for YAS537 based on Yamaha Android kernel driver. + * Copyright (c) 2014 Yamaha Corporation + * * Author: Linus Walleij */ #include @@ -32,6 +35,7 @@ #include #include #include +#include #include #include @@ -56,6 +60,23 @@ #define YAS530_TEST2 0x89 #define YAS530_CAL 0x90 +/* Registers used by YAS537 */ +#define YAS537_MEASURE 0x81 /* Originally YAS537_REG_CMDR */ +#define YAS537_CONFIG 0x82 /* Originally YAS537_REG_CONFR */ +#define YAS537_MEASURE_INTERVAL 0x83 /* Originally YAS537_REG_INTRVLR */ +#define YAS537_OFFSET_X 0x84 /* Originally YAS537_REG_OXR */ +#define YAS537_OFFSET_Y1 0x85 /* Originally YAS537_REG_OY1R */ +#define YAS537_OFFSET_Y2 0x86 /* Originally YAS537_REG_OY2R */ +#define YAS537_AVR 0x87 +#define YAS537_HCK 0x88 +#define YAS537_LCK 0x89 +#define YAS537_SRST 0x90 +#define YAS537_ADCCAL 0x91 +#define YAS537_MTC 0x93 +#define YAS537_OC 0x9E +#define YAS537_TRM 0x9F +#define YAS537_CAL 0xC0 + /* Bits in the YAS5xx config register */ #define YAS5XX_CONFIG_INTON BIT(0) /* Interrupt on? */ #define YAS5XX_CONFIG_INTHACT BIT(1) /* Interrupt active high? */ @@ -67,6 +88,7 @@ #define YAS5XX_MEASURE_LDTC BIT(1) #define YAS5XX_MEASURE_FORS BIT(2) #define YAS5XX_MEASURE_DLYMES BIT(4) +#define YAS5XX_MEASURE_CONT BIT(5) /* Bits in the measure data register */ #define YAS5XX_MEASURE_DATA_BUSY BIT(7) @@ -91,6 +113,22 @@ #define YAS532_DATA_CENTER BIT(YAS532_DATA_BITS - 1) #define YAS532_DATA_OVERFLOW (BIT(YAS532_DATA_BITS) - 1) +#define YAS537_DEVICE_ID 0x07 /* YAS537 (MS-3T) */ +#define YAS537_VERSION_0 0 /* Version naming unknown */ +#define YAS537_VERSION_1 1 /* Version naming unknown */ +#define YAS537_MAG_AVERAGE_32_MASK GENMASK(6, 4) +#define YAS537_MEASURE_TIME_WORST_US 1500 +#define YAS537_DEFAULT_SENSOR_DELAY_MS 50 +#define YAS537_MAG_RCOIL_TIME_US 65 +#define YAS537_MTC3_MASK_PREP GENMASK(7, 0) +#define YAS537_MTC3_MASK_GET GENMASK(7, 5) +#define YAS537_MTC3_ADD_BIT BIT(4) +#define YAS537_HCK_MASK_PREP GENMASK(4, 0) +#define YAS537_HCK_MASK_GET GENMASK(7, 4) +#define YAS537_LCK_MASK_PREP GENMASK(4, 0) +#define YAS537_LCK_MASK_GET GENMASK(3, 0) +#define YAS537_OC_MASK_GET GENMASK(5, 0) + /* Turn off device regulators etc after 5 seconds of inactivity */ #define YAS5XX_AUTOSUSPEND_DELAY_MS 5000 @@ -98,6 +136,7 @@ enum chip_ids { yas530, yas532, yas533, + yas537, }; static const int yas530_volatile_reg[] = { @@ -105,6 +144,10 @@ static const int yas530_volatile_reg[] = { YAS530_MEASURE, }; +static const int yas537_volatile_reg[] = { + YAS537_MEASURE, +}; + struct yas5xx_calibration { /* Linearization calibration x, y1, y2 */ s32 r[3]; @@ -138,7 +181,7 @@ struct yas5xx; * @power_on: function pointer to power-on procedure * * The "t_ref" value for YAS532/533 is known from the Android driver. - * For YAS530 it was approximately measured. + * For YAS530 and YAS537 it was approximately measured. * * The temperatures "min_temp_x10" are derived from the temperature resolutions * given in the data sheets. @@ -312,6 +355,77 @@ static int yas530_measure(struct yas5xx *yas5xx, u16 *t, u16 *x, u16 *y1, u16 *y return ret; } +/** + * yas537_measure() - Make a measure from the hardware + * @yas5xx: The device state + * @t: the raw temperature measurement + * @x: the raw x axis measurement + * @y1: the y1 axis measurement + * @y2: the y2 axis measurement + * @return: 0 on success or error code + */ +static int yas537_measure(struct yas5xx *yas5xx, u16 *t, u16 *x, u16 *y1, u16 *y2) +{ + struct yas5xx_calibration *c = &yas5xx->calibration; + unsigned int busy; + u8 data[8]; + u16 xy1y2[3]; + s32 h[3], s[3]; + int i, ret; + + mutex_lock(&yas5xx->lock); + + /* Contrary to YAS530/532, also a "cont" bit is set, meaning unknown */ + ret = regmap_write(yas5xx->map, YAS537_MEASURE, YAS5XX_MEASURE_START | + YAS5XX_MEASURE_CONT); + if (ret < 0) + goto out_unlock; + + /* Use same timeout like YAS530/532 but the bit is in data row 2 */ + ret = regmap_read_poll_timeout(yas5xx->map, YAS5XX_MEASURE_DATA + 2, busy, + !(busy & YAS5XX_MEASURE_DATA_BUSY), + 500, 20000); + if (ret) { + dev_err(yas5xx->dev, "timeout waiting for measurement\n"); + goto out_unlock; + } + + ret = regmap_bulk_read(yas5xx->map, YAS5XX_MEASURE_DATA, + data, sizeof(data)); + if (ret) + goto out_unlock; + + mutex_unlock(&yas5xx->lock); + + *t = get_unaligned_be16(&data[0]); + xy1y2[0] = FIELD_GET(GENMASK(13, 0), get_unaligned_be16(&data[2])); + xy1y2[1] = get_unaligned_be16(&data[4]); + xy1y2[2] = get_unaligned_be16(&data[6]); + + /* The second version of YAS537 needs to include calibration coefficients */ + if (yas5xx->version == YAS537_VERSION_1) { + for (i = 0; i < 3; i++) + s[i] = xy1y2[i] - BIT(13); + h[0] = (c->k * (128 * s[0] + c->a2 * s[1] + c->a3 * s[2])) / BIT(13); + h[1] = (c->k * (c->a4 * s[0] + c->a5 * s[1] + c->a6 * s[2])) / BIT(13); + h[2] = (c->k * (c->a7 * s[0] + c->a8 * s[1] + c->a9 * s[2])) / BIT(13); + for (i = 0; i < 3; i++) { + clamp_val(h[i], -BIT(13), BIT(13) - 1); + xy1y2[i] = h[i] + BIT(13); + } + } + + *x = xy1y2[0]; + *y1 = xy1y2[1]; + *y2 = xy1y2[2]; + + return 0; + +out_unlock: + mutex_unlock(&yas5xx->lock); + return ret; +} + /* Used by YAS530, YAS532 and YAS533 */ static s32 yas530_linearize(struct yas5xx *yas5xx, u16 val, int axis) { @@ -457,6 +571,41 @@ static int yas530_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, return 0; } +/** + * yas537_get_measure() - Measure a sample of all axis and process + * @yas5xx: The device state + * @to: Temperature out + * @xo: X axis out + * @yo: Y axis out + * @zo: Z axis out + * @return: 0 on success or error code + */ +static int yas537_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, s32 *zo) +{ + u16 t, x, y1, y2; + int ret; + + /* We first get raw data that needs to be translated to [x,y,z] */ + ret = yas537_measure(yas5xx, &t, &x, &y1, &y2); + if (ret) + return ret; + + /* Calculate temperature readout */ + *to = yas5xx_calc_temperature(yas5xx, t); + + /* + * Unfortunately, no linearization or temperature compensation formulas + * are known for YAS537. + */ + + /* Calculate x, y, z from x, y1, y2 */ + *xo = (x - BIT(13)) * 300; + *yo = (y1 - y2) * 1732 / 10; + *zo = (-y1 - y2 + BIT(14)) * 300; + + return 0; +} + static int yas5xx_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, @@ -772,6 +921,202 @@ static int yas532_get_calibration_data(struct yas5xx *yas5xx) return 0; } +static int yas537_get_calibration_data(struct yas5xx *yas5xx) +{ + struct yas5xx_calibration *c = &yas5xx->calibration; + u8 data[17]; + u32 val1, val2, val3, val4; + int i, ret; + + /* Writing SRST register */ + ret = regmap_write(yas5xx->map, YAS537_SRST, BIT(1)); + if (ret) + return ret; + + /* Calibration readout, YAS537 needs one readout only */ + ret = regmap_bulk_read(yas5xx->map, YAS537_CAL, data, sizeof(data)); + if (ret) + return ret; + dev_dbg(yas5xx->dev, "calibration data: %17ph\n", data); + + /* Sanity check, is this all zeroes? */ + if (!memchr_inv(data, 0x00, 16) && !FIELD_GET(GENMASK(5, 0), data[16])) + dev_warn(yas5xx->dev, "calibration is blank!\n"); + + /* Contribute calibration data to the input pool for kernel entropy */ + add_device_randomness(data, sizeof(data)); + + /* Extract version information */ + yas5xx->version = FIELD_GET(GENMASK(7, 6), data[16]); + + /* There are two versions of YAS537 behaving differently */ + switch (yas5xx->version) { + case YAS537_VERSION_0: + /* + * The first version simply writes data back into registers: + * + * data[0] YAS537_MTC 0x93 + * data[1] 0x94 + * data[2] 0x95 + * data[3] 0x96 + * data[4] 0x97 + * data[5] 0x98 + * data[6] 0x99 + * data[7] 0x9a + * data[8] 0x9b + * data[9] 0x9c + * data[10] 0x9d + * data[11] YAS537_OC 0x9e + * + * data[12] YAS537_OFFSET_X 0x84 + * data[13] YAS537_OFFSET_Y1 0x85 + * data[14] YAS537_OFFSET_Y2 0x86 + * + * data[15] YAS537_HCK 0x88 + * data[16] YAS537_LCK 0x89 + */ + for (i = 0; i < 12; i++) { + ret = regmap_write(yas5xx->map, YAS537_MTC + i, + data[i]); + if (ret) + return ret; + } + for (i = 0; i < 3; i++) { + ret = regmap_write(yas5xx->map, YAS537_OFFSET_X + i, + data[i + 12]); + if (ret) + return ret; + yas5xx->hard_offsets[i] = data[i + 12]; + } + for (i = 0; i < 2; i++) { + ret = regmap_write(yas5xx->map, YAS537_HCK + i, + data[i + 15]); + if (ret) + return ret; + } + break; + case YAS537_VERSION_1: + /* + * The second version writes some data into registers but also + * extracts calibration coefficients. + * + * Registers being written: + * + * data[0] YAS537_MTC 0x93 + * data[1] YAS537_MTC+1 0x94 + * data[2] YAS537_MTC+2 0x95 + * data[3] YAS537_MTC+3 (partially) 0x96 + * + * data[12] YAS537_OFFSET_X 0x84 + * data[13] YAS537_OFFSET_Y1 0x85 + * data[14] YAS537_OFFSET_Y2 0x86 + * + * data[15] YAS537_HCK (partially) 0x88 + * YAS537_LCK (partially) 0x89 + * data[16] YAS537_OC (partially) 0x9e + */ + for (i = 0; i < 3; i++) { + ret = regmap_write(yas5xx->map, YAS537_MTC + i, + data[i]); + if (ret) + return ret; + } + for (i = 0; i < 3; i++) { + ret = regmap_write(yas5xx->map, YAS537_OFFSET_X + i, + data[i + 12]); + if (ret) + return ret; + yas5xx->hard_offsets[i] = data[i + 12]; + } + /* + * Visualization of partially taken data: + * + * data[3] n 7 6 5 4 3 2 1 0 + * YAS537_MTC+3 x x x 1 0 0 0 0 + * + * data[15] n 7 6 5 4 3 2 1 0 + * YAS537_HCK x x x x 0 + * + * data[15] n 7 6 5 4 3 2 1 0 + * YAS537_LCK x x x x 0 + * + * data[16] n 7 6 5 4 3 2 1 0 + * YAS537_OC x x x x x x + */ + ret = regmap_write(yas5xx->map, YAS537_MTC + 3, + FIELD_PREP(YAS537_MTC3_MASK_PREP, + FIELD_GET(YAS537_MTC3_MASK_GET, data[3])) | + YAS537_MTC3_ADD_BIT); + if (ret) + return ret; + ret = regmap_write(yas5xx->map, YAS537_HCK, + FIELD_PREP(YAS537_HCK_MASK_PREP, + FIELD_GET(YAS537_HCK_MASK_GET, data[15]))); + if (ret) + return ret; + ret = regmap_write(yas5xx->map, YAS537_LCK, + FIELD_PREP(YAS537_LCK_MASK_PREP, + FIELD_GET(YAS537_LCK_MASK_GET, data[15]))); + if (ret) + return ret; + ret = regmap_write(yas5xx->map, YAS537_OC, + FIELD_GET(YAS537_OC_MASK_GET, data[16])); + if (ret) + return ret; + /* + * For data extraction, build some blocks. Four 32-bit blocks + * look appropriate. + * + * n 7 6 5 4 3 2 1 0 + * data[0] 0 [ Cx Cx Cx Cx Cx Cx Cx Cx ] bits 31 .. 24 + * data[1] 1 [ Cx C1 C1 C1 C1 C1 C1 C1 ] bits 23 .. 16 + * data[2] 2 [ C1 C1 C2 C2 C2 C2 C2 C2 ] bits 15 .. 8 + * data[3] 3 [ C2 C2 C2 ] bits 7 .. 0 + * + * n 7 6 5 4 3 2 1 0 + * data[3] 0 [ a2 a2 a2 a2 a2 ] bits 31 .. 24 + * data[4] 1 [ a2 a2 a3 a3 a3 a3 a3 a3 ] bits 23 .. 16 + * data[5] 2 [ a3 a4 a4 a4 a4 a4 a4 a4 ] bits 15 .. 8 + * data[6] 3 [ a4 ] bits 7 .. 0 + * + * n 7 6 5 4 3 2 1 0 + * data[6] 0 [ a5 a5 a5 a5 a5 a5 a5 ] bits 31 .. 24 + * data[7] 1 [ a5 a5 a6 a6 a6 a6 a6 a6 ] bits 23 .. 16 + * data[8] 2 [ a6 a7 a7 a7 a7 a7 a7 a7 ] bits 15 .. 8 + * data[9] 3 [ a7 ] bits 7 .. 0 + * + * n 7 6 5 4 3 2 1 0 + * data[9] 0 [ a8 a8 a8 a8 a8 a8 a8 ] bits 31 .. 24 + * data[10] 1 [ a9 a9 a9 a9 a9 a9 a9 a9 ] bits 23 .. 16 + * data[11] 2 [ a9 k k k k k k k ] bits 15 .. 8 + * data[12] 3 [ ] bits 7 .. 0 + */ + val1 = get_unaligned_be32(&data[0]); + val2 = get_unaligned_be32(&data[3]); + val3 = get_unaligned_be32(&data[6]); + val4 = get_unaligned_be32(&data[9]); + /* Extract calibration coefficients and modify */ + c->Cx = FIELD_GET(GENMASK(31, 23), val1) - 256; + c->Cy1 = FIELD_GET(GENMASK(22, 14), val1) - 256; + c->Cy2 = FIELD_GET(GENMASK(13, 5), val1) - 256; + c->a2 = FIELD_GET(GENMASK(28, 22), val2) - 64; + c->a3 = FIELD_GET(GENMASK(21, 15), val2) - 64; + c->a4 = FIELD_GET(GENMASK(14, 7), val2) - 128; + c->a5 = FIELD_GET(GENMASK(30, 22), val3) - 112; + c->a6 = FIELD_GET(GENMASK(21, 15), val3) - 64; + c->a7 = FIELD_GET(GENMASK(14, 7), val3) - 128; + c->a8 = FIELD_GET(GENMASK(30, 24), val4) - 64; + c->a9 = FIELD_GET(GENMASK(23, 15), val4) - 112; + c->k = FIELD_GET(GENMASK(14, 8), val4); + break; + default: + dev_err(yas5xx->dev, "unknown version of YAS537\n"); + return -EINVAL; + } + + return 0; +} + /* Used by YAS530, YAS532 and YAS533 */ static void yas530_dump_calibration(struct yas5xx *yas5xx) { @@ -796,6 +1141,26 @@ static void yas530_dump_calibration(struct yas5xx *yas5xx) dev_dbg(yas5xx->dev, "dck = %d\n", c->dck); } +static void yas537_dump_calibration(struct yas5xx *yas5xx) +{ + struct yas5xx_calibration *c = &yas5xx->calibration; + + if (yas5xx->version == YAS537_VERSION_1) { + dev_dbg(yas5xx->dev, "Cx = %d\n", c->Cx); + dev_dbg(yas5xx->dev, "Cy1 = %d\n", c->Cy1); + dev_dbg(yas5xx->dev, "Cy2 = %d\n", c->Cy2); + dev_dbg(yas5xx->dev, "a2 = %d\n", c->a2); + dev_dbg(yas5xx->dev, "a3 = %d\n", c->a3); + dev_dbg(yas5xx->dev, "a4 = %d\n", c->a4); + dev_dbg(yas5xx->dev, "a5 = %d\n", c->a5); + dev_dbg(yas5xx->dev, "a6 = %d\n", c->a6); + dev_dbg(yas5xx->dev, "a7 = %d\n", c->a7); + dev_dbg(yas5xx->dev, "a8 = %d\n", c->a8); + dev_dbg(yas5xx->dev, "a9 = %d\n", c->a9); + dev_dbg(yas5xx->dev, "k = %d\n", c->k); + } +} + /* Used by YAS530, YAS532 and YAS533 */ static int yas530_set_offsets(struct yas5xx *yas5xx, s8 ox, s8 oy1, s8 oy2) { @@ -917,6 +1282,44 @@ static int yas530_power_on(struct yas5xx *yas5xx) return regmap_write(yas5xx->map, YAS530_MEASURE_INTERVAL, 0); } +static int yas537_power_on(struct yas5xx *yas5xx) +{ + __be16 buf; + int ret; + u8 intrvl; + + /* Writing ADCCAL and TRM registers */ + buf = cpu_to_be16(GENMASK(9, 3)); + ret = regmap_bulk_write(yas5xx->map, YAS537_ADCCAL, &buf, sizeof(buf)); + if (ret) + return ret; + ret = regmap_write(yas5xx->map, YAS537_TRM, GENMASK(7, 0)); + if (ret) + return ret; + + /* The interval value is static in regular operation */ + intrvl = (YAS537_DEFAULT_SENSOR_DELAY_MS * MILLI + - YAS537_MEASURE_TIME_WORST_US) / 4100; + ret = regmap_write(yas5xx->map, YAS537_MEASURE_INTERVAL, intrvl); + if (ret) + return ret; + + /* The average value is also static in regular operation */ + ret = regmap_write(yas5xx->map, YAS537_AVR, YAS537_MAG_AVERAGE_32_MASK); + if (ret) + return ret; + + /* Perform the "rcoil" part but skip the "last_after_rcoil" read */ + ret = regmap_write(yas5xx->map, YAS537_CONFIG, BIT(3)); + if (ret) + return ret; + + /* Wait until the coil has ramped up */ + usleep_range(YAS537_MAG_RCOIL_TIME_US, YAS537_MAG_RCOIL_TIME_US + 100); + + return 0; +} + static const struct yas5xx_chip_info yas5xx_chip_info_tbl[] = { [yas530] = { .devid = YAS530_DEVICE_ID, @@ -963,6 +1366,21 @@ static const struct yas5xx_chip_info yas5xx_chip_info_tbl[] = { .measure_offsets = yas530_measure_offsets, .power_on = yas530_power_on, }, + [yas537] = { + .devid = YAS537_DEVICE_ID, + .product_name = "YAS537 MS-3T", + .version_names = { "v0", "v1" }, /* version naming unknown */ + .volatile_reg = yas537_volatile_reg, + .volatile_reg_qty = ARRAY_SIZE(yas537_volatile_reg), + .scaling_val2 = 100000, /* nanotesla to Gauss */ + .t_ref = 8120, /* counts */ + .min_temp_x10 = -3860, /* 1/10:s degrees Celsius */ + .get_measure = yas537_get_measure, + .get_calibration_data = yas537_get_calibration_data, + .dump_calibration = yas537_dump_calibration, + /* .measure_offets is not needed for yas537 */ + .power_on = yas537_power_on, + }, }; static int yas5xx_probe(struct i2c_client *i2c, @@ -1170,6 +1588,7 @@ static const struct i2c_device_id yas5xx_id[] = { {"yas530", yas530 }, {"yas532", yas532 }, {"yas533", yas533 }, + {"yas537", yas537 }, {} }; MODULE_DEVICE_TABLE(i2c, yas5xx_id); @@ -1178,6 +1597,7 @@ static const struct of_device_id yas5xx_of_match[] = { { .compatible = "yamaha,yas530", }, { .compatible = "yamaha,yas532", }, { .compatible = "yamaha,yas533", }, + { .compatible = "yamaha,yas537", }, {} }; MODULE_DEVICE_TABLE(of, yas5xx_of_match);