Lines Matching +full:eyeq5 +full:- +full:olb

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Reset driver for the Mobileye EyeQ5, EyeQ6L and EyeQ6H platforms.
5 * Controllers live in a shared register region called OLB. EyeQ5 and EyeQ6L
6 * have a single OLB instance for a single reset controller. EyeQ6H has seven
7 * OLB instances; three host reset controllers.
13 * Domain types define expected behavior: one-register-per-reset,
14 * one-bit-per-reset, status detection method, busywait duration, etc.
16 * We use eqr_ as prefix, as-in "EyeQ Reset", but way shorter.
18 * Known resets in EyeQ5 domain 0 (type EQR_EYEQ5_SARCR):
27 * Known resets in EyeQ5 domain 1 (type EQR_EYEQ5_ACRP):
33 * Known resets in EyeQ5 domain 2 (type EQR_EYEQ5_PCIE):
54 * 4. UART1 5. I2C0 6. I2C1 7. -hole-
65 * - PMA: Programmable Macro Array
66 * - MPC: Multi-threaded Processing Clusters
67 * - VMP: Vector Microcode Processors
89 #include <linux/reset-controller.h>
156 * One mutex per domain for read-modify-write operations on registers.
182 void __iomem *base = priv->base + priv->data->domains[domain].offset; in eqr_busy_wait_locked()
183 enum eqr_domain_type domain_type = priv->data->domains[domain].type; in eqr_busy_wait_locked()
190 lockdep_assert_held(&priv->mutexes[domain]); in eqr_busy_wait_locked()
234 ret = -EINVAL; in eqr_busy_wait_locked()
238 if (ret == -ETIMEDOUT) in eqr_busy_wait_locked()
239 dev_dbg(dev, "%u-%u: timeout\n", domain, offset); in eqr_busy_wait_locked()
245 enum eqr_domain_type domain_type = priv->data->domains[domain].type; in eqr_assert_locked()
249 lockdep_assert_held(&priv->mutexes[domain]); in eqr_assert_locked()
251 base = priv->base + priv->data->domains[domain].offset; in eqr_assert_locked()
288 dev_dbg(rcdev->dev, "%u-%u: assert request\n", domain, offset); in eqr_assert()
290 guard(mutex)(&priv->mutexes[domain]); in eqr_assert()
293 return eqr_busy_wait_locked(priv, rcdev->dev, domain, offset, true); in eqr_assert()
299 enum eqr_domain_type domain_type = priv->data->domains[domain].type; in eqr_deassert_locked()
303 lockdep_assert_held(&priv->mutexes[domain]); in eqr_deassert_locked()
305 base = priv->base + priv->data->domains[domain].offset; in eqr_deassert_locked()
342 dev_dbg(rcdev->dev, "%u-%u: deassert request\n", domain, offset); in eqr_deassert()
344 guard(mutex)(&priv->mutexes[domain]); in eqr_deassert()
347 return eqr_busy_wait_locked(priv, rcdev->dev, domain, offset, false); in eqr_deassert()
355 enum eqr_domain_type domain_type = priv->data->domains[domain].type; in eqr_status()
358 dev_dbg(rcdev->dev, "%u-%u: status request\n", domain, offset); in eqr_status()
360 guard(mutex)(&priv->mutexes[domain]); in eqr_status()
362 base = priv->base + priv->data->domains[domain].offset; in eqr_status()
377 return -EINVAL; in eqr_status()
392 if (domain >= priv->data->domain_count || offset > 31 || in eqr_of_xlate_internal()
393 !(priv->data->domains[domain].valid_mask & BIT(offset))) { in eqr_of_xlate_internal()
394 dev_err(rcdev->dev, "%u-%u: invalid reset\n", domain, offset); in eqr_of_xlate_internal()
395 return -EINVAL; in eqr_of_xlate_internal()
404 return eqr_of_xlate_internal(rcdev, 0, reset_spec->args[0]); in eqr_of_xlate_onecell()
410 return eqr_of_xlate_internal(rcdev, reset_spec->args[0], reset_spec->args[1]); in eqr_of_xlate_twocells()
417 struct device *dev = &adev->dev; in eqr_probe()
423 * We are an auxiliary device of clk-eyeq. We do not have an OF node by in eqr_probe()
426 WARN_ON(dev->of_node); in eqr_probe()
427 device_set_of_node_from_dev(dev, dev->parent); in eqr_probe()
428 if (!dev->of_node) in eqr_probe()
429 return -ENODEV; in eqr_probe()
435 match = of_match_node(dev->driver->of_match_table, dev->of_node); in eqr_probe()
436 if (!match || !match->data) in eqr_probe()
437 return -ENODEV; in eqr_probe()
441 return -ENOMEM; in eqr_probe()
443 priv->data = match->data; in eqr_probe()
444 priv->base = (void __iomem *)dev_get_platdata(dev); in eqr_probe()
445 priv->rcdev.ops = &eqr_ops; in eqr_probe()
446 priv->rcdev.owner = THIS_MODULE; in eqr_probe()
447 priv->rcdev.dev = dev; in eqr_probe()
448 priv->rcdev.of_node = dev->of_node; in eqr_probe()
450 if (priv->data->domain_count == 1) { in eqr_probe()
451 priv->rcdev.of_reset_n_cells = 1; in eqr_probe()
452 priv->rcdev.of_xlate = eqr_of_xlate_onecell; in eqr_probe()
454 priv->rcdev.of_reset_n_cells = 2; in eqr_probe()
455 priv->rcdev.of_xlate = eqr_of_xlate_twocells; in eqr_probe()
458 for (i = 0; i < priv->data->domain_count; i++) in eqr_probe()
459 mutex_init(&priv->mutexes[i]); in eqr_probe()
461 priv->rcdev.nr_resets = 0; in eqr_probe()
462 for (i = 0; i < priv->data->domain_count; i++) in eqr_probe()
463 priv->rcdev.nr_resets += hweight32(priv->data->domains[i].valid_mask); in eqr_probe()
465 ret = devm_reset_controller_register(dev, &priv->rcdev); in eqr_probe()
541 * Table describes OLB system-controller compatibles.
545 { .compatible = "mobileye,eyeq5-olb", .data = &eqr_eyeq5_data },
546 { .compatible = "mobileye,eyeq6l-olb", .data = &eqr_eyeq6l_data },
547 { .compatible = "mobileye,eyeq6h-west-olb", .data = &eqr_eyeq6h_we_data },
548 { .compatible = "mobileye,eyeq6h-east-olb", .data = &eqr_eyeq6h_we_data },
549 { .compatible = "mobileye,eyeq6h-acc-olb", .data = &eqr_eyeq6h_acc_data },