mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 10:25:26 +07:00
02239f0a42
Add core functions to handle writes to the ep93xx software locked registers. There are a number of registers in the EP93xx System Controller that require a write to the software lock register before they can be updated. This patch adds a number of exported functions to the ep93xx core that handle this access. The software locked clock divider registers, VidClkDiv, MIRClkDiv, I2SClkDiv and KeyTchClkDiv would typically involve writing a specific value to the register. To support this the ep93xx_syscon_swlocked_write() function is provided. For the DeviceCfg register it's more typical to only need to set or clear a single bit. A generic ep93xx_devcfg_set_clear() function is provided to handle both operations. Two inline functions, ep93xx_devcfg_set_bits() and ep93xx_devcfg_clear_bits() are also provided to improve code readability. In addition, the remaining bits in the System Controller Device Config Register have been documented and the previously defined names shortened. All code paths that use this functionality have been updated except for arch/arm/kernel/crunch.c. That code is in a context switch path, which is not reentrant, so it is safe against itself. Cc: Lennert Buytenhek <buytenh@wantstofly.org> Cc: Matthias Kaehlcke <matthias@kaehlcke.net> Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Acked-by: Ryan Mallon <ryan@bluewatersys.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
40 lines
914 B
C
40 lines
914 B
C
/*
|
|
* arch/arm/mach-ep93xx/include/mach/platform.h
|
|
*/
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
struct i2c_board_info;
|
|
|
|
struct ep93xx_eth_data
|
|
{
|
|
unsigned char dev_addr[6];
|
|
unsigned char phy_id;
|
|
};
|
|
|
|
void ep93xx_map_io(void);
|
|
void ep93xx_init_irq(void);
|
|
void ep93xx_init_time(unsigned long);
|
|
|
|
/* EP93xx System Controller software locked register write */
|
|
void ep93xx_syscon_swlocked_write(unsigned int val, unsigned int reg);
|
|
void ep93xx_devcfg_set_clear(unsigned int set_bits, unsigned int clear_bits);
|
|
|
|
static inline void ep93xx_devcfg_set_bits(unsigned int bits)
|
|
{
|
|
ep93xx_devcfg_set_clear(bits, 0x00);
|
|
}
|
|
|
|
static inline void ep93xx_devcfg_clear_bits(unsigned int bits)
|
|
{
|
|
ep93xx_devcfg_set_clear(0x00, bits);
|
|
}
|
|
|
|
void ep93xx_register_eth(struct ep93xx_eth_data *data, int copy_addr);
|
|
void ep93xx_register_i2c(struct i2c_board_info *devices, int num);
|
|
|
|
void ep93xx_init_devices(void);
|
|
extern struct sys_timer ep93xx_timer;
|
|
|
|
#endif
|