|  | @@ -233,3 +233,103 @@ static const s8 port_mux[] = {
 | 
	
		
			
				|  |  |  	[GPIO_PF7] = 8,
 | 
	
		
			
				|  |  |  	[GPIO_PF8 ... GPIO_PF15] = -1,
 | 
	
		
			
				|  |  |  	[GPIO_PG0 ... GPIO_PG7] = -1,
 | 
	
		
			
				|  |  | +	[GPIO_PG8] = 9,
 | 
	
		
			
				|  |  | +	[GPIO_PG9] = 9,
 | 
	
		
			
				|  |  | +	[GPIO_PG10] = 10,
 | 
	
		
			
				|  |  | +	[GPIO_PG11] = 10,
 | 
	
		
			
				|  |  | +	[GPIO_PG12] = 10,
 | 
	
		
			
				|  |  | +	[GPIO_PG13] = 11,
 | 
	
		
			
				|  |  | +	[GPIO_PG14] = 11,
 | 
	
		
			
				|  |  | +	[GPIO_PG15] = 11,
 | 
	
		
			
				|  |  | +	[GPIO_PH0 ... GPIO_PH15] = -1,
 | 
	
		
			
				|  |  | +	[PORT_PJ0 ... PORT_PJ3] = -1,
 | 
	
		
			
				|  |  | +	[PORT_PJ4] = 1,
 | 
	
		
			
				|  |  | +	[PORT_PJ5] = 1,
 | 
	
		
			
				|  |  | +	[PORT_PJ6 ... PORT_PJ9] = -1,
 | 
	
		
			
				|  |  | +	[PORT_PJ10] = 0,
 | 
	
		
			
				|  |  | +	[PORT_PJ11] = 0,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int portmux_group_check(unsigned short per)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u16 ident = P_IDENT(per);
 | 
	
		
			
				|  |  | +	u16 function = P_FUNCT2MUX(per);
 | 
	
		
			
				|  |  | +	s8 offset = port_mux[ident];
 | 
	
		
			
				|  |  | +	u16 m, pmux, pfunc;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (offset < 0)
 | 
	
		
			
				|  |  | +		return 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	pmux = bfin_read_PORT_MUX();
 | 
	
		
			
				|  |  | +	for (m = 0; m < ARRAY_SIZE(port_mux); ++m) {
 | 
	
		
			
				|  |  | +		if (m == ident)
 | 
	
		
			
				|  |  | +			continue;
 | 
	
		
			
				|  |  | +		if (port_mux[m] != offset)
 | 
	
		
			
				|  |  | +			continue;
 | 
	
		
			
				|  |  | +		if (!is_reserved(peri, m, 1))
 | 
	
		
			
				|  |  | +			continue;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if (offset == 1)
 | 
	
		
			
				|  |  | +			pfunc = (pmux >> offset) & 3;
 | 
	
		
			
				|  |  | +		else
 | 
	
		
			
				|  |  | +			pfunc = (pmux >> offset) & 1;
 | 
	
		
			
				|  |  | +		if (pfunc != function) {
 | 
	
		
			
				|  |  | +			pr_err("pin group conflict! request pin %d func %d conflict with pin %d func %d\n",
 | 
	
		
			
				|  |  | +				ident, function, m, pfunc);
 | 
	
		
			
				|  |  | +			return -EINVAL;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static void portmux_setup(unsigned short per)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u16 ident = P_IDENT(per);
 | 
	
		
			
				|  |  | +	u16 function = P_FUNCT2MUX(per);
 | 
	
		
			
				|  |  | +	s8 offset = port_mux[ident];
 | 
	
		
			
				|  |  | +	u16 pmux;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (offset == -1)
 | 
	
		
			
				|  |  | +		return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	pmux = bfin_read_PORT_MUX();
 | 
	
		
			
				|  |  | +	if (offset != 1)
 | 
	
		
			
				|  |  | +		pmux &= ~(1 << offset);
 | 
	
		
			
				|  |  | +	else
 | 
	
		
			
				|  |  | +		pmux &= ~(3 << 1);
 | 
	
		
			
				|  |  | +	pmux |= (function << offset);
 | 
	
		
			
				|  |  | +	bfin_write_PORT_MUX(pmux);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +#elif defined(CONFIG_BF54x) || defined(CONFIG_BF60x)
 | 
	
		
			
				|  |  | +inline void portmux_setup(unsigned short per)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u16 ident = P_IDENT(per);
 | 
	
		
			
				|  |  | +	u16 function = P_FUNCT2MUX(per);
 | 
	
		
			
				|  |  | +	u32 pmux;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	pmux = gpio_array[gpio_bank(ident)]->port_mux;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	pmux &= ~(0x3 << (2 * gpio_sub_n(ident)));
 | 
	
		
			
				|  |  | +	pmux |= (function & 0x3) << (2 * gpio_sub_n(ident));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	gpio_array[gpio_bank(ident)]->port_mux = pmux;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +inline u16 get_portmux(unsigned short per)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u16 ident = P_IDENT(per);
 | 
	
		
			
				|  |  | +	u32 pmux = gpio_array[gpio_bank(ident)]->port_mux;
 | 
	
		
			
				|  |  | +	return (pmux >> (2 * gpio_sub_n(ident)) & 0x3);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +static int portmux_group_check(unsigned short per)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +#elif defined(CONFIG_BF52x) || defined(CONFIG_BF51x)
 | 
	
		
			
				|  |  | +static int portmux_group_check(unsigned short per)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u16 ident = P_IDENT(per);
 | 
	
		
			
				|  |  | +	u16 function = P_FUNCT2MUX(per);
 | 
	
		
			
				|  |  | +	u8 offset = pmux_offset[gpio_bank(ident)][gpio_sub_n(ident)];
 | 
	
		
			
				|  |  | +	u16 pin, gpiopin, pfunc;
 |