mirror of
https://git.freebsd.org/src.git
synced 2026-01-16 23:02:24 +00:00
aw_gpio: support Allwinner D1 GPIO
The GPIO controls the multiplexing of the D1 pins to its peripherals, so this adds the definitions needed by the aw_gpio driver to support the D1. Also, this modifies the aw_gpio driver to support the differences of the D1 controller: - pins can have up to 15 functions - each port is mapped with an alignment of 0x30 - CFG registers have 4 bits per pin - DRV registers have 4 bits per pin - the offset of PULL registers is 0x24 Signed-off-by: Julien Cassette <julien.cassette@gmail.com> Reviewed by: mhorne Differential Revision: https://reviews.freebsd.org/D35593
This commit is contained in:
parent
8547197130
commit
7192454558
7 changed files with 247 additions and 32 deletions
|
|
@ -22,7 +22,7 @@
|
|||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd Dec 25, 2017
|
||||
.Dd October 8, 2024
|
||||
.Dt AW_GPIO 4
|
||||
.Os
|
||||
.Sh NAME
|
||||
|
|
@ -41,6 +41,7 @@
|
|||
.Cd "options SOC_ALLWINNER_H3"
|
||||
.Cd "options SOC_ALLWINNER_A64"
|
||||
.Cd "options SOC_ALLWINNER_H5"
|
||||
.Cd "options SOC_ALLWINNER_D1"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
|
|
@ -81,6 +82,8 @@ allwinner,sun8i-h3-r-pinctrl
|
|||
allwinner,sun50i-a64-pinctrl
|
||||
.It
|
||||
allwinner,sun50i-a64-r-pinctrl
|
||||
.It
|
||||
allwinner,sun20i-d1-pinctrl
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr fdt 4 ,
|
||||
|
|
|
|||
|
|
@ -26,13 +26,13 @@
|
|||
#ifndef _ALLWINNER_PINCTRL_H_
|
||||
#define _ALLWINNER_PINCTRL_H_
|
||||
|
||||
#define AW_MAX_FUNC_BY_PIN 8
|
||||
#define AW_MAX_FUNC_BY_PIN 15
|
||||
|
||||
struct allwinner_pins {
|
||||
const char *name;
|
||||
uint8_t port;
|
||||
uint8_t pin;
|
||||
const char *functions[8];
|
||||
const char *functions[AW_MAX_FUNC_BY_PIN];
|
||||
uint8_t eint_func;
|
||||
uint8_t eint_num;
|
||||
uint8_t eint_bank;
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
* Copyright (c) 2013 Ganbold Tsagaankhuu <ganbold@freebsd.org>
|
||||
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org>
|
||||
* Copyright (c) 2012 Luiz Otavio O Souza.
|
||||
* Copyright (c) 2022 Julien Cassette <julien.cassette@gmail.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
|
@ -56,7 +57,7 @@
|
|||
#include <dev/hwreset/hwreset.h>
|
||||
#include <dev/regulator/regulator.h>
|
||||
|
||||
#if defined(__aarch64__)
|
||||
#if defined(__aarch64__) || defined(__riscv)
|
||||
#include "opt_soc.h"
|
||||
#endif
|
||||
|
||||
|
|
@ -82,9 +83,18 @@
|
|||
#define AW_PINCTRL 1
|
||||
#define AW_R_PINCTRL 2
|
||||
|
||||
#if defined(__arm__) || defined(__aarch64__)
|
||||
#define IRQ_MEMORY_BARRIER(x) arm_irq_memory_barrier(x)
|
||||
#else
|
||||
#define IRQ_MEMORY_BARRIER(x) fence()
|
||||
#endif
|
||||
|
||||
struct aw_gpio_conf {
|
||||
struct allwinner_padconf *padconf;
|
||||
const char *banks;
|
||||
uint32_t bank_size;
|
||||
uint32_t drv_pin_shift;
|
||||
uint32_t pul_offset;
|
||||
};
|
||||
|
||||
/* Defined in aw_padconf.c */
|
||||
|
|
@ -93,6 +103,9 @@ extern struct allwinner_padconf a10_padconf;
|
|||
struct aw_gpio_conf a10_gpio_conf = {
|
||||
.padconf = &a10_padconf,
|
||||
.banks = "abcdefghi",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -102,6 +115,9 @@ extern struct allwinner_padconf a13_padconf;
|
|||
struct aw_gpio_conf a13_gpio_conf = {
|
||||
.padconf = &a13_padconf,
|
||||
.banks = "bcdefg",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -111,6 +127,9 @@ extern struct allwinner_padconf a20_padconf;
|
|||
struct aw_gpio_conf a20_gpio_conf = {
|
||||
.padconf = &a20_padconf,
|
||||
.banks = "abcdefghi",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -120,6 +139,9 @@ extern struct allwinner_padconf a31_padconf;
|
|||
struct aw_gpio_conf a31_gpio_conf = {
|
||||
.padconf = &a31_padconf,
|
||||
.banks = "abcdefgh",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -129,6 +151,9 @@ extern struct allwinner_padconf a31s_padconf;
|
|||
struct aw_gpio_conf a31s_gpio_conf = {
|
||||
.padconf = &a31s_padconf,
|
||||
.banks = "abcdefgh",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -137,6 +162,9 @@ extern struct allwinner_padconf a31_r_padconf;
|
|||
struct aw_gpio_conf a31_r_gpio_conf = {
|
||||
.padconf = &a31_r_padconf,
|
||||
.banks = "lm",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -146,6 +174,9 @@ extern struct allwinner_padconf a33_padconf;
|
|||
struct aw_gpio_conf a33_gpio_conf = {
|
||||
.padconf = &a33_padconf,
|
||||
.banks = "bcdefgh",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -156,10 +187,16 @@ extern struct allwinner_padconf h3_r_padconf;
|
|||
struct aw_gpio_conf h3_gpio_conf = {
|
||||
.padconf = &h3_padconf,
|
||||
.banks = "acdefg",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
struct aw_gpio_conf h3_r_gpio_conf = {
|
||||
.padconf = &h3_r_padconf,
|
||||
.banks = "l",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -170,10 +207,16 @@ extern struct allwinner_padconf a83t_r_padconf;
|
|||
struct aw_gpio_conf a83t_gpio_conf = {
|
||||
.padconf = &a83t_padconf,
|
||||
.banks = "bcdefgh"
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
struct aw_gpio_conf a83t_r_gpio_conf = {
|
||||
.padconf = &a83t_r_padconf,
|
||||
.banks = "l",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -184,10 +227,28 @@ extern struct allwinner_padconf a64_r_padconf;
|
|||
struct aw_gpio_conf a64_gpio_conf = {
|
||||
.padconf = &a64_padconf,
|
||||
.banks = "bcdefgh",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
struct aw_gpio_conf a64_r_gpio_conf = {
|
||||
.padconf = &a64_r_padconf,
|
||||
.banks = "l",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
#endif
|
||||
|
||||
/* Defined in d1_padconf.c */
|
||||
#ifdef SOC_ALLWINNER_D1
|
||||
extern struct allwinner_padconf d1_padconf;
|
||||
struct aw_gpio_conf d1_gpio_conf = {
|
||||
.padconf = &d1_padconf,
|
||||
.banks = "bcdefg",
|
||||
.bank_size = 0x30,
|
||||
.drv_pin_shift = 2,
|
||||
.pul_offset = 0x24,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -198,10 +259,16 @@ extern struct allwinner_padconf h6_r_padconf;
|
|||
struct aw_gpio_conf h6_gpio_conf = {
|
||||
.padconf = &h6_padconf,
|
||||
.banks = "cdfgh",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
struct aw_gpio_conf h6_r_gpio_conf = {
|
||||
.padconf = &h6_r_padconf,
|
||||
.banks = "lm",
|
||||
.bank_size = 0x24,
|
||||
.drv_pin_shift = 1,
|
||||
.pul_offset = 0x1C,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -240,6 +307,9 @@ static struct ofw_compat_data compat_data[] = {
|
|||
{"allwinner,sun50i-a64-pinctrl", (uintptr_t)&a64_gpio_conf},
|
||||
{"allwinner,sun50i-a64-r-pinctrl", (uintptr_t)&a64_r_gpio_conf},
|
||||
#endif
|
||||
#ifdef SOC_ALLWINNER_D1
|
||||
{"allwinner,sun20i-d1-pinctrl", (uintptr_t)&d1_gpio_conf},
|
||||
#endif
|
||||
#ifdef SOC_ALLWINNER_H6
|
||||
{"allwinner,sun50i-h6-pinctrl", (uintptr_t)&h6_gpio_conf},
|
||||
{"allwinner,sun50i-h6-r-pinctrl", (uintptr_t)&h6_r_gpio_conf},
|
||||
|
|
@ -293,10 +363,16 @@ static struct resource_spec aw_gpio_res_spec[] = {
|
|||
#define AW_GPIO_UNLOCK(_sc) mtx_unlock_spin(&(_sc)->sc_mtx)
|
||||
#define AW_GPIO_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
|
||||
|
||||
#define AW_GPIO_GP_CFG(_bank, _idx) 0x00 + ((_bank) * 0x24) + ((_idx) << 2)
|
||||
#define AW_GPIO_GP_DAT(_bank) 0x10 + ((_bank) * 0x24)
|
||||
#define AW_GPIO_GP_DRV(_bank, _idx) 0x14 + ((_bank) * 0x24) + ((_idx) << 2)
|
||||
#define AW_GPIO_GP_PUL(_bank, _idx) 0x1c + ((_bank) * 0x24) + ((_idx) << 2)
|
||||
#define AW_GPIO_GP_BASE(_sc, _bank) ((_sc)->conf->bank_size * (_bank))
|
||||
|
||||
#define AW_GPIO_GP_CFG(_sc, _bank, _idx) \
|
||||
(AW_GPIO_GP_BASE(_sc, _bank) + 0x00 + ((_idx) << 2))
|
||||
#define AW_GPIO_GP_DAT(_sc, _bank) \
|
||||
(AW_GPIO_GP_BASE(_sc, _bank) + 0x10)
|
||||
#define AW_GPIO_GP_DRV(_sc, _bank, _idx) \
|
||||
(AW_GPIO_GP_BASE(_sc, _bank) + 0x14 + ((_idx) << 2))
|
||||
#define AW_GPIO_GP_PUL(_sc, _bank, _idx) \
|
||||
(AW_GPIO_GP_BASE(_sc, _bank) + (_sc)->conf->pul_offset + ((_idx) << 2))
|
||||
|
||||
#define AW_GPIO_GP_INT_BASE(_bank) (0x200 + 0x20 * _bank)
|
||||
|
||||
|
|
@ -346,9 +422,9 @@ aw_gpio_get_function(struct aw_gpio_softc *sc, uint32_t pin)
|
|||
pin = sc->conf->padconf->pins[pin].pin;
|
||||
offset = ((pin & 0x07) << 2);
|
||||
|
||||
func = AW_GPIO_READ(sc, AW_GPIO_GP_CFG(bank, pin >> 3));
|
||||
func = AW_GPIO_READ(sc, AW_GPIO_GP_CFG(sc, bank, pin >> 3));
|
||||
|
||||
return ((func >> offset) & 0x7);
|
||||
return ((func >> offset) & 0xF);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -367,10 +443,10 @@ aw_gpio_set_function(struct aw_gpio_softc *sc, uint32_t pin, uint32_t f)
|
|||
pin = sc->conf->padconf->pins[pin].pin;
|
||||
offset = ((pin & 0x07) << 2);
|
||||
|
||||
data = AW_GPIO_READ(sc, AW_GPIO_GP_CFG(bank, pin >> 3));
|
||||
data &= ~(7 << offset);
|
||||
data = AW_GPIO_READ(sc, AW_GPIO_GP_CFG(sc, bank, pin >> 3));
|
||||
data &= ~(0xF << offset);
|
||||
data |= (f << offset);
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_CFG(bank, pin >> 3), data);
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_CFG(sc, bank, pin >> 3), data);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -387,7 +463,7 @@ aw_gpio_get_pud(struct aw_gpio_softc *sc, uint32_t pin)
|
|||
pin = sc->conf->padconf->pins[pin].pin;
|
||||
offset = ((pin & 0x0f) << 1);
|
||||
|
||||
val = AW_GPIO_READ(sc, AW_GPIO_GP_PUL(bank, pin >> 4));
|
||||
val = AW_GPIO_READ(sc, AW_GPIO_GP_PUL(sc, bank, pin >> 4));
|
||||
|
||||
return ((val >> offset) & AW_GPIO_PUD_MASK);
|
||||
}
|
||||
|
|
@ -407,25 +483,26 @@ aw_gpio_set_pud(struct aw_gpio_softc *sc, uint32_t pin, uint32_t state)
|
|||
pin = sc->conf->padconf->pins[pin].pin;
|
||||
offset = ((pin & 0x0f) << 1);
|
||||
|
||||
val = AW_GPIO_READ(sc, AW_GPIO_GP_PUL(bank, pin >> 4));
|
||||
val = AW_GPIO_READ(sc, AW_GPIO_GP_PUL(sc, bank, pin >> 4));
|
||||
val &= ~(AW_GPIO_PUD_MASK << offset);
|
||||
val |= (state << offset);
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_PUL(bank, pin >> 4), val);
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_PUL(sc, bank, pin >> 4), val);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
aw_gpio_get_drv(struct aw_gpio_softc *sc, uint32_t pin)
|
||||
{
|
||||
uint32_t bank, offset, val;
|
||||
uint32_t bank, idx, offset, val;
|
||||
|
||||
/* Must be called with lock held. */
|
||||
AW_GPIO_LOCK_ASSERT(sc);
|
||||
|
||||
bank = sc->conf->padconf->pins[pin].port;
|
||||
pin = sc->conf->padconf->pins[pin].pin;
|
||||
offset = ((pin & 0x0f) << 1);
|
||||
offset = (pin << sc->conf->drv_pin_shift) & 0x1F;
|
||||
idx = (pin << sc->conf->drv_pin_shift) >> 5;
|
||||
|
||||
val = AW_GPIO_READ(sc, AW_GPIO_GP_DRV(bank, pin >> 4));
|
||||
val = AW_GPIO_READ(sc, AW_GPIO_GP_DRV(sc, bank, idx));
|
||||
|
||||
return ((val >> offset) & AW_GPIO_DRV_MASK);
|
||||
}
|
||||
|
|
@ -433,7 +510,7 @@ aw_gpio_get_drv(struct aw_gpio_softc *sc, uint32_t pin)
|
|||
static void
|
||||
aw_gpio_set_drv(struct aw_gpio_softc *sc, uint32_t pin, uint32_t drive)
|
||||
{
|
||||
uint32_t bank, offset, val;
|
||||
uint32_t bank, idx, offset, val;
|
||||
|
||||
if (aw_gpio_get_drv(sc, pin) == drive)
|
||||
return;
|
||||
|
|
@ -443,12 +520,13 @@ aw_gpio_set_drv(struct aw_gpio_softc *sc, uint32_t pin, uint32_t drive)
|
|||
|
||||
bank = sc->conf->padconf->pins[pin].port;
|
||||
pin = sc->conf->padconf->pins[pin].pin;
|
||||
offset = ((pin & 0x0f) << 1);
|
||||
offset = (pin << sc->conf->drv_pin_shift) & 0x1F;
|
||||
idx = (pin << sc->conf->drv_pin_shift) >> 5;
|
||||
|
||||
val = AW_GPIO_READ(sc, AW_GPIO_GP_DRV(bank, pin >> 4));
|
||||
val = AW_GPIO_READ(sc, AW_GPIO_GP_DRV(sc, bank, idx));
|
||||
val &= ~(AW_GPIO_DRV_MASK << offset);
|
||||
val |= (drive << offset);
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_DRV(bank, pin >> 4), val);
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_DRV(sc, bank, idx), val);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -624,12 +702,12 @@ aw_gpio_pin_set_locked(struct aw_gpio_softc *sc, uint32_t pin,
|
|||
bank = sc->conf->padconf->pins[pin].port;
|
||||
pin = sc->conf->padconf->pins[pin].pin;
|
||||
|
||||
data = AW_GPIO_READ(sc, AW_GPIO_GP_DAT(bank));
|
||||
data = AW_GPIO_READ(sc, AW_GPIO_GP_DAT(sc, bank));
|
||||
if (value)
|
||||
data |= (1 << pin);
|
||||
else
|
||||
data &= ~(1 << pin);
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_DAT(bank), data);
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_DAT(sc, bank), data);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -672,7 +750,7 @@ aw_gpio_pin_get_locked(struct aw_gpio_softc *sc,uint32_t pin,
|
|||
bank = sc->conf->padconf->pins[pin].port;
|
||||
pin = sc->conf->padconf->pins[pin].pin;
|
||||
|
||||
reg_data = AW_GPIO_READ(sc, AW_GPIO_GP_DAT(bank));
|
||||
reg_data = AW_GPIO_READ(sc, AW_GPIO_GP_DAT(sc, bank));
|
||||
*val = (reg_data & (1 << pin)) ? 1 : 0;
|
||||
|
||||
if (func == sc->conf->padconf->pins[pin].eint_func)
|
||||
|
|
@ -779,12 +857,12 @@ aw_gpio_pin_toggle(device_t dev, uint32_t pin)
|
|||
pin = sc->conf->padconf->pins[pin].pin;
|
||||
|
||||
AW_GPIO_LOCK(sc);
|
||||
data = AW_GPIO_READ(sc, AW_GPIO_GP_DAT(bank));
|
||||
data = AW_GPIO_READ(sc, AW_GPIO_GP_DAT(sc, bank));
|
||||
if (data & (1 << pin))
|
||||
data &= ~(1 << pin);
|
||||
else
|
||||
data |= (1 << pin);
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_DAT(bank), data);
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_DAT(sc, bank), data);
|
||||
AW_GPIO_UNLOCK(sc);
|
||||
|
||||
return (0);
|
||||
|
|
@ -813,9 +891,9 @@ aw_gpio_pin_access_32(device_t dev, uint32_t first_pin, uint32_t clear_pins,
|
|||
return (EINVAL);
|
||||
|
||||
AW_GPIO_LOCK(sc);
|
||||
data = AW_GPIO_READ(sc, AW_GPIO_GP_DAT(bank));
|
||||
data = AW_GPIO_READ(sc, AW_GPIO_GP_DAT(sc, bank));
|
||||
if ((clear_pins | change_pins) != 0)
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_DAT(bank),
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_DAT(sc, bank),
|
||||
(data & ~clear_pins) ^ change_pins);
|
||||
AW_GPIO_UNLOCK(sc);
|
||||
|
||||
|
|
@ -1408,7 +1486,7 @@ aw_gpio_pic_post_filter(device_t dev, struct intr_irqsrc *isrc)
|
|||
sc = device_get_softc(dev);
|
||||
gi = (struct gpio_irqsrc *)isrc;
|
||||
|
||||
arm_irq_memory_barrier(0);
|
||||
IRQ_MEMORY_BARRIER(0);
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_INT_STA(gi->bank), 1 << gi->intnum);
|
||||
}
|
||||
|
||||
|
|
@ -1421,7 +1499,7 @@ aw_gpio_pic_post_ithread(device_t dev, struct intr_irqsrc *isrc)
|
|||
sc = device_get_softc(dev);
|
||||
gi = (struct gpio_irqsrc *)isrc;
|
||||
|
||||
arm_irq_memory_barrier(0);
|
||||
IRQ_MEMORY_BARRIER(0);
|
||||
AW_GPIO_WRITE(sc, AW_GPIO_GP_INT_STA(gi->bank), 1 << gi->intnum);
|
||||
aw_gpio_pic_enable_intr(dev, isrc);
|
||||
}
|
||||
|
|
|
|||
129
sys/riscv/allwinner/d1_padconf.c
Normal file
129
sys/riscv/allwinner/d1_padconf.c
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
/*-
|
||||
* Copyright (c) 2022 Julien Cassette <julien.cassette@gmail.com>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <arm/allwinner/allwinner_pinctrl.h>
|
||||
|
||||
#include "opt_soc.h"
|
||||
|
||||
static const struct allwinner_pins d1_pins[] = {
|
||||
{ "PB0", 1, 0, { "gpio_in", "gpio_out", "pwm3", "ir", "i2c2", "spi1", "uart0", "uart2", "spdif", [14] = "pb_eint0" }, 14, 0, 1 },
|
||||
{ "PB1", 1, 1, { "gpio_in", "gpio_out", "pwm4", "i2s2", "i2c2", "i2s2", "uart0", "uart2", "ir", [14] = "pb_eint1" }, 14, 1, 1 },
|
||||
{ "PB2", 1, 2, { "gpio_in", "gpio_out", "lcd0", "i2s2", "i2c0", "i2s2", "lcd0", "uart4", NULL, [14] = "pb_eint2" }, 14, 2, 1 },
|
||||
{ "PB3", 1, 3, { "gpio_in", "gpio_out", "lcd0", "i2s2", "i2c0", "i2s2", "lcd0", "uart4", NULL, [14] = "pb_eint3" }, 14, 3, 1 },
|
||||
{ "PB4", 1, 4, { "gpio_in", "gpio_out", "lcd0", "i2s2", "i2c1", "i2s2", "lcd0", "uart5", NULL, [14] = "pb_eint4" }, 14, 4, 1 },
|
||||
{ "PB5", 1, 5, { "gpio_in", "gpio_out", "lcd0", "i2s2", "i2c1", "pwm0", "lcd0", "uart5", NULL, [14] = "pb_eint5" }, 14, 5, 1 },
|
||||
{ "PB6", 1, 6, { "gpio_in", "gpio_out", "lcd0", "i2s2", "i2c3", "pwm1", "lcd0", "uart3", "cpu", [14] = "pb_eint6" }, 14, 6, 1 },
|
||||
{ "PB7", 1, 7, { "gpio_in", "gpio_out", "lcd0", "i2s2", "i2c3", "ir", "lcd0", "uart3", "cpu", [14] = "pb_eint7" }, 14, 7, 1 },
|
||||
{ "PB8", 1, 8, { "gpio_in", "gpio_out", "dmic", "pwm5", "i2c2", "spi1", "uart0", "uart1", NULL, [14] = "pb_eint8" }, 14, 8, 1 },
|
||||
{ "PB9", 1, 9, { "gpio_in", "gpio_out", "dmic", "pwm6", "i2c2", "spi1", "uart0", "uart1", NULL, [14] = "pb_eint9" }, 14, 9, 1 },
|
||||
{ "PB10", 1, 10, { "gpio_in", "gpio_out", "dmic", "pwm7", "i2c0", "spi1", "clk", "uart1", NULL, [14] = "pb_eint10" }, 14, 10, 1 },
|
||||
{ "PB11", 1, 11, { "gpio_in", "gpio_out", "dmic", "pwm2", "i2c0", "spi1", "clk", "uart1", NULL, [14] = "pb_eint11" }, 14, 11, 1 },
|
||||
{ "PB12", 1, 12, { "gpio_in", "gpio_out", "dmic", "pwm0", "spdif", "spi1", "clk", "ir", NULL, [14] = "pb_eint12" }, 14, 12, 1 },
|
||||
{ "PC0", 2, 0, { "gpio_in", "gpio_out", "uart2", "i2c2", "ledc", NULL, NULL, NULL, NULL, [14] = "pc_eint0" }, 14, 0, 2 },
|
||||
{ "PC1", 2, 1, { "gpio_in", "gpio_out", "uart2", "i2c2", NULL, NULL, NULL, NULL, NULL, [14] = "pc_eint1" }, 14, 1, 2 },
|
||||
{ "PC2", 2, 2, { "gpio_in", "gpio_out", "spi0", "mmc2", NULL, NULL, NULL, NULL, NULL, [14] = "pc_eint2" }, 14, 2, 2 },
|
||||
{ "PC3", 2, 3, { "gpio_in", "gpio_out", "spi0", "mmc2", NULL, NULL, NULL, NULL, NULL, [14] = "pc_eint3" }, 14, 3, 2 },
|
||||
{ "PC4", 2, 4, { "gpio_in", "gpio_out", "spi0", "mmc2", "boot", NULL, NULL, NULL, NULL, [14] = "pc_eint4" }, 14, 4, 2 },
|
||||
{ "PC5", 2, 5, { "gpio_in", "gpio_out", "spi0", "mmc2", "boot", NULL, NULL, NULL, NULL, [14] = "pc_eint5" }, 14, 5, 2 },
|
||||
{ "PC6", 2, 6, { "gpio_in", "gpio_out", "spi0", "mmc2", "uart3", "i2c3", "dbg", NULL, NULL, [14] = "pc_eint6" }, 14, 6, 2 },
|
||||
{ "PC7", 2, 7, { "gpio_in", "gpio_out", "spi0", "mmc2", "uart3", "i2c3", "tcon", NULL, NULL, [14] = "pc_eint7" }, 14, 7, 2 },
|
||||
{ "PD0", 3, 0, { "gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "i2c0", NULL, NULL, NULL, [14] = "pd_eint0" }, 14, 0, 3 },
|
||||
{ "PD1", 3, 1, { "gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart2", NULL, NULL, NULL, [14] = "pd_eint1" }, 14, 1, 3 },
|
||||
{ "PD2", 3, 2, { "gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart2", NULL, NULL, NULL, [14] = "pd_eint2" }, 14, 2, 3 },
|
||||
{ "PD3", 3, 3, { "gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart2", NULL, NULL, NULL, [14] = "pd_eint3" }, 14, 3, 3 },
|
||||
{ "PD4", 3, 4, { "gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart2", NULL, NULL, NULL, [14] = "pd_eint4" }, 14, 4, 3 },
|
||||
{ "PD5", 3, 5, { "gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart5", NULL, NULL, NULL, [14] = "pd_eint5" }, 14, 5, 3 },
|
||||
{ "PD6", 3, 6, { "gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart5", NULL, NULL, NULL, [14] = "pd_eint6" }, 14, 6, 3 },
|
||||
{ "PD7", 3, 7, { "gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart4", NULL, NULL, NULL, [14] = "pd_eint7" }, 14, 7, 3 },
|
||||
{ "PD8", 3, 8, { "gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "uart4", NULL, NULL, NULL, [14] = "pd_eint8" }, 14, 8, 3 },
|
||||
{ "PD9", 3, 9, { "gpio_in", "gpio_out", "lcd0", "lvds0", "dsi", "pwm6", NULL, NULL, NULL, [14] = "pd_eint9" }, 14, 9, 3 },
|
||||
{ "PD10", 3, 10, { "gpio_in", "gpio_out", "lcd0", "lvds1", "spi1", "uart3", NULL, NULL, NULL, [14] = "pd_eint10" }, 14, 10, 3 },
|
||||
{ "PD11", 3, 11, { "gpio_in", "gpio_out", "lcd0", "lvds1", "spi1", "uart3", NULL, NULL, NULL, [14] = "pd_eint11" }, 14, 11, 3 },
|
||||
{ "PD12", 3, 12, { "gpio_in", "gpio_out", "lcd0", "lvds1", "spi1", "i2c0", NULL, NULL, NULL, [14] = "pd_eint12" }, 14, 12, 3 },
|
||||
{ "PD13", 3, 13, { "gpio_in", "gpio_out", "lcd0", "lvds1", "spi1", "uart3", NULL, NULL, NULL, [14] = "pd_eint13" }, 14, 13, 3 },
|
||||
{ "PD14", 3, 14, { "gpio_in", "gpio_out", "lcd0", "lvds1", "spi1", "uart3", NULL, NULL, NULL, [14] = "pd_eint14" }, 14, 14, 3 },
|
||||
{ "PD15", 3, 15, { "gpio_in", "gpio_out", "lcd0", "lvds1", "spi1", "ir", NULL, NULL, NULL, [14] = "pd_eint15" }, 14, 15, 3 },
|
||||
{ "PD16", 3, 16, { "gpio_in", "gpio_out", "lcd0", "lvds1", "dmic", "pwm0", NULL, NULL, NULL, [14] = "pd_eint16" }, 14, 16, 3 },
|
||||
{ "PD17", 3, 17, { "gpio_in", "gpio_out", "lcd0", "lvds1", "dmic", "pwm1", NULL, NULL, NULL, [14] = "pd_eint17" }, 14, 17, 3 },
|
||||
{ "PD18", 3, 18, { "gpio_in", "gpio_out", "lcd0", "lvds1", "dmic", "pwm2", NULL, NULL, NULL, [14] = "pd_eint18" }, 14, 18, 3 },
|
||||
{ "PD19", 3, 19, { "gpio_in", "gpio_out", "lcd0", "lvds1", "dmic", "pwm3", NULL, NULL, NULL, [14] = "pd_eint19" }, 14, 19, 3 },
|
||||
{ "PD20", 3, 20, { "gpio_in", "gpio_out", "lcd0", "i2c2", "dmic", "pwm4", NULL, NULL, NULL, [14] = "pd_eint20" }, 14, 20, 3 },
|
||||
{ "PD21", 3, 21, { "gpio_in", "gpio_out", "lcd0", "i2c2", "uart1", "pwm5", NULL, NULL, NULL, [14] = "pd_eint21" }, 14, 21, 3 },
|
||||
{ "PD22", 3, 22, { "gpio_in", "gpio_out", "spdif", "ir", "uart1", "pwm7", NULL, NULL, NULL, [14] = "pd_eint22" }, 14, 22, 3 },
|
||||
{ "PE0", 4, 0, { "gpio_in", "gpio_out", "ncsi0", "uart2", "i2c1", "lcd0", NULL, NULL, "emac", [14] = "pe_eint0" }, 14, 0, 4 },
|
||||
{ "PE1", 4, 1, { "gpio_in", "gpio_out", "ncsi0", "uart2", "i2c1", "lcd0", NULL, NULL, "emac", [14] = "pe_eint1" }, 14, 1, 4 },
|
||||
{ "PE2", 4, 2, { "gpio_in", "gpio_out", "ncsi0", "uart2", "i2c0", "clk", "uart0", NULL, "emac", [14] = "pe_eint2" }, 14, 2, 4 },
|
||||
{ "PE3", 4, 3, { "gpio_in", "gpio_out", "ncsi0", "uart2", "i2c0", "clk", "uart0", NULL, "emac", [14] = "pe_eint3" }, 14, 3, 4 },
|
||||
{ "PE4", 4, 4, { "gpio_in", "gpio_out", "ncsi0", "uart4", "i2c2", "clk", "jtag", "jtag", "emac", [14] = "pe_eint4" }, 14, 4, 4 },
|
||||
{ "PE5", 4, 5, { "gpio_in", "gpio_out", "ncsi0", "uart4", "i2c2", "ledc", "jtag", "jtag", "emac", [14] = "pe_eint5" }, 14, 5, 4 },
|
||||
{ "PE6", 4, 6, { "gpio_in", "gpio_out", "ncsi0", "uart5", "i2c3", "spdif", "jtag", "jtag", "emac", [14] = "pe_eint6" }, 14, 6, 4 },
|
||||
{ "PE7", 4, 7, { "gpio_in", "gpio_out", "ncsi0", "uart5", "i2c3", "spdif", "jtag", "jtag", "emac", [14] = "pe_eint7" }, 14, 7, 4 },
|
||||
{ "PE8", 4, 8, { "gpio_in", "gpio_out", "ncsi0", "uart1", "pwm2", "uart3", "jtag", NULL, "emac", [14] = "pe_eint8" }, 14, 8, 4 },
|
||||
{ "PE9", 4, 9, { "gpio_in", "gpio_out", "ncsi0", "uart1", "pwm3", "uart3", "jtag", NULL, "emac", [14] = "pe_eint9" }, 14, 9, 4 },
|
||||
{ "PE10", 4, 10, { "gpio_in", "gpio_out", "ncsi0", "uart1", "pwm4", "ir", "jtag", NULL, "emac", [14] = "pe_eint10" }, 14, 10, 4 },
|
||||
{ "PE11", 4, 11, { "gpio_in", "gpio_out", "ncsi0", "uart1", "i2s0", "i2s0", "jtag", NULL, "emac", [14] = "pe_eint11" }, 14, 11, 4 },
|
||||
{ "PE12", 4, 12, { "gpio_in", "gpio_out", "i2c2", "ncsi0", "i2s0", "i2s0", NULL, NULL, "emac", [14] = "pe_eint12" }, 14, 12, 4 },
|
||||
{ "PE13", 4, 13, { "gpio_in", "gpio_out", "i2c2", "pwm5", "i2s0", "i2s0", "dmic", NULL, "emac", [14] = "pe_eint13" }, 14, 13, 4 },
|
||||
{ "PE14", 4, 14, { "gpio_in", "gpio_out", "i2c1", "jtag", "i2s0", "i2s0", "dmic", NULL, "emac", [14] = "pe_eint14" }, 14, 14, 4 },
|
||||
{ "PE15", 4, 15, { "gpio_in", "gpio_out", "i2c1", "jtag", "pwm6", "i2s0", "dmic", NULL, "emac", [14] = "pe_eint15" }, 14, 15, 4 },
|
||||
{ "PE16", 4, 16, { "gpio_in", "gpio_out", "i2c3", "jtag", "pwm7", "i2s0", "dmic", NULL, NULL, [14] = "pe_eint16" }, 14, 16, 4 },
|
||||
{ "PE17", 4, 17, { "gpio_in", "gpio_out", "i2c3", "jtag", "ir", "i2s0", "dmic", NULL, NULL, [14] = "pe_eint17" }, 14, 17, 4 },
|
||||
{ "PF0", 5, 0, { "gpio_in", "gpio_out", "mmc0", NULL, "jtag", "i2s2", "i2s2", NULL, NULL, [14] = "pf_eint0" }, 14, 0, 5 },
|
||||
{ "PF1", 5, 1, { "gpio_in", "gpio_out", "mmc0", NULL, "jtag", "i2s2", "i2s2", NULL, NULL, [14] = "pf_eint1" }, 14, 1, 5 },
|
||||
{ "PF2", 5, 2, { "gpio_in", "gpio_out", "mmc0", "uart0", "i2c0", "ledc", "spdif", NULL, NULL, [14] = "pf_eint2" }, 14, 2, 5 },
|
||||
{ "PF3", 5, 3, { "gpio_in", "gpio_out", "mmc0", NULL, "jtag", "i2s2", NULL, NULL, NULL, [14] = "pf_eint3" }, 14, 3, 5 },
|
||||
{ "PF4", 5, 4, { "gpio_in", "gpio_out", "mmc0", "uart0", "i2c0", "pwm6", "ir", NULL, NULL, [14] = "pf_eint4" }, 14, 4, 5 },
|
||||
{ "PF5", 5, 5, { "gpio_in", "gpio_out", "mmc0", NULL, "jtag", "i2s2", NULL, NULL, NULL, [14] = "pf_eint5" }, 14, 5, 5 },
|
||||
{ "PF6", 5, 6, { "gpio_in", "gpio_out", NULL, "spdif", "ir", "i2s2", "pwm5", NULL, NULL, [14] = "pf_eint6" }, 14, 6, 5 },
|
||||
{ "PG0", 6, 0, { "gpio_in", "gpio_out", "mmc1", "uart3", "emac", "pwm7", NULL, NULL, NULL, [14] = "pg_eint0" }, 14, 0, 6 },
|
||||
{ "PG1", 6, 1, { "gpio_in", "gpio_out", "mmc1", "uart3", "emac", "pwm6", NULL, NULL, NULL, [14] = "pg_eint1" }, 14, 1, 6 },
|
||||
{ "PG2", 6, 2, { "gpio_in", "gpio_out", "mmc1", "uart3", "emac", "uart4", NULL, NULL, NULL, [14] = "pg_eint2" }, 14, 2, 6 },
|
||||
{ "PG3", 6, 3, { "gpio_in", "gpio_out", "mmc1", "uart3", "emac", "uart4", NULL, NULL, NULL, [14] = "pg_eint3" }, 14, 3, 6 },
|
||||
{ "PG4", 6, 4, { "gpio_in", "gpio_out", "mmc1", "uart5", "emac", "pwm5", NULL, NULL, NULL, [14] = "pg_eint4" }, 14, 4, 6 },
|
||||
{ "PG5", 6, 5, { "gpio_in", "gpio_out", "mmc1", "uart5", "emac", "pwm4", NULL, NULL, NULL, [14] = "pg_eint5" }, 14, 5, 6 },
|
||||
{ "PG6", 6, 6, { "gpio_in", "gpio_out", "uart1", "i2c2", "emac", "pwm1", NULL, NULL, NULL, [14] = "pg_eint6" }, 14, 6, 6 },
|
||||
{ "PG7", 6, 7, { "gpio_in", "gpio_out", "uart1", "i2c2", "emac", "spdif", NULL, NULL, NULL, [14] = "pg_eint7" }, 14, 7, 6 },
|
||||
{ "PG8", 6, 8, { "gpio_in", "gpio_out", "uart1", "i2c1", "emac", "uart3", NULL, NULL, NULL, [14] = "pg_eint8" }, 14, 8, 6 },
|
||||
{ "PG9", 6, 9, { "gpio_in", "gpio_out", "uart1", "i2c1", "emac", "uart3", NULL, NULL, NULL, [14] = "pg_eint9" }, 14, 9, 6 },
|
||||
{ "PG10", 6, 10, { "gpio_in", "gpio_out", "pwm3", "i2c3", "emac", "clk", "ir", NULL, NULL, [14] = "pg_eint10" }, 14, 10, 6 },
|
||||
{ "PG11", 6, 11, { "gpio_in", "gpio_out", "i2s1", "i2c3", "emac", "clk", "tcon", NULL, NULL, [14] = "pg_eint11" }, 14, 11, 6 },
|
||||
{ "PG12", 6, 12, { "gpio_in", "gpio_out", "i2s1", "i2c0", "emac", "clk", "pwm0", "uart1", NULL, [14] = "pg_eint12" }, 14, 12, 6 },
|
||||
{ "PG13", 6, 13, { "gpio_in", "gpio_out", "i2s1", "i2c0", "emac", "pwm2", "ledc", "uart1", NULL, [14] = "pg_eint13" }, 14, 13, 6 },
|
||||
{ "PG14", 6, 14, { "gpio_in", "gpio_out", "i2s1", "i2c2", "emac", "i2s1", "spi0", "uart1", NULL, [14] = "pg_eint14" }, 14, 14, 6 },
|
||||
{ "PG15", 6, 15, { "gpio_in", "gpio_out", "i2s1", "i2c2", "emac", "i2s1", "spi0", "uart1", NULL, [14] = "pg_eint15" }, 14, 15, 6 },
|
||||
{ "PG16", 6, 16, { "gpio_in", "gpio_out", "ir", "tcon", "pwm5", "clk", "spdif", "ledc", NULL, [14] = "pg_eint16" }, 14, 16, 6 },
|
||||
{ "PG17", 6, 17, { "gpio_in", "gpio_out", "uart2", "i2c3", "pwm7", "clk", "ir", "uart0", NULL, [14] = "pg_eint17" }, 14, 17, 6 },
|
||||
{ "PG18", 6, 18, { "gpio_in", "gpio_out", "uart2", "i2c3", "pwm6", "clk", "spdif", "uart0", NULL, [14] = "pg_eint18" }, 14, 18, 6 },
|
||||
};
|
||||
|
||||
const struct allwinner_padconf d1_padconf = {
|
||||
.npins = nitems(d1_pins),
|
||||
.pins = d1_pins,
|
||||
};
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
|
||||
arm/allwinner/aw_gpio.c optional gpio aw_gpio fdt
|
||||
arm/allwinner/aw_rtc.c optional aw_rtc fdt
|
||||
arm/allwinner/aw_syscon.c optional syscon
|
||||
arm/allwinner/aw_sid.c optional aw_sid nvmem
|
||||
|
|
@ -16,3 +17,5 @@ dev/clk/allwinner/aw_clk_nmm.c optional aw_ccu fdt
|
|||
dev/clk/allwinner/aw_clk_np.c optional aw_ccu fdt
|
||||
dev/clk/allwinner/aw_clk_prediv_mux.c optional aw_ccu fdt
|
||||
dev/clk/allwinner/ccu_d1.c optional soc_allwinner_d1 aw_ccu fdt
|
||||
|
||||
riscv/allwinner/d1_padconf.c optional soc_allwinner_d1 aw_gpio fdt
|
||||
|
|
|
|||
|
|
@ -152,6 +152,7 @@ device axidma # Xilinx AXI DMA Controller
|
|||
|
||||
# GPIO
|
||||
device gpio
|
||||
device fdt_pinctrl
|
||||
|
||||
# SPI
|
||||
device spibus
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
options SOC_ALLWINNER_D1
|
||||
|
||||
device aw_ccu # Allwinner clock controller
|
||||
device aw_gpio # Allwinner GPIO controller
|
||||
device aw_rtc # Allwinner Real-time Clock
|
||||
device aw_sid # Allwinner Secure ID EFUSE
|
||||
device aw_wdog # Allwinner Watchdog
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue