blob: fc3eed12669653e6ba5024f1fb73180c900d2f7d [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <ddk/debug.h>
#include <ddk/metadata.h>
#include <ddk/metadata/gpio.h>
#include <ddk/platform-defs.h>
#include <soc/synaptics/gpio.h>
#include <soc/vs680/vs680-gpio.h>
#include "vs680-evk.h"
namespace board_vs680_evk {
zx_status_t Vs680Evk::GpioInit() {
constexpr synaptics::PinmuxMetadata
pinmux_metadata =
{
.muxes = 3,
.pinmux_map =
{
// AVIO GPIOs
[0] =
{
synaptics::PinmuxEntry::kGpio,
1,
21,
}, // I2S3_DI
[1] =
{
synaptics::PinmuxEntry::kGpio,
1,
18,
}, // I2S3_DO
[2] =
{
synaptics::PinmuxEntry::kGpio,
1,
20,
}, // I2S3_BCLKIO
[3] =
{
synaptics::PinmuxEntry::kGpio,
1,
19,
}, // I2S3_LRCKIO
[4] =
{
synaptics::PinmuxEntry::kGpio,
1,
7,
}, // SPDIFI
[5] =
{
synaptics::PinmuxEntry::kGpio,
1,
17,
}, // TX_EDDC_SDA
[6] =
{
synaptics::PinmuxEntry::kGpio,
1,
16,
}, // TX_EDDC_SCL
[7] =
{
synaptics::PinmuxEntry::kGpio,
1,
15,
}, // I2S2_MCLK
[8] =
{
synaptics::PinmuxEntry::kGpio,
1,
13,
}, // I2S2_DI3
[9] =
{
synaptics::PinmuxEntry::kGpio,
1,
12,
}, // I2S2_DI2
[10] =
{
synaptics::PinmuxEntry::kGpio,
1,
11,
}, // I2S2_DI1
[11] =
{
synaptics::PinmuxEntry::kGpio,
1,
10,
}, // I2S2_DI0
[12] =
{
synaptics::PinmuxEntry::kGpio,
1,
9,
}, // I2S2_BCLKIO
[13] =
{
synaptics::PinmuxEntry::kGpio,
1,
8,
}, // I2S2_LRCKIO
[14] =
{
synaptics::PinmuxEntry::kGpio,
1,
6,
}, // SPDIFO
[15] =
{
synaptics::PinmuxEntry::kGpio,
1,
3,
}, // I2S1_DO3
[16] =
{
synaptics::PinmuxEntry::kGpio,
1,
2,
}, // I2S1_DO2
[17] =
{
synaptics::PinmuxEntry::kGpio,
1,
1,
}, // I2S1_DO1
[18] =
{
synaptics::PinmuxEntry::kGpio,
1,
14,
}, // I2S1_MCLK
[19] =
{
synaptics::PinmuxEntry::kGpio,
1,
0,
}, // I2S1_DO0
[20] =
{
synaptics::PinmuxEntry::kGpio,
1,
5,
}, // I2S1_BCLKIO
[21] =
{
synaptics::PinmuxEntry::kGpio,
1,
4,
}, // I2S1_LRCKIO
// SoC GPIOs
[22] =
{
synaptics::PinmuxEntry::kGpio,
0,
27,
}, // RGMII_TXCTL
[23] =
{
synaptics::PinmuxEntry::kGpio,
0,
22,
}, // RGMII_TXC
[24] =
{
synaptics::PinmuxEntry::kGpio,
0,
26,
}, // RGMII_TXD3
[25] =
{
synaptics::PinmuxEntry::kGpio,
0,
25,
}, // RGMII_TXD2
[26] =
{
synaptics::PinmuxEntry::kGpio,
0,
24,
}, // RGMII_TXD1
[27] =
{
synaptics::PinmuxEntry::kGpio,
0,
23,
}, // RGMII_TXD0
[28] =
{
synaptics::PinmuxEntry::kGpio,
0,
21,
}, // RGMII_MDIO
[29] =
{
synaptics::PinmuxEntry::kGpio,
0,
20,
}, // RGMII_MDC
[30] =
{
synaptics::PinmuxEntry::kGpio,
0,
33,
}, // RGMII_RXCTL
[31] =
{
synaptics::PinmuxEntry::kGpio,
0,
28,
}, // RGMII_RXC
[32] =
{
synaptics::PinmuxEntry::kGpio,
0,
32,
}, // RGMII_RXD3
[33] =
{
synaptics::PinmuxEntry::kGpio,
0,
31,
}, // RGMII_RXD2
[34] =
{
synaptics::PinmuxEntry::kGpio,
0,
30,
}, // RGMII_RXD1
[35] =
{
synaptics::PinmuxEntry::kGpio,
0,
29,
}, // RGMII_RXD0
[36] =
{
synaptics::PinmuxEntry::kGpio,
0,
18,
}, // STS1_VALD
[37] =
{
synaptics::PinmuxEntry::kGpio,
0,
17,
}, // STS1_SD
[38] =
{
synaptics::PinmuxEntry::kGpio,
0,
16,
}, // STS1_SOP
[39] =
{
synaptics::PinmuxEntry::kGpio,
0,
15,
}, // STS1_CLK
[40] =
{
synaptics::PinmuxEntry::kGpio,
0,
14,
}, // STS0_VALD
[41] =
{
synaptics::PinmuxEntry::kGpio,
0,
13,
}, // STS0_SD
[42] =
{
synaptics::PinmuxEntry::kGpio,
0,
12,
}, // STS0_SOP
[43] =
{
synaptics::PinmuxEntry::kGpio,
0,
11,
}, // STS0_CLK
[44] =
{
synaptics::PinmuxEntry::kGpio,
0,
1,
}, // SDIO_WP
[45] =
{
synaptics::PinmuxEntry::kGpio,
0,
0,
}, // SDIO_CDn
[46] =
{
synaptics::PinmuxEntry::kGpio,
0,
10,
}, // TW0_SDA
[47] =
{
synaptics::PinmuxEntry::kGpio,
0,
9,
}, // TW0_SCL
[48] =
{
synaptics::PinmuxEntry::kGpio,
0,
8,
}, // SPI1_SDI
[49] =
{
synaptics::PinmuxEntry::kGpio,
0,
7,
}, // SPI1_SCLK
[50] =
{
synaptics::PinmuxEntry::kGpio,
0,
6,
}, // SPI1_SDO
[51] =
{
synaptics::PinmuxEntry::kGpio,
0,
5,
}, // SPI1_SS3n
[52] =
{
synaptics::PinmuxEntry::kGpio,
0,
4,
}, // SPI1_SS2n
[53] =
{
synaptics::PinmuxEntry::kGpio,
0,
3,
}, // SPI1_SS1n
[54] =
{
synaptics::PinmuxEntry::kGpio,
0,
2,
}, // SPI1_SS0n
[55] =
{
synaptics::PinmuxEntry::kGpio,
0,
19,
}, // USB2_DRV_VBUS
// System manager GPIOs
[64] =
{
synaptics::PinmuxEntry::kGpio,
2,
0,
}, // SM_TW2_SCL
[65] =
{
synaptics::PinmuxEntry::kGpio,
2,
1,
}, // SM_TW2_SDA
[66] =
{
synaptics::PinmuxEntry::kGpio,
2,
4,
}, // SM_HDMI_HPD
[67] =
{
synaptics::PinmuxEntry::kGpio,
2,
5,
}, // SM_HDMI_CEC
[68] =
{
synaptics::PinmuxEntry::kGpio,
2,
2,
}, // SM_URT1_TXD
[69] =
{
synaptics::PinmuxEntry::kGpio,
2,
3,
}, // SM_URT1_RXD
[70] =
{
synaptics::PinmuxEntry::kGpio,
2,
6,
}, // SM_TMS
[71] =
{
synaptics::PinmuxEntry::kGpio,
2,
7,
}, // SM_TDI
[72] =
{
synaptics::PinmuxEntry::kGpio,
2,
8,
}, // SM_TDO
[73] =
{
synaptics::PinmuxEntry::kGpio,
2,
9,
}, // SM_TW3_SCL
[74] =
{
synaptics::PinmuxEntry::kGpio,
2,
10,
}, // SM_TW3_SDA
[75] =
{
synaptics::PinmuxEntry::kGpio,
2,
17,
}, // SM_SPI2_SCLK
[76] =
{
synaptics::PinmuxEntry::kGpio,
2,
16,
}, // SM_SPI2_SDI
[77] =
{
synaptics::PinmuxEntry::kGpio,
2,
15,
}, // SM_SPI2_SDO
[78] =
{
synaptics::PinmuxEntry::kGpio,
2,
14,
}, // SM_SPI2_SS3n
[79] =
{
synaptics::PinmuxEntry::kGpio,
2,
13,
}, // SM_SPI2_SS2n
[80] =
{
synaptics::PinmuxEntry::kGpio,
2,
12,
}, // SM_SPI2_SS1n
[81] =
{
synaptics::PinmuxEntry::kGpio,
2,
11,
}, // SM_SPI2_SS0n
[82] =
{
synaptics::PinmuxEntry::kGpio,
2,
18,
}, // SM_URT0_TXD
[83] =
{
synaptics::PinmuxEntry::kGpio,
2,
19,
}, // SM_URT0_RXD
[84] =
{
synaptics::PinmuxEntry::kGpio,
2,
20,
}, // SM_HDMIRX_HPD
[85] =
{
synaptics::PinmuxEntry::kGpio,
2,
21,
}, // SM_HDMIRX_PWR5V
},
};
constexpr pbus_mmio_t gpio_mmios[] = {
{.base = vs680::kSocPinmuxBase, .length = vs680::kPinmuxSize},
{.base = vs680::kAvioPinmuxBase, .length = vs680::kPinmuxSize},
{.base = vs680::kSmPinmuxBase, .length = vs680::kPinmuxSize},
{.base = vs680::kGpio1Base, .length = vs680::kGpioSize},
{.base = vs680::kGpio2Base, .length = vs680::kGpioSize},
{.base = vs680::kSmGpioBase, .length = vs680::kGpioSize},
};
const pbus_irq_t gpio_irqs[] = {
{
.irq = vs680::kGpio1Irq,
.mode = ZX_INTERRUPT_MODE_LEVEL_HIGH,
},
{
.irq = vs680::kGpio2Irq,
.mode = ZX_INTERRUPT_MODE_LEVEL_HIGH,
},
};
const gpio_pin_t gpio_pins[] = {};
const pbus_metadata_t gpio_metadata[] = {
{
.type = DEVICE_METADATA_GPIO_PINS,
.data_buffer = &gpio_pins,
.data_size = sizeof(gpio_pins),
},
{
.type = DEVICE_METADATA_PRIVATE,
.data_buffer = &pinmux_metadata,
.data_size = sizeof(pinmux_metadata),
},
};
pbus_dev_t gpio_dev = {};
gpio_dev.name = "gpio";
gpio_dev.vid = PDEV_VID_SYNAPTICS;
gpio_dev.pid = PDEV_PID_SYNAPTICS_VS680;
gpio_dev.did = PDEV_DID_SYNAPTICS_GPIO;
gpio_dev.mmio_list = gpio_mmios;
gpio_dev.mmio_count = countof(gpio_mmios);
gpio_dev.irq_list = gpio_irqs;
gpio_dev.irq_count = countof(gpio_irqs);
gpio_dev.metadata_list = gpio_metadata;
gpio_dev.metadata_count = countof(gpio_metadata);
auto status = pbus_.ProtocolDeviceAdd(ZX_PROTOCOL_GPIO_IMPL, &gpio_dev);
if (status != ZX_OK) {
zxlogf(ERROR, "%s: ProtocolDeviceAdd failed: %d", __func__, status);
return status;
}
gpio_impl_ = ddk::GpioImplProtocolClient(parent());
if (!gpio_impl_.is_valid()) {
zxlogf(ERROR, "%s: device_get_protocol failed", __func__);
return ZX_ERR_INTERNAL;
}
return ZX_OK;
}
} // namespace board_vs680_evk