1b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen/*
2b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * High-Speed Bus Matrix helper functions
3b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen *
4b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * Copyright (C) 2008 Atmel Corporation
5b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen *
6b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * This program is free software; you can redistribute it and/or modify
7b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * it under the terms of the GNU General Public License version 2 as
8b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * published by the Free Software Foundation.
9b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen */
10b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen#include <linux/clk.h>
11b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen#include <linux/io.h>
12b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen
13b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen#include <mach/chip.h>
14b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen#include <mach/hmatrix.h>
15b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen
16b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoenstatic inline void __hmatrix_write_reg(unsigned long offset, u32 value)
17b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen{
18b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	__raw_writel(value, (void __iomem __force *)(HMATRIX_BASE + offset));
19b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen}
20b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen
21b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoenstatic inline u32 __hmatrix_read_reg(unsigned long offset)
22b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen{
23b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	return __raw_readl((void __iomem __force *)(HMATRIX_BASE + offset));
24b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen}
25b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen
26b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen/**
27b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * hmatrix_write_reg - write HMATRIX configuration register
28b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * @offset: register offset
29b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * @value: value to be written to the register at @offset
30b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen */
31b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoenvoid hmatrix_write_reg(unsigned long offset, u32 value)
32b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen{
33b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	clk_enable(&at32_hmatrix_clk);
34b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	__hmatrix_write_reg(offset, value);
35b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	__hmatrix_read_reg(offset);
36b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	clk_disable(&at32_hmatrix_clk);
37b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen}
38b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen
39b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen/**
40b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * hmatrix_read_reg - read HMATRIX configuration register
41b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * @offset: register offset
42b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen *
43b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * Returns the value of the register at @offset.
44b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen */
45b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoenu32 hmatrix_read_reg(unsigned long offset)
46b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen{
47b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	u32 value;
48b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen
49b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	clk_enable(&at32_hmatrix_clk);
50b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	value = __hmatrix_read_reg(offset);
51b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	clk_disable(&at32_hmatrix_clk);
52b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen
53b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	return value;
54b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen}
55b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen
56b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen/**
57b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * hmatrix_sfr_set_bits - set bits in a slave's Special Function Register
58b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * @slave_id: operate on the SFR belonging to this slave
59b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * @mask: mask of bits to be set in the SFR
60b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen */
61b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoenvoid hmatrix_sfr_set_bits(unsigned int slave_id, u32 mask)
62b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen{
63b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	u32 value;
64b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen
65b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	clk_enable(&at32_hmatrix_clk);
66b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	value = __hmatrix_read_reg(HMATRIX_SFR(slave_id));
67b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	value |= mask;
68b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	__hmatrix_write_reg(HMATRIX_SFR(slave_id), value);
69b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	__hmatrix_read_reg(HMATRIX_SFR(slave_id));
70b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	clk_disable(&at32_hmatrix_clk);
71b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen}
72b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen
73b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen/**
74b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * hmatrix_sfr_set_bits - clear bits in a slave's Special Function Register
75b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * @slave_id: operate on the SFR belonging to this slave
76b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen * @mask: mask of bits to be cleared in the SFR
77b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen */
78b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoenvoid hmatrix_sfr_clear_bits(unsigned int slave_id, u32 mask)
79b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen{
80b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	u32 value;
81b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen
82b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	clk_enable(&at32_hmatrix_clk);
83b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	value = __hmatrix_read_reg(HMATRIX_SFR(slave_id));
84b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	value &= ~mask;
85b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	__hmatrix_write_reg(HMATRIX_SFR(slave_id), value);
86b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	__hmatrix_read_reg(HMATRIX_SFR(slave_id));
87b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen	clk_disable(&at32_hmatrix_clk);
88b47eb4092f81ae9fe406fa2c6719eaa9cd7a593cHaavard Skinnemoen}
89