From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 232D3C43331 for ; Fri, 3 Apr 2020 23:53:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id DE3402072B for ; Fri, 3 Apr 2020 23:53:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="c+WwfWnO" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726254AbgDCXx3 (ORCPT ); Fri, 3 Apr 2020 19:53:29 -0400 Received: from mail-qk1-f193.google.com ([209.85.222.193]:34896 "EHLO mail-qk1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725268AbgDCXx3 (ORCPT ); Fri, 3 Apr 2020 19:53:29 -0400 Received: by mail-qk1-f193.google.com with SMTP id k13so10067926qki.2; Fri, 03 Apr 2020 16:53:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=ybaTpFfXn+LxmLPmE6oKCLBK1aHCu6fnDl0UMen+FlQ=; b=c+WwfWnOklwmjmATtt9PNjWRluiTClyYp0jcstMXvu/qdAut4CGP9x02z61LxH7M3i PtPUsAPcCc704lQFMf5323rEJBO1nohLgnzhGarL0ULJuYJgvR4lQB+vwHso2W3oOI6z Dfyj3zM/xpBVy7Wk/0Z82xsof4atcTG9GBwRRHimkSIm6VghfgXi8N7cxdmjmuvRq7zT KBGJTnu0slPw65DkF+gngJ2UIp4c4e/4sp52KI9r7r7xuHagqEXVvKD/VrBq1zloBiSS 0jo099Yb7hQsxPUlXKMgZbN9crlMd+29e1VsF/FuEUC5Xny9KX6+85RjkDGzkbSK22/+ BKkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=ybaTpFfXn+LxmLPmE6oKCLBK1aHCu6fnDl0UMen+FlQ=; b=P+0vpRfZR/4dkDliFZ5xcUcan+sKoA0XtDIMrVXZrQg3EiEPzssi6NoCiknz6o6fIV +1B1x4MX5dedqBcAffcYO4tK6TW9Uai/teQsQarqKGzOul0r8dVYIU0SlAw+hciheJIV nkaDd4dacYMDwTK+HVr9FxmwwETwKKvrlzgp4RP7+eFlIXJQ5JwIM3zxuaSlJgkkwojq kBDK65gku+ezZhJjsUfk0OZFCWfhn7ykiWHpbLRX8H4pML4y5RIniseNp/945YVg0oar kqSl6ecN10zYTrdtEl5ktnftPxGYeHSEDKiojPMN/mHcKgadqmQ3LbUOmAz6ulaVczxM jDIg== X-Gm-Message-State: AGi0Pub+AHTSziPQyl7foG+hiyW5FNDXmImdkyTPLzU+rkpr1KaKu7t3 PsL3kGOy2Qdqv7YNaMibRAc= X-Google-Smtp-Source: APiQypJhlhIVUJkqW3E89aT/gcxK/cLzNXagxiAuUlk5eOo5HS1C0vdojyWJbZ65rZyK/gr/LKoA9g== X-Received: by 2002:a37:9dc9:: with SMTP id g192mr11860484qke.50.1585958007869; Fri, 03 Apr 2020 16:53:27 -0700 (PDT) Received: from localhost.localdomain ([72.53.229.195]) by smtp.gmail.com with ESMTPSA id p186sm2143388qkb.71.2020.04.03.16.53.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Apr 2020 16:53:27 -0700 (PDT) From: Sven Van Asbroeck X-Google-Original-From: Sven Van Asbroeck To: Thierry Reding Cc: Matthias Schiffer , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , Clemens Gruber , Andy Shevchenko , linux-pwm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1] pwm: pca9685: re-enable active pwm channels on pwm period change Date: Fri, 3 Apr 2020 19:53:24 -0400 Message-Id: <20200403235324.27437-1-TheSven73@gmail.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In order to change the pwm period, this chip must be put in sleep mode. However, when coming out of sleep mode, the pwm channel state is not completely restored: all pwm channels are off by default. This results in a bug in this driver: when the pwm period is changed on a pwm channel, all other pwm channels will be deactivated. Fix by clearing the RESTART bit when coming out of sleep mode - this will restore all pwm channels to their pre-sleep on/off state. Reported-by: Matthias Schiffer Cc: Matthias Schiffer Cc: Uwe Kleine-König Cc: Clemens Gruber Cc: Andy Shevchenko Cc: linux-pwm@vger.kernel.org Cc: linux-kernel@vger.kernel.org Link: https://lore.kernel.org/lkml/32ec35c2b3da119dd2c7bc09742796a0d8a9607e.camel@ew.tq-group.com/ Signed-off-by: Sven Van Asbroeck --- I no longer have access to pca9685 hardware, so I'm unable to test: - if this is indeed a bug - if this patch fixes it Made against: Tree-repo: git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm.git Tree-branch: for-next Tree-git-id: 9cc5f232a4b6a0ef6e9b57876d61b88f61bdd7c2 drivers/pwm/pwm-pca9685.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/pwm/pwm-pca9685.c b/drivers/pwm/pwm-pca9685.c index 76cd22bd6614..0a16f0122e0e 100644 --- a/drivers/pwm/pwm-pca9685.c +++ b/drivers/pwm/pwm-pca9685.c @@ -59,6 +59,7 @@ #define LED_FULL (1 << 4) #define MODE1_SLEEP (1 << 4) +#define MODE1_RESTART (1 << 7) #define MODE2_INVRT (1 << 4) #define MODE2_OUTDRV (1 << 2) @@ -271,6 +272,15 @@ static int pca9685_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, /* Wake the chip up */ pca9685_set_sleep_mode(pca, false); + /* If any pwm channels were active when the chip was put + * in sleep mode, re-activate them. + */ + if (!regmap_read(pca->regmap, PCA9685_MODE1, ®) && + reg & MODE1_RESTART) + regmap_update_bits(pca->regmap, PCA9685_MODE1, + MODE1_RESTART, + MODE1_RESTART); + pca->period_ns = period_ns; } else { dev_err(chip->dev, -- 2.17.1