162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci/* 462306a36Sopenharmony_ci * Copyright 2016-2022 HabanaLabs, Ltd. 562306a36Sopenharmony_ci * All Rights Reserved. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include "goyaP.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_civoid goya_set_pll_profile(struct hl_device *hdev, enum hl_pll_frequency freq) 1162306a36Sopenharmony_ci{ 1262306a36Sopenharmony_ci struct goya_device *goya = hdev->asic_specific; 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci if (!hdev->pdev) 1562306a36Sopenharmony_ci return; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci switch (freq) { 1862306a36Sopenharmony_ci case PLL_HIGH: 1962306a36Sopenharmony_ci hl_fw_set_frequency(hdev, HL_GOYA_MME_PLL, hdev->high_pll); 2062306a36Sopenharmony_ci hl_fw_set_frequency(hdev, HL_GOYA_TPC_PLL, hdev->high_pll); 2162306a36Sopenharmony_ci hl_fw_set_frequency(hdev, HL_GOYA_IC_PLL, hdev->high_pll); 2262306a36Sopenharmony_ci break; 2362306a36Sopenharmony_ci case PLL_LOW: 2462306a36Sopenharmony_ci hl_fw_set_frequency(hdev, HL_GOYA_MME_PLL, GOYA_PLL_FREQ_LOW); 2562306a36Sopenharmony_ci hl_fw_set_frequency(hdev, HL_GOYA_TPC_PLL, GOYA_PLL_FREQ_LOW); 2662306a36Sopenharmony_ci hl_fw_set_frequency(hdev, HL_GOYA_IC_PLL, GOYA_PLL_FREQ_LOW); 2762306a36Sopenharmony_ci break; 2862306a36Sopenharmony_ci case PLL_LAST: 2962306a36Sopenharmony_ci hl_fw_set_frequency(hdev, HL_GOYA_MME_PLL, goya->mme_clk); 3062306a36Sopenharmony_ci hl_fw_set_frequency(hdev, HL_GOYA_TPC_PLL, goya->tpc_clk); 3162306a36Sopenharmony_ci hl_fw_set_frequency(hdev, HL_GOYA_IC_PLL, goya->ic_clk); 3262306a36Sopenharmony_ci break; 3362306a36Sopenharmony_ci default: 3462306a36Sopenharmony_ci dev_err(hdev->dev, "unknown frequency setting\n"); 3562306a36Sopenharmony_ci } 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic ssize_t mme_clk_show(struct device *dev, struct device_attribute *attr, 3962306a36Sopenharmony_ci char *buf) 4062306a36Sopenharmony_ci{ 4162306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 4262306a36Sopenharmony_ci long value; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) 4562306a36Sopenharmony_ci return -ENODEV; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci value = hl_fw_get_frequency(hdev, HL_GOYA_MME_PLL, false); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci if (value < 0) 5062306a36Sopenharmony_ci return value; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci return sprintf(buf, "%lu\n", value); 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic ssize_t mme_clk_store(struct device *dev, struct device_attribute *attr, 5662306a36Sopenharmony_ci const char *buf, size_t count) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 5962306a36Sopenharmony_ci struct goya_device *goya = hdev->asic_specific; 6062306a36Sopenharmony_ci int rc; 6162306a36Sopenharmony_ci long value; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) { 6462306a36Sopenharmony_ci count = -ENODEV; 6562306a36Sopenharmony_ci goto fail; 6662306a36Sopenharmony_ci } 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci if (goya->pm_mng_profile == PM_AUTO) { 6962306a36Sopenharmony_ci count = -EPERM; 7062306a36Sopenharmony_ci goto fail; 7162306a36Sopenharmony_ci } 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci rc = kstrtoul(buf, 0, &value); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci if (rc) { 7662306a36Sopenharmony_ci count = -EINVAL; 7762306a36Sopenharmony_ci goto fail; 7862306a36Sopenharmony_ci } 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci hl_fw_set_frequency(hdev, HL_GOYA_MME_PLL, value); 8162306a36Sopenharmony_ci goya->mme_clk = value; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cifail: 8462306a36Sopenharmony_ci return count; 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistatic ssize_t tpc_clk_show(struct device *dev, struct device_attribute *attr, 8862306a36Sopenharmony_ci char *buf) 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 9162306a36Sopenharmony_ci long value; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) 9462306a36Sopenharmony_ci return -ENODEV; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci value = hl_fw_get_frequency(hdev, HL_GOYA_TPC_PLL, false); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci if (value < 0) 9962306a36Sopenharmony_ci return value; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci return sprintf(buf, "%lu\n", value); 10262306a36Sopenharmony_ci} 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistatic ssize_t tpc_clk_store(struct device *dev, struct device_attribute *attr, 10562306a36Sopenharmony_ci const char *buf, size_t count) 10662306a36Sopenharmony_ci{ 10762306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 10862306a36Sopenharmony_ci struct goya_device *goya = hdev->asic_specific; 10962306a36Sopenharmony_ci int rc; 11062306a36Sopenharmony_ci long value; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) { 11362306a36Sopenharmony_ci count = -ENODEV; 11462306a36Sopenharmony_ci goto fail; 11562306a36Sopenharmony_ci } 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci if (goya->pm_mng_profile == PM_AUTO) { 11862306a36Sopenharmony_ci count = -EPERM; 11962306a36Sopenharmony_ci goto fail; 12062306a36Sopenharmony_ci } 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci rc = kstrtoul(buf, 0, &value); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci if (rc) { 12562306a36Sopenharmony_ci count = -EINVAL; 12662306a36Sopenharmony_ci goto fail; 12762306a36Sopenharmony_ci } 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci hl_fw_set_frequency(hdev, HL_GOYA_TPC_PLL, value); 13062306a36Sopenharmony_ci goya->tpc_clk = value; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cifail: 13362306a36Sopenharmony_ci return count; 13462306a36Sopenharmony_ci} 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistatic ssize_t ic_clk_show(struct device *dev, struct device_attribute *attr, 13762306a36Sopenharmony_ci char *buf) 13862306a36Sopenharmony_ci{ 13962306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 14062306a36Sopenharmony_ci long value; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) 14362306a36Sopenharmony_ci return -ENODEV; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci value = hl_fw_get_frequency(hdev, HL_GOYA_IC_PLL, false); 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci if (value < 0) 14862306a36Sopenharmony_ci return value; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci return sprintf(buf, "%lu\n", value); 15162306a36Sopenharmony_ci} 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cistatic ssize_t ic_clk_store(struct device *dev, struct device_attribute *attr, 15462306a36Sopenharmony_ci const char *buf, size_t count) 15562306a36Sopenharmony_ci{ 15662306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 15762306a36Sopenharmony_ci struct goya_device *goya = hdev->asic_specific; 15862306a36Sopenharmony_ci int rc; 15962306a36Sopenharmony_ci long value; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) { 16262306a36Sopenharmony_ci count = -ENODEV; 16362306a36Sopenharmony_ci goto fail; 16462306a36Sopenharmony_ci } 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci if (goya->pm_mng_profile == PM_AUTO) { 16762306a36Sopenharmony_ci count = -EPERM; 16862306a36Sopenharmony_ci goto fail; 16962306a36Sopenharmony_ci } 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci rc = kstrtoul(buf, 0, &value); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci if (rc) { 17462306a36Sopenharmony_ci count = -EINVAL; 17562306a36Sopenharmony_ci goto fail; 17662306a36Sopenharmony_ci } 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci hl_fw_set_frequency(hdev, HL_GOYA_IC_PLL, value); 17962306a36Sopenharmony_ci goya->ic_clk = value; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_cifail: 18262306a36Sopenharmony_ci return count; 18362306a36Sopenharmony_ci} 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_cistatic ssize_t mme_clk_curr_show(struct device *dev, 18662306a36Sopenharmony_ci struct device_attribute *attr, char *buf) 18762306a36Sopenharmony_ci{ 18862306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 18962306a36Sopenharmony_ci long value; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) 19262306a36Sopenharmony_ci return -ENODEV; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci value = hl_fw_get_frequency(hdev, HL_GOYA_MME_PLL, true); 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci if (value < 0) 19762306a36Sopenharmony_ci return value; 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci return sprintf(buf, "%lu\n", value); 20062306a36Sopenharmony_ci} 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_cistatic ssize_t tpc_clk_curr_show(struct device *dev, 20362306a36Sopenharmony_ci struct device_attribute *attr, char *buf) 20462306a36Sopenharmony_ci{ 20562306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 20662306a36Sopenharmony_ci long value; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) 20962306a36Sopenharmony_ci return -ENODEV; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci value = hl_fw_get_frequency(hdev, HL_GOYA_TPC_PLL, true); 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci if (value < 0) 21462306a36Sopenharmony_ci return value; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci return sprintf(buf, "%lu\n", value); 21762306a36Sopenharmony_ci} 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_cistatic ssize_t ic_clk_curr_show(struct device *dev, 22062306a36Sopenharmony_ci struct device_attribute *attr, char *buf) 22162306a36Sopenharmony_ci{ 22262306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 22362306a36Sopenharmony_ci long value; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) 22662306a36Sopenharmony_ci return -ENODEV; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci value = hl_fw_get_frequency(hdev, HL_GOYA_IC_PLL, true); 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci if (value < 0) 23162306a36Sopenharmony_ci return value; 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci return sprintf(buf, "%lu\n", value); 23462306a36Sopenharmony_ci} 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cistatic ssize_t pm_mng_profile_show(struct device *dev, 23762306a36Sopenharmony_ci struct device_attribute *attr, char *buf) 23862306a36Sopenharmony_ci{ 23962306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 24062306a36Sopenharmony_ci struct goya_device *goya = hdev->asic_specific; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) 24362306a36Sopenharmony_ci return -ENODEV; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci return sprintf(buf, "%s\n", 24662306a36Sopenharmony_ci (goya->pm_mng_profile == PM_AUTO) ? "auto" : 24762306a36Sopenharmony_ci (goya->pm_mng_profile == PM_MANUAL) ? "manual" : 24862306a36Sopenharmony_ci "unknown"); 24962306a36Sopenharmony_ci} 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistatic ssize_t pm_mng_profile_store(struct device *dev, 25262306a36Sopenharmony_ci struct device_attribute *attr, const char *buf, size_t count) 25362306a36Sopenharmony_ci{ 25462306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 25562306a36Sopenharmony_ci struct goya_device *goya = hdev->asic_specific; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) { 25862306a36Sopenharmony_ci count = -ENODEV; 25962306a36Sopenharmony_ci goto out; 26062306a36Sopenharmony_ci } 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci mutex_lock(&hdev->fpriv_list_lock); 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci if (hdev->is_compute_ctx_active) { 26562306a36Sopenharmony_ci dev_err(hdev->dev, 26662306a36Sopenharmony_ci "Can't change PM profile while compute context is opened on the device\n"); 26762306a36Sopenharmony_ci count = -EPERM; 26862306a36Sopenharmony_ci goto unlock_mutex; 26962306a36Sopenharmony_ci } 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci if (strncmp("auto", buf, strlen("auto")) == 0) { 27262306a36Sopenharmony_ci /* Make sure we are in LOW PLL when changing modes */ 27362306a36Sopenharmony_ci if (goya->pm_mng_profile == PM_MANUAL) { 27462306a36Sopenharmony_ci goya->curr_pll_profile = PLL_HIGH; 27562306a36Sopenharmony_ci goya->pm_mng_profile = PM_AUTO; 27662306a36Sopenharmony_ci goya_set_frequency(hdev, PLL_LOW); 27762306a36Sopenharmony_ci } 27862306a36Sopenharmony_ci } else if (strncmp("manual", buf, strlen("manual")) == 0) { 27962306a36Sopenharmony_ci if (goya->pm_mng_profile == PM_AUTO) { 28062306a36Sopenharmony_ci /* Must release the lock because the work thread also 28162306a36Sopenharmony_ci * takes this lock. But before we release it, set 28262306a36Sopenharmony_ci * the mode to manual so nothing will change if a user 28362306a36Sopenharmony_ci * suddenly opens the device 28462306a36Sopenharmony_ci */ 28562306a36Sopenharmony_ci goya->pm_mng_profile = PM_MANUAL; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci mutex_unlock(&hdev->fpriv_list_lock); 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci /* Flush the current work so we can return to the user 29062306a36Sopenharmony_ci * knowing that he is the only one changing frequencies 29162306a36Sopenharmony_ci */ 29262306a36Sopenharmony_ci if (goya->goya_work) 29362306a36Sopenharmony_ci flush_delayed_work(&goya->goya_work->work_freq); 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci return count; 29662306a36Sopenharmony_ci } 29762306a36Sopenharmony_ci } else { 29862306a36Sopenharmony_ci dev_err(hdev->dev, "value should be auto or manual\n"); 29962306a36Sopenharmony_ci count = -EINVAL; 30062306a36Sopenharmony_ci } 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ciunlock_mutex: 30362306a36Sopenharmony_ci mutex_unlock(&hdev->fpriv_list_lock); 30462306a36Sopenharmony_ciout: 30562306a36Sopenharmony_ci return count; 30662306a36Sopenharmony_ci} 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_cistatic ssize_t high_pll_show(struct device *dev, struct device_attribute *attr, 30962306a36Sopenharmony_ci char *buf) 31062306a36Sopenharmony_ci{ 31162306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) 31462306a36Sopenharmony_ci return -ENODEV; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci return sprintf(buf, "%u\n", hdev->high_pll); 31762306a36Sopenharmony_ci} 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_cistatic ssize_t high_pll_store(struct device *dev, struct device_attribute *attr, 32062306a36Sopenharmony_ci const char *buf, size_t count) 32162306a36Sopenharmony_ci{ 32262306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 32362306a36Sopenharmony_ci long value; 32462306a36Sopenharmony_ci int rc; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci if (!hl_device_operational(hdev, NULL)) { 32762306a36Sopenharmony_ci count = -ENODEV; 32862306a36Sopenharmony_ci goto out; 32962306a36Sopenharmony_ci } 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci rc = kstrtoul(buf, 0, &value); 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci if (rc) { 33462306a36Sopenharmony_ci count = -EINVAL; 33562306a36Sopenharmony_ci goto out; 33662306a36Sopenharmony_ci } 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci hdev->high_pll = value; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ciout: 34162306a36Sopenharmony_ci return count; 34262306a36Sopenharmony_ci} 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_cistatic DEVICE_ATTR_RW(high_pll); 34562306a36Sopenharmony_cistatic DEVICE_ATTR_RW(ic_clk); 34662306a36Sopenharmony_cistatic DEVICE_ATTR_RO(ic_clk_curr); 34762306a36Sopenharmony_cistatic DEVICE_ATTR_RW(mme_clk); 34862306a36Sopenharmony_cistatic DEVICE_ATTR_RO(mme_clk_curr); 34962306a36Sopenharmony_cistatic DEVICE_ATTR_RW(pm_mng_profile); 35062306a36Sopenharmony_cistatic DEVICE_ATTR_RW(tpc_clk); 35162306a36Sopenharmony_cistatic DEVICE_ATTR_RO(tpc_clk_curr); 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_cistatic struct attribute *goya_clk_dev_attrs[] = { 35462306a36Sopenharmony_ci &dev_attr_high_pll.attr, 35562306a36Sopenharmony_ci &dev_attr_ic_clk.attr, 35662306a36Sopenharmony_ci &dev_attr_ic_clk_curr.attr, 35762306a36Sopenharmony_ci &dev_attr_mme_clk.attr, 35862306a36Sopenharmony_ci &dev_attr_mme_clk_curr.attr, 35962306a36Sopenharmony_ci &dev_attr_pm_mng_profile.attr, 36062306a36Sopenharmony_ci &dev_attr_tpc_clk.attr, 36162306a36Sopenharmony_ci &dev_attr_tpc_clk_curr.attr, 36262306a36Sopenharmony_ci NULL, 36362306a36Sopenharmony_ci}; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_cistatic ssize_t infineon_ver_show(struct device *dev, struct device_attribute *attr, char *buf) 36662306a36Sopenharmony_ci{ 36762306a36Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 36862306a36Sopenharmony_ci struct cpucp_info *cpucp_info; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci cpucp_info = &hdev->asic_prop.cpucp_info; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci return sprintf(buf, "%#04x\n", le32_to_cpu(cpucp_info->infineon_version)); 37362306a36Sopenharmony_ci} 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_cistatic DEVICE_ATTR_RO(infineon_ver); 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_cistatic struct attribute *goya_vrm_dev_attrs[] = { 37862306a36Sopenharmony_ci &dev_attr_infineon_ver.attr, 37962306a36Sopenharmony_ci NULL, 38062306a36Sopenharmony_ci}; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_civoid goya_add_device_attr(struct hl_device *hdev, struct attribute_group *dev_clk_attr_grp, 38362306a36Sopenharmony_ci struct attribute_group *dev_vrm_attr_grp) 38462306a36Sopenharmony_ci{ 38562306a36Sopenharmony_ci dev_clk_attr_grp->attrs = goya_clk_dev_attrs; 38662306a36Sopenharmony_ci dev_vrm_attr_grp->attrs = goya_vrm_dev_attrs; 38762306a36Sopenharmony_ci} 388