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 <graff.yang@gmail.com>"
);
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