From patchwork Thu Sep 10 07:02:39 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kuninori Morimoto X-Patchwork-Id: 7151191 Return-Path: X-Original-To: patchwork-alsa-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id F09789F1D3 for ; Thu, 10 Sep 2015 07:04:34 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D2429208CA for ; Thu, 10 Sep 2015 07:04:33 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.kernel.org (Postfix) with ESMTP id 3BA8C208D6 for ; Thu, 10 Sep 2015 07:04:32 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id 21E262658A7; Thu, 10 Sep 2015 09:04:28 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Status: No, score=-2.6 required=5.0 tests=BAD_ENC_HEADER,BAYES_00, NO_DNS_FOR_FROM, RCVD_IN_DNSWL_LOW, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from alsa0.perex.cz (localhost [IPv6:::1]) by alsa0.perex.cz (Postfix) with ESMTP id 9CB922657FC; Thu, 10 Sep 2015 09:03:28 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 2A6CA2657B0; Thu, 10 Sep 2015 09:03:23 +0200 (CEST) Received: from relmlie1.idc.renesas.com (relmlor2.renesas.com [210.160.252.172]) by alsa0.perex.cz (Postfix) with ESMTP id 5373C26580E for ; Thu, 10 Sep 2015 09:02:43 +0200 (CEST) Received: from unknown (HELO relmlir1.idc.renesas.com) ([10.200.68.151]) by relmlie1.idc.renesas.com with ESMTP; 10 Sep 2015 16:02:41 +0900 Received: from relmlac4.idc.renesas.com (relmlac4.idc.renesas.com [10.200.69.24]) by relmlir1.idc.renesas.com (Postfix) with ESMTP id E03984CAB0; Thu, 10 Sep 2015 16:02:41 +0900 (JST) Received: by relmlac4.idc.renesas.com (Postfix, from userid 0) id D38D5480A4; Thu, 10 Sep 2015 16:02:41 +0900 (JST) Received: from relmlac4.idc.renesas.com (localhost [127.0.0.1]) by relmlac4.idc.renesas.com (Postfix) with ESMTP id CB52F480A3; Thu, 10 Sep 2015 16:02:41 +0900 (JST) Received: from relmlii1.idc.renesas.com [10.200.68.65] by relmlac4.idc.renesas.com with ESMTP id SAA05920; Thu, 10 Sep 2015 16:02:41 +0900 X-IronPort-AV: E=Sophos;i="5.17,502,1437404400"; d="scan'";a="194139492" Received: from mail-sg2apc01lp0247.outbound.protection.outlook.com (HELO APC01-SG2-obe.outbound.protection.outlook.com) ([65.55.88.247]) by relmlii1.idc.renesas.com with ESMTP/TLS/AES256-SHA; 10 Sep 2015 16:02:40 +0900 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=kuninori.morimoto.gx@renesas.com; Received: from morimoto-PC.renesas.com (211.11.155.144) by HK2PR06MB0596.apcprd06.prod.outlook.com (10.161.187.147) with Microsoft SMTP Server (TLS) id 15.1.262.15; Thu, 10 Sep 2015 07:02:39 +0000 Message-ID: <8737ymoj52.wl%kuninori.morimoto.gx@renesas.com> From: Kuninori Morimoto User-Agent: Wanderlust/2.15.9 Emacs/24.3 Mule/6.0 To: Mark Brown In-Reply-To: <878u8eoj7x.wl%kuninori.morimoto.gx@renesas.com> References: <878u8eoj7x.wl%kuninori.morimoto.gx@renesas.com> MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Date: Thu, 10 Sep 2015 07:02:39 +0000 X-Originating-IP: [211.11.155.144] X-ClientProxiedBy: KAWPR01CA0015.jpnprd01.prod.outlook.com (25.161.24.25) To HK2PR06MB0596.apcprd06.prod.outlook.com (25.161.187.147) X-Microsoft-Exchange-Diagnostics: 1; HK2PR06MB0596; 2:amiMgOvA2APi3s7a2s26HhMmY5benI9CjC4dpBNUZ1UaWmHCaS8PcC1ofg6ZaVCmmZrkUadY3+00qT6V5c06fEnfGtYJPUCxoryaAAEqoOkkqSo1MmxqVkcI5Mu9WHK+b+jYaHd8zNyE4eKhRdQAV79VQR2XgYc/soecbu4pbZI=; 3:hUey/01vFpBS/UkYbiM8JYb3SmpL63n1OLcSFbuDdMdxZhNFpyTrWvTdGUSUgzOkYPe6tEp4Xj1AYfPK0SZCSO3wC2ou7BuN3Z4rfkxNmFKmzdbt/fqp04CwBkOOztCxO/6uF47CFMv3DNj4RTPEHA==; 25:GlMt/0JOpRKXu37XLLlQqNWaUFhU5RDQQIQDmgYn0flgprzOZf1ma2+/fe6MEm7db87vAmVvNCMzIMc3tY88rObDWGqIunRqOKlv1UyBwcZ9CJ3ByYIzlyoSyI37sH6ckUMyfDRiVb4SwwQUNGs1Kdg352ycbbtH8ygkfPfI8r3DmnbHuhXn7J5QUIWhMm3zcJeWguhMk60UASY+ykCn/ohcBtk4IU7A5Mu1ZBZGTeWwz3eSnS3MXUTlbG8Yq1eT X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:HK2PR06MB0596; X-Microsoft-Exchange-Diagnostics: 1; HK2PR06MB0596; 20:wE6G5laO/PoU4n17pYgDhuu0vhdYBdwfRC7NGkSwq9t3mFn3NghFT0DsYS1wO2p4AxfQWVBmPKCqULamZNPGgYipQSVsu21Db9UJtGLVCLXkyOgSFW9AbhYfMCZoaGrvnKlj/jipL/x/D1zE0WpeEAibv2gAk2SxTqev9CIz5Cc2W0Ty1o/ksiKGqsCQi5EV3DjrnvCA2YQGGziAM5HiU9GhgFFXlujsT1nldL3WolykKSFR3c8x7QT15fLhWlcmrgKNjneOvBulfWzOqwDtK8uRRndY3PkUJqVYN6eMeYrHwN2GNwKlTQXdVrmfUAne5xwaiIqY51FuhGx+V7dvfLMYTeCKFWRKweEQ7I+f6vmNArC6M0GoruTKCimo/Rl7LPT2U4heQSnVmvuIdbWO97HPeBURYWYBGQ8s4WjqQMMmbS1UsyX/JrSzJN8Q3zRPt2vVzIOx2jKykvsO1ViRhBNIVPzfO4I/2fbOpwfKE6s+W8d8dkru5uUtyt3Esfqx; 4:nzehIRtCgQTMsskBmVl5tm+WBHqVgesRns4aGBUBy0Ti7jVKaE+2TqvM8SVztkVLO9L1Vk3pySqBXE3hm/vjhoT1TBxVBzC+3TOmkRlDYEQBBYdX+RqgT8DZet98a7WtYP+HWL6gWkzLQP+lGQX63i3hoUMaruIerZVDuIEvfn3p72HJzO1Tz+Q6geNaU8csU+RuKtSmKs7gk/EUCwaCDvPFie5+7rsIpodBCJtSCMkKVgzT2cEcn8qJFqNQihJUW8EJLwAFGXiJEKt16j4QBZDUnHlgvELI/oRcLEgGRAWowl7B4mh6evtCQU/m/jtF X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5005006)(8121501046)(3002001); SRVR:HK2PR06MB0596; BCL:0; PCL:0; RULEID:; SRVR:HK2PR06MB0596; X-Forefront-PRVS: 06952FC175 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(199003)(189002)(87976001)(46102003)(23726002)(46406003)(76176999)(33646002)(83506001)(64706001)(5007970100001)(81156007)(62966003)(19580395003)(68736005)(77156002)(19580405001)(92566002)(5004730100002)(50466002)(229853001)(77096005)(106356001)(105586002)(4001350100001)(2950100001)(4001540100001)(5001860100001)(53416004)(50986999)(40100003)(54356999)(122386002)(101416001)(66066001)(69596002)(47776003)(36756003)(5001960100002)(110136002)(86362001)(42186005)(97736004)(5001830100001)(5001920100001)(189998001); DIR:OUT; SFP:1102; SCL:1; SRVR:HK2PR06MB0596; H:morimoto-PC.renesas.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HK2PR06MB0596; 23:A5Q2fBZHSyX7kaNo8DrJRHu78LLYo6oMrhpSU0pCX?= =?us-ascii?Q?hPbznfFVbaaZZX3qG4ZDBjZpE9KyPAEJJDcEt0rX7z1CWmt9dLUpyph+z27M?= =?us-ascii?Q?LSvsrYhfIZF/F33JalHV/0utsCGVoK2Ays49BmTIkrWHdISz732CsooxPFaa?= =?us-ascii?Q?zaXf2zNYIGE3gqw3KIbTTwDsP+JzVHFwL9WcW9w8+aM8XuI0DviEqr9TMB90?= =?us-ascii?Q?KJMdc2S7Unf8GXpXpf0veBKKVRwTZl0fcmVRlKHUczNrERddD6xEURC4RGEx?= =?us-ascii?Q?oEbmiDnWqKbX8gIj+qTqkKR510GN3ssjNZs8KoljTRYiyKJHiank+oUS7srs?= =?us-ascii?Q?cZIccyxZVJ58oxP8wjAEmw0O6rStYqShCdWAMnayd3+TRmULX3Jx/zGB1vi7?= =?us-ascii?Q?R11vX3h1720mjPEILhMBMCA4IzOaghi8p+53IdWjOHZ5zO3QYsFRrfbkai8l?= =?us-ascii?Q?CnhbyoQq0YhHOPRNbpduopbCGnBN5jHahBwmxQ7igrdzeDyoDptD/mvbG8iM?= =?us-ascii?Q?3CZht9pI5h+qNja+nViN24gij4gm9brLQ0RcdoHQMkRUZZVGgUxeSAe8l33W?= =?us-ascii?Q?NwpPMxCf6UWpk8mM91MyU3mHj6dWfsCVn5RM5c+7LI85wcNJavIsr8tR1VzI?= =?us-ascii?Q?voDF/XU4PO6DffXECa0NSJ9eUQmIc3J4c7xlIl83LE4cTcgbFi2f+LAH2z1D?= =?us-ascii?Q?XUJOpx9XIGAV1qUR6YL2MzbYabuxznMVtAr9hM0YK+S8uvgUAs+XAN+Kl1eL?= =?us-ascii?Q?Oi+UvLnqy2tTUA+RMYBvwUH8BwxfwMqF/sTzprk6ZWwizov3SP12jUk3FJ4X?= =?us-ascii?Q?yrtosQ/cyZsaMtsRiz4XjKWMagNjzXaFJA4WPlVei1HCX0xIVXr6adZ6V0Dt?= =?us-ascii?Q?dD61T2L9h2StuzUyvuIfYOrH/+aIppgCrGBuDnfvkRzMg64i2I9sqXStQESe?= =?us-ascii?Q?jrO0apvC2pfVTU8mU4J9Sq1YUX3+WUtZ5BE5RoK+5zVZJAZii0D3GovvglaT?= =?us-ascii?Q?aIMu+xD5yvbApUQwSyYNCwe5uN/EUgeU6FkSAxLWwQxEoyDbwiPYly/TeI28?= =?us-ascii?Q?7HPDcDBhDbti1XDaViw+chwC7uhLXgtD2ObA/7UwarZ3EyeUAZV6XvwrokGw?= =?us-ascii?Q?EI62sLnq/JFr2/5T7t5uSv7qkkp8e50gT8UGtIfR4126MLNVZrn5G5fZ5RUF?= =?us-ascii?Q?uNHeRDALxe5MFEACGlEifrpt9KWYWszNKpm/w2SpJKCsHI7kp+SsgkGPhQae?= =?us-ascii?Q?t1dm9Rr7REH/6NlzEjrMLeXS6MYsmk3ZOun4PBk?= X-Microsoft-Exchange-Diagnostics: 1; HK2PR06MB0596; 5:xyDG6VFjB7PyW12Vi3MMzi3PM/+3HczjJ3bN4+StE+e54HxrwA1u+wrqjJx5SJP1zw+yHkpaBe+tjg1mN9M1D05mw+SUEkiKak6NWoIO28Efjf0uhPJB587zCwbYQgeojJFnDGIjpDiT1pr4wIRjDA==; 24:Jf05hOjrBAvdf7FdHQY78/IdKV4jMeco+zurCKpTB+HcaFvatXXvkAk9BCf9cRbZZ9wLZrRK5TKHUxB1gUJmpEtRgb+HumtlxOtasNs2tFI=; 20:EDEyEPMSZyeD5Lk5rwxQJnyS3miy2y7pNmY+45MKmpFfYzAmagQ//mPH+GtsCGRolgO9FTAmNt6WHWcLc+pi1bfXzx37/p5PdOq61VVyalgDkPVKlTePg+sQ1Gl5auch450dNVEAYuHsB6aU0IaLJ+Pgmj92BX9b74cxoF4P5Os= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Sep 2015 07:02:39.1023 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HK2PR06MB0596 Cc: Linux-ALSA , Simon , Liam Girdwood Subject: [alsa-devel] [PATCH 3/9] ASoC: rsnd: ADG uses mod base common method X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Kuninori Morimoto Renesas sound has ADG IP, but it is special device. (It is clock generater, and it doesn't need MSTP) Thus, ADG didn't use mod base common method on rsnd driver. But it can be confusable point. Let's use common method Signed-off-by: Kuninori Morimoto --- sound/soc/sh/rcar/adg.c | 67 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c index b512be8..9ff1736 100644 --- a/sound/soc/sh/rcar/adg.c +++ b/sound/soc/sh/rcar/adg.c @@ -15,8 +15,13 @@ #define CLKI 3 #define CLKMAX 4 +static struct rsnd_mod_ops adg_ops = { + .name = "adg", +}; + struct rsnd_adg { struct clk *clk[CLKMAX]; + struct rsnd_mod mod; int rbga_rate_for_441khz_div_6; /* RBGA */ int rbgb_rate_for_48khz_div_6; /* RBGB */ @@ -59,6 +64,9 @@ static u32 rsnd_adg_ssi_ws_timing_gen2(struct rsnd_dai_stream *io) int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod, struct rsnd_dai_stream *io) { + struct rsnd_priv *priv = rsnd_mod_to_priv(mod); + struct rsnd_adg *adg = rsnd_priv_to_adg(priv); + struct rsnd_mod *adg_mod = rsnd_mod_get(adg); int id = rsnd_mod_id(mod); int shift = (id % 2) ? 16 : 0; u32 mask, val; @@ -68,7 +76,7 @@ int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod, val = val << shift; mask = 0xffff << shift; - rsnd_mod_bset(mod, CMDOUT_TIMSEL, mask, val); + rsnd_mod_bset(adg_mod, CMDOUT_TIMSEL, mask, val); return 0; } @@ -77,6 +85,9 @@ static int rsnd_adg_set_src_timsel_gen2(struct rsnd_mod *mod, struct rsnd_dai_stream *io, u32 timsel) { + struct rsnd_priv *priv = rsnd_mod_to_priv(mod); + struct rsnd_adg *adg = rsnd_priv_to_adg(priv); + struct rsnd_mod *adg_mod = rsnd_mod_get(adg); int is_play = rsnd_io_is_play(io); int id = rsnd_mod_id(mod); int shift = (id % 2) ? 16 : 0; @@ -94,24 +105,24 @@ static int rsnd_adg_set_src_timsel_gen2(struct rsnd_mod *mod, switch (id / 2) { case 0: - rsnd_mod_bset(mod, SRCIN_TIMSEL0, mask, in); - rsnd_mod_bset(mod, SRCOUT_TIMSEL0, mask, out); + rsnd_mod_bset(adg_mod, SRCIN_TIMSEL0, mask, in); + rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL0, mask, out); break; case 1: - rsnd_mod_bset(mod, SRCIN_TIMSEL1, mask, in); - rsnd_mod_bset(mod, SRCOUT_TIMSEL1, mask, out); + rsnd_mod_bset(adg_mod, SRCIN_TIMSEL1, mask, in); + rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL1, mask, out); break; case 2: - rsnd_mod_bset(mod, SRCIN_TIMSEL2, mask, in); - rsnd_mod_bset(mod, SRCOUT_TIMSEL2, mask, out); + rsnd_mod_bset(adg_mod, SRCIN_TIMSEL2, mask, in); + rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL2, mask, out); break; case 3: - rsnd_mod_bset(mod, SRCIN_TIMSEL3, mask, in); - rsnd_mod_bset(mod, SRCOUT_TIMSEL3, mask, out); + rsnd_mod_bset(adg_mod, SRCIN_TIMSEL3, mask, in); + rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL3, mask, out); break; case 4: - rsnd_mod_bset(mod, SRCIN_TIMSEL4, mask, in); - rsnd_mod_bset(mod, SRCOUT_TIMSEL4, mask, out); + rsnd_mod_bset(adg_mod, SRCIN_TIMSEL4, mask, in); + rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL4, mask, out); break; } @@ -125,6 +136,7 @@ int rsnd_adg_set_convert_clk_gen2(struct rsnd_mod *mod, { struct rsnd_priv *priv = rsnd_mod_to_priv(mod); struct rsnd_adg *adg = rsnd_priv_to_adg(priv); + struct rsnd_mod *adg_mod = rsnd_mod_get(adg); struct device *dev = rsnd_priv_to_dev(priv); int idx, sel, div, step, ret; u32 val, en; @@ -180,7 +192,7 @@ int rsnd_adg_set_convert_clk_gen2(struct rsnd_mod *mod, return ret; } - rsnd_mod_bset(mod, DIV_EN, en, en); + rsnd_mod_bset(adg_mod, DIV_EN, en, en); dev_dbg(dev, "convert rate %d <-> %d\n", src_rate, dst_rate); @@ -201,6 +213,7 @@ int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv, unsigned int dst_rate) { struct rsnd_adg *adg = rsnd_priv_to_adg(priv); + struct rsnd_mod *adg_mod = rsnd_mod_get(adg); struct device *dev = rsnd_priv_to_dev(priv); int idx, sel, div, shift; u32 mask, val; @@ -237,13 +250,13 @@ find_rate: switch (id / 4) { case 0: - rsnd_mod_bset(mod, AUDIO_CLK_SEL3, mask, val); + rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL3, mask, val); break; case 1: - rsnd_mod_bset(mod, AUDIO_CLK_SEL4, mask, val); + rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL4, mask, val); break; case 2: - rsnd_mod_bset(mod, AUDIO_CLK_SEL5, mask, val); + rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL5, mask, val); break; } @@ -258,6 +271,9 @@ find_rate: static void rsnd_adg_set_ssi_clk(struct rsnd_mod *mod, u32 val) { + struct rsnd_priv *priv = rsnd_mod_to_priv(mod); + struct rsnd_adg *adg = rsnd_priv_to_adg(priv); + struct rsnd_mod *adg_mod = rsnd_mod_get(adg); int id = rsnd_mod_id(mod); int shift = (id % 4) * 8; u32 mask = 0xFF << shift; @@ -273,13 +289,13 @@ static void rsnd_adg_set_ssi_clk(struct rsnd_mod *mod, u32 val) switch (id / 4) { case 0: - rsnd_mod_bset(mod, AUDIO_CLK_SEL0, mask, val); + rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL0, mask, val); break; case 1: - rsnd_mod_bset(mod, AUDIO_CLK_SEL1, mask, val); + rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL1, mask, val); break; case 2: - rsnd_mod_bset(mod, AUDIO_CLK_SEL2, mask, val); + rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL2, mask, val); break; } } @@ -299,6 +315,7 @@ int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate) { struct rsnd_priv *priv = rsnd_mod_to_priv(mod); struct rsnd_adg *adg = rsnd_priv_to_adg(priv); + struct rsnd_mod *adg_mod = rsnd_mod_get(adg); struct device *dev = rsnd_priv_to_dev(priv); struct clk *clk; int i; @@ -342,9 +359,9 @@ int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate) found_clock: /* see rsnd_adg_ssi_clk_init() */ - rsnd_mod_bset(mod, SSICKR, 0x00FF0000, adg->ckr); - rsnd_mod_write(mod, BRRA, 0x00000002); /* 1/6 */ - rsnd_mod_write(mod, BRRB, 0x00000002); /* 1/6 */ + rsnd_mod_bset(adg_mod, SSICKR, 0x00FF0000, adg->ckr); + rsnd_mod_write(adg_mod, BRRA, 0x00000002); /* 1/6 */ + rsnd_mod_write(adg_mod, BRRB, 0x00000002); /* 1/6 */ /* * This "mod" = "ssi" here. @@ -421,6 +438,14 @@ int rsnd_adg_probe(struct platform_device *pdev, return -ENOMEM; } + /* + * ADG is special module. + * Use ADG mod without rsnd_mod_init() to make debug easy + * for rsnd_write/rsnd_read + */ + adg->mod.ops = &adg_ops; + adg->mod.priv = priv; + adg->clk[CLKA] = devm_clk_get(dev, "clk_a"); adg->clk[CLKB] = devm_clk_get(dev, "clk_b"); adg->clk[CLKC] = devm_clk_get(dev, "clk_c");