1 /* 2 * Driver for the Conexant CX25821 PCIe bridge 3 * 4 * Copyright (C) 2009 Conexant Systems Inc. 5 * Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21 */ 22 23 #include "cx25821.h" 24 25 /********************* GPIO stuffs *********************/ 26 void cx25821_set_gpiopin_direction(struct cx25821_dev *dev, 27 int pin_number, int pin_logic_value) 28 { 29 int bit = pin_number; 30 u32 gpio_oe_reg = GPIO_LO_OE; 31 u32 gpio_register = 0; 32 u32 value = 0; 33 34 /* Check for valid pinNumber */ 35 if (pin_number >= 47) 36 return; 37 38 if (pin_number > 31) { 39 bit = pin_number - 31; 40 gpio_oe_reg = GPIO_HI_OE; 41 } 42 /* Here we will make sure that the GPIOs 0 and 1 are output. keep the 43 * rest as is */ 44 gpio_register = cx_read(gpio_oe_reg); 45 46 if (pin_logic_value == 1) 47 value = gpio_register | Set_GPIO_Bit(bit); 48 else 49 value = gpio_register & Clear_GPIO_Bit(bit); 50 51 cx_write(gpio_oe_reg, value); 52 } 53 EXPORT_SYMBOL(cx25821_set_gpiopin_direction); 54 55 static void cx25821_set_gpiopin_logicvalue(struct cx25821_dev *dev, 56 int pin_number, int pin_logic_value) 57 { 58 int bit = pin_number; 59 u32 gpio_reg = GPIO_LO; 60 u32 value = 0; 61 62 /* Check for valid pinNumber */ 63 if (pin_number >= 47) 64 return; 65 66 /* change to output direction */ 67 cx25821_set_gpiopin_direction(dev, pin_number, 0); 68 69 if (pin_number > 31) { 70 bit = pin_number - 31; 71 gpio_reg = GPIO_HI; 72 } 73 74 value = cx_read(gpio_reg); 75 76 if (pin_logic_value == 0) 77 value &= Clear_GPIO_Bit(bit); 78 else 79 value |= Set_GPIO_Bit(bit); 80 81 cx_write(gpio_reg, value); 82 } 83 84 void cx25821_gpio_init(struct cx25821_dev *dev) 85 { 86 if (dev == NULL) 87 return; 88 89 switch (dev->board) { 90 case CX25821_BOARD_CONEXANT_ATHENA10: 91 default: 92 /* set GPIO 5 to select the path for Medusa/Athena */ 93 cx25821_set_gpiopin_logicvalue(dev, 5, 1); 94 mdelay(20); 95 break; 96 } 97 98 } 99