Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | // SPDX-License-Identifier: GPL-2.0 /* * Sandbox driver for interrupts * * Copyright 2019 Google LLC */ #include <common.h> #include <dm.h> #include <irq.h> #include <acpi/acpi_device.h> #include <asm/test.h> /** * struct sandbox_irq_priv - private data for this driver * * @count: Counts the number calls to the read_and_clear() method * @pending: true if an interrupt is pending, else false */ struct sandbox_irq_priv { int count; bool pending; }; static int sandbox_set_polarity(struct udevice *dev, uint irq, bool active_low) { if (irq > 10) return -EINVAL; return 0; } static int sandbox_route_pmc_gpio_gpe(struct udevice *dev, uint pmc_gpe_num) { if (pmc_gpe_num > 10) return -ENOENT; return pmc_gpe_num + 1; } static int sandbox_snapshot_polarities(struct udevice *dev) { return 0; } static int sandbox_restore_polarities(struct udevice *dev) { return 0; } static int sandbox_irq_read_and_clear(struct irq *irq) { struct sandbox_irq_priv *priv = dev_get_priv(irq->dev); if (irq->id != SANDBOX_IRQN_PEND) return -EINVAL; priv->count++; if (priv->pending) { priv->pending = false; return 1; } if (!(priv->count % 3)) priv->pending = true; return 0; } static int sandbox_irq_of_xlate(struct irq *irq, struct ofnode_phandle_args *args) { irq->id = args->args[0]; return 0; } static __maybe_unused int sandbox_get_acpi(const struct irq *irq, struct acpi_irq *acpi_irq) { acpi_irq->pin = irq->id; acpi_irq->mode = ACPI_IRQ_LEVEL_TRIGGERED; acpi_irq->polarity = ACPI_IRQ_ACTIVE_HIGH; acpi_irq->shared = ACPI_IRQ_SHARED; acpi_irq->wake = ACPI_IRQ_WAKE; return 0; } static const struct irq_ops sandbox_irq_ops = { .route_pmc_gpio_gpe = sandbox_route_pmc_gpio_gpe, .set_polarity = sandbox_set_polarity, .snapshot_polarities = sandbox_snapshot_polarities, .restore_polarities = sandbox_restore_polarities, .read_and_clear = sandbox_irq_read_and_clear, .of_xlate = sandbox_irq_of_xlate, #if CONFIG_IS_ENABLED(ACPIGEN) .get_acpi = sandbox_get_acpi, #endif }; static const struct udevice_id sandbox_irq_ids[] = { { .compatible = "sandbox,irq", SANDBOX_IRQT_BASE }, { } }; U_BOOT_DRIVER(sandbox_irq_drv) = { .name = "sandbox_irq", .id = UCLASS_IRQ, .of_match = sandbox_irq_ids, .ops = &sandbox_irq_ops, .priv_auto_alloc_size = sizeof(struct sandbox_irq_priv), }; |