Loading arch/arm/Kconfig +4 −0 Original line number Diff line number Diff line Loading @@ -211,6 +211,7 @@ config ARCH_INTEGRATOR bool "ARM Ltd. Integrator family" select ARM_AMBA select HAVE_CLK select COMMON_CLKDEV select ICST525 help Support for ARM's Integrator platform. Loading @@ -219,6 +220,7 @@ config ARCH_REALVIEW bool "ARM Ltd. RealView family" select ARM_AMBA select HAVE_CLK select COMMON_CLKDEV select ICST307 select GENERIC_TIME select GENERIC_CLOCKEVENTS Loading @@ -230,6 +232,7 @@ config ARCH_VERSATILE select ARM_AMBA select ARM_VIC select HAVE_CLK select COMMON_CLKDEV select ICST307 select GENERIC_TIME select GENERIC_CLOCKEVENTS Loading Loading @@ -477,6 +480,7 @@ config ARCH_PXA select ARCH_MTD_XIP select GENERIC_GPIO select HAVE_CLK select COMMON_CLKDEV select ARCH_REQUIRE_GPIOLIB select GENERIC_TIME select GENERIC_CLOCKEVENTS Loading arch/arm/common/Kconfig +3 −0 Original line number Diff line number Diff line Loading @@ -33,3 +33,6 @@ config SHARPSL_PM config SHARP_SCOOP bool config COMMON_CLKDEV bool arch/arm/common/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -17,3 +17,4 @@ obj-$(CONFIG_SHARP_SCOOP) += scoop.o obj-$(CONFIG_ARCH_IXP2000) += uengine.o obj-$(CONFIG_ARCH_IXP23XX) += uengine.o obj-$(CONFIG_PCI_HOST_ITE8152) += it8152.o obj-$(CONFIG_COMMON_CLKDEV) += clkdev.o arch/arm/common/clkdev.c 0 → 100644 +128 −0 Original line number Diff line number Diff line /* * arch/arm/common/clkdev.c * * Copyright (C) 2008 Russell King. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Helper for the clk API to assist looking up a struct clk. */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/device.h> #include <linux/list.h> #include <linux/errno.h> #include <linux/err.h> #include <linux/string.h> #include <linux/mutex.h> #include <asm/clkdev.h> #include <mach/clkdev.h> static LIST_HEAD(clocks); static DEFINE_MUTEX(clocks_mutex); static struct clk *clk_find(const char *dev_id, const char *con_id) { struct clk_lookup *p; struct clk *clk = NULL; int match, best = 0; list_for_each_entry(p, &clocks, node) { if ((p->dev_id && !dev_id) || (p->con_id && !con_id)) continue; match = 0; if (p->dev_id) match += 2 * (strcmp(p->dev_id, dev_id) == 0); if (p->con_id) match += 1 * (strcmp(p->con_id, con_id) == 0); if (match == 0) continue; if (match > best) { clk = p->clk; best = match; } } return clk; } struct clk *clk_get(struct device *dev, const char *con_id) { const char *dev_id = dev ? dev_name(dev) : NULL; struct clk *clk; mutex_lock(&clocks_mutex); clk = clk_find(dev_id, con_id); if (clk && !__clk_get(clk)) clk = NULL; mutex_unlock(&clocks_mutex); return clk ? clk : ERR_PTR(-ENOENT); } EXPORT_SYMBOL(clk_get); void clk_put(struct clk *clk) { __clk_put(clk); } EXPORT_SYMBOL(clk_put); void clkdev_add(struct clk_lookup *cl) { mutex_lock(&clocks_mutex); list_add_tail(&cl->node, &clocks); mutex_unlock(&clocks_mutex); } EXPORT_SYMBOL(clkdev_add); #define MAX_DEV_ID 20 #define MAX_CON_ID 16 struct clk_lookup_alloc { struct clk_lookup cl; char dev_id[MAX_DEV_ID]; char con_id[MAX_CON_ID]; }; struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id, const char *dev_fmt, ...) { struct clk_lookup_alloc *cla; cla = kzalloc(sizeof(*cla), GFP_KERNEL); if (!cla) return NULL; cla->cl.clk = clk; if (con_id) { strlcpy(cla->con_id, con_id, sizeof(cla->con_id)); cla->cl.con_id = cla->con_id; } if (dev_fmt) { va_list ap; va_start(ap, dev_fmt); vscnprintf(cla->dev_id, sizeof(cla->dev_id), dev_fmt, ap); cla->cl.dev_id = cla->dev_id; va_end(ap); } return &cla->cl; } EXPORT_SYMBOL(clkdev_alloc); /* * clkdev_drop - remove a clock dynamically allocated */ void clkdev_drop(struct clk_lookup *cl) { mutex_lock(&clocks_mutex); list_del(&cl->node); mutex_unlock(&clocks_mutex); kfree(cl); } EXPORT_SYMBOL(clkdev_drop); arch/arm/include/asm/clkdev.h 0 → 100644 +30 −0 Original line number Diff line number Diff line /* * arch/arm/include/asm/clkdev.h * * Copyright (C) 2008 Russell King. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Helper for the clk API to assist looking up a struct clk. */ #ifndef __ASM_CLKDEV_H #define __ASM_CLKDEV_H struct clk; struct clk_lookup { struct list_head node; const char *dev_id; const char *con_id; struct clk *clk; }; struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id, const char *dev_fmt, ...); void clkdev_add(struct clk_lookup *cl); void clkdev_drop(struct clk_lookup *cl); #endif Loading
arch/arm/Kconfig +4 −0 Original line number Diff line number Diff line Loading @@ -211,6 +211,7 @@ config ARCH_INTEGRATOR bool "ARM Ltd. Integrator family" select ARM_AMBA select HAVE_CLK select COMMON_CLKDEV select ICST525 help Support for ARM's Integrator platform. Loading @@ -219,6 +220,7 @@ config ARCH_REALVIEW bool "ARM Ltd. RealView family" select ARM_AMBA select HAVE_CLK select COMMON_CLKDEV select ICST307 select GENERIC_TIME select GENERIC_CLOCKEVENTS Loading @@ -230,6 +232,7 @@ config ARCH_VERSATILE select ARM_AMBA select ARM_VIC select HAVE_CLK select COMMON_CLKDEV select ICST307 select GENERIC_TIME select GENERIC_CLOCKEVENTS Loading Loading @@ -477,6 +480,7 @@ config ARCH_PXA select ARCH_MTD_XIP select GENERIC_GPIO select HAVE_CLK select COMMON_CLKDEV select ARCH_REQUIRE_GPIOLIB select GENERIC_TIME select GENERIC_CLOCKEVENTS Loading
arch/arm/common/Kconfig +3 −0 Original line number Diff line number Diff line Loading @@ -33,3 +33,6 @@ config SHARPSL_PM config SHARP_SCOOP bool config COMMON_CLKDEV bool
arch/arm/common/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -17,3 +17,4 @@ obj-$(CONFIG_SHARP_SCOOP) += scoop.o obj-$(CONFIG_ARCH_IXP2000) += uengine.o obj-$(CONFIG_ARCH_IXP23XX) += uengine.o obj-$(CONFIG_PCI_HOST_ITE8152) += it8152.o obj-$(CONFIG_COMMON_CLKDEV) += clkdev.o
arch/arm/common/clkdev.c 0 → 100644 +128 −0 Original line number Diff line number Diff line /* * arch/arm/common/clkdev.c * * Copyright (C) 2008 Russell King. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Helper for the clk API to assist looking up a struct clk. */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/device.h> #include <linux/list.h> #include <linux/errno.h> #include <linux/err.h> #include <linux/string.h> #include <linux/mutex.h> #include <asm/clkdev.h> #include <mach/clkdev.h> static LIST_HEAD(clocks); static DEFINE_MUTEX(clocks_mutex); static struct clk *clk_find(const char *dev_id, const char *con_id) { struct clk_lookup *p; struct clk *clk = NULL; int match, best = 0; list_for_each_entry(p, &clocks, node) { if ((p->dev_id && !dev_id) || (p->con_id && !con_id)) continue; match = 0; if (p->dev_id) match += 2 * (strcmp(p->dev_id, dev_id) == 0); if (p->con_id) match += 1 * (strcmp(p->con_id, con_id) == 0); if (match == 0) continue; if (match > best) { clk = p->clk; best = match; } } return clk; } struct clk *clk_get(struct device *dev, const char *con_id) { const char *dev_id = dev ? dev_name(dev) : NULL; struct clk *clk; mutex_lock(&clocks_mutex); clk = clk_find(dev_id, con_id); if (clk && !__clk_get(clk)) clk = NULL; mutex_unlock(&clocks_mutex); return clk ? clk : ERR_PTR(-ENOENT); } EXPORT_SYMBOL(clk_get); void clk_put(struct clk *clk) { __clk_put(clk); } EXPORT_SYMBOL(clk_put); void clkdev_add(struct clk_lookup *cl) { mutex_lock(&clocks_mutex); list_add_tail(&cl->node, &clocks); mutex_unlock(&clocks_mutex); } EXPORT_SYMBOL(clkdev_add); #define MAX_DEV_ID 20 #define MAX_CON_ID 16 struct clk_lookup_alloc { struct clk_lookup cl; char dev_id[MAX_DEV_ID]; char con_id[MAX_CON_ID]; }; struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id, const char *dev_fmt, ...) { struct clk_lookup_alloc *cla; cla = kzalloc(sizeof(*cla), GFP_KERNEL); if (!cla) return NULL; cla->cl.clk = clk; if (con_id) { strlcpy(cla->con_id, con_id, sizeof(cla->con_id)); cla->cl.con_id = cla->con_id; } if (dev_fmt) { va_list ap; va_start(ap, dev_fmt); vscnprintf(cla->dev_id, sizeof(cla->dev_id), dev_fmt, ap); cla->cl.dev_id = cla->dev_id; va_end(ap); } return &cla->cl; } EXPORT_SYMBOL(clkdev_alloc); /* * clkdev_drop - remove a clock dynamically allocated */ void clkdev_drop(struct clk_lookup *cl) { mutex_lock(&clocks_mutex); list_del(&cl->node); mutex_unlock(&clocks_mutex); kfree(cl); } EXPORT_SYMBOL(clkdev_drop);
arch/arm/include/asm/clkdev.h 0 → 100644 +30 −0 Original line number Diff line number Diff line /* * arch/arm/include/asm/clkdev.h * * Copyright (C) 2008 Russell King. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Helper for the clk API to assist looking up a struct clk. */ #ifndef __ASM_CLKDEV_H #define __ASM_CLKDEV_H struct clk; struct clk_lookup { struct list_head node; const char *dev_id; const char *con_id; struct clk *clk; }; struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id, const char *dev_fmt, ...); void clkdev_add(struct clk_lookup *cl); void clkdev_drop(struct clk_lookup *cl); #endif