Lines Matching full:i2c
2 * Bit-Bang i2c emulation extracted from
15 #include "hw/i2c/bitbang_i2c.h"
48 static void bitbang_i2c_set_state(bitbang_i2c_interface *i2c, in bitbang_i2c_set_state() argument
51 trace_bitbang_i2c_state(sname[i2c->state], sname[state]); in bitbang_i2c_set_state()
52 i2c->state = state; in bitbang_i2c_set_state()
55 static void bitbang_i2c_enter_stop(bitbang_i2c_interface *i2c) in bitbang_i2c_enter_stop() argument
57 if (i2c->current_addr >= 0) in bitbang_i2c_enter_stop()
58 i2c_end_transfer(i2c->bus); in bitbang_i2c_enter_stop()
59 i2c->current_addr = -1; in bitbang_i2c_enter_stop()
60 bitbang_i2c_set_state(i2c, STOPPED); in bitbang_i2c_enter_stop()
64 static int bitbang_i2c_ret(bitbang_i2c_interface *i2c, int level) in bitbang_i2c_ret() argument
66 trace_bitbang_i2c_data(i2c->last_clock, i2c->last_data, in bitbang_i2c_ret()
67 i2c->device_out, level); in bitbang_i2c_ret()
68 i2c->device_out = level; in bitbang_i2c_ret()
70 return level & i2c->last_data; in bitbang_i2c_ret()
74 static int bitbang_i2c_nop(bitbang_i2c_interface *i2c) in bitbang_i2c_nop() argument
76 return bitbang_i2c_ret(i2c, i2c->device_out); in bitbang_i2c_nop()
80 int bitbang_i2c_set(bitbang_i2c_interface *i2c, int line, int level) in bitbang_i2c_set() argument
89 if (level == i2c->last_data) { in bitbang_i2c_set()
90 return bitbang_i2c_nop(i2c); in bitbang_i2c_set()
92 i2c->last_data = level; in bitbang_i2c_set()
93 if (i2c->last_clock == 0) { in bitbang_i2c_set()
94 return bitbang_i2c_nop(i2c); in bitbang_i2c_set()
98 bitbang_i2c_set_state(i2c, SENDING_BIT7); in bitbang_i2c_set()
99 i2c->current_addr = -1; in bitbang_i2c_set()
102 bitbang_i2c_enter_stop(i2c); in bitbang_i2c_set()
104 return bitbang_i2c_ret(i2c, 1); in bitbang_i2c_set()
107 data = i2c->last_data; in bitbang_i2c_set()
108 if (i2c->last_clock == level) { in bitbang_i2c_set()
109 return bitbang_i2c_nop(i2c); in bitbang_i2c_set()
111 i2c->last_clock = level; in bitbang_i2c_set()
115 return bitbang_i2c_ret(i2c, 1); in bitbang_i2c_set()
117 switch (i2c->state) { in bitbang_i2c_set()
120 return bitbang_i2c_ret(i2c, 1); in bitbang_i2c_set()
123 i2c->buffer = (i2c->buffer << 1) | data; in bitbang_i2c_set()
125 bitbang_i2c_set_state(i2c, i2c->state + 1); in bitbang_i2c_set()
126 return bitbang_i2c_ret(i2c, 1); in bitbang_i2c_set()
132 if (i2c->current_addr < 0) { in bitbang_i2c_set()
133 i2c->current_addr = i2c->buffer; in bitbang_i2c_set()
134 trace_bitbang_i2c_addr(i2c->current_addr); in bitbang_i2c_set()
135 ret = i2c_start_transfer(i2c->bus, i2c->current_addr >> 1, in bitbang_i2c_set()
136 i2c->current_addr & 1); in bitbang_i2c_set()
138 trace_bitbang_i2c_send(i2c->buffer); in bitbang_i2c_set()
139 ret = i2c_send(i2c->bus, i2c->buffer); in bitbang_i2c_set()
145 bitbang_i2c_set_state(i2c, SENT_NACK); in bitbang_i2c_set()
146 bitbang_i2c_enter_stop(i2c); in bitbang_i2c_set()
147 return bitbang_i2c_ret(i2c, 1); in bitbang_i2c_set()
149 if (i2c->current_addr & 1) { in bitbang_i2c_set()
150 bitbang_i2c_set_state(i2c, RECEIVING_BIT7); in bitbang_i2c_set()
152 bitbang_i2c_set_state(i2c, SENDING_BIT7); in bitbang_i2c_set()
154 return bitbang_i2c_ret(i2c, 0); in bitbang_i2c_set()
157 i2c->buffer = i2c_recv(i2c->bus); in bitbang_i2c_set()
158 trace_bitbang_i2c_recv(i2c->buffer); in bitbang_i2c_set()
161 data = i2c->buffer >> 7; in bitbang_i2c_set()
163 bitbang_i2c_set_state(i2c, i2c->state + 1); in bitbang_i2c_set()
164 i2c->buffer <<= 1; in bitbang_i2c_set()
165 return bitbang_i2c_ret(i2c, data); in bitbang_i2c_set()
169 bitbang_i2c_set_state(i2c, SENT_NACK); in bitbang_i2c_set()
170 i2c_nack(i2c->bus); in bitbang_i2c_set()
172 bitbang_i2c_set_state(i2c, RECEIVING_BIT7); in bitbang_i2c_set()
174 return bitbang_i2c_ret(i2c, 1); in bitbang_i2c_set()
218 bus = i2c_init_bus(dev, "i2c"); in gpio_i2c_init()
230 dc->desc = "Virtual GPIO to I2C bridge"; in gpio_i2c_class_init()