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