From patchwork Thu Jan 3 13:29:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudiu Beznea X-Patchwork-Id: 1020299 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pwm-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=microchip.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.b="a5w3L0we"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Vph410hkz9s55 for ; Fri, 4 Jan 2019 00:30:28 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731658AbfACN3u (ORCPT ); Thu, 3 Jan 2019 08:29:50 -0500 Received: from esa6.microchip.iphmx.com ([216.71.154.253]:42329 "EHLO esa6.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731409AbfACN3t (ORCPT ); Thu, 3 Jan 2019 08:29:49 -0500 X-IronPort-AV: E=Sophos;i="5.56,435,1539673200"; d="scan'208";a="22165264" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa6.microchip.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 03 Jan 2019 06:29:48 -0700 Received: from NAM02-BL2-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.76.107) with Microsoft SMTP Server (TLS) id 14.3.352.0; Thu, 3 Jan 2019 06:30:20 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector1-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6ReJdSPRLur42ChEef64TCSjKzn6BBELfoqH8OV4ZGY=; b=a5w3L0wewzlZdPrqHyKIuaoyDN+Zz5/gNKrm7E61ISs5gXaUCk47gLXK0VW/+V7H5H1mIMNXNnU4DhMEE8+XtLwvhPdjCwJsomwaR6/OEiBwWuYHLkauEttLwr9rYhQe3u/27HnXVd6ljePfPa0ky3/zy1Bm7mXPyo1UsAajjU0= Received: from MWHPR11MB1920.namprd11.prod.outlook.com (10.175.54.19) by MWHPR11MB1984.namprd11.prod.outlook.com (10.175.54.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1495.6; Thu, 3 Jan 2019 13:29:45 +0000 Received: from MWHPR11MB1920.namprd11.prod.outlook.com ([fe80::e553:ff9d:8c0b:9627]) by MWHPR11MB1920.namprd11.prod.outlook.com ([fe80::e553:ff9d:8c0b:9627%6]) with mapi id 15.20.1495.005; Thu, 3 Jan 2019 13:29:45 +0000 From: To: , , , , CC: , , , , Subject: [PATCH v8 1/6] pwm: extend PWM framework with PWM modes Thread-Topic: [PATCH v8 1/6] pwm: extend PWM framework with PWM modes Thread-Index: AQHUo2hjF9SHYVC+/UyvQjeBLKSGNw== Date: Thu, 3 Jan 2019 13:29:44 +0000 Message-ID: <1546522081-23659-2-git-send-email-claudiu.beznea@microchip.com> References: <1546522081-23659-1-git-send-email-claudiu.beznea@microchip.com> In-Reply-To: <1546522081-23659-1-git-send-email-claudiu.beznea@microchip.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: VI1PR07CA0209.eurprd07.prod.outlook.com (2603:10a6:802:3f::33) To MWHPR11MB1920.namprd11.prod.outlook.com (2603:10b6:300:110::19) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Claudiu.Beznea@microchip.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [94.177.32.154] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; MWHPR11MB1984; 6:roNmuBqogtV9npHEKNXjkWKuwI8I6moAwwHXsBp0uwYK/tJ1grVXvqe2YSCya8lb+58s7D3+uiH6LOTu3+32SSuxalYt1plsnqqpDStgxU+TVMKLUKbTh+GzENwGrYqKq4jjh20b0wBjq3+7j0yBTkGUJ1auOyeltqwH4MeEvNvEOnIdHu68W7RUS8okegeo2uNy4SPy8IirMbNTYY68nRwRT0XF6JRO7FlkEH+hUJTDbRRRDKw7Ju8SobY03OuNY32bA/IW5Wl6+W3meUACOukTiiAE/4ozmpUxmBzyIafLBIScLNVPgYTUwugl7VeZiXTM2cdy/zjo16bXmjcuWDLgf6n/sjgIH05DgUJLN+a9MUsUsUubAXZOBtASKnN1UybUsqrsbA6hkF30wK6OEXNpMuMZG01wGjGdQdAydCRs9zbHqP9O2co6JXRCreAB5v04sLEitKhbG6xahlxWsQ==; 5:q/IhCGv9jRQh3tJ3unHqwTFRWHXYmngqoRuSnz0PlBXw8G7qCIrMbYhPdWYlodFEDwViL7SOAhtkDd1n9B+R7GzQOdLpm7T9brvS6YnVpWVdTYQ8st6xa1Xk020f2Mx3g27JFsoltohWotdrc0/y676v/cW0asFFnBUXoQXHWq7jtR8+DQDkZNuPGS2wG82t4dPhxUE6TD/t9aKBwSVkVA==; 7:deenA9spZLekTVGgh/p5phBnm+j/vBtzrgSSDzq01A3NvuXfECe4pel+eMmQj43+4KGwMtTBW54fLgD4earZ32+Typb6cj4xCRJZJ2DU0aSwwZ43eCXZzmMZeXdoGdChNyxRhAer2lg+TI2orU4Odg== x-ms-office365-filtering-correlation-id: 696837e1-99fd-49fd-ffc6-08d6717f861b x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600109)(711020)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:MWHPR11MB1984; x-ms-traffictypediagnostic: MWHPR11MB1984: x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(3230021)(908002)(999002)(5005026)(6040522)(8220060)(2401047)(8121501046)(93006095)(93001095)(3231475)(944501520)(52105112)(3002001)(10201501046)(6041310)(20161123564045)(20161123560045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095); SRVR:MWHPR11MB1984; BCL:0; PCL:0; RULEID:; SRVR:MWHPR11MB1984; x-forefront-prvs: 0906E83A25 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(136003)(376002)(346002)(396003)(366004)(199004)(189003)(11346002)(71190400001)(6486002)(2501003)(72206003)(14454004)(4744004)(2616005)(476003)(97736004)(446003)(5660300001)(478600001)(316002)(6636002)(86362001)(99286004)(54906003)(52116002)(110136005)(71200400001)(6436002)(6512007)(186003)(53936002)(305945005)(7736002)(3846002)(39060400002)(6506007)(386003)(6116002)(105586002)(106356001)(107886003)(68736007)(76176011)(36756003)(4326008)(26005)(81156014)(81166006)(102836004)(8936002)(66066001)(2906002)(486006)(8676002)(256004)(25786009)(14444005); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR11MB1984; H:MWHPR11MB1920.namprd11.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: microchip.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: ZzJeUHOotROsYl4YdxgXKlYzHf29pnJ/jlZ31tO0RADhprufvMTjY/NHpMc4TphL6NffTT2h9rX28DBeDIbGyrkwFWuphwQvj8YS/U/qUyrwJkAjyC5POO58LPBcnnyeW3NWP4keWXTxofhwBtRzDkdb8d9E3QdlVU0HpA/TMMAfW9giIbgHlYxw1JM602WrNRn4S6zOoO24MRphZjasIXzR2wJ9jC2ZDEckKKJ2SCexfgZisX8RwPBiePNYDr0v3x17WoByDgsbGYpbZ6mQ6dMW4FJnTbaobvdDcpJ3bWj2U0E3/nZIOE2pki7g8or2 spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: 696837e1-99fd-49fd-ffc6-08d6717f861b X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Jan 2019 13:29:44.8304 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR11MB1984 X-OriginatorOrg: microchip.com Sender: linux-pwm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pwm@vger.kernel.org From: Claudiu Beznea Add basic PWM modes: normal and complementary. These modes should differentiate the single output PWM channels from two outputs PWM channels. These modes could be set as follow: 1. PWM channels with one output per channel: - normal mode 2. PWM channels with two outputs per channel: - normal mode - complementary mode Since users could use a PWM channel with two output as one output PWM channel, the PWM normal mode is allowed to be set for PWM channels with two outputs; in fact PWM normal mode should be supported by all PWMs. The PWM capabilities were implemented per PWM channel. Every PWM controller will register a function to get PWM capabilities. If this is not explicitly set by the driver a default function will be used to retrieve the PWM capabilities (in this case the PWM capabilities will contain only PWM normal mode). To retrieve capabilities the pwm_get_caps() function could be used. Every PWM channel have associated a mode in the PWM state. Proper support was added to get/set PWM mode. Only modes supported by PWM channel could be set. Signed-off-by: Claudiu Beznea --- drivers/pwm/core.c | 91 ++++++++++++++++++++++++++++++++++++++++++++- drivers/pwm/sysfs.c | 61 ++++++++++++++++++++++++++++++ include/linux/pwm.h | 104 +++++++++++++++++++++++++++++++++++----------------- 3 files changed, 222 insertions(+), 34 deletions(-) diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index 1581f6ab1b1f..eb444ee8d486 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c @@ -249,6 +249,88 @@ static bool pwm_ops_check(const struct pwm_ops *ops) return false; } +static int pwm_get_default_caps(struct pwm_caps *caps) +{ + static const struct pwm_caps default_caps = { + .modes_msk = PWM_MODE_BIT(NORMAL), + }; + + if (!caps) + return -EINVAL; + + *caps = default_caps; + + return 0; +} + +/** + * pwm_get_caps() - get PWM capabilities of a PWM device + * @pwm: PWM device to get the capabilities for + * @caps: returned capabilities + * + * Returns: 0 on success or a negative error code on failure + */ +int pwm_get_caps(const struct pwm_device *pwm, struct pwm_caps *caps) +{ + if (!pwm || !caps) + return -EINVAL; + + if (pwm->chip->ops->get_caps) + return pwm->chip->ops->get_caps(pwm->chip, pwm, caps); + + return pwm_get_default_caps(caps); +} +EXPORT_SYMBOL_GPL(pwm_get_caps); + +/** + * pwm_get_default_modebit() - get the default mode for PWM (as a bit mask) + * @pwm: PWM device to get the default mode for + * + * Returns: the default PWM mode (as a bit mask) for PWM device + */ +unsigned long pwm_get_default_modebit(const struct pwm_device *pwm) +{ + struct pwm_caps caps; + + if (pwm_get_caps(pwm, &caps)) + return PWM_MODE_BIT(NORMAL); + + return BIT(ffs(caps.modes_msk) - 1); +} +EXPORT_SYMBOL_GPL(pwm_get_default_modebit); + +/** + * pwm_supports_mode() - check if PWM mode is supported by PWM device + * @pwm: PWM device + * @modebit: PWM mode bit mask to be checked (see PWM_MODE_BIT()) + * + * Returns: true if PWM mode is supported, false otherwise + */ +bool pwm_supports_mode(const struct pwm_device *pwm, unsigned long modebit) +{ + struct pwm_caps caps; + + if (!pwm || !modebit) + return false; + + if (hweight_long(modebit) != 1 || ffs(modebit) - 1 >= PWM_MODE_CNT) + return false; + + if (pwm_get_caps(pwm, &caps)) + return false; + + return !!(caps.modes_msk & modebit); +} +EXPORT_SYMBOL_GPL(pwm_supports_mode); + +const char *pwm_get_mode_name(unsigned long modebit) +{ + if (modebit == PWM_MODE_BIT(COMPLEMENTARY)) + return "complementary"; + + return "normal"; +} + /** * pwmchip_add_with_polarity() - register a new PWM chip * @chip: the PWM chip to add @@ -294,6 +376,7 @@ int pwmchip_add_with_polarity(struct pwm_chip *chip, pwm->pwm = chip->base + i; pwm->hwpwm = i; pwm->state.polarity = polarity; + pwm->state.modebit = pwm_get_default_modebit(pwm); if (chip->ops->get_state) chip->ops->get_state(chip, pwm, &pwm->state); @@ -469,7 +552,8 @@ int pwm_apply_state(struct pwm_device *pwm, struct pwm_state *state) int err; if (!pwm || !state || !state->period || - state->duty_cycle > state->period) + state->duty_cycle > state->period || + !pwm_supports_mode(pwm, state->modebit)) return -EINVAL; if (!memcmp(state, &pwm->state, sizeof(*state))) @@ -530,6 +614,8 @@ int pwm_apply_state(struct pwm_device *pwm, struct pwm_state *state) pwm->state.enabled = state->enabled; } + + pwm->state.modebit = state->modebit; } return 0; @@ -579,6 +665,8 @@ int pwm_adjust_config(struct pwm_device *pwm) pwm_get_args(pwm, &pargs); pwm_get_state(pwm, &state); + state.modebit = pwm_get_default_modebit(pwm); + /* * If the current period is zero it means that either the PWM driver * does not support initial state retrieval or the PWM has not yet @@ -999,6 +1087,7 @@ static void pwm_dbg_show(struct pwm_chip *chip, struct seq_file *s) seq_printf(s, " duty: %u ns", state.duty_cycle); seq_printf(s, " polarity: %s", state.polarity ? "inverse" : "normal"); + seq_printf(s, " mode: %s", pwm_get_mode_name(state.modebit)); seq_puts(s, "\n"); } diff --git a/drivers/pwm/sysfs.c b/drivers/pwm/sysfs.c index ceb233dd6048..7865fbafbeb4 100644 --- a/drivers/pwm/sysfs.c +++ b/drivers/pwm/sysfs.c @@ -223,11 +223,71 @@ static ssize_t capture_show(struct device *child, return sprintf(buf, "%u %u\n", result.period, result.duty_cycle); } +static ssize_t mode_show(struct device *child, + struct device_attribute *attr, + char *buf) +{ + struct pwm_device *pwm = child_to_pwm_device(child); + struct pwm_state state; + unsigned long modebit; + enum pwm_mode mode; + int len = 0; + + pwm_get_state(pwm, &state); + + for (mode = PWM_MODE_NORMAL; mode < PWM_MODE_CNT; mode++) { + modebit = BIT(mode); + if (pwm_supports_mode(pwm, modebit)) { + if (state.modebit == modebit) + len += scnprintf(buf + len, + PAGE_SIZE - len, "[%s] ", + pwm_get_mode_name(modebit)); + else + len += scnprintf(buf + len, + PAGE_SIZE - len, "%s ", + pwm_get_mode_name(modebit)); + } + } + + len += scnprintf(buf + len, PAGE_SIZE - len, "\n"); + return len; +} + +static ssize_t mode_store(struct device *child, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct pwm_export *export = child_to_pwm_export(child); + struct pwm_device *pwm = export->pwm; + struct pwm_state state; + unsigned long modebit; + enum pwm_mode mode; + int ret; + + for (mode = PWM_MODE_NORMAL; mode < PWM_MODE_CNT; mode++) { + modebit = BIT(mode); + if (sysfs_streq(buf, pwm_get_mode_name(modebit))) + break; + } + + if (mode == PWM_MODE_CNT) + return -EINVAL; + + mutex_lock(&export->lock); + pwm_get_state(pwm, &state); + state.modebit = modebit; + ret = pwm_apply_state(pwm, &state); + mutex_unlock(&export->lock); + + return ret ? : size; +} + static DEVICE_ATTR_RW(period); static DEVICE_ATTR_RW(duty_cycle); static DEVICE_ATTR_RW(enable); static DEVICE_ATTR_RW(polarity); static DEVICE_ATTR_RO(capture); +static DEVICE_ATTR_RW(mode); static struct attribute *pwm_attrs[] = { &dev_attr_period.attr, @@ -235,6 +295,7 @@ static struct attribute *pwm_attrs[] = { &dev_attr_enable.attr, &dev_attr_polarity.attr, &dev_attr_capture.attr, + &dev_attr_mode.attr, NULL }; ATTRIBUTE_GROUPS(pwm); diff --git a/include/linux/pwm.h b/include/linux/pwm.h index d5199b507d79..3d89343bc405 100644 --- a/include/linux/pwm.h +++ b/include/linux/pwm.h @@ -26,6 +26,28 @@ enum pwm_polarity { }; /** + * PWM modes capabilities + * @PWM_MODE_NORMAL: PWM has one output + * @PWM_MODE_COMPLEMENTARY: PWM has 2 outputs with opposite polarities + * @PWM_MODE_CNT: PWM modes count + */ +enum pwm_mode { + PWM_MODE_NORMAL, + PWM_MODE_COMPLEMENTARY, + PWM_MODE_CNT, +}; + +#define PWM_MODE_BIT(name) BIT(PWM_MODE_##name) + +/** + * struct pwm_caps - PWM capabilities + * @modes_msk: bitmask of supported modes (see PWM_MODE_*) + */ +struct pwm_caps { + unsigned long modes_msk; +}; + +/** * struct pwm_args - board-dependent PWM arguments * @period: reference period * @polarity: reference polarity @@ -53,12 +75,14 @@ enum { * @period: PWM period (in nanoseconds) * @duty_cycle: PWM duty cycle (in nanoseconds) * @polarity: PWM polarity + * @modebit: PWM mode bit * @enabled: PWM enabled status */ struct pwm_state { unsigned int period; unsigned int duty_cycle; enum pwm_polarity polarity; + unsigned long modebit; bool enabled; }; @@ -151,39 +175,6 @@ static inline void pwm_get_args(const struct pwm_device *pwm, } /** - * pwm_init_state() - prepare a new state to be applied with pwm_apply_state() - * @pwm: PWM device - * @state: state to fill with the prepared PWM state - * - * This functions prepares a state that can later be tweaked and applied - * to the PWM device with pwm_apply_state(). This is a convenient function - * that first retrieves the current PWM state and the replaces the period - * and polarity fields with the reference values defined in pwm->args. - * Once the function returns, you can adjust the ->enabled and ->duty_cycle - * fields according to your needs before calling pwm_apply_state(). - * - * ->duty_cycle is initially set to zero to avoid cases where the current - * ->duty_cycle value exceed the pwm_args->period one, which would trigger - * an error if the user calls pwm_apply_state() without adjusting ->duty_cycle - * first. - */ -static inline void pwm_init_state(const struct pwm_device *pwm, - struct pwm_state *state) -{ - struct pwm_args args; - - /* First get the current state. */ - pwm_get_state(pwm, state); - - /* Then fill it with the reference config */ - pwm_get_args(pwm, &args); - - state->period = args.period; - state->polarity = args.polarity; - state->duty_cycle = 0; -} - -/** * pwm_get_relative_duty_cycle() - Get a relative duty cycle value * @state: PWM state to extract the duty cycle from * @scale: target scale of the relative duty cycle @@ -254,6 +245,7 @@ pwm_set_relative_duty_cycle(struct pwm_state *state, unsigned int duty_cycle, * @get_state: get the current PWM state. This function is only * called once per PWM device when the PWM chip is * registered. + * @get_caps: get PWM capabilities. * @dbg_show: optional routine to show contents in debugfs * @owner: helps prevent removal of modules exporting active PWMs */ @@ -272,6 +264,8 @@ struct pwm_ops { struct pwm_state *state); void (*get_state)(struct pwm_chip *chip, struct pwm_device *pwm, struct pwm_state *state); + int (*get_caps)(const struct pwm_chip *chip, + const struct pwm_device *pwm, struct pwm_caps *caps); #ifdef CONFIG_DEBUG_FS void (*dbg_show)(struct pwm_chip *chip, struct seq_file *s); #endif @@ -402,6 +396,10 @@ struct pwm_device *pwm_request_from_chip(struct pwm_chip *chip, unsigned int index, const char *label); +int pwm_get_caps(const struct pwm_device *pwm, struct pwm_caps *caps); +bool pwm_supports_mode(const struct pwm_device *pwm, unsigned long modebit); +unsigned long pwm_get_default_modebit(const struct pwm_device *pwm); +const char *pwm_get_mode_name(unsigned long modebit); struct pwm_device *of_pwm_xlate_with_flags(struct pwm_chip *pc, const struct of_phandle_args *args); @@ -488,6 +486,11 @@ static inline struct pwm_device *pwm_request_from_chip(struct pwm_chip *chip, return ERR_PTR(-ENODEV); } +static inline unsigned long pwm_get_default_modebit(const struct pwm_device *pwm) +{ + return 0; +} + static inline struct pwm_device *pwm_get(struct device *dev, const char *consumer) { @@ -522,6 +525,40 @@ static inline void devm_pwm_put(struct device *dev, struct pwm_device *pwm) } #endif +/** + * pwm_init_state() - prepare a new state to be applied with pwm_apply_state() + * @pwm: PWM device + * @state: state to fill with the prepared PWM state + * + * This functions prepares a state that can later be tweaked and applied + * to the PWM device with pwm_apply_state(). This is a convenient function + * that first retrieves the current PWM state and the replaces the period + * and polarity fields with the reference values defined in pwm->args. + * Once the function returns, you can adjust the ->enabled and ->duty_cycle + * fields according to your needs before calling pwm_apply_state(). + * + * ->duty_cycle is initially set to zero to avoid cases where the current + * ->duty_cycle value exceed the pwm_args->period one, which would trigger + * an error if the user calls pwm_apply_state() without adjusting ->duty_cycle + * first. + */ +static inline void pwm_init_state(const struct pwm_device *pwm, + struct pwm_state *state) +{ + struct pwm_args args; + + /* First get the current state. */ + pwm_get_state(pwm, state); + + /* Then fill it with the reference config */ + pwm_get_args(pwm, &args); + + state->period = args.period; + state->polarity = args.polarity; + state->duty_cycle = 0; + state->modebit = pwm_get_default_modebit(pwm); +} + static inline void pwm_apply_args(struct pwm_device *pwm) { struct pwm_state state = { }; @@ -550,6 +587,7 @@ static inline void pwm_apply_args(struct pwm_device *pwm) state.enabled = false; state.polarity = pwm->args.polarity; state.period = pwm->args.period; + state.modebit = pwm_get_default_modebit(pwm); pwm_apply_state(pwm, &state); } From patchwork Thu Jan 3 13:29:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudiu Beznea X-Patchwork-Id: 1020295 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pwm-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=microchip.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.b="gvFbuHrs"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Vpgq1tsCz9sBn for ; Fri, 4 Jan 2019 00:30:15 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731752AbfACN3y (ORCPT ); Thu, 3 Jan 2019 08:29:54 -0500 Received: from esa5.microchip.iphmx.com ([216.71.150.166]:8165 "EHLO esa5.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731409AbfACN3w (ORCPT ); Thu, 3 Jan 2019 08:29:52 -0500 X-IronPort-AV: E=Sophos;i="5.56,435,1539673200"; d="scan'208";a="22933260" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa5.microchip.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 03 Jan 2019 06:29:51 -0700 Received: from NAM03-CO1-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.76.106) with Microsoft SMTP Server (TLS) id 14.3.352.0; Thu, 3 Jan 2019 06:30:23 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector1-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wpSJewagfrs8VaVUElz5kkpmqguC8UIFUEOTNeJaI7c=; b=gvFbuHrszY34KSZL0ocv73yTtuZQHxhUVYk1WqqFJQkI8QA7yppHqVb2tn/NtQ1IvA1aKBQk5lnRTJYaKBN+LNnN6HgFdetBIOZE84WhuYExemP/2LGSVqSKOkRlKiBJEgcLu5SEfl4+Lk+GCaWdFq/RUFPsa0BuG4UETDknrIQ= Received: from MWHPR11MB1920.namprd11.prod.outlook.com (10.175.54.19) by MWHPR11MB1984.namprd11.prod.outlook.com (10.175.54.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1495.6; Thu, 3 Jan 2019 13:29:48 +0000 Received: from MWHPR11MB1920.namprd11.prod.outlook.com ([fe80::e553:ff9d:8c0b:9627]) by MWHPR11MB1920.namprd11.prod.outlook.com ([fe80::e553:ff9d:8c0b:9627%6]) with mapi id 15.20.1495.005; Thu, 3 Jan 2019 13:29:48 +0000 From: To: , , , , CC: , , , , Subject: [PATCH v8 2/6] pwm: add PWM modes Thread-Topic: [PATCH v8 2/6] pwm: add PWM modes Thread-Index: AQHUo2hlGTRebPui4EWivBrexXjs4w== Date: Thu, 3 Jan 2019 13:29:47 +0000 Message-ID: <1546522081-23659-3-git-send-email-claudiu.beznea@microchip.com> References: <1546522081-23659-1-git-send-email-claudiu.beznea@microchip.com> In-Reply-To: <1546522081-23659-1-git-send-email-claudiu.beznea@microchip.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: VI1PR07CA0209.eurprd07.prod.outlook.com (2603:10a6:802:3f::33) To MWHPR11MB1920.namprd11.prod.outlook.com (2603:10b6:300:110::19) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Claudiu.Beznea@microchip.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [94.177.32.154] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; MWHPR11MB1984; 6:awZjB8DGDkAfydnChEZ68RUVxYrBkW6C1IW8637vx0wEdf4leF4r2geuoUyDgwSRYpV3bpsCtw6IF+cFSpvbnRmgAEFQk9rG97nuybLiz8VxkZ/2eqsnoBp1ySBR4qQWGcZnccIYoQirA1hVp3/7xAOV0W4BXLTP2P3QiQhjJOKOpbMTonPbd163TOG2u8eNjlXikOwFAjOsLrYNtuXecgdlapBB6tZ3XsVBLZmOlUG228JjuRKzF4qglraNiIPupNSqnnyXvN/jac351czMf/7TjGdIV4MNFKtZ+4b30/WIH4DMc05b96o+DVZP3GmXJihNexU8WNOpqXRjBtQOSwpMv5+J2qnxQ/YLZVhAl9r+nTYQVWFVm3Q6lRL+NR/MtgsYX3Rw1RMyWA51yR9BXBMNOBsNYMcUZB0xPAuviF3hes6m3m2lOyr8KMJ0EwCUCV9wQi/UIooM7vVaZrx8qA==; 5:LMHQfPC/L8k3E/Y7J/px5RBMxy/iSX8xe7MJzvMjgIsUmY9OncuOfwvAztNwh0QDilsm5M+6hrG6zm1u/1yaLh95hxeT79qDF43bn6EvgonICDTnoMUWTab79hRRv02NA1VhOiVR0jvO5+oM6e2UxBTFH7r8FGFUj3CsZxUDBXR3EKjMv+VGBiYHIj4IWLN+2MyqH/OSW1UzLX7+JjQ+xw==; 7:icZTRBEypjAx5844Y5QdyhkGXLl0uV0YWZku3U+5VTA7E6/ZEkbP/xoWl8gj9uponfrrvW8VjaXWkCNZr/Bvvr3f3vwaCncZMvrCc5LBaWjZQ3nZi3ZVI4VV8l93siy2yw4qJRfVmswLkcqD6BawSA== x-ms-office365-filtering-correlation-id: 50974f9a-eff2-4c73-9161-08d6717f87fe x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600109)(711020)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:MWHPR11MB1984; x-ms-traffictypediagnostic: MWHPR11MB1984: x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(3230021)(908002)(999002)(5005026)(6040522)(8220060)(2401047)(8121501046)(93006095)(93001095)(3231475)(944501520)(52105112)(3002001)(10201501046)(6041310)(20161123564045)(20161123560045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095); SRVR:MWHPR11MB1984; BCL:0; PCL:0; RULEID:; SRVR:MWHPR11MB1984; x-forefront-prvs: 0906E83A25 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(136003)(376002)(346002)(396003)(366004)(199004)(189003)(11346002)(71190400001)(6486002)(2501003)(72206003)(14454004)(2616005)(476003)(97736004)(446003)(5660300001)(478600001)(316002)(6636002)(575784001)(86362001)(99286004)(54906003)(52116002)(110136005)(71200400001)(6436002)(6512007)(186003)(53936002)(305945005)(7736002)(3846002)(39060400002)(6506007)(386003)(6116002)(105586002)(106356001)(107886003)(68736007)(76176011)(36756003)(4326008)(26005)(81156014)(81166006)(102836004)(8936002)(66066001)(2906002)(486006)(8676002)(256004)(25786009)(14444005); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR11MB1984; H:MWHPR11MB1920.namprd11.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: microchip.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: IWO9mD4F8vqxVIkIEfWLXTz47Aat9JlEpV0O/zpsbfdBKUN70lSD8e0q0glMa5wu0jyN+DP+jgsnm5MAy60YyRBQMfk8ET92R45Pi9ZqmcRgiHvyEAENG2l2oMsu7clhG8k9cKkvksN1ZL3NAYSBNEuvezzwQJ45eBOvbEk0t3WM/Slc7aUzvSkPP9svy39Du9G4qiafZc4mp3ab0XlNkc90LW40jAmsztyIVXavqC0EVQKCwx0XXcSgJTYdybLa7+eBLqKcNGK7uiRcnqFFmBQ+KOQQ4kcAQR5qTQ17t6O9HzVpeNfXmjeWlm3H7ysM spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: 50974f9a-eff2-4c73-9161-08d6717f87fe X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Jan 2019 13:29:47.8518 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR11MB1984 X-OriginatorOrg: microchip.com Sender: linux-pwm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pwm@vger.kernel.org From: Claudiu Beznea Add PWM normal and complementary modes. Signed-off-by: Claudiu Beznea --- Documentation/pwm.txt | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Documentation/pwm.txt b/Documentation/pwm.txt index 8fbf0aa3ba2d..669fd4c9cc8e 100644 --- a/Documentation/pwm.txt +++ b/Documentation/pwm.txt @@ -110,6 +110,28 @@ channel that was exported. The following properties will then be available: - 0 - disabled - 1 - enabled + mode + Get/set PWM channel working mode. + + In the following description PWMx_y refers to output y of PWM with ID x. + + Normal mode - for PWM channels with one output; this should be the + default working mode for every PWM channel; output waveforms looks + like this: + __ __ __ __ + PWMx __| |____| |____| |____| |__ + ^ ^ ^ ^ + + Complementary mode - for PWM channels with two outputs; output waveforms + looks line this: + __ __ __ __ + PWMx_0 __| |____| |____| |____| |__ + __ ____ ____ ____ __ + PWMx_1 |__| |__| |__| |__| + ^ ^ ^ ^ + + Where '^' specifies the beginning of a period. + Implementing a PWM driver ------------------------- From patchwork Thu Jan 3 13:29:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudiu Beznea X-Patchwork-Id: 1020297 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pwm-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=microchip.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.b="IhlAK6HX"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Vpgx5Bgnz9sCX for ; Fri, 4 Jan 2019 00:30:21 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727055AbfACNaP (ORCPT ); Thu, 3 Jan 2019 08:30:15 -0500 Received: from esa1.microchip.iphmx.com ([68.232.147.91]:20956 "EHLO esa1.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731748AbfACN3y (ORCPT ); Thu, 3 Jan 2019 08:29:54 -0500 X-IronPort-AV: E=Sophos;i="5.56,435,1539673200"; d="scan'208";a="25939504" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa1.microchip.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 03 Jan 2019 06:29:53 -0700 Received: from NAM03-CO1-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.76.105) with Microsoft SMTP Server (TLS) id 14.3.352.0; Thu, 3 Jan 2019 06:30:25 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector1-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fgevUhPYg5Bh3SNVnyZSPjukuIyPbHAlU740fVrcAwU=; b=IhlAK6HXOzlISZZu6W8Mz4DzK6Pdj5gg2gVoQncAOaaCtvMvEyo7a7lNYpIKPLdYDoodn0EmGCEeVO/avFxs/xLyUzccFtXTFChPjFIKsNCvWEGt9qdvNuQ0y5fHUmGihZ8r3MaDnPVleFv5KMKsIGpDFsk2rnFHD9UePEpmUjg= Received: from MWHPR11MB1920.namprd11.prod.outlook.com (10.175.54.19) by MWHPR11MB1984.namprd11.prod.outlook.com (10.175.54.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1495.6; Thu, 3 Jan 2019 13:29:51 +0000 Received: from MWHPR11MB1920.namprd11.prod.outlook.com ([fe80::e553:ff9d:8c0b:9627]) by MWHPR11MB1920.namprd11.prod.outlook.com ([fe80::e553:ff9d:8c0b:9627%6]) with mapi id 15.20.1495.005; Thu, 3 Jan 2019 13:29:50 +0000 From: To: , , , , CC: , , , , Subject: [PATCH v8 3/6] pwm: atmel: add pwm capabilities Thread-Topic: [PATCH v8 3/6] pwm: atmel: add pwm capabilities Thread-Index: AQHUo2hnvyIqHD2cNkWnKHVETasQ7A== Date: Thu, 3 Jan 2019 13:29:50 +0000 Message-ID: <1546522081-23659-4-git-send-email-claudiu.beznea@microchip.com> References: <1546522081-23659-1-git-send-email-claudiu.beznea@microchip.com> In-Reply-To: <1546522081-23659-1-git-send-email-claudiu.beznea@microchip.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: VI1PR07CA0209.eurprd07.prod.outlook.com (2603:10a6:802:3f::33) To MWHPR11MB1920.namprd11.prod.outlook.com (2603:10b6:300:110::19) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Claudiu.Beznea@microchip.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [94.177.32.154] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; MWHPR11MB1984; 6:z4Gb7PVTLaxtGaDvZQA3NP2ECmX3dxlHJVJUfZMpzCsub+YrR/3b3JSF60Wo4ZqV5OaTlExEBMwsT6lOc2Y9429ibmLyl5wgBYQGRdfeqm3Hvkx86Gyv3SfKzsyjXn0mSWY1V2wLotT684KZSedA85+m9j0c1aHjZdUVUv0bTGDCPwVTUzjgRBT5/ety1Vtv39IvsENJZiZemUpaem5vLzAm2adcMMl82YcAMfjkRyIbgizC2UIJtFs9im7G6YV8EsdpyfLozmwItmxYYJYwTYcdHsHH9IsoKC0uR+JjB+1xZARN3obtfdblpaXyZJOFCJIOMVqjvarDgLTQPc24CRoYuDIiby3hIewxuLreL8suKEyffzWjLTPoHmdESJi0rTSNdBNKL5ADBdGYmAvtvaHGjQQ/1eCMED4IN8Ae5fIhZJdbvAbgGQhbY53n82x2Htg7k2yexRIiZ2Myyszb1Q==; 5:E0k1PNfo8xpgfALDMKJVU95k0NwzL6n91oafDNQV5KKH/p7c+RvyvHxKlcdz3hPgMUjx7Ug+a97iyISRnsvNDx0sRhEdXpxOD3DV999b2AMHTpqZybJmF/X9HNoCitGaBo96E5SFM7nKFAGK4Fem0yMh9jxU6Y7vAtd8KVkPphhUQfEociu+rHuikuetNgYKur4RTPLkkClb5hfkXi3vBg==; 7:HpMe1i+beL6C1eMLcpCj1wUfTo8g5LxN1fEZ3m6iI4nzI8UpdH4gokOAckd7LYdcQsjun2XFGdggrvniJmK59+9HZrYfH/zHhf6W6Wl7+uGrOlQWdcUi1q4zouA2aDe3aTRgHLF0n9E07vjec2OPCQ== x-ms-office365-filtering-correlation-id: 2138b6f4-d8cb-40eb-6841-08d6717f89b2 x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600109)(711020)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:MWHPR11MB1984; x-ms-traffictypediagnostic: MWHPR11MB1984: x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(3230021)(908002)(999002)(5005026)(6040522)(8220060)(2401047)(8121501046)(93006095)(93001095)(3231475)(944501520)(52105112)(3002001)(10201501046)(6041310)(20161123564045)(20161123560045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095); SRVR:MWHPR11MB1984; BCL:0; PCL:0; RULEID:; SRVR:MWHPR11MB1984; x-forefront-prvs: 0906E83A25 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(136003)(376002)(346002)(396003)(366004)(199004)(189003)(11346002)(71190400001)(6486002)(2501003)(72206003)(14454004)(2616005)(476003)(97736004)(446003)(5660300001)(478600001)(316002)(6636002)(86362001)(99286004)(54906003)(52116002)(110136005)(71200400001)(6436002)(6512007)(186003)(53936002)(305945005)(7736002)(3846002)(39060400002)(6506007)(386003)(6116002)(105586002)(106356001)(107886003)(68736007)(76176011)(36756003)(4326008)(26005)(81156014)(81166006)(102836004)(8936002)(66066001)(2906002)(486006)(8676002)(256004)(25786009)(14444005); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR11MB1984; H:MWHPR11MB1920.namprd11.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: microchip.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: +qQ+vj+OcG0+UgnyrcR+Lm9uZOS2qjqArr2a5s8cwjLjzBwT/ZPwl2fU2RoKifwI5XFzkLgtwO+80vxm5ocZ7gYtNmqTopJjDRq3i6NDNbOoZBxfleQ74lzIZYg3Abt3/Bmku3GOmvl2jFp57CSXzMCJhx04RoOkup0ZjwF9TOdFlWvlr43468jHnORtc7TZLQrYIYS+s6eR9u1jEex0uphLhX46bTdXF2dFDv4CipiCXwEda457SGi3zoa4BbWWGBZI/VoEw0iv2OUmLVY3aDLji5VR6aOjWa2TUpf+49b2kovzzvLvRovD4ck7oK77 spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: 2138b6f4-d8cb-40eb-6841-08d6717f89b2 X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Jan 2019 13:29:50.7182 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR11MB1984 X-OriginatorOrg: microchip.com Sender: linux-pwm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pwm@vger.kernel.org From: Claudiu Beznea Add pwm capabilities for Atmel/Microchip PWM controllers. Signed-off-by: Claudiu Beznea --- drivers/pwm/pwm-atmel.c | 86 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 29 deletions(-) diff --git a/drivers/pwm/pwm-atmel.c b/drivers/pwm/pwm-atmel.c index 530d7dc5f1b5..b72cacd5dca3 100644 --- a/drivers/pwm/pwm-atmel.c +++ b/drivers/pwm/pwm-atmel.c @@ -65,18 +65,23 @@ struct atmel_pwm_registers { u8 duty_upd; }; +struct atmel_pwm_data { + struct atmel_pwm_registers regs; + struct pwm_caps caps; +}; + struct atmel_pwm_chip { struct pwm_chip chip; struct clk *clk; void __iomem *base; - const struct atmel_pwm_registers *regs; + const struct atmel_pwm_data *data; unsigned int updated_pwms; /* ISR is cleared when read, ensure only one thread does that */ struct mutex isr_lock; }; -static inline struct atmel_pwm_chip *to_atmel_pwm_chip(struct pwm_chip *chip) +static inline struct atmel_pwm_chip *to_atmel_pwm_chip(const struct pwm_chip *chip) { return container_of(chip, struct atmel_pwm_chip, chip); } @@ -150,15 +155,15 @@ static void atmel_pwm_update_cdty(struct pwm_chip *chip, struct pwm_device *pwm, struct atmel_pwm_chip *atmel_pwm = to_atmel_pwm_chip(chip); u32 val; - if (atmel_pwm->regs->duty_upd == - atmel_pwm->regs->period_upd) { + if (atmel_pwm->data->regs.duty_upd == + atmel_pwm->data->regs.period_upd) { val = atmel_pwm_ch_readl(atmel_pwm, pwm->hwpwm, PWM_CMR); val &= ~PWM_CMR_UPD_CDTY; atmel_pwm_ch_writel(atmel_pwm, pwm->hwpwm, PWM_CMR, val); } atmel_pwm_ch_writel(atmel_pwm, pwm->hwpwm, - atmel_pwm->regs->duty_upd, cdty); + atmel_pwm->data->regs.duty_upd, cdty); } static void atmel_pwm_set_cprd_cdty(struct pwm_chip *chip, @@ -168,9 +173,9 @@ static void atmel_pwm_set_cprd_cdty(struct pwm_chip *chip, struct atmel_pwm_chip *atmel_pwm = to_atmel_pwm_chip(chip); atmel_pwm_ch_writel(atmel_pwm, pwm->hwpwm, - atmel_pwm->regs->duty, cdty); + atmel_pwm->data->regs.duty, cdty); atmel_pwm_ch_writel(atmel_pwm, pwm->hwpwm, - atmel_pwm->regs->period, cprd); + atmel_pwm->data->regs.period, cprd); } static void atmel_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm, @@ -225,7 +230,7 @@ static int atmel_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, cstate.polarity == state->polarity && cstate.period == state->period) { cprd = atmel_pwm_ch_readl(atmel_pwm, pwm->hwpwm, - atmel_pwm->regs->period); + atmel_pwm->data->regs.period); atmel_pwm_calculate_cdty(state, cprd, &cdty); atmel_pwm_update_cdty(chip, pwm, cdty); return 0; @@ -272,32 +277,55 @@ static int atmel_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, return 0; } +static int atmel_pwm_get_caps(const struct pwm_chip *chip, + const struct pwm_device *pwm, + struct pwm_caps *caps) +{ + struct atmel_pwm_chip *atmel_pwm = to_atmel_pwm_chip(chip); + + *caps = atmel_pwm->data->caps; + + return 0; +} + static const struct pwm_ops atmel_pwm_ops = { .apply = atmel_pwm_apply, + .get_caps = atmel_pwm_get_caps, .owner = THIS_MODULE, }; -static const struct atmel_pwm_registers atmel_pwm_regs_v1 = { - .period = PWMV1_CPRD, - .period_upd = PWMV1_CUPD, - .duty = PWMV1_CDTY, - .duty_upd = PWMV1_CUPD, +static const struct atmel_pwm_data atmel_pwm_data_v1 = { + .regs = { + .period = PWMV1_CPRD, + .period_upd = PWMV1_CUPD, + .duty = PWMV1_CDTY, + .duty_upd = PWMV1_CUPD, + }, + .caps = { + .modes_msk = PWM_MODE_BIT(NORMAL), + }, }; -static const struct atmel_pwm_registers atmel_pwm_regs_v2 = { - .period = PWMV2_CPRD, - .period_upd = PWMV2_CPRDUPD, - .duty = PWMV2_CDTY, - .duty_upd = PWMV2_CDTYUPD, +static const struct atmel_pwm_data atmel_pwm_data_v2 = { + .regs = { + .period = PWMV2_CPRD, + .period_upd = PWMV2_CPRDUPD, + .duty = PWMV2_CDTY, + .duty_upd = PWMV2_CDTYUPD, + }, + .caps = { + .modes_msk = PWM_MODE_BIT(NORMAL) | + PWM_MODE_BIT(COMPLEMENTARY), + }, }; static const struct platform_device_id atmel_pwm_devtypes[] = { { .name = "at91sam9rl-pwm", - .driver_data = (kernel_ulong_t)&atmel_pwm_regs_v1, + .driver_data = (kernel_ulong_t)&atmel_pwm_data_v1, }, { .name = "sama5d3-pwm", - .driver_data = (kernel_ulong_t)&atmel_pwm_regs_v2, + .driver_data = (kernel_ulong_t)&atmel_pwm_data_v2, }, { /* sentinel */ }, @@ -307,20 +335,20 @@ MODULE_DEVICE_TABLE(platform, atmel_pwm_devtypes); static const struct of_device_id atmel_pwm_dt_ids[] = { { .compatible = "atmel,at91sam9rl-pwm", - .data = &atmel_pwm_regs_v1, + .data = &atmel_pwm_data_v1, }, { .compatible = "atmel,sama5d3-pwm", - .data = &atmel_pwm_regs_v2, + .data = &atmel_pwm_data_v2, }, { .compatible = "atmel,sama5d2-pwm", - .data = &atmel_pwm_regs_v2, + .data = &atmel_pwm_data_v2, }, { /* sentinel */ }, }; MODULE_DEVICE_TABLE(of, atmel_pwm_dt_ids); -static inline const struct atmel_pwm_registers * +static inline const struct atmel_pwm_data * atmel_pwm_get_driver_data(struct platform_device *pdev) { const struct platform_device_id *id; @@ -330,18 +358,18 @@ atmel_pwm_get_driver_data(struct platform_device *pdev) id = platform_get_device_id(pdev); - return (struct atmel_pwm_registers *)id->driver_data; + return (struct atmel_pwm_data *)id->driver_data; } static int atmel_pwm_probe(struct platform_device *pdev) { - const struct atmel_pwm_registers *regs; + const struct atmel_pwm_data *data; struct atmel_pwm_chip *atmel_pwm; struct resource *res; int ret; - regs = atmel_pwm_get_driver_data(pdev); - if (!regs) + data = atmel_pwm_get_driver_data(pdev); + if (!data) return -ENODEV; atmel_pwm = devm_kzalloc(&pdev->dev, sizeof(*atmel_pwm), GFP_KERNEL); @@ -373,7 +401,7 @@ static int atmel_pwm_probe(struct platform_device *pdev) atmel_pwm->chip.base = -1; atmel_pwm->chip.npwm = 4; - atmel_pwm->regs = regs; + atmel_pwm->data = data; atmel_pwm->updated_pwms = 0; mutex_init(&atmel_pwm->isr_lock); From patchwork Thu Jan 3 13:29:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudiu Beznea X-Patchwork-Id: 1020294 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pwm-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=microchip.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.b="O7KIBp+h"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Vpgn4Ts0z9sBn for ; Fri, 4 Jan 2019 00:30:13 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731765AbfACN36 (ORCPT ); Thu, 3 Jan 2019 08:29:58 -0500 Received: from esa6.microchip.iphmx.com ([216.71.154.253]:42337 "EHLO esa6.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731409AbfACN35 (ORCPT ); Thu, 3 Jan 2019 08:29:57 -0500 X-IronPort-AV: E=Sophos;i="5.56,435,1539673200"; d="scan'208";a="22165268" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa6.microchip.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 03 Jan 2019 06:29:56 -0700 Received: from NAM03-CO1-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.76.38) with Microsoft SMTP Server (TLS) id 14.3.352.0; Thu, 3 Jan 2019 06:30:28 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector1-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=gjFg29XHhDXqTgFi5EoSX4cAMyvbWDuYFU00hDJO7a0=; b=O7KIBp+hsyBbJOPYffPG31G18poj9pW+CXaWmkneh9+BVYemYCdpPDgMtupKBTYruPcX3plKYLjnoFi+vBMuIznbOnSMorF4Mfq1fmnZ4oPYGOzbn0PcAybcc+5jsjxBxVLnG8Pp0PTJNR152iXlwfXONo/bSml5Suga6APdR5k= Received: from MWHPR11MB1920.namprd11.prod.outlook.com (10.175.54.19) by MWHPR11MB1984.namprd11.prod.outlook.com (10.175.54.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1495.6; Thu, 3 Jan 2019 13:29:54 +0000 Received: from MWHPR11MB1920.namprd11.prod.outlook.com ([fe80::e553:ff9d:8c0b:9627]) by MWHPR11MB1920.namprd11.prod.outlook.com ([fe80::e553:ff9d:8c0b:9627%6]) with mapi id 15.20.1495.005; Thu, 3 Jan 2019 13:29:53 +0000 From: To: , , , , CC: , , , , Subject: [PATCH v8 4/6] pwm: add push-pull mode support Thread-Topic: [PATCH v8 4/6] pwm: add push-pull mode support Thread-Index: AQHUo2hpuyo0awWDokawYxVpCZY9Zw== Date: Thu, 3 Jan 2019 13:29:53 +0000 Message-ID: <1546522081-23659-5-git-send-email-claudiu.beznea@microchip.com> References: <1546522081-23659-1-git-send-email-claudiu.beznea@microchip.com> In-Reply-To: <1546522081-23659-1-git-send-email-claudiu.beznea@microchip.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: VI1PR07CA0209.eurprd07.prod.outlook.com (2603:10a6:802:3f::33) To MWHPR11MB1920.namprd11.prod.outlook.com (2603:10b6:300:110::19) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Claudiu.Beznea@microchip.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [94.177.32.154] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; MWHPR11MB1984; 6:2ERLDmW0/MBnIJYjzPh2UTSE30nP4mAAPWkLXYpPvuF47zIrvvaZa7IVJrvBDLwz4rit1KyS3XmaDcJuuYkpqRBPwiCyQwN/pHODSp3CxLs5d6Lrf0VWFMfa+V75YMXa03RVLo9SUKTgnY1E3OyPGpQjf6Lx0Mc2Im2biHfMaZx8EV3hcp9oIya4unnwD8S4q37/bd3/8r0v1EODKFvKun9nuD7ekH5lrAMIWwIkzcqf49nQVk0IQFFxK/AYKXMOUF/Jyw3Ow7pzmWaMam9GgswSI6XdGSC5brIe1zTlfcBa8DQAYYOlHuwvz+9QTc5Jq0rllWAPA5GEE2z3Kdh7xK5sUIJJivZeL0UWxXyZlvGRX4CfcfTvAdc8kE/4/owxPABjOMpdBBWAaPmAXE2+peY5vs4TIqDLDXqDTDtbBKWSc084DNLtr6DtVxyqlEeIBmIS7G5yCFkzfcPsM+WqLw==; 5:7B9hhtGmgfzQI8dRQNqHmJvd/5VjAKAMZNsZyiziCSoKekK02yEvWGUBzwiV9upjaAq1DwfUYk9GtglEdhDnuQLhIHhVplf3qHhmMfiZc+LZSoRzKhn4fD2YZpGBvsR4kdledsGIB9scjQnnuAZxlHEaJnnfmplrnV/+naCUspcSCUXYeBeCe42T0zD0o1MtOpW4IMwogrUBptjHN95ReQ==; 7:EzcJbB6HUATjaE7lWQ5CBjsC+1ZxJRySL+wWN4yQVMxPg09UWvgjO/70FzpIFRf4d5tiFWhQRBe9DCjvbwtXYhB0rXKaUNye9rr8GXI7oEHbtbvZdGFIp6Ux8/W6C+X+bLyXVXSSU62CGFxSTiwNUA== x-ms-office365-filtering-correlation-id: ca365de5-551b-4e40-6f09-08d6717f8b76 x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600109)(711020)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:MWHPR11MB1984; x-ms-traffictypediagnostic: MWHPR11MB1984: x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(3230021)(908002)(999002)(5005026)(6040522)(8220060)(2401047)(8121501046)(93006095)(93001095)(3231475)(944501520)(52105112)(3002001)(10201501046)(6041310)(20161123564045)(20161123560045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095); SRVR:MWHPR11MB1984; BCL:0; PCL:0; RULEID:; SRVR:MWHPR11MB1984; x-forefront-prvs: 0906E83A25 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(136003)(376002)(346002)(396003)(366004)(199004)(189003)(11346002)(71190400001)(6486002)(2501003)(72206003)(14454004)(2616005)(476003)(97736004)(446003)(5660300001)(478600001)(316002)(6636002)(86362001)(99286004)(54906003)(52116002)(110136005)(71200400001)(6436002)(6512007)(186003)(53936002)(305945005)(7736002)(3846002)(39060400002)(6506007)(386003)(6116002)(105586002)(106356001)(107886003)(68736007)(76176011)(36756003)(4326008)(26005)(81156014)(81166006)(102836004)(8936002)(66066001)(2906002)(486006)(8676002)(256004)(25786009); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR11MB1984; H:MWHPR11MB1920.namprd11.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: microchip.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: ik+SD3we1KefbgkGxJeptwRhWxXF8CeCX2SgTjqI6j0moW5SMLvDVeOwDu0Ua1E+ggpgQpwagrDK+A37c8+oRZWpFopvw+EmlowwtC70PAnRJdD1DhMFrPF6vYqanLbT2KZRGwKSL+ZDwuHAcZskF6xEpNMdyE5t6sL5O7ruS0CjGTqOwe0lqaH1YqAL2n5WvAw9iiaR0/L8XgGfgcdJfe1B4sAfScOD5jloWPjxZiVOj090BPwbjwby5OExAScq+og3inr47o9F8NwCzNdaLIAcy3Rh3qI40iEx0OgZpchWwjcmpLUReOPZO0/RYv+P spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: ca365de5-551b-4e40-6f09-08d6717f8b76 X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Jan 2019 13:29:53.7997 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR11MB1984 X-OriginatorOrg: microchip.com Sender: linux-pwm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pwm@vger.kernel.org From: Claudiu Beznea Add push-pull mode support. In push-pull mode the channels' outputs have same polarities and the edges are complementary delayed for one period. Signed-off-by: Claudiu Beznea --- drivers/pwm/core.c | 3 +++ include/linux/pwm.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index eb444ee8d486..f182d1eb564e 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c @@ -328,6 +328,9 @@ const char *pwm_get_mode_name(unsigned long modebit) if (modebit == PWM_MODE_BIT(COMPLEMENTARY)) return "complementary"; + if (modebit == PWM_MODE_BIT(PUSH_PULL)) + return "push-pull"; + return "normal"; } diff --git a/include/linux/pwm.h b/include/linux/pwm.h index 3d89343bc405..629754902ab0 100644 --- a/include/linux/pwm.h +++ b/include/linux/pwm.h @@ -29,11 +29,14 @@ enum pwm_polarity { * PWM modes capabilities * @PWM_MODE_NORMAL: PWM has one output * @PWM_MODE_COMPLEMENTARY: PWM has 2 outputs with opposite polarities + * @PWM_MODE_PUSH_PULL: PWM has 2 outputs with same polarities and the edges + * are complementary delayed for one period * @PWM_MODE_CNT: PWM modes count */ enum pwm_mode { PWM_MODE_NORMAL, PWM_MODE_COMPLEMENTARY, + PWM_MODE_PUSH_PULL, PWM_MODE_CNT, }; From patchwork Thu Jan 3 13:29:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudiu Beznea X-Patchwork-Id: 1020293 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pwm-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=microchip.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.b="SbQ9qzc6"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Vpgm4p18z9sCX for ; Fri, 4 Jan 2019 00:30:12 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731780AbfACNaB (ORCPT ); Thu, 3 Jan 2019 08:30:01 -0500 Received: from esa5.microchip.iphmx.com ([216.71.150.166]:27261 "EHLO esa5.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731409AbfACNaA (ORCPT ); Thu, 3 Jan 2019 08:30:00 -0500 X-IronPort-AV: E=Sophos;i="5.56,435,1539673200"; d="scan'208";a="22933262" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa5.microchip.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 03 Jan 2019 06:29:59 -0700 Received: from NAM03-CO1-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.76.105) with Microsoft SMTP Server (TLS) id 14.3.352.0; Thu, 3 Jan 2019 06:30:31 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector1-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=gbW1EiKkgAj/gBxHMet2Sam7zBrYJeYeJuf2xaMqGnY=; b=SbQ9qzc6cCwi2IRrtliRYg5xU5+KRctbLcGMKHqZrDx5x0dI+5izwFV6135N5prbErvaSMiQwwUx28VpfOJnXA9AAj783aOqBd+pBnDH1SOY6zW+Z2e852WsKlIHiGAHdz+sa/TKfrM5TmrQvstaJ00+vbYKMXKI5RdPCsqqR5w= Received: from MWHPR11MB1920.namprd11.prod.outlook.com (10.175.54.19) by MWHPR11MB1984.namprd11.prod.outlook.com (10.175.54.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1495.6; Thu, 3 Jan 2019 13:29:57 +0000 Received: from MWHPR11MB1920.namprd11.prod.outlook.com ([fe80::e553:ff9d:8c0b:9627]) by MWHPR11MB1920.namprd11.prod.outlook.com ([fe80::e553:ff9d:8c0b:9627%6]) with mapi id 15.20.1495.005; Thu, 3 Jan 2019 13:29:57 +0000 From: To: , , , , CC: , , , , Subject: [PATCH v8 5/6] pwm: add documentation for pwm push-pull mode Thread-Topic: [PATCH v8 5/6] pwm: add documentation for pwm push-pull mode Thread-Index: AQHUo2hrpXORaGbfU06xWvz69aRPVA== Date: Thu, 3 Jan 2019 13:29:57 +0000 Message-ID: <1546522081-23659-6-git-send-email-claudiu.beznea@microchip.com> References: <1546522081-23659-1-git-send-email-claudiu.beznea@microchip.com> In-Reply-To: <1546522081-23659-1-git-send-email-claudiu.beznea@microchip.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: VI1PR07CA0209.eurprd07.prod.outlook.com (2603:10a6:802:3f::33) To MWHPR11MB1920.namprd11.prod.outlook.com (2603:10b6:300:110::19) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Claudiu.Beznea@microchip.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [94.177.32.154] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; MWHPR11MB1984; 6:tflFfglim7X03m8+5nCzxDIp8WFnQwuAbPGJJ3DlphuXJX6z0Fg6T4uqAdJotGSTWql49ykhdmr7QPT9yd5QYzVDsHMyUUyjReTq792hD0fpOTf2u0IPVrU26AL88izuX/x06NNFi4x7vokkd4NsV8NrAwbnkdn+kEhrzPi9uL30HAzzXh8l/tLv3vRpFuefqgv9DTps8agil0wxMTxOond/SDBaGeP+BmdTeuA7Wzjvw7a7KmNM3p39ETk9jO2xFioukdmsxhQjQSe4Poj3CnnZcQXDW90DrYYM+sVL6CR+MN6757gW9/aaFbIIATZnCCcL23LTdG06rmK9aDuG53zt++i3NcV9EVVyLi47J8JrI+sZGcokxToAa+HUnlgfwsWoIhg0wTBWdlqzrnQeAzteDQRlKEN1dbtGJ1KMBasulXMlU0v4ftC1AA7UghiyzgJK2VLcfKpJbbkDREFPjw==; 5:OxVYLVpDrgysI0hnhrWxYHnQoN8a+FqAMzRb2gxWqXKiVnC05gsKNV2XjUMTpZn+A2KWLjiEMdfNB7NbQ2HPlWCjQ9jDrx0POtM2Z3AIOOclfikBFLgMYgtmEIh1SxMX9adBGJWo0mbDQPnHHZHHQGLAcPL20jEb9TyeXouWeGZnd/yB+KyXrSLvRY6JzmGQmuK7qMyAmMDxqttWY9pG0g==; 7:v+Y1/DPiEYvjRol+5eP+5ueNE6eKaqxkDPrTA8eZmlT1PyC3daxXbAsxKvCvw+tpmBvaxJykK9fjx6LTBH/0zyXe3FeCzl6LT9ykkVZobz7OovbxEs+uZcyFfvbiy2n03Mbyyl/FpnSI84hrZoRZ5A== x-ms-office365-filtering-correlation-id: 5255ddc9-f2cd-4eb5-58ff-08d6717f8d7d x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600109)(711020)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:MWHPR11MB1984; x-ms-traffictypediagnostic: MWHPR11MB1984: x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(3230021)(908002)(999002)(5005026)(6040522)(8220060)(2401047)(8121501046)(93006095)(93001095)(3231475)(944501520)(52105112)(3002001)(10201501046)(6041310)(20161123564045)(20161123560045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095); SRVR:MWHPR11MB1984; BCL:0; PCL:0; RULEID:; SRVR:MWHPR11MB1984; x-forefront-prvs: 0906E83A25 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(136003)(376002)(346002)(396003)(366004)(199004)(189003)(11346002)(71190400001)(6486002)(2501003)(72206003)(14454004)(2616005)(476003)(97736004)(446003)(5660300001)(478600001)(316002)(6636002)(86362001)(99286004)(54906003)(52116002)(110136005)(71200400001)(6436002)(6512007)(186003)(53936002)(305945005)(7736002)(3846002)(39060400002)(6506007)(386003)(6116002)(105586002)(106356001)(107886003)(68736007)(76176011)(36756003)(4326008)(26005)(81156014)(81166006)(102836004)(8936002)(66066001)(2906002)(486006)(8676002)(256004)(25786009); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR11MB1984; H:MWHPR11MB1920.namprd11.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: microchip.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: gms4XmnVFhH4KgLZZKtvJvT/CWGMgDQcGhu+iFz1sBUimJYDTMe+qz/g+2vfzwtBtKSiegVynLqBABm6xVE35CoubxeZTPrlHJqLpsc8MjSWFrdMIhcbNyLXh9Rq7piH5AJs+/KmAFBQZpMksI0zgj9PQftSKQaqSIRyoXtECCzU7M+JpaO3oebAReKxpOWF8/LA/CcA3sC4sFuiesMSkVyozoV0YUSCJmeneb0XtrYeLTBGclK9TZPJ4ETuM91sigDrmVIhsIWUiGXxLhabrBEsXB7DRdS2FzPXh2CnCOmx4Abv799/BKyiJIKtbqdH spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: 5255ddc9-f2cd-4eb5-58ff-08d6717f8d7d X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Jan 2019 13:29:57.1824 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR11MB1984 X-OriginatorOrg: microchip.com Sender: linux-pwm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pwm@vger.kernel.org From: Claudiu Beznea Add documentation for PWM push-pull mode. Signed-off-by: Claudiu Beznea --- Documentation/pwm.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Documentation/pwm.txt b/Documentation/pwm.txt index 669fd4c9cc8e..80552627627d 100644 --- a/Documentation/pwm.txt +++ b/Documentation/pwm.txt @@ -130,6 +130,22 @@ channel that was exported. The following properties will then be available: PWMx_1 |__| |__| |__| |__| ^ ^ ^ ^ + Push-pull mode - for PWM channels with two outputs; output waveforms + for a PWM channel in push-pull mode, with normal polarity looks like + this: + __ __ + PWMx_0 __| |____________| |__________ + __ __ + PWMx_1 __________| |____________| |__ + ^ ^ ^ ^ + + If polarity is inversed: + __ ____________ __________ + PWMx_0 |__| |__| + __________ ____________ __ + PWMx_1 |__| |__| + ^ ^ ^ ^ + Where '^' specifies the beginning of a period. Implementing a PWM driver From patchwork Thu Jan 3 13:30:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudiu Beznea X-Patchwork-Id: 1020292 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pwm-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=microchip.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.b="XCitMKeV"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Vpgl0h1Cz9sBn for ; Fri, 4 Jan 2019 00:30:11 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731409AbfACNaF (ORCPT ); Thu, 3 Jan 2019 08:30:05 -0500 Received: from esa4.microchip.iphmx.com ([68.232.154.123]:64911 "EHLO esa4.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726814AbfACNaE (ORCPT ); Thu, 3 Jan 2019 08:30:04 -0500 X-IronPort-AV: E=Sophos;i="5.56,435,1539673200"; d="scan'208";a="24598646" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa4.microchip.iphmx.com with ESMTP/TLS/AES128-SHA; 03 Jan 2019 06:30:03 -0700 Received: from NAM02-BL2-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.76.37) with Microsoft SMTP Server (TLS) id 14.3.352.0; Thu, 3 Jan 2019 06:30:35 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector1-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=XvVjPyoaV+bK8s4DYjcBuwUc1zpXS76CKb2RhaH4FuE=; b=XCitMKeVSsNk+UUyPmj4fKBAFvKD5NSDD5OptEIVBqCBi/fl4WYkvMQeeSaKihyx+loxf6A62492cfbQUglwgZYxyBrBosNLv4PsOYSptPy6+P5VMi6j9/hF+lsaQjieOFuZUZMupA5sjr1QCcUJLfWuMQ9WW0XXGUmrlVRW6/c= Received: from MWHPR11MB1920.namprd11.prod.outlook.com (10.175.54.19) by MWHPR11MB1984.namprd11.prod.outlook.com (10.175.54.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1495.6; Thu, 3 Jan 2019 13:30:00 +0000 Received: from MWHPR11MB1920.namprd11.prod.outlook.com ([fe80::e553:ff9d:8c0b:9627]) by MWHPR11MB1920.namprd11.prod.outlook.com ([fe80::e553:ff9d:8c0b:9627%6]) with mapi id 15.20.1495.005; Thu, 3 Jan 2019 13:30:00 +0000 From: To: , , , , CC: , , , , Subject: [PATCH v8 6/6] pwm: atmel: add push-pull mode support Thread-Topic: [PATCH v8 6/6] pwm: atmel: add push-pull mode support Thread-Index: AQHUo2hs3Asi3dS+VE+SDxWViVheTw== Date: Thu, 3 Jan 2019 13:30:00 +0000 Message-ID: <1546522081-23659-7-git-send-email-claudiu.beznea@microchip.com> References: <1546522081-23659-1-git-send-email-claudiu.beznea@microchip.com> In-Reply-To: <1546522081-23659-1-git-send-email-claudiu.beznea@microchip.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: VI1PR07CA0209.eurprd07.prod.outlook.com (2603:10a6:802:3f::33) To MWHPR11MB1920.namprd11.prod.outlook.com (2603:10b6:300:110::19) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Claudiu.Beznea@microchip.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [94.177.32.154] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; MWHPR11MB1984; 6:7J/Lek8oSIWdAhYE1g7xObPwB2XNbSAS3n/7e04g4VNvVkFGsyP/bPCpoNFyqdAL+M8umrqSYkUGY2K+2qZtWGP9iiFW1TNmNeoqpH43O2aUM/fDNRGguaueRUl0PEJKA2uAJm2x/uWagzsxaPQJbWW2MAKcmcSpfoMUay2aEjuPBh4d8HpI8Iy5Gtq5WwEa7MANw7Dzl7WOxGQ8zYHUyrdcBJNGLal/Pjje3eRa8HaHhmoPJmPfvo3VTQu0zqF8dgs+xEAs1nEVestGK6279NUgGXrLlpZNxCVu1s7LIoKqR0NbiJr/sBZQCRuqnUhGOoK0ADcCd79IjpVF9924r/vSYLWcEUFn3DSgA8+dwfMOCcxC1gT37F+e3l4F4TkHGdCGc1HK22/rF4gncot7YrZoXJqOuixyYNjM8aYNLH7DXd9BqKgu6fy80YbxKYeEfPukExwAA7kuCpR4L0f5kQ==; 5:B1ronpSTt6aWGuqhaO+xBqh4gU1H5ocCpYg/CBz7zLCwY5KBQcH4eDPkqlGRPubJdC0DyC5mOtia5TZmDOoQKaxZWBnTwky1oecHBiHNLNK3GCSYcwnZVggyofQLw/0lgnNSR0QUW8yAfN1Tc//MJzEHRQi6SFs9sEDeSXW24cBI9FTbPodlKewQVyZmh/MjB3PtZA+PD0sjpbUwjhnWbA==; 7:YH19KO77H0n7LoAh6UePmD5U+9n7E2BLDnCjj4BSLPoj55xXTNG6bC25iXK5ZIGK2k6k/1aaOVZRlLotaev/4OFzar3GXgK9E81ydQ5JT/97++FutroOfCO8wspD7dl9L3LZnY+pyIs7O7VjTmJekQ== x-ms-office365-filtering-correlation-id: ee8cd5a7-c3e5-4010-016a-08d6717f8f54 x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600109)(711020)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:MWHPR11MB1984; x-ms-traffictypediagnostic: MWHPR11MB1984: x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(3230021)(908002)(999002)(5005026)(6040522)(8220060)(2401047)(8121501046)(93006095)(93001095)(3231475)(944501520)(52105112)(3002001)(10201501046)(6041310)(20161123564045)(20161123560045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095); SRVR:MWHPR11MB1984; BCL:0; PCL:0; RULEID:; SRVR:MWHPR11MB1984; x-forefront-prvs: 0906E83A25 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(136003)(376002)(346002)(396003)(366004)(199004)(189003)(11346002)(71190400001)(6486002)(2501003)(72206003)(14454004)(2616005)(476003)(97736004)(446003)(5660300001)(478600001)(316002)(6636002)(575784001)(86362001)(99286004)(54906003)(52116002)(110136005)(71200400001)(6436002)(6512007)(186003)(53936002)(305945005)(7736002)(3846002)(39060400002)(6506007)(386003)(6116002)(105586002)(106356001)(107886003)(68736007)(76176011)(36756003)(4326008)(26005)(81156014)(81166006)(102836004)(8936002)(66066001)(2906002)(486006)(8676002)(256004)(25786009)(14444005); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR11MB1984; H:MWHPR11MB1920.namprd11.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: microchip.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: ok4vjGA1P23XdHYEKQGxSblKMPqr3tSX/+Z36oVbpV+VYBxtE0VKhIrdSMlA23qBaebS8K7xqX0whbsccV4Ao7DCOx0TNXNedW8eBzczg6brsKTcNRO3DhXBGImqt5hUsXj26HZfnO43mZ9mZmzZLVny/yWrXkMJFK8R/R5G9SQ9m7GFddjSwBIDSqDoQ62n9yLNlRMO2rxwL8Hp28FTIudQezIalY79R1yY99C8kV4pzLaxYcUbn8JRvrYm11BUO9JewmhIvnXL9w8dFPLqq6ezpygaAE74E9uFsjXFmmaBbZzIThD9RyCciD/7E8Vh spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: ee8cd5a7-c3e5-4010-016a-08d6717f8f54 X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Jan 2019 13:30:00.1278 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR11MB1984 X-OriginatorOrg: microchip.com Sender: linux-pwm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pwm@vger.kernel.org From: Claudiu Beznea Add support for PWM push-pull mode. This is only supported by SAMA5D2 SoCs. Signed-off-by: Claudiu Beznea --- drivers/pwm/pwm-atmel.c | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/drivers/pwm/pwm-atmel.c b/drivers/pwm/pwm-atmel.c index b72cacd5dca3..650d475a4c34 100644 --- a/drivers/pwm/pwm-atmel.c +++ b/drivers/pwm/pwm-atmel.c @@ -33,8 +33,11 @@ #define PWM_CMR 0x0 /* Bit field in CMR */ -#define PWM_CMR_CPOL (1 << 9) -#define PWM_CMR_UPD_CDTY (1 << 10) +#define PWM_CMR_CPOL BIT(9) +#define PWM_CMR_UPD_CDTY BIT(10) +#define PWM_CMR_DTHI BIT(17) +#define PWM_CMR_DTLI BIT(18) +#define PWM_CMR_PPM BIT(19) #define PWM_CMR_CPRE_MSK 0xF /* The following registers for PWM v1 */ @@ -219,16 +222,19 @@ static int atmel_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, { struct atmel_pwm_chip *atmel_pwm = to_atmel_pwm_chip(chip); struct pwm_state cstate; + struct pwm_caps caps; unsigned long cprd, cdty; u32 pres, val; int ret; pwm_get_state(pwm, &cstate); + pwm_get_caps(pwm, &caps); if (state->enabled) { if (cstate.enabled && cstate.polarity == state->polarity && - cstate.period == state->period) { + cstate.period == state->period && + cstate.modebit == state->modebit) { cprd = atmel_pwm_ch_readl(atmel_pwm, pwm->hwpwm, atmel_pwm->data->regs.period); atmel_pwm_calculate_cdty(state, cprd, &cdty); @@ -263,6 +269,18 @@ static int atmel_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, val &= ~PWM_CMR_CPOL; else val |= PWM_CMR_CPOL; + + /* PWM mode. */ + if (caps.modes_msk & PWM_MODE_BIT(PUSH_PULL)) { + if (state->modebit == PWM_MODE_BIT(PUSH_PULL)) { + val |= PWM_CMR_PPM | PWM_CMR_DTLI; + val &= ~PWM_CMR_DTHI; + } else { + val &= ~(PWM_CMR_PPM | PWM_CMR_DTLI | + PWM_CMR_DTHI); + } + } + atmel_pwm_ch_writel(atmel_pwm, pwm->hwpwm, PWM_CMR, val); atmel_pwm_set_cprd_cdty(chip, pwm, cprd, cdty); mutex_lock(&atmel_pwm->isr_lock); @@ -319,6 +337,20 @@ static const struct atmel_pwm_data atmel_pwm_data_v2 = { }, }; +static const struct atmel_pwm_data atmel_pwm_data_v3 = { + .regs = { + .period = PWMV2_CPRD, + .period_upd = PWMV2_CPRDUPD, + .duty = PWMV2_CDTY, + .duty_upd = PWMV2_CDTYUPD, + }, + .caps = { + .modes_msk = PWM_MODE_BIT(NORMAL) | + PWM_MODE_BIT(COMPLEMENTARY) | + PWM_MODE_BIT(PUSH_PULL), + }, +}; + static const struct platform_device_id atmel_pwm_devtypes[] = { { .name = "at91sam9rl-pwm", @@ -341,7 +373,7 @@ static const struct of_device_id atmel_pwm_dt_ids[] = { .data = &atmel_pwm_data_v2, }, { .compatible = "atmel,sama5d2-pwm", - .data = &atmel_pwm_data_v2, + .data = &atmel_pwm_data_v3, }, { /* sentinel */ },