2 * arch/sh/kernel/cpu/sh4a/ubc.c
4 * On-chip UBC support for SH-4A CPUs.
6 * Copyright (C) 2009 - 2010 Paul Mundt
8 * This file is subject to the terms and conditions of the GNU General Public
9 * License. See the file "COPYING" in the main directory of this archive
12 #include <linux/init.h>
13 #include <linux/err.h>
14 #include <linux/clk.h>
16 #include <asm/hw_breakpoint.h>
18 #define UBC_CBR(idx) (0xff200000 + (0x20 * idx))
19 #define UBC_CRR(idx) (0xff200004 + (0x20 * idx))
20 #define UBC_CAR(idx) (0xff200008 + (0x20 * idx))
21 #define UBC_CAMR(idx) (0xff20000c + (0x20 * idx))
23 #define UBC_CCMFR 0xff200600
24 #define UBC_CBCR 0xff200620
27 #define UBC_CRR_PCB (1 << 1)
28 #define UBC_CRR_BIE (1 << 0)
31 #define UBC_CBR_CE (1 << 0)
33 static struct sh_ubc sh4a_ubc
;
35 static void sh4a_ubc_enable(struct arch_hw_breakpoint
*info
, int idx
)
37 __raw_writel(UBC_CBR_CE
| info
->len
| info
->type
, UBC_CBR(idx
));
38 __raw_writel(info
->address
, UBC_CAR(idx
));
41 static void sh4a_ubc_disable(struct arch_hw_breakpoint
*info
, int idx
)
43 __raw_writel(0, UBC_CBR(idx
));
44 __raw_writel(0, UBC_CAR(idx
));
47 static void sh4a_ubc_enable_all(unsigned long mask
)
51 for (i
= 0; i
< sh4a_ubc
.num_events
; i
++)
53 __raw_writel(__raw_readl(UBC_CBR(i
)) | UBC_CBR_CE
,
57 static void sh4a_ubc_disable_all(void)
61 for (i
= 0; i
< sh4a_ubc
.num_events
; i
++)
62 __raw_writel(__raw_readl(UBC_CBR(i
)) & ~UBC_CBR_CE
,
66 static unsigned long sh4a_ubc_active_mask(void)
68 unsigned long active
= 0;
71 for (i
= 0; i
< sh4a_ubc
.num_events
; i
++)
72 if (__raw_readl(UBC_CBR(i
)) & UBC_CBR_CE
)
78 static unsigned long sh4a_ubc_triggered_mask(void)
80 return __raw_readl(UBC_CCMFR
);
83 static void sh4a_ubc_clear_triggered_mask(unsigned long mask
)
85 __raw_writel(__raw_readl(UBC_CCMFR
) & ~mask
, UBC_CCMFR
);
88 static struct sh_ubc sh4a_ubc
= {
92 .enable
= sh4a_ubc_enable
,
93 .disable
= sh4a_ubc_disable
,
94 .enable_all
= sh4a_ubc_enable_all
,
95 .disable_all
= sh4a_ubc_disable_all
,
96 .active_mask
= sh4a_ubc_active_mask
,
97 .triggered_mask
= sh4a_ubc_triggered_mask
,
98 .clear_triggered_mask
= sh4a_ubc_clear_triggered_mask
,
101 static int __init
sh4a_ubc_init(void)
103 struct clk
*ubc_iclk
= clk_get(NULL
, "ubc0");
107 * The UBC MSTP bit is optional, as not all platforms will have
108 * it. Just ignore it if we can't find it.
110 if (IS_ERR(ubc_iclk
))
113 clk_enable(ubc_iclk
);
115 __raw_writel(0, UBC_CBCR
);
117 for (i
= 0; i
< sh4a_ubc
.num_events
; i
++) {
118 __raw_writel(0, UBC_CAMR(i
));
119 __raw_writel(0, UBC_CBR(i
));
121 __raw_writel(UBC_CRR_BIE
| UBC_CRR_PCB
, UBC_CRR(i
));
123 /* dummy read for write posting */
124 (void)__raw_readl(UBC_CRR(i
));
127 clk_disable(ubc_iclk
);
129 sh4a_ubc
.clk
= ubc_iclk
;
131 return register_sh_ubc(&sh4a_ubc
);
133 arch_initcall(sh4a_ubc_init
);