blob: 8e8658b7f93de63a35f0bb58c408a58ff6f0d8d3 [file] [log] [blame]
Mike Frysinger71b2ef72022-09-12 18:54:361/* Copyright 2016 The ChromiumOS Authors
Nick Sanders6fcd1632016-07-26 20:17:092 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 */
5
6/* GPIO module for Chrome EC */
7
Yuval Peressa639c132022-07-28 17:23:228#include "builtin/assert.h"
Nick Sanders6fcd1632016-07-26 20:17:099#include "clock.h"
10#include "common.h"
Rong Chang86397ec2017-02-06 10:39:0811#include "gpio.h"
Tom Hughes136e31b2021-10-15 19:58:3412#include "gpio_chip.h"
Rong Chang86397ec2017-02-06 10:39:0813#include "hooks.h"
Nick Sanders6fcd1632016-07-26 20:17:0914#include "registers.h"
Rong Chang86397ec2017-02-06 10:39:0815#include "task.h"
16#include "util.h"
Nick Sanders6fcd1632016-07-26 20:17:0917
Craig Heslingecde5dc2019-10-31 23:56:0718int gpio_required_clocks(void)
19{
20 const int gpio_ports_used = (0
Jack Rosenthal9c7bbc22022-06-27 20:29:1021#define GPIO(name, pin, flags) pin
22#define GPIO_INT(name, pin, flags, signal) pin
23#define ALTERNATE(pinmask, function, module, flagz) pinmask
24#define PIN(port, index) | STM32_RCC_AHB1ENR_GPIO_PORT##port
25#define PIN_MASK(port, mask) PIN(port, 0)
26#include "gpio.wrap"
Craig Heslingecde5dc2019-10-31 23:56:0727 );
28
29 /*
30 * If no ports are in use, then system_is_reboot_warm
31 * may not be valid.
32 */
33 ASSERT(gpio_ports_used);
34
35 return gpio_ports_used;
36}
37
Nick Sanders6fcd1632016-07-26 20:17:0938void gpio_enable_clocks(void)
39{
Craig Heslingecde5dc2019-10-31 23:56:0740 /* Enable only ports that are referenced in the gpio.inc */
41 STM32_RCC_AHB1ENR |= gpio_required_clocks();
Nick Sanders6fcd1632016-07-26 20:17:0942
43 /* Delay 1 AHB clock cycle after the clock is enabled */
44 clock_wait_bus_cycles(BUS_AHB, 1);
45}
46
Rong Chang86397ec2017-02-06 10:39:0847static void gpio_init(void)
48{
49 /* Enable IRQs now that pins are set up */
50 task_enable_irq(STM32_IRQ_EXTI0);
51 task_enable_irq(STM32_IRQ_EXTI1);
52 task_enable_irq(STM32_IRQ_EXTI2);
53 task_enable_irq(STM32_IRQ_EXTI3);
54 task_enable_irq(STM32_IRQ_EXTI4);
55 task_enable_irq(STM32_IRQ_EXTI9_5);
56 task_enable_irq(STM32_IRQ_EXTI15_10);
57}
58DECLARE_HOOK(HOOK_INIT, gpio_init, HOOK_PRIO_DEFAULT);
59
Tom Hughes04e6a232021-10-15 20:10:0060static void _gpio_interrupt(void)
61{
62 gpio_interrupt();
63}
64
65DECLARE_IRQ(STM32_IRQ_EXTI0, _gpio_interrupt, 1);
66DECLARE_IRQ(STM32_IRQ_EXTI1, _gpio_interrupt, 1);
67DECLARE_IRQ(STM32_IRQ_EXTI2, _gpio_interrupt, 1);
68DECLARE_IRQ(STM32_IRQ_EXTI3, _gpio_interrupt, 1);
69DECLARE_IRQ(STM32_IRQ_EXTI4, _gpio_interrupt, 1);
70DECLARE_IRQ(STM32_IRQ_EXTI9_5, _gpio_interrupt, 1);
71DECLARE_IRQ(STM32_IRQ_EXTI15_10, _gpio_interrupt, 1);
Rong Chang86397ec2017-02-06 10:39:0872
Nick Sanders6fcd1632016-07-26 20:17:0973#include "gpio-f0-l.c"