Lines Matching +full:vd +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0
4 * Author: Felix Zeng <felix.zeng@rock-chips.com>
7 #include <linux/dma-buf.h>
8 #include <linux/dma-mapping.h>
31 #include <linux/clk-provider.h>
63 #include <linux/rk-dma-heap.h>
184 .compatible = "rockchip,rk3568-rknpu",
188 .compatible = "rockchip,rk3588-rknpu",
192 .compatible = "rockchip,rv1106-rknpu",
196 .compatible = "rockchip,rk3562-rknpu",
217 mutex_lock(&rknpu_dev->power_lock); in rknpu_power_off_delay_work()
218 if (atomic_dec_if_positive(&rknpu_dev->power_refcount) == 0) in rknpu_power_off_delay_work()
220 mutex_unlock(&rknpu_dev->power_lock); in rknpu_power_off_delay_work()
227 mutex_lock(&rknpu_dev->power_lock); in rknpu_power_get()
228 if (atomic_inc_return(&rknpu_dev->power_refcount) == 1) in rknpu_power_get()
230 mutex_unlock(&rknpu_dev->power_lock); in rknpu_power_get()
239 mutex_lock(&rknpu_dev->power_lock); in rknpu_power_put()
240 if (atomic_dec_if_positive(&rknpu_dev->power_refcount) == 0) in rknpu_power_put()
242 mutex_unlock(&rknpu_dev->power_lock); in rknpu_power_put()
249 if (rknpu_dev->power_put_delay == 0) in rknpu_power_put_delay()
252 mutex_lock(&rknpu_dev->power_lock); in rknpu_power_put_delay()
253 if (atomic_read(&rknpu_dev->power_refcount) == 1) in rknpu_power_put_delay()
255 rknpu_dev->power_off_wq, &rknpu_dev->power_off_work, in rknpu_power_put_delay()
256 msecs_to_jiffies(rknpu_dev->power_put_delay)); in rknpu_power_put_delay()
258 atomic_dec_if_positive(&rknpu_dev->power_refcount); in rknpu_power_put_delay()
259 mutex_unlock(&rknpu_dev->power_lock); in rknpu_power_put_delay()
267 int ret = -EINVAL; in rknpu_action()
269 switch (args->flags) { in rknpu_action()
271 ret = rknpu_get_hw_version(rknpu_dev, &args->value); in rknpu_action()
274 ret = rknpu_get_drv_version(&args->value); in rknpu_action()
278 args->value = clk_get_rate(rknpu_dev->clks[0].clk); in rknpu_action()
286 args->value = regulator_get_voltage(rknpu_dev->vdd); in rknpu_action()
296 ret = rknpu_get_bw_priority(rknpu_dev, &args->value, NULL, in rknpu_action()
300 ret = rknpu_set_bw_priority(rknpu_dev, args->value, 0, 0); in rknpu_action()
303 ret = rknpu_get_bw_priority(rknpu_dev, NULL, &args->value, in rknpu_action()
307 ret = rknpu_set_bw_priority(rknpu_dev, 0, args->value, 0); in rknpu_action()
311 &args->value); in rknpu_action()
314 ret = rknpu_set_bw_priority(rknpu_dev, 0, 0, args->value); in rknpu_action()
320 ret = rknpu_get_rw_amount(rknpu_dev, &args->value, NULL, NULL); in rknpu_action()
323 ret = rknpu_get_rw_amount(rknpu_dev, NULL, &args->value, NULL); in rknpu_action()
326 ret = rknpu_get_rw_amount(rknpu_dev, NULL, NULL, &args->value); in rknpu_action()
329 ret = rknpu_get_total_rw_amount(rknpu_dev, &args->value); in rknpu_action()
332 args->value = rknpu_dev->iommu_en; in rknpu_action()
336 set_user_nice(current, *(int32_t *)&args->value); in rknpu_action()
340 if (rknpu_dev->sram_mm) in rknpu_action()
341 args->value = rknpu_dev->sram_mm->total_chunks * in rknpu_action()
342 rknpu_dev->sram_mm->chunk_size; in rknpu_action()
344 args->value = 0; in rknpu_action()
348 if (rknpu_dev->sram_mm) in rknpu_action()
349 args->value = rknpu_dev->sram_mm->free_chunks * in rknpu_action()
350 rknpu_dev->sram_mm->chunk_size; in rknpu_action()
352 args->value = 0; in rknpu_action()
356 ret = -EINVAL; in rknpu_action()
367 container_of(file->private_data, struct rknpu_device, miscdev); in rknpu_open()
373 return -ENOMEM; in rknpu_open()
376 session->rknpu_dev = rknpu_dev; in rknpu_open()
377 INIT_LIST_HEAD(&session->list); in rknpu_open()
379 file->private_data = (void *)session; in rknpu_open()
387 struct rknpu_session *session = file->private_data; in rknpu_release()
388 struct rknpu_device *rknpu_dev = session->rknpu_dev; in rknpu_release()
391 spin_lock(&rknpu_dev->lock); in rknpu_release()
392 list_replace_init(&session->list, &local_list); in rknpu_release()
393 file->private_data = NULL; in rknpu_release()
394 spin_unlock(&rknpu_dev->lock); in rknpu_release()
401 "Fd close free rknpu_obj: %#llx, rknpu_obj->dma_addr: %#llx\n", in rknpu_release()
402 (__u64)(uintptr_t)entry, (__u64)entry->dma_addr); in rknpu_release()
404 vunmap(entry->kv_addr); in rknpu_release()
405 entry->kv_addr = NULL; in rknpu_release()
407 if (!entry->owner) in rknpu_release()
408 dma_buf_put(entry->dmabuf); in rknpu_release()
410 list_del(&entry->head); in rknpu_release()
423 int ret = -EINVAL; in rknpu_action_ioctl()
428 ret = -EFAULT; in rknpu_action_ioctl()
437 ret = -EFAULT; in rknpu_action_ioctl()
446 long ret = -EINVAL; in rknpu_ioctl()
449 if (!file->private_data) in rknpu_ioctl()
450 return -EINVAL; in rknpu_ioctl()
452 rknpu_dev = ((struct rknpu_session *)file->private_data)->rknpu_dev; in rknpu_ioctl()
505 struct rknpu_device *rknpu_dev = dev_get_drvdata(dev->dev); in rknpu_action_ioctl()
514 struct rknpu_device *rknpu_dev = dev_get_drvdata(dev->dev); \
515 int ret = -EINVAL; \
609 for (i = 0; i < rknpu_dev->config->num_irqs; i++) { in hrtimer_handler()
610 subcore_data = &rknpu_dev->subcore_datas[i]; in hrtimer_handler()
612 spin_lock_irqsave(&rknpu_dev->irq_lock, flags); in hrtimer_handler()
614 job = subcore_data->job; in hrtimer_handler()
616 subcore_data->timer.busy_time += in hrtimer_handler()
617 ktime_us_delta(now, job->hw_recoder_time); in hrtimer_handler()
618 job->hw_recoder_time = ktime_get(); in hrtimer_handler()
621 subcore_data->timer.busy_time_record = in hrtimer_handler()
622 subcore_data->timer.busy_time; in hrtimer_handler()
623 subcore_data->timer.busy_time = 0; in hrtimer_handler()
624 spin_unlock_irqrestore(&rknpu_dev->irq_lock, flags); in hrtimer_handler()
627 hrtimer_forward_now(timer, rknpu_dev->kt); in hrtimer_handler()
633 rknpu_dev->kt = ktime_set(0, RKNPU_LOAD_INTERVAL); in rknpu_init_timer()
634 hrtimer_init(&rknpu_dev->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); in rknpu_init_timer()
635 rknpu_dev->timer.function = hrtimer_handler; in rknpu_init_timer()
636 hrtimer_start(&rknpu_dev->timer, rknpu_dev->kt, HRTIMER_MODE_REL); in rknpu_init_timer()
641 hrtimer_cancel(&rknpu_dev->timer); in rknpu_cancel_timer()
648 iommu = of_parse_phandle(dev->of_node, "iommus", 0); in rknpu_is_iommu_enable()
652 "rknpu iommu device-tree entry not found!, using non-iommu mode\n"); in rknpu_is_iommu_enable()
658 "rknpu iommu is disabled, using non-iommu mode\n"); in rknpu_is_iommu_enable()
672 struct device *dev = rknpu_dev->dev; in rknpu_drm_probe()
674 int ret = -EINVAL; in rknpu_drm_probe()
685 drm_dev->dev_private = rknpu_dev; in rknpu_drm_probe()
686 rknpu_dev->drm_dev = drm_dev; in rknpu_drm_probe()
702 struct drm_device *drm_dev = rknpu_dev->drm_dev; in rknpu_drm_remove()
716 struct device *dev = rknpu_dev->dev; in rknpu_power_on()
717 int ret = -EINVAL; in rknpu_power_on()
720 if (rknpu_dev->vdd) { in rknpu_power_on()
721 ret = regulator_enable(rknpu_dev->vdd); in rknpu_power_on()
731 if (rknpu_dev->mem) { in rknpu_power_on()
732 ret = regulator_enable(rknpu_dev->mem); in rknpu_power_on()
743 ret = clk_bulk_prepare_enable(rknpu_dev->num_clks, rknpu_dev->clks); in rknpu_power_on()
753 rockchip_monitor_volt_adjust_lock(rknpu_dev->mdev_info); in rknpu_power_on()
757 if (rknpu_dev->multiple_domains) { in rknpu_power_on()
758 if (rknpu_dev->genpd_dev_npu0) { in rknpu_power_on()
761 rknpu_dev->genpd_dev_npu0); in rknpu_power_on()
763 ret = pm_runtime_get_sync(rknpu_dev->genpd_dev_npu0); in rknpu_power_on()
773 if (rknpu_dev->genpd_dev_npu1) { in rknpu_power_on()
776 rknpu_dev->genpd_dev_npu1); in rknpu_power_on()
778 ret = pm_runtime_get_sync(rknpu_dev->genpd_dev_npu1); in rknpu_power_on()
788 if (rknpu_dev->genpd_dev_npu2) { in rknpu_power_on()
791 rknpu_dev->genpd_dev_npu2); in rknpu_power_on()
793 ret = pm_runtime_get_sync(rknpu_dev->genpd_dev_npu2); in rknpu_power_on()
815 rockchip_monitor_volt_adjust_unlock(rknpu_dev->mdev_info); in rknpu_power_on()
824 struct device *dev = rknpu_dev->dev; in rknpu_power_off()
832 rockchip_monitor_volt_adjust_lock(rknpu_dev->mdev_info); in rknpu_power_off()
838 if (rknpu_dev->multiple_domains) { in rknpu_power_off()
842 * So it may be executed after the NPU is turned off after PD/CLK/VD, in rknpu_power_off()
844 * If the PD/VD/CLK is closed, the register access will crash. in rknpu_power_off()
858 rknpu_dev->mdev_info); in rknpu_power_off()
863 if (rknpu_dev->iommu_en) in rknpu_power_off()
866 if (rknpu_dev->genpd_dev_npu2) in rknpu_power_off()
867 pm_runtime_put_sync(rknpu_dev->genpd_dev_npu2); in rknpu_power_off()
868 if (rknpu_dev->genpd_dev_npu1) in rknpu_power_off()
869 pm_runtime_put_sync(rknpu_dev->genpd_dev_npu1); in rknpu_power_off()
870 if (rknpu_dev->genpd_dev_npu0) in rknpu_power_off()
871 pm_runtime_put_sync(rknpu_dev->genpd_dev_npu0); in rknpu_power_off()
877 rockchip_monitor_volt_adjust_unlock(rknpu_dev->mdev_info); in rknpu_power_off()
881 clk_bulk_disable_unprepare(rknpu_dev->num_clks, rknpu_dev->clks); in rknpu_power_off()
884 if (rknpu_dev->vdd) in rknpu_power_off()
885 regulator_disable(rknpu_dev->vdd); in rknpu_power_off()
887 if (rknpu_dev->mem) in rknpu_power_off()
888 regulator_disable(rknpu_dev->mem); in rknpu_power_off()
908 struct device *dev = data->dev; in npu_opp_helper()
909 struct dev_pm_opp_supply *old_supply_vdd = &data->old_opp.supplies[0]; in npu_opp_helper()
910 struct dev_pm_opp_supply *old_supply_mem = &data->old_opp.supplies[1]; in npu_opp_helper()
911 struct dev_pm_opp_supply *new_supply_vdd = &data->new_opp.supplies[0]; in npu_opp_helper()
912 struct dev_pm_opp_supply *new_supply_mem = &data->new_opp.supplies[1]; in npu_opp_helper()
913 struct regulator *vdd_reg = data->regulators[0]; in npu_opp_helper()
914 struct regulator *mem_reg = data->regulators[1]; in npu_opp_helper()
915 struct clk *clk = data->clk; in npu_opp_helper()
917 struct rockchip_opp_info *opp_info = &rknpu_dev->opp_info; in npu_opp_helper()
918 unsigned long old_freq = data->old_opp.rate; in npu_opp_helper()
919 unsigned long new_freq = data->new_opp.rate; in npu_opp_helper()
927 if (opp_info->scmi_clk) in npu_opp_helper()
931 ret = clk_bulk_prepare_enable(opp_info->num_clks, opp_info->clks); in npu_opp_helper()
936 rockchip_get_read_margin(dev, opp_info, new_supply_vdd->u_volt, in npu_opp_helper()
940 LOG_DEV_DEBUG(dev, "switching OPP: %lu Hz --> %lu Hz\n", old_freq, in npu_opp_helper()
946 ret = regulator_set_voltage(mem_reg, new_supply_mem->u_volt, in npu_opp_helper()
951 new_supply_mem->u_volt); in npu_opp_helper()
954 ret = regulator_set_voltage(vdd_reg, new_supply_vdd->u_volt, in npu_opp_helper()
959 new_supply_vdd->u_volt); in npu_opp_helper()
964 ret = -EINVAL; in npu_opp_helper()
974 ret = -EINVAL; in npu_opp_helper()
978 ret = regulator_set_voltage(vdd_reg, new_supply_vdd->u_volt, in npu_opp_helper()
983 new_supply_vdd->u_volt); in npu_opp_helper()
986 ret = regulator_set_voltage(mem_reg, new_supply_mem->u_volt, in npu_opp_helper()
991 new_supply_mem->u_volt); in npu_opp_helper()
996 clk_bulk_disable_unprepare(opp_info->num_clks, opp_info->clks); in npu_opp_helper()
1002 LOG_DEV_ERROR(dev, "failed to restore old-freq %lu Hz\n", in npu_opp_helper()
1005 rockchip_get_read_margin(dev, opp_info, old_supply_vdd->u_volt, in npu_opp_helper()
1007 rockchip_set_read_margin(dev, opp_info, opp_info->current_rm, in npu_opp_helper()
1010 regulator_set_voltage(mem_reg, old_supply_mem->u_volt, INT_MAX); in npu_opp_helper()
1011 regulator_set_voltage(vdd_reg, old_supply_vdd->u_volt, INT_MAX); in npu_opp_helper()
1012 clk_bulk_disable_unprepare(opp_info->num_clks, opp_info->clks); in npu_opp_helper()
1026 return -EINVAL; in npu_devfreq_target()
1035 rockchip_monitor_volt_adjust_lock(rknpu_dev->mdev_info); in npu_devfreq_target()
1039 rknpu_dev->current_freq = *freq; in npu_devfreq_target()
1040 if (rknpu_dev->devfreq) in npu_devfreq_target()
1041 rknpu_dev->devfreq->last_status.current_frequency = in npu_devfreq_target()
1043 rknpu_dev->current_volt = opp_volt; in npu_devfreq_target()
1045 rknpu_dev->current_freq, rknpu_dev->current_volt); in npu_devfreq_target()
1048 rockchip_monitor_volt_adjust_unlock(rknpu_dev->mdev_info); in npu_devfreq_target()
1062 unsigned long old_freq = rknpu_dev->current_freq; in npu_devfreq_target()
1063 unsigned long volt, old_volt = rknpu_dev->current_volt; in npu_devfreq_target()
1064 int ret = -EINVAL; in npu_devfreq_target()
1090 ret = regulator_set_voltage(rknpu_dev->vdd, volt, INT_MAX); in npu_devfreq_target()
1095 rknpu_dev->current_volt = volt; in npu_devfreq_target()
1099 if (rknpu_dev->vdd && old_volt != volt && old_freq < freq) { in npu_devfreq_target()
1100 ret = regulator_set_voltage(rknpu_dev->vdd, volt, INT_MAX); in npu_devfreq_target()
1107 LOG_DEV_DEBUG(dev, "%luHz %luuV -> %luHz %luuV\n", old_freq, old_volt, in npu_devfreq_target()
1109 ret = clk_set_rate(rknpu_dev->clks[0].clk, freq); in npu_devfreq_target()
1115 rknpu_dev->current_freq = freq; in npu_devfreq_target()
1117 if (rknpu_dev->devfreq) in npu_devfreq_target()
1118 rknpu_dev->devfreq->last_status.current_frequency = freq; in npu_devfreq_target()
1120 if (rknpu_dev->vdd && old_volt != volt && old_freq > freq) { in npu_devfreq_target()
1121 ret = regulator_set_voltage(rknpu_dev->vdd, volt, INT_MAX); in npu_devfreq_target()
1128 rknpu_dev->current_volt = volt; in npu_devfreq_target()
1131 rknpu_dev->current_freq, rknpu_dev->current_volt); in npu_devfreq_target()
1147 *freq = rknpu_dev->current_freq; in npu_devfreq_get_cur_freq()
1163 struct rknpu_device *rknpu_dev = df->data; in devfreq_rknpu_ondemand_func()
1166 *freq = rknpu_dev->ondemand_freq; in devfreq_rknpu_ondemand_func()
1168 *freq = df->previous_freq; in devfreq_rknpu_ondemand_func()
1190 struct device *dev = devfreq->dev.parent; in npu_get_static_power()
1193 if (!rknpu_dev->model_data) in npu_get_static_power()
1196 return rockchip_ipa_get_static_power(rknpu_dev->model_data, voltage); in npu_get_static_power()
1213 if (of_property_match_string(np, "nvmem-cell-names", in rk3588_npu_get_soc_info()
1248 if (!of_property_read_bool(np, "rockchip,supported-hw")) in rk3588_npu_set_soc_info()
1271 if (!opp_info->grf || !opp_info->volt_rm_tbl) in rk3588_npu_set_read_margin()
1274 if (rm == opp_info->current_rm || rm == UINT_MAX) in rk3588_npu_set_read_margin()
1280 ret = regmap_read(opp_info->grf, offset, &val); in rk3588_npu_set_read_margin()
1287 regmap_write(opp_info->grf, offset, val | (rm << 2)); in rk3588_npu_set_read_margin()
1290 opp_info->current_rm = rm; in rk3588_npu_set_read_margin()
1311 struct device *dev = rknpu_dev->dev; in rknpu_devfreq_init()
1317 int ret = -EINVAL; in rknpu_devfreq_init()
1319 if (of_find_property(dev->of_node, "rknpu-supply", NULL) && in rknpu_devfreq_init()
1320 of_find_property(dev->of_node, "mem-supply", NULL)) { in rknpu_devfreq_init()
1336 rockchip_get_opp_data(rockchip_npu_of_match, &rknpu_dev->opp_info); in rknpu_devfreq_init()
1337 ret = rockchip_init_opp_table(dev, &rknpu_dev->opp_info, "npu_leakage", in rknpu_devfreq_init()
1344 rknpu_dev->current_freq = clk_get_rate(rknpu_dev->clks[0].clk); in rknpu_devfreq_init()
1346 opp = devfreq_recommended_opp(dev, &rknpu_dev->current_freq, 0); in rknpu_devfreq_init()
1352 dp->initial_freq = rknpu_dev->current_freq; in rknpu_devfreq_init()
1362 rknpu_dev->devfreq = devm_devfreq_add_device(dev, dp, "rknpu_ondemand", in rknpu_devfreq_init()
1364 if (IS_ERR(rknpu_dev->devfreq)) { in rknpu_devfreq_init()
1366 ret = PTR_ERR(rknpu_dev->devfreq); in rknpu_devfreq_init()
1369 devm_devfreq_register_opp_notifier(dev, rknpu_dev->devfreq); in rknpu_devfreq_init()
1371 rknpu_dev->devfreq->last_status.current_frequency = dp->initial_freq; in rknpu_devfreq_init()
1372 rknpu_dev->devfreq->last_status.total_time = 1; in rknpu_devfreq_init()
1373 rknpu_dev->devfreq->last_status.busy_time = 1; in rknpu_devfreq_init()
1375 npu_mdevp.data = rknpu_dev->devfreq; in rknpu_devfreq_init()
1376 npu_mdevp.opp_info = &rknpu_dev->opp_info; in rknpu_devfreq_init()
1377 rknpu_dev->mdev_info = in rknpu_devfreq_init()
1379 if (IS_ERR(rknpu_dev->mdev_info)) { in rknpu_devfreq_init()
1381 rknpu_dev->mdev_info = NULL; in rknpu_devfreq_init()
1384 rknpu_dev->current_freq = clk_get_rate(rknpu_dev->clks[0].clk); in rknpu_devfreq_init()
1385 rknpu_dev->current_volt = regulator_get_voltage(rknpu_dev->vdd); in rknpu_devfreq_init()
1387 of_property_read_u32(dev->of_node, "dynamic-power-coefficient", in rknpu_devfreq_init()
1389 rknpu_dev->model_data = in rknpu_devfreq_init()
1391 if (IS_ERR_OR_NULL(rknpu_dev->model_data)) { in rknpu_devfreq_init()
1392 rknpu_dev->model_data = NULL; in rknpu_devfreq_init()
1394 } else if (rknpu_dev->model_data->dynamic_coefficient) { in rknpu_devfreq_init()
1396 rknpu_dev->model_data->dynamic_coefficient; in rknpu_devfreq_init()
1399 LOG_DEV_ERROR(dev, "failed to get dynamic-coefficient\n"); in rknpu_devfreq_init()
1403 rknpu_dev->devfreq_cooling = of_devfreq_cooling_register_power( in rknpu_devfreq_init()
1404 dev->of_node, rknpu_dev->devfreq, &npu_cooling_power); in rknpu_devfreq_init()
1405 if (IS_ERR_OR_NULL(rknpu_dev->devfreq_cooling)) in rknpu_devfreq_init()
1418 rknpu_dev->devfreq = NULL; in rknpu_devfreq_init()
1430 int ret = -EINVAL; in npu_devfreq_adjust_current_freq_volt()
1432 old_freq = clk_get_rate(rknpu_dev->clks[0].clk); in npu_devfreq_adjust_current_freq_volt()
1446 if (freq >= old_freq && rknpu_dev->vdd) { in npu_devfreq_adjust_current_freq_volt()
1447 ret = regulator_set_voltage(rknpu_dev->vdd, volt, INT_MAX); in npu_devfreq_adjust_current_freq_volt()
1455 ret = clk_set_rate(rknpu_dev->clks[0].clk, freq); in npu_devfreq_adjust_current_freq_volt()
1460 if (freq < old_freq && rknpu_dev->vdd) { in npu_devfreq_adjust_current_freq_volt()
1461 ret = regulator_set_voltage(rknpu_dev->vdd, volt, INT_MAX); in npu_devfreq_adjust_current_freq_volt()
1467 rknpu_dev->current_freq = freq; in npu_devfreq_adjust_current_freq_volt()
1468 rknpu_dev->current_volt = volt; in npu_devfreq_adjust_current_freq_volt()
1475 struct device *dev = rknpu_dev->dev; in rknpu_devfreq_init()
1477 int ret = -EINVAL; in rknpu_devfreq_init()
1490 dp->initial_freq = rknpu_dev->current_freq; in rknpu_devfreq_init()
1500 rknpu_dev->devfreq = devm_devfreq_add_device(dev, dp, "rknpu_ondemand", in rknpu_devfreq_init()
1502 if (IS_ERR(rknpu_dev->devfreq)) { in rknpu_devfreq_init()
1504 ret = PTR_ERR(rknpu_dev->devfreq); in rknpu_devfreq_init()
1507 devm_devfreq_register_opp_notifier(dev, rknpu_dev->devfreq); in rknpu_devfreq_init()
1509 rknpu_dev->devfreq->last_status.current_frequency = dp->initial_freq; in rknpu_devfreq_init()
1510 rknpu_dev->devfreq->last_status.total_time = 1; in rknpu_devfreq_init()
1511 rknpu_dev->devfreq->last_status.busy_time = 1; in rknpu_devfreq_init()
1513 npu_mdevp.data = rknpu_dev->devfreq; in rknpu_devfreq_init()
1514 rknpu_dev->mdev_info = in rknpu_devfreq_init()
1516 if (IS_ERR(rknpu_dev->mdev_info)) { in rknpu_devfreq_init()
1518 rknpu_dev->mdev_info = NULL; in rknpu_devfreq_init()
1520 rknpu_dev->current_freq = clk_get_rate(rknpu_dev->clks[0].clk); in rknpu_devfreq_init()
1521 rknpu_dev->current_volt = regulator_get_voltage(rknpu_dev->vdd); in rknpu_devfreq_init()
1523 of_property_read_u32(dev->of_node, "dynamic-power-coefficient", in rknpu_devfreq_init()
1525 rknpu_dev->model_data = in rknpu_devfreq_init()
1527 if (IS_ERR_OR_NULL(rknpu_dev->model_data)) { in rknpu_devfreq_init()
1528 rknpu_dev->model_data = NULL; in rknpu_devfreq_init()
1530 } else if (rknpu_dev->model_data->dynamic_coefficient) { in rknpu_devfreq_init()
1532 rknpu_dev->model_data->dynamic_coefficient; in rknpu_devfreq_init()
1536 LOG_DEV_ERROR(dev, "failed to get dynamic-coefficient\n"); in rknpu_devfreq_init()
1540 rknpu_dev->devfreq_cooling = of_devfreq_cooling_register_power( in rknpu_devfreq_init()
1541 dev->of_node, rknpu_dev->devfreq, &npu_cooling_power); in rknpu_devfreq_init()
1542 if (IS_ERR_OR_NULL(rknpu_dev->devfreq_cooling)) in rknpu_devfreq_init()
1555 rknpu_dev->devfreq = NULL; in rknpu_devfreq_init()
1564 if (rknpu_dev->devfreq) { in rknpu_devfreq_remove()
1565 devfreq_unregister_opp_notifier(rknpu_dev->dev, in rknpu_devfreq_remove()
1566 rknpu_dev->devfreq); in rknpu_devfreq_remove()
1567 dev_pm_opp_of_remove_table(rknpu_dev->dev); in rknpu_devfreq_remove()
1581 const struct rknpu_config *config = rknpu_dev->config; in rknpu_register_irq()
1582 struct device *dev = &pdev->dev; in rknpu_register_irq()
1590 config->irqs[0].name); in rknpu_register_irq()
1593 for (i = 0; i < config->num_irqs; i++) { in rknpu_register_irq()
1595 config->irqs[i].name); in rknpu_register_irq()
1598 config->irqs[i].name); in rknpu_register_irq()
1603 config->irqs[i].irq_hdl, in rknpu_register_irq()
1608 config->irqs[i].name, ret); in rknpu_register_irq()
1629 for (i = 0; i < config->num_irqs; i++) { in rknpu_register_irq()
1630 irq = platform_get_irq_byname(pdev, config->irqs[i].name); in rknpu_register_irq()
1633 config->irqs[i].name); in rknpu_register_irq()
1637 ret = devm_request_irq(dev, irq, config->irqs[i].irq_hdl, in rknpu_register_irq()
1641 config->irqs[i].name, ret); in rknpu_register_irq()
1652 struct device *dev = rknpu_dev->dev; in rknpu_find_sram_resource()
1656 int ret = -EINVAL; in rknpu_find_sram_resource()
1659 sram_node = of_parse_phandle(dev->of_node, "rockchip,sram", 0); in rknpu_find_sram_resource()
1660 rknpu_dev->sram_size = 0; in rknpu_find_sram_resource()
1662 return -EINVAL; in rknpu_find_sram_resource()
1671 rknpu_dev->sram_start = round_up(sram_res.start, PAGE_SIZE); in rknpu_find_sram_resource()
1672 rknpu_dev->sram_end = round_down( in rknpu_find_sram_resource()
1674 if (rknpu_dev->sram_end <= rknpu_dev->sram_start) { in rknpu_find_sram_resource()
1678 &rknpu_dev->sram_start, &rknpu_dev->sram_end); in rknpu_find_sram_resource()
1679 return -EINVAL; in rknpu_find_sram_resource()
1682 sram_size = rknpu_dev->sram_end - rknpu_dev->sram_start; in rknpu_find_sram_resource()
1684 rknpu_dev->sram_base_io = in rknpu_find_sram_resource()
1685 devm_ioremap(dev, rknpu_dev->sram_start, sram_size); in rknpu_find_sram_resource()
1686 if (IS_ERR(rknpu_dev->sram_base_io)) { in rknpu_find_sram_resource()
1688 rknpu_dev->sram_base_io = NULL; in rknpu_find_sram_resource()
1691 rknpu_dev->sram_size = sram_size; in rknpu_find_sram_resource()
1694 &rknpu_dev->sram_start, &rknpu_dev->sram_end, in rknpu_find_sram_resource()
1695 rknpu_dev->sram_size); in rknpu_find_sram_resource()
1702 struct device *dev = rknpu_dev->dev; in rknpu_find_nbuf_resource()
1704 if (rknpu_dev->config->nbuf_size == 0) in rknpu_find_nbuf_resource()
1705 return -EINVAL; in rknpu_find_nbuf_resource()
1707 rknpu_dev->nbuf_start = rknpu_dev->config->nbuf_phyaddr; in rknpu_find_nbuf_resource()
1708 rknpu_dev->nbuf_size = rknpu_dev->config->nbuf_size; in rknpu_find_nbuf_resource()
1709 rknpu_dev->nbuf_base_io = in rknpu_find_nbuf_resource()
1710 devm_ioremap(dev, rknpu_dev->nbuf_start, rknpu_dev->nbuf_size); in rknpu_find_nbuf_resource()
1711 if (IS_ERR(rknpu_dev->nbuf_base_io)) { in rknpu_find_nbuf_resource()
1713 rknpu_dev->nbuf_base_io = NULL; in rknpu_find_nbuf_resource()
1716 rknpu_dev->nbuf_end = rknpu_dev->nbuf_start + rknpu_dev->nbuf_size; in rknpu_find_nbuf_resource()
1719 &rknpu_dev->nbuf_start, &rknpu_dev->nbuf_end, in rknpu_find_nbuf_resource()
1720 rknpu_dev->nbuf_size); in rknpu_find_nbuf_resource()
1729 struct device *dev = &pdev->dev; in rknpu_probe()
1733 int ret = -EINVAL, i = 0; in rknpu_probe()
1735 if (!pdev->dev.of_node) { in rknpu_probe()
1736 LOG_DEV_ERROR(dev, "rknpu device-tree data is missing!\n"); in rknpu_probe()
1737 return -ENODEV; in rknpu_probe()
1742 LOG_DEV_ERROR(dev, "rknpu device-tree entry is missing!\n"); in rknpu_probe()
1743 return -ENODEV; in rknpu_probe()
1749 return -ENOMEM; in rknpu_probe()
1754 return -EINVAL; in rknpu_probe()
1756 rknpu_dev->config = config; in rknpu_probe()
1757 rknpu_dev->dev = dev; in rknpu_probe()
1759 rknpu_dev->iommu_en = rknpu_is_iommu_enable(dev); in rknpu_probe()
1760 if (!rknpu_dev->iommu_en) { in rknpu_probe()
1770 rknpu_dev->bypass_irq_handler = bypass_irq_handler; in rknpu_probe()
1771 rknpu_dev->bypass_soft_reset = bypass_soft_reset; in rknpu_probe()
1775 rknpu_dev->num_clks = devm_clk_bulk_get_all(dev, &rknpu_dev->clks); in rknpu_probe()
1776 if (rknpu_dev->num_clks < 1) { in rknpu_probe()
1779 return -ENODEV; in rknpu_probe()
1786 if (strstr(__clk_get_name(rknpu_dev->clks[0].clk), "scmi")) in rknpu_probe()
1787 rknpu_dev->opp_info.scmi_clk = rknpu_dev->clks[0].clk; in rknpu_probe()
1790 rknpu_dev->vdd = devm_regulator_get_optional(dev, "rknpu"); in rknpu_probe()
1791 if (IS_ERR(rknpu_dev->vdd)) { in rknpu_probe()
1792 if (PTR_ERR(rknpu_dev->vdd) != -ENODEV) { in rknpu_probe()
1793 ret = PTR_ERR(rknpu_dev->vdd); in rknpu_probe()
1800 rknpu_dev->vdd = NULL; in rknpu_probe()
1803 rknpu_dev->mem = devm_regulator_get_optional(dev, "mem"); in rknpu_probe()
1804 if (IS_ERR(rknpu_dev->mem)) { in rknpu_probe()
1805 if (PTR_ERR(rknpu_dev->mem) != -ENODEV) { in rknpu_probe()
1806 ret = PTR_ERR(rknpu_dev->mem); in rknpu_probe()
1813 rknpu_dev->mem = NULL; in rknpu_probe()
1817 spin_lock_init(&rknpu_dev->lock); in rknpu_probe()
1818 spin_lock_init(&rknpu_dev->irq_lock); in rknpu_probe()
1819 mutex_init(&rknpu_dev->power_lock); in rknpu_probe()
1820 mutex_init(&rknpu_dev->reset_lock); in rknpu_probe()
1821 for (i = 0; i < config->num_irqs; i++) { in rknpu_probe()
1822 INIT_LIST_HEAD(&rknpu_dev->subcore_datas[i].todo_list); in rknpu_probe()
1823 init_waitqueue_head(&rknpu_dev->subcore_datas[i].job_done_wq); in rknpu_probe()
1824 rknpu_dev->subcore_datas[i].task_num = 0; in rknpu_probe()
1830 return -ENXIO; in rknpu_probe()
1833 rknpu_dev->base[i] = devm_ioremap_resource(dev, res); in rknpu_probe()
1834 if (PTR_ERR(rknpu_dev->base[i]) == -EBUSY) { in rknpu_probe()
1835 rknpu_dev->base[i] = devm_ioremap(dev, res->start, in rknpu_probe()
1839 if (IS_ERR(rknpu_dev->base[i])) { in rknpu_probe()
1842 return PTR_ERR(rknpu_dev->base[i]); in rknpu_probe()
1846 if (config->bw_priority_length > 0) { in rknpu_probe()
1847 rknpu_dev->bw_priority_base = in rknpu_probe()
1848 devm_ioremap(dev, config->bw_priority_addr, in rknpu_probe()
1849 config->bw_priority_length); in rknpu_probe()
1850 if (IS_ERR(rknpu_dev->bw_priority_base)) { in rknpu_probe()
1852 rknpu_dev->dev, in rknpu_probe()
1854 rknpu_dev->bw_priority_base = NULL; in rknpu_probe()
1858 if (!rknpu_dev->bypass_irq_handler) { in rknpu_probe()
1874 rknpu_dev->miscdev.minor = MISC_DYNAMIC_MINOR; in rknpu_probe()
1875 rknpu_dev->miscdev.name = "rknpu"; in rknpu_probe()
1876 rknpu_dev->miscdev.fops = &rknpu_fops; in rknpu_probe()
1878 ret = misc_register(&rknpu_dev->miscdev); in rknpu_probe()
1884 rknpu_dev->heap = rk_dma_heap_find("rk-dma-heap-cma"); in rknpu_probe()
1885 if (!rknpu_dev->heap) { in rknpu_probe()
1887 return -ENOMEM; in rknpu_probe()
1908 if (of_count_phandle_with_args(dev->of_node, "power-domains", in rknpu_probe()
1909 "#power-domain-cells") > 1) { in rknpu_probe()
1912 rknpu_dev->genpd_dev_npu0 = virt_dev; in rknpu_probe()
1915 rknpu_dev->genpd_dev_npu1 = virt_dev; in rknpu_probe()
1918 rknpu_dev->genpd_dev_npu2 = virt_dev; in rknpu_probe()
1919 rknpu_dev->multiple_domains = true; in rknpu_probe()
1933 rknpu_dev->power_put_delay = 3000; in rknpu_probe()
1934 rknpu_dev->power_off_wq = in rknpu_probe()
1936 if (!rknpu_dev->power_off_wq) { in rknpu_probe()
1938 ret = -ENOMEM; in rknpu_probe()
1941 INIT_DEFERRABLE_WORK(&rknpu_dev->power_off_work, in rknpu_probe()
1945 IS_ENABLED(CONFIG_ROCKCHIP_RKNPU_SRAM) && rknpu_dev->iommu_en) { in rknpu_probe()
1947 ret = rknpu_mm_create(rknpu_dev->sram_size, PAGE_SIZE, in rknpu_probe()
1948 &rknpu_dev->sram_mm); in rknpu_probe()
1956 if (IS_ENABLED(CONFIG_NO_GKI) && rknpu_dev->iommu_en && in rknpu_probe()
1957 rknpu_dev->config->nbuf_size > 0) in rknpu_probe()
1961 atomic_set(&rknpu_dev->power_refcount, 0); in rknpu_probe()
1962 atomic_set(&rknpu_dev->cmdline_power_refcount, 0); in rknpu_probe()
1970 destroy_workqueue(rknpu_dev->power_off_wq); in rknpu_probe()
1982 misc_deregister(&(rknpu_dev->miscdev)); in rknpu_probe()
1993 cancel_delayed_work_sync(&rknpu_dev->power_off_work); in rknpu_remove()
1994 destroy_workqueue(rknpu_dev->power_off_wq); in rknpu_remove()
1996 if (IS_ENABLED(CONFIG_ROCKCHIP_RKNPU_SRAM) && rknpu_dev->sram_mm) in rknpu_remove()
1997 rknpu_mm_destroy(rknpu_dev->sram_mm); in rknpu_remove()
2002 for (i = 0; i < rknpu_dev->config->num_irqs; i++) { in rknpu_remove()
2003 WARN_ON(rknpu_dev->subcore_datas[i].job); in rknpu_remove()
2004 WARN_ON(!list_empty(&rknpu_dev->subcore_datas[i].todo_list)); in rknpu_remove()
2011 misc_deregister(&(rknpu_dev->miscdev)); in rknpu_remove()
2018 mutex_lock(&rknpu_dev->power_lock); in rknpu_remove()
2019 if (atomic_read(&rknpu_dev->power_refcount) > 0) in rknpu_remove()
2021 mutex_unlock(&rknpu_dev->power_lock); in rknpu_remove()
2023 if (rknpu_dev->multiple_domains) { in rknpu_remove()
2024 if (rknpu_dev->genpd_dev_npu0) in rknpu_remove()
2025 dev_pm_domain_detach(rknpu_dev->genpd_dev_npu0, true); in rknpu_remove()
2026 if (rknpu_dev->genpd_dev_npu1) in rknpu_remove()
2027 dev_pm_domain_detach(rknpu_dev->genpd_dev_npu1, true); in rknpu_remove()
2028 if (rknpu_dev->genpd_dev_npu2) in rknpu_remove()
2029 dev_pm_domain_detach(rknpu_dev->genpd_dev_npu2, true); in rknpu_remove()
2032 pm_runtime_disable(&pdev->dev); in rknpu_remove()
2043 struct rockchip_opp_info *opp_info = &rknpu_dev->opp_info; in rknpu_runtime_suspend()
2045 if (opp_info->scmi_clk) { in rknpu_runtime_suspend()
2046 if (clk_set_rate(opp_info->scmi_clk, POWER_DOWN_FREQ)) in rknpu_runtime_suspend()
2049 opp_info->current_rm = UINT_MAX; in rknpu_runtime_suspend()
2057 struct rockchip_opp_info *opp_info = &rknpu_dev->opp_info; in rknpu_runtime_resume()
2060 if (!rknpu_dev->current_freq || !rknpu_dev->current_volt) in rknpu_runtime_resume()
2063 ret = clk_bulk_prepare_enable(opp_info->num_clks, opp_info->clks); in rknpu_runtime_resume()
2069 if (opp_info->data && opp_info->data->set_read_margin) in rknpu_runtime_resume()
2070 opp_info->data->set_read_margin(dev, opp_info, in rknpu_runtime_resume()
2071 opp_info->target_rm); in rknpu_runtime_resume()
2072 if (opp_info->scmi_clk) { in rknpu_runtime_resume()
2073 if (clk_set_rate(opp_info->scmi_clk, rknpu_dev->current_freq)) in rknpu_runtime_resume()
2077 clk_bulk_disable_unprepare(opp_info->num_clks, opp_info->clks); in rknpu_runtime_resume()
2121 MODULE_AUTHOR("Felix Zeng <felix.zeng@rock-chips.com>");
2122 MODULE_ALIAS("rockchip-rknpu");