aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorMichal Marek <mmarek@suse.cz>2010-10-27 18:54:25 -0400
committerMichal Marek <mmarek@suse.cz>2010-10-27 18:54:25 -0400
commit70c74e59db7450d5c9164abeb3b6752f8045288b (patch)
tree1a9b3c6e3c0adee80c7ddc8e86dcf746574fb37b /scripts
parentb3235fe420edf7faf5e8e67b978b12d5524fb161 (diff)
parent42368c37fbd51f7b478d041ae55c5df000897158 (diff)
Merge branch 'message-callback' into kbuild/kconfig
Conflicts: scripts/kconfig/nconf.c
Diffstat (limited to 'scripts')
-rw-r--r--scripts/kconfig/confdata.c35
-rw-r--r--scripts/kconfig/lkc_proto.h2
-rw-r--r--scripts/kconfig/nconf.c51
3 files changed, 40 insertions, 48 deletions
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 96110ea41cf3..9df80114b47b 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -19,6 +19,9 @@
19static void conf_warning(const char *fmt, ...) 19static void conf_warning(const char *fmt, ...)
20 __attribute__ ((format (printf, 1, 2))); 20 __attribute__ ((format (printf, 1, 2)));
21 21
22static void conf_message(const char *fmt, ...)
23 __attribute__ ((format (printf, 1, 2)));
24
22static const char *conf_filename; 25static const char *conf_filename;
23static int conf_lineno, conf_warnings, conf_unsaved; 26static int conf_lineno, conf_warnings, conf_unsaved;
24 27
@@ -35,6 +38,29 @@ static void conf_warning(const char *fmt, ...)
35 conf_warnings++; 38 conf_warnings++;
36} 39}
37 40
41static void conf_default_message_callback(const char *fmt, va_list ap)
42{
43 printf("#\n# ");
44 vprintf(fmt, ap);
45 printf("\n#\n");
46}
47
48static void (*conf_message_callback) (const char *fmt, va_list ap) =
49 conf_default_message_callback;
50void conf_set_message_callback(void (*fn) (const char *fmt, va_list ap))
51{
52 conf_message_callback = fn;
53}
54
55static void conf_message(const char *fmt, ...)
56{
57 va_list ap;
58
59 va_start(ap, fmt);
60 if (conf_message_callback)
61 conf_message_callback(fmt, ap);
62}
63
38const char *conf_get_configname(void) 64const char *conf_get_configname(void)
39{ 65{
40 char *name = getenv("KCONFIG_CONFIG"); 66 char *name = getenv("KCONFIG_CONFIG");
@@ -184,9 +210,8 @@ int conf_read_simple(const char *name, int def)
184 name = conf_expand_value(prop->expr->left.sym->name); 210 name = conf_expand_value(prop->expr->left.sym->name);
185 in = zconf_fopen(name); 211 in = zconf_fopen(name);
186 if (in) { 212 if (in) {
187 printf(_("#\n" 213 conf_message(_("using defaults found in %s"),
188 "# using defaults found in %s\n" 214 name);
189 "#\n"), name);
190 goto load; 215 goto load;
191 } 216 }
192 } 217 }
@@ -642,9 +667,7 @@ next:
642 return 1; 667 return 1;
643 } 668 }
644 669
645 printf(_("#\n" 670 conf_message(_("configuration written to %s"), newname);
646 "# configuration written to %s\n"
647 "#\n"), newname);
648 671
649 sym_set_change_count(0); 672 sym_set_change_count(0);
650 673
diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h
index 4531badb3fe1..17342fef38b9 100644
--- a/scripts/kconfig/lkc_proto.h
+++ b/scripts/kconfig/lkc_proto.h
@@ -1,3 +1,4 @@
1#include <stdarg.h>
1 2
2/* confdata.c */ 3/* confdata.c */
3P(conf_parse,void,(const char *name)); 4P(conf_parse,void,(const char *name));
@@ -8,6 +9,7 @@ P(conf_write,int,(const char *name));
8P(conf_write_autoconf,int,(void)); 9P(conf_write_autoconf,int,(void));
9P(conf_get_changed,bool,(void)); 10P(conf_get_changed,bool,(void));
10P(conf_set_changed_callback, void,(void (*fn)(void))); 11P(conf_set_changed_callback, void,(void (*fn)(void)));
12P(conf_set_message_callback, void,(void (*fn)(const char *fmt, va_list ap)));
11 13
12/* menu.c */ 14/* menu.c */
13P(rootmenu,struct menu,); 15P(rootmenu,struct menu,);
diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c
index a2969fdc66b4..272a987f23e0 100644
--- a/scripts/kconfig/nconf.c
+++ b/scripts/kconfig/nconf.c
@@ -645,25 +645,6 @@ static const char *set_config_filename(const char *config_filename)
645 return menu_backtitle; 645 return menu_backtitle;
646} 646}
647 647
648/* command = 0 is supress, 1 is restore */
649static void supress_stdout(int command)
650{
651 static FILE *org_stdout;
652 static FILE *org_stderr;
653
654 if (command == 0) {
655 org_stdout = stdout;
656 org_stderr = stderr;
657 stdout = fopen("/dev/null", "a");
658 stderr = fopen("/dev/null", "a");
659 } else {
660 fclose(stdout);
661 fclose(stderr);
662 stdout = org_stdout;
663 stderr = org_stderr;
664 }
665}
666
667/* return = 0 means we are successful. 648/* return = 0 means we are successful.
668 * -1 means go on doing what you were doing 649 * -1 means go on doing what you were doing
669 */ 650 */
@@ -688,9 +669,7 @@ static int do_exit(void)
688 /* if we got here, the user really wants to exit */ 669 /* if we got here, the user really wants to exit */
689 switch (res) { 670 switch (res) {
690 case 0: 671 case 0:
691 supress_stdout(0);
692 res = conf_write(filename); 672 res = conf_write(filename);
693 supress_stdout(1);
694 if (res) 673 if (res)
695 btn_dialog( 674 btn_dialog(
696 main_window, 675 main_window,
@@ -698,19 +677,6 @@ static int do_exit(void)
698 "Your configuration changes were NOT saved."), 677 "Your configuration changes were NOT saved."),
699 1, 678 1,
700 "<OK>"); 679 "<OK>");
701 else {
702 char buf[1024];
703 snprintf(buf, 1024,
704 _("Configuration written to %s\n"
705 "End of the configuration.\n"
706 "Execute 'make' to start the build or try"
707 " 'make help'."), filename);
708 btn_dialog(
709 main_window,
710 buf,
711 1,
712 "<OK>");
713 }
714 break; 680 break;
715 default: 681 default:
716 btn_dialog( 682 btn_dialog(
@@ -1246,6 +1212,14 @@ static void conf(struct menu *menu)
1246 } 1212 }
1247} 1213}
1248 1214
1215static void conf_message_callback(const char *fmt, va_list ap)
1216{
1217 char buf[1024];
1218
1219 vsnprintf(buf, sizeof(buf), fmt, ap);
1220 btn_dialog(main_window, buf, 1, "<OK>");
1221}
1222
1249static void show_help(struct menu *menu) 1223static void show_help(struct menu *menu)
1250{ 1224{
1251 struct gstr help = str_new(); 1225 struct gstr help = str_new();
@@ -1470,16 +1444,8 @@ static void conf_save(void)
1470 case 0: 1444 case 0:
1471 if (!dialog_input_result[0]) 1445 if (!dialog_input_result[0])
1472 return; 1446 return;
1473 supress_stdout(0);
1474 res = conf_write(dialog_input_result); 1447 res = conf_write(dialog_input_result);
1475 supress_stdout(1);
1476 if (!res) { 1448 if (!res) {
1477 char buf[1024];
1478 sprintf(buf, "%s %s",
1479 _("configuration file saved to: "),
1480 dialog_input_result);
1481 btn_dialog(main_window,
1482 buf, 1, "<OK>");
1483 set_config_filename(dialog_input_result); 1449 set_config_filename(dialog_input_result);
1484 return; 1450 return;
1485 } 1451 }
@@ -1572,6 +1538,7 @@ int main(int ac, char **av)
1572 _(menu_no_f_instructions)); 1538 _(menu_no_f_instructions));
1573 } 1539 }
1574 1540
1541 conf_set_message_callback(conf_message_callback);
1575 /* do the work */ 1542 /* do the work */
1576 while (!global_exit) { 1543 while (!global_exit) {
1577 conf(&rootmenu); 1544 conf(&rootmenu);
s="hl opt">, const char *buf, size_t count) { int index = to_sensor_dev_attr(devattr)->index; struct tmp401_data *data = tmp401_update_device(dev); long val; u8 reg; if (kstrtol(buf, 10, &val)) return -EINVAL; reg = tmp401_crit_temp_to_register(val, data->config); mutex_lock(&data->update_lock); i2c_smbus_write_byte_data(to_i2c_client(dev), TMP401_TEMP_CRIT_LIMIT[index], reg); data->temp_crit[index] = reg; mutex_unlock(&data->update_lock); return count; } static ssize_t store_temp_crit_hyst(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { int temp, index = to_sensor_dev_attr(devattr)->index; struct tmp401_data *data = tmp401_update_device(dev); long val; u8 reg; if (kstrtol(buf, 10, &val)) return -EINVAL; if (data->config & TMP401_CONFIG_RANGE) val = SENSORS_LIMIT(val, -64000, 191000); else val = SENSORS_LIMIT(val, 0, 127000); mutex_lock(&data->update_lock); temp = tmp401_crit_register_to_temp(data->temp_crit[index], data->config); val = SENSORS_LIMIT(val, temp - 255000, temp); reg = ((temp - val) + 500) / 1000; i2c_smbus_write_byte_data(to_i2c_client(dev), TMP401_TEMP_CRIT_HYST, reg); data->temp_crit_hyst = reg; mutex_unlock(&data->update_lock); return count; } /* * Resets the historical measurements of minimum and maximum temperatures. * This is done by writing any value to any of the minimum/maximum registers * (0x30-0x37). */ static ssize_t reset_temp_history(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { long val; if (kstrtol(buf, 10, &val)) return -EINVAL; if (val != 1) { dev_err(dev, "temp_reset_history value %ld not" " supported. Use 1 to reset the history!\n", val); return -EINVAL; } i2c_smbus_write_byte_data(to_i2c_client(dev), TMP411_TEMP_LOWEST_MSB[0], val); return count; } static struct sensor_device_attribute tmp401_attr[] = { SENSOR_ATTR(temp1_input, S_IRUGO, show_temp_value, NULL, 0), SENSOR_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp_min, store_temp_min, 0), SENSOR_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, store_temp_max, 0), SENSOR_ATTR(temp1_crit, S_IWUSR | S_IRUGO, show_temp_crit, store_temp_crit, 0), SENSOR_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, show_temp_crit_hyst, store_temp_crit_hyst, 0), SENSOR_ATTR(temp1_min_alarm, S_IRUGO, show_status, NULL, TMP401_STATUS_LOCAL_LOW), SENSOR_ATTR(temp1_max_alarm, S_IRUGO, show_status, NULL, TMP401_STATUS_LOCAL_HIGH), SENSOR_ATTR(temp1_crit_alarm, S_IRUGO, show_status, NULL, TMP401_STATUS_LOCAL_CRIT), SENSOR_ATTR(temp2_input, S_IRUGO, show_temp_value, NULL, 1), SENSOR_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_temp_min, store_temp_min, 1), SENSOR_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp_max, store_temp_max, 1), SENSOR_ATTR(temp2_crit, S_IWUSR | S_IRUGO, show_temp_crit, store_temp_crit, 1), SENSOR_ATTR(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL, 1), SENSOR_ATTR(temp2_fault, S_IRUGO, show_status, NULL, TMP401_STATUS_REMOTE_OPEN), SENSOR_ATTR(temp2_min_alarm, S_IRUGO, show_status, NULL, TMP401_STATUS_REMOTE_LOW), SENSOR_ATTR(temp2_max_alarm, S_IRUGO, show_status, NULL, TMP401_STATUS_REMOTE_HIGH), SENSOR_ATTR(temp2_crit_alarm, S_IRUGO, show_status, NULL, TMP401_STATUS_REMOTE_CRIT), }; /* * Additional features of the TMP411 chip. * The TMP411 stores the minimum and maximum * temperature measured since power-on, chip-reset, or * minimum and maximum register reset for both the local * and remote channels. */ static struct sensor_device_attribute tmp411_attr[] = { SENSOR_ATTR(temp1_highest, S_IRUGO, show_temp_highest, NULL, 0), SENSOR_ATTR(temp1_lowest, S_IRUGO, show_temp_lowest, NULL, 0), SENSOR_ATTR(temp2_highest, S_IRUGO, show_temp_highest, NULL, 1), SENSOR_ATTR(temp2_lowest, S_IRUGO, show_temp_lowest, NULL, 1), SENSOR_ATTR(temp_reset_history, S_IWUSR, NULL, reset_temp_history, 0), }; /* * Begin non sysfs callback code (aka Real code) */ static void tmp401_init_client(struct i2c_client *client) { int config, config_orig; /* Set the conversion rate to 2 Hz */ i2c_smbus_write_byte_data(client, TMP401_CONVERSION_RATE_WRITE, 5); /* Start conversions (disable shutdown if necessary) */ config = i2c_smbus_read_byte_data(client, TMP401_CONFIG_READ); if (config < 0) { dev_warn(&client->dev, "Initialization failed!\n"); return; } config_orig = config; config &= ~TMP401_CONFIG_SHUTDOWN; if (config != config_orig) i2c_smbus_write_byte_data(client, TMP401_CONFIG_WRITE, config); } static int tmp401_detect(struct i2c_client *client, struct i2c_board_info *info) { enum chips kind; struct i2c_adapter *adapter = client->adapter; u8 reg; if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) return -ENODEV; /* Detect and identify the chip */ reg = i2c_smbus_read_byte_data(client, TMP401_MANUFACTURER_ID_REG); if (reg != TMP401_MANUFACTURER_ID) return -ENODEV; reg = i2c_smbus_read_byte_data(client, TMP401_DEVICE_ID_REG); switch (reg) { case TMP401_DEVICE_ID: kind = tmp401; break; case TMP411_DEVICE_ID: kind = tmp411; break; default: return -ENODEV; } reg = i2c_smbus_read_byte_data(client, TMP401_CONFIG_READ); if (reg & 0x1b) return -ENODEV; reg = i2c_smbus_read_byte_data(client, TMP401_CONVERSION_RATE_READ); /* Datasheet says: 0x1-0x6 */ if (reg > 15) return -ENODEV; strlcpy(info->type, tmp401_id[kind].name, I2C_NAME_SIZE); return 0; } static int tmp401_remove(struct i2c_client *client) { struct tmp401_data *data = i2c_get_clientdata(client); int i; if (data->hwmon_dev) hwmon_device_unregister(data->hwmon_dev); for (i = 0; i < ARRAY_SIZE(tmp401_attr); i++) device_remove_file(&client->dev, &tmp401_attr[i].dev_attr); if (data->kind == tmp411) { for (i = 0; i < ARRAY_SIZE(tmp411_attr); i++) device_remove_file(&client->dev, &tmp411_attr[i].dev_attr); } return 0; } static int tmp401_probe(struct i2c_client *client, const struct i2c_device_id *id) { int i, err = 0; struct tmp401_data *data; const char *names[] = { "TMP401", "TMP411" }; data = devm_kzalloc(&client->dev, sizeof(struct tmp401_data), GFP_KERNEL); if (!data) return -ENOMEM; i2c_set_clientdata(client, data); mutex_init(&data->update_lock); data->kind = id->driver_data; /* Initialize the TMP401 chip */ tmp401_init_client(client); /* Register sysfs hooks */ for (i = 0; i < ARRAY_SIZE(tmp401_attr); i++) { err = device_create_file(&client->dev, &tmp401_attr[i].dev_attr); if (err) goto exit_remove; } /* Register additional tmp411 sysfs hooks */ if (data->kind == tmp411) { for (i = 0; i < ARRAY_SIZE(tmp411_attr); i++) { err = device_create_file(&client->dev, &tmp411_attr[i].dev_attr); if (err) goto exit_remove; } } data->hwmon_dev = hwmon_device_register(&client->dev); if (IS_ERR(data->hwmon_dev)) { err = PTR_ERR(data->hwmon_dev); data->hwmon_dev = NULL; goto exit_remove; } dev_info(&client->dev, "Detected TI %s chip\n", names[data->kind]); return 0; exit_remove: tmp401_remove(client); return err; } static struct i2c_driver tmp401_driver = { .class = I2C_CLASS_HWMON, .driver = { .name = "tmp401", }, .probe = tmp401_probe, .remove = tmp401_remove, .id_table = tmp401_id, .detect = tmp401_detect, .address_list = normal_i2c, }; module_i2c_driver(tmp401_driver); MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>"); MODULE_DESCRIPTION("Texas Instruments TMP401 temperature sensor driver"); MODULE_LICENSE("GPL");