1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <linux/module.h>
20#include "cx25821.h"
21
22
23void cx25821_set_gpiopin_direction(struct cx25821_dev *dev,
24 int pin_number, int pin_logic_value)
25{
26 int bit = pin_number;
27 u32 gpio_oe_reg = GPIO_LO_OE;
28 u32 gpio_register = 0;
29 u32 value = 0;
30
31
32 if (pin_number >= 47)
33 return;
34
35 if (pin_number > 31) {
36 bit = pin_number - 31;
37 gpio_oe_reg = GPIO_HI_OE;
38 }
39
40
41 gpio_register = cx_read(gpio_oe_reg);
42
43 if (pin_logic_value == 1)
44 value = gpio_register | Set_GPIO_Bit(bit);
45 else
46 value = gpio_register & Clear_GPIO_Bit(bit);
47
48 cx_write(gpio_oe_reg, value);
49}
50EXPORT_SYMBOL(cx25821_set_gpiopin_direction);
51
52static void cx25821_set_gpiopin_logicvalue(struct cx25821_dev *dev,
53 int pin_number, int pin_logic_value)
54{
55 int bit = pin_number;
56 u32 gpio_reg = GPIO_LO;
57 u32 value = 0;
58
59
60 if (pin_number >= 47)
61 return;
62
63
64 cx25821_set_gpiopin_direction(dev, pin_number, 0);
65
66 if (pin_number > 31) {
67 bit = pin_number - 31;
68 gpio_reg = GPIO_HI;
69 }
70
71 value = cx_read(gpio_reg);
72
73 if (pin_logic_value == 0)
74 value &= Clear_GPIO_Bit(bit);
75 else
76 value |= Set_GPIO_Bit(bit);
77
78 cx_write(gpio_reg, value);
79}
80
81void cx25821_gpio_init(struct cx25821_dev *dev)
82{
83 if (dev == NULL)
84 return;
85
86 switch (dev->board) {
87 case CX25821_BOARD_CONEXANT_ATHENA10:
88 default:
89
90 cx25821_set_gpiopin_logicvalue(dev, 5, 1);
91 mdelay(20);
92 break;
93 }
94
95}
96