Blame view
drivers/misc/hmc6352.c
3.45 KB
873e65bc0 treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-only |
cfa3b24c3 hmc6352: add driv... |
2 3 4 5 6 7 8 |
/* * hmc6352.c - Honeywell Compass Driver * * Copyright (C) 2009 Intel Corp * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * |
cfa3b24c3 hmc6352: add driv... |
9 |
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
cfa3b24c3 hmc6352: add driv... |
10 11 12 |
*/ #include <linux/module.h> |
cfa3b24c3 hmc6352: add driv... |
13 14 15 16 17 |
#include <linux/slab.h> #include <linux/i2c.h> #include <linux/err.h> #include <linux/delay.h> #include <linux/sysfs.h> |
de916736a misc: hmc6352: fi... |
18 |
#include <linux/nospec.h> |
cfa3b24c3 hmc6352: add driv... |
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
static DEFINE_MUTEX(compass_mutex); static int compass_command(struct i2c_client *c, u8 cmd) { int ret = i2c_master_send(c, &cmd, 1); if (ret < 0) dev_warn(&c->dev, "command '%c' failed. ", cmd); return ret; } static int compass_store(struct device *dev, const char *buf, size_t count, const char *map) { struct i2c_client *c = to_i2c_client(dev); int ret; unsigned long val; |
f7b41276b misc: replace str... |
37 38 39 |
ret = kstrtoul(buf, 10, &val); if (ret) return ret; |
cfa3b24c3 hmc6352: add driv... |
40 41 |
if (val >= strlen(map)) return -EINVAL; |
de916736a misc: hmc6352: fi... |
42 |
val = array_index_nospec(val, strlen(map)); |
cfa3b24c3 hmc6352: add driv... |
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
mutex_lock(&compass_mutex); ret = compass_command(c, map[val]); mutex_unlock(&compass_mutex); if (ret < 0) return ret; return count; } static ssize_t compass_calibration_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { return compass_store(dev, buf, count, "EC"); } static ssize_t compass_power_mode_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { return compass_store(dev, buf, count, "SW"); } static ssize_t compass_heading_data_show(struct device *dev, struct device_attribute *attr, char *buf) { struct i2c_client *client = to_i2c_client(dev); unsigned char i2c_data[2]; |
6f7d485e1 drivers/misc/hmc6... |
68 |
int ret; |
cfa3b24c3 hmc6352: add driv... |
69 70 71 72 73 74 75 76 77 78 |
mutex_lock(&compass_mutex); ret = compass_command(client, 'A'); if (ret != 1) { mutex_unlock(&compass_mutex); return ret; } msleep(10); /* sending 'A' cmd we need to wait for 7-10 millisecs */ ret = i2c_master_recv(client, i2c_data, 2); mutex_unlock(&compass_mutex); |
6f7d485e1 drivers/misc/hmc6... |
79 |
if (ret < 0) { |
cfa3b24c3 hmc6352: add driv... |
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
dev_warn(dev, "i2c read data cmd failed "); return ret; } ret = (i2c_data[0] << 8) | i2c_data[1]; return sprintf(buf, "%d.%d ", ret/10, ret%10); } static DEVICE_ATTR(heading0_input, S_IRUGO, compass_heading_data_show, NULL); static DEVICE_ATTR(calibration, S_IWUSR, NULL, compass_calibration_store); static DEVICE_ATTR(power_state, S_IWUSR, NULL, compass_power_mode_store); static struct attribute *mid_att_compass[] = { &dev_attr_heading0_input.attr, &dev_attr_calibration.attr, &dev_attr_power_state.attr, NULL }; static const struct attribute_group m_compass_gr = { .name = "hmc6352", .attrs = mid_att_compass }; static int hmc6352_probe(struct i2c_client *client, const struct i2c_device_id *id) { int res; res = sysfs_create_group(&client->dev.kobj, &m_compass_gr); if (res) { dev_err(&client->dev, "device_create_file failed "); return res; } dev_info(&client->dev, "%s HMC6352 compass chip found ", client->name); return 0; } static int hmc6352_remove(struct i2c_client *client) { sysfs_remove_group(&client->dev.kobj, &m_compass_gr); return 0; } |
b8dbb5024 misc: hmc6352: co... |
128 |
static const struct i2c_device_id hmc6352_id[] = { |
cfa3b24c3 hmc6352: add driv... |
129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
{ "hmc6352", 0 }, { } }; MODULE_DEVICE_TABLE(i2c, hmc6352_id); static struct i2c_driver hmc6352_driver = { .driver = { .name = "hmc6352", }, .probe = hmc6352_probe, .remove = hmc6352_remove, .id_table = hmc6352_id, }; |
a64fe2ed7 MISC: convert dri... |
143 |
module_i2c_driver(hmc6352_driver); |
cfa3b24c3 hmc6352: add driv... |
144 145 146 147 |
MODULE_AUTHOR("Kalhan Trisal <kalhan.trisal@intel.com"); MODULE_DESCRIPTION("hmc6352 Compass Driver"); MODULE_LICENSE("GPL v2"); |