Lines Matching +full:data +full:- +full:channel

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (c) 2012 Savoir-faire Linux Inc.
21 #include <linux/hwmon-sysfs.h>
34 #define MAX197_SCALE 12207 /* Scale coefficient for raw data */
40 * struct max197_data - device instance specific data
41 * @pdata: Platform data.
57 static inline void max197_set_unipolarity(struct max197_data *data, int channel) in max197_set_unipolarity() argument
59 data->ctrl_bytes[channel] &= ~MAX197_BIP; in max197_set_unipolarity()
62 static inline void max197_set_bipolarity(struct max197_data *data, int channel) in max197_set_bipolarity() argument
64 data->ctrl_bytes[channel] |= MAX197_BIP; in max197_set_bipolarity()
67 static inline void max197_set_half_range(struct max197_data *data, int channel) in max197_set_half_range() argument
69 data->ctrl_bytes[channel] &= ~MAX197_RNG; in max197_set_half_range()
72 static inline void max197_set_full_range(struct max197_data *data, int channel) in max197_set_full_range() argument
74 data->ctrl_bytes[channel] |= MAX197_RNG; in max197_set_full_range()
77 static inline bool max197_is_bipolar(struct max197_data *data, int channel) in max197_is_bipolar() argument
79 return data->ctrl_bytes[channel] & MAX197_BIP; in max197_is_bipolar()
82 static inline bool max197_is_full_range(struct max197_data *data, int channel) in max197_is_full_range() argument
84 return data->ctrl_bytes[channel] & MAX197_RNG; in max197_is_full_range()
91 struct max197_data *data = dev_get_drvdata(dev); in max197_show_range() local
93 int channel = attr->index; in max197_show_range() local
94 bool is_min = attr->nr; in max197_show_range()
97 if (mutex_lock_interruptible(&data->lock)) in max197_show_range()
98 return -ERESTARTSYS; in max197_show_range()
100 range = max197_is_full_range(data, channel) ? in max197_show_range()
101 data->limit : data->limit / 2; in max197_show_range()
103 if (max197_is_bipolar(data, channel)) in max197_show_range()
104 range = -range; in max197_show_range()
109 mutex_unlock(&data->lock); in max197_show_range()
119 struct max197_data *data = dev_get_drvdata(dev); in max197_store_range() local
121 int channel = attr->index; in max197_store_range() local
122 bool is_min = attr->nr; in max197_store_range()
124 int half = data->limit / 2; in max197_store_range()
125 int full = data->limit; in max197_store_range()
128 return -EINVAL; in max197_store_range()
131 if (value <= -full) in max197_store_range()
132 value = -full; in max197_store_range()
134 value = -half; in max197_store_range()
144 if (mutex_lock_interruptible(&data->lock)) in max197_store_range()
145 return -ERESTARTSYS; in max197_store_range()
149 max197_set_unipolarity(data, channel); in max197_store_range()
150 } else if (value == -half) { in max197_store_range()
151 max197_set_bipolarity(data, channel); in max197_store_range()
152 max197_set_half_range(data, channel); in max197_store_range()
153 } else if (value == -full) { in max197_store_range()
154 max197_set_bipolarity(data, channel); in max197_store_range()
155 max197_set_full_range(data, channel); in max197_store_range()
158 max197_set_half_range(data, channel); in max197_store_range()
161 max197_set_full_range(data, channel); in max197_store_range()
164 mutex_unlock(&data->lock); in max197_store_range()
174 struct max197_data *data = dev_get_drvdata(dev); in max197_show_input() local
176 int channel = attr->index; in max197_show_input() local
180 if (mutex_lock_interruptible(&data->lock)) in max197_show_input()
181 return -ERESTARTSYS; in max197_show_input()
183 ret = data->pdata->convert(data->ctrl_bytes[channel]); in max197_show_input()
194 if (data->scale) { in max197_show_input()
196 if (max197_is_full_range(data, channel)) in max197_show_input()
204 mutex_unlock(&data->lock); in max197_show_input()
212 return sprintf(buf, "%s\n", pdev->name); in name_show()
261 struct max197_data *data; in max197_probe() local
262 struct max197_platform_data *pdata = dev_get_platdata(&pdev->dev); in max197_probe()
263 enum max197_chips chip = platform_get_device_id(pdev)->driver_data; in max197_probe()
266 dev_err(&pdev->dev, "no platform data supplied\n"); in max197_probe()
267 return -EINVAL; in max197_probe()
270 if (pdata->convert == NULL) { in max197_probe()
271 dev_err(&pdev->dev, "no convert function supplied\n"); in max197_probe()
272 return -EINVAL; in max197_probe()
275 data = devm_kzalloc(&pdev->dev, sizeof(struct max197_data), GFP_KERNEL); in max197_probe()
276 if (!data) in max197_probe()
277 return -ENOMEM; in max197_probe()
279 data->pdata = pdata; in max197_probe()
280 mutex_init(&data->lock); in max197_probe()
283 data->limit = MAX197_LIMIT; in max197_probe()
284 data->scale = true; in max197_probe()
286 data->limit = MAX199_LIMIT; in max197_probe()
287 data->scale = false; in max197_probe()
291 data->ctrl_bytes[ch] = (u8) ch; in max197_probe()
293 platform_set_drvdata(pdev, data); in max197_probe()
295 ret = sysfs_create_group(&pdev->dev.kobj, &max197_sysfs_group); in max197_probe()
297 dev_err(&pdev->dev, "sysfs create group failed\n"); in max197_probe()
301 data->hwmon_dev = hwmon_device_register(&pdev->dev); in max197_probe()
302 if (IS_ERR(data->hwmon_dev)) { in max197_probe()
303 ret = PTR_ERR(data->hwmon_dev); in max197_probe()
304 dev_err(&pdev->dev, "hwmon device register failed\n"); in max197_probe()
311 sysfs_remove_group(&pdev->dev.kobj, &max197_sysfs_group); in max197_probe()
317 struct max197_data *data = platform_get_drvdata(pdev); in max197_remove() local
319 hwmon_device_unregister(data->hwmon_dev); in max197_remove()
320 sysfs_remove_group(&pdev->dev.kobj, &max197_sysfs_group); in max197_remove()
341 MODULE_AUTHOR("Savoir-faire Linux Inc. <[email protected]>");