0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/module.h>
0010 #include "cx25821.h"
0011
0012
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
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
0030
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
0050 if (pin_number >= 47)
0051 return;
0052
0053
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
0080 cx25821_set_gpiopin_logicvalue(dev, 5, 1);
0081 msleep(20);
0082 break;
0083 }
0084
0085 }