Merge tag 'staging-4.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging and IIO driver updates from Greg KH: "Here's the big staging and iio driver update for 4.7-rc1. I think we almost broke even with this release, only adding a few more lines than we removed, which isn't bad overall given that there's a bunch of new iio drivers added. The Lustre developers seem to have woken up from their sleep and have been doing a great job in cleaning up the code and pruning unused or old cruft, the filesystem is almost readable :) Other than that, just a lot of basic coding style cleanups in the churn. All have been in linux-next for a while with no reported issues" * tag 'staging-4.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (938 commits) Staging: emxx_udc: emxx_udc: fixed coding style issue staging/gdm724x: fix "alignment should match open parenthesis" issues staging/gdm724x: Fix avoid CamelCase staging: unisys: rename misleading var ii with frag staging: unisys: visorhba: switch success handling to error handling staging: unisys: visorhba: main path needs to flow down the left margin staging: unisys: visorinput: handle_locking_key() simplifications staging: unisys: visorhba: fail gracefully for thread creation failures staging: unisys: visornic: comment restructuring and removing bad diction staging: unisys: fix format string %Lx to %llx for u64 staging: unisys: remove unused struct members staging: unisys: visorchannel: correct variable misspelling staging: unisys: visorhba: replace functionlike macro with function staging: dgnc: Need to check for NULL of ch staging: dgnc: remove redundant condition check staging: dgnc: fix 'line over 80 characters' staging: dgnc: clean up the dgnc_get_modem_info() staging: lustre: lnet: enable configuration per NI interface staging: lustre: o2iblnd: properly set ibr_why staging: lustre: o2iblnd: remove last of kiblnd_tunables_fini ...
此提交包含在:
@@ -34,6 +34,15 @@
|
||||
#include <inttypes.h>
|
||||
#include "iio_utils.h"
|
||||
|
||||
/**
|
||||
* enum autochan - state for the automatic channel enabling mechanism
|
||||
*/
|
||||
enum autochan {
|
||||
AUTOCHANNELS_DISABLED,
|
||||
AUTOCHANNELS_ENABLED,
|
||||
AUTOCHANNELS_ACTIVE,
|
||||
};
|
||||
|
||||
/**
|
||||
* size_from_channelarray() - calculate the storage size of a scan
|
||||
* @channels: the channel info array
|
||||
@@ -191,10 +200,51 @@ void process_scan(char *data,
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static int enable_disable_all_channels(char *dev_dir_name, int enable)
|
||||
{
|
||||
const struct dirent *ent;
|
||||
char scanelemdir[256];
|
||||
DIR *dp;
|
||||
int ret;
|
||||
|
||||
snprintf(scanelemdir, sizeof(scanelemdir),
|
||||
FORMAT_SCAN_ELEMENTS_DIR, dev_dir_name);
|
||||
scanelemdir[sizeof(scanelemdir)-1] = '\0';
|
||||
|
||||
dp = opendir(scanelemdir);
|
||||
if (!dp) {
|
||||
fprintf(stderr, "Enabling/disabling channels: can't open %s\n",
|
||||
scanelemdir);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
ret = -ENOENT;
|
||||
while (ent = readdir(dp), ent) {
|
||||
if (iioutils_check_suffix(ent->d_name, "_en")) {
|
||||
printf("%sabling: %s\n",
|
||||
enable ? "En" : "Dis",
|
||||
ent->d_name);
|
||||
ret = write_sysfs_int(ent->d_name, scanelemdir,
|
||||
enable);
|
||||
if (ret < 0)
|
||||
fprintf(stderr, "Failed to enable/disable %s\n",
|
||||
ent->d_name);
|
||||
}
|
||||
}
|
||||
|
||||
if (closedir(dp) == -1) {
|
||||
perror("Enabling/disabling channels: "
|
||||
"Failed to close directory");
|
||||
return -errno;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void print_usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage: generic_buffer [options]...\n"
|
||||
"Capture, convert and output data from IIO device buffer\n"
|
||||
" -a Auto-activate all available channels\n"
|
||||
" -c <n> Do n conversions\n"
|
||||
" -e Disable wait for event (new data)\n"
|
||||
" -g Use trigger-less mode\n"
|
||||
@@ -225,12 +275,16 @@ int main(int argc, char **argv)
|
||||
int scan_size;
|
||||
int noevents = 0;
|
||||
int notrigger = 0;
|
||||
enum autochan autochannels = AUTOCHANNELS_DISABLED;
|
||||
char *dummy;
|
||||
|
||||
struct iio_channel_info *channels;
|
||||
|
||||
while ((c = getopt(argc, argv, "c:egl:n:t:w:")) != -1) {
|
||||
while ((c = getopt(argc, argv, "ac:egl:n:t:w:")) != -1) {
|
||||
switch (c) {
|
||||
case 'a':
|
||||
autochannels = AUTOCHANNELS_ENABLED;
|
||||
break;
|
||||
case 'c':
|
||||
errno = 0;
|
||||
num_loops = strtoul(optarg, &dummy, 10);
|
||||
@@ -304,7 +358,19 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
/* Verify the trigger exists */
|
||||
/* Look for this "-devN" trigger */
|
||||
trig_num = find_type_by_name(trigger_name, "trigger");
|
||||
if (trig_num < 0) {
|
||||
/* OK try the simpler "-trigger" suffix instead */
|
||||
free(trigger_name);
|
||||
ret = asprintf(&trigger_name,
|
||||
"%s-trigger", device_name);
|
||||
if (ret < 0) {
|
||||
ret = -ENOMEM;
|
||||
goto error_free_dev_dir_name;
|
||||
}
|
||||
}
|
||||
|
||||
trig_num = find_type_by_name(trigger_name, "trigger");
|
||||
if (trig_num < 0) {
|
||||
fprintf(stderr, "Failed to find the trigger %s\n",
|
||||
@@ -328,12 +394,47 @@ int main(int argc, char **argv)
|
||||
"diag %s\n", dev_dir_name);
|
||||
goto error_free_triggername;
|
||||
}
|
||||
if (!num_channels) {
|
||||
if (num_channels && autochannels == AUTOCHANNELS_ENABLED) {
|
||||
fprintf(stderr, "Auto-channels selected but some channels "
|
||||
"are already activated in sysfs\n");
|
||||
fprintf(stderr, "Proceeding without activating any channels\n");
|
||||
}
|
||||
|
||||
if (!num_channels && autochannels == AUTOCHANNELS_ENABLED) {
|
||||
fprintf(stderr,
|
||||
"No channels are enabled, enabling all channels\n");
|
||||
|
||||
ret = enable_disable_all_channels(dev_dir_name, 1);
|
||||
if (ret) {
|
||||
fprintf(stderr, "Failed to enable all channels\n");
|
||||
goto error_free_triggername;
|
||||
}
|
||||
|
||||
/* This flags that we need to disable the channels again */
|
||||
autochannels = AUTOCHANNELS_ACTIVE;
|
||||
|
||||
ret = build_channel_array(dev_dir_name, &channels,
|
||||
&num_channels);
|
||||
if (ret) {
|
||||
fprintf(stderr, "Problem reading scan element "
|
||||
"information\n"
|
||||
"diag %s\n", dev_dir_name);
|
||||
goto error_disable_channels;
|
||||
}
|
||||
if (!num_channels) {
|
||||
fprintf(stderr, "Still no channels after "
|
||||
"auto-enabling, giving up\n");
|
||||
goto error_disable_channels;
|
||||
}
|
||||
}
|
||||
|
||||
if (!num_channels && autochannels == AUTOCHANNELS_DISABLED) {
|
||||
fprintf(stderr,
|
||||
"No channels are enabled, we have nothing to scan.\n");
|
||||
fprintf(stderr, "Enable channels manually in "
|
||||
FORMAT_SCAN_ELEMENTS_DIR
|
||||
"/*_en and try again.\n", dev_dir_name);
|
||||
"/*_en or pass -a to autoenable channels and "
|
||||
"try again.\n", dev_dir_name);
|
||||
ret = -ENOENT;
|
||||
goto error_free_triggername;
|
||||
}
|
||||
@@ -467,7 +568,12 @@ error_free_channels:
|
||||
error_free_triggername:
|
||||
if (datardytrigger)
|
||||
free(trigger_name);
|
||||
|
||||
error_disable_channels:
|
||||
if (autochannels == AUTOCHANNELS_ACTIVE) {
|
||||
ret = enable_disable_all_channels(dev_dir_name, 0);
|
||||
if (ret)
|
||||
fprintf(stderr, "Failed to disable all channels\n");
|
||||
}
|
||||
error_free_dev_dir_name:
|
||||
free(dev_dir_name);
|
||||
|
||||
|
@@ -53,6 +53,10 @@ static const char * const iio_chan_type_name_spec[] = {
|
||||
[IIO_ENERGY] = "energy",
|
||||
[IIO_DISTANCE] = "distance",
|
||||
[IIO_VELOCITY] = "velocity",
|
||||
[IIO_CONCENTRATION] = "concentration",
|
||||
[IIO_RESISTANCE] = "resistance",
|
||||
[IIO_PH] = "ph",
|
||||
[IIO_UVINDEX] = "uvindex",
|
||||
};
|
||||
|
||||
static const char * const iio_ev_type_text[] = {
|
||||
@@ -90,6 +94,7 @@ static const char * const iio_modifier_names[] = {
|
||||
[IIO_MOD_LIGHT_RED] = "red",
|
||||
[IIO_MOD_LIGHT_GREEN] = "green",
|
||||
[IIO_MOD_LIGHT_BLUE] = "blue",
|
||||
[IIO_MOD_LIGHT_UV] = "uv",
|
||||
[IIO_MOD_QUATERNION] = "quaternion",
|
||||
[IIO_MOD_TEMP_AMBIENT] = "ambient",
|
||||
[IIO_MOD_TEMP_OBJECT] = "object",
|
||||
@@ -102,6 +107,10 @@ static const char * const iio_modifier_names[] = {
|
||||
[IIO_MOD_WALKING] = "walking",
|
||||
[IIO_MOD_STILL] = "still",
|
||||
[IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z] = "sqrt(x^2+y^2+z^2)",
|
||||
[IIO_MOD_I] = "i",
|
||||
[IIO_MOD_Q] = "q",
|
||||
[IIO_MOD_CO2] = "co2",
|
||||
[IIO_MOD_VOC] = "voc",
|
||||
};
|
||||
|
||||
static bool event_is_known(struct iio_event_data *event)
|
||||
@@ -136,6 +145,10 @@ static bool event_is_known(struct iio_event_data *event)
|
||||
case IIO_ENERGY:
|
||||
case IIO_DISTANCE:
|
||||
case IIO_VELOCITY:
|
||||
case IIO_CONCENTRATION:
|
||||
case IIO_RESISTANCE:
|
||||
case IIO_PH:
|
||||
case IIO_UVINDEX:
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
@@ -162,6 +175,7 @@ static bool event_is_known(struct iio_event_data *event)
|
||||
case IIO_MOD_LIGHT_RED:
|
||||
case IIO_MOD_LIGHT_GREEN:
|
||||
case IIO_MOD_LIGHT_BLUE:
|
||||
case IIO_MOD_LIGHT_UV:
|
||||
case IIO_MOD_QUATERNION:
|
||||
case IIO_MOD_TEMP_AMBIENT:
|
||||
case IIO_MOD_TEMP_OBJECT:
|
||||
@@ -174,6 +188,10 @@ static bool event_is_known(struct iio_event_data *event)
|
||||
case IIO_MOD_WALKING:
|
||||
case IIO_MOD_STILL:
|
||||
case IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z:
|
||||
case IIO_MOD_I:
|
||||
case IIO_MOD_Q:
|
||||
case IIO_MOD_CO2:
|
||||
case IIO_MOD_VOC:
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
|
@@ -52,6 +52,13 @@ struct iio_channel_info {
|
||||
unsigned location;
|
||||
};
|
||||
|
||||
static inline int iioutils_check_suffix(const char *str, const char *suffix)
|
||||
{
|
||||
return strlen(str) >= strlen(suffix) &&
|
||||
strncmp(str+strlen(str)-strlen(suffix),
|
||||
suffix, strlen(suffix)) == 0;
|
||||
}
|
||||
|
||||
int iioutils_break_up_name(const char *full_name, char **generic_name);
|
||||
int iioutils_get_type(unsigned *is_signed, unsigned *bytes, unsigned *bits_used,
|
||||
unsigned *shift, uint64_t *mask, unsigned *be,
|
||||
|
新增問題並參考
封鎖使用者