sh: hwblk: Kill off remaining bits of hwblk API.
Now that everything has been migrated, kill off the remaining infrastructure bits. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
		
							parent
							
								
									ec20a81562
								
							
						
					
					
						commit
						cfc806a7ee
					
				@ -1,74 +0,0 @@
 | 
			
		||||
#ifndef __ASM_SH_HWBLK_H
 | 
			
		||||
#define __ASM_SH_HWBLK_H
 | 
			
		||||
 | 
			
		||||
#include <asm/clock.h>
 | 
			
		||||
#include <asm/io.h>
 | 
			
		||||
 | 
			
		||||
#define HWBLK_CNT_USAGE 0
 | 
			
		||||
#define HWBLK_CNT_IDLE 1
 | 
			
		||||
#define HWBLK_CNT_DEVICES 2
 | 
			
		||||
#define HWBLK_CNT_NR 3
 | 
			
		||||
 | 
			
		||||
#define HWBLK_AREA_FLAG_PARENT (1 << 0) /* valid parent */
 | 
			
		||||
 | 
			
		||||
#define HWBLK_AREA(_flags, _parent)		\
 | 
			
		||||
{						\
 | 
			
		||||
	.flags = _flags,			\
 | 
			
		||||
	.parent = _parent,			\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct hwblk_area {
 | 
			
		||||
	int cnt[HWBLK_CNT_NR];
 | 
			
		||||
	unsigned char parent;
 | 
			
		||||
	unsigned char flags;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define HWBLK(_mstp, _bit, _area)		\
 | 
			
		||||
{						\
 | 
			
		||||
	.mstp = (void __iomem *)_mstp,		\
 | 
			
		||||
	.bit = _bit,				\
 | 
			
		||||
	.area = _area,				\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct hwblk {
 | 
			
		||||
	void __iomem *mstp;
 | 
			
		||||
	unsigned char bit;
 | 
			
		||||
	unsigned char area;
 | 
			
		||||
	int cnt[HWBLK_CNT_NR];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct hwblk_info {
 | 
			
		||||
	struct hwblk_area *areas;
 | 
			
		||||
	int nr_areas;
 | 
			
		||||
	struct hwblk *hwblks;
 | 
			
		||||
	int nr_hwblks;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_CPU_SUBTYPE_SH7722) && \
 | 
			
		||||
    !defined(CONFIG_CPU_SUBTYPE_SH7723) && \
 | 
			
		||||
    !defined(CONFIG_CPU_SUBTYPE_SH7724)
 | 
			
		||||
/* Should be defined by processor-specific code */
 | 
			
		||||
int arch_hwblk_init(void);
 | 
			
		||||
 | 
			
		||||
int hwblk_register(struct hwblk_info *info);
 | 
			
		||||
int hwblk_init(void);
 | 
			
		||||
 | 
			
		||||
void hwblk_enable(struct hwblk_info *info, int hwblk);
 | 
			
		||||
void hwblk_disable(struct hwblk_info *info, int hwblk);
 | 
			
		||||
 | 
			
		||||
void hwblk_cnt_inc(struct hwblk_info *info, int hwblk, int cnt);
 | 
			
		||||
void hwblk_cnt_dec(struct hwblk_info *info, int hwblk, int cnt);
 | 
			
		||||
 | 
			
		||||
/* allow clocks to enable and disable hardware blocks */
 | 
			
		||||
#define SH_HWBLK_CLK(_hwblk, _parent, _flags)	\
 | 
			
		||||
[_hwblk] = {					\
 | 
			
		||||
	.parent		= _parent,		\
 | 
			
		||||
	.arch_flags	= _hwblk,		\
 | 
			
		||||
	.flags		= _flags,		\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int sh_hwblk_clk_register(struct clk *clks, int nr);
 | 
			
		||||
#else
 | 
			
		||||
#define hwblk_init() 0
 | 
			
		||||
#endif
 | 
			
		||||
#endif /* __ASM_SH_HWBLK_H */
 | 
			
		||||
@ -19,6 +19,3 @@ obj-$(CONFIG_SH_ADC)		+= adc.o
 | 
			
		||||
obj-$(CONFIG_SH_CLK_CPG_LEGACY)	+= clock-cpg.o
 | 
			
		||||
 | 
			
		||||
obj-y	+= irq/ init.o clock.o fpu.o proc.o
 | 
			
		||||
ifneq ($(CONFIG_CPU_SUBTYPE_SH7722)$(CONFIG_CPU_SUBTYPE_SH7723)$(CONFIG_CPU_SUBTYPE_SH7724),y)
 | 
			
		||||
obj-y	+= hwblk.o
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
@ -1,154 +0,0 @@
 | 
			
		||||
#include <linux/clk.h>
 | 
			
		||||
#include <linux/compiler.h>
 | 
			
		||||
#include <linux/io.h>
 | 
			
		||||
#include <linux/spinlock.h>
 | 
			
		||||
#include <asm/suspend.h>
 | 
			
		||||
#include <asm/hwblk.h>
 | 
			
		||||
#include <asm/clock.h>
 | 
			
		||||
 | 
			
		||||
static DEFINE_SPINLOCK(hwblk_lock);
 | 
			
		||||
 | 
			
		||||
static void hwblk_area_mod_cnt(struct hwblk_info *info,
 | 
			
		||||
			       int area, int counter, int value, int goal)
 | 
			
		||||
{
 | 
			
		||||
	struct hwblk_area *hap = info->areas + area;
 | 
			
		||||
 | 
			
		||||
	hap->cnt[counter] += value;
 | 
			
		||||
 | 
			
		||||
	if (hap->cnt[counter] != goal)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	if (hap->flags & HWBLK_AREA_FLAG_PARENT)
 | 
			
		||||
		hwblk_area_mod_cnt(info, hap->parent, counter, value, goal);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int __hwblk_mod_cnt(struct hwblk_info *info, int hwblk,
 | 
			
		||||
			  int counter, int value, int goal)
 | 
			
		||||
{
 | 
			
		||||
	struct hwblk *hp = info->hwblks + hwblk;
 | 
			
		||||
 | 
			
		||||
	hp->cnt[counter] += value;
 | 
			
		||||
	if (hp->cnt[counter] == goal)
 | 
			
		||||
		hwblk_area_mod_cnt(info, hp->area, counter, value, goal);
 | 
			
		||||
 | 
			
		||||
	return hp->cnt[counter];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void hwblk_mod_cnt(struct hwblk_info *info, int hwblk,
 | 
			
		||||
			  int counter, int value, int goal)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
 | 
			
		||||
	spin_lock_irqsave(&hwblk_lock, flags);
 | 
			
		||||
	__hwblk_mod_cnt(info, hwblk, counter, value, goal);
 | 
			
		||||
	spin_unlock_irqrestore(&hwblk_lock, flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void hwblk_cnt_inc(struct hwblk_info *info, int hwblk, int counter)
 | 
			
		||||
{
 | 
			
		||||
	hwblk_mod_cnt(info, hwblk, counter, 1, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void hwblk_cnt_dec(struct hwblk_info *info, int hwblk, int counter)
 | 
			
		||||
{
 | 
			
		||||
	hwblk_mod_cnt(info, hwblk, counter, -1, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void hwblk_enable(struct hwblk_info *info, int hwblk)
 | 
			
		||||
{
 | 
			
		||||
	struct hwblk *hp = info->hwblks + hwblk;
 | 
			
		||||
	unsigned long tmp;
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	spin_lock_irqsave(&hwblk_lock, flags);
 | 
			
		||||
 | 
			
		||||
	ret = __hwblk_mod_cnt(info, hwblk, HWBLK_CNT_USAGE, 1, 1);
 | 
			
		||||
	if (ret == 1) {
 | 
			
		||||
		tmp = __raw_readl(hp->mstp);
 | 
			
		||||
		tmp &= ~(1 << hp->bit);
 | 
			
		||||
		__raw_writel(tmp, hp->mstp);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	spin_unlock_irqrestore(&hwblk_lock, flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void hwblk_disable(struct hwblk_info *info, int hwblk)
 | 
			
		||||
{
 | 
			
		||||
	struct hwblk *hp = info->hwblks + hwblk;
 | 
			
		||||
	unsigned long tmp;
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	spin_lock_irqsave(&hwblk_lock, flags);
 | 
			
		||||
 | 
			
		||||
	ret = __hwblk_mod_cnt(info, hwblk, HWBLK_CNT_USAGE, -1, 0);
 | 
			
		||||
	if (ret == 0) {
 | 
			
		||||
		tmp = __raw_readl(hp->mstp);
 | 
			
		||||
		tmp |= 1 << hp->bit;
 | 
			
		||||
		__raw_writel(tmp, hp->mstp);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	spin_unlock_irqrestore(&hwblk_lock, flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct hwblk_info *hwblk_info;
 | 
			
		||||
 | 
			
		||||
int __init hwblk_register(struct hwblk_info *info)
 | 
			
		||||
{
 | 
			
		||||
	hwblk_info = info;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int __init __weak arch_hwblk_init(void)
 | 
			
		||||
{
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int __init hwblk_init(void)
 | 
			
		||||
{
 | 
			
		||||
	return arch_hwblk_init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* allow clocks to enable and disable hardware blocks */
 | 
			
		||||
static int sh_hwblk_clk_enable(struct clk *clk)
 | 
			
		||||
{
 | 
			
		||||
	if (!hwblk_info)
 | 
			
		||||
		return -ENOENT;
 | 
			
		||||
 | 
			
		||||
	hwblk_enable(hwblk_info, clk->arch_flags);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void sh_hwblk_clk_disable(struct clk *clk)
 | 
			
		||||
{
 | 
			
		||||
	if (hwblk_info)
 | 
			
		||||
		hwblk_disable(hwblk_info, clk->arch_flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct clk_ops sh_hwblk_clk_ops = {
 | 
			
		||||
	.enable		= sh_hwblk_clk_enable,
 | 
			
		||||
	.disable	= sh_hwblk_clk_disable,
 | 
			
		||||
	.recalc		= followparent_recalc,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int __init sh_hwblk_clk_register(struct clk *clks, int nr)
 | 
			
		||||
{
 | 
			
		||||
	struct clk *clkp;
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
	int k;
 | 
			
		||||
 | 
			
		||||
	for (k = 0; !ret && (k < nr); k++) {
 | 
			
		||||
		clkp = clks + k;
 | 
			
		||||
 | 
			
		||||
		/* skip over clocks using hwblk 0 (HWBLK_UNKNOWN) */
 | 
			
		||||
		if (!clkp->arch_flags)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		clkp->ops = &sh_hwblk_clk_ops;
 | 
			
		||||
		ret |= clk_register(clkp);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
@ -21,7 +21,6 @@
 | 
			
		||||
#include <linux/smp.h>
 | 
			
		||||
#include <linux/rtc.h>
 | 
			
		||||
#include <asm/clock.h>
 | 
			
		||||
#include <asm/hwblk.h>
 | 
			
		||||
#include <asm/rtc.h>
 | 
			
		||||
 | 
			
		||||
/* Dummy RTC ops */
 | 
			
		||||
@ -110,7 +109,6 @@ void __init time_init(void)
 | 
			
		||||
	if (board_time_init)
 | 
			
		||||
		board_time_init();
 | 
			
		||||
 | 
			
		||||
	hwblk_init();
 | 
			
		||||
	clk_init();
 | 
			
		||||
 | 
			
		||||
	late_time_init = sh_late_time_init;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user