Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
media
dvb-frontends
isl6421.c
Go to the documentation of this file.
1
/*
2
* isl6421.h - driver for lnb supply and control ic ISL6421
3
*
4
* Copyright (C) 2006 Andrew de Quincey
5
* Copyright (C) 2006 Oliver Endriss
6
*
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 2
10
* of the License, or (at your option) any later version.
11
*
12
*
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
17
*
18
*
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
* Or, point your browser to http://www.gnu.org/copyleft/gpl.html
23
*
24
*
25
* the project's page is at http://www.linuxtv.org
26
*/
27
#include <
linux/delay.h
>
28
#include <linux/errno.h>
29
#include <
linux/init.h
>
30
#include <linux/kernel.h>
31
#include <linux/module.h>
32
#include <linux/string.h>
33
#include <linux/slab.h>
34
35
#include "
dvb_frontend.h
"
36
#include "
isl6421.h
"
37
38
struct
isl6421
{
39
u8
config
;
40
u8
override_or
;
41
u8
override_and
;
42
struct
i2c_adapter
*
i2c
;
43
u8
i2c_addr
;
44
};
45
46
static
int
isl6421_set_voltage(
struct
dvb_frontend
*fe,
fe_sec_voltage_t
voltage)
47
{
48
struct
isl6421
*
isl6421
= (
struct
isl6421 *) fe->
sec_priv
;
49
struct
i2c_msg
msg
= { .addr = isl6421->
i2c_addr
, .flags = 0,
50
.buf = &isl6421->
config
,
51
.len =
sizeof
(isl6421->
config
) };
52
53
isl6421
->
config
&= ~(
ISL6421_VSEL1
|
ISL6421_EN1
);
54
55
switch
(voltage) {
56
case
SEC_VOLTAGE_OFF
:
57
break
;
58
case
SEC_VOLTAGE_13
:
59
isl6421
->
config
|=
ISL6421_EN1
;
60
break
;
61
case
SEC_VOLTAGE_18
:
62
isl6421
->
config
|= (
ISL6421_EN1
|
ISL6421_VSEL1
);
63
break
;
64
default
:
65
return
-
EINVAL
;
66
}
67
68
isl6421
->
config
|=
isl6421
->
override_or
;
69
isl6421
->
config
&=
isl6421
->
override_and
;
70
71
return
(
i2c_transfer
(
isl6421
->
i2c
, &
msg
, 1) == 1) ? 0 : -
EIO
;
72
}
73
74
static
int
isl6421_enable_high_lnb_voltage(
struct
dvb_frontend
*fe,
long
arg
)
75
{
76
struct
isl6421
*
isl6421
= (
struct
isl6421 *) fe->
sec_priv
;
77
struct
i2c_msg
msg
= { .addr = isl6421->
i2c_addr
, .flags = 0,
78
.buf = &isl6421->
config
,
79
.len =
sizeof
(isl6421->
config
) };
80
81
if
(
arg
)
82
isl6421
->
config
|=
ISL6421_LLC1
;
83
else
84
isl6421
->
config
&= ~
ISL6421_LLC1
;
85
86
isl6421
->
config
|=
isl6421
->
override_or
;
87
isl6421
->
config
&=
isl6421
->
override_and
;
88
89
return
(
i2c_transfer
(
isl6421
->
i2c
, &
msg
, 1) == 1) ? 0 : -
EIO
;
90
}
91
92
static
void
isl6421_release(
struct
dvb_frontend
*fe)
93
{
94
/* power off */
95
isl6421_set_voltage(fe,
SEC_VOLTAGE_OFF
);
96
97
/* free */
98
kfree
(fe->
sec_priv
);
99
fe->
sec_priv
=
NULL
;
100
}
101
102
struct
dvb_frontend
*
isl6421_attach
(
struct
dvb_frontend
*fe,
struct
i2c_adapter
*i2c,
u8
i2c_addr,
103
u8
override_set,
u8
override_clear)
104
{
105
struct
isl6421
*
isl6421
=
kmalloc
(
sizeof
(
struct
isl6421),
GFP_KERNEL
);
106
if
(!isl6421)
107
return
NULL
;
108
109
/* default configuration */
110
isl6421->
config
=
ISL6421_ISEL1
;
111
isl6421->
i2c
=
i2c
;
112
isl6421->
i2c_addr
=
i2c_addr
;
113
fe->
sec_priv
= isl6421;
114
115
/* bits which should be forced to '1' */
116
isl6421->
override_or
= override_set;
117
118
/* bits which should be forced to '0' */
119
isl6421->
override_and
= ~override_clear;
120
121
/* detect if it is present or not */
122
if
(isl6421_set_voltage(fe,
SEC_VOLTAGE_OFF
)) {
123
kfree
(isl6421);
124
fe->
sec_priv
=
NULL
;
125
return
NULL
;
126
}
127
128
/* install release callback */
129
fe->
ops
.release_sec = isl6421_release;
130
131
/* override frontend ops */
132
fe->
ops
.set_voltage = isl6421_set_voltage;
133
fe->
ops
.enable_high_lnb_voltage = isl6421_enable_high_lnb_voltage;
134
135
return
fe;
136
}
137
EXPORT_SYMBOL
(
isl6421_attach
);
138
139
MODULE_DESCRIPTION
(
"Driver for lnb supply and control ic isl6421"
);
140
MODULE_AUTHOR
(
"Andrew de Quincey & Oliver Endriss"
);
141
MODULE_LICENSE
(
"GPL"
);
Generated on Thu Jan 10 2013 13:45:41 for Linux Kernel by
1.8.2