-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Paul Mundt
committed
Mar 29, 2010
1 parent
8aa3410
commit 147cac6
Showing
22 changed files
with
313 additions
and
144 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: bd05086bbe3f241cd552068f9ceba9e19c6ce427 | ||
refs/heads/master: 620bb636dfb36574b57a89a4c3029237d69bee04 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
/* | ||
* arch/sh/include/asm/clkdev.h | ||
* | ||
* Cloned from 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); | ||
|
||
void clkdev_add_table(struct clk_lookup *, size_t); | ||
int clk_add_alias(const char *, const char *, char *, struct device *); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
/* | ||
* arch/sh/kernel/clkdev.c | ||
* | ||
* Cloned from 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 <linux/clk.h> | ||
#include <linux/slab.h> | ||
#include <linux/bootmem.h> | ||
#include <linux/mm.h> | ||
#include <asm/clock.h> | ||
#include <asm/clkdev.h> | ||
|
||
static LIST_HEAD(clocks); | ||
static DEFINE_MUTEX(clocks_mutex); | ||
|
||
/* | ||
* Find the correct struct clk for the device and connection ID. | ||
* We do slightly fuzzy matching here: | ||
* An entry with a NULL ID is assumed to be a wildcard. | ||
* If an entry has a device ID, it must match | ||
* If an entry has a connection ID, it must match | ||
* Then we take the most specific entry - with the following | ||
* order of precidence: dev+con > dev only > con only. | ||
*/ | ||
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) { | ||
match = 0; | ||
if (p->dev_id) { | ||
if (!dev_id || strcmp(p->dev_id, dev_id)) | ||
continue; | ||
match += 2; | ||
} | ||
if (p->con_id) { | ||
if (!con_id || strcmp(p->con_id, con_id)) | ||
continue; | ||
match += 1; | ||
} | ||
if (match == 0) | ||
continue; | ||
|
||
if (match > best) { | ||
clk = p->clk; | ||
best = match; | ||
} | ||
} | ||
return clk; | ||
} | ||
|
||
struct clk *clk_get_sys(const char *dev_id, const char *con_id) | ||
{ | ||
struct clk *clk; | ||
|
||
mutex_lock(&clocks_mutex); | ||
clk = clk_find(dev_id, con_id); | ||
mutex_unlock(&clocks_mutex); | ||
|
||
return clk ? clk : ERR_PTR(-ENOENT); | ||
} | ||
EXPORT_SYMBOL(clk_get_sys); | ||
|
||
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); | ||
|
||
void __init clkdev_add_table(struct clk_lookup *cl, size_t num) | ||
{ | ||
mutex_lock(&clocks_mutex); | ||
while (num--) { | ||
list_add_tail(&cl->node, &clocks); | ||
cl++; | ||
} | ||
mutex_unlock(&clocks_mutex); | ||
} | ||
|
||
#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 * __init_refok | ||
clkdev_alloc(struct clk *clk, const char *con_id, const char *dev_fmt, ...) | ||
{ | ||
struct clk_lookup_alloc *cla; | ||
|
||
if (!slab_is_available()) | ||
cla = alloc_bootmem_low_pages(sizeof(*cla)); | ||
else | ||
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); | ||
|
||
int clk_add_alias(const char *alias, const char *alias_dev_name, char *id, | ||
struct device *dev) | ||
{ | ||
struct clk *r = clk_get(dev, id); | ||
struct clk_lookup *l; | ||
|
||
if (IS_ERR(r)) | ||
return PTR_ERR(r); | ||
|
||
l = clkdev_alloc(r, alias, alias_dev_name); | ||
clk_put(r); | ||
if (!l) | ||
return -ENODEV; | ||
clkdev_add(l); | ||
return 0; | ||
} | ||
EXPORT_SYMBOL(clk_add_alias); | ||
|
||
/* | ||
* 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); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.