Received: by 2002:a05:7412:f589:b0:e2:908c:2ebd with SMTP id eh9csp116713rdb; Tue, 31 Oct 2023 02:26:21 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHQeH3ZeZHvZlqeHcoHULBHyrfnPxD/bPfRNCRwd5iWNeuHp++E0er3Nu6VHNE3NPmUqgWc X-Received: by 2002:a05:6358:6f12:b0:168:e73f:c9c2 with SMTP id r18-20020a0563586f1200b00168e73fc9c2mr15134694rwn.8.1698744381020; Tue, 31 Oct 2023 02:26:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698744380; cv=none; d=google.com; s=arc-20160816; b=pSpMfpkxCQ2oOkDyj+9+9hM7l8HHKVfdqkt4gb77OVkVQUCcf02tkLirJ6jlP+rHcr QgI+oEZlAjI0ObRY82hnUQSwLMhCT/z+ZscaXF28yHVhQRP6oskmzhisEjd8oHLo6SVZ MJ/24Bmx78FdOPkpnoxmJSHsjLfPP3OJMu8yqfJvwz6Q6ueHsbHgdFL20GDlHFPGz7+s 46OIpHXEFAi5qlahOGplWSGVzQRhb/x06CmPmxoAra5lcVz+3bvCuKN2A93oZVjMw1ng XeXR0D179ulXtpndYmFR5Ev1/hRcxfyfS8rTM71P9quAXtGrWb2Bnpuvt+w/Ljb/hhpk IGPA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id; bh=w70XkKnJ19OZQ8DAQk++lIXKr2zvgJX2U7eh5OnJytQ=; fh=HFmLi+KSpcT8OCJsffhk+kCuBOqshcbyp+2MdxkYX7I=; b=ImW0dY23fNMIeyh3vT7LmM6uoMLz7qyiIKRU28uNyTAiwaihVW3+Anm4ks88D1svkB q+XbCpUExfqE4VfeAuB1BaFaXIXbsVaCVVFuf/jCAIqAS+p8cPbWV3MC9ee3WF0tLGfv mu3xFkX35zsbXvnCNRngz0KmrghmN75xDWHXBG87WcboHjehrWlD9BVVhtOfdHF4GIQm ZubgrVQ/+bM/rqtTstceDdvuYtTSRDoOvKceo/ORFCzO4S4gCDHHvsb6NQfSNswAkDUv p+wiJRux/rKfpRxB3X1UiIRPf9N/6TI+zohvrRrFFDHt4yoF2Y6/Y5HMvuVR/rIhFwna DClw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from lipwig.vger.email (lipwig.vger.email. [23.128.96.33]) by mx.google.com with ESMTPS id z11-20020a6552cb000000b00565f01b9403si767466pgp.883.2023.10.31.02.26.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Oct 2023 02:26:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) client-ip=23.128.96.33; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id 4AC7B80B1F95; Tue, 31 Oct 2023 02:26:14 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343865AbjJaJZn (ORCPT + 99 others); Tue, 31 Oct 2023 05:25:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48336 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343853AbjJaJZl (ORCPT ); Tue, 31 Oct 2023 05:25:41 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 0E81EB7; Tue, 31 Oct 2023 02:25:30 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id DBDF3C15; Tue, 31 Oct 2023 02:26:11 -0700 (PDT) Received: from [10.57.4.28] (unknown [10.57.4.28]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C053E3F67D; Tue, 31 Oct 2023 02:25:27 -0700 (PDT) Message-ID: <2c4b6c1b-b9e7-42b2-8f7b-446ebe9d15ac@arm.com> Date: Tue, 31 Oct 2023 09:26:19 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v4 8/8] thermal: exynos: use set_trips Content-Language: en-US To: Mateusz Majewski Cc: Bartlomiej Zolnierkiewicz , linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, Krzysztof Kozlowski , "Rafael J. Wysocki" , Daniel Lezcano , linux-kernel@vger.kernel.org, Amit Kucheria , Zhang Rui , Alim Akhtar , Liam Girdwood , Mark Brown , Marek Szyprowski , linux-pm@vger.kernel.org References: <20231025133027.524152-1-m.majewski2@samsung.com> <20231025133027.524152-9-m.majewski2@samsung.com> From: Lukasz Luba In-Reply-To: <20231025133027.524152-9-m.majewski2@samsung.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Tue, 31 Oct 2023 02:26:14 -0700 (PDT) On 10/25/23 14:30, Mateusz Majewski wrote: > Currently, each trip point defined in the device tree corresponds to a > single hardware interrupt. This commit instead switches to using two > hardware interrupts, whose values are set dynamically using the > set_trips callback. Additionally, the critical temperature threshold is > handled specifically. > [snip] > > -static void exynos4210_tmu_set_trip_temp(struct exynos_tmu_data *data, > - int trip_id, u8 temp) > +static void exynos_tmu_update_bit(struct exynos_tmu_data *data, int reg_off, > + int bit_off, bool enable) > { > - temp = temp_to_code(data, temp); > - writeb(temp, data->base + EXYNOS4210_TMU_REG_TRIG_LEVEL0 + trip_id * 4); > + u32 interrupt_en; > + > + interrupt_en = readl(data->base + reg_off); > + if (enable) > + interrupt_en |= 1 << bit_off; > + else > + interrupt_en &= ~(1 << bit_off); Why not to use dedicated stuff for this? val |= BIT(x) val &= ~BIT(x) You can find plenty of example in the kernel > + writel(interrupt_en, data->base + reg_off); > } > [snip] > -static void exynos4412_tmu_set_trip_temp(struct exynos_tmu_data *data, > - int trip, u8 temp) > -{ > - u32 th, con; > - > - th = readl(data->base + EXYNOS_THD_TEMP_RISE); > - th &= ~(0xff << 8 * trip); > - th |= temp_to_code(data, temp) << 8 * trip; > - writel(th, data->base + EXYNOS_THD_TEMP_RISE); > - > - if (trip == 3) { > - con = readl(data->base + EXYNOS_TMU_REG_CONTROL); > - con |= (1 << EXYNOS_TMU_THERM_TRIP_EN_SHIFT); > - writel(con, data->base + EXYNOS_TMU_REG_CONTROL); > - } > -} > - > -static void exynos4412_tmu_set_trip_hyst(struct exynos_tmu_data *data, > - int trip, u8 temp, u8 hyst) > +static void exynos4412_tmu_set_low_temp(struct exynos_tmu_data *data, u8 temp) > { > u32 th; > > th = readl(data->base + EXYNOS_THD_TEMP_FALL); > - th &= ~(0xff << 8 * trip); > - if (hyst) > - th |= temp_to_code(data, temp - hyst) << 8 * trip; > + th &= ~(0xff << 0); > + th |= temp_to_code(data, temp) << 0; This 2-line pattern repeats a few times. It looks like a nice cadidate for an inline function which can abstract that. Something like: val = update_temp_value(data, temp, threshold, LOW_TEMP_SHIFT) Assisted with the macros {LOW|HIGH|CRIT}_TEMP_SHIFT, the code would look less convoluted IMO. (The old code with the multiplication for the shift value wasn't cleaner nor faster). > writel(th, data->base + EXYNOS_THD_TEMP_FALL); > + > + exynos_tmu_update_bit(data, EXYNOS_TMU_REG_INTEN, > + EXYNOS_TMU_INTEN_FALL0_SHIFT, true); > +} [snip] > -static void exynos7_tmu_set_trip_temp(struct exynos_tmu_data *data, > - int trip, u8 temp) > +static void exynos7_tmu_update_temp(struct exynos_tmu_data *data, u8 temp, > + int idx, bool rise) > { > unsigned int reg_off, bit_off; > u32 th; > + void __iomem *reg; > > - reg_off = ((7 - trip) / 2) * 4; > - bit_off = ((8 - trip) % 2); > + reg_off = ((7 - idx) / 2) * 4; Why can't we just have a set of defined register macros and pick one in some small function? A lot of operations here, also some assumption. > + bit_off = ((8 - idx) % 2); So this can only be 0 or 1 and than it's used for the shift multiplication. Also I don't know the history of older code and if it was missed after some cleaning, but 'idx % 2' gives equal values but w/o subtraction. BTW, the code assumes the 'idx' values are under control somewhere else. Is that because the DT make sure in the schema that the range cannot be too big? What are the possible values for 'idx'? > > - th = readl(data->base + EXYNOS7_THD_TEMP_RISE7_6 + reg_off); > + reg = data->base + > + (rise ? EXYNOS7_THD_TEMP_RISE7_6 : EXYNOS7_THD_TEMP_FALL7_6) + > + reg_off; > + th = readl(reg); > th &= ~(EXYNOS7_TMU_TEMP_MASK << (16 * bit_off)); > th |= temp_to_code(data, temp) << (16 * bit_off); Can you simplify and abstract those bit_off usage and use some macros and less math operations? > - writel(th, data->base + EXYNOS7_THD_TEMP_RISE7_6 + reg_off); > + writel(th, reg); > + > + exynos_tmu_update_bit(data, EXYNOS5433_TMU_REG_INTEN, > + (rise ? EXYNOS7_TMU_INTEN_RISE0_SHIFT : > + EXYNOS_TMU_INTEN_FALL0_SHIFT) + > + idx, > + true); > } [snip] > > - if (on) { > - for (i = 0; i < data->ntrip; i++) { > - if (thermal_zone_get_trip(tz, i, &trip)) > - continue; > - > - interrupt_en |= > - (1 << (EXYNOS_TMU_INTEN_RISE0_SHIFT + i * 4)); > - } > - > - if (data->soc != SOC_ARCH_EXYNOS4210) > - interrupt_en |= > - interrupt_en << EXYNOS_TMU_INTEN_FALL0_SHIFT; > - > + if (on) > con |= (1 << EXYNOS_TMU_CORE_EN_SHIFT); > - } else { > + else > con &= ~(1 << EXYNOS_TMU_CORE_EN_SHIFT); Please also consider the BIT() helper here and above... > - } > > - writel(interrupt_en, data->base + EXYNOS_TMU_REG_INTEN); > writel(con, data->base + EXYNOS_TMU_REG_CONTROL); > } > > static void exynos5433_tmu_control(struct platform_device *pdev, bool on) > { > struct exynos_tmu_data *data = platform_get_drvdata(pdev); > - struct thermal_zone_device *tz = data->tzd; > - struct thermal_trip trip; > - unsigned int con, interrupt_en = 0, pd_det_en, i; > + unsigned int con, pd_det_en; > > con = get_con_reg(data, readl(data->base + EXYNOS_TMU_REG_CONTROL)); > > - if (on) { > - for (i = 0; i < data->ntrip; i++) { > - if (thermal_zone_get_trip(tz, i, &trip)) > - continue; > - > - interrupt_en |= > - (1 << (EXYNOS7_TMU_INTEN_RISE0_SHIFT + i)); > - } > - > - interrupt_en |= > - interrupt_en << EXYNOS_TMU_INTEN_FALL0_SHIFT; > - > + if (on) > con |= (1 << EXYNOS_TMU_CORE_EN_SHIFT); > - } else > + else > con &= ~(1 << EXYNOS_TMU_CORE_EN_SHIFT); ... and here. Basically in all places where it's possible. Regards, Lukasz