From patchwork Thu Oct 25 16:11:49 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Murali Karicheri X-Patchwork-Id: 1645831 Return-Path: X-Original-To: patchwork-davinci@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from comal.ext.ti.com (comal.ext.ti.com [198.47.26.152]) by patchwork2.kernel.org (Postfix) with ESMTP id 5A71FDF2AB for ; Thu, 25 Oct 2012 16:21:32 +0000 (UTC) Received: from dlelxv30.itg.ti.com ([172.17.2.17]) by comal.ext.ti.com (8.13.7/8.13.7) with ESMTP id q9PGF0ea027165; Thu, 25 Oct 2012 11:15:00 -0500 Received: from DFLE72.ent.ti.com (dfle72.ent.ti.com [128.247.5.109]) by dlelxv30.itg.ti.com (8.13.8/8.13.8) with ESMTP id q9PGEx5i022867; Thu, 25 Oct 2012 11:15:00 -0500 Received: from dlelxv24.itg.ti.com (172.17.1.199) by dfle72.ent.ti.com (128.247.5.109) with Microsoft SMTP Server id 14.1.323.3; Thu, 25 Oct 2012 11:14:59 -0500 Received: from linux.omap.com (dlelxs01.itg.ti.com [157.170.227.31]) by dlelxv24.itg.ti.com (8.13.8/8.13.8) with ESMTP id q9PGExNo019744; Thu, 25 Oct 2012 11:14:59 -0500 Received: from linux.omap.com (localhost [127.0.0.1]) by linux.omap.com (Postfix) with ESMTP id 80C3E8062B; Thu, 25 Oct 2012 11:14:59 -0500 (CDT) X-Original-To: davinci-linux-open-source@linux.davincidsp.com Delivered-To: davinci-linux-open-source@linux.davincidsp.com Received: from dlelxv30.itg.ti.com (dlelxv30.itg.ti.com [172.17.2.17]) by linux.omap.com (Postfix) with ESMTP id 955158062C for ; Thu, 25 Oct 2012 11:12:03 -0500 (CDT) Received: from DFLE73.ent.ti.com (dfle73.ent.ti.com [128.247.5.110]) by dlelxv30.itg.ti.com (8.13.8/8.13.8) with ESMTP id q9PGC2H0015837; Thu, 25 Oct 2012 11:12:02 -0500 Received: from dlelxv22.itg.ti.com (172.17.1.197) by dfle73.ent.ti.com (128.247.5.110) with Microsoft SMTP Server id 14.1.323.3; Thu, 25 Oct 2012 11:12:02 -0500 Received: from ares-ubuntu.am.dhcp.ti.com (ares-ubuntu.am.dhcp.ti.com [158.218.103.17]) by dlelxv22.itg.ti.com (8.13.8/8.13.8) with ESMTP id q9PGC0NG005692; Thu, 25 Oct 2012 11:12:00 -0500 Received: from a0868495 by ares-ubuntu.am.dhcp.ti.com with local (Exim 4.76) (envelope-from ) id 1TRQ2K-00036f-Is; Thu, 25 Oct 2012 12:12:00 -0400 From: Murali Karicheri To: , , , , , , , , , , , , , Subject: [PATCH v3 03/11] clk: davinci - common clk utilities to init clk driver Date: Thu, 25 Oct 2012 12:11:49 -0400 Message-ID: <1351181518-11882-4-git-send-email-m-karicheri2@ti.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1351181518-11882-1-git-send-email-m-karicheri2@ti.com> References: <1351181518-11882-1-git-send-email-m-karicheri2@ti.com> MIME-Version: 1.0 CC: X-BeenThere: davinci-linux-open-source@linux.davincidsp.com X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: Errors-To: davinci-linux-open-source-bounces@linux.davincidsp.com This is the common clk driver initialization functions for DaVinci SoCs and other SoCs that uses similar hardware architecture. clock.h also defines struct types for clock definitions in a SoC and clock data type for configuring clk-mux. The initialization functions are used by clock initialization code in a specific platform/SoC. Signed-off-by: Murali Karicheri Acked-by: Linus Walleij --- drivers/clk/davinci/clock.c | 112 +++++++++++++++++++++++++++++++++++++++++++ drivers/clk/davinci/clock.h | 80 +++++++++++++++++++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 drivers/clk/davinci/clock.c create mode 100644 drivers/clk/davinci/clock.h diff --git a/drivers/clk/davinci/clock.c b/drivers/clk/davinci/clock.c new file mode 100644 index 0000000..ad02149 --- /dev/null +++ b/drivers/clk/davinci/clock.c @@ -0,0 +1,112 @@ +/* + * clock.c - davinci clock initialization functions for various clocks + * + * Copyright (C) 2006-2012 Texas Instruments. + * Copyright (C) 2008-2009 Deep Root Systems, LLC + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ +#include +#include +#include +#include +#include + +#include "clk-pll.h" +#include "clk-psc.h" +#include "clk-div.h" +#include "clock.h" + +static DEFINE_SPINLOCK(_lock); + +#ifdef CONFIG_CLK_DAVINCI_PLL +struct clk *davinci_pll_clk(const char *name, const char *parent, + u32 phys_pllm, u32 phys_prediv, u32 phys_postdiv, + struct clk_pll_data *pll_data) +{ + struct clk *clkp = NULL; + + pll_data->reg_pllm = ioremap(phys_pllm, 4); + if (WARN_ON(!pll_data->reg_pllm)) + return clkp; + + pll_data->reg_prediv = ioremap(phys_prediv, 4); + if (WARN_ON(!pll_data->reg_prediv)) + goto error1; + + pll_data->reg_postdiv = ioremap(phys_postdiv, 4); + if (WARN_ON(!pll_data->reg_postdiv)) + goto error2; + + return clk_register_davinci_pll(NULL, name, parent, pll_data); +error1: + iounmap(pll_data->reg_pllm); +error2: + iounmap(pll_data->reg_prediv); + return clkp; +} +#else +struct clk *davinci_pll_clk(const char *name, const char *parent, + u32 phys_pllm, u32 phys_prediv, u32 phys_postdiv, + struct clk_pll_data *pll_data) +{ + return NULL; +} +#endif + +struct clk *davinci_mux_clk(const char *name, u8 num_parents, + const char **parents, struct clk_mux_data *data) + +{ + void __iomem *reg; + + reg = ioremap(data->phys_reg, 4); + if (WARN_ON(!reg)) + return NULL; + + return clk_register_mux(NULL, name, parents, num_parents, data->flags, + reg, data->shift, data->width, data->mux_flags, + &_lock); +} + +struct clk *davinci_plldiv_clk(const char *name, const char *parent, + struct clk_plldiv_data *data) +{ + /* + * This is a PLL divider clock with divider specified by + * div_reg in pll_div_data. + */ + data->reg = ioremap(data->phys_div_reg, 4); + if (WARN_ON(!data->reg)) + return NULL; + + return clk_register_davinci_plldiv(NULL, name, parent, data, &_lock); +} + +inline struct clk *davinci_fixed_factor_clk(const char *name, + const char *parent, unsigned long flags, + unsigned int mult, unsigned int div) +{ + if (WARN_ON(!mult)) + return NULL; + + if (WARN_ON(!div)) + return NULL; + + return clk_register_fixed_factor(NULL, name, parent, flags, mult, div); +} + +inline struct clk *davinci_fixed_ref_clk(const char *name, + unsigned long rate) +{ + return clk_register_fixed_rate(NULL, name, NULL, CLK_IS_ROOT, rate); +} + +inline struct clk *davinci_psc_clk(const char *name, const char *parent, + struct clk_psc_data *data) +{ + return clk_register_davinci_psc(NULL, name, parent, data); +} diff --git a/drivers/clk/davinci/clock.h b/drivers/clk/davinci/clock.h new file mode 100644 index 0000000..73204b8 --- /dev/null +++ b/drivers/clk/davinci/clock.h @@ -0,0 +1,80 @@ +/* + * TI DaVinci Clock definitions - Contains Macros and Types used for + * defining various clocks on a DaVinci SoC + * + * Copyright (C) 2012 Texas Instruments + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#ifndef __DAVINCI_CLOCK_H +#define __DAVINCI_CLOCK_H + +#include + +/* general flags: */ +#define ALWAYS_ENABLED BIT(0) + +/** + * struct clk_mux_data - struct for clk mux data to configure clk-mux + * + * @flags: base flags for clk driver + * @mux_flags: mux driver flags + * @shift: shift applied to mux selector bits + * @width: width of the mux selctor bits + * @phys_reg: physical address of the mux register + */ +struct clk_mux_data { + u32 flags; + u8 mux_flags; + u8 shift; + u8 width; + u32 phys_reg; +}; + +/** + * struct davinci_clk - struct for defining DaVinci clocks for a SoC. + * + * @name: name of the clock + * @parent: name of parent clock + * @flags: General flags for all drivers used by platform clock init code + * @data: data specific to a clock used by the driver + * @dev_id: dev_id used to look up this clock. If this is NULL + * clock name is used for lookup. + */ +struct davinci_clk { + const char *name; + const char *parent; + u32 flags; + void *data; + char *dev_id; +}; + +/* function prototypes for initializing various clocks */ +struct clk *davinci_fixed_ref_clk(const char *name, + unsigned long rate); + +struct clk *davinci_pll_clk(const char *name, const char *parent, + u32 phys_pllm, u32 phys_prediv, u32 phys_postdiv, + struct clk_pll_data *pll_data); + + +struct clk *davinci_mux_clk(const char *name, u8 num_parents, + const char **parents, struct clk_mux_data *data); + +struct clk *davinci_plldiv_clk(const char *name, const char *parent, + struct clk_plldiv_data *data); + +struct clk *davinci_psc_clk(const char *name, const char *parent, + struct clk_psc_data *data); + +struct clk *davinci_fixed_factor_clk(const char *name, + const char *parent, unsigned long flags, + unsigned int mult, unsigned int div); +#endif