Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac2df527 authored by Sylwester Nawrocki's avatar Sylwester Nawrocki
Browse files

clk: Add common __clk_get(), __clk_put() implementations



This patch adds common __clk_get(), __clk_put() clkdev helpers that
replace their platform specific counterparts when the common clock
API is used.

The owner module pointer field is added to struct clk so a reference
to the clock supplier module can be taken by the clock consumers.

The owner module is assigned while the clock is being registered,
in functions _clk_register() and __clk_register().

Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Acked-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 3a3d2b05
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -14,12 +14,14 @@

#include <linux/slab.h>

#ifndef CONFIG_COMMON_CLK
#ifdef CONFIG_HAVE_MACH_CLKDEV
#include <mach/clkdev.h>
#else
#define __clk_get(clk)	({ 1; })
#define __clk_put(clk)	do { } while (0)
#endif
#endif

static inline struct clk_lookup_alloc *__clkdev_alloc(size_t size)
{
+2 −0
Original line number Diff line number Diff line
@@ -8,7 +8,9 @@ static inline struct clk_lookup_alloc *__clkdev_alloc(size_t size)
	return kzalloc(size, GFP_KERNEL);
}

#ifndef CONFIG_COMMON_CLK
#define __clk_put(clk)
#define __clk_get(clk) ({ 1; })
#endif

#endif
+2 −0
Original line number Diff line number Diff line
@@ -14,8 +14,10 @@

#include <linux/slab.h>

#ifndef CONFIG_COMMON_CLK
#define __clk_get(clk)	({ 1; })
#define __clk_put(clk)	do { } while (0)
#endif

static inline struct clk_lookup_alloc *__clkdev_alloc(size_t size)
{
+2 −0
Original line number Diff line number Diff line
@@ -25,7 +25,9 @@ static inline struct clk_lookup_alloc *__clkdev_alloc(size_t size)
		return kzalloc(size, GFP_KERNEL);
}

#ifndef CONFIG_COMMON_CLK
#define __clk_put(clk)
#define __clk_get(clk) ({ 1; })
#endif

#endif /* __CLKDEV_H__ */
+26 −0
Original line number Diff line number Diff line
@@ -1813,6 +1813,10 @@ struct clk *__clk_register(struct device *dev, struct clk_hw *hw)
	clk->flags = hw->init->flags;
	clk->parent_names = hw->init->parent_names;
	clk->num_parents = hw->init->num_parents;
	if (dev && dev->driver)
		clk->owner = dev->driver->owner;
	else
		clk->owner = NULL;

	ret = __clk_init(dev, clk);
	if (ret)
@@ -1833,6 +1837,8 @@ static int _clk_register(struct device *dev, struct clk_hw *hw, struct clk *clk)
		goto fail_name;
	}
	clk->ops = hw->init->ops;
	if (dev && dev->driver)
		clk->owner = dev->driver->owner;
	clk->hw = hw;
	clk->flags = hw->init->flags;
	clk->num_parents = hw->init->num_parents;
@@ -1973,6 +1979,26 @@ void devm_clk_unregister(struct device *dev, struct clk *clk)
}
EXPORT_SYMBOL_GPL(devm_clk_unregister);

/*
 * clkdev helpers
 */
int __clk_get(struct clk *clk)
{
	if (clk && !try_module_get(clk->owner))
		return 0;

	return 1;
}

void __clk_put(struct clk *clk)
{
	if (WARN_ON_ONCE(IS_ERR(clk)))
		return;

	if (clk)
		module_put(clk->owner);
}

/***        clk rate change notifiers        ***/

/**
Loading