coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
software_i2c.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/mmio.h>
4 #include <console/console.h>
5 #include <device/i2c_simple.h>
6 #include <gpio.h>
7 #include <soc/grf.h>
8 #include <soc/i2c.h>
9 #include <soc/pmu.h>
10 
11 static struct {
14 } pins[] = {
15  [0]{.scl = GPIO(0, C, 0), .sda = GPIO(0, B, 7)},
16  [1]{.scl = GPIO(8, A, 5), .sda = GPIO(8, A, 4)},
17  [2]{.scl = GPIO(6, B, 2), .sda = GPIO(6, B, 1)},
18  [3]{.scl = GPIO(2, C, 0), .sda = GPIO(2, C, 1)},
19  [4]{.scl = GPIO(7, C, 2), .sda = GPIO(7, C, 1)},
20  [5]{.scl = GPIO(7, C, 4), .sda = GPIO(7, C, 3)},
21 };
22 
23 static int get_scl(unsigned int bus)
24 {
25  return gpio_get(pins[bus].scl);
26 }
27 
28 static int get_sda(unsigned int bus)
29 {
30  return gpio_get(pins[bus].sda);
31 }
32 
33 static void set_scl(unsigned int bus, int high)
34 {
35  if (high)
37  else
38  gpio_output(pins[bus].scl, 0);
39 }
40 
41 static void set_sda(unsigned int bus, int high)
42 {
43  if (high)
45  else
46  gpio_output(pins[bus].sda, 0);
47 }
48 
49 static struct software_i2c_ops rk_ops = {
50  .get_scl = get_scl,
51  .get_sda = get_sda,
52  .set_scl = set_scl,
53  .set_sda = set_sda,
54 };
55 
56 void software_i2c_attach(unsigned int bus)
57 {
59 
60  /* Mux pins to GPIO function for software I2C emulation. */
61  switch (bus) {
62  case 0:
65  break;
66  case 1:
68  break;
69  case 2:
71  break;
72  case 3:
74  break;
75  case 4:
77  break;
78  case 5:
81  break;
82  default:
83  die("Unknown I2C bus number!");
84  }
85 
86  /* Initialize bus to idle state. */
87  set_scl(bus, 1);
88  set_sda(bus, 1);
89 }
90 
91 void software_i2c_detach(unsigned int bus)
92 {
94 
95  /* Mux pins back to hardware I2C controller. */
96  switch (bus) {
97  case 0:
100  break;
101  case 1:
103  break;
104  case 2:
106  break;
107  case 3:
109  break;
110  case 4:
112  break;
113  case 5:
116  break;
117  default:
118  die("Unknown I2C bus number!");
119  }
120 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
void __noreturn die(const char *fmt,...)
Definition: die.c:17
struct software_i2c_ops * software_i2c[SOFTWARE_I2C_MAX_BUS]
Definition: software_i2c.c:24
@ GPIO
Definition: chip.h:84
#define setbits32(addr, set)
Definition: mmio.h:21
#define clrbits32(addr, clear)
Definition: mmio.h:26
int gpio_get(gpio_t gpio)
Definition: gpio.c:166
void gpio_output(gpio_t gpio, int value)
Definition: gpio.c:194
void gpio_input_pullup(gpio_t gpio)
Definition: gpio.c:184
static struct rk3288_pmu_regs *const rk3288_pmu
Definition: pmu.h:55
#define IOMUX_I2C0SDA
Definition: pmu.h:57
#define IOMUX_I2C0SCL
Definition: pmu.h:58
#define IOMUX_I2C5SDA
Definition: grf.h:188
static struct rk3288_grf_regs *const rk3288_grf
Definition: grf.h:181
#define IOMUX_GPIO(iomux_clrsetbits)
Definition: grf.h:212
#define IOMUX_I2C3
Definition: grf.h:186
#define IOMUX_I2C1
Definition: grf.h:184
#define IOMUX_I2C5SCL
Definition: grf.h:189
#define IOMUX_I2C4
Definition: grf.h:187
#define IOMUX_I2C2
Definition: grf.h:185
gpio_t sda
Definition: software_i2c.c:11
gpio_t scl
Definition: software_i2c.c:12
static void set_scl(unsigned int bus, int high)
Definition: software_i2c.c:33
static struct software_i2c_ops rk_ops
Definition: software_i2c.c:49
static void set_sda(unsigned int bus, int high)
Definition: software_i2c.c:41
static int get_scl(unsigned int bus)
Definition: software_i2c.c:23
static int get_sda(unsigned int bus)
Definition: software_i2c.c:28
void software_i2c_attach(unsigned int bus)
Definition: software_i2c.c:56
void software_i2c_detach(unsigned int bus)
Definition: software_i2c.c:91
static struct @1489 pins[]
#define NULL
Definition: stddef.h:19
Definition: device.h:76
u32 iomux_i2c4
Definition: grf.h:82
u32 iomux_i2c3
Definition: grf.h:26
u32 iomux_i2c5scl
Definition: grf.h:87
u32 iomux_i2c5sda
Definition: grf.h:81
u32 iomux_i2c1
Definition: grf.h:93
u32 iomux_i2c2
Definition: grf.h:62
u32 iomux_i2c0scl
Definition: pmu.h:45
u32 iomux_i2c0sda
Definition: pmu.h:40
int(* get_scl)(unsigned int bus)
Definition: i2c_simple.h:19