blob: 6316748b85b94225f6008d98fdd2b68ab21f0d11 [file] [log] [blame]
David Hendricksf4c35082012-12-27 14:15:51 -08001/*
David Hendrickscfb73602013-04-05 13:42:39 -07002 * This file is part of the coreboot project.
David Hendricksf4c35082012-12-27 14:15:51 -08003 *
Gabe Blackcdb61a62014-04-07 18:45:14 -07004 * Copyright (C) 2014 Google, Inc.
David Hendricksf4c35082012-12-27 14:15:51 -08005 *
David Hendrickscfb73602013-04-05 13:42:39 -07006 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
David Hendricksf4c35082012-12-27 14:15:51 -08009 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
David Hendricksf4c35082012-12-27 14:15:51 -080014 */
15
David Hendrickscfb73602013-04-05 13:42:39 -070016#ifndef _DEVICE_I2C_H_
17#define _DEVICE_I2C_H_
David Hendricksf4c35082012-12-27 14:15:51 -080018
Gabe Blacka5dc0912013-06-30 03:47:33 -070019#include <stdint.h>
Gabe Blackcdb61a62014-04-07 18:45:14 -070020#include <stdlib.h>
Gabe Blacka5dc0912013-06-30 03:47:33 -070021
Duncan Laurie1010b4a2016-05-09 20:10:47 -070022enum i2c_speed {
23 I2C_SPEED_STANDARD = 100000,
24 I2C_SPEED_FAST = 400000,
25 I2C_SPEED_FAST_PLUS = 1000000,
26 I2C_SPEED_HIGH = 3400000,
27 I2C_SPEED_FAST_ULTRA = 5000000,
28};
29
30enum i2c_address_mode {
31 I2C_MODE_7_BIT,
32 I2C_MODE_10_BIT
33};
34
Gabe Blackcdb61a62014-04-07 18:45:14 -070035struct i2c_seg
36{
37 int read;
38 uint8_t chip;
39 uint8_t *buf;
40 int len;
41};
42
Lee Leahy0ca2a062017-03-06 18:01:04 -080043int platform_i2c_transfer(unsigned int bus, struct i2c_seg *segments,
44 int count);
Julius Werner37d7ac82014-05-05 18:03:46 -070045
46#define SOFTWARE_I2C_MAX_BUS 10 /* increase as necessary */
47
48struct software_i2c_ops {
Lee Leahy0ca2a062017-03-06 18:01:04 -080049 void (*set_sda)(unsigned int bus, int high);
50 void (*set_scl)(unsigned int bus, int high);
51 int (*get_sda)(unsigned int bus);
52 int (*get_scl)(unsigned int bus);
Julius Werner37d7ac82014-05-05 18:03:46 -070053};
54
55extern struct software_i2c_ops *software_i2c[];
56
Lee Leahy0ca2a062017-03-06 18:01:04 -080057int software_i2c_transfer(unsigned int bus, struct i2c_seg *segments,
58 int count);
59void software_i2c_wedge_ack(unsigned int bus, u8 chip);
60void software_i2c_wedge_read(unsigned int bus, u8 chip, u8 reg, int bit_count);
61void software_i2c_wedge_write(unsigned int bus, u8 chip, u8 reg, int bit_count);
Julius Werner37d7ac82014-05-05 18:03:46 -070062
Lee Leahy0ca2a062017-03-06 18:01:04 -080063int i2c_read_field(unsigned int bus, uint8_t chip, uint8_t reg, uint8_t *data,
Yidi Lind33ebd12016-03-15 14:38:44 +080064 uint8_t mask, uint8_t shift);
Lee Leahy0ca2a062017-03-06 18:01:04 -080065int i2c_write_field(unsigned int bus, uint8_t chip, uint8_t reg, uint8_t data,
Yidi Lind33ebd12016-03-15 14:38:44 +080066 uint8_t mask, uint8_t shift);
67
Julius Werner37d7ac82014-05-05 18:03:46 -070068/*
69 * software_i2c is supposed to be a debug feature. It's usually not compiled in,
70 * but when it is it can be dynamically enabled at runtime for certain busses.
71 * Need this ugly stub to arbitrate since I2C device drivers hardcode
72 * 'i2c_transfer()' as their entry point.
73 */
Lee Leahy0ca2a062017-03-06 18:01:04 -080074static inline int i2c_transfer(unsigned int bus, struct i2c_seg *segments,
Julius Werner37d7ac82014-05-05 18:03:46 -070075 int count)
76{
77 if (CONFIG_SOFTWARE_I2C)
78 if (bus < SOFTWARE_I2C_MAX_BUS && software_i2c[bus])
79 return software_i2c_transfer(bus, segments, count);
80
81 return platform_i2c_transfer(bus, segments, count);
82}
Gabe Blackcdb61a62014-04-07 18:45:14 -070083
84/*
85 * Read a raw chunk of data in one segment and one frame.
86 *
87 * [start][slave addr][r][data][stop]
88 */
Lee Leahy0ca2a062017-03-06 18:01:04 -080089static inline int i2c_read_raw(unsigned int bus, uint8_t chip, uint8_t *data,
Gabe Blackcdb61a62014-04-07 18:45:14 -070090 int len)
91{
92 struct i2c_seg seg =
93 { .read = 1, .chip = chip, .buf = data, .len = len };
94 return i2c_transfer(bus, &seg, 1);
95}
96
97/*
98 * Write a raw chunk of data in one segment and one frame.
99 *
100 * [start][slave addr][w][data][stop]
101 */
Lee Leahy0ca2a062017-03-06 18:01:04 -0800102static inline int i2c_write_raw(unsigned int bus, uint8_t chip, uint8_t *data,
Gabe Blackcdb61a62014-04-07 18:45:14 -0700103 int len)
104{
105 struct i2c_seg seg =
106 { .read = 0, .chip = chip, .buf = data, .len = len };
107 return i2c_transfer(bus, &seg, 1);
108}
109
110/**
Jitao Shi5ffb6882016-02-01 17:33:49 +0800111 * Read multi-bytes with two segments in one frame
112 *
113 * [start][slave addr][w][register addr][start][slave addr][r][data...][stop]
114 */
Lee Leahy0ca2a062017-03-06 18:01:04 -0800115static inline int i2c_read_bytes(unsigned int bus, uint8_t chip, uint8_t reg,
Jitao Shi5ffb6882016-02-01 17:33:49 +0800116 uint8_t *data, int len)
117{
118 struct i2c_seg seg[2];
119
120 seg[0].read = 0;
121 seg[0].chip = chip;
122 seg[0].buf = &reg;
123 seg[0].len = 1;
124 seg[1].read = 1;
125 seg[1].chip = chip;
126 seg[1].buf = data;
127 seg[1].len = len;
128
129 return i2c_transfer(bus, seg, ARRAY_SIZE(seg));
130}
131
132/**
Gabe Blackcdb61a62014-04-07 18:45:14 -0700133 * Read a byte with two segments in one frame
134 *
135 * [start][slave addr][w][register addr][start][slave addr][r][data][stop]
136 */
Lee Leahy0ca2a062017-03-06 18:01:04 -0800137static inline int i2c_readb(unsigned int bus, uint8_t chip, uint8_t reg,
Gabe Blackcdb61a62014-04-07 18:45:14 -0700138 uint8_t *data)
139{
140 struct i2c_seg seg[2];
141
142 seg[0].read = 0;
143 seg[0].chip = chip;
144 seg[0].buf = &reg;
145 seg[0].len = 1;
146 seg[1].read = 1;
147 seg[1].chip = chip;
148 seg[1].buf = data;
149 seg[1].len = 1;
150
151 return i2c_transfer(bus, seg, ARRAY_SIZE(seg));
152}
153
154/**
155 * Write a byte with one segment in one frame.
156 *
157 * [start][slave addr][w][register addr][data][stop]
158 */
Lee Leahy0ca2a062017-03-06 18:01:04 -0800159static inline int i2c_writeb(unsigned int bus, uint8_t chip, uint8_t reg,
Gabe Blackcdb61a62014-04-07 18:45:14 -0700160 uint8_t data)
161{
162 struct i2c_seg seg;
163 uint8_t buf[] = {reg, data};
164
165 seg.read = 0;
166 seg.chip = chip;
167 seg.buf = buf;
168 seg.len = ARRAY_SIZE(buf);
169
170 return i2c_transfer(bus, &seg, 1);
171}
David Hendricksf4c35082012-12-27 14:15:51 -0800172
Duncan Laurieec009682016-06-07 15:38:14 -0700173/* I2C bus operation for ramstage drivers */
174struct device;
175struct i2c_bus_operations {
176 /*
177 * This is an SOC specific method that can be provided to translate the
178 * 'struct device' for an I2C controller into a unique I2C bus number.
179 * Returns -1 if the bus number for this device cannot be determined.
180 */
181 int (*dev_to_bus)(struct device *dev);
182};
183
184/* Return I2C bus number for provided device, -1 if not found */
185int i2c_dev_find_bus(struct device *dev);
186
187/* Variants of I2C helper functions that take a device instead of bus number */
188int i2c_dev_transfer(struct device *dev, struct i2c_seg *segments, int count);
189int i2c_dev_readb(struct device *dev, uint8_t reg, uint8_t *data);
190int i2c_dev_writeb(struct device *dev, uint8_t reg, uint8_t data);
191int i2c_dev_read_bytes(struct device *dev, uint8_t reg, uint8_t *data, int len);
192int i2c_dev_read_raw(struct device *dev, uint8_t *data, int len);
193int i2c_dev_write_raw(struct device *dev, uint8_t *data, int len);
194
David Hendrickscfb73602013-04-05 13:42:39 -0700195#endif /* _DEVICE_I2C_H_ */