aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Cameron <jic23@cam.ac.uk>2010-05-04 09:43:10 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-05-11 14:36:06 -0400
commit3bf877c1cc0d17ef471f21ae319fcb9c9211df61 (patch)
tree08d1007770debdf959a5fda1df81e7cbec929877
parentc3fa0fddd6fed10eda57de8912a634890ee27a31 (diff)
staging:iio:max1363 add support for 8 bit equivalent devices, max1036-9, max11600-5
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/staging/iio/adc/Kconfig12
-rw-r--r--drivers/staging/iio/adc/max1363_core.c143
-rw-r--r--drivers/staging/iio/adc/max1363_ring.c23
3 files changed, 161 insertions, 17 deletions
diff --git a/drivers/staging/iio/adc/Kconfig b/drivers/staging/iio/adc/Kconfig
index afc8318a96d..0835fbc86c2 100644
--- a/drivers/staging/iio/adc/Kconfig
+++ b/drivers/staging/iio/adc/Kconfig
@@ -10,11 +10,13 @@ config MAX1363
10 select MAX1363_RING_BUFFER 10 select MAX1363_RING_BUFFER
11 help 11 help
12 Say yes here to build support for many MAXIM i2c analog to digital 12 Say yes here to build support for many MAXIM i2c analog to digital
13 convertors (ADC). (max1361, max1362, max1363, max1364, max1136, 13 convertors (ADC). (max1361, max1362, max1363, max1364, max1036,
14 max1136, max1137, max1138, max1139, max1236, max1237, max11238, 14 max1037, max1038, max1039, max1136, max1136, max1137, max1138,
15 max1239, max11606, max11607, max11608, max11609, max11610, 15 max1139, max1236, max1237, max11238, max1239, max11600, max11601,
16 max11611, max11612, max11613, max11614, max11615, max11616, 16 max11602, max11603, max11604, max11605, max11606, max11607,
17 max11617) Provides direct access via sysfs. 17 max11608, max11609, max11610, max11611, max11612, max11613,
18 max11614, max11615, max11616, max11617) Provides direct access
19 via sysfs.
18 20
19config MAX1363_RING_BUFFER 21config MAX1363_RING_BUFFER
20 bool "MAXIM max1363: use ring buffer" 22 bool "MAXIM max1363: use ring buffer"
diff --git a/drivers/staging/iio/adc/max1363_core.c b/drivers/staging/iio/adc/max1363_core.c
index c53bf6d8410..fa91cc14c64 100644
--- a/drivers/staging/iio/adc/max1363_core.c
+++ b/drivers/staging/iio/adc/max1363_core.c
@@ -226,13 +226,24 @@ static ssize_t max1363_read_single_channel(struct device *dev,
226 if (ret) 226 if (ret)
227 goto error_ret; 227 goto error_ret;
228 } 228 }
229 /* Get reading */ 229 if (st->chip_info->bits != 8) {
230 data = i2c_master_recv(client, rxbuf, 2); 230 /* Get reading */
231 if (data < 0) { 231 data = i2c_master_recv(client, rxbuf, 2);
232 ret = data; 232 if (data < 0) {
233 goto error_ret; 233 ret = data;
234 goto error_ret;
235 }
236
237 data = (s32)(rxbuf[1]) | ((s32)(rxbuf[0] & 0x0F)) << 8;
238 } else {
239 /* Get reading */
240 data = i2c_master_recv(client, rxbuf, 1);
241 if (data < 0) {
242 ret = data;
243 goto error_ret;
244 }
245 data = rxbuf[0];
234 } 246 }
235 data = (s32)(rxbuf[1]) | ((s32)(rxbuf[0] & 0x0F)) << 8;
236 } 247 }
237 /* Pretty print the result */ 248 /* Pretty print the result */
238 len = sprintf(buf, "%u\n", data); 249 len = sprintf(buf, "%u\n", data);
@@ -508,6 +519,10 @@ enum { max1361,
508 max1362, 519 max1362,
509 max1363, 520 max1363,
510 max1364, 521 max1364,
522 max1036,
523 max1037,
524 max1038,
525 max1039,
511 max1136, 526 max1136,
512 max1137, 527 max1137,
513 max1138, 528 max1138,
@@ -516,6 +531,12 @@ enum { max1361,
516 max1237, 531 max1237,
517 max1238, 532 max1238,
518 max1239, 533 max1239,
534 max11600,
535 max11601,
536 max11602,
537 max11603,
538 max11604,
539 max11605,
519 max11606, 540 max11606,
520 max11607, 541 max11607,
521 max11608, 542 max11608,
@@ -577,6 +598,46 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = {
577 .dev_attrs = &max1363_dev_attr_group, 598 .dev_attrs = &max1363_dev_attr_group,
578 .scan_attrs = &max1363_scan_el_group, 599 .scan_attrs = &max1363_scan_el_group,
579 }, { 600 }, {
601 .name = "max1036",
602 .num_inputs = 4,
603 .bits = 8,
604 .int_vref_mv = 4096,
605 .mode_list = max1236_mode_list,
606 .num_modes = ARRAY_SIZE(max1236_mode_list),
607 .default_mode = s0to3,
608 .dev_attrs = &max1363_dev_attr_group,
609 .scan_attrs = &max1363_scan_el_group,
610 }, {
611 .name = "max1037",
612 .num_inputs = 4,
613 .bits = 8,
614 .int_vref_mv = 2048,
615 .mode_list = max1236_mode_list,
616 .num_modes = ARRAY_SIZE(max1236_mode_list),
617 .default_mode = s0to3,
618 .dev_attrs = &max1363_dev_attr_group,
619 .scan_attrs = &max1363_scan_el_group,
620 }, {
621 .name = "max1038",
622 .num_inputs = 12,
623 .bits = 8,
624 .int_vref_mv = 4096,
625 .mode_list = max1238_mode_list,
626 .num_modes = ARRAY_SIZE(max1238_mode_list),
627 .default_mode = s0to11,
628 .dev_attrs = &max1238_dev_attr_group,
629 .scan_attrs = &max1238_scan_el_group,
630 }, {
631 .name = "max1039",
632 .num_inputs = 12,
633 .bits = 8,
634 .int_vref_mv = 2048,
635 .mode_list = max1238_mode_list,
636 .num_modes = ARRAY_SIZE(max1238_mode_list),
637 .default_mode = s0to11,
638 .dev_attrs = &max1238_dev_attr_group,
639 .scan_attrs = &max1238_scan_el_group,
640 }, {
580 .name = "max1136", 641 .name = "max1136",
581 .num_inputs = 4, 642 .num_inputs = 4,
582 .bits = 10, 643 .bits = 10,
@@ -657,6 +718,66 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = {
657 .dev_attrs = &max1238_dev_attr_group, 718 .dev_attrs = &max1238_dev_attr_group,
658 .scan_attrs = &max1238_scan_el_group, 719 .scan_attrs = &max1238_scan_el_group,
659 }, { 720 }, {
721 .name = "max11600",
722 .num_inputs = 4,
723 .bits = 8,
724 .int_vref_mv = 4096,
725 .mode_list = max11607_mode_list,
726 .num_modes = ARRAY_SIZE(max11607_mode_list),
727 .default_mode = s0to3,
728 .dev_attrs = &max1363_dev_attr_group,
729 .scan_attrs = &max1363_scan_el_group,
730 }, {
731 .name = "max11601",
732 .num_inputs = 4,
733 .bits = 8,
734 .int_vref_mv = 2048,
735 .mode_list = max11607_mode_list,
736 .num_modes = ARRAY_SIZE(max11607_mode_list),
737 .default_mode = s0to3,
738 .dev_attrs = &max1363_dev_attr_group,
739 .scan_attrs = &max1363_scan_el_group,
740 }, {
741 .name = "max11602",
742 .num_inputs = 8,
743 .bits = 8,
744 .int_vref_mv = 4096,
745 .mode_list = max11608_mode_list,
746 .num_modes = ARRAY_SIZE(max11608_mode_list),
747 .default_mode = s0to7,
748 .dev_attrs = &max11608_dev_attr_group,
749 .scan_attrs = &max11608_scan_el_group,
750 }, {
751 .name = "max11603",
752 .num_inputs = 8,
753 .bits = 8,
754 .int_vref_mv = 2048,
755 .mode_list = max11608_mode_list,
756 .num_modes = ARRAY_SIZE(max11608_mode_list),
757 .default_mode = s0to7,
758 .dev_attrs = &max11608_dev_attr_group,
759 .scan_attrs = &max11608_scan_el_group,
760 }, {
761 .name = "max11604",
762 .num_inputs = 12,
763 .bits = 8,
764 .int_vref_mv = 4098,
765 .mode_list = max1238_mode_list,
766 .num_modes = ARRAY_SIZE(max1238_mode_list),
767 .default_mode = s0to11,
768 .dev_attrs = &max1238_dev_attr_group,
769 .scan_attrs = &max1238_scan_el_group,
770 }, {
771 .name = "max11605",
772 .num_inputs = 12,
773 .bits = 8,
774 .int_vref_mv = 2048,
775 .mode_list = max1238_mode_list,
776 .num_modes = ARRAY_SIZE(max1238_mode_list),
777 .default_mode = s0to11,
778 .dev_attrs = &max1238_dev_attr_group,
779 .scan_attrs = &max1238_scan_el_group,
780 }, {
660 .name = "max11606", 781 .name = "max11606",
661 .num_inputs = 4, 782 .num_inputs = 4,
662 .bits = 10, 783 .bits = 10,
@@ -920,6 +1041,10 @@ static const struct i2c_device_id max1363_id[] = {
920 { "max1362", max1362 }, 1041 { "max1362", max1362 },
921 { "max1363", max1363 }, 1042 { "max1363", max1363 },
922 { "max1364", max1364 }, 1043 { "max1364", max1364 },
1044 { "max1036", max1036 },
1045 { "max1037", max1037 },
1046 { "max1038", max1038 },
1047 { "max1039", max1039 },
923 { "max1136", max1136 }, 1048 { "max1136", max1136 },
924 { "max1137", max1137 }, 1049 { "max1137", max1137 },
925 { "max1138", max1138 }, 1050 { "max1138", max1138 },
@@ -928,6 +1053,12 @@ static const struct i2c_device_id max1363_id[] = {
928 { "max1237", max1237 }, 1053 { "max1237", max1237 },
929 { "max1238", max1238 }, 1054 { "max1238", max1238 },
930 { "max1239", max1239 }, 1055 { "max1239", max1239 },
1056 { "max11600", max11600 },
1057 { "max11601", max11601 },
1058 { "max11602", max11602 },
1059 { "max11603", max11603 },
1060 { "max11604", max11604 },
1061 { "max11605", max11605 },
931 { "max11606", max11606 }, 1062 { "max11606", max11606 },
932 { "max11607", max11607 }, 1063 { "max11607", max11607 },
933 { "max11608", max11608 }, 1064 { "max11608", max11608 },
diff --git a/drivers/staging/iio/adc/max1363_ring.c b/drivers/staging/iio/adc/max1363_ring.c
index f1e37f2cf4e..85fde751a15 100644
--- a/drivers/staging/iio/adc/max1363_ring.c
+++ b/drivers/staging/iio/adc/max1363_ring.c
@@ -55,8 +55,11 @@ int max1363_single_channel_from_ring(long mask, struct max1363_state *st)
55 count++; 55 count++;
56 mask >>= 1; 56 mask >>= 1;
57 } 57 }
58 return ((int)(ring_data[count*2 + 0] & 0x0F) << 8) 58 if (st->chip_info->bits != 8)
59 + (int)(ring_data[count*2 + 1]); 59 return ((int)(ring_data[count*2 + 0] & 0x0F) << 8)
60 + (int)(ring_data[count*2 + 1]);
61 else
62 return ring_data[count];
60 63
61error_free_ring_data: 64error_free_ring_data:
62 kfree(ring_data); 65 kfree(ring_data);
@@ -90,7 +93,10 @@ static int max1363_ring_preenable(struct iio_dev *indio_dev)
90 93
91 numvals = hweight_long(st->current_mode->modemask); 94 numvals = hweight_long(st->current_mode->modemask);
92 if (indio_dev->ring->access.set_bpd) { 95 if (indio_dev->ring->access.set_bpd) {
93 d_size = numvals*2 + sizeof(s64); 96 if (st->chip_info->bits != 8)
97 d_size = numvals*2 + sizeof(s64);
98 else
99 d_size = numvals + sizeof(s64);
94 if (d_size % 8) 100 if (d_size % 8)
95 d_size += 8 - (d_size % 8); 101 d_size += 8 - (d_size % 8);
96 indio_dev->ring->access.set_bpd(indio_dev->ring, d_size); 102 indio_dev->ring->access.set_bpd(indio_dev->ring, d_size);
@@ -166,7 +172,10 @@ static void max1363_poll_bh_to_ring(struct work_struct *work_s)
166 unsigned long numvals = hweight_long(st->current_mode->modemask); 172 unsigned long numvals = hweight_long(st->current_mode->modemask);
167 173
168 /* Ensure the timestamp is 8 byte aligned */ 174 /* Ensure the timestamp is 8 byte aligned */
169 d_size = numvals*2 + sizeof(s64); 175 if (st->chip_info->bits != 8)
176 d_size = numvals*2 + sizeof(s64);
177 else
178 d_size = numvals + sizeof(s64);
170 if (d_size % sizeof(s64)) 179 if (d_size % sizeof(s64))
171 d_size += sizeof(s64) - (d_size % sizeof(s64)); 180 d_size += sizeof(s64) - (d_size % sizeof(s64));
172 181
@@ -184,8 +193,10 @@ static void max1363_poll_bh_to_ring(struct work_struct *work_s)
184 rxbuf = kmalloc(d_size, GFP_KERNEL); 193 rxbuf = kmalloc(d_size, GFP_KERNEL);
185 if (rxbuf == NULL) 194 if (rxbuf == NULL)
186 return; 195 return;
187 196 if (st->chip_info->bits != 8)
188 b_sent = i2c_master_recv(st->client, rxbuf, numvals*2); 197 b_sent = i2c_master_recv(st->client, rxbuf, numvals*2);
198 else
199 b_sent = i2c_master_recv(st->client, rxbuf, numvals);
189 if (b_sent < 0) 200 if (b_sent < 0)
190 goto done; 201 goto done;
191 202