blob: fc40c3ddcc220bb0f3b0c849c35799179ecfd7aa [file] [log] [blame]
Angel Pons182dbde2020-04-02 23:49:05 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Duncan Laurie045f1532012-12-17 11:29:10 -08002
3#ifndef INTEL_LYNXPOINT_LP_GPIO_H
4#define INTEL_LYNXPOINT_LP_GPIO_H
5
Angel Pons7449b622020-05-16 22:57:51 +02006#include <stdint.h>
7
Duncan Laurie045f1532012-12-17 11:29:10 -08008/* LynxPoint LP GPIOBASE Registers */
9#define GPIO_OWNER(set) (0x00 + ((set) * 4))
10#define GPIO_PIRQ_APIC_EN 0x10
11#define GPIO_BLINK 0x18
12#define GPIO_SER_BLINK 0x1c
13#define GPIO_SER_BLINK_CS 0x20
14#define GPIO_SER_BLINK_DATA 0x24
15#define GPIO_ROUTE(set) (0x30 + ((set) * 4))
Duncan Laurie045f1532012-12-17 11:29:10 -080016#define GPIO_RESET(set) (0x60 + ((set) * 4))
17#define GPIO_GLOBAL_CONFIG 0x7c
18#define GPIO_IRQ_IS(set) (0x80 + ((set) * 4))
19#define GPIO_IRQ_IE(set) (0x90 + ((set) * 4))
20#define GPIO_CONFIG0(gpio) (0x100 + ((gpio) * 8))
21#define GPIO_CONFIG1(gpio) (0x104 + ((gpio) * 8))
22
23#define MAX_GPIO_NUMBER 94 /* zero based */
Duncan Laurie55ad9722013-04-23 13:43:23 -070024#define GPIO_LIST_END 0xffffffff
Duncan Laurie045f1532012-12-17 11:29:10 -080025
26/* conf0 */
27
28#define GPIO_MODE_NATIVE (0 << 0)
29#define GPIO_MODE_GPIO (1 << 0)
30
31#define GPIO_DIR_OUTPUT (0 << 2)
32#define GPIO_DIR_INPUT (1 << 2)
33
34#define GPIO_NO_INVERT (0 << 3)
35#define GPIO_INVERT (1 << 3)
36
37#define GPIO_IRQ_EDGE (0 << 4)
38#define GPIO_IRQ_LEVEL (1 << 4)
39
40#define GPI_LEVEL (1 << 30)
41
Duncan Laurie55ad9722013-04-23 13:43:23 -070042#define GPO_LEVEL_SHIFT 31
Angel Pons8963f7d2020-10-24 12:20:28 +020043#define GPO_LEVEL_MASK (1 << GPO_LEVEL_SHIFT)
44#define GPO_LEVEL_LOW (0 << GPO_LEVEL_SHIFT)
45#define GPO_LEVEL_HIGH (1 << GPO_LEVEL_SHIFT)
Duncan Laurie045f1532012-12-17 11:29:10 -080046
47/* conf1 */
48
49#define GPIO_PULL_NONE (0 << 0)
50#define GPIO_PULL_DOWN (1 << 0)
51#define GPIO_PULL_UP (2 << 0)
52
53#define GPIO_SENSE_ENABLE (0 << 2)
54#define GPIO_SENSE_DISABLE (1 << 2)
55
56/* owner */
57
58#define GPIO_OWNER_ACPI 0
59#define GPIO_OWNER_GPIO 1
60
61/* route */
62
63#define GPIO_ROUTE_SCI 0
64#define GPIO_ROUTE_SMI 1
65
66/* irqen */
67
68#define GPIO_IRQ_DISABLE 0
69#define GPIO_IRQ_ENABLE 1
70
71/* blink */
72
73#define GPO_NO_BLINK 0
74#define GPO_BLINK 1
75
76/* reset */
77
78#define GPIO_RESET_PWROK 0
79#define GPIO_RESET_RSMRST 1
80
Duncan Lauriec5939992013-05-24 11:06:49 -070081/* pirq route to io-apic */
82
83#define GPIO_PIRQ_APIC_MASK 0
84#define GPIO_PIRQ_APIC_ROUTE 1
85
Duncan Laurie55ad9722013-04-23 13:43:23 -070086#define LP_GPIO_END \
87 { .conf0 = GPIO_LIST_END }
88
89#define LP_GPIO_NATIVE \
90 { .conf0 = GPIO_MODE_NATIVE }
91
92#define LP_GPIO_UNUSED \
93 { .conf0 = GPIO_MODE_GPIO | GPIO_DIR_INPUT, \
94 .owner = GPIO_OWNER_GPIO, \
95 .conf1 = GPIO_SENSE_DISABLE }
96
97#define LP_GPIO_ACPI_SCI \
98 { .conf0 = GPIO_MODE_GPIO | GPIO_DIR_INPUT | GPIO_INVERT, \
99 .owner = GPIO_OWNER_ACPI, \
100 .route = GPIO_ROUTE_SCI }
101
102#define LP_GPIO_ACPI_SMI \
Duncan Lauriecd7bb2f2013-05-21 09:28:28 -0700103 { .conf0 = GPIO_MODE_GPIO | GPIO_DIR_INPUT | GPIO_INVERT, \
Duncan Laurie55ad9722013-04-23 13:43:23 -0700104 .owner = GPIO_OWNER_ACPI, \
105 .route = GPIO_ROUTE_SMI }
106
107#define LP_GPIO_INPUT \
108 { .conf0 = GPIO_MODE_GPIO | GPIO_DIR_INPUT, \
109 .owner = GPIO_OWNER_GPIO }
110
Duncan Laurie994611a2013-05-29 07:48:47 -0700111#define LP_GPIO_INPUT_INVERT \
112 { .conf0 = GPIO_MODE_GPIO | GPIO_DIR_INPUT | GPIO_INVERT, \
113 .owner = GPIO_OWNER_GPIO }
114
Duncan Laurie55ad9722013-04-23 13:43:23 -0700115#define LP_GPIO_IRQ_EDGE \
116 { .conf0 = GPIO_MODE_GPIO | GPIO_DIR_INPUT | GPIO_IRQ_EDGE, \
117 .owner = GPIO_OWNER_GPIO, \
118 .irqen = GPIO_IRQ_ENABLE }
119
120#define LP_GPIO_IRQ_LEVEL \
121 { .conf0 = GPIO_MODE_GPIO | GPIO_DIR_INPUT | GPIO_IRQ_LEVEL, \
122 .owner = GPIO_OWNER_GPIO, \
123 .irqen = GPIO_IRQ_ENABLE }
124
Duncan Lauriec5939992013-05-24 11:06:49 -0700125#define LP_GPIO_PIRQ \
126 { .conf0 = GPIO_MODE_GPIO | GPIO_DIR_INPUT, \
127 .owner = GPIO_OWNER_GPIO, \
128 .pirq = GPIO_PIRQ_APIC_ROUTE }
129
Angel Ponsd1ff7e42021-01-28 16:41:35 +0100130#define LP_GPIO_PIRQ_INVERT \
131 { .conf0 = GPIO_MODE_GPIO | GPIO_DIR_INPUT | GPIO_INVERT, \
132 .owner = GPIO_OWNER_GPIO, \
133 .pirq = GPIO_PIRQ_APIC_ROUTE }
134
Duncan Laurie55ad9722013-04-23 13:43:23 -0700135#define LP_GPIO_OUT_HIGH \
136 { .conf0 = GPIO_MODE_GPIO | GPIO_DIR_OUTPUT | GPO_LEVEL_HIGH, \
137 .owner = GPIO_OWNER_GPIO, \
138 .conf1 = GPIO_SENSE_DISABLE }
139
140#define LP_GPIO_OUT_LOW \
141 { .conf0 = GPIO_MODE_GPIO | GPIO_DIR_OUTPUT | GPO_LEVEL_LOW, \
142 .owner = GPIO_OWNER_GPIO, \
143 .conf1 = GPIO_SENSE_DISABLE }
144
Duncan Laurie045f1532012-12-17 11:29:10 -0800145struct pch_lp_gpio_map {
146 u8 gpio;
147 u32 conf0;
148 u32 conf1;
149 u8 owner;
150 u8 route;
151 u8 irqen;
152 u8 reset;
153 u8 blink;
Duncan Lauriec5939992013-05-24 11:06:49 -0700154 u8 pirq;
Stefan Reinauer6a001132017-07-13 02:20:27 +0200155} __packed;
Duncan Laurie045f1532012-12-17 11:29:10 -0800156
157/* Configure GPIOs with mainboard provided settings */
158void setup_pch_lp_gpios(const struct pch_lp_gpio_map map[]);
159
Angel Ponsaacbd662021-01-28 16:25:27 +0100160/* Get GPIO pin value */
Patrick Rudolph273a8dc2016-02-06 18:07:59 +0100161int get_gpio(int gpio_num);
Angel Ponsaacbd662021-01-28 16:25:27 +0100162
163/* Set GPIO pin value */
164void set_gpio(int gpio_num, int value);
165
166/* Return non-zero if gpio is set to native function. 0 otherwise. */
167int gpio_is_native(int gpio_num);
168
Patrick Rudolph273a8dc2016-02-06 18:07:59 +0100169/*
Angel Ponsaacbd662021-01-28 16:25:27 +0100170 * Get a number comprised of multiple GPIO values. gpio_num_array points to
Patrick Rudolph273a8dc2016-02-06 18:07:59 +0100171 * the array of gpio pin numbers to scan, terminated by -1.
172 */
Martin Rothff744bf2019-10-23 21:46:03 -0600173unsigned int get_gpios(const int *gpio_num_array);
Patrick Rudolph273a8dc2016-02-06 18:07:59 +0100174
Angel Pons88f94a92021-03-19 15:13:46 +0100175extern const struct pch_lp_gpio_map mainboard_lp_gpio_map[];
Patrick Rudolph273a8dc2016-02-06 18:07:59 +0100176
Duncan Laurie045f1532012-12-17 11:29:10 -0800177#endif