2009-09-13 11:30:11 -03:00
/*
* Driver for the Conexant CX25821 PCIe bridge
*
* Copyright ( C ) 2009 Conexant Systems Inc .
* Authors < shu . lin @ conexant . com > , < hiep . huynh @ conexant . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
*
* GNU General Public License for more details .
*/
2009-09-15 11:33:54 -03:00
2013-04-13 08:01:31 -03:00
# include <linux/module.h>
2009-09-13 11:30:11 -03:00
# include "cx25821.h"
2009-09-15 11:33:54 -03:00
/********************* GPIO stuffs *********************/
2009-09-13 11:30:11 -03:00
void cx25821_set_gpiopin_direction ( struct cx25821_dev * dev ,
int pin_number , int pin_logic_value )
2009-09-15 11:33:54 -03:00
{
2009-09-13 11:30:11 -03:00
int bit = pin_number ;
u32 gpio_oe_reg = GPIO_LO_OE ;
2009-09-15 11:33:54 -03:00
u32 gpio_register = 0 ;
2009-09-13 11:30:11 -03:00
u32 value = 0 ;
2009-09-15 11:33:54 -03:00
2010-03-21 14:44:01 -03:00
/* Check for valid pinNumber */
2009-09-13 11:30:11 -03:00
if ( pin_number > = 47 )
return ;
2009-09-15 11:33:54 -03:00
2009-09-13 11:30:11 -03:00
if ( pin_number > 31 ) {
bit = pin_number - 31 ;
gpio_oe_reg = GPIO_HI_OE ;
2009-09-15 11:33:54 -03:00
}
2010-03-21 14:44:01 -03:00
/* Here we will make sure that the GPIOs 0 and 1 are output. keep the
* rest as is */
2009-09-13 11:30:11 -03:00
gpio_register = cx_read ( gpio_oe_reg ) ;
2009-09-15 11:33:54 -03:00
2010-03-21 14:44:01 -03:00
if ( pin_logic_value = = 1 )
2009-09-13 11:30:11 -03:00
value = gpio_register | Set_GPIO_Bit ( bit ) ;
2010-03-21 14:44:01 -03:00
else
2009-09-13 11:30:11 -03:00
value = gpio_register & Clear_GPIO_Bit ( bit ) ;
2009-09-15 11:33:54 -03:00
2009-09-13 11:30:11 -03:00
cx_write ( gpio_oe_reg , value ) ;
2009-09-15 11:33:54 -03:00
}
2011-09-02 11:55:32 +08:00
EXPORT_SYMBOL ( cx25821_set_gpiopin_direction ) ;
2009-09-15 11:33:54 -03:00
2009-09-13 11:30:11 -03:00
static void cx25821_set_gpiopin_logicvalue ( struct cx25821_dev * dev ,
int pin_number , int pin_logic_value )
2009-09-13 11:25:45 -03:00
{
2009-09-13 11:30:11 -03:00
int bit = pin_number ;
u32 gpio_reg = GPIO_LO ;
u32 value = 0 ;
2009-09-13 11:25:45 -03:00
2010-03-21 14:44:01 -03:00
/* Check for valid pinNumber */
2009-09-13 11:30:11 -03:00
if ( pin_number > = 47 )
return ;
2009-09-15 11:33:54 -03:00
2010-03-21 14:44:01 -03:00
/* change to output direction */
cx25821_set_gpiopin_direction ( dev , pin_number , 0 ) ;
2009-09-15 11:33:54 -03:00
2009-09-13 11:30:11 -03:00
if ( pin_number > 31 ) {
bit = pin_number - 31 ;
gpio_reg = GPIO_HI ;
2009-09-15 11:33:54 -03:00
}
2009-09-13 11:30:11 -03:00
value = cx_read ( gpio_reg ) ;
2009-09-13 11:25:45 -03:00
2010-03-21 14:44:01 -03:00
if ( pin_logic_value = = 0 )
2009-09-13 11:30:11 -03:00
value & = Clear_GPIO_Bit ( bit ) ;
2010-03-21 14:44:01 -03:00
else
2009-09-13 11:30:11 -03:00
value | = Set_GPIO_Bit ( bit ) ;
2009-09-13 11:25:45 -03:00
2009-09-13 11:30:11 -03:00
cx_write ( gpio_reg , value ) ;
2009-09-15 11:33:54 -03:00
}
void cx25821_gpio_init ( struct cx25821_dev * dev )
{
2010-03-21 14:44:01 -03:00
if ( dev = = NULL )
2009-09-13 11:30:11 -03:00
return ;
2009-09-13 11:25:45 -03:00
2009-09-13 11:30:11 -03:00
switch ( dev - > board ) {
case CX25821_BOARD_CONEXANT_ATHENA10 :
default :
2010-03-21 14:44:01 -03:00
/* set GPIO 5 to select the path for Medusa/Athena */
2009-09-13 11:30:11 -03:00
cx25821_set_gpiopin_logicvalue ( dev , 5 , 1 ) ;
2018-07-26 23:22:09 -04:00
msleep ( 20 ) ;
2009-09-13 11:30:11 -03:00
break ;
2009-09-15 11:33:54 -03:00
}
2009-09-13 11:25:45 -03:00
2009-09-15 11:33:54 -03:00
}