From nobody Tue Feb 10 12:39:29 2026 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 6FC60C761AF for ; Thu, 16 Mar 2023 19:22:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230222AbjCPTWf (ORCPT ); Thu, 16 Mar 2023 15:22:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45198 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230164AbjCPTWd (ORCPT ); Thu, 16 Mar 2023 15:22:33 -0400 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 65F609AA10; Thu, 16 Mar 2023 12:22:11 -0700 (PDT) Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 32GDtLoE003569; Thu, 16 Mar 2023 19:22:06 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=qcppdkim1; bh=aJB7dYNSxtgdCQtWa6/q24cp7ISzXfS7RLzG+WKN1BM=; b=nXBkdhRwwlrfiubmqs229PvZjMPJrN8J58h6fcx7FvMp0OvdW1VNzJB0HQh0BhYEd6ux Mg/AFOt/QPmvH+HxmsrttMuqcwU2m9vEQ2uybZq/oLVEyJbumvoXJsR4iHrPU1hZMFWG EIrRV5UlwRmVfsSPMEn+teT4sYYa+E832h1t+dvfuFiQVDSJVjidSqyg2XKmXT6UuI6J drN6SGNMI9LWG6ZHxRDDaXPzl1biRSBsnm3vPTg4tlL7i9EurE2kgDMWb0Sy5SoURpAZ 2l1q4QnK6SVLqzE0n65ABxnC/YVllBXySYC825uFTYM52HnNHsca0dpTltgObbrbRQZv PQ== Received: from nalasppmta05.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3pbpxju00y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 16 Mar 2023 19:22:06 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA05.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 32GJM6mJ022444 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 16 Mar 2023 19:22:06 GMT Received: from hu-amelende-lv.qualcomm.com (10.49.16.6) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Thu, 16 Mar 2023 12:22:05 -0700 From: Anjelique Melendez To: , , , , CC: , , , , "Anjelique Melendez" Subject: [PATCH 1/3] dt-bindings: leds-qcom-lpg: Add qcom,pmk8550-pwm compatible string Date: Thu, 16 Mar 2023 12:21:32 -0700 Message-ID: <20230316192134.26436-2-quic_amelende@quicinc.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230316192134.26436-1-quic_amelende@quicinc.com> References: <20230316192134.26436-1-quic_amelende@quicinc.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.49.16.6] X-ClientProxiedBy: nalasex01a.na.qualcomm.com (10.47.209.196) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: HL7f_Zya9oS1OrwjMz92-JyW4Vyi-r1- X-Proofpoint-ORIG-GUID: HL7f_Zya9oS1OrwjMz92-JyW4Vyi-r1- X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-03-16_12,2023-03-16_02,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 priorityscore=1501 phishscore=0 malwarescore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 mlxscore=0 bulkscore=0 clxscore=1015 mlxlogscore=661 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303150002 definitions=main-2303160146 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add qcom,pmk8550-pwm compatible string for the Qualcomm Technologies, Inc. PMK8550 PMIC which has two high resolution PWM channels. Signed-off-by: Anjelique Melendez Acked-by: Krzysztof Kozlowski --- Documentation/devicetree/bindings/leds/leds-qcom-lpg.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/leds/leds-qcom-lpg.yaml b/Do= cumentation/devicetree/bindings/leds/leds-qcom-lpg.yaml index 1df837798249..6295c91f43e8 100644 --- a/Documentation/devicetree/bindings/leds/leds-qcom-lpg.yaml +++ b/Documentation/devicetree/bindings/leds/leds-qcom-lpg.yaml @@ -27,6 +27,7 @@ properties: - qcom,pmc8180c-lpg - qcom,pmi8994-lpg - qcom,pmi8998-lpg + - qcom,pmk8550-pwm =20 "#pwm-cells": const: 2 --=20 2.39.0 From nobody Tue Feb 10 12:39:29 2026 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 96147C6FD1F for ; Thu, 16 Mar 2023 19:22:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230270AbjCPTWo (ORCPT ); Thu, 16 Mar 2023 15:22:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45214 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230150AbjCPTWe (ORCPT ); Thu, 16 Mar 2023 15:22:34 -0400 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 00E2F6700A; Thu, 16 Mar 2023 12:22:14 -0700 (PDT) Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 32GFP6i3032319; Thu, 16 Mar 2023 19:22:08 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=qcppdkim1; bh=RRxY15SlGGOlnRMN/BOYobVD1oYCTe7VuJE4qAyxm+0=; b=WM3Vh/FCe3gNXLUZLDS7PdiEPZoVRsj73fSH24Q+1BYW3CcKPNR+GzKxys1w2qwzcsEq gStzeGmmP/0wafrUoZmEah4Hx7AKtRne4ITUKJcAc+Wn9v6/kX+4odzaARuJ4NIfF++2 eUONfGvMkgdUROpJPo4qe9CBuqAN+PAxEHbv6ig38ZXJTD102ybhU68LwtdIvxEmlrky 1EuUjalPhNGJGNi2/3q+AW8hhiOGAjRA8quhfm/saxhjiVYzsZs8Q+px3KJdEBmix+30 pJ/A7H/Q4UZ7uAbqwx6nvkmYUXQyp/08pPceEMd1A3OIPVTfXjCfMAnC0T1Bs8k836PR fg== Received: from nalasppmta02.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3pc5r18kxn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 16 Mar 2023 19:22:08 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA02.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 32GJM7Zx019577 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 16 Mar 2023 19:22:07 GMT Received: from hu-amelende-lv.qualcomm.com (10.49.16.6) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Thu, 16 Mar 2023 12:22:07 -0700 From: Anjelique Melendez To: , , , , CC: , , , , "Anjelique Melendez" Subject: [PATCH 2/3] leds: rgb: leds-qcom-lpg: Add support for high resolution PWM Date: Thu, 16 Mar 2023 12:21:33 -0700 Message-ID: <20230316192134.26436-3-quic_amelende@quicinc.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230316192134.26436-1-quic_amelende@quicinc.com> References: <20230316192134.26436-1-quic_amelende@quicinc.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.49.16.6] X-ClientProxiedBy: nalasex01a.na.qualcomm.com (10.47.209.196) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: vuLxp_f648UWwSLtxL7EYXJ7oU34PeKJ X-Proofpoint-ORIG-GUID: vuLxp_f648UWwSLtxL7EYXJ7oU34PeKJ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-03-16_12,2023-03-16_02,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 bulkscore=0 adultscore=0 phishscore=0 suspectscore=0 mlxscore=0 clxscore=1015 mlxlogscore=998 lowpriorityscore=0 spamscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303150002 definitions=main-2303160146 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Certain PMICs like PMK8550 have a high resolution PWM module which can support from 8-bit to 15-bit PWM. Add support for it. Signed-off-by: Anjelique Melendez Acked-by: Pavel Machek --- drivers/leds/rgb/leds-qcom-lpg.c | 142 ++++++++++++++++++++++--------- 1 file changed, 100 insertions(+), 42 deletions(-) diff --git a/drivers/leds/rgb/leds-qcom-lpg.c b/drivers/leds/rgb/leds-qcom-= lpg.c index 67f48f222109..534ca4c0dea4 100644 --- a/drivers/leds/rgb/leds-qcom-lpg.c +++ b/drivers/leds/rgb/leds-qcom-lpg.c @@ -2,6 +2,7 @@ /* * Copyright (c) 2017-2022 Linaro Ltd * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. + * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserve= d. */ #include #include @@ -17,10 +18,13 @@ #define LPG_SUBTYPE_REG 0x05 #define LPG_SUBTYPE_LPG 0x2 #define LPG_SUBTYPE_PWM 0xb +#define LPG_SUBTYPE_HI_RES_PWM 0xc #define LPG_SUBTYPE_LPG_LITE 0x11 #define LPG_PATTERN_CONFIG_REG 0x40 #define LPG_SIZE_CLK_REG 0x41 #define PWM_CLK_SELECT_MASK GENMASK(1, 0) +#define PWM_CLK_SELECT_HI_RES_MASK GENMASK(2, 0) +#define PWM_SIZE_HI_RES_MASK GENMASK(6, 4) #define LPG_PREDIV_CLK_REG 0x42 #define PWM_FREQ_PRE_DIV_MASK GENMASK(6, 5) #define PWM_FREQ_EXP_MASK GENMASK(2, 0) @@ -43,8 +47,10 @@ #define LPG_LUT_REG(x) (0x40 + (x) * 2) #define RAMP_CONTROL_REG 0xc8 =20 -#define LPG_RESOLUTION 512 +#define LPG_RESOLUTION BIT(9) +#define LPG_RESOLUTION_HI_RES BIT(15) #define LPG_MAX_M 7 +#define LPG_MAX_PREDIV 6 =20 struct lpg_channel; struct lpg_data; @@ -106,6 +112,7 @@ struct lpg { * @clk_sel: reference clock frequency selector * @pre_div_sel: divider selector of the reference clock * @pre_div_exp: exponential divider of the reference clock + * @pwm_size_sel: pwm size selector * @ramp_enabled: duty cycle is driven by iterating over lookup table * @ramp_ping_pong: reverse through pattern, rather than wrapping to start * @ramp_oneshot: perform only a single pass over the pattern @@ -138,6 +145,7 @@ struct lpg_channel { unsigned int clk_sel; unsigned int pre_div_sel; unsigned int pre_div_exp; + unsigned int pwm_size_sel; =20 bool ramp_enabled; bool ramp_ping_pong; @@ -253,17 +261,24 @@ static int lpg_lut_sync(struct lpg *lpg, unsigned int= mask) } =20 static const unsigned int lpg_clk_rates[] =3D {0, 1024, 32768, 19200000}; +static const unsigned int lpg_clk_rates_hi_res[] =3D {0, 1024, 32768, 1920= 0000, 76800000}; static const unsigned int lpg_pre_divs[] =3D {1, 3, 5, 6}; +static const unsigned int lpg_pwm_size[] =3D {9}; +static const unsigned int lpg_pwm_size_hi_res[] =3D {8, 9, 10, 11, 12, 13= , 14, 15}; =20 static int lpg_calc_freq(struct lpg_channel *chan, uint64_t period) { - unsigned int clk_sel, best_clk =3D 0; + unsigned int i, pwm_size_len, best_pwm_size_sel =3D 0; + const unsigned int *clk_rate_arr, *pwm_size_arr; + unsigned int clk_sel, clk_len, best_clk =3D 0; unsigned int div, best_div =3D 0; unsigned int m, best_m =3D 0; + unsigned int resolution; unsigned int error; unsigned int best_err =3D UINT_MAX; u64 best_period =3D 0; u64 max_period; + u64 max_res; =20 /* * The PWM period is determined by: @@ -272,73 +287,104 @@ static int lpg_calc_freq(struct lpg_channel *chan, u= int64_t period) * period =3D -------------------------- * refclk * - * With resolution fixed at 2^9 bits, pre_div =3D {1, 3, 5, 6} and + * Resolution =3D 2^9 bits for PWM or + * 2^{8, 9, 10, 11, 12, 13, 14, 15} bits for high resolution= PWM + * pre_div =3D {1, 3, 5, 6} and * M =3D [0..7]. * - * This allows for periods between 27uS and 384s, as the PWM framework - * wants a period of equal or lower length than requested, reject - * anything below 27uS. + * This allows for periods between 27uS and 384s for PWM channels and per= iods between + * 3uS and 24576s for high resolution PWMs. + * The PWM framework wants a period of equal or lower length than request= ed, + * reject anything below minimum period. */ - if (period <=3D (u64)NSEC_PER_SEC * LPG_RESOLUTION / 19200000) + + if (chan->subtype =3D=3D LPG_SUBTYPE_HI_RES_PWM) { + clk_rate_arr =3D lpg_clk_rates_hi_res; + clk_len =3D ARRAY_SIZE(lpg_clk_rates_hi_res); + pwm_size_arr =3D lpg_pwm_size_hi_res; + pwm_size_len =3D ARRAY_SIZE(lpg_pwm_size_hi_res); + max_res =3D LPG_RESOLUTION_HI_RES; + } else { + clk_rate_arr =3D lpg_clk_rates; + clk_len =3D ARRAY_SIZE(lpg_clk_rates); + pwm_size_arr =3D lpg_pwm_size; + pwm_size_len =3D ARRAY_SIZE(lpg_pwm_size); + max_res =3D LPG_RESOLUTION; + } + + if (period <=3D (u64)NSEC_PER_SEC * (1 << pwm_size_arr[0]) / clk_rate_arr= [clk_len - 1]) return -EINVAL; =20 /* Limit period to largest possible value, to avoid overflows */ - max_period =3D (u64)NSEC_PER_SEC * LPG_RESOLUTION * 6 * (1 << LPG_MAX_M) = / 1024; + max_period =3D (u64)NSEC_PER_SEC * max_res * LPG_MAX_PREDIV * (1 << LPG_M= AX_M) / 1024; if (period > max_period) period =3D max_period; =20 /* - * Search for the pre_div, refclk and M by solving the rewritten formula - * for each refclk and pre_div value: + * Search for the pre_div, refclk, resolution and M by solving the rewrit= ten formula + * for each refclk, resolution and pre_div value: * * period * refclk * M =3D log2 ------------------------------------- * NSEC_PER_SEC * pre_div * resolution */ - for (clk_sel =3D 1; clk_sel < ARRAY_SIZE(lpg_clk_rates); clk_sel++) { - u64 numerator =3D period * lpg_clk_rates[clk_sel]; - - for (div =3D 0; div < ARRAY_SIZE(lpg_pre_divs); div++) { - u64 denominator =3D (u64)NSEC_PER_SEC * lpg_pre_divs[div] * LPG_RESOLUT= ION; - u64 actual; - u64 ratio; - - if (numerator < denominator) - continue; - - ratio =3D div64_u64(numerator, denominator); - m =3D ilog2(ratio); - if (m > LPG_MAX_M) - m =3D LPG_MAX_M; - - actual =3D DIV_ROUND_UP_ULL(denominator * (1 << m), lpg_clk_rates[clk_s= el]); - - error =3D period - actual; - if (error < best_err) { - best_err =3D error; =20 - best_div =3D div; - best_m =3D m; - best_clk =3D clk_sel; - best_period =3D actual; + for (i =3D 0; i < pwm_size_len; i++) { + resolution =3D 1 << pwm_size_arr[i]; + for (clk_sel =3D 1; clk_sel < clk_len; clk_sel++) { + u64 numerator =3D period * clk_rate_arr[clk_sel]; + + for (div =3D 0; div < ARRAY_SIZE(lpg_pre_divs); div++) { + u64 denominator =3D (u64)NSEC_PER_SEC * lpg_pre_divs[div] * + resolution; + u64 actual; + u64 ratio; + + if (numerator < denominator) + continue; + + ratio =3D div64_u64(numerator, denominator); + m =3D ilog2(ratio); + if (m > LPG_MAX_M) + m =3D LPG_MAX_M; + + actual =3D DIV_ROUND_UP_ULL(denominator * (1 << m), + clk_rate_arr[clk_sel]); + error =3D period - actual; + if (error < best_err) { + best_err =3D error; + best_div =3D div; + best_m =3D m; + best_clk =3D clk_sel; + best_period =3D actual; + best_pwm_size_sel =3D i; + } } } } - chan->clk_sel =3D best_clk; chan->pre_div_sel =3D best_div; chan->pre_div_exp =3D best_m; chan->period =3D best_period; - + chan->pwm_size_sel =3D best_pwm_size_sel; return 0; } =20 static void lpg_calc_duty(struct lpg_channel *chan, uint64_t duty) { - unsigned int max =3D LPG_RESOLUTION - 1; + unsigned int max; unsigned int val; + unsigned int clk_rate; + + if (chan->subtype =3D=3D LPG_SUBTYPE_HI_RES_PWM) { + max =3D LPG_RESOLUTION_HI_RES - 1; + clk_rate =3D lpg_clk_rates_hi_res[chan->clk_sel]; + } else { + max =3D LPG_RESOLUTION - 1; + clk_rate =3D lpg_clk_rates[chan->clk_sel]; + } =20 - val =3D div64_u64(duty * lpg_clk_rates[chan->clk_sel], + val =3D div64_u64(duty * clk_rate, (u64)NSEC_PER_SEC * lpg_pre_divs[chan->pre_div_sel] * (1 << chan->pre_d= iv_exp)); =20 chan->pwm_value =3D min(val, max); @@ -354,7 +400,7 @@ static void lpg_apply_freq(struct lpg_channel *chan) =20 val =3D chan->clk_sel; =20 - /* Specify 9bit resolution, based on the subtype of the channel */ + /* Specify resolution, based on the subtype of the channel */ switch (chan->subtype) { case LPG_SUBTYPE_LPG: val |=3D GENMASK(5, 4); @@ -362,6 +408,9 @@ static void lpg_apply_freq(struct lpg_channel *chan) case LPG_SUBTYPE_PWM: val |=3D BIT(2); break; + case LPG_SUBTYPE_HI_RES_PWM: + val |=3D FIELD_PREP(PWM_SIZE_HI_RES_MASK, chan->pwm_size_sel); + break; case LPG_SUBTYPE_LPG_LITE: default: val |=3D BIT(4); @@ -977,6 +1026,7 @@ static int lpg_pwm_get_state(struct pwm_chip *chip, st= ruct pwm_device *pwm, { struct lpg *lpg =3D container_of(chip, struct lpg, pwm); struct lpg_channel *chan =3D &lpg->channels[pwm->hwpwm]; + unsigned int pwm_size; unsigned int pre_div; unsigned int refclk; unsigned int val; @@ -988,7 +1038,14 @@ static int lpg_pwm_get_state(struct pwm_chip *chip, s= truct pwm_device *pwm, if (ret) return ret; =20 - refclk =3D lpg_clk_rates[val & PWM_CLK_SELECT_MASK]; + if (chan->subtype =3D=3D LPG_SUBTYPE_HI_RES_PWM) { + refclk =3D lpg_clk_rates_hi_res[FIELD_GET(PWM_CLK_SELECT_HI_RES_MASK, va= l)]; + pwm_size =3D lpg_pwm_size_hi_res[FIELD_GET(PWM_SIZE_HI_RES_MASK, val)]; + } else { + refclk =3D lpg_clk_rates[FIELD_GET(PWM_CLK_SELECT_MASK, val)]; + pwm_size =3D 9; + } + if (refclk) { ret =3D regmap_read(lpg->map, chan->base + LPG_PREDIV_CLK_REG, &val); if (ret) @@ -1001,7 +1058,8 @@ static int lpg_pwm_get_state(struct pwm_chip *chip, s= truct pwm_device *pwm, if (ret) return ret; =20 - state->period =3D DIV_ROUND_UP_ULL((u64)NSEC_PER_SEC * LPG_RESOLUTION * = pre_div * (1 << m), refclk); + state->period =3D DIV_ROUND_UP_ULL((u64)NSEC_PER_SEC * (1 << pwm_size) * + pre_div * (1 << m), refclk); state->duty_cycle =3D DIV_ROUND_UP_ULL((u64)NSEC_PER_SEC * pwm_value * p= re_div * (1 << m), refclk); } else { state->period =3D 0; --=20 2.39.0 From nobody Tue Feb 10 12:39:29 2026 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 813BDC7618E for ; Thu, 16 Mar 2023 19:22:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230247AbjCPTWl (ORCPT ); Thu, 16 Mar 2023 15:22:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45210 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229704AbjCPTWd (ORCPT ); Thu, 16 Mar 2023 15:22:33 -0400 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A230E4742D; Thu, 16 Mar 2023 12:22:14 -0700 (PDT) Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 32G2QNNa025819; Thu, 16 Mar 2023 19:22:10 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=qcppdkim1; bh=uC3HXNI4QBm0EiaHcUPhip9SORNZC6pNzDdy00a3LE0=; b=UKP99nSHJ8GvRoAVzVVUsbaXJWobek9RFQVy3Z9pvJ+nfKZ1ZL31K1PXWED1VORq1LyN 9Z1XFYTCZogcDO0lsgD3CZnKlFWDUZu8q11GMTmeEYE8B6izQ8iUGaxAu75B9WMK0Nxy mMDU12pCjWNbd1dGUOTM58qQ3lD4GKACag3N3I7CccP476bLkyRjouRmTr6UB8b3Q/p2 tiAHrNvrF3LYasy+L5co4qtJ/wJAy2fhB14Kqx1CvCRqJS7XhNBU4viSlbJrf2/JO6TE sOEQtJAfYmRg93WqZScRO6KvojbDLw6DzPKf0j8AMNCwx2CbMsJBkxlIACmVz9wZ7GCz 1Q== Received: from nalasppmta05.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3pbpxju011-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 16 Mar 2023 19:22:09 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA05.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 32GJM9MM022489 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 16 Mar 2023 19:22:09 GMT Received: from hu-amelende-lv.qualcomm.com (10.49.16.6) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Thu, 16 Mar 2023 12:22:08 -0700 From: Anjelique Melendez To: , , , , CC: , , , , "Anjelique Melendez" Subject: [PATCH 3/3] leds: rgb: leds-qcom-lpg: Add support for PMK8550 PWM Date: Thu, 16 Mar 2023 12:21:34 -0700 Message-ID: <20230316192134.26436-4-quic_amelende@quicinc.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230316192134.26436-1-quic_amelende@quicinc.com> References: <20230316192134.26436-1-quic_amelende@quicinc.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.49.16.6] X-ClientProxiedBy: nalasex01a.na.qualcomm.com (10.47.209.196) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: nw948F-dMnoWmBWlqrRE8z2ae3hhqvD_ X-Proofpoint-ORIG-GUID: nw948F-dMnoWmBWlqrRE8z2ae3hhqvD_ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-03-16_12,2023-03-16_02,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 priorityscore=1501 phishscore=0 malwarescore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 mlxscore=0 bulkscore=0 clxscore=1015 mlxlogscore=883 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303150002 definitions=main-2303160146 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add support for pmk8550 compatible and lpg_data. Signed-off-by: Anjelique Melendez --- drivers/leds/rgb/leds-qcom-lpg.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/leds/rgb/leds-qcom-lpg.c b/drivers/leds/rgb/leds-qcom-= lpg.c index 534ca4c0dea4..0fe51fcb42b0 100644 --- a/drivers/leds/rgb/leds-qcom-lpg.c +++ b/drivers/leds/rgb/leds-qcom-lpg.c @@ -1487,6 +1487,14 @@ static const struct lpg_data pm8350c_pwm_data =3D { }, }; =20 +static const struct lpg_data pmk8550_pwm_data =3D { + .num_channels =3D 2, + .channels =3D (const struct lpg_channel_data[]) { + { .base =3D 0xe800 }, + { .base =3D 0xe900 }, + }, +}; + static const struct of_device_id lpg_of_table[] =3D { { .compatible =3D "qcom,pm8150b-lpg", .data =3D &pm8150b_lpg_data }, { .compatible =3D "qcom,pm8150l-lpg", .data =3D &pm8150l_lpg_data }, @@ -1497,6 +1505,7 @@ static const struct of_device_id lpg_of_table[] =3D { { .compatible =3D "qcom,pmi8994-lpg", .data =3D &pmi8994_lpg_data }, { .compatible =3D "qcom,pmi8998-lpg", .data =3D &pmi8998_lpg_data }, { .compatible =3D "qcom,pmc8180c-lpg", .data =3D &pm8150l_lpg_data }, + { .compatible =3D "qcom,pmk8550-pwm", .data =3D &pmk8550_pwm_data }, {} }; MODULE_DEVICE_TABLE(of, lpg_of_table); --=20 2.39.0