1e5f495d1SPrafulla Wadaskar /* 2e5f495d1SPrafulla Wadaskar * (C) Copyright 2010 3e5f495d1SPrafulla Wadaskar * Marvell Semiconductor <www.marvell.com> 4e5f495d1SPrafulla Wadaskar * Written-by: Prafulla Wadaskar <prafulla@marvell.com>, 5e5f495d1SPrafulla Wadaskar * 61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 7e5f495d1SPrafulla Wadaskar */ 8e5f495d1SPrafulla Wadaskar 9e5f495d1SPrafulla Wadaskar #include <common.h> 10e5f495d1SPrafulla Wadaskar #include <asm/io.h> 11e5f495d1SPrafulla Wadaskar #include <mvmfp.h> 12e5f495d1SPrafulla Wadaskar #include <asm/arch/mfp.h> 13e5f495d1SPrafulla Wadaskar 14e5f495d1SPrafulla Wadaskar /* 15e5f495d1SPrafulla Wadaskar * mfp_config 16e5f495d1SPrafulla Wadaskar * 17e5f495d1SPrafulla Wadaskar * On most of Marvell SoCs (ex. ARMADA100) there is Multi-Funtion-Pin 18e5f495d1SPrafulla Wadaskar * configuration registers to configure each GPIO/Function pin on the 19e5f495d1SPrafulla Wadaskar * SoC. 20e5f495d1SPrafulla Wadaskar * 21e5f495d1SPrafulla Wadaskar * This function reads the array of values for 22e5f495d1SPrafulla Wadaskar * MFPR_X registers and programms them into respective 23e5f495d1SPrafulla Wadaskar * Multi-Function Pin registers. 24e5f495d1SPrafulla Wadaskar * It supports - Alternate Function Selection programming. 25e5f495d1SPrafulla Wadaskar * 26e5f495d1SPrafulla Wadaskar * Whereas, 27e5f495d1SPrafulla Wadaskar * The Configureation value is constructed using MFP() 28e5f495d1SPrafulla Wadaskar * array consists of 32bit values as defined in MFP(xx,xx..) macro 29e5f495d1SPrafulla Wadaskar */ mfp_config(u32 * mfp_cfgs)30e5f495d1SPrafulla Wadaskarvoid mfp_config(u32 *mfp_cfgs) 31e5f495d1SPrafulla Wadaskar { 32e5f495d1SPrafulla Wadaskar u32 *p_mfpr = NULL; 33e5f495d1SPrafulla Wadaskar u32 cfg_val, val; 34e5f495d1SPrafulla Wadaskar 35e5f495d1SPrafulla Wadaskar do { 36e5f495d1SPrafulla Wadaskar cfg_val = *mfp_cfgs++; 37e5f495d1SPrafulla Wadaskar /* exit if End of configuration table detected */ 38e5f495d1SPrafulla Wadaskar if (cfg_val == MFP_EOC) 39e5f495d1SPrafulla Wadaskar break; 40e5f495d1SPrafulla Wadaskar 41e5f495d1SPrafulla Wadaskar p_mfpr = (u32 *)(MV_MFPR_BASE 42e5f495d1SPrafulla Wadaskar + MFP_REG_GET_OFFSET(cfg_val)); 43e5f495d1SPrafulla Wadaskar 44e5f495d1SPrafulla Wadaskar /* Write a mfg register as per configuration */ 45e5f495d1SPrafulla Wadaskar val = 0; 46*ee4303cfSXiang Wang if (cfg_val & MFP_VALUE_MASK) 47*ee4303cfSXiang Wang val |= cfg_val & MFP_VALUE_MASK; 48e5f495d1SPrafulla Wadaskar 49e5f495d1SPrafulla Wadaskar writel(val, p_mfpr); 50e5f495d1SPrafulla Wadaskar } while (1); 51e5f495d1SPrafulla Wadaskar /* 52e5f495d1SPrafulla Wadaskar * perform a read-back of any MFPR register to make sure the 53e5f495d1SPrafulla Wadaskar * previous writings are finished 54e5f495d1SPrafulla Wadaskar */ 55e5f495d1SPrafulla Wadaskar readl(p_mfpr); 56e5f495d1SPrafulla Wadaskar } 57