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 <linux/module.h> 24 #include "cx25821.h" 25 26 /********************* GPIO stuffs *********************/ 27 void cx25821_set_gpiopin_direction(struct cx25821_dev *dev, 28 int pin_number, int pin_logic_value) 29 { 30 int bit = pin_number; 31 u32 gpio_oe_reg = GPIO_LO_OE; 32 u32 gpio_register = 0; 33 u32 value = 0; 34 35 /* Check for valid pinNumber */ 36 if (pin_number >= 47) 37 return; 38 39 if (pin_number > 31) { 40 bit = pin_number - 31; 41 gpio_oe_reg = GPIO_HI_OE; 42 } 43 /* Here we will make sure that the GPIOs 0 and 1 are output. keep the 44 * rest as is */ 45 gpio_register = cx_read(gpio_oe_reg); 46 47 if (pin_logic_value == 1) 48 value = gpio_register | Set_GPIO_Bit(bit); 49 else 50 value = gpio_register & Clear_GPIO_Bit(bit); 51 52 cx_write(gpio_oe_reg, value); 53 } 54 EXPORT_SYMBOL(cx25821_set_gpiopin_direction); 55 56 static void cx25821_set_gpiopin_logicvalue(struct cx25821_dev *dev, 57 int pin_number, int pin_logic_value) 58 { 59 int bit = pin_number; 60 u32 gpio_reg = GPIO_LO; 61 u32 value = 0; 62 63 /* Check for valid pinNumber */ 64 if (pin_number >= 47) 65 return; 66 67 /* change to output direction */ 68 cx25821_set_gpiopin_direction(dev, pin_number, 0); 69 70 if (pin_number > 31) { 71 bit = pin_number - 31; 72 gpio_reg = GPIO_HI; 73 } 74 75 value = cx_read(gpio_reg); 76 77 if (pin_logic_value == 0) 78 value &= Clear_GPIO_Bit(bit); 79 else 80 value |= Set_GPIO_Bit(bit); 81 82 cx_write(gpio_reg, value); 83 } 84 85 void cx25821_gpio_init(struct cx25821_dev *dev) 86 { 87 if (dev == NULL) 88 return; 89 90 switch (dev->board) { 91 case CX25821_BOARD_CONEXANT_ATHENA10: 92 default: 93 /* set GPIO 5 to select the path for Medusa/Athena */ 94 cx25821_set_gpiopin_logicvalue(dev, 5, 1); 95 mdelay(20); 96 break; 97 } 98 99 } 100