diff options
| -rw-r--r-- | drivers/clk/clk.c | 26 | ||||
| -rw-r--r-- | include/linux/clk.h | 18 |
2 files changed, 44 insertions, 0 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index b9f85fc2ce3f..237f23f68bfc 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c | |||
| @@ -2170,6 +2170,32 @@ int clk_get_phase(struct clk *clk) | |||
| 2170 | } | 2170 | } |
| 2171 | 2171 | ||
| 2172 | /** | 2172 | /** |
| 2173 | * clk_is_match - check if two clk's point to the same hardware clock | ||
| 2174 | * @p: clk compared against q | ||
| 2175 | * @q: clk compared against p | ||
| 2176 | * | ||
| 2177 | * Returns true if the two struct clk pointers both point to the same hardware | ||
| 2178 | * clock node. Put differently, returns true if struct clk *p and struct clk *q | ||
| 2179 | * share the same struct clk_core object. | ||
| 2180 | * | ||
| 2181 | * Returns false otherwise. Note that two NULL clks are treated as matching. | ||
| 2182 | */ | ||
| 2183 | bool clk_is_match(const struct clk *p, const struct clk *q) | ||
| 2184 | { | ||
| 2185 | /* trivial case: identical struct clk's or both NULL */ | ||
| 2186 | if (p == q) | ||
| 2187 | return true; | ||
| 2188 | |||
| 2189 | /* true if clk->core pointers match. Avoid derefing garbage */ | ||
| 2190 | if (!IS_ERR_OR_NULL(p) && !IS_ERR_OR_NULL(q)) | ||
| 2191 | if (p->core == q->core) | ||
| 2192 | return true; | ||
| 2193 | |||
| 2194 | return false; | ||
| 2195 | } | ||
| 2196 | EXPORT_SYMBOL_GPL(clk_is_match); | ||
| 2197 | |||
| 2198 | /** | ||
| 2173 | * __clk_init - initialize the data structures in a struct clk | 2199 | * __clk_init - initialize the data structures in a struct clk |
| 2174 | * @dev: device initializing this clk, placeholder for now | 2200 | * @dev: device initializing this clk, placeholder for now |
| 2175 | * @clk: clk being initialized | 2201 | * @clk: clk being initialized |
diff --git a/include/linux/clk.h b/include/linux/clk.h index 8381bbfbc308..68c16a6bedb3 100644 --- a/include/linux/clk.h +++ b/include/linux/clk.h | |||
| @@ -125,6 +125,19 @@ int clk_set_phase(struct clk *clk, int degrees); | |||
| 125 | */ | 125 | */ |
| 126 | int clk_get_phase(struct clk *clk); | 126 | int clk_get_phase(struct clk *clk); |
| 127 | 127 | ||
| 128 | /** | ||
| 129 | * clk_is_match - check if two clk's point to the same hardware clock | ||
| 130 | * @p: clk compared against q | ||
| 131 | * @q: clk compared against p | ||
| 132 | * | ||
| 133 | * Returns true if the two struct clk pointers both point to the same hardware | ||
| 134 | * clock node. Put differently, returns true if struct clk *p and struct clk *q | ||
| 135 | * share the same struct clk_core object. | ||
| 136 | * | ||
| 137 | * Returns false otherwise. Note that two NULL clks are treated as matching. | ||
| 138 | */ | ||
| 139 | bool clk_is_match(const struct clk *p, const struct clk *q); | ||
| 140 | |||
| 128 | #else | 141 | #else |
| 129 | 142 | ||
| 130 | static inline long clk_get_accuracy(struct clk *clk) | 143 | static inline long clk_get_accuracy(struct clk *clk) |
| @@ -142,6 +155,11 @@ static inline long clk_get_phase(struct clk *clk) | |||
| 142 | return -ENOTSUPP; | 155 | return -ENOTSUPP; |
| 143 | } | 156 | } |
| 144 | 157 | ||
| 158 | static inline bool clk_is_match(const struct clk *p, const struct clk *q) | ||
| 159 | { | ||
| 160 | return p == q; | ||
| 161 | } | ||
| 162 | |||
| 145 | #endif | 163 | #endif |
| 146 | 164 | ||
| 147 | /** | 165 | /** |
