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
staging
iio
resolver
ad2s90.c
Go to the documentation of this file.
1
/*
2
* ad2s90.c simple support for the ADI Resolver to Digital Converters: AD2S90
3
*
4
* Copyright (c) 2010-2010 Analog Devices Inc.
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License version 2 as
8
* published by the Free Software Foundation.
9
*
10
*/
11
#include <linux/types.h>
12
#include <
linux/mutex.h
>
13
#include <linux/device.h>
14
#include <
linux/spi/spi.h
>
15
#include <linux/slab.h>
16
#include <
linux/sysfs.h
>
17
#include <linux/module.h>
18
19
#include <
linux/iio/iio.h
>
20
#include <
linux/iio/sysfs.h
>
21
22
struct
ad2s90_state
{
23
struct
mutex
lock
;
24
struct
spi_device
*
sdev
;
25
u8
rx
[2]
____cacheline_aligned
;
26
};
27
28
static
int
ad2s90_read_raw(
struct
iio_dev
*indio_dev,
29
struct
iio_chan_spec
const
*
chan
,
30
int
*
val
,
31
int
*val2,
32
long
m
)
33
{
34
int
ret
;
35
struct
ad2s90_state
*
st
= iio_priv(indio_dev);
36
37
mutex_lock
(&st->
lock
);
38
ret = spi_read(st->
sdev
, st->rx, 2);
39
if
(ret)
40
goto
error_ret;
41
*val = (((
u16
)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4);
42
43
error_ret:
44
mutex_unlock
(&st->
lock
);
45
46
return
IIO_VAL_INT
;
47
}
48
49
static
const
struct
iio_info
ad2s90_info = {
50
.read_raw = &ad2s90_read_raw,
51
.driver_module =
THIS_MODULE
,
52
};
53
54
static
const
struct
iio_chan_spec
ad2s90_chan = {
55
.type =
IIO_ANGL
,
56
.indexed = 1,
57
.channel = 0,
58
.info_mask =
IIO_CHAN_INFO_RAW_SEPARATE_BIT
,
59
};
60
61
static
int
__devinit
ad2s90_probe(
struct
spi_device
*
spi
)
62
{
63
struct
iio_dev
*indio_dev;
64
struct
ad2s90_state
*
st
;
65
int
ret
= 0;
66
67
indio_dev =
iio_device_alloc
(
sizeof
(*st));
68
if
(indio_dev ==
NULL
) {
69
ret = -
ENOMEM
;
70
goto
error_ret;
71
}
72
st = iio_priv(indio_dev);
73
spi_set_drvdata(spi, indio_dev);
74
75
mutex_init
(&st->
lock
);
76
st->
sdev
=
spi
;
77
indio_dev->
dev
.parent = &spi->
dev
;
78
indio_dev->
info
= &ad2s90_info;
79
indio_dev->
modes
=
INDIO_DIRECT_MODE
;
80
indio_dev->
channels
= &ad2s90_chan;
81
indio_dev->
num_channels
= 1;
82
indio_dev->
name
=
spi_get_device_id
(spi)->name;
83
84
ret =
iio_device_register
(indio_dev);
85
if
(ret)
86
goto
error_free_dev;
87
88
/* need 600ns between CS and the first falling edge of SCLK */
89
spi->
max_speed_hz
= 830000;
90
spi->
mode
=
SPI_MODE_3
;
91
spi_setup
(spi);
92
93
return
0;
94
95
error_free_dev:
96
iio_device_free
(indio_dev);
97
error_ret:
98
return
ret
;
99
}
100
101
static
int
__devexit
ad2s90_remove(
struct
spi_device
*spi)
102
{
103
iio_device_unregister
(spi_get_drvdata(spi));
104
iio_device_free
(spi_get_drvdata(spi));
105
106
return
0;
107
}
108
109
static
const
struct
spi_device_id
ad2s90_id[] = {
110
{
"ad2s90"
},
111
{}
112
};
113
MODULE_DEVICE_TABLE
(spi, ad2s90_id);
114
115
static
struct
spi_driver
ad2s90_driver = {
116
.driver = {
117
.name =
"ad2s90"
,
118
.owner =
THIS_MODULE
,
119
},
120
.probe = ad2s90_probe,
121
.remove =
__devexit_p
(ad2s90_remove),
122
.id_table = ad2s90_id,
123
};
124
module_spi_driver
(ad2s90_driver);
125
126
MODULE_AUTHOR
(
"Graff Yang <
[email protected]
>"
);
127
MODULE_DESCRIPTION
(
"Analog Devices AD2S90 Resolver to Digital SPI driver"
);
128
MODULE_LICENSE
(
"GPL v2"
);
Generated on Thu Jan 10 2013 14:28:52 for Linux Kernel by
1.8.2