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