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 *********************/ 26void 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 54static void cx25821_set_gpiopin_logicvalue(struct cx25821_dev *dev, 55 int pin_number, int pin_logic_value) 56{ 57 int bit = pin_number; 58 u32 gpio_reg = GPIO_LO; 59 u32 value = 0; 60 61 /* Check for valid pinNumber */ 62 if (pin_number >= 47) 63 return; 64 65 /* change to output direction */ 66 cx25821_set_gpiopin_direction(dev, pin_number, 0); 67 68 if (pin_number > 31) { 69 bit = pin_number - 31; 70 gpio_reg = GPIO_HI; 71 } 72 73 value = cx_read(gpio_reg); 74 75 if (pin_logic_value == 0) 76 value &= Clear_GPIO_Bit(bit); 77 else 78 value |= Set_GPIO_Bit(bit); 79 80 cx_write(gpio_reg, value); 81} 82 83void cx25821_gpio_init(struct cx25821_dev *dev) 84{ 85 if (dev == NULL) 86 return; 87 88 switch (dev->board) { 89 case CX25821_BOARD_CONEXANT_ATHENA10: 90 default: 91 /* set GPIO 5 to select the path for Medusa/Athena */ 92 cx25821_set_gpiopin_logicvalue(dev, 5, 1); 93 mdelay(20); 94 break; 95 } 96 97} 98