Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 317193
b: refs/heads/master
c: 5212cc8
h: refs/heads/master
i:
  317191: 25ef8d8
v: v3
  • Loading branch information
Lars-Peter Clausen authored and Greg Kroah-Hartman committed Jun 5, 2012
1 parent 824d440 commit 8c2a739
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1875ffd218ddafd78f0f8e78198c137cef97fd8a
refs/heads/master: 5212cc8a9d833791a7aec566db136e78951f203d
63 changes: 63 additions & 0 deletions trunk/drivers/iio/industrialio-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,69 @@ static ssize_t iio_write_channel_ext_info(struct device *dev,
this_attr->c, buf, len);
}

ssize_t iio_enum_available_read(struct iio_dev *indio_dev,
uintptr_t priv, const struct iio_chan_spec *chan, char *buf)
{
const struct iio_enum *e = (const struct iio_enum *)priv;
unsigned int i;
size_t len = 0;

if (!e->num_items)
return 0;

for (i = 0; i < e->num_items; ++i)
len += snprintf(buf + len, PAGE_SIZE - len, "%s ", e->items[i]);

/* replace last space with a newline */
buf[len - 1] = '\n';

return len;
}
EXPORT_SYMBOL_GPL(iio_enum_available_read);

ssize_t iio_enum_read(struct iio_dev *indio_dev,
uintptr_t priv, const struct iio_chan_spec *chan, char *buf)
{
const struct iio_enum *e = (const struct iio_enum *)priv;
int i;

if (!e->get)
return -EINVAL;

i = e->get(indio_dev, chan);
if (i < 0)
return i;
else if (i >= e->num_items)
return -EINVAL;

return sprintf(buf, "%s\n", e->items[i]);
}
EXPORT_SYMBOL_GPL(iio_enum_read);

ssize_t iio_enum_write(struct iio_dev *indio_dev,
uintptr_t priv, const struct iio_chan_spec *chan, const char *buf,
size_t len)
{
const struct iio_enum *e = (const struct iio_enum *)priv;
unsigned int i;
int ret;

if (!e->set)
return -EINVAL;

for (i = 0; i < e->num_items; i++) {
if (sysfs_streq(buf, e->items[i]))
break;
}

if (i == e->num_items)
return -EINVAL;

ret = e->set(indio_dev, chan, i);
return ret ? ret : len;
}
EXPORT_SYMBOL_GPL(iio_enum_write);

static ssize_t iio_read_channel_info(struct device *dev,
struct device_attribute *attr,
char *buf)
Expand Down
64 changes: 64 additions & 0 deletions trunk/include/linux/iio/iio.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,70 @@ struct iio_chan_spec_ext_info {
uintptr_t private;
};

/**
* struct iio_enum - Enum channel info attribute
* items: A array of strings.
* num_items: Length of the item array.
* set: Set callback function, may be NULL.
* get: Get callback function, may be NULL.
*
* The iio_enum struct can be used to implement enum style channel attributes.
* Enum style attributes are those which have a set of strings which map to
* unsigned integer values. The IIO enum helper code takes care of mapping
* between value and string as well as generating a "_available" file which
* contains a list of all available items. The set callback will be called when
* the attribute is updated. The last parameter is the index to the newly
* activated item. The get callback will be used to query the currently active
* item and is supposed to return the index for it.
*/
struct iio_enum {
const char * const *items;
unsigned int num_items;
int (*set)(struct iio_dev *, const struct iio_chan_spec *, unsigned int);
int (*get)(struct iio_dev *, const struct iio_chan_spec *);
};

ssize_t iio_enum_available_read(struct iio_dev *indio_dev,
uintptr_t priv, const struct iio_chan_spec *chan, char *buf);
ssize_t iio_enum_read(struct iio_dev *indio_dev,
uintptr_t priv, const struct iio_chan_spec *chan, char *buf);
ssize_t iio_enum_write(struct iio_dev *indio_dev,
uintptr_t priv, const struct iio_chan_spec *chan, const char *buf,
size_t len);

/**
* IIO_ENUM() - Initialize enum extended channel attribute
* @_name: Attribute name
* @_shared: Whether the attribute is shared between all channels
* @_e: Pointer to a iio_enum struct
*
* This should usually be used together with IIO_ENUM_AVAILABLE()
*/
#define IIO_ENUM(_name, _shared, _e) \
{ \
.name = (_name), \
.shared = (_shared), \
.read = iio_enum_read, \
.write = iio_enum_write, \
.private = (uintptr_t)(_e), \
}

/**
* IIO_ENUM_AVAILABLE() - Initialize enum available extended channel attribute
* @_name: Attribute name ("_available" will be appended to the name)
* @_e: Pointer to a iio_enum struct
*
* Creates a read only attribute which list all the available enum items in a
* space separated list. This should usually be used together with IIO_ENUM()
*/
#define IIO_ENUM_AVAILABLE(_name, _e) \
{ \
.name = (_name "_available"), \
.shared = true, \
.read = iio_enum_available_read, \
.private = (uintptr_t)(_e), \
}

/**
* struct iio_chan_spec - specification of a single channel
* @type: What type of measurement is the channel making.
Expand Down

0 comments on commit 8c2a739

Please sign in to comment.