1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/module.h>
24#include "cx25821.h"
25
26
27void 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
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
44
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}
54EXPORT_SYMBOL(cx25821_set_gpiopin_direction);
55
56static 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
64 if (pin_number >= 47)
65 return;
66
67
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
85void 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
94 cx25821_set_gpiopin_logicvalue(dev, 5, 1);
95 mdelay(20);
96 break;
97 }
98
99}
100