/* SPDX-License-Identifier: GPL-2.0 */ #include #include static ssize_t avm_hw_config_read(struct file *fp, char __user *ubuf, size_t count, loff_t *pos) { struct _avm_hw_config *config = (struct _avm_hw_config *)fp->private_data; char const *avm_hw_param_to_string[] = { [avm_hw_param_gpio_out_active_low] = "out active-low", [avm_hw_param_gpio_out_active_high] = "out active-high", [avm_hw_param_gpio_in_active_low] = "in active-low", [avm_hw_param_gpio_in_active_high] = "in active-high", [avm_hw_param_out_pinmux1] = "out pinmux1", [avm_hw_param_in_pinmux1] = "in pinmux1" }; char buf[count]; ssize_t len; /* use 'param' attribute to get direction and active level of gpio */ if (config->param < avm_hw_param_last_param) scnprintf(buf, count, "gpio-%d: %s\n", config->value, avm_hw_param_to_string[config->param]); else scnprintf(buf, count, "gpio-%d\n", config->value); len = strlen(buf); return simple_read_from_buffer(ubuf, count, pos, buf, len); } static const struct file_operations avm_hw_config_debugfs_fops = { .open = simple_open, .read = avm_hw_config_read, }; int init_debugfs(void) { struct dentry *dir; struct _avm_hw_config *config_table; int i; dir = debugfs_create_dir("avm-hw-config", NULL); if (!dir) return -ENOMEM; config_table = avm_get_hw_config_table(); if (!config_table) { pr_err("Couldn't get avm_hw_config_table!\n"); return -ENODATA; } for (i = 0; config_table[i].name; i++) { debugfs_create_file(config_table[i].name, 0400, dir, &config_table[i], &avm_hw_config_debugfs_fops); } return 0; }