• Home
  • Raw
  • Download

Lines Matching full:hsp

22 #include <dt-bindings/mailbox/tegra186-hsp.h>
45 struct tegra_hsp *hsp; member
89 static inline u32 tegra_hsp_readl(struct tegra_hsp *hsp, unsigned int offset) in tegra_hsp_readl() argument
91 return readl(hsp->regs + offset); in tegra_hsp_readl()
94 static inline void tegra_hsp_writel(struct tegra_hsp *hsp, u32 value, in tegra_hsp_writel() argument
97 writel(value, hsp->regs + offset); in tegra_hsp_writel()
122 __tegra_hsp_doorbell_get(struct tegra_hsp *hsp, unsigned int master) in __tegra_hsp_doorbell_get() argument
126 list_for_each_entry(entry, &hsp->doorbells, list) in __tegra_hsp_doorbell_get()
134 tegra_hsp_doorbell_get(struct tegra_hsp *hsp, unsigned int master) in tegra_hsp_doorbell_get() argument
139 spin_lock_irqsave(&hsp->lock, flags); in tegra_hsp_doorbell_get()
140 db = __tegra_hsp_doorbell_get(hsp, master); in tegra_hsp_doorbell_get()
141 spin_unlock_irqrestore(&hsp->lock, flags); in tegra_hsp_doorbell_get()
148 struct tegra_hsp *hsp = data; in tegra_hsp_doorbell_irq() local
152 db = tegra_hsp_doorbell_get(hsp, TEGRA_HSP_DB_MASTER_CCPLEX); in tegra_hsp_doorbell_irq()
159 spin_lock(&hsp->lock); in tegra_hsp_doorbell_irq()
161 for_each_set_bit(master, &value, hsp->mbox.num_chans) { in tegra_hsp_doorbell_irq()
164 db = __tegra_hsp_doorbell_get(hsp, master); in tegra_hsp_doorbell_irq()
180 spin_unlock(&hsp->lock); in tegra_hsp_doorbell_irq()
186 tegra_hsp_doorbell_create(struct tegra_hsp *hsp, const char *name, in tegra_hsp_doorbell_create() argument
197 offset = (1 + (hsp->num_sm / 2) + hsp->num_ss + hsp->num_as) << 16; in tegra_hsp_doorbell_create()
200 db->channel.regs = hsp->regs + offset; in tegra_hsp_doorbell_create()
201 db->channel.hsp = hsp; in tegra_hsp_doorbell_create()
207 spin_lock_irqsave(&hsp->lock, flags); in tegra_hsp_doorbell_create()
208 list_add_tail(&db->list, &hsp->doorbells); in tegra_hsp_doorbell_create()
209 spin_unlock_irqrestore(&hsp->lock, flags); in tegra_hsp_doorbell_create()
233 struct tegra_hsp *hsp = db->channel.hsp; in tegra_hsp_doorbell_startup() local
238 if (db->master >= hsp->mbox.num_chans) { in tegra_hsp_doorbell_startup()
239 dev_err(hsp->mbox.dev, in tegra_hsp_doorbell_startup()
240 "invalid master ID %u for HSP channel\n", in tegra_hsp_doorbell_startup()
245 ccplex = tegra_hsp_doorbell_get(hsp, TEGRA_HSP_DB_MASTER_CCPLEX); in tegra_hsp_doorbell_startup()
252 spin_lock_irqsave(&hsp->lock, flags); in tegra_hsp_doorbell_startup()
258 spin_unlock_irqrestore(&hsp->lock, flags); in tegra_hsp_doorbell_startup()
266 struct tegra_hsp *hsp = db->channel.hsp; in tegra_hsp_doorbell_shutdown() local
271 ccplex = tegra_hsp_doorbell_get(hsp, TEGRA_HSP_DB_MASTER_CCPLEX); in tegra_hsp_doorbell_shutdown()
275 spin_lock_irqsave(&hsp->lock, flags); in tegra_hsp_doorbell_shutdown()
281 spin_unlock_irqrestore(&hsp->lock, flags); in tegra_hsp_doorbell_shutdown()
294 struct tegra_hsp *hsp = to_tegra_hsp(mbox); in of_tegra_hsp_xlate() local
304 db = tegra_hsp_doorbell_get(hsp, master); in of_tegra_hsp_xlate()
317 spin_lock_irqsave(&hsp->lock, flags); in of_tegra_hsp_xlate()
319 for (i = 0; i < hsp->mbox.num_chans; i++) { in of_tegra_hsp_xlate()
320 chan = &hsp->mbox.chans[i]; in of_tegra_hsp_xlate()
330 spin_unlock_irqrestore(&hsp->lock, flags); in of_tegra_hsp_xlate()
335 static void tegra_hsp_remove_doorbells(struct tegra_hsp *hsp) in tegra_hsp_remove_doorbells() argument
340 spin_lock_irqsave(&hsp->lock, flags); in tegra_hsp_remove_doorbells()
342 list_for_each_entry_safe(db, tmp, &hsp->doorbells, list) in tegra_hsp_remove_doorbells()
345 spin_unlock_irqrestore(&hsp->lock, flags); in tegra_hsp_remove_doorbells()
348 static int tegra_hsp_add_doorbells(struct tegra_hsp *hsp) in tegra_hsp_add_doorbells() argument
350 const struct tegra_hsp_db_map *map = hsp->soc->map; in tegra_hsp_add_doorbells()
354 channel = tegra_hsp_doorbell_create(hsp, map->name, in tegra_hsp_add_doorbells()
357 tegra_hsp_remove_doorbells(hsp); in tegra_hsp_add_doorbells()
369 struct tegra_hsp *hsp; in tegra_hsp_probe() local
374 hsp = devm_kzalloc(&pdev->dev, sizeof(*hsp), GFP_KERNEL); in tegra_hsp_probe()
375 if (!hsp) in tegra_hsp_probe()
378 hsp->soc = of_device_get_match_data(&pdev->dev); in tegra_hsp_probe()
379 INIT_LIST_HEAD(&hsp->doorbells); in tegra_hsp_probe()
380 spin_lock_init(&hsp->lock); in tegra_hsp_probe()
383 hsp->regs = devm_ioremap_resource(&pdev->dev, res); in tegra_hsp_probe()
384 if (IS_ERR(hsp->regs)) in tegra_hsp_probe()
385 return PTR_ERR(hsp->regs); in tegra_hsp_probe()
387 value = tegra_hsp_readl(hsp, HSP_INT_DIMENSIONING); in tegra_hsp_probe()
388 hsp->num_sm = (value >> HSP_nSM_SHIFT) & HSP_nINT_MASK; in tegra_hsp_probe()
389 hsp->num_ss = (value >> HSP_nSS_SHIFT) & HSP_nINT_MASK; in tegra_hsp_probe()
390 hsp->num_as = (value >> HSP_nAS_SHIFT) & HSP_nINT_MASK; in tegra_hsp_probe()
391 hsp->num_db = (value >> HSP_nDB_SHIFT) & HSP_nINT_MASK; in tegra_hsp_probe()
392 hsp->num_si = (value >> HSP_nSI_SHIFT) & HSP_nINT_MASK; in tegra_hsp_probe()
400 hsp->irq = err; in tegra_hsp_probe()
402 hsp->mbox.of_xlate = of_tegra_hsp_xlate; in tegra_hsp_probe()
403 hsp->mbox.num_chans = 32; in tegra_hsp_probe()
404 hsp->mbox.dev = &pdev->dev; in tegra_hsp_probe()
405 hsp->mbox.txdone_irq = false; in tegra_hsp_probe()
406 hsp->mbox.txdone_poll = false; in tegra_hsp_probe()
407 hsp->mbox.ops = &tegra_hsp_doorbell_ops; in tegra_hsp_probe()
409 hsp->mbox.chans = devm_kcalloc(&pdev->dev, hsp->mbox.num_chans, in tegra_hsp_probe()
410 sizeof(*hsp->mbox.chans), in tegra_hsp_probe()
412 if (!hsp->mbox.chans) in tegra_hsp_probe()
415 err = tegra_hsp_add_doorbells(hsp); in tegra_hsp_probe()
421 platform_set_drvdata(pdev, hsp); in tegra_hsp_probe()
423 err = mbox_controller_register(&hsp->mbox); in tegra_hsp_probe()
426 tegra_hsp_remove_doorbells(hsp); in tegra_hsp_probe()
430 err = devm_request_irq(&pdev->dev, hsp->irq, tegra_hsp_doorbell_irq, in tegra_hsp_probe()
431 IRQF_NO_SUSPEND, dev_name(&pdev->dev), hsp); in tegra_hsp_probe()
434 hsp->irq, err); in tegra_hsp_probe()
443 struct tegra_hsp *hsp = platform_get_drvdata(pdev); in tegra_hsp_remove() local
445 mbox_controller_unregister(&hsp->mbox); in tegra_hsp_remove()
446 tegra_hsp_remove_doorbells(hsp); in tegra_hsp_remove()
462 { .compatible = "nvidia,tegra186-hsp", .data = &tegra186_hsp_soc },
468 .name = "tegra-hsp",