Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *  Driver for the Conexant CX25821 PCIe bridge
0004  *
0005  *  Copyright (C) 2009 Conexant Systems Inc.
0006  *  Authors  <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
0007  */
0008 
0009 #include <linux/module.h>
0010 #include "cx25821.h"
0011 
0012 /********************* GPIO stuffs *********************/
0013 void cx25821_set_gpiopin_direction(struct cx25821_dev *dev,
0014                    int pin_number, int pin_logic_value)
0015 {
0016     int bit = pin_number;
0017     u32 gpio_oe_reg = GPIO_LO_OE;
0018     u32 gpio_register = 0;
0019     u32 value = 0;
0020 
0021     /* Check for valid pinNumber */
0022     if (pin_number >= 47)
0023         return;
0024 
0025     if (pin_number > 31) {
0026         bit = pin_number - 31;
0027         gpio_oe_reg = GPIO_HI_OE;
0028     }
0029     /* Here we will make sure that the GPIOs 0 and 1 are output. keep the
0030      * rest as is */
0031     gpio_register = cx_read(gpio_oe_reg);
0032 
0033     if (pin_logic_value == 1)
0034         value = gpio_register | Set_GPIO_Bit(bit);
0035     else
0036         value = gpio_register & Clear_GPIO_Bit(bit);
0037 
0038     cx_write(gpio_oe_reg, value);
0039 }
0040 EXPORT_SYMBOL(cx25821_set_gpiopin_direction);
0041 
0042 static void cx25821_set_gpiopin_logicvalue(struct cx25821_dev *dev,
0043                        int pin_number, int pin_logic_value)
0044 {
0045     int bit = pin_number;
0046     u32 gpio_reg = GPIO_LO;
0047     u32 value = 0;
0048 
0049     /* Check for valid pinNumber */
0050     if (pin_number >= 47)
0051         return;
0052 
0053     /* change to output direction */
0054     cx25821_set_gpiopin_direction(dev, pin_number, 0);
0055 
0056     if (pin_number > 31) {
0057         bit = pin_number - 31;
0058         gpio_reg = GPIO_HI;
0059     }
0060 
0061     value = cx_read(gpio_reg);
0062 
0063     if (pin_logic_value == 0)
0064         value &= Clear_GPIO_Bit(bit);
0065     else
0066         value |= Set_GPIO_Bit(bit);
0067 
0068     cx_write(gpio_reg, value);
0069 }
0070 
0071 void cx25821_gpio_init(struct cx25821_dev *dev)
0072 {
0073     if (dev == NULL)
0074         return;
0075 
0076     switch (dev->board) {
0077     case CX25821_BOARD_CONEXANT_ATHENA10:
0078     default:
0079         /* set GPIO 5 to select the path for Medusa/Athena */
0080         cx25821_set_gpiopin_logicvalue(dev, 5, 1);
0081         msleep(20);
0082         break;
0083     }
0084 
0085 }