From patchwork Sun May 3 14:19:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 1281974 X-Patchwork-Delegate: sbabic@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.a=rsa-sha256 header.s=selector2 header.b=gwnC0l+S; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49FSH95Tcdz9sRY for ; Sun, 3 May 2020 23:57:41 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 7549181EE0; Sun, 3 May 2020 15:57:21 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="gwnC0l+S"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 6C23681EBA; Sun, 3 May 2020 15:57:16 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FORGED_SPF_HELO,MSGID_FROM_MTA_HEADER, SPF_HELO_PASS,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04on0631.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe0c::631]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 3901881EBA for ; Sun, 3 May 2020 15:57:10 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=peng.fan@nxp.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GbQrjMm2JH1UbeuhoOcp9MBOO3uf8yDA1MFrOBFRmpOGzy7vqBbG98F6dyfWSVVc9Zcai6IkbE6Cx6PQEmnlxlaTfviIPiAl1D9kFWcSgtVDfooDF6fmrKMUrB5ibFgtx4DoKh9zZMLVASo0i88ZrfLBzLzybaKPkaEfXKRbeS3pPMD3VbIH+FBtNs0M3bLMRpD/mKeQW3QG6zuAzOPSTBfeJS6uyThgBrI2NHBmoLhZAm1z5jqpvZWpKUXokaNwakzfKB7kaRaS10z3l4C74UnsLSIaKWR3fR0f/HVLZzYLfsZAPQAlXFaCCfVwfv1gPGK7FfR3dLYEdBOWVU7xyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=IrI7K/Ze0ADhR2slCF3Xhj9tRNxY1NxmFWYE08pToh4=; b=Wun3yO1E5Aqjijuu5dpYQTI4S3REgA4egcghfMMSm+7ACUt7dp9VP33fSjSsUl5tTIRrJuuR3CyjjqltUtAsoABcHZsrbQkAbT4nOYhTriF9FY1AHU+KmyTcUcsQOKYT2rkaQsB7a0a6GGTlD9aOEQD4x/qoFsZ701AapU1AdL54BJd956QavJEW9f8HucXky/J0J+fAvEX+CPp2Au4CBzq7+taT0Hs/AiesGe/xk2MqQZx7i1I3vqn4aJLu5tJVzlb9RTvatdJX5N/jhizEFfVFu/D/AJyjpdkEqyBAPBzRm/wv4pjZ12gACWWH8HyzgNi09U4KfU1NGxPypn+I+Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=IrI7K/Ze0ADhR2slCF3Xhj9tRNxY1NxmFWYE08pToh4=; b=gwnC0l+StqkB0B3rQ/G4O8zYudAkZsCyq1XzMuXBWP7BDXRYg+d/yXoTtj5nvxUMWb0lKFBeKY23VHWk40LOac2z/kGEkM2LGwvQ4qZWiS3rmajnCt8Bg8Yql5AKOgBHaAbCxdxOIRQWGWBVCbJQDtpcwTaR6O4vAjGYyygSTqM= Authentication-Results: denx.de; dkim=none (message not signed) header.d=none;denx.de; dmarc=none action=none header.from=nxp.com; Received: from DB6PR0402MB2760.eurprd04.prod.outlook.com (2603:10a6:4:a1::14) by DB6PR0402MB2808.eurprd04.prod.outlook.com (2603:10a6:4:95::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2958.20; Sun, 3 May 2020 13:57:08 +0000 Received: from DB6PR0402MB2760.eurprd04.prod.outlook.com ([fe80::d17b:d767:19c3:b871]) by DB6PR0402MB2760.eurprd04.prod.outlook.com ([fe80::d17b:d767:19c3:b871%6]) with mapi id 15.20.2958.029; Sun, 3 May 2020 13:57:08 +0000 From: Peng Fan To: sbabic@denx.de, festevam@gmail.com Cc: uboot-imx@nxp.com, u-boot@lists.denx.de, Peng Fan Subject: [PATCH 03/13] thermal: imx_tmu: Add support for thermal sensor on iMX8MM Date: Sun, 3 May 2020 22:19:47 +0800 Message-Id: <20200503141957.14635-4-peng.fan@nxp.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20200503141957.14635-1-peng.fan@nxp.com> References: <20200503141957.14635-1-peng.fan@nxp.com> X-ClientProxiedBy: SG2PR01CA0107.apcprd01.prod.exchangelabs.com (2603:1096:3:15::33) To DB6PR0402MB2760.eurprd04.prod.outlook.com (2603:10a6:4:a1::14) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from linux-1xn6.ap.freescale.net (119.31.174.71) by SG2PR01CA0107.apcprd01.prod.exchangelabs.com (2603:1096:3:15::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2958.19 via Frontend Transport; Sun, 3 May 2020 13:57:06 +0000 X-Mailer: git-send-email 2.16.4 X-Originating-IP: [119.31.174.71] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 6aca41ac-a0f7-4d9d-7652-08d7ef69de7d X-MS-TrafficTypeDiagnostic: DB6PR0402MB2808:|DB6PR0402MB2808: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:335; X-Forefront-PRVS: 0392679D18 X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: nhjsA+Q742q0mUQsbSNt6+dFA16WQws6RKcUdbq+s28Vs5Ko1KwB5P4EWTclBd/ggMPyTXWWXmls9M+DUTIZhCc0zLgUnNwBO4vLqt6xHc69WOYvb7lt/2Syr74tweGP1lEJaqh27sCTHiyxfgVCqpQJEaZ1iUNZbH2JAGDY9AQyequcs7XIjOfbHIkqcmZjsQId3+dMs06Odk3R+3acpmKAe40wg+MJXQp6pe0MaLLQblGvlPESt/orgIncYXK8TQILpljPo5L0VOp8bLr6gLtaXOQLRape0B+jOVs5sQTIi/iakjR1bEJHY0TMVupRFkH0nzWPeSwpJd9GHh+EpUXxvkwn9GNmHrBs5IcQW5Xemke48ATC0PWg2CRyR0xdJmOoQQGuykC/x2gToLa/1LEcR9gOSNwCT8wB+0H3ufH/26yUouYQMchhrxFBDfNrx8Gh/P4/POfp9Ln14tpoh3AYcz+5SL77i7BreqlP3sY4GJ4NUZ1ktYqzv6Zwutol X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DB6PR0402MB2760.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(346002)(366004)(376002)(136003)(396003)(39860400002)(956004)(2616005)(6666004)(8936002)(44832011)(8676002)(26005)(6512007)(6486002)(478600001)(66946007)(52116002)(6506007)(36756003)(2906002)(16526019)(186003)(66556008)(66476007)(316002)(5660300002)(86362001)(4326008)(1076003)(32563001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: 6YoEltcepDqsACV6VkWUAdYCHCPRCzkakTGfsHbZHBOI/sBw2nIJL2eer8f2ydnX64n+IhmBaFVZP8xBtOhUe/cM/bgWG+h58RPWFeXADrtZK4x2FMaEtiX4o8aHpUFlV2pqDc5SUOjXs0JvMsQR9HvUNB+pWz6ppB3R06XwLGPBoaExFuM0w5P0YE7Nt/H9mzAOMZD0f65g5zkhrgUbNcK68AKt5x2lxFL2Hdor2vbQ/PSyXU7BDUBuNvVL22znNe9kMIKylkNuFCPkiZLI5z4O2I/+wMzg3r2+YZDeystOhd2+5SJVhQKDZ5Kl7oIbruV/9GfPlgcQNDmQdPMGAZATeTOZtwdlj3WuXlUx1JkDUtpP9ut4jkUQAYRfCz+CuXfa7iaNIVvu3Q70eTd9UcCNK+beUTwdLTOP6o/Ntk79Z+zYxQHDQgV0DV9QkSw+NnHldLC0X9GP7COLuKlyic2D5h6a3H568lzQ9kyd3RD99fYJvSjvuGCdR1fYuUjUGNyMV2M5Oi0xOwEIddE4eMXLqto53UsFGOPhIzUckjqpC2HD3C+aIbfFbbcIyOVtNShByzyy+jqHXsLZ4iFeO9lrFbRuDV46x/eU7ZRTtb8PbSCOlSkkg/Q+4bwH5aK7l6rPIDQvyOyOHnjw7j8MK+UAQFjJjIqHwDv4rmn56tUPc8rCC9806mKdEc6/VnKbEFB+J9JYWO+zcTaeh9DcJTZRZyNaQKVq2HEZ8kVrCEw70l7/Ln5VZQn5IC3/uAVdMT4BW3ECSGW7nMkNnliROCJdfuQ4OK8Hj0nqETtsPh4= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6aca41ac-a0f7-4d9d-7652-08d7ef69de7d X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 May 2020 13:57:08.2951 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Gyn58Tvw0C6z1mk390GeBq99AzdGdoQnhJaraB4LkoJLGWegi+4MLCqHGIjBIk01jalnoOOwxQ0O8iMXuJ1whA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0402MB2808 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean The analog sensors on iMX8MM are new, used for 14LPP process. So the Temperature Sensor Monitoring Unit (TMU) has some change accordingly. We use version 2 in TMU driver to represent the new TMU, so the one driver can service for both i.MX8MQ/M. Signed-off-by: Peng Fan --- drivers/thermal/imx_tmu.c | 113 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 86 insertions(+), 27 deletions(-) diff --git a/drivers/thermal/imx_tmu.c b/drivers/thermal/imx_tmu.c index f496ce03b6..df0b35b7ba 100644 --- a/drivers/thermal/imx_tmu.c +++ b/drivers/thermal/imx_tmu.c @@ -20,6 +20,7 @@ DECLARE_GLOBAL_DATA_PTR; #define SITES_MAX 16 +#define FLAGS_VER2 0x1 #define TMR_DISABLE 0x0 #define TMR_ME 0x80000000 @@ -27,6 +28,8 @@ DECLARE_GLOBAL_DATA_PTR; #define TMTMIR_DEFAULT 0x00000002 #define TIER_DISABLE 0x0 +#define TER_EN 0x80000000 +#define TER_ADC_PD 0x40000000 /* * i.MX TMU Registers */ @@ -67,22 +70,47 @@ struct imx_tmu_regs { u32 ttr3cr; /* Temperature Range 3 Control Register */ }; +struct imx_tmu_regs_v2 { + u32 ter; /* TMU enable Register */ + u32 tsr; /* Status Register */ + u32 tier; /* Interrupt enable register */ + u32 tidr; /* Interrupt detect register */ + u32 tmhtitr; /* Monitor high temperature immediate threshold register */ + u32 tmhtatr; /* Monitor high temperature average threshold register */ + u32 tmhtactr; /* TMU monitor high temperature average critical threshold register */ + u32 tscr; /* Sensor value capture register */ + u32 tritsr; /* Report immediate temperature site register 0 */ + u32 tratsr; /* Report average temperature site register 0 */ + u32 tasr; /* Amplifier setting register */ + u32 ttmc; /* Test MUX control */ + u32 tcaliv; +}; + +union tmu_regs { + struct imx_tmu_regs regs_v1; + struct imx_tmu_regs_v2 regs_v2; +}; + struct imx_tmu_plat { int critical; int alert; int polling_delay; int id; bool zone_node; - struct imx_tmu_regs *regs; + union tmu_regs *regs; }; static int read_temperature(struct udevice *dev, int *temp) { struct imx_tmu_plat *pdata = dev_get_platdata(dev); + ulong drv_data = dev_get_driver_data(dev); u32 val; do { - val = readl(&pdata->regs->site[pdata->id].tritsr); + if (drv_data & FLAGS_VER2) { + val = readl(&pdata->regs->regs_v2.tritsr); + else + val = readl(&pdata->regs->regs_v1.site[pdata->id].tritsr); } while (!(val & 0x80000000)); *temp = (val & 0xff) * 1000; @@ -124,9 +152,13 @@ static int imx_tmu_calibration(struct udevice *dev) u32 range[4]; const fdt32_t *calibration; struct imx_tmu_plat *pdata = dev_get_platdata(dev); + ulong drv_data = dev_get_driver_data(dev); debug("%s\n", __func__); + if (drv_data & FLAGS_VER2) + return 0; + ret = dev_read_u32_array(dev, "fsl,tmu-range", range, 4); if (ret) { printf("TMU: missing calibration range, ret = %d.\n", ret); @@ -134,10 +166,10 @@ static int imx_tmu_calibration(struct udevice *dev) } /* Init temperature range registers */ - writel(range[0], &pdata->regs->ttr0cr); - writel(range[1], &pdata->regs->ttr1cr); - writel(range[2], &pdata->regs->ttr2cr); - writel(range[3], &pdata->regs->ttr3cr); + writel(range[0], &pdata->regs->regs_v1.ttr0cr); + writel(range[1], &pdata->regs->regs_v1.ttr1cr); + writel(range[2], &pdata->regs->regs_v1.ttr2cr); + writel(range[3], &pdata->regs->regs_v1.ttr3cr); calibration = dev_read_prop(dev, "fsl,tmu-calibration", &len); if (!calibration || len % 8) { @@ -147,31 +179,43 @@ static int imx_tmu_calibration(struct udevice *dev) for (i = 0; i < len; i += 8, calibration += 2) { val = fdt32_to_cpu(*calibration); - writel(val, &pdata->regs->ttcfgr); + writel(val, &pdata->regs->regs_v1.ttcfgr); val = fdt32_to_cpu(*(calibration + 1)); - writel(val, &pdata->regs->tscfgr); + writel(val, &pdata->regs->regs_v1.tscfgr); } return 0; } -static void imx_tmu_init(struct imx_tmu_plat *pdata) +static void imx_tmu_init(struct udevice *dev) { + struct imx_tmu_plat *pdata = dev_get_platdata(dev); + ulong drv_data = dev_get_driver_data(dev); + debug("%s\n", __func__); - /* Disable monitoring */ - writel(TMR_DISABLE, &pdata->regs->tmr); + if (drv_data & FLAGS_VER2) { + /* Disable monitoring */ + writel(0x0, &pdata->regs->regs_v2.ter); + + /* Disable interrupt, using polling instead */ + writel(0x0, &pdata->regs->regs_v2.tier); + } else { + /* Disable monitoring */ + writel(TMR_DISABLE, &pdata->regs->regs_v1.tmr); - /* Disable interrupt, using polling instead */ - writel(TIER_DISABLE, &pdata->regs->tier); + /* Disable interrupt, using polling instead */ + writel(TIER_DISABLE, &pdata->regs->regs_v1.tier); - /* Set update_interval */ - writel(TMTMIR_DEFAULT, &pdata->regs->tmtmir); + /* Set update_interval */ + writel(TMTMIR_DEFAULT, &pdata->regs->regs_v1.tmtmir); + } } static int imx_tmu_enable_msite(struct udevice *dev) { struct imx_tmu_plat *pdata = dev_get_platdata(dev); + ulong drv_data = dev_get_driver_data(dev); u32 reg; debug("%s\n", __func__); @@ -179,18 +223,32 @@ static int imx_tmu_enable_msite(struct udevice *dev) if (!pdata->regs) return -EIO; - /* Clear the ME before setting MSITE and ALPF*/ - reg = readl(&pdata->regs->tmr); - reg &= ~TMR_ME; - writel(reg, &pdata->regs->tmr); + if (drv_data & FLAGS_VER2) { + reg = readl(&pdata->regs->regs_v2.ter); + reg &= ~TER_EN; + writel(reg, &pdata->regs->regs_v2.ter); - reg |= 1 << (15 - pdata->id); - reg |= TMR_ALPF; - writel(reg, &pdata->regs->tmr); + reg &= ~TER_ALPF; + reg |= 0x1; + writel(reg, &pdata->regs->regs_v2.ter); - /* Enable ME */ - reg |= TMR_ME; - writel(reg, &pdata->regs->tmr); + /* Enable monitor */ + reg |= TER_EN; + writel(reg, &pdata->regs->regs_v2.ter); + } else { + /* Clear the ME before setting MSITE and ALPF*/ + reg = readl(&pdata->regs->regs_v1.tmr); + reg &= ~TMR_ME; + writel(reg, &pdata->regs->regs_v1.tmr); + + reg |= 1 << (15 - pdata->id); + reg |= TMR_ALPF; + writel(reg, &pdata->regs->regs_v1.tmr); + + /* Enable ME */ + reg |= TMR_ME; + writel(reg, &pdata->regs->regs_v1.tmr); + } return 0; } @@ -237,7 +295,7 @@ static int imx_tmu_parse_fdt(struct udevice *dev) debug("%s dev name %s\n", __func__, dev->name); if (pdata->zone_node) { - pdata->regs = (struct imx_tmu_regs *)dev_read_addr_ptr(dev); + pdata->regs = (union tmu_regs *)dev_read_addr_ptr(dev); if (!pdata->regs) return -EINVAL; @@ -299,7 +357,7 @@ static int imx_tmu_probe(struct udevice *dev) } if (pdata->zone_node) { - imx_tmu_init(pdata); + imx_tmu_init(dev); imx_tmu_calibration(dev); } else { imx_tmu_enable_msite(dev); @@ -310,6 +368,7 @@ static int imx_tmu_probe(struct udevice *dev) static const struct udevice_id imx_tmu_ids[] = { { .compatible = "fsl,imx8mq-tmu", }, + { .compatible = "fsl,imx8mm-tmu", .data = FLAGS_VER2, }, { } };