From patchwork Mon Jun 13 01:17: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: 12878902 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 DA672CCA47D for ; Mon, 13 Jun 2022 01:17:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234215AbiFMBRm (ORCPT ); Sun, 12 Jun 2022 21:17:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44632 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235547AbiFMBRj (ORCPT ); Sun, 12 Jun 2022 21:17:39 -0400 Received: from sonic309-26.consmr.mail.ir2.yahoo.com (sonic309-26.consmr.mail.ir2.yahoo.com [77.238.179.84]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4851E2F646 for ; Sun, 12 Jun 2022 18:17:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1655083056; bh=Oy+2Rh6qp6A6u+U0hZbSnk/Susg0ogMovS55aFUE2Rs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=EoWteCLvGGRZsLEnwoS0mx0BcPzaT/wmHtNIWoVQ4W8+ECPHr7yABkwVtiiuLvR9h+ndqPhLJgzCkIlK3xZNGFW77wpX1tl60nYwRMowt02DwjEEcwT0E27m36rr1bk1ySkBVvT+PY8lgyFPuA3oGkfpz2BZhwqEk6LAIUhhtZP4islgsTjqkYDYMXl9QQrgS/pWKVnr7NSwkXRE2/uChhCRihUh08CYWtlPagnAREtW4TNVU7x+Nfkw+CLWa9Mli/OekqQBLy7VAi1e5zMoBHze0eyxJPb4cPVGEykfiLKU6Nk7fts1EXGJk+IJU/gqkTdpHeiNmddPh/IO/eting== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1655083056; bh=e3yXvsqIFqA91T/9a2ztqe65MxsVQyq2ISwDk9ZE6QQ=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=M4ppwguxCXqT7mNPciqh7qWRrvjxcAKcpn0XuwriMwg4MpXqd8+jeQb8Ru9oa09acMhtLu/AFwc5shgRADQz1nJ1acCyuqcoO3hYqg9QmWoD/VGXeIKbFQoMsQ8ezFCBe27ed+d/uuTq5XK3TqCExv/Lzg8cG19Ccpb51hHBwcNED1sg13L5GUZ0a1hwfmSakCIxa1fwpghQaLgnv/80/ytXNXOhmZzIhni9Y/0FflJZ0zgkdozv09PCadRs6Ah8+SafQj3J019sV7pOzxSUKOjD3QY+zG28aPPOFt3gOeALySI9tvVEQpFXS6tQndDG7B+P4QAIWY49KqQ7S8Du3A== X-YMail-OSG: yJG04jwVM1lPlt5Ry19ml1uQMuEr.rDjY0nk_JYoXgSGY_eJnZlxfaAFrUSKUOz 5si49AjEJp7biDjqY_ISwY6J6Z9M5e__xFbLEs6XxRmdQhDNLBsFg28KwmLsBBhoUffwYfGLXnkk C0RKe5F9WLDZzbxmRtwG0jyDsY94g23CouN4vMiIxHymimw5UqUDoxdFAUO2zSiqteAYDlDXL2Ut yEylStM67YjaFktJuyiA0WlvhiBP5qkoWP_3Yh0eQhnH8FquxiUoC6R6J8XPjivE8TXWQAMCdLRP Y2YZ0.c_eehxbu8GHtKz2_HWwyWY1zIxWZ8hhBaoYpICv4mt2TjODQAC32wf6eLKlGyj1.fNBFBK 4f6Wp7nlhD9pRa5zU4dyYploJWVNtHsArY5ROgIcEpJowkeLBNFUuDe4owucE0j.NjNfNxmwdpLu lupnFvT6snpjJT5EQpLWgHnlqb.t02WitPpbdPz2_CEeUpGo.z6W5vKHrywv14YcKGwSI5jMPuye .wz8bEQCKjHBRMshZoMe.X1erlG6Yrny0twv3cyxGrPZQ.poFKSTOKiP1kz8Gt4tZvQfD.6dxoYu Q.aFBR3o8PTtSg_X2MmoO7962aJGr7MspxGxyK9ahXk0A5SQdr_.armp6EMcSnUr3Vh38e1C.Ekc fXOBYZjqeWiN8IE7HyHqEfjaGv0KO4GfKjZKBaSQJqvmIXnG8pM1_G4r4P8RRgmtEm0dve11M86O Un6PPPp4nXJQdedNwFQlaxvU2T8PKaKyfHyf22N8WpAma8jbsiX86ioUKf5Pi6Jw1UgNKBLbcqp8 t0RtUu9tVnsb3e2VxSqRIO3LTvi_ud_5ky4Xoor0F5iOAAkVvWZX__X.AljpS4iDcTzMxcFatakh _mgIsitDMm_.kq8vkZwPqGvrE3slzqY7HB5AzUQgOltMJbRVSyyZGW460isyijLui.7TSbACnpLF Vdw9a_iJEHhaveZygxdjF4UbrIHaA28htqjUolZAjMj00kktrb6WKoMffVwAw75y9k9CSZdttRPk p7XnsG_j2Mm2eCflcYs2sib7KfmUM8MIXg3KfwNN_6dk5_gvacVroY6oT9OT3t6FfaiLQeVrGFFH f64s3mafH9lv_MGogdwx6lgdD0OJuWEW9YCcDQkb0hHvFkQQnqodfe66UOWmeCcz8aJZu47G1XbP RYHZ4jxIIhRGKrisQmb3r2QwveUrrhGLKbPwTmzwVpFTCKBwpBZDjtvOgxO.EYwMADDj5fs1wIMq u9eCUTCS3j5JuK81n2erjZrESHAR4rOHxoH.kGplXvx4UVj47PGC6_8.r85wA1RcyRjHAw9QMNsd 6eLx6KHLTo0JvPKmWhTDv23oChuD3QG3bnd1Mn3AFumcN.Un0GH.Se74Zh9kcwcOblLU5Kdy39sp V..dkpjk5bGo_WKNOJ8SfXkZwG90Hko1rAfhYowgOxoQ1h62u8doQjvZEPxyfJXonKi673HQ9Rlx 8V4LWx83hK6vSlZavm32HgBehTAWPKNN.JonTQJbKbhH3pVzfojv0SvBDnU4Al3JdpD_Xs5GAzAN zzjaJ3Idqmi3wKH.2FmozYFWfbpcya5skZttTMS6mu2pJrsH40T3so8ifEye6_E5KZGKNO_Ng7kh 6n860wTU9y9T9AR2joUJqHaqqgzZ3bb0y3LssH94LT.l7i74mLVb91AsiulJE19IRjDhPUCQ5wdz V5Js7HuH5hwWu0J3EtPif8krE0dYySat_XP8u1dB474RPT71f.CzpuH9tS2yFxdMlhUXvbuaWoi7 WIkUjwNlauLJv52NOo.CzjtcJfVOEvnTZWEH93AmJ.V9d2C2nUhT_OkQyoVQYwBzNcYVMI3PFCMF _GQ3FtHpnuxemH0a65rMHAjJZDJauwVcw.HSqFmchFF0YGiCJVWPFG7bdOaE8omzRxHmt39T1dMA ._JPG9EcoIbTfWuEgqBK6z7caTa1Z7cHaWqxCJlj9sOdvRxz5joIvaIIPtjBUaNym694DEKAO0kL vWXANnAlEATn0KnZ62q7a7Jc5i5OIeRm.iTIr8_tgP.7WVeRwAt5W4jApFG2NNCjflAmAs0b3ZJ1 cDJnrV_A1vuUUAJaB0RUsRsTkhlZBmIwnQRswgfcl1B8NJL9DA_FMcRef2nVqIj4ukOBYbA0n5fG Poi3Bv4ljtwfySI1yGvei5axSu_9YZ7KavNweHPUgdGpJ.Gs81mQiNA9oJRg9sXPWwoMf2eNT6gs ILzgcgZwX.DmQ1emv_8gO8QSc8lkNuD0gl5fl5eS7jNgfwquf7tZxyGOmgCi3J38rJVwl7AhoSWd ZZafApYHC7Q-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.ir2.yahoo.com with HTTP; Mon, 13 Jun 2022 01:17:36 +0000 Received: by hermes--canary-production-ir2-6c7595c778-c54g9 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 4419c1e75f73c3038b6a16962b132f56; Mon, 13 Jun 2022 01:17:32 +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 v2 1/7] iio: magnetometer: yas530: Change data type of hard_offsets to signed Date: Mon, 13 Jun 2022 03:17:08 +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: linux-iio@vger.kernel.org The "hard_offsets" are currently unsigned u8 but they should be signed as they can get negative. They are signed in function yas5xx_meaure_offsets() and in the Yamaha drivers [1][2]. [1] https://github.com/NovaFusion/android_kernel_samsung_golden/blob/cm-12.1/drivers/sensor/compass/yas.h#L156 [2] https://github.com/msm8916-mainline/android_kernel_qcom_msm8916/blob/GT-I9195I/drivers/iio/magnetometer/yas_mag_drv-yas532.c#L91 Fixes: de8860b1ed47 ("iio: magnetometer: Add driver for Yamaha YAS530") Cc: Linus Walleij 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 9ff7b0e56cf6..b58a9c51e9ff 100644 --- a/drivers/iio/magnetometer/yamaha-yas530.c +++ b/drivers/iio/magnetometer/yamaha-yas530.c @@ -132,7 +132,7 @@ struct yas5xx { unsigned int version; char name[16]; struct yas5xx_calibration calibration; - u8 hard_offsets[3]; + s8 hard_offsets[3]; struct iio_mount_matrix orientation; struct regmap *map; struct regulator_bulk_data regs[2]; From patchwork Mon Jun 13 01:17:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 12878903 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 ED3EFCCA473 for ; Mon, 13 Jun 2022 01:17:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234247AbiFMBRr (ORCPT ); Sun, 12 Jun 2022 21:17:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45064 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235972AbiFMBRq (ORCPT ); Sun, 12 Jun 2022 21:17:46 -0400 Received: from sonic310-12.consmr.mail.ir2.yahoo.com (sonic310-12.consmr.mail.ir2.yahoo.com [77.238.177.33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 866C92FFE5 for ; Sun, 12 Jun 2022 18:17:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1655083063; bh=3HqEe7mLC0Oar+1I9oaYhBQWHlwZ68u3/FFRkU44PfY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=SgMcrHpYjuqCgF0xYoPyp8PBFTOAedS1G4+cSXFOciTSI/99YvyLz33aDY/m3Xt7f3LfaU05BpQd+4X0RSof5HRfOda1B8CAlY+e1MtOhuanFvTchwPMaPUp35H+9ESPwgxefxAcDpvvYgUEHnppRmZbb+0uqolBuwwEyvvYmbvBI+edcxKZYIp7IZS1sN0Kf+WIG4hHA/9Wz8ZavuN+2mXrQSANnh05RQgYBDHPmLT6Ux/cy6fS4+uuzVeuypGiyQHvfaYAunyUFt9oQx956c2q5ziGimzOE9d3dsotTe6layN1nse6iwFl76r636QtNq9ngToedQaoCGN8YwpC0Q== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1655083063; bh=wHVpexSUiBsklAMgiKQlRUDfZmMh7KevurCX6tN7JFT=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=BNjNPk9rQyosJrYhgST9bQMCpOP0TH6FsCXBYeUg5yVJCpmxGbHFaupNgumKXs9axYEboHw9kkNp+Elr9OeVAgsBuDy8IQ8II3F80nCMxIYs61yzX+O3xlehZjQwEsu6jextPQvt3XSQmII9fSmtzqyxINkF7ayVHyREB/V040SBixP7xruaJVqyJyizDmA0d6QnmvuMFIBG1iE+t/+HTh9feAfiOdSMxk1p5fEdCbX9HV2I0RHRW7M45FQI537oE8WhgnC5Ire1dLReLUIi4SLb3Cvf5vG9p24GLqLFyYoGRVb4M4FgFQ1XNjDyfD/InJ70Y2EWAizkz5h2DCXe4g== X-YMail-OSG: Ku_QcNEVM1m1ZM1jrlelZ8unGNz3gm5MgczgjhrrOrvqPE1TLrGR7Bx9HOuiLWh 08JY8FzkUPTDT18JgmOOeensWyb4G7jeWeuNSg.vaBQ_QTjVpSTCq4rkPB1.uLQdi42njMtCMtpp HBlW8POtxGYANEK1kztSBuDNZvihEnEYgqMrm96hl41svr_NXfizirkOokdIpp1iGGaej8jZouA_ tCHDKRWRTWFnjKmTEbWqZQ2rGbBoZjp3r5nb38CsJDitY0r9IWl.B6fSByNopKHgYfrb7s8M4.LC CqCTk_D.AHToGhbtdMc92Z3yLnlboJe.Yoenl16JzyO_51fDStr5h5AFpeKoveCa_mXtNPJ014yd FTbeOIqjxo_nxYiK9KUuqSJ_CD1WoiPM8oifsqfXDFO6Z4hkPskyCdr2xKt0Tmbdhlb1Pf3ejlLK 2Y.daj0Cf5pXaeQc0OapGubrv69JanMB2N6nmIFy0j4O.G6pVP6gqQ4TxqVgeilbZN3WKp6rGBvo RYt14hrSx6u990E5KaB_peLFT2j_3jFlK0ktbBSyFH_mPEk8YzKFrppZOdao62pPqfp.0ElIjmEk Ofx0YU28etJ.banPuvar69w7UYSKvlA.MQQlkp329e4jsGLNoi.SLrPzGcXZ763qGT.Gaxf8esQ4 XyUMWCveOkenn9RnpkvBGGJfIFK1J6CMD51Bx.8MeIEWXkuYSkLc_3VJmwCDnjs2t37pFl1CfQgV lHRiQ5AIHM_BoNQH6JFnOAOqhXh1sefY545HRQz59xBsXKTMHED5vuT9zHa9CgxrYLOnN7oVpQT9 mkfV_LA8h3pZ0CF9qm01i633IQsGfTsWRnMiOh4U7KWZlGHIbb4pOSRdLN1qt5muI5wqi1pq9Q4A dWJYcTe95gEBwgb0VcLCpCTnrgWK5flEcNOTHzKs2lr91SPRRHCg9oXs0Pe7xQhm9w6vy4zeRnnM c2K.Jvz9Ga8P9O9MJygN4DSkOhWjnPGFMC3g.ZEvWgQT4F2e3JYc9gvniDtGhLIx6uacCs8g00pG DA_riDqp8L6RJU_9JE1DfNCniGjZnvG.ynKFVxDcxXBEyXfIKvE7V7bUGr.6zi6QHN2XvZcM.mf1 HIV5z7OP3qGwul_2G2t1C65Uetx3TM.JgA2wZbNxuARDJHKLoasF0NFfqV8o9WBAWcDEywnYu_AL 78UF43bU42FD64b265hf_eWKVK69JGgnNb5RPuzpnYngnIp5Ai9eQPeLvuPMn5M7du6Dw6MYuVRN K6tjJmShcXUsJwSb_B1w7MU5MBryX0_NCv0bwAUz1EZz2raEWA8fuV9Atim3KTDXckhf1N.dn_to nh0JkPE2j8ytb4R9pAU7PFumd_9wsuO57RyNTlYcXfakpdjjjKpdQXc3Wx9AtAGgGo_E3Xsh_TS1 e41wK.inXVKGfqFtS88p9ogifCKlV_ojsOrIGUYlmJ2SXV.FcwquXY_JdW6ZYf8Sp4y7ltdXPsez X78nU2H0WEkp3Ee7UBdg2pD2rOioHY_y0aBl.zm5szUhe.NalHRaP_R0IEiJ2.OJWhbKky5fUaHL sXDt33QOa9PsCo9Ys3_gESeHfXzqe_jbRE1on9IHrWXSGJ8uIjCX42xd9nTlFviCUZqaOc1F1G9F HOetrxThYaPhzKOTm.Qm7jFxKUNhJJ6H5YOKn3DSdIt4AERprXNqIQYp8vfUngT744jefRcD5bRi NnmzwvRER6L9Ee4HHkMPa3OSLbSZpIj4yZdg1KUOb4NrsFMBujDEw56frDW9ELKxKoQDJmD.22yK Dl3QymeMqmLGjE.gPOueRh.HyfQ9rrNzqMDIByRGRdO375Tja03NbaQuz1NGb458sAyC25Nv5GdT fGbMklZt.C4NKGZdgjGmsiYiLajCCiX7DnnliPXtFN_hKwOe6EIzeFbz7JXLRu4Bn2uI3.PK8fl_ j_NVbUVe.o9ACoUB5B2.IMmKIYtFzPz88WMvrJkbus1O3EjmFeGUZJNSdhWhuPNLEpHNTMArAaqM kGUeZfGw9lFQ94gfCqzYnt8GxdjzUNfH1kc0GgTTYOgpsCNZTsPBJ82ubeNvM6bXIYAF3pol7zAW v0Poyi01eyKauU8Q0gDiGedaHBnN6ys7N_xLN28VUZDwYF9zc8by_PrZdQBLor6bDQKl0sLGConu 8JNlw5GSmM5zM6lomzOron7ZBMH46JDXUTcVJnqv8DMEEqVBLLe3x2Lsjud92iV0Zilx6rlw3Rx_ MlADRptV4fIdUO.GgNn6qOPbS6SsJKMVvmUaU_dfpY2PSF3GL7FXSO6DR7dga5BuKbegM5VefGsI zUIHqLob2JA.b4mk- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic310.consmr.mail.ir2.yahoo.com with HTTP; Mon, 13 Jun 2022 01:17:43 +0000 Received: by hermes--canary-production-ir2-6c7595c778-c54g9 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 4419c1e75f73c3038b6a16962b132f56; Mon, 13 Jun 2022 01:17: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 v2 2/7] iio: magnetometer: yas530: Change range of data in volatile register Date: Mon, 13 Jun 2022 03:17:09 +0200 Message-Id: <02ece5db210dcee7511a3c322ca81041c6ebf8d1.1655081082.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: linux-iio@vger.kernel.org In function yas5xx_volatile_reg(), the range for measure data should end at "YAS5XX_MEASURE_DATA + 7" instead of "+ 8" as we count from 0 to 7 here. This change is of low importance as the "+ 8" register isn't called. Cc: Linus Walleij Signed-off-by: Jakob Hauser Reviewed-by: Linus Walleij --- 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 b58a9c51e9ff..2d71ae837bf5 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 + 7); } /* TODO: enable regmap cache, using mark dirty and sync at runtime resume */ From patchwork Mon Jun 13 01:17:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 12878904 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 A32F5C43334 for ; Mon, 13 Jun 2022 01:17:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236536AbiFMBRw (ORCPT ); Sun, 12 Jun 2022 21:17:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45646 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235105AbiFMBRv (ORCPT ); Sun, 12 Jun 2022 21:17:51 -0400 Received: from sonic307-7.consmr.mail.ir2.yahoo.com (sonic307-7.consmr.mail.ir2.yahoo.com [87.248.110.32]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CBDF03120C for ; Sun, 12 Jun 2022 18:17:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1655083068; bh=QUimuT243Rp+7EXbR/N0HCVEFU3g2y9SqxGTyDSnStI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=jadywCWiM9mRlQ0eRtGOo1R0GVNboh5q0NY9QdbqxmHOFd9sig45CK6D6U5PyJFlyuWaT8jDVYXkNcGJhoq9bD4Vg+SKGOHbty5xDOi62JhUoIC45JdYx+xeAL7ilV9sJLn9zLEEN9EVirXzowx5/MKYEPBcMT8KVkhbc4SCpMfIyjJH6Bj519PoMX4rLIv20jcC5QkmxcDTAICO60wV3RkSVcpRfJnlMq68fPFTH69kVQUiQTtXErbuxCETcvjDC2mE+Ebe4kQwRLDVgLi/wfK6mdCwStFKIJ+axc6c2QKpcNdYtIea9A41FYQSujNDVtOLQe7OEP3iU+9ICgrTcw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1655083068; bh=vpAxF5f/PzE4bUZgMiGBpKIhclUQlxR/7kudIw8PcQz=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=jHkbnPBpUqwukA6LyeCfs10lbsT/FVxoURNoQR57NrjZ6VY+v0QwGPq58jsnH3xTgpdt1uwgjxUF4csmqlZ368pNYzGLnjkOR4lfhbpKilgeb7zl5dSpD0S6NB4hPQeRr+ZvMcPRjHARbsgYAc/LYe7td1g4hdJR2gkC+Zy5vPCVhVK9kKBreHpZzsyLj9Yjt3jdF3aqYh9P+C4vSNETx6uNZA61BCsDs1+J7LqsQYtodH3TZdSeE9gQCh/nZUPzyvVW9N16RbvsYj4NalG8WQ/uYapMbYUh38I275AvtUrTtkzcxiaNW3aZkNV8E2O591u6kTOB40/ywVZ1pqTKlw== X-YMail-OSG: 2rrqs24VM1m44xGyh_nXoSj8O1ySiLF6kkV4c7K_jze.Z86IejZupn3qBM5rPMs NAellTRWU.rs6x_9WqQVM..dnIQWAmuPnshu1Cl7uECtL57O.MwUXf2M8BiXFvl.XR.2Z6migP.N IUxap1FRmHRFtt5XdneO7COh2..vew6HWeKtNQRqiEuyZrYYH54Hj.eEAwwMSMFi8EFLBrAv_k2b ibjO5Be_VXg9XTSCT4Ef6uupBUVB3PFew9wqbmUMKZGASeNxJFAmavVoE19ClH9DenM5GHdqsc.A s8th2O.mAFTwzwLqGuQxbAW1zPS7KIaX9dr8BcXF3o9At6N1A3Enh7KOytrPF8QrgEPFflADBd8L sUiBcv6usGxuj0TAWgaZL.nBw45W17upgkBZzxgtB934NLK2VcaxooSjjOWeL8.It4ben44qTBoN UnXewMNoi.vhVEt4jME7DFnZKKmmtYjwe8ga0F4oYfCf3gB2N0QC.B.XUYucjTposhvhXOASM7j2 l2TcTIelL4NBBXkx6eS4GTaR0cVrEay2IrdUxHLxeiJ4bGWOOl5cXmf7W2Zt5Mr98jDF71sM.pdD iqiTmOQBoY39ZeoG4Jt7oWq1.hdgj6lfY.hp6P424HvmAHIwGTDvVjkOhsj7O5UoCuyAGFvtlfmY F_CsPpR1vxw02iJLlrv5qtMzwUExRuPhn3.pEN7JIGcEeunFh.sTe4lQJDmVzeP12ZuFCPniOkZe jH1gqjBtntXjgBJfzTQroiw6.0ScFXwkTJrEvuvOaza4L1fp3cpCAyP..l71T7yrSFAwdHiKqsuE ASPe59BP9m2g.w9WONzQroHT9_lYlNs5LOireB8WULnHo2daVTRbbZ7sOdzylsrUY_2Nl7mwiKKT 7VUMH_UKV4GPs0SV7XckNHpmSOSS9ozyHGwekPYZ_xDqyl0pzwlN.K5uEiO8tVjDznt.VKMekBdM n1Ia8WHznJ5co6oXJcFHnUgy53mFoKCeiN5jzrWt0.8ckeNXy9d7etXmMcd3evIJNn28_dlDYj0D xRUyNF530nM8QRDmsYXxD.LberPR.JJsOj5QUmKupJZK5BMeU1NlJ8wgujL7zYvwt5dz.k6cjKNt f3Sw3YR1lkQDxqw4Rb1b7jadiEfny6e9iUXY9SiP7xNmn_WJD.99zBnZtHwuQewjjFos6zIDMA4a pTBV5.s_l6WZ8ZPNuymlFSzlHvkRdCWshkRC4cPewpX9h3k2a_QX4Fo4lS9cZQgSd7.HV8fr54vb umerK5i9P_hnjs47WwrwlHtNvWTwuNcqdPO9VEgEqIPYqSa7mjkcISzNoGti99NeqinJMm2GCmt1 ACT.Q0MdLG4xEgi9bKj.MYsngZoiY0Pbj.94_nUI6xDInwRYMqjqIBVSNql9chJaD.i7PbDIiOuI 1RbBSw3RO6FpSo2f1eUpo0gMZ6eeiegDZxlywz26U_Kar3EQqJd_0qZhBBPDo1gTYZ0qb65dBaBj .W8z4aKlggCB2veSuNfk_evBbBtFNB784YoVD59RwzJXbQCVDhneNo9ys2DEXwtYrOqyBK.X63kz r13PywdgmaEV65RNVIrTxn3leVqbdoL6FY6iPT_C.VC9975vcva.PAU7VsF0uq2btXVinyRRgZKt XUharKSgGfL8O5njG6Ej03SfpQ63WAYO72IcPLpKEhyhDs2nJXucRylGtHhkTfuHvDxWwC5K8ybz RBVuMoxgZj7W99hMyEZbtEMnJDzXCdGSQV6XkOeltvcbsakGz0Rv7Yk9o4fpH4jr2AuYZlwyxCb8 P188.6LMV_bZ2b_G85Uu9KxwPRkiK7h.Evps6XEJwB_PzQNH1jgl0cB08B_tUFgXsfcQBrkHw.9i rFrpjI.VHK9iT7NFv78108QV3aobZ.B8cjc3cKJS2msagoZv1t2FQFvjA0e45OwUFtnTa0WwCPhF InUIhOVfKYWE2jVebR1t4Q8GpYzkwbyLUVRPRr_Y8aJ.Vi9q3fH0zyopSu_y4.ynEz4t6m8wGykt BcQeJ0ZLGupJliOTR6bCzN7GY_QzwW0KYq.cWTIKcTWlETVRfrprA3XU5PxlnEFCzDuXQ6_QKC9k 03hQTudX2wZihTX_US5BGOc1CqV_tebAZ4Hs9DogQJpJMsO8yeY2nHhCrV_jPMFhYUu7WwDEecop 4HKgUARNZrG0L7sbFjiBEAnQEoHB5VbM.jW.Zw_u15tzrGb6VlEYKAINV7PT0BeSGgLQt9kah7fF 1PbS_bPSR0QPlGm8eqCuxG5k95KOVTYoCwKtKH6S4snu6.S8Y8ZAwf8aCUqhZXrzI1uhypalGY4s GYEGS_781GGe5yA-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.ir2.yahoo.com with HTTP; Mon, 13 Jun 2022 01:17:48 +0000 Received: by hermes--canary-production-ir2-6c7595c778-c54g9 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 4419c1e75f73c3038b6a16962b132f56; Mon, 13 Jun 2022 01:17:47 +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 v2 3/7] iio: magnetometer: yas530: Correct scaling of magnetic axes Date: Mon, 13 Jun 2022 03:17:10 +0200 Message-Id: <66eace1d414ad977d8af70c0e1c6b9c74c5bf9bf.1655081082.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: linux-iio@vger.kernel.org Looks like YAS530 raw values return picotesla and YAS532 nanotesla. Adapt comments and scaling. Cc: Linus Walleij Signed-off-by: Jakob Hauser Reviewed-by: Linus Walleij --- drivers/iio/magnetometer/yamaha-yas530.c | 28 +++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index 2d71ae837bf5..40c81c082782 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,24 @@ 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. Devide by + * 100000000 (10^8) to get Gauss. + */ + *val = 1; + *val2 = 100000000; + break; + case YAS532_DEVICE_ID: + /* + * Raw values of YAS532 are in nanotesla. Devide by + * 100000 (10^5) to get Gauss. + */ + *val = 1; + *val2 = 100000; + break; + } return IIO_VAL_FRACTIONAL; default: /* Unknown request */ From patchwork Mon Jun 13 01:17:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 12878905 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 81874C43334 for ; Mon, 13 Jun 2022 01:17:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236180AbiFMBR4 (ORCPT ); Sun, 12 Jun 2022 21:17:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46298 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235105AbiFMBR4 (ORCPT ); Sun, 12 Jun 2022 21:17:56 -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 AD713313A7 for ; Sun, 12 Jun 2022 18:17:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1655083073; bh=JEy0Xl+ycXv9aNpCiOvSpSyWnMAxNZhiWxVAZJUZsWw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=SCUekVOxHIEpwu1SRLr5EcETxJ7PqMWUuFAO5I7kA3Pwha/X7HLQXN6OX0/mT7HpTMVzazNqC6VdntzpL43Uon1ReCYNPUGR2oqwFU3E3Hvl9+437sE54lGgr+V1BTRPWmsoLrVpDmc7MEfU9sb1GOTerNyRCqvYKR/7gsVKovdCpcAhHUD5k03y92tk6cmrqGULmaNK63/OvaDAqyJZ1pSHUCUnEqk6kQPRlH9eN0ykfImrbJDGexWbdL1vzoW3PXRA7xqWyRYscCEQ5kEXEryKfeekMP6wZ3RuDQcktPgoD+MXxp2LvdwWJXZsNsh/vZ5goLq8Kxy8V/bPkKIUkA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1655083073; bh=/fSLFB+5jqwW0XtbTZKZAtYAC2NsOorSeu87flvfACm=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=sFo1xtlk6wKyMg7zOKEk739Vnh3n/6aRWfasnOahb3255279UqFwv3Z+4NWB0SEMQ07MRvwe9oKKKa93qVQWRHkhi4EN3Kx8nkPiw+chWDGtqUmV74p5i0vc/7GJhW4oezqq94kfu2W74lJhwnqs4V5tPszi3tzefQIjOeo0Vs3HfTMAoANpgVhgZyglyV96Y7qu8G97Mbs5julZXKfeSWaVLMtLKWFAYZjj7TIMg9HXxrrE0IDjWaOwfVM+NDay008skKYXCewAp6KPgfRIptI7tlEtYoJVAbvPn/zEYuOk8wlnKVJG1MVjItlV4xEEM5XEV+SYuxIXFUI5O3SufA== X-YMail-OSG: XvOHR0IVM1l02EeXLUxJyf7eRZmF5ScNCUiJxYO99k.IgoN6jm9bGWe8meRMwdU E6u3cdkPqsxvzShTtOg8.8Ojkf4u17Fpe2vDRl86jHAD.ViKkUUegC1Io4xYbJq.pmxQ0drDP5_b dxxJeRVcp1bx_qdwgWyNafAnRuYRzTgU5y0wVlC59t1nFXEP0dY5zKDJxwLXlFv.LNLiQ9btpNjg Np5IVvRWFQqVEB7ktUY8sDznMN4B4UVZ5V15K1MnfcWDyEWJUTmoR_jKXedGkjUbUzwzz7s8mhDu EJoU24_C8gm16U1q6OUtHmSLtrEYCcHrdsKw7LoJckq9rXbN1aCCxL5ueTwL83BMG0BcSmiQLw60 Dd9lo_t9hikzkw6ZT42WNlvFBqLSaaUpP8HVZ7dkx6WVrPycd6NQWDOokgRkTn4qdEqh0ylSu3e2 guLFLIRAO0c49fatzzb6eYxm0k8tUJeNqZoC9Z_od4fYhG4biIutXtsOMIognWQt0UL2vKKfvmJ7 ZuXjxvaQj5GM9sc6LPF9SRcZ9AXbdTnTpUsfZtkLWJbeLXwr1bHDtRLF607LZP7EBtWMGRw93ilm FX4y1yekm2XR43T96W0sz3_N9MTOmzOWcieNvB7tR7gQXrjCJJXqiu3bbz7bRD3.lkpWhejfyoSQ KAPw7eif65IiBipt_0E9quO6UuifpKVkSnYc_MKjy7LXCYdUFEcvzW1Qmh2_zor5mIeX6XmapnVT T4Tmqo6ymh3zm13Ol_LeJMsIcsK1Q1PaGjaLOOYzf2y4YWq6_DvZimBb_Xzu3npJijOKSL.zQ59U mh0dzskGcLUImZaXPpoSVMiRiirC_nbTQd2TXlngih7wqQhKYISaocnfaeITF3R9FtCp8BfOnrCO nr9RT9dyH6c3RbBQHerAcxppSDx18W1Y5XO6akzgWIDREhmndYBopzKupZ9A1LLBkEhrlCV7.MfC uLAZl2ELqnJkyAt8WR05Mdl_jkqsCG.bbiRqgCWP1Uz58ZE5EpK7l2_TfJepIaqgEOd0QHGJfXA8 IdMoxvruwKntUuC3dVvRyD4guuh0W2GQqQq7W_A2W2As58rgJoBl2J4sxqVJsQDo8SXSGSqtFs5_ ZK0iPCtZ0D6WNRG2Xq8vRJRhHN6GeUONz3XLXZ6XCgxkLTN_yENAhttivtYsjFki1BQird2x2Yrd CpT3Zn0PsueJkvAIENjWoYOJ057FNnTEznucmw5I5yB8T0XAcCrySOel2QYwci6gw2lqRwEWh.PD ulAaO.pZXwN9L.PasooUerKRXeCFcyGnOasGN_X_EZIMk28nmVpcOBGAbNKsqPTKy4cPCqxE7yb_ duGv0F.rg5owDC3rUZcrvdnYOkWYo5U0ilmj1mV.WQni9mhNnJgKCjxUrmPPF0kJS.jyTJfIGrty L3i_G2QMX998tUxJVQbfyJplg7WxrKMKzA_feBpNb10J1GvrWZFrSwHDto00CqIjwejq2DmZj1oz DMLdCpzr6IaZV67eCavZVtdJUL.oCj1GNHT4wAu6TDC34VNqyQCeKjFPeAimZ9xT9D2XQ4kfOY5F jyhSYiOKS89vTORinemGnYySou9Ss9HSjkoqNnkKwCz1b5CbVeypiDZvfY5sqmV55vQBA4U.T0IA 9ZMw3z2ho37ESCBIJmR75VGhrmvNRczCdPa6KcmU2X4Uamt54a5m9BQDhdhz4Ebga5GOiEjKxW6U 7YZrXSLeAyfrQbxT3rNdP5NPQOk7wyPbbAQWwgNzpegNr6HriHg_F0bnGX.6hrGq1Z35e2ZGileR cxy7Kz1ZJPT_wOad6.ulATaZcy5VMkoe12cqM6R45QeKxNh_pvb78BlYeWlVSxMuvr6pSc0eF3Pk 5VPtekgKUYayKwaTNqTK9l31RdXOXfb1v5WLYTBJOJiH_lXxSNpMazBmJzrA1CbcJEDZM4_gOfId H5ofnkydpVF4uTKEJX97h91i2p9G8RD_DqrN6jfPMyppN1KY17b5GTzSLWD_pK0WIB_0oSFnUdt8 PivisDnQkRuhDf5yR84n4qA.PPxyRh9GUwnu41T3T8ViJP8vQSAZ_iQIm6K.90WbEeoXp4l_poVA AE1SKLKvknWajawU8Heh19Ab3zYSGW1XdqYK4XKJ4ndlM6avCS9GQZGZ_jyf4QV2fmgzb4_6h9L8 GcxmrlJYdkeqwRbYuQRS_JdBeWMM1plnPeYnIND9ZoWlAsJeAKirPkwUxV9hCDp15On8lxlYkBK8 3wJn49aKIGtd8j66RaUk7SIyc083x8wmG5G_kL_APxJq1jYKvnzyXftGFkuj1ApYSMOCY29au0kw bGRhxQ8U4ZBLhe2Qz X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic305.consmr.mail.ir2.yahoo.com with HTTP; Mon, 13 Jun 2022 01:17:53 +0000 Received: by hermes--canary-production-ir2-6c7595c778-c54g9 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 4419c1e75f73c3038b6a16962b132f56; Mon, 13 Jun 2022 01:17:51 +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 v2 4/7] iio: magnetometer: yas530: Correct temperature handling Date: Mon, 13 Jun 2022 03:17:11 +0200 Message-Id: <2e4622b2c98eda75c262d460533162f74cfb8605.1655081082.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: linux-iio@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 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 Cc: Linus Walleij Signed-off-by: Jakob Hauser Reviewed-by: Linus Walleij --- drivers/iio/magnetometer/yamaha-yas530.c | 93 ++++++++++++++++++------ 1 file changed, 70 insertions(+), 23 deletions(-) diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index 40c81c082782..9bfb3b573907 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,43 @@ 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; + } + + /* 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 +375,34 @@ 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 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 milli degrees 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; + } + /* * Calibrate [x,y,z] with some formulas like this: * @@ -384,6 +435,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 +462,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: /* @@ -513,7 +560,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 Mon Jun 13 01:17:12 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 12878906 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 E35CACCA473 for ; Mon, 13 Jun 2022 01:18:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234968AbiFMBSD (ORCPT ); Sun, 12 Jun 2022 21:18:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47066 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235105AbiFMBSC (ORCPT ); Sun, 12 Jun 2022 21:18:02 -0400 Received: from sonic308-19.consmr.mail.ir2.yahoo.com (sonic308-19.consmr.mail.ir2.yahoo.com [77.238.178.147]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 73E6632073 for ; Sun, 12 Jun 2022 18:18:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1655083080; bh=vXPdlzdIaQCvOW0mwdLK86CDLNZEeTOqD4lxgFzvo2k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=jkBiBSFkkVbh7a6pvGLURcMNECNzbWcSj6rhGB0VecFU/Mir5F/avfqaXReq0LH6UjHl42f9ybeY3DGErk7KrWVbNtw64O9GnXhowksZl0UIiACTbsFzm3oRJW2A3rg5oSgowcsZPKAfK0JNtwad7hBKhlC5SpRB/RTV7azMCx51uhRSWtQ5iA/oE/X81W/DbK+dLpn0X/4woSdwSgy7sL6g3sQ/nMDByGEvammWKET7TpHtRYpgpZhXHioM0yd4xkBEJ1r60B4KahCDb9zxkg37qOYgf5YPW0vbgtYm/7xmbY+vou4UZCGqHVBwHPb9AaMKluntuWvExpMp9RzA3g== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1655083080; bh=H7wGRTRLNiUVfezm++Fhb9TbKtGC1/8Xw4NX3ydhg4M=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=bHyFO6llCZPV7roUiLE976m3qFDBoi271qPOh8CYrNmwTqtx8lHP6mrfOMuF6AhT+L8aCPnDD0TfPCoQG+AuRACr4rbADRb0wun8eVH6/pJY8rQ8aZi7hASR6GCZdRJkEa4rvsDBwogy0/AMnDVaz7pUNYy8lb2TvUI7qaf/HXVB+CnpHTqkFCyBDiA6Si+bY+Jwul8NIvf1JVsP+6qrMm8BTbqKq6KvHEARAwCY5+dcKPUIVnGtFCXEokuyUYZWdRDQBe7Bj9vM+rQmZ4Vz55IBzdycRLn81u4FuM8rXUAbMrTSnm4BzRjY5f5PMWwoXDXo9w2nSWpZP1oOWBdmyw== X-YMail-OSG: dF7JMQ0VM1k677I_scA4Bm7EGuB0raNH3k1k3tSx0KstpA6ojUnSgpWW0Pv7hv3 vEa0C.5aC.YZRatyzD.zanyjBC3wC7k8UrSJVxDpKQkb1_a.gOsbQdQxzP42JyrXv1cAciDq1G5N 1Z2_rwDIBGsQVd_VF3rTDL72hqrQWA8WNs.TCpttNyDLCTpKndkgCE9iT7m3AZLCAZBIzN5NhunT dXkasKdXUmeFDCdCYj233cO5.hWUZNZiAucHq2TqQBhYVfTm1SJK8yA9oUAtReDJUtw55ma.Zsld 5a3KFe8UZjA6Yf7GBhR2teWhbmY.a5i7a_y4wtMfRoP2oekPXKLmswxdA6Qc0ZprkmnoZhVotopD pIUzJbElZlCyRys5qnBWzJmSjdDP4o0cvhN3KRRxaTHbBxaaOqq9WY9rkwtConImxXYxfAJgq0Di t7fxrUdQCVL.5K5gXBlCwdVZKee5cT.D6iQ8WBYrrWYp8MJyQ4Rqk2gV.yoMoYfYC0PMQJwqxO.s dwXHSlUpR25XInn8neF7iRBurnkdrIoUAWgJPAs.L7tz.4Mz.g2apXRvSYmLhZFFGTzM.vXAS4x2 Ta_d6CU1OXGQpBb2SSekLuf8df.M7nccRNeQ1zu4cwEeoWUd8tZwO8YqOR73CwgZw8mjiNl6SZLI vBYENxPHgAnT7rzuhBmSH_IvY.GiF2N5E5UDjMxgv7gNAgVXsKlTWc4zjaQ.o6cvbkkPttzOG7p0 Wb.nT0E7tZ4I_GcgdHLc8VfXROVBCkHGFrLY8WmDnNczDdy2MTh6jTeAhPWvf5ubC.rmxZcANDGc 1_fdVIqpox3gHRyyNG85O4VVqK9R0sQT_wAF.EUtL2YtGuLIMK8ez5HlNeSSiTJM.D2ceG0sTWYu d1L3V2raRHIQ1Z47RxcrBmsaR2yMOXGPXf2260hiQsyHHFyvrRy50TxOHI2DcI.LAvn2Qq.JAsP. NB8MEGYFQSuKx27a4A2b30CqkMawlQZ0A8uL27M11y3k89mdCGjPxO4gQyp92p.NuS9SkITrnTK7 lIikUPxzHajvu1zEpL7AxRu5BENBOMf1azbynQzfbNmwFc_jp7bO_LpVVJKWPg55UGKCdvq9OGhj 7pT6E1PMmyyGhG4MEQPmx1GLPhURhKpJsht7s3_Rf7GrxVN4Lu.1bKlfhEddwbAy8Duoora8QMUb P6REILD4JszhjENFQHN.KNYKr0gXy6KovIguMQcd3BJMexjPHHu28CiSuOXKHxPw3kPOoBuEsx7W iauFRpj8FKey7yMxoGNmQfH043.IcHqQMltBQPkWcA5FeTDPurVlLfuY0p50hi52HmZkO12YuEfK ZgToU.m1JEPiiYpot1TfubqBklujgkhroe.IlJl0mQLk0eU3vzuX.71gbDh37jAcI8t9NGHo2V8w mgHD99snKLYP00oBR2Em22BDEmIJ5YZe1nIpCTEWkARwn4xGgOELPAP5.TjCKm1xs8gupb.rBvcp 88hpraFY3Bp9HQjFB7SwLaCt4XgBkjLg4J0ErD22LZH.mTFR95uWTMQbGNRyDfC.SZ1tiLcZNDhb UpPmjAkPrOcyERbC9vidy_4cmpBLgFTWjURhLVxvpX89.VthISo4HyZJveOSsgJZcB.U83.HeSmn X7fosGnKTc9iu8oz6v3ay0k5oGHeXpHr58wuGLgvX6__fV0uRj.FoEB4st9VMtQm59Uy6hJVuEzY IDoaMGuzOF6y93ihzDefVzj8shqwySSBAcp_r84GEQrYtDWgmYfi6dSjAylODkKpvai_3rKDmhmb 7gextgJprTkAMVY29V42voBKXzAGf5LA1feGbOMR1b5pchXgF7_3STHbw4d34kbbj3DGgNGhOeq4 HfgpDZ7NtVy5BqWVv6Yg0v01bW60ujVduuyVR0PUa6opSZXkEkKMJiVnDcFusKH6ekahq3QPHaKK WCS_cf2QH4Jtt27AX_T_cxEwBjQOc.4QrljLBu3CBkXRvyjmDWA4OKY3kY8Q5kh8- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ir2.yahoo.com with HTTP; Mon, 13 Jun 2022 01:18:00 +0000 Received: by hermes--canary-production-ir2-6c7595c778-c54g9 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 4419c1e75f73c3038b6a16962b132f56; Mon, 13 Jun 2022 01:17:55 +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 v2 5/7] iio: magnetometer: yas530: Change data type of calibration coefficients Date: Mon, 13 Jun 2022 03:17:12 +0200 Message-Id: <075d71215ac12279f6c9a9ed792a9c482ce7884b.1655081082.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: linux-iio@vger.kernel.org This is a preparation for adding YAS537 variant. YAS537 uses other data types on the calibration coefficients [1] than YAS530 [2] and YAS532 [3]. On YAS537, at least for a4 and a7 this could matter because 8-bit unsigned data from the register gets stored into a signed data type, therefore this should be 8-bit as well. For YAS530/532, on the other hand, it doesn't seem to matter. The size of a2-a9 and k is smaller than 8-bit at extraction, also the applied math is low. And Cx/Cy1/Cy2, now being defined as signed 16-bit, are extracted as unsigned 8-bit and undergo only minor math. [1] https://github.com/msm8916-mainline/android_kernel_qcom_msm8916/blob/GT-I9195I/drivers/iio/magnetometer/yas_mag_drv-yas537.c#L76-L78 [2] https://github.com/NovaFusion/android_kernel_samsung_golden/blob/cm-12.1/drivers/sensor/compass/yas_mag_driver-yas530.c#L526-L527 [3] https://github.com/msm8916-mainline/android_kernel_qcom_msm8916/blob/GT-I9195I/drivers/iio/magnetometer/yas_mag_drv-yas532.c#L76-L77 Cc: Linus Walleij Signed-off-by: Jakob Hauser Reviewed-by: Linus Walleij --- drivers/iio/magnetometer/yamaha-yas530.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index 9bfb3b573907..31637a890b7f 100644 --- a/drivers/iio/magnetometer/yamaha-yas530.c +++ b/drivers/iio/magnetometer/yamaha-yas530.c @@ -103,9 +103,11 @@ struct yas5xx_calibration { s32 r[3]; u32 f[3]; /* Temperature compensation calibration */ - s32 Cx, Cy1, Cy2; + s16 Cx, Cy1, Cy2; /* Misc calibration coefficients */ - s32 a2, a3, a4, a5, a6, a7, a8, a9, k; + s8 a2, a3, a4, a6, a7, a8; + s16 a5, a9; + u8 k; /* clock divider */ u8 dck; }; From patchwork Mon Jun 13 01:17:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 12878907 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 3F413C43334 for ; Mon, 13 Jun 2022 01:18:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237029AbiFMBSF (ORCPT ); Sun, 12 Jun 2022 21:18:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47258 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236137AbiFMBSF (ORCPT ); Sun, 12 Jun 2022 21:18:05 -0400 Received: from sonic309-26.consmr.mail.ir2.yahoo.com (sonic309-26.consmr.mail.ir2.yahoo.com [77.238.179.84]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E1D8D313A4 for ; Sun, 12 Jun 2022 18:18:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1655083081; bh=v4O4Iy9W/xsQCJK8BUZfcQQrPHSzBe6EcmCxJTi0P0w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=LU2dF8AZwwJmEugW86Jpyen4MILoHEPtcKBHwE0k46M/2aApbVwmTuFaJG6afYuofeE1yIq20JQFf06oF/ugXxsGnXtOdo+JJoB3elCw2aeseAW558sfnxkyRysVMRH9a5RNrpiy8SYbDjrUfbttzMGBDVd2ATNkNrDLksbJaxyb7uT+dXhX4jtLGrPJYbwnwD0Uw5rQ90GfthHxbsTMCa/UTrZLS0kmfkOIhYIN5wuAxaxk/Z50Pas/R503q6ruaXT61N4mgEhs2LXQ2QkPoiuxWHRVHkRzhXgbmDVEyhRraU+G9/jLYrlW0jyLU51Jo7iXHc5vX6MBo99O+fOoww== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1655083081; bh=7L6ZVRAmcmeewInr4OZF/UrGUwuYcqiN5JweVSog3Lf=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=Qm7nP9Evkyrv07fGd8hfWrhwPDhlk1Olf/UV9ebGv5MLrIEuIZJdL6lKjuVfEVuiWafwYklq64CeNF0GPdkj6cbXIL/ElbvGEFXVNwCggHNChm3Git1PHwpGo6Mr9XzG9eK+0MHhJAFqMRPwmgRrSvz6Y6rpzPoik9j+RS6NOHZlZwgtk9L4c9Pnk+5jkBqAu4kWEEN7YO+NPwqvS2jN/Q66aTsGD0TVzBuSgfiSemu2J/cZp58pYEkB3iRYdBJnan9GmYJtepwqVLr7dQB80aOvoXgdLCuDTeauKlTsIcMuhAGVlEnGMUv2ycgvRYXhxHhb5jjmtWZnbSfVdDcPPQ== X-YMail-OSG: iXstDf4VM1m.5vSTxh.ewtMTqU6HV5pzPHLIlgdWSLQ33Iw40QC6lQ8y7dzkqMy 0SiHw5c.JxAQtcj24nUKXOPSWdl6V7is6lTq.bgipJ3471wrYzQC2OIb9qPRc9RtZehtvQbP51Y_ qQCpFU43BhQK04L9ltwehA.WhOk5utnYn0pk6OcOBSXqwyanRwhkwSaaL2TjqFQpOu_i0JbahMDp RFOZe9ha1VrDzu9paiGxMiYlhsappyq_eBL_HOhmrvJlgh_2O5ydKDnHWpSHQWNQAzNUHQlLfIOB WfDE82GIqJJIT3jPRSFgxNVcmD32WsMHooOLVjPNIDPOZhBew703pufON_eJPIsSBdUoBhaH.OZF B7sinaUmRETmvLgWGv6nyoKcHlWi7NUSPy0gzYbKHRbe_wZFP1.NSYGB42bOZye_sygAocGKL9Ji zdXLq7kNLw4uCl2W3_VTNeCcMzd_n7ABzAfGesJRIr3XutSRZCQUoY8Ak7TwBPfIRq7RXs44LTfx _DT5Ggm6RqjUHS.RZ5TkIZ4zcifp.QBpg3T9m_3J3Fs2ZiSI415.gqMFZWWOowcIVwnlK1tr5gwX HzYqs3mLBEtUkBBnvO8YIskhT5hx5t3yWHLx1_q78UMqAFRi_wgVFPmbW3X6PmUmLjM7XhmRByTk KUkilzJ3o6LyZYT6j_NaSB6DzN3drVv4Ofk8LEvqhXdEvlqBXKgGtwGjiGAOEXDcl59I9ZEXyOcd S_WDf77K0iyDgyNOH7zhRj6does1MRrlRrUKh1ffF.XTsL4QDal_s_fS44UezvKHQeGczz9C4NMW m3rGHfZYQA1tAyGR97y.BLvc_v._FsVeroRO3RR_XzjMZFybXvX0V18pZSepTuLDMq10p6C3O_Zi 6JwP3Mh1841eT3q5rVq.c2MYFVBTsryr5vsbcPNgPMSQzN1vn4wRw51Xy.v7wj7.Bh5rpmRBSOLM SeesrCU1cFVHm_q8v.FkcLaKhgCaAngAgY_WXmWfDsX8ubmilDWtPMSuvtv0uC26tf4hgeSgpxOc g16MKUWPQys2de9HlE3NJ3mbVNuRDx3NtOqNnxkVDEYINg9vahhBqb9.faYlgxqL2EAVds.rRUm_ n9QvaOJhARH.4aHR2ddaler0FXUD2H7tOKwjVE0igzoxz1ZD67EbdHxkfAPRRmPgKtI_hdV_Hbha F0JzyZMJcyX8LryWOPfloiMwi1lDUVkFuDmYLxcYHdMHF63DsPPc8.jwHIdaOS0emuDnK5pzgHy9 4.zJtKgtjkCq8x5Wv2qQ8Lpylhz5abqcGy2DNNkhVLHnB4bu_KZwdeeUGPXIgDJyj2lAjNfLjgDy OQZk8h7VSXtOxnN_pRhpMvftcm.0FVmnR9CkMx6TX8vmn8n_C1j6IQpVerQDaKc1rCCVlyHwV8J4 HM2ai4Lu6JlQXKu4CAh.wUR_qgpewPNq7x5uKal6lDeu5beH9uUfmsTnt0FmmPY4h2N6Ndrhm_Xv 3nIbPP7HzegWwKAJNKLJkjJmAoXNdfakOGDzdVL1DrDq0A.4uwo2UE0idTT67feMeIxdmBbn.Z_p IUF6qfL.k_IMa7iI1UB.LqbDk6aS1FNTTenxM4R5LuY26KgPUgbnccODsGpOyUEy0JcSL.9ihkew YolZk497UOUE5NuUa_bUd5IkpL.fqvR3c7TTlEvbpPGr_maf3jJYEsB11l9mKjfMoH7i8lMF3WPy 9ZoX8El8dY1eREKKRe9o3aREMjgUWJmMAUNat8CHgT7QO.KBraE.MmDCAwswreen5m_2O0YNiULq NVykzMJDY_6kjifwGhk8NWp6Z0r2IUQi3TDp2rQ0qcdjoCcR.x__pG.Ws0BNPKuPAaPJ7HlVwPz8 waIu_8cLJIAZF.TA22jEI_thQCegaiKTTZIMzbFtNhT1xXjvmhndFvdQ.QqE7ySlWOGLj59uXU6u NcFhiqQpiYGThthkl88lGkxXRM1qqs6m2UCxov_byGbk9qLa7RJonVo8IjpluMSOC3mvNYUrkDJy eHLykoiT5NAApOuLUxiGPg3wyc_RlraiRshrT7U6hkZD1UTmMvkAure2qsXqYRqXHynuvXmM4Ba0 F9rOWbSGKp.i.jN6iE6XP5ItnpdbMFfn409x3UoY02bjh_PYBJ.IczCGqNLbguUv7I_ktcZjQ4uR hX3kJblKjeVej1sOUn5PMWO82ia033CkrSGItccMcrgN9ZrPDXxAW3pRDDyv7jS..55egX6ULgqS 3xpJDEsmKTnDPKSJTr7maI5JM1V6o0Y_YJ4pGTxo94.9I6zuiUInIgwu7b15tex27OX6JHoFCAB9 b_b0Zy16rtKiEBOG5 X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.ir2.yahoo.com with HTTP; Mon, 13 Jun 2022 01:18:01 +0000 Received: by hermes--canary-production-ir2-6c7595c778-c54g9 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 4419c1e75f73c3038b6a16962b132f56; Mon, 13 Jun 2022 01:17:59 +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 v2 6/7] iio: magnetometer: yas530: Rename functions and registers Date: Mon, 13 Jun 2022 03:17:13 +0200 Message-Id: <826851a63ce792ae105638c73b9e3c818cb45e6b.1655081082.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: linux-iio@vger.kernel.org This is a preparation for adding YAS537 variant. Rename functions used only by YAS530 & YAS532 from yas5xx to yas530_532. Same for the registers. Cc: Linus Walleij Signed-off-by: Jakob Hauser Reviewed-by: Linus Walleij --- drivers/iio/magnetometer/yamaha-yas530.c | 106 ++++++++++++----------- 1 file changed, 55 insertions(+), 51 deletions(-) diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index 31637a890b7f..72958bc0849b 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 +/* Registers used by YAS530 and YAS532 */ +#define YAS530_532_ACTUATE_INIT_COIL 0x81 +#define YAS530_532_MEASURE 0x82 +#define YAS530_532_CONFIG 0x83 +#define YAS530_532_MEASURE_INTERVAL 0x84 +#define YAS530_532_OFFSET_X 0x85 /* [-31 .. 31] */ +#define YAS530_532_OFFSET_Y1 0x86 /* [-31 .. 31] */ +#define YAS530_532_OFFSET_Y2 0x87 /* [-31 .. 31] */ +#define YAS530_532_TEST1 0x88 +#define YAS530_532_TEST2 0x89 +#define YAS530_532_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,7 +184,7 @@ static u16 yas532_extract_axis(u8 *data) } /** - * yas5xx_measure() - Make a measure from the hardware + * yas530_532_measure() - Make a measure from the hardware * @yas5xx: The device state * @t: the raw temperature measurement * @x: the raw x axis measurement @@ -190,7 +192,8 @@ static u16 yas532_extract_axis(u8 *data) * @y2: the y2 axis measurement * @return: 0 on success or error code */ -static int yas5xx_measure(struct yas5xx *yas5xx, u16 *t, u16 *x, u16 *y1, u16 *y2) +static int yas530_532_measure(struct yas5xx *yas5xx, u16 *t, + u16 *x, u16 *y1, u16 *y2) { unsigned int busy; u8 data[8]; @@ -198,7 +201,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_532_MEASURE, YAS5XX_MEASURE_START); if (ret < 0) goto out_unlock; @@ -264,7 +267,7 @@ 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) +static s32 yas530_532_linearize(struct yas5xx *yas5xx, u16 val, int axis) { struct yas5xx_calibration *c = &yas5xx->calibration; static const s32 yas532ac_coef[] = { @@ -306,7 +309,7 @@ static s32 yas5xx_linearize(struct yas5xx *yas5xx, u16 val, int axis) } /** - * yas5xx_get_measure() - Measure a sample of all axis and process + * yas530_532_get_measure() - Measure a sample of all axis and process * @yas5xx: The device state * @to: Temperature out * @xo: X axis out @@ -314,7 +317,8 @@ static s32 yas5xx_linearize(struct yas5xx *yas5xx, u16 val, int axis) * @zo: Z axis out * @return: 0 on success or error code */ -static int yas5xx_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, s32 *zo) +static int yas530_532_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 +327,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_532_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_532_linearize(yas5xx, x, 0); + sy1 = yas530_532_linearize(yas5xx, y1, 1); + sy2 = yas530_532_linearize(yas5xx, y2, 2); /* Set the temperature reference value (unit: counts) */ switch (yas5xx->devid) { @@ -596,11 +600,11 @@ static const struct regmap_config yas5xx_regmap_config = { }; /** - * yas53x_extract_calibration() - extracts the a2-a9 and k calibration + * yas530_532_extract_calibration() - extracts the a2-a9 and k calibration * @data: the bitfield to use * @c: the calibration to populate */ -static void yas53x_extract_calibration(u8 *data, struct yas5xx_calibration *c) +static void yas530_532_extract_calibration(u8 *data, struct yas5xx_calibration *c) { u64 val = get_unaligned_be64(data); @@ -638,12 +642,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_532_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_532_CAL, data, sizeof(data)); if (ret) return ret; dev_dbg(yas5xx->dev, "calibration data: %*ph\n", 14, data); @@ -655,7 +659,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_532_extract_calibration(&data[3], c); /* * Extract linearization: @@ -686,11 +690,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_532_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_532_CAL, data, sizeof(data)); if (ret) return ret; dev_dbg(yas5xx->dev, "calibration data: %*ph\n", 14, data); @@ -709,7 +713,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_532_extract_calibration(&data[3], c); /* * Extract linearization: * Linearization layout in the 32 bits at byte 10: @@ -732,7 +736,7 @@ static int yas532_get_calibration_data(struct yas5xx *yas5xx) return 0; } -static void yas5xx_dump_calibration(struct yas5xx *yas5xx) +static void yas530_532_dump_calibration(struct yas5xx *yas5xx) { struct yas5xx_calibration *c = &yas5xx->calibration; @@ -755,20 +759,20 @@ 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) +static int yas530_532_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_532_OFFSET_X, ox); if (ret) return ret; - ret = regmap_write(yas5xx->map, YAS5XX_OFFSET_Y1, oy1); + ret = regmap_write(yas5xx->map, YAS530_532_OFFSET_Y1, oy1); if (ret) return ret; - return regmap_write(yas5xx->map, YAS5XX_OFFSET_Y2, oy2); + return regmap_write(yas5xx->map, YAS530_532_OFFSET_Y2, oy2); } -static s8 yas5xx_adjust_offset(s8 old, int bit, u16 center, u16 measure) +static s8 yas530_532_adjust_offset(s8 old, int bit, u16 center, u16 measure) { if (measure > center) return old + BIT(bit); @@ -777,7 +781,7 @@ static s8 yas5xx_adjust_offset(s8 old, int bit, u16 center, u16 measure) return old; } -static int yas5xx_meaure_offsets(struct yas5xx *yas5xx) +static int yas530_532_measure_offsets(struct yas5xx *yas5xx) { int ret; u16 center; @@ -786,7 +790,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_532_ACTUATE_INIT_COIL, 0); if (ret) return ret; @@ -820,26 +824,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_532_set_offsets(yas5xx, ox, oy1, oy2); if (ret) return ret; - ret = yas5xx_measure(yas5xx, &t, &x, &y1, &y2); + ret = yas530_532_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_532_adjust_offset(ox, i, center, x); + oy1 = yas530_532_adjust_offset(oy1, i, center, y1); + oy2 = yas530_532_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_532_set_offsets(yas5xx, ox, oy1, oy2); if (ret) return ret; @@ -848,27 +852,27 @@ static int yas5xx_meaure_offsets(struct yas5xx *yas5xx) return 0; } -static int yas5xx_power_on(struct yas5xx *yas5xx) +static int yas530_532_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_532_TEST1, 0); if (ret) return ret; - ret = regmap_write(yas5xx->map, YAS5XX_TEST2, 0); + ret = regmap_write(yas5xx->map, YAS530_532_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_532_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_532_MEASURE_INTERVAL, 0); } static int yas5xx_probe(struct i2c_client *i2c, @@ -950,11 +954,11 @@ static int yas5xx_probe(struct i2c_client *i2c, goto assert_reset; } - yas5xx_dump_calibration(yas5xx); - ret = yas5xx_power_on(yas5xx); + yas530_532_dump_calibration(yas5xx); + ret = yas530_532_power_on(yas5xx); if (ret) goto assert_reset; - ret = yas5xx_meaure_offsets(yas5xx); + ret = yas530_532_measure_offsets(yas5xx); if (ret) goto assert_reset; From patchwork Mon Jun 13 01:17:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jakob Hauser X-Patchwork-Id: 12878908 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 E911EC43334 for ; Mon, 13 Jun 2022 01:18:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236137AbiFMBST (ORCPT ); Sun, 12 Jun 2022 21:18:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47942 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236559AbiFMBSS (ORCPT ); Sun, 12 Jun 2022 21:18:18 -0400 Received: from sonic309-26.consmr.mail.ir2.yahoo.com (sonic309-26.consmr.mail.ir2.yahoo.com [77.238.179.84]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EDA4F3388D for ; Sun, 12 Jun 2022 18:18:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rocketmail.com; s=s2048; t=1655083091; bh=3wgWYrQ3kNag7wzZsh0DmsHVlTwHiBr5d6GO/gIQ6CQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=ILmJ8bCX5Ty9bN1ZCUzueWk5gorgjFoYzXoaXWXozGiActAEsROL3pfOYurDgXpKxj/A0juRjQVqCcK/JyA83kiWiKbZaIyzbx2Si+MF1lfC7md7Oyq/gpZEOyXZbE6R8+QL64Lz8aWcYcRoMpd9Pgt4hiA8FxajbqtOej+AIa9ZPns2mX2Ntxu6ogLN/GFua4Mg3/4bDF8vLYAI7uY4EPw3+jHy1IDTO3UXI4jhtro8gI4Xm89PnWAhNIzZ5KErK48QVjx37Ayxk2H3uZJ8VQoYKxpEJXbCI9F3FB2fnTuxe6o56m/3qitvvtWY6WxvQxdEykQV4M1CJqrovDho7Q== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1655083091; bh=PUbCupjV0ux+MasRGiQHOqhRxFtC/zLG29Tn211BTas=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=AQEKXZrF9wThFvPilj7RcvTLri3o5iCMlb+hx8KmBXAWPxZ7MpPkPA1B1Eu3tFgqrY2hSDrAfGDrD87b9rv3aPqqLxIwbUY8HMjO/RWWXEx6wE6LCySGcZbdfRptt2piIgdDYGR2+mDX9OTvwTjsZSvVGNbAUvelvvnI7WNvf9c2WJt+ZFdXCSE2ypwTtL9X0/W+SBZPoXm9QzTsaJr+ljOVEppE+/NzZOD58q+dcTH8Ox2v6kZ3ZZMYooqqFlYWmQ3ITYiXJ8X+4NB7i8eFPf9QcZaqFUig22/JnjjiRXJfiS0kNT/cRHoPz48G+0G8+yANUWKAbG9DUHw4p1w0Zw== X-YMail-OSG: yJhPqn0VM1kEDosov_xmCMHuNug9srBp3eiyvCr7Q35UC1dYdUDF_LVEjf2_Va1 s9Rzmrs2VQo6IJBxImBu5qg2LWvvIdoQl927eUisKXk6ggajXKIkoV37jzl0PrWowZbUIvqfEXJs 9m.HiUJbYh6avs605JxR8vahVf.nsYcFU1EvrkXq5dpshquUXj58xBFFIloBtxHtRkJP0xqGYUD1 sqH866mmoF8Zwh7RacYcjN0pb_p2SycKA2IVPNQyCqyvrvgD0o80QBu7jtIowhUb8R3Hz6.DSD3d KGKTp87ncYd.ImPQ8jwquZIUjtjR.KcqmvijuSEIzMTn.HfHTKbTYl_cpgdLqT2RdB2.YZumT93U DSvuzwS2cFJu_4EvO5JDFnH1Q4ixDoAZVDhzcuM.DYJmj1p20KIGlAKW2o_Y3vGMcCmOZ02LEDyR ReKx97VDCI4V78rYRVziMRMlNzHsBQ1Y9vDLbci1K1TfBpvJO.p.CG6_4dNVd33sYt8C5c6LQnNh IlJn4cwOWALxu8CRsQLmeOWWRMhC.GF4ZDFEdv6mzyYUnlARpo2ePBdx_uQBRQ9LR26l17gf77wu CnqwNB1M0b0ZCb2TP0sXTL.gG1bUqOnrfZRA.4.Mkw8qWMkmoCPDa60r9iVcOGFshyf3VE9AakyR MbQg0ZHXNSoqOW8za8ENpDRd83IDA2Ic__TOMOvEenKdGAXqhxefWSzl8vZDmU_w3OckEc8dya4p ax0aqLh456ZUtfRiuJPCInFB3yMbL3KY0MbwwW.wmyQBKiiDp5r96EbW4Q8olAOXjZFIuiyQD8_x QfOFzRck9SsneTEinZBzkPEvyWGpsHyP2FmU7tkArIPE6M4kvUlKFFbxQdHTCXnjsyD2NZ6W7ncT yBF8d34vrbDkowosleTr_SX_sU7j66QPPx0M6wLHWwARRJuUVk1mUgAXV1lfMPF18G0fYw0KvYKo shhK19pyfqED7d6mENoCDTF4YFI0vfPtnayKMHePD0fjNamlAR04E3gCUDuYX6Fro2hULEsRISrv 3uzK3z9RYAjWFc0_FgwuKPg4VAq3Y7iarrg87v94nr8AQ2Gp_4ymtleOlgL9Hr7TQSZRilee_wKS fLI_4fjg5xasMM2BcaCSfLvmE2Td.v2atA12Rd4Zhfq7CVr6G173F9_mBc0S5znJdAuv2BKyUmUU VaVWK3frzKHjb7FyR0HcnOOsk9I_EXy6Sj_e8oRilTaOve6oKC.hzKEWI4MLXH9DOc49BSrfI_nr CELczHFy3VbMP0tTeIsBFhgjt6eyuA626U..BzAsoH4gFXYHIU.4RpVbQKw.26ULqCA8O_MZdGOc ii0OVtLd2ogIJPPaue0UXIp6ve71UPn8Z9qJroWGJOZO8u.VMB5PcAZw2Heti7UWztXlaJdqtVOA wxh0EBwSc14M6YWv2BoLp8xUjaEw8P4wpMrKyzPcA2PJqdt_mOBn7BHzTywnlIaLArFuCQgz4mvU 3yI0re8lmN3NLojbdcEwZPFiePoF5j9_nOWhFi5lMy7sG5vM9xgq1GP3tOPSy1BUGEsXo.cLQfk5 lpVgrM6ZElAEZRc4P65S5RGXBJDahPOEeV0JtKRGXWEW71ucZucE62upMJJysYeRdlPNQFiqeidi julLXGXM3a5ATDpzDY2MLy0_yRPyZh8uaBK.8IQjSl4eoyre8STKdaQLQOKsIyI_ZFdDqppH7udU 0DLN6sqTmi9m9n5rvPbEcZ6GUUxArMg2rK6iSDsTobmSxXV5wp4HX85CZzA3K0NvdkA_Zgwnl6CP a4mGMbRJgELI5ZJm0TRt30.Wl1pS4MBuPuH_YhDjHogtc8hcS4S6VQQO8NApKBxZphXPnH37R4au wktultVFLi5kF3x1dpHabK4UMsadcMDIlNddLk6dvvoIAxC79OSwC.32UyeWgzyR6g119XTgv6fc QWFJ9GSMbx6mPnjzoJx_GYH6BKk4xT1uStlOj227m9QTruC8xJlXrf4ch2e4ijLzYRN2rLMCiS2L HegnVBBlY4fGzMb7XzBB8vAjOEXh20bxrzApDy4zqzbXrXIhqCpFO3Nui9lAAMSiKNHUUBRJ_tk1 tSMEpjkQhzggKxb0j0U9XahlprYZXCdrEUCHdxl7mTNutkbvH.HLR2DzHczbGGtxnZp.hFttzVTj QFNWlu8Q8xC56vcDfm_JjZV6G_26ggN92bHBoCXUdcoMZOfy.STEUbRujB2xObdy_Gi.gpMeI.Js kygRDFXMIvJAgCCtyUCTsIP_3jpz14IfpV7irJQg7lBZgunesWEfcaql.wnx.9d1SGO8NibNAOMX HH_p4wyZvzugJTxM- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.ir2.yahoo.com with HTTP; Mon, 13 Jun 2022 01:18:11 +0000 Received: by hermes--canary-production-ir2-6c7595c778-c54g9 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 4419c1e75f73c3038b6a16962b132f56; Mon, 13 Jun 2022 01:18: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 v2 7/7] iio: magnetometer: yas530: Add YAS537 variant Date: Mon, 13 Jun 2022 03:17:14 +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: linux-iio@vger.kernel.org This adds 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 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 Cc: Linus Walleij Signed-off-by: Jakob Hauser Reviewed-by: Linus Walleij --- The diff on function yas5xx_probe() is a bit confusing. Maybe better to understand when comparing before and after code. before: https://github.com/torvalds/linux/blob/v5.19-rc2/drivers/iio/magnetometer/yamaha-yas530.c#L873-L902 after: https://github.com/Jakko3/linux/blob/yas537_v2/drivers/iio/magnetometer/yamaha-yas530.c#L1413-L1462 drivers/iio/magnetometer/Kconfig | 4 +- drivers/iio/magnetometer/yamaha-yas530.c | 569 +++++++++++++++++++++-- 2 files changed, 543 insertions(+), 30 deletions(-) diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/Kconfig index 07eb619bcfe8..868128cee835 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. Right now YAS530, YAS532, YAS533 and + YAS537 are fully 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 72958bc0849b..10b87bffccae 100644 --- a/drivers/iio/magnetometer/yamaha-yas530.c +++ b/drivers/iio/magnetometer/yamaha-yas530.c @@ -10,13 +10,16 @@ * (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 * 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 @@ -56,6 +59,23 @@ #define YAS530_532_TEST2 0x89 #define YAS530_532_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 +87,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) @@ -93,8 +114,15 @@ #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 YAS537_VERSION_0 0 /* Version naming unknown */ +#define YAS537_VERSION_1 1 /* Version naming unknown */ +#define YAS537_MAG_AVERAGE_32_MASK GENMASK(6, 4) /* corresponds to 0x70 */ +#define YAS537_MEASURE_TIME_WORST 1500 /* us */ +#define YAS537_DEFAULT_SENSOR_DELAY 50 /* ms */ +#define YAS537_MAG_RCOIL_TIME 65 /* us */ +#define YAS537_20DEGREES 8120 /* Counts starting at -386 °C */ + #define YAS539_DEVICE_ID 0x08 /* YAS539 (MS-3S) */ /* Turn off device regulators etc after 5 seconds of inactivity */ @@ -267,6 +295,84 @@ static int yas530_532_measure(struct yas5xx *yas5xx, u16 *t, 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; + } + + /* Read data */ + ret = regmap_bulk_read(yas5xx->map, YAS5XX_MEASURE_DATA, + data, sizeof(data)); + if (ret) + goto out_unlock; + + mutex_unlock(&yas5xx->lock); + + /* Arrange data */ + *t = ((data[0] << 8) | data[1]); + xy1y2[0] = ((FIELD_GET(GENMASK(5, 0), data[2]) << 8) | data[3]); + xy1y2[1] = ((data[4] << 8) | data[5]); + xy1y2[2] = ((data[6] << 8) | data[7]); + + /* 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] - 8192; + h[0] = (c->k * (128 * s[0] + c->a2 * s[1] + c->a3 * s[2])) / 8192; + h[1] = (c->k * (c->a4 * s[0] + c->a5 * s[1] + c->a6 * s[2])) / 8192; + h[2] = (c->k * (c->a7 * s[0] + c->a8 * s[1] + c->a9 * s[2])) / 8192; + for (i = 0; i < 3; i++) { + if (h[i] < -8192) + h[i] = -8192; + if (h[i] > 8191) + h[i] = 8191; + xy1y2[i] = h[i] + 8192; + } + } + + /* Assign data */ + *x = xy1y2[0]; + *y1 = xy1y2[1]; + *y2 = xy1y2[2]; + + return 0; + +out_unlock: + mutex_unlock(&yas5xx->lock); + return ret; +} + static s32 yas530_532_linearize(struct yas5xx *yas5xx, u16 val, int axis) { struct yas5xx_calibration *c = &yas5xx->calibration; @@ -322,7 +428,7 @@ static int yas530_532_get_measure(struct yas5xx *yas5xx, s32 *to, { 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; @@ -431,6 +537,57 @@ static int yas530_532_get_measure(struct yas5xx *yas5xx, s32 *to, 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_ref, 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; + + /* Set the temperature reference value (unit: counts) */ + t_ref = YAS537_20DEGREES; + + /* + * Raw temperature value t is number of counts. A product description + * of YAS537 mentions a temperature resulution of 0.05 °C/count. + * A readout of the t value at ca. 20 °C returns approx. 8120 counts. + * + * 8120 counts x 0.05 °C/count corresponds to a range of 406 °C. + * 0 counts would be at theoretical -386 °C. + * + * The formula used for YAS530/532 needs to be adapted to this + * theoretical starting temperature, again calculating with 1/10:s + * of degrees Celsius and finally multiplying by 100 to get milli + * degrees Celsius. + */ + *to = ((4060 * t / t_ref) - 3860) * 100; + + /* + * Unfortunately, no linearization or temperature compensation formulas + * are known for YAS537. + */ + + /* Calculate x, y, z from x, y1, y2 */ + *xo = (x - 8192) * 300; + *yo = (y1 - y2) * 1732 / 10; + *zo = (-y1 - y2 + 16384) * 300; + + return 0; +} + static int yas5xx_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, @@ -444,7 +601,18 @@ 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); + switch (yas5xx->devid) { + case YAS530_DEVICE_ID: + case YAS532_DEVICE_ID: + ret = yas530_532_get_measure(yas5xx, &t, &x, &y, &z); + break; + case YAS537_DEVICE_ID: + ret = yas537_get_measure(yas5xx, &t, &x, &y, &z); + break; + default: + dev_err(yas5xx->dev, "unknown device type\n"); + return -EINVAL; + } pm_runtime_mark_last_busy(yas5xx->dev); pm_runtime_put_autosuspend(yas5xx->dev); if (ret) @@ -478,9 +646,10 @@ static int yas5xx_read_raw(struct iio_dev *indio_dev, *val2 = 100000000; break; case YAS532_DEVICE_ID: + case YAS537_DEVICE_ID: /* - * Raw values of YAS532 are in nanotesla. Devide by - * 100000 (10^5) to get Gauss. + * Raw values of YAS532 and YAS537 are in nanotesla. + * Devide by 100000 (10^5) to get Gauss. */ *val = 1; *val2 = 100000; @@ -500,7 +669,18 @@ 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); + switch (yas5xx->devid) { + case YAS530_DEVICE_ID: + case YAS532_DEVICE_ID: + ret = yas530_532_get_measure(yas5xx, &t, &x, &y, &z); + break; + case YAS537_DEVICE_ID: + ret = yas537_get_measure(yas5xx, &t, &x, &y, &z); + break; + default: + dev_err(yas5xx->dev, "unknown device type\n"); + return; + } pm_runtime_mark_last_busy(yas5xx->dev); pm_runtime_put_autosuspend(yas5xx->dev); if (ret) { @@ -586,9 +766,34 @@ 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 || - (reg >= YAS5XX_MEASURE_DATA && reg <= YAS5XX_MEASURE_DATA + 7); + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct yas5xx *yas5xx = iio_priv(indio_dev); + + if (reg >= YAS5XX_MEASURE_DATA && reg <= YAS5XX_MEASURE_DATA + 7) + return true; + + /* + * YAS versions share different registers on the same address, + * need to differentiate. + */ + switch (yas5xx->devid) { + case YAS530_DEVICE_ID: + case YAS532_DEVICE_ID: + if (reg == YAS530_532_ACTUATE_INIT_COIL || + reg == YAS530_532_MEASURE) + return true; + break; + case YAS537_DEVICE_ID: + if (reg == YAS537_MEASURE) + return true; + break; + default: + dev_err(yas5xx->dev, "unknown device type\n"); + break; + /* fall through */ + } + + return false; } /* TODO: enable regmap cache, using mark dirty and sync at runtime resume */ @@ -652,7 +857,10 @@ static int yas530_get_calibration_data(struct yas5xx *yas5xx) return ret; dev_dbg(yas5xx->dev, "calibration data: %*ph\n", 14, 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 */ @@ -679,6 +887,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; } @@ -705,7 +914,9 @@ static int yas532_get_calibration_data(struct yas5xx *yas5xx) 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); @@ -714,6 +925,7 @@ static int yas532_get_calibration_data(struct yas5xx *yas5xx) c->Cy1 = data[1] * 10 - 1280; c->Cy2 = data[2] * 10 - 1280; yas530_532_extract_calibration(&data[3], c); + /* * Extract linearization: * Linearization layout in the 32 bits at byte 10: @@ -736,6 +948,216 @@ 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, the exact meaning is unknown */ + 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: %*ph\n", 17, data); + + /* Sanity check, is this all zeroes? */ + if (memchr_inv(data, 0x00, 16) == NULL) { + if (FIELD_GET(GENMASK(5, 0), data[16]) == 0) + 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 < 17; i++) { + if (i < 12) { + ret = regmap_write(yas5xx->map, + YAS537_MTC + i, + data[i]); + if (ret) + return ret; + } else if (i < 15) { + ret = regmap_write(yas5xx->map, + YAS537_OFFSET_X + i - 12, + data[i]); + if (ret) + return ret; + yas5xx->hard_offsets[i - 12] = data[i]; + } else { + ret = regmap_write(yas5xx->map, + YAS537_HCK + i - 15, + data[i]); + 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; + 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, + ((data[3] & GENMASK(7, 5)) | BIT(4))); + if (ret) + return ret; + ret = regmap_write(yas5xx->map, YAS537_HCK, + (FIELD_GET(GENMASK(7, 4), data[15]) << 1)); + if (ret) + return ret; + ret = regmap_write(yas5xx->map, YAS537_LCK, + (FIELD_GET(GENMASK(3, 0), data[15]) << 1)); + if (ret) + return ret; + ret = regmap_write(yas5xx->map, YAS537_OC, + FIELD_GET(GENMASK(5, 0), 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 + */ + + /* Get data into these three blocks val1 to val3 */ + 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; +} + static void yas530_532_dump_calibration(struct yas5xx *yas5xx) { struct yas5xx_calibration *c = &yas5xx->calibration; @@ -759,6 +1181,26 @@ static void yas530_532_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); + } +} + static int yas530_532_set_offsets(struct yas5xx *yas5xx, s8 ox, s8 oy1, s8 oy2) { int ret; @@ -875,6 +1317,43 @@ static int yas530_532_power_on(struct yas5xx *yas5xx) return regmap_write(yas5xx->map, YAS530_532_MEASURE_INTERVAL, 0); } +static int yas537_power_on(struct yas5xx *yas5xx) +{ + int ret; + u8 intrvl; + + /* Write registers according to Android driver */ + ret = regmap_write(yas5xx->map, YAS537_ADCCAL, GENMASK(1, 0)); + if (ret) + return ret; + ret = regmap_write(yas5xx->map, YAS537_ADCCAL+1, GENMASK(7, 3)); + 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 * 1000 + - YAS537_MEASURE_TIME_WORST) / 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; + usleep_range(YAS537_MAG_RCOIL_TIME, YAS537_MAG_RCOIL_TIME+100); + + return 0; +} + static int yas5xx_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { @@ -933,35 +1412,55 @@ static int yas5xx_probe(struct i2c_client *i2c, switch (yas5xx->devid) { case YAS530_DEVICE_ID: - ret = yas530_get_calibration_data(yas5xx); + case YAS532_DEVICE_ID: + + if (yas5xx->devid == YAS530_DEVICE_ID) { + ret = yas530_get_calibration_data(yas5xx); + if (ret) + goto assert_reset; + dev_info(dev, "detected YAS530 MS-3E %s", + yas5xx->version ? "B" : "A"); + strncpy(yas5xx->name, "yas530", sizeof(yas5xx->name)); + } else { + ret = yas532_get_calibration_data(yas5xx); + if (ret) + goto assert_reset; + dev_info(dev, "detected YAS532/YAS533 MS-3R/F %s", + yas5xx->version ? "AC" : "AB"); + strncpy(yas5xx->name, "yas532", sizeof(yas5xx->name)); + } + + yas530_532_dump_calibration(yas5xx); + ret = yas530_532_power_on(yas5xx); + if (ret) + goto assert_reset; + ret = yas530_532_measure_offsets(yas5xx); if (ret) goto assert_reset; - dev_info(dev, "detected YAS530 MS-3E %s", - yas5xx->version ? "B" : "A"); - strncpy(yas5xx->name, "yas530", sizeof(yas5xx->name)); break; - case YAS532_DEVICE_ID: - ret = yas532_get_calibration_data(yas5xx); + + case YAS537_DEVICE_ID: + ret = yas537_get_calibration_data(yas5xx); + if (ret) + goto assert_reset; + dev_info(dev, "detected YAS537 MS-3T"); + /* As the version naming is unknown, provide it for debug only */ + dev_dbg(yas5xx->dev, "YAS537 version: %s\n", + yas5xx->version ? "1" : "0"); + strncpy(yas5xx->name, "yas537", sizeof(yas5xx->name)); + + yas537_dump_calibration(yas5xx); + ret = yas537_power_on(yas5xx); if (ret) goto assert_reset; - dev_info(dev, "detected YAS532/YAS533 MS-3R/F %s", - yas5xx->version ? "AC" : "AB"); - strncpy(yas5xx->name, "yas532", sizeof(yas5xx->name)); break; + default: ret = -ENODEV; dev_err(dev, "unhandled device ID %02x\n", yas5xx->devid); goto assert_reset; } - yas530_532_dump_calibration(yas5xx); - ret = yas530_532_power_on(yas5xx); - if (ret) - goto assert_reset; - ret = yas530_532_measure_offsets(yas5xx); - if (ret) - goto assert_reset; - indio_dev->info = &yas5xx_info; indio_dev->available_scan_masks = yas5xx_scan_masks; indio_dev->modes = INDIO_DIRECT_MODE; @@ -1057,7 +1556,19 @@ static int __maybe_unused yas5xx_runtime_resume(struct device *dev) usleep_range(31000, 40000); gpiod_set_value_cansleep(yas5xx->reset, 0); - ret = yas5xx_power_on(yas5xx); + switch (yas5xx->devid) { + case YAS530_DEVICE_ID: + case YAS532_DEVICE_ID: + ret = yas530_532_power_on(yas5xx); + break; + case YAS537_DEVICE_ID: + ret = yas537_power_on(yas5xx); + break; + default: + dev_err(yas5xx->dev, "unknown device type\n"); + ret = -EINVAL; + break; + } if (ret) { dev_err(dev, "cannot power on\n"); goto out_reset; @@ -1083,6 +1594,7 @@ static const struct i2c_device_id yas5xx_id[] = { {"yas530", }, {"yas532", }, {"yas533", }, + {"yas537", }, {} }; MODULE_DEVICE_TABLE(i2c, yas5xx_id); @@ -1091,6 +1603,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);