From patchwork Wed May 29 10:10:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Farouk Bouabid X-Patchwork-Id: 13678617 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5B238C25B75 for ; Wed, 29 May 2024 10:11:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To:In-Reply-To: References:Message-Id:Subject:Date:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=WHJEFNceFyOU0431CsbluFzO/zewlq12TGha7FxJ9GE=; b=Qml8gGQ0l0/b6xeuRcdTFBsIOW ObL4DUUaJuOLt51VM1IGWpAxl5rY5OiBwcuza8hl2wztGLoz/NJzuOQYjHHtY/espAi27caabRuqH cJIS3hTFzTOwi+QKmILBKUWBJlWkafjQ5YZ4QbOUpbZYYs/0Lta+gEjLZLN/hLF/u6BwsAdBMZ3OP 7SQuBADanLYLW1mcr4R4gYyP6qSt6mbrQR47fkwBGiQ1JJ8q17OTp+pbK5+reoBC0P0tv6+E2ySkR Uks2NgKhg4lL/ZbxO/vSKj5pwyZA6b71CDlyc0UzsOP7KtCZqDyWHeG8FutqqWWpJoIpig4KkuQeW pKRrXHIQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sCGHV-00000003kgW-1jTE; Wed, 29 May 2024 10:11:41 +0000 Received: from mail-he1eur04on2070a.outbound.protection.outlook.com ([2a01:111:f403:260f::70a] helo=EUR04-HE1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sCGGx-00000003kKB-0prV; Wed, 29 May 2024 10:11:09 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Vm2WU6PfTW1ja6IbTdyQy5TToFt3X0bgnCsFN8kpbzkU2UVvKxVCKakOU6vwbzxRShqsR1604z/AfPieXd2AdYbyjT+kj/J8CEA3WJ5v9n4kRpdDykSSUug46bljUG4Ad8C4yBcxqoKNh5mhh2Kq9ly53kFh3hOSVgoDTDwg1Xt28GVPfNm9vmRaNgKlzuTQd4c/5M2kBl0wqaFkZUlLhAADSjV9jx50uDngJO+f+tiYgrWW7yEIjqkckD47ftLoEhwf45dNRRmMlZnRajExPVe+3KhDvYRStsGBdSidbo2WauijpKxGH0vb9rLvvG9rOGgT+R2tgRE8+xXVlpYBrA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=T4twgtF8AlVCbeh1HQmFfwG+HUW+NPJvaQHfxGiRjt4=; b=JkJZQ6t/jC3ajQo161kuAA6v2QpKfnJOJkwFGbHnZ23lxgUEyUW2T6GAv5SrdLxORvrvZv1F3KANoiYvgvJ6aShTNW+4LTKQhI7KHHJRpYuNUB3HGVhZVTS6SKILgoRxA1DadksKjLWblTUVTu5Z8xeQR/GHmR2mjrvLNuCj9wS6axFQuOXZLHZlgmRa+NkEaQP0YVrXlhA8rqWH1GV2BMdc9DzNmbqxt/ep29xHaWG2SY6n59G/7CEx7/MeLSojdaEsZNC+TR1WYEyBTbGHCkzLDTS9y/uVgc1w5k4OiA54AAbsbUg22d4SqAibe2lRuZKTCkmYsJ9wucvCiTCdPg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=cherry.de; dmarc=pass action=none header.from=cherry.de; dkim=pass header.d=cherry.de; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cherry.de; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=T4twgtF8AlVCbeh1HQmFfwG+HUW+NPJvaQHfxGiRjt4=; b=FcqTPa7bujQK7luWDGhmafQtlJg5+KR+++MH2FbiJLt5fPHVFx89C81wFzoKnsjZO2nshV9RVedJXk6zJmjkNnhSXzJmqYpGrRRzduiY9sDO1BSnaY4H/mxBKt9IPvlL13JGvMt2qXf5uAweG6stuUN9Dm9sxphIPkOghfP3Adg= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=cherry.de; Received: from VE1PR04MB6382.eurprd04.prod.outlook.com (2603:10a6:803:122::31) by AM9PR04MB8811.eurprd04.prod.outlook.com (2603:10a6:20b:40a::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.19; Wed, 29 May 2024 10:10:53 +0000 Received: from VE1PR04MB6382.eurprd04.prod.outlook.com ([fe80::2a24:328:711:5cd6]) by VE1PR04MB6382.eurprd04.prod.outlook.com ([fe80::2a24:328:711:5cd6%4]) with mapi id 15.20.7633.018; Wed, 29 May 2024 10:10:53 +0000 From: Farouk Bouabid Date: Wed, 29 May 2024 12:10:31 +0200 Subject: [PATCH 2/6] pwm: add mule pwm-over-i2c driver Message-Id: <20240529-buzzer_support-v1-2-fd3eb0a24442@cherry.de> References: <20240529-buzzer_support-v1-0-fd3eb0a24442@cherry.de> In-Reply-To: <20240529-buzzer_support-v1-0-fd3eb0a24442@cherry.de> To: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Quentin Schulz , Heiko Stuebner Cc: linux-pwm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Farouk Bouabid X-Mailer: b4 0.13.0 X-ClientProxiedBy: VI1P194CA0043.EURP194.PROD.OUTLOOK.COM (2603:10a6:803:3c::32) To VE1PR04MB6382.eurprd04.prod.outlook.com (2603:10a6:803:122::31) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VE1PR04MB6382:EE_|AM9PR04MB8811:EE_ X-MS-Office365-Filtering-Correlation-Id: dea58056-80e3-41bf-68ce-08dc7fc79e07 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230031|376005|366007|52116005|1800799015|7416005|38350700005; X-Microsoft-Antispam-Message-Info: =?utf-8?q?+wmVhpVVnnWark8Kh24Y89rIsaBstKd?= =?utf-8?q?Gx0Zb4nkQP4Gcl9VazI/4ZDhTqw7d9ChajYYSTNifk4JlA5ZVrv4zLov7x5z9ZQr0?= =?utf-8?q?KVNjLZLasyx3C/teCQrGN0y4l4jvfVjHeryjfYVx8xcsMyIFj2iDzPSUi/QMJmfLR?= =?utf-8?q?uKy4j/6jHIJ2miJTO9ureHaDEZe6+WddvFXEe71z7Mjc0/3eLjM8dL7gtY4lrxPx5?= =?utf-8?q?qqFWYdRowJBFpUfxMfYaqRgalh1mzz4lfuP8OJScqNJ/OdBFyPLhOQ1+PXaa/kG5b?= =?utf-8?q?96a/FqT1wIcSmr8aBATO3J6UStvI2yTNhKVMd4VcKjiXjC7Ulbps356INWXfvv0Pr?= =?utf-8?q?Jx9fjuofkU9TWljG7vhbIoEj6I/I3PewdCJ9ip1uidPHXphcI2GdWUDmo3w8Ss3/V?= =?utf-8?q?rUvFNspzC6rp/0fiK5CfMGa1ZbW3Om5kvvhgtFcAnDNpppn1NhfP/TNgUrncorRIA?= =?utf-8?q?sQJkDwvgq0b/gAkm369O0Fif0Ch/T44ZaOeviuKdWJKHkUw4DV3Zqs7uNZMYdy/F6?= =?utf-8?q?p8AXHv6og1QufStXXrbRA7V21MLvyKTIFLD3A0rwXCtxBd0xfL6zgYX2/ft3/tv91?= =?utf-8?q?mfm111vkFvVQ2UeJWcRNxb3of9UxxhlJMyCesUA5SyWJPFNNg2RfttUEQT0nzEHNO?= =?utf-8?q?16zVdEh9LilISZwhMLdIm4w8s8s0OykdSP6jkNGCT+FPmGf9BYRp8uHJeMInE1Mmy?= =?utf-8?q?zEJu+hkqY4JRQpGUw5M3l+8Jd19ARLLi8fT1v+/vP34/pONtMVD6tmW8GXZTNGn4X?= =?utf-8?q?RMUQ+DOcR+K2AgnOtngQ6W5I9lXqQmLvbBmWriTNtAp9nIZoXG4cjSi5ylNQ3wU9x?= =?utf-8?q?sDKascfw+oWoDXmwDygj9kYvmuGnf5+XE9lQuLp+7jq2/NbI5gBg9doa+hVUfLsbf?= =?utf-8?q?n7vF2epHBZ6n72GAjNCL1gcQAzO9w0V8FXJ8pnpyzsAi7hIdPmj3pe3+QUVIK3bK5?= =?utf-8?q?3bLE2hcxLSTNqMHgigTeBd4waxgTCprHy13jr6nrJPrZWX2opuua474SUQk9nkdHN?= =?utf-8?q?sPCfOJitw43STzPn3Ry0yYrZ23B3VHewMmQA3H7fkHGMuY5ZvKhUoZnFNZtlClZFx?= =?utf-8?q?yjgtC6hzD9AbMn8eEtTbDlelaI9K1lZB0q3zS8JW+1pbOIHUm4fqOEDQZJ/qsZ/8+?= =?utf-8?q?ISJO0gsFwkxqvuQoMyVaMi0IZN1E1LNXHT+4hiiaorNc4Cq8FpbUzmF3SYQG0+Fhm?= =?utf-8?q?mImQIxbkENy3R1r+DRM3emXQytl0+JyzfmLGaR6XEVprIfNTKQft08Fg60cUTBpqI?= =?utf-8?q?AFsaMf3fXyTIKgq2XTeK5H+QnvTt6hM95UQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VE1PR04MB6382.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(376005)(366007)(52116005)(1800799015)(7416005)(38350700005);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?nR+t3PJSjWQ4b5BBENX8tmjQdtrt?= =?utf-8?q?eZtfNquAvB+d5UHREDNuUVN6PdzbsajWF1zxuogkRrs7TYYfWjjz6C23HfMaHNeTM?= =?utf-8?q?tU2b170MYJ7WUGqdTP5D47f1P3DH/rIftsjTwsjtaRaYcLEoCEc118RN8kpE4l2ax?= =?utf-8?q?XPeC2Xcn1KgVmaVEFO94jAc02s94vZKdt0nxt2vfMwUe66MHD+VyV++RbjGckjKhA?= =?utf-8?q?JLFe6przbWLnHKp2s6O5ysmgmCSvUtEOkQPyOaAcc6KsLQheREPOpr6LiEDvFqrZ0?= =?utf-8?q?Fjz4trnKDKRuDol+LuF1AvvxhpcKKTqxK0hg1g6z5sDws5jPR2HFpRenmnNWNTdZY?= =?utf-8?q?RzFkydHf9jVbtdM2xc2U361EJL6WsmzdrUjwHbhHAlHYvL/9gNbdxVG6gcuVY3nCK?= =?utf-8?q?1M9oHAg3g59TYnjArem/jzjMy3kpszqg9ZOoVMDff+T/RiaZKCpofGCN+4i5TWvcO?= =?utf-8?q?6vxKiEH44O8PxuSvDps/Ww/pyoqwfx3o2Ro7jXY10OX9Cw4S20XGNBb7YMTmsVTGk?= =?utf-8?q?YYBC0sztZDF4/lQ9AtfZo1Tnf8ITRWxCO65mRJ7g290dfcAIS/NuARFDeYPsnnkNJ?= =?utf-8?q?cmS4DzJaHFgazO3AtqKPcID6akfUF2dofu/plRFFqHPZGq9Zw60B02jauglA0r4Za?= =?utf-8?q?g9zfnaiJj2FRNG58sVABq0PMYjqX7WiIfIOa1dwT3xK28zWuXRCJdfQRS3yI/tgc/?= =?utf-8?q?ODPj/jYwHpVMZsa3DrCxw5fPwlc+LsgveeBOZQ9OJe7LfTxFH2GyMykIWfJR1L3LI?= =?utf-8?q?uSWGIepda0xDnkw855AAWWyA64UZjimAHY0+7MGw2lZsAOdnZVxb3LbbdQAeQ4p2e?= =?utf-8?q?7rlHwvXxjlANSttPeqzGDtfLu41acOiInQK6WFRpLIuaz52GqZZiBWQRxUovfJAiX?= =?utf-8?q?KmCA47rBeS6zbHhQaib5FwRR9VVcEruDQKPZEQKhmu+ZJ1zhwCHf7w7WtC8740i18?= =?utf-8?q?izYPsSNWxi6l0EajAjlDwKyvI9gte13t298cou9vvUuiAhGvpl1QKvolCJUch7CXc?= =?utf-8?q?BRtSvBx1fDBrgRr03F5P+7fM7bA/VlxTexxi0zUe++Hp8+OU+3XhbtY6bKyR/oHZI?= =?utf-8?q?lsG6mcDxnyjwOfFvcReL7k+Q0YNtpFxwbKzbgj4G66L4mE0IiUSj7LOi9i36ZFkyX?= =?utf-8?q?dxZuFEQN6O/anfvlUGzJdWgQJG33z+bYZFL4QiXJNsBJTTxqerOmF3xterAIE75Kw?= =?utf-8?q?Y/EUwyz/kwuR8whzjinBq3noQkxKX41tPA8F6vW0dA0e3VAJgsCK/FlmpLo8xKmM+?= =?utf-8?q?BuKdR40a45z7Txt134PiYu1Z3R3poTY7fmqTAkPgqaxAgbWps6FKpNXtk3hIHoDsT?= =?utf-8?q?x9q9mbtYjRnaQBGieKnI2DxU4WXMZ0dmj6h47Bbu+tmvw+2dG1usOnttfvk7Bt2+2?= =?utf-8?q?QK/XqkoBesXHpTq33f5iZuSqD9BAlkWKj6yk7aMMHgkswOL9Dsx6jtEgZVz3R4NvE?= =?utf-8?q?J0/7lkwFI6f14H8p963jlnQhaOiILzAd/Rv1ZiJ9MbJCaKgpQWFHYRBS3sPNCDTP9?= =?utf-8?q?S8eWRVxlI0jJWOuVlWn409iKrBDWMcpN8w=3D=3D?= X-OriginatorOrg: cherry.de X-MS-Exchange-CrossTenant-Network-Message-Id: dea58056-80e3-41bf-68ce-08dc7fc79e07 X-MS-Exchange-CrossTenant-AuthSource: VE1PR04MB6382.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2024 10:10:50.7541 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 5e0e1b52-21b5-4e7b-83bb-514ec460677e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: IR5b+ixpk4cubhVhEXG0nLdlgDgiikNQEvDfbRZGzgnalq0iOwerLzZEv4VB29QOkjWXOuimTnQcqHWwBoZJpFUuzkmwJR/j3gvOE8K9Clc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR04MB8811 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240529_031107_368481_9842E1EA X-CRM114-Status: GOOD ( 22.18 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org Mule is a device that can output a PWM signal based on I2C commands. Add pwm driver for Mule PWM-over-I2C controller. Signed-off-by: Farouk Bouabid --- drivers/pwm/Kconfig | 10 +++++ drivers/pwm/Makefile | 1 + drivers/pwm/pwm-mule.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 126 insertions(+) diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig index 4b956d661755..eb8cfa113ec7 100644 --- a/drivers/pwm/Kconfig +++ b/drivers/pwm/Kconfig @@ -425,6 +425,16 @@ config PWM_MICROCHIP_CORE To compile this driver as a module, choose M here: the module will be called pwm-microchip-core. +config PWM_MULE + tristate "Mule PWM-over-I2C support" + depends on I2C && OF + help + PWM driver for Mule PWM-over-I2C controller. Mule is a device + that can output a PWM signal based on I2C commands. + + To compile this driver as a module, choose M here: the module + will be called pwm-mule. + config PWM_MXS tristate "Freescale MXS PWM support" depends on ARCH_MXS || COMPILE_TEST diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile index c5ec9e168ee7..cdd736ea3244 100644 --- a/drivers/pwm/Makefile +++ b/drivers/pwm/Makefile @@ -38,6 +38,7 @@ obj-$(CONFIG_PWM_MESON) += pwm-meson.o obj-$(CONFIG_PWM_MEDIATEK) += pwm-mediatek.o obj-$(CONFIG_PWM_MICROCHIP_CORE) += pwm-microchip-core.o obj-$(CONFIG_PWM_MTK_DISP) += pwm-mtk-disp.o +obj-$(CONFIG_PWM_MULE) += pwm-mule.o obj-$(CONFIG_PWM_MXS) += pwm-mxs.o obj-$(CONFIG_PWM_NTXEC) += pwm-ntxec.o obj-$(CONFIG_PWM_OMAP_DMTIMER) += pwm-omap-dmtimer.o diff --git a/drivers/pwm/pwm-mule.c b/drivers/pwm/pwm-mule.c new file mode 100644 index 000000000000..e8593a48b16e --- /dev/null +++ b/drivers/pwm/pwm-mule.c @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Mule PWM-over-I2C controller driver + * + * Copyright (C) 2024 Theobroma Systems Design und Consulting GmbH + */ + +#include +#include +#include +#include +#include + +struct mule_pwm { + struct mutex lock; + struct regmap *regmap; +}; + +static const struct regmap_config pwm_mule_config = { + .reg_bits = 8, + .val_bits = 8, +}; + +#define MULE_PWM_DCY_REG 0x0 +#define MULE_PWM_FREQ_L_REG 0x1 /* LSB register */ +#define MULE_PWM_FREQ_H_REG 0x2 /* MSB register */ + +#define NANOSECONDS_TO_HZ(x) (1000000000UL/(x)) + +static int pwm_mule_apply(struct pwm_chip *chip, struct pwm_device *pwm, + const struct pwm_state *state) +{ + struct mule_pwm *priv = pwmchip_get_drvdata(chip); + u8 duty_cycle; + u64 freq; + int ret; + + freq = NANOSECONDS_TO_HZ(state->period); + + if (freq > U16_MAX) /* Frequency is 16-bit wide */ { + dev_err(chip->dev, + "Failed to set frequency: %llu Hz: out of 16-bit range\n", freq); + return -EINVAL; + } + + if (state->enabled) + duty_cycle = pwm_get_relative_duty_cycle(state, 100); + else + duty_cycle = 0; + + mutex_lock(&priv->lock); + + ret = regmap_bulk_write(priv->regmap, MULE_PWM_FREQ_L_REG, &freq, 2); + if (ret) { + dev_err(chip->dev, + "Failed to set frequency: %llu Hz: %d\n", freq, ret); + goto out; + } + + ret = regmap_write(priv->regmap, MULE_PWM_DCY_REG, duty_cycle); + if (ret) + dev_err(chip->dev, + "Failed to set duty cycle: %u: %d\n", duty_cycle, ret); + +out: + mutex_unlock(&priv->lock); + return ret; +} + +static const struct pwm_ops pwm_mule_ops = { + .apply = pwm_mule_apply, +}; + +static int pwm_mule_probe(struct i2c_client *client) +{ + struct device *dev = &client->dev; + struct pwm_chip *chip; + struct mule_pwm *priv; + + chip = devm_pwmchip_alloc(dev, 1, sizeof(*priv)); + if (IS_ERR(chip)) + return PTR_ERR(chip); + + priv = pwmchip_get_drvdata(chip); + + mutex_init(&priv->lock); + + priv->regmap = devm_regmap_init_i2c(client, &pwm_mule_config); + if (IS_ERR(priv->regmap)) + return dev_err_probe(dev, PTR_ERR(priv->regmap), + "Failed to allocate i2c register map\n"); + + chip->ops = &pwm_mule_ops; + + return devm_pwmchip_add(dev, chip); +} + +static const struct of_device_id pwm_mule_of_match[] = { + { .compatible = "tsd,pwm-mule", }, + { }, +}; +MODULE_DEVICE_TABLE(of, pwm_mule_of_match); + +static struct i2c_driver pwm_mule_driver = { + .driver = { + .name = "pwm-mule", + .of_match_table = pwm_mule_of_match, + }, + .probe = pwm_mule_probe, +}; +module_i2c_driver(pwm_mule_driver); + +MODULE_AUTHOR("Farouk Bouabid "); +MODULE_DESCRIPTION("Mule PWM driver"); +MODULE_LICENSE("GPL");