coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
mainboard.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/mmio.h>
4 #include <boot/coreboot_tables.h>
5 #include <delay.h>
6 #include <device/device.h>
7 #include <device/i2c_simple.h>
8 #include <edid.h>
9 #include <gpio.h>
10 #include <soc/display.h>
11 #include <soc/grf.h>
12 #include <soc/soc.h>
13 #include <soc/pmu.h>
14 #include <soc/clock.h>
15 #include <soc/rk808.h>
16 #include <soc/spi.h>
17 #include <soc/i2c.h>
18 #include <symbols.h>
19 
20 #include "board.h"
21 
22 static void configure_usb(void)
23 {
24  gpio_output(GPIO(0, B, 3), 1); /* HOST1_PWR_EN */
25  gpio_output(GPIO(0, B, 4), 1); /* USBOTG_PWREN_H */
26  gpio_output(GPIO(7, C, 5), 1); /* 5V_DRV */
27 }
28 
29 static void configure_sdmmc(void)
30 {
32 
33  /* use sdmmc0 io, disable JTAG function */
35 
36  /* Note: these power rail definitions are copied in romstage.c */
37  rk808_configure_ldo(4, 3300); /* VCCIO_SD */
38  rk808_configure_ldo(5, 3300); /* VCC33_SD */
39 
40  gpio_input(GPIO(7, A, 5)); /* SD_DET */
41 }
42 
43 static void configure_emmc(void)
44 {
48 
49  gpio_output(GPIO(2, B, 1), 1); /* EMMC_RST_L */
50 }
51 
52 static void configure_codec(void)
53 {
54  write32(&rk3288_grf->iomux_i2c2, IOMUX_I2C2); /* CODEC I2C */
55  i2c_init(2, 400*KHz); /* CODEC I2C */
56 
59 
60  rk808_configure_ldo(6, 1800); /* VCC18_CODEC */
61 
62  /* AUDIO IO domain 1.8V voltage selection */
64  rkclk_configure_i2s(12288000);
65 }
66 
67 static void configure_vop(void)
68 {
70 
71  /* lcdc(vop) iodomain select 1.8V */
73 
74  gpio_output(GPIO(2, B, 5), 1); /* AVDD_1V8_DISP_EN */
75  rk808_configure_ldo(7, 2500); /* VCC10_LCD_PWREN_H */
76  gpio_output(GPIO(7, B, 6), 1); /* LCD_EN */
77  rk808_configure_switch(1, 1); /* VCC33_LCD */
78 
79  /* enable edp HPD */
80  gpio_input_pulldown(GPIO(7, B, 3));
82 }
83 
84 static void mainboard_init(struct device *dev)
85 {
87 
88  configure_usb();
92  configure_vop();
93 }
94 
95 static void mainboard_enable(struct device *dev)
96 {
97  dev->ops->init = &mainboard_init;
98 }
99 
102 };
103 
104 void lb_board(struct lb_header *header)
105 {
106  struct lb_range *dma;
107 
108  dma = (struct lb_range *)lb_new_record(header);
109  dma->tag = LB_TAG_DMA;
110  dma->size = sizeof(*dma);
111  dma->range_start = (uintptr_t)_dma_coherent;
112  dma->range_size = REGION_SIZE(dma_coherent);
113 }
114 
116 {
117  gpio_output(GPIO(2, B, 4), 1); /* BL_PWR_EN */
118  mdelay(120);
119  gpio_output(GPIO(7, A, 0), 1); /* LCD_BL */
120  mdelay(10);
121  gpio_output(GPIO_BACKLIGHT, 1); /* BL_EN */
122 }
struct chip_operations mainboard_ops
Definition: mainboard.c:19
struct arm64_kernel_header header
Definition: fit_payload.c:30
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
#define KHz
Definition: helpers.h:79
@ LB_TAG_DMA
int dma_coherent(void *ptr)
void mdelay(unsigned int msecs)
Definition: delay.c:2
@ GPIO
Definition: chip.h:84
void lb_board(struct lb_header *header)
Definition: mainboard.c:325
#define GPIO_BACKLIGHT
Definition: board.h:27
void mainboard_power_on_backlight(void)
Definition: mainboard.c:356
static void mainboard_init(struct device *dev)
Definition: mainboard.c:84
static void configure_vop(void)
Definition: mainboard.c:67
static void configure_codec(void)
Definition: mainboard.c:52
static void configure_sdmmc(void)
Definition: mainboard.c:29
static void configure_usb(void)
Definition: mainboard.c:22
static void configure_emmc(void)
Definition: mainboard.c:43
static void mainboard_enable(struct device *dev)
Definition: mainboard.c:95
struct lb_record * lb_new_record(struct lb_header *header)
void gpio_input(gpio_t gpio)
Definition: gpio.c:189
void gpio_output(gpio_t gpio, int value)
Definition: gpio.c:194
void gpio_input_pulldown(gpio_t gpio)
Definition: gpio.c:179
#define REGION_SIZE(name)
Definition: symbols.h:10
#define GPIO_RESET
Definition: gpio.h:16
struct @1399 * dma
static struct rk3288_grf_regs *const rk3288_grf
Definition: grf.h:181
#define IOMUX_EMMCPWREN
Definition: grf.h:203
#define IOMUX_EDP_HOTPLUG
Definition: grf.h:206
#define IOMUX_I2SCLK
Definition: grf.h:195
#define IOMUX_EMMCCMD
Definition: grf.h:204
#define IOMUX_I2S
Definition: grf.h:194
#define IOMUX_EMMCDATA
Definition: grf.h:200
#define IOMUX_SDMMC0
Definition: grf.h:198
#define IOMUX_LCDC
Definition: grf.h:197
#define IOMUX_I2C2
Definition: grf.h:185
void rk808_configure_switch(int sw, int enabled)
Definition: rk808.c:60
void rk808_configure_ldo(int ldo, int millivolts)
Definition: rk808.c:66
#define RK_CLRBITS(clr)
Definition: soc.h:10
#define RK_SETBITS(set)
Definition: soc.h:9
void i2c_init(unsigned int bus)
Definition: i2c.c:198
void rkclk_configure_i2s(unsigned int hz)
Definition: clock.c:451
unsigned long uintptr_t
Definition: stdint.h:21
void(* enable_dev)(struct device *dev)
Definition: device.h:24
void(* init)(struct device *dev)
Definition: device.h:42
Definition: device.h:107
struct device_operations * ops
Definition: device.h:143
u32 iomux_emmcdata
Definition: grf.h:31
u32 iomux_lcdc
Definition: grf.h:20
u32 iomux_emmccmd
Definition: grf.h:39
u32 soc_con0
Definition: grf.h:104
u32 iomux_edp_hotplug
Definition: grf.h:77
u32 io_vsel
Definition: grf.h:135
u32 iomux_i2s
Definition: grf.h:58
u32 iomux_emmcpwren
Definition: grf.h:35
u32 iomux_sdmmc0
Definition: grf.h:67
u32 iomux_i2c2
Definition: grf.h:62
u32 iomux_i2sclk
Definition: grf.h:63