Lines Matching +full:co +full:- +full:processor
32 * DVFS. The AVS firmware is running on its own co-processor. The
93 /* PMAP and P-STATE commands */
107 * unused:31-24, mdiv_p0:23-16, unused:15-14, pdiv:13-10 , ndiv_int:9-0
117 * mdiv_p4:31-24, mdiv_p3:23-16, mdiv_p2:15:8, mdiv_p1:7:0
128 /* Different P-STATES AVS supports (for GET_PSTATE/SET_PSTATE) */
148 /* Non-AVS modes are not supported */
150 /* Cannot set P-State until P-Map supplied */
152 /* Cannot change P-Map after initial P-Map set */
162 #define BRCM_AVS_CPUFREQ_PREFIX "brcmstb-avs"
163 #define BRCM_AVS_CPUFREQ_NAME BRCM_AVS_CPUFREQ_PREFIX "-cpufreq"
164 #define BRCM_AVS_CPU_DATA "brcm,avs-cpu-data-mem"
165 #define BRCM_AVS_CPU_INTR "brcm,avs-cpu-l2-intr"
207 if (priv->host_irq >= 0) in wait_for_avs_command()
208 return wait_for_completion_timeout(&priv->done, in wait_for_avs_command()
214 val = readl(priv->base + AVS_MBOX_STATUS); in wait_for_avs_command()
219 } while (--timeout); in wait_for_avs_command()
228 void __iomem *base = priv->base; in __issue_avs_command()
234 ret = down_interruptible(&priv->sem); in __issue_avs_command()
240 * co-processor is idle. Due to the guard above, we should almost never in __issue_avs_command()
248 ret = -EAGAIN; in __issue_avs_command()
260 reinit_completion(&priv->done); in __issue_avs_command()
264 writel(AVS_CPU_L2_INT_MASK, priv->avs_intr_base + AVS_CPU_L2_SET0); in __issue_avs_command()
266 /* Wait for AVS co-processor to finish processing the command. */ in __issue_avs_command()
276 dev_err(priv->dev, "AVS command %#x didn't complete in time\n", in __issue_avs_command()
278 dev_err(priv->dev, " Time left: %u ms, AVS status: %#x\n", in __issue_avs_command()
280 ret = -ETIMEDOUT; in __issue_avs_command()
288 /* Clear status to tell AVS co-processor we are done. */ in __issue_avs_command()
294 ret = -EINVAL; in __issue_avs_command()
297 ret = -ENOTSUPP; in __issue_avs_command()
300 ret = -ENOENT; in __issue_avs_command()
303 ret = -EEXIST; in __issue_avs_command()
306 ret = -EIO; in __issue_avs_command()
311 up(&priv->sem); in __issue_avs_command()
321 complete(&priv->done); in irq_handler()
368 pmap->mode = args[0]; in brcm_avs_get_pmap()
369 pmap->p1 = args[1]; in brcm_avs_get_pmap()
370 pmap->p2 = args[2]; in brcm_avs_get_pmap()
371 pmap->state = args[3]; in brcm_avs_get_pmap()
380 args[0] = pmap->mode; in brcm_avs_set_pmap()
381 args[1] = pmap->p1; in brcm_avs_set_pmap()
382 args[2] = pmap->p2; in brcm_avs_set_pmap()
383 args[3] = pmap->state; in brcm_avs_set_pmap()
422 * We determine which frequencies are supported by cycling through all P-states
423 * and reading back what frequency we are running at for each P-state.
432 /* Remember P-state for later */ in brcm_avs_get_freq_table()
440 return ERR_PTR(-ENOMEM); in brcm_avs_get_freq_table()
446 table[i].frequency = brcm_avs_get_frequency(priv->base); in brcm_avs_get_freq_table()
451 /* Restore P-state */ in brcm_avs_get_freq_table()
461 * - check the MAGIC matches what we expect
462 * - brcm_avs_get_pmap() doesn't return -ENOTSUPP or -EINVAL
471 magic = readl(priv->base + AVS_MBOX_MAGIC); in brcm_avs_is_firmware_loaded()
473 return (magic == AVS_FIRMWARE_MAGIC) && ((rc != -ENOTSUPP) || in brcm_avs_is_firmware_loaded()
474 (rc != -EINVAL)); in brcm_avs_is_firmware_loaded()
480 struct private_data *priv = policy->driver_data; in brcm_avs_cpufreq_get()
484 return brcm_avs_get_frequency(priv->base); in brcm_avs_cpufreq_get()
490 return brcm_avs_set_pstate(policy->driver_data, in brcm_avs_target_index()
491 policy->freq_table[index].driver_data); in brcm_avs_target_index()
496 struct private_data *priv = policy->driver_data; in brcm_avs_suspend()
499 ret = brcm_avs_get_pmap(priv, &priv->pmap); in brcm_avs_suspend()
504 * We can't use the P-state returned by brcm_avs_get_pmap(), since in brcm_avs_suspend()
505 * that's the initial P-state from when the P-map was downloaded to the in brcm_avs_suspend()
506 * AVS co-processor, not necessarily the P-state we are running at now. in brcm_avs_suspend()
507 * So, we get the current P-state explicitly. in brcm_avs_suspend()
509 ret = brcm_avs_get_pstate(priv, &priv->pmap.state); in brcm_avs_suspend()
521 struct private_data *priv = policy->driver_data; in brcm_avs_resume()
527 ret = brcm_avs_set_pmap(priv, &priv->pmap); in brcm_avs_resume()
528 if (ret == -EEXIST) { in brcm_avs_resume()
530 struct device *dev = &pdev->dev; in brcm_avs_resume()
541 * code that can be re-tried on every core (if it failed before) can go into
550 dev = &pdev->dev; in brcm_avs_prepare_init()
553 return -ENOMEM; in brcm_avs_prepare_init()
555 priv->dev = dev; in brcm_avs_prepare_init()
556 sema_init(&priv->sem, 1); in brcm_avs_prepare_init()
557 init_completion(&priv->done); in brcm_avs_prepare_init()
560 priv->base = __map_region(BRCM_AVS_CPU_DATA); in brcm_avs_prepare_init()
561 if (!priv->base) { in brcm_avs_prepare_init()
564 return -ENOENT; in brcm_avs_prepare_init()
567 priv->avs_intr_base = __map_region(BRCM_AVS_CPU_INTR); in brcm_avs_prepare_init()
568 if (!priv->avs_intr_base) { in brcm_avs_prepare_init()
571 ret = -ENOENT; in brcm_avs_prepare_init()
575 priv->host_irq = platform_get_irq_byname(pdev, BRCM_AVS_HOST_INTR); in brcm_avs_prepare_init()
577 ret = devm_request_irq(dev, priv->host_irq, irq_handler, in brcm_avs_prepare_init()
580 if (ret && priv->host_irq >= 0) { in brcm_avs_prepare_init()
581 dev_err(dev, "IRQ request failed: %s (%d) -- %d\n", in brcm_avs_prepare_init()
582 BRCM_AVS_HOST_INTR, priv->host_irq, ret); in brcm_avs_prepare_init()
590 ret = -ENODEV; in brcm_avs_prepare_init()
593 iounmap(priv->avs_intr_base); in brcm_avs_prepare_init()
595 iounmap(priv->base); in brcm_avs_prepare_init()
606 iounmap(priv->avs_intr_base); in brcm_avs_prepare_uninit()
607 iounmap(priv->base); in brcm_avs_prepare_uninit()
620 policy->driver_data = priv; in brcm_avs_cpufreq_init()
621 dev = &pdev->dev; in brcm_avs_cpufreq_init()
630 policy->freq_table = freq_table; in brcm_avs_cpufreq_init()
633 cpumask_setall(policy->cpus); in brcm_avs_cpufreq_init()
641 policy->cur = freq_table[pstate].frequency; in brcm_avs_cpufreq_init()
654 struct private_data *priv = policy->driver_data; in show_brcm_avs_pstate()
665 struct private_data *priv = policy->driver_data; in show_brcm_avs_mode()
678 struct private_data *priv = policy->driver_data; in show_brcm_avs_pmap()
695 struct private_data *priv = policy->driver_data; in show_brcm_avs_voltage()
697 return sprintf(buf, "0x%08x\n", brcm_avs_get_voltage(priv->base)); in show_brcm_avs_voltage()
702 struct private_data *priv = policy->driver_data; in show_brcm_avs_frequency()
704 return sprintf(buf, "0x%08x\n", brcm_avs_get_frequency(priv->base)); in show_brcm_avs_frequency()