blob: 6115bd15e855a220b0b7796b80e43d5ec4fdfdf7 [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
Lee Leahy6625ecc2017-03-07 15:11:07 -080035struct i2c_seg {
Gabe Blackcdb61a62014-04-07 18:45:14 -070036 int read;
37 uint8_t chip;
38 uint8_t *buf;
39 int len;
40};
41
Lee Leahy0ca2a062017-03-06 18:01:04 -080042int platform_i2c_transfer(unsigned int bus, struct i2c_seg *segments,
43 int count);
Julius Werner37d7ac82014-05-05 18:03:46 -070044
45#define SOFTWARE_I2C_MAX_BUS 10 /* increase as necessary */
46
47struct software_i2c_ops {
Lee Leahy0ca2a062017-03-06 18:01:04 -080048 void (*set_sda)(unsigned int bus, int high);
49 void (*set_scl)(unsigned int bus, int high);
50 int (*get_sda)(unsigned int bus);
51 int (*get_scl)(unsigned int bus);
Julius Werner37d7ac82014-05-05 18:03:46 -070052};
53
54extern struct software_i2c_ops *software_i2c[];
55
Lee Leahy0ca2a062017-03-06 18:01:04 -080056int software_i2c_transfer(unsigned int bus, struct i2c_seg *segments,
57 int count);
58void software_i2c_wedge_ack(unsigned int bus, u8 chip);
59void software_i2c_wedge_read(unsigned int bus, u8 chip, u8 reg, int bit_count);
60void software_i2c_wedge_write(unsigned int bus, u8 chip, u8 reg, int bit_count);
Julius Werner37d7ac82014-05-05 18:03:46 -070061
Lee Leahy0ca2a062017-03-06 18:01:04 -080062int i2c_read_field(unsigned int bus, uint8_t chip, uint8_t reg, uint8_t *data,
Yidi Lind33ebd12016-03-15 14:38:44 +080063 uint8_t mask, uint8_t shift);
Lee Leahy0ca2a062017-03-06 18:01:04 -080064int i2c_write_field(unsigned int bus, uint8_t chip, uint8_t reg, uint8_t data,
Yidi Lind33ebd12016-03-15 14:38:44 +080065 uint8_t mask, uint8_t shift);
66
Julius Werner37d7ac82014-05-05 18:03:46 -070067/*
68 * software_i2c is supposed to be a debug feature. It's usually not compiled in,
69 * but when it is it can be dynamically enabled at runtime for certain busses.
70 * Need this ugly stub to arbitrate since I2C device drivers hardcode
71 * 'i2c_transfer()' as their entry point.
72 */
Lee Leahy0ca2a062017-03-06 18:01:04 -080073static inline int i2c_transfer(unsigned int bus, struct i2c_seg *segments,
Julius Werner37d7ac82014-05-05 18:03:46 -070074 int count)
75{
76 if (CONFIG_SOFTWARE_I2C)
77 if (bus < SOFTWARE_I2C_MAX_BUS && software_i2c[bus])
78 return software_i2c_transfer(bus, segments, count);
79
80 return platform_i2c_transfer(bus, segments, count);
81}
Gabe Blackcdb61a62014-04-07 18:45:14 -070082
83/*
84 * Read a raw chunk of data in one segment and one frame.
85 *
86 * [start][slave addr][r][data][stop]
87 */
Lee Leahy0ca2a062017-03-06 18:01:04 -080088static inline int i2c_read_raw(unsigned int bus, uint8_t chip, uint8_t *data,
Gabe Blackcdb61a62014-04-07 18:45:14 -070089 int len)
90{
Lee Leahy6625ecc2017-03-07 15:11:07 -080091 struct i2c_seg seg = {
92 .read = 1, .chip = chip, .buf = data, .len = len
93 };
94
Gabe Blackcdb61a62014-04-07 18:45:14 -070095 return i2c_transfer(bus, &seg, 1);
96}
97
98/*
99 * Write a raw chunk of data in one segment and one frame.
100 *
101 * [start][slave addr][w][data][stop]
102 */
Lee Leahy0ca2a062017-03-06 18:01:04 -0800103static inline int i2c_write_raw(unsigned int bus, uint8_t chip, uint8_t *data,
Lee Leahy708fc272017-03-07 12:18:53 -0800104 int len)
Gabe Blackcdb61a62014-04-07 18:45:14 -0700105{
Lee Leahy6625ecc2017-03-07 15:11:07 -0800106 struct i2c_seg seg = {
107 .read = 0, .chip = chip, .buf = data, .len = len
108 };
109
Gabe Blackcdb61a62014-04-07 18:45:14 -0700110 return i2c_transfer(bus, &seg, 1);
111}
112
113/**
Jitao Shi5ffb6882016-02-01 17:33:49 +0800114 * Read multi-bytes with two segments in one frame
115 *
116 * [start][slave addr][w][register addr][start][slave addr][r][data...][stop]
117 */
Lee Leahy0ca2a062017-03-06 18:01:04 -0800118static inline int i2c_read_bytes(unsigned int bus, uint8_t chip, uint8_t reg,
Jitao Shi5ffb6882016-02-01 17:33:49 +0800119 uint8_t *data, int len)
120{
121 struct i2c_seg seg[2];
122
123 seg[0].read = 0;
124 seg[0].chip = chip;
125 seg[0].buf = &reg;
126 seg[0].len = 1;
127 seg[1].read = 1;
128 seg[1].chip = chip;
129 seg[1].buf = data;
130 seg[1].len = len;
131
132 return i2c_transfer(bus, seg, ARRAY_SIZE(seg));
133}
134
135/**
Gabe Blackcdb61a62014-04-07 18:45:14 -0700136 * Read a byte with two segments in one frame
137 *
138 * [start][slave addr][w][register addr][start][slave addr][r][data][stop]
139 */
Lee Leahy0ca2a062017-03-06 18:01:04 -0800140static inline int i2c_readb(unsigned int bus, uint8_t chip, uint8_t reg,
Gabe Blackcdb61a62014-04-07 18:45:14 -0700141 uint8_t *data)
142{
143 struct i2c_seg seg[2];
144
145 seg[0].read = 0;
146 seg[0].chip = chip;
147 seg[0].buf = &reg;
148 seg[0].len = 1;
149 seg[1].read = 1;
150 seg[1].chip = chip;
151 seg[1].buf = data;
152 seg[1].len = 1;
153
154 return i2c_transfer(bus, seg, ARRAY_SIZE(seg));
155}
156
157/**
158 * Write a byte with one segment in one frame.
159 *
160 * [start][slave addr][w][register addr][data][stop]
161 */
Lee Leahy0ca2a062017-03-06 18:01:04 -0800162static inline int i2c_writeb(unsigned int bus, uint8_t chip, uint8_t reg,
Gabe Blackcdb61a62014-04-07 18:45:14 -0700163 uint8_t data)
164{
165 struct i2c_seg seg;
166 uint8_t buf[] = {reg, data};
167
168 seg.read = 0;
169 seg.chip = chip;
170 seg.buf = buf;
171 seg.len = ARRAY_SIZE(buf);
172
173 return i2c_transfer(bus, &seg, 1);
174}
David Hendricksf4c35082012-12-27 14:15:51 -0800175
Duncan Laurieec009682016-06-07 15:38:14 -0700176/* I2C bus operation for ramstage drivers */
177struct device;
178struct i2c_bus_operations {
179 /*
180 * This is an SOC specific method that can be provided to translate the
181 * 'struct device' for an I2C controller into a unique I2C bus number.
182 * Returns -1 if the bus number for this device cannot be determined.
183 */
184 int (*dev_to_bus)(struct device *dev);
185};
186
187/* Return I2C bus number for provided device, -1 if not found */
188int i2c_dev_find_bus(struct device *dev);
189
190/* Variants of I2C helper functions that take a device instead of bus number */
191int i2c_dev_transfer(struct device *dev, struct i2c_seg *segments, int count);
192int i2c_dev_readb(struct device *dev, uint8_t reg, uint8_t *data);
193int i2c_dev_writeb(struct device *dev, uint8_t reg, uint8_t data);
194int i2c_dev_read_bytes(struct device *dev, uint8_t reg, uint8_t *data, int len);
195int i2c_dev_read_raw(struct device *dev, uint8_t *data, int len);
196int i2c_dev_write_raw(struct device *dev, uint8_t *data, int len);
197
David Hendrickscfb73602013-04-05 13:42:39 -0700198#endif /* _DEVICE_I2C_H_ */