config_desc
const struct cscfg_config_desc *config_desc = config_csdev->config_desc;
if (preset < 1 || preset > config_desc->nr_presets)
nr_cfg_params = config_desc->nr_total_params;
preset_base = &config_desc->presets[(preset - 1) * nr_cfg_params];
dev_dbg(&csdev->dev, "cfg %s; %s feature:%s", config_csdev->config_desc->name,
struct cscfg_config_desc *config_desc;
int etm_perf_add_symlink_cscfg(struct device *dev, struct cscfg_config_desc *config_desc)
if (config_desc->event_ea != NULL)
config_desc->event_ea = etm_perf_add_symlink_group(dev, config_desc->name, "events");
if (!IS_ERR(config_desc->event_ea))
config_desc->event_ea->attr.show = etm_perf_cscfg_event_show;
err = PTR_ERR(config_desc->event_ea);
config_desc->event_ea = NULL;
void etm_perf_del_symlink_cscfg(struct cscfg_config_desc *config_desc)
if (!config_desc->event_ea)
etm_perf_del_symlink_group(config_desc->event_ea, "events");
config_desc->event_ea = NULL;
struct cscfg_config_desc *config_desc);
void etm_perf_del_symlink_cscfg(struct cscfg_config_desc *config_desc);
err = cscfg_config_sysfs_activate(fs_config->config_desc, val);
if ((preset < 1) || (preset > fs_config->config_desc->nr_presets))
struct cscfg_config_desc *config_desc = cfg_view->config_desc;
if (!config_desc->nr_presets)
for (preset_num = 1; preset_num <= config_desc->nr_presets; preset_num++) {
cfg_fs_preset->config_desc = cfg_view->config_desc;
static struct config_group *cscfg_create_config_group(struct cscfg_config_desc *config_desc)
cfg_view->config_desc = config_desc;
config_group_init_type_name(&cfg_view->group, config_desc->name, &cscfg_config_view_type);
return scnprintf(page, PAGE_SIZE, "%s", fs_config->config_desc->description);
int cscfg_configfs_add_config(struct cscfg_config_desc *config_desc)
const struct cscfg_config_desc *config_desc = fs_config->config_desc;
new_group = cscfg_create_config_group(config_desc);
config_desc->fs_group = new_group;
void cscfg_configfs_del_config(struct cscfg_config_desc *config_desc)
if (config_desc->fs_group) {
configfs_unregister_group(config_desc->fs_group);
config_desc->fs_group = NULL;
for (i = 0; i < config_desc->nr_feat_refs; i++)
"%s\n", config_desc->feat_ref_names[i]);
const struct cscfg_config_desc *config_desc;
config_desc = fs_preset->config_desc;
if (!config_desc->nr_presets)
val_idx = config_desc->nr_total_params * preset_idx;
for (i = 0; i < config_desc->nr_feat_refs; i++) {
feat_desc = cscfg_get_named_feat_desc(config_desc->feat_ref_names[i]);
config_desc->presets[val_idx++]);
struct cscfg_config_desc *config_desc;
struct cscfg_config_desc *config_desc;
int cscfg_configfs_add_config(struct cscfg_config_desc *config_desc);
void cscfg_configfs_del_config(struct cscfg_config_desc *config_desc);
static int cscfg_add_cfg_to_csdevs(struct cscfg_config_desc *config_desc)
struct cscfg_config_desc *config_desc;
config_desc = config_csdev_item->config_desc;
if (((unsigned long)config_desc->event_ea->var == cfg_hash) &&
cscfg_config_desc_get(config_desc)) {
err = cscfg_add_csdev_cfg(csdev_item->csdev, config_desc);
cscfg_config_desc_put(config_desc);
cscfg_config_desc_put(config_csdev->config_desc);
static int cscfg_check_feat_for_cfg(struct cscfg_config_desc *config_desc)
for (i = 0; i < config_desc->nr_feat_refs; i++)
if (!cscfg_match_list_feat(config_desc->feat_ref_names[i]))
static int cscfg_load_config(struct cscfg_config_desc *config_desc)
if (!strcmp(config_desc_exist->name, config_desc->name))
err = cscfg_check_feat_for_cfg(config_desc);
err = cscfg_add_cfg_to_csdevs(config_desc);
err = etm_perf_add_symlink_cscfg(cscfg_device(), config_desc);
list_add(&config_desc->item, &cscfg_mgr->config_desc_list);
atomic_set(&config_desc->active_cnt, 0);
if (config_csdev->config_desc->load_owner == load_owner)
struct cscfg_config_desc *config_desc;
list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) {
if (config_desc->load_owner == load_owner)
cscfg_configfs_del_config(config_desc);
struct cscfg_config_desc *config_desc, *cfg_tmp;
list_for_each_entry_safe(config_desc, cfg_tmp, &cscfg_mgr->config_desc_list, item) {
if (config_desc->load_owner == load_owner) {
etm_perf_del_symlink_cscfg(config_desc);
list_del(&config_desc->item);
struct cscfg_config_desc *config_desc)
struct cscfg_config_desc *config_desc;
for (i = 0; i < config_desc->nr_feat_refs; i++) {
list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) {
err = cscfg_add_csdev_cfg(csdev, config_desc);
feat_csdev = cscfg_get_feat_csdev(csdev, config_desc->feat_ref_names[i]);
config_desc->nr_feat_refs);
config_csdev->config_desc = config_desc;
static bool cscfg_config_desc_get(struct cscfg_config_desc *config_desc)
if (!atomic_fetch_inc(&config_desc->active_cnt)) {
if (unlikely(cscfg_owner_get(config_desc->load_owner))) {
atomic_dec(&config_desc->active_cnt);
static void cscfg_config_desc_put(struct cscfg_config_desc *config_desc)
if (!atomic_dec_return(&config_desc->active_cnt))
cscfg_owner_put(config_desc->load_owner);
struct cscfg_config_desc *config_desc;
list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) {
if ((unsigned long)config_desc->event_ea->var == cfg_hash) {
if (config_desc->available == false)
if (!cscfg_config_desc_get(config_desc)) {
dev_dbg(cscfg_device(), "Activate config %s.\n", config_desc->name);
struct cscfg_config_desc *config_desc;
list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) {
if ((unsigned long)config_desc->event_ea->var == cfg_hash) {
cscfg_config_desc_put(config_desc);
dev_dbg(cscfg_device(), "Deactivate config %s.\n", config_desc->name);
int cscfg_config_sysfs_activate(struct cscfg_config_desc *config_desc, bool activate)
cfg_hash = (unsigned long)config_desc->event_ea->var;
const struct rtd_pin_config_desc *config_desc;
config_desc = rtd_pinctrl_find_config(data, pinnr);
if (!config_desc) {
if (config_desc->smt_offset == NA) {
smt_off = config_desc->base_bit + config_desc->smt_offset;
reg_off = config_desc->reg_offset;
if (config_desc->pud_en_offset == NA) {
pulen_off = config_desc->base_bit + config_desc->pud_en_offset;
reg_off = config_desc->reg_offset;
if (config_desc->pud_en_offset == NA) {
pulen_off = config_desc->base_bit + config_desc->pud_en_offset;
reg_off = config_desc->reg_offset;
if (config_desc->pud_en_offset == NA) {
pulen_off = config_desc->base_bit + config_desc->pud_en_offset;
pulsel_off = config_desc->base_bit + config_desc->pud_sel_offset;
reg_off = config_desc->reg_offset;
if (config_desc->pud_en_offset == NA) {
pulen_off = config_desc->base_bit + config_desc->pud_en_offset;
pulsel_off = config_desc->base_bit + config_desc->pud_sel_offset;
reg_off = config_desc->reg_offset;
curr_off = config_desc->base_bit + config_desc->curr_offset;
reg_off = config_desc->reg_offset;
switch (config_desc->curr_type) {
if (config_desc->power_offset == NA) {
reg_off = config_desc->reg_offset;
pow_off = config_desc->base_bit + config_desc->power_offset;
if (config_desc->slew_rate_offset == NA) {
sr_off = config_desc->base_bit + config_desc->slew_rate_offset;
reg_off = config_desc->reg_offset;
if (config_desc->input_volt_offset == NA) {
input_volt_off = config_desc->base_bit + config_desc->input_volt_offset;
reg_off = config_desc->reg_offset;
if (config_desc->hvil_offset == NA) {
hvil_off = config_desc->base_bit + config_desc->hvil_offset;
reg_off = config_desc->reg_offset;
reg_off = config_desc->reg_offset;
value = config_desc(cdev, w_value);