Lines Matching refs:solo_dev
33 u8 solo_i2c_readbyte(struct solo_dev *solo_dev, int id, u8 addr, u8 off) in solo_i2c_readbyte() argument
48 i2c_transfer(&solo_dev->i2c_adap[id], msgs, 2); in solo_i2c_readbyte()
53 void solo_i2c_writebyte(struct solo_dev *solo_dev, int id, u8 addr, in solo_i2c_writebyte() argument
66 i2c_transfer(&solo_dev->i2c_adap[id], &msgs, 1); in solo_i2c_writebyte()
69 static void solo_i2c_flush(struct solo_dev *solo_dev, int wr) in solo_i2c_flush() argument
73 ctrl = SOLO_IIC_CH_SET(solo_dev->i2c_id); in solo_i2c_flush()
75 if (solo_dev->i2c_state == IIC_STATE_START) in solo_i2c_flush()
82 if (!(solo_dev->i2c_msg->flags & I2C_M_NO_RD_ACK)) in solo_i2c_flush()
86 if (solo_dev->i2c_msg_ptr == solo_dev->i2c_msg->len) in solo_i2c_flush()
89 solo_reg_write(solo_dev, SOLO_IIC_CTRL, ctrl); in solo_i2c_flush()
92 static void solo_i2c_start(struct solo_dev *solo_dev) in solo_i2c_start() argument
94 u32 addr = solo_dev->i2c_msg->addr << 1; in solo_i2c_start()
96 if (solo_dev->i2c_msg->flags & I2C_M_RD) in solo_i2c_start()
99 solo_dev->i2c_state = IIC_STATE_START; in solo_i2c_start()
100 solo_reg_write(solo_dev, SOLO_IIC_TXD, addr); in solo_i2c_start()
101 solo_i2c_flush(solo_dev, 1); in solo_i2c_start()
104 static void solo_i2c_stop(struct solo_dev *solo_dev) in solo_i2c_stop() argument
106 solo_irq_off(solo_dev, SOLO_IRQ_IIC); in solo_i2c_stop()
107 solo_reg_write(solo_dev, SOLO_IIC_CTRL, 0); in solo_i2c_stop()
108 solo_dev->i2c_state = IIC_STATE_STOP; in solo_i2c_stop()
109 wake_up(&solo_dev->i2c_wait); in solo_i2c_stop()
112 static int solo_i2c_handle_read(struct solo_dev *solo_dev) in solo_i2c_handle_read() argument
115 if (solo_dev->i2c_msg_ptr != solo_dev->i2c_msg->len) { in solo_i2c_handle_read()
116 solo_i2c_flush(solo_dev, 0); in solo_i2c_handle_read()
120 solo_dev->i2c_msg_ptr = 0; in solo_i2c_handle_read()
121 solo_dev->i2c_msg++; in solo_i2c_handle_read()
122 solo_dev->i2c_msg_num--; in solo_i2c_handle_read()
124 if (solo_dev->i2c_msg_num == 0) { in solo_i2c_handle_read()
125 solo_i2c_stop(solo_dev); in solo_i2c_handle_read()
129 if (!(solo_dev->i2c_msg->flags & I2C_M_NOSTART)) { in solo_i2c_handle_read()
130 solo_i2c_start(solo_dev); in solo_i2c_handle_read()
132 if (solo_dev->i2c_msg->flags & I2C_M_RD) in solo_i2c_handle_read()
135 solo_i2c_stop(solo_dev); in solo_i2c_handle_read()
141 static int solo_i2c_handle_write(struct solo_dev *solo_dev) in solo_i2c_handle_write() argument
144 if (solo_dev->i2c_msg_ptr != solo_dev->i2c_msg->len) { in solo_i2c_handle_write()
145 solo_reg_write(solo_dev, SOLO_IIC_TXD, in solo_i2c_handle_write()
146 solo_dev->i2c_msg->buf[solo_dev->i2c_msg_ptr]); in solo_i2c_handle_write()
147 solo_dev->i2c_msg_ptr++; in solo_i2c_handle_write()
148 solo_i2c_flush(solo_dev, 1); in solo_i2c_handle_write()
152 solo_dev->i2c_msg_ptr = 0; in solo_i2c_handle_write()
153 solo_dev->i2c_msg++; in solo_i2c_handle_write()
154 solo_dev->i2c_msg_num--; in solo_i2c_handle_write()
156 if (solo_dev->i2c_msg_num == 0) { in solo_i2c_handle_write()
157 solo_i2c_stop(solo_dev); in solo_i2c_handle_write()
161 if (!(solo_dev->i2c_msg->flags & I2C_M_NOSTART)) { in solo_i2c_handle_write()
162 solo_i2c_start(solo_dev); in solo_i2c_handle_write()
164 if (solo_dev->i2c_msg->flags & I2C_M_RD) in solo_i2c_handle_write()
165 solo_i2c_stop(solo_dev); in solo_i2c_handle_write()
173 int solo_i2c_isr(struct solo_dev *solo_dev) in solo_i2c_isr() argument
175 u32 status = solo_reg_read(solo_dev, SOLO_IIC_CTRL); in solo_i2c_isr()
180 || solo_dev->i2c_id < 0) { in solo_i2c_isr()
181 solo_i2c_stop(solo_dev); in solo_i2c_isr()
185 switch (solo_dev->i2c_state) { in solo_i2c_isr()
187 if (solo_dev->i2c_msg->flags & I2C_M_RD) { in solo_i2c_isr()
188 solo_dev->i2c_state = IIC_STATE_READ; in solo_i2c_isr()
189 ret = solo_i2c_handle_read(solo_dev); in solo_i2c_isr()
193 solo_dev->i2c_state = IIC_STATE_WRITE; in solo_i2c_isr()
195 ret = solo_i2c_handle_write(solo_dev); in solo_i2c_isr()
199 solo_dev->i2c_msg->buf[solo_dev->i2c_msg_ptr] = in solo_i2c_isr()
200 solo_reg_read(solo_dev, SOLO_IIC_RXD); in solo_i2c_isr()
201 solo_dev->i2c_msg_ptr++; in solo_i2c_isr()
203 ret = solo_i2c_handle_read(solo_dev); in solo_i2c_isr()
207 solo_i2c_stop(solo_dev); in solo_i2c_isr()
216 struct solo_dev *solo_dev = adap->algo_data; in solo_i2c_master_xfer() local
223 if (&solo_dev->i2c_adap[i] == adap) in solo_i2c_master_xfer()
230 mutex_lock(&solo_dev->i2c_mutex); in solo_i2c_master_xfer()
231 solo_dev->i2c_id = i; in solo_i2c_master_xfer()
232 solo_dev->i2c_msg = msgs; in solo_i2c_master_xfer()
233 solo_dev->i2c_msg_num = num; in solo_i2c_master_xfer()
234 solo_dev->i2c_msg_ptr = 0; in solo_i2c_master_xfer()
236 solo_reg_write(solo_dev, SOLO_IIC_CTRL, 0); in solo_i2c_master_xfer()
237 solo_irq_on(solo_dev, SOLO_IRQ_IIC); in solo_i2c_master_xfer()
238 solo_i2c_start(solo_dev); in solo_i2c_master_xfer()
243 prepare_to_wait(&solo_dev->i2c_wait, &wait, in solo_i2c_master_xfer()
246 if (solo_dev->i2c_state == IIC_STATE_STOP) in solo_i2c_master_xfer()
257 finish_wait(&solo_dev->i2c_wait, &wait); in solo_i2c_master_xfer()
258 ret = num - solo_dev->i2c_msg_num; in solo_i2c_master_xfer()
259 solo_dev->i2c_state = IIC_STATE_IDLE; in solo_i2c_master_xfer()
260 solo_dev->i2c_id = -1; in solo_i2c_master_xfer()
262 mutex_unlock(&solo_dev->i2c_mutex); in solo_i2c_master_xfer()
277 int solo_i2c_init(struct solo_dev *solo_dev) in solo_i2c_init() argument
282 solo_reg_write(solo_dev, SOLO_IIC_CFG, in solo_i2c_init()
285 solo_dev->i2c_id = -1; in solo_i2c_init()
286 solo_dev->i2c_state = IIC_STATE_IDLE; in solo_i2c_init()
287 init_waitqueue_head(&solo_dev->i2c_wait); in solo_i2c_init()
288 mutex_init(&solo_dev->i2c_mutex); in solo_i2c_init()
291 struct i2c_adapter *adap = &solo_dev->i2c_adap[i]; in solo_i2c_init()
296 adap->algo_data = solo_dev; in solo_i2c_init()
298 adap->dev.parent = &solo_dev->pdev->dev; in solo_i2c_init()
309 if (!solo_dev->i2c_adap[i].algo_data) in solo_i2c_init()
311 i2c_del_adapter(&solo_dev->i2c_adap[i]); in solo_i2c_init()
312 solo_dev->i2c_adap[i].algo_data = NULL; in solo_i2c_init()
320 void solo_i2c_exit(struct solo_dev *solo_dev) in solo_i2c_exit() argument
325 if (!solo_dev->i2c_adap[i].algo_data) in solo_i2c_exit()
327 i2c_del_adapter(&solo_dev->i2c_adap[i]); in solo_i2c_exit()
328 solo_dev->i2c_adap[i].algo_data = NULL; in solo_i2c_exit()