Lines Matching refs:solo_dev

25 u8 solo_i2c_readbyte(struct solo_dev *solo_dev, int id, u8 addr, u8 off)  in solo_i2c_readbyte()  argument
40 i2c_transfer(&solo_dev->i2c_adap[id], msgs, 2); in solo_i2c_readbyte()
45 void solo_i2c_writebyte(struct solo_dev *solo_dev, int id, u8 addr, in solo_i2c_writebyte() argument
58 i2c_transfer(&solo_dev->i2c_adap[id], &msgs, 1); in solo_i2c_writebyte()
61 static void solo_i2c_flush(struct solo_dev *solo_dev, int wr) in solo_i2c_flush() argument
65 ctrl = SOLO_IIC_CH_SET(solo_dev->i2c_id); in solo_i2c_flush()
67 if (solo_dev->i2c_state == IIC_STATE_START) in solo_i2c_flush()
74 if (!(solo_dev->i2c_msg->flags & I2C_M_NO_RD_ACK)) in solo_i2c_flush()
78 if (solo_dev->i2c_msg_ptr == solo_dev->i2c_msg->len) in solo_i2c_flush()
81 solo_reg_write(solo_dev, SOLO_IIC_CTRL, ctrl); in solo_i2c_flush()
84 static void solo_i2c_start(struct solo_dev *solo_dev) in solo_i2c_start() argument
86 u32 addr = solo_dev->i2c_msg->addr << 1; in solo_i2c_start()
88 if (solo_dev->i2c_msg->flags & I2C_M_RD) in solo_i2c_start()
91 solo_dev->i2c_state = IIC_STATE_START; in solo_i2c_start()
92 solo_reg_write(solo_dev, SOLO_IIC_TXD, addr); in solo_i2c_start()
93 solo_i2c_flush(solo_dev, 1); in solo_i2c_start()
96 static void solo_i2c_stop(struct solo_dev *solo_dev) in solo_i2c_stop() argument
98 solo_irq_off(solo_dev, SOLO_IRQ_IIC); in solo_i2c_stop()
99 solo_reg_write(solo_dev, SOLO_IIC_CTRL, 0); in solo_i2c_stop()
100 solo_dev->i2c_state = IIC_STATE_STOP; in solo_i2c_stop()
101 wake_up(&solo_dev->i2c_wait); in solo_i2c_stop()
104 static int solo_i2c_handle_read(struct solo_dev *solo_dev) in solo_i2c_handle_read() argument
107 if (solo_dev->i2c_msg_ptr != solo_dev->i2c_msg->len) { in solo_i2c_handle_read()
108 solo_i2c_flush(solo_dev, 0); in solo_i2c_handle_read()
112 solo_dev->i2c_msg_ptr = 0; in solo_i2c_handle_read()
113 solo_dev->i2c_msg++; in solo_i2c_handle_read()
114 solo_dev->i2c_msg_num--; in solo_i2c_handle_read()
116 if (solo_dev->i2c_msg_num == 0) { in solo_i2c_handle_read()
117 solo_i2c_stop(solo_dev); in solo_i2c_handle_read()
121 if (!(solo_dev->i2c_msg->flags & I2C_M_NOSTART)) { in solo_i2c_handle_read()
122 solo_i2c_start(solo_dev); in solo_i2c_handle_read()
124 if (solo_dev->i2c_msg->flags & I2C_M_RD) in solo_i2c_handle_read()
127 solo_i2c_stop(solo_dev); in solo_i2c_handle_read()
133 static int solo_i2c_handle_write(struct solo_dev *solo_dev) in solo_i2c_handle_write() argument
136 if (solo_dev->i2c_msg_ptr != solo_dev->i2c_msg->len) { in solo_i2c_handle_write()
137 solo_reg_write(solo_dev, SOLO_IIC_TXD, in solo_i2c_handle_write()
138 solo_dev->i2c_msg->buf[solo_dev->i2c_msg_ptr]); in solo_i2c_handle_write()
139 solo_dev->i2c_msg_ptr++; in solo_i2c_handle_write()
140 solo_i2c_flush(solo_dev, 1); in solo_i2c_handle_write()
144 solo_dev->i2c_msg_ptr = 0; in solo_i2c_handle_write()
145 solo_dev->i2c_msg++; in solo_i2c_handle_write()
146 solo_dev->i2c_msg_num--; in solo_i2c_handle_write()
148 if (solo_dev->i2c_msg_num == 0) { in solo_i2c_handle_write()
149 solo_i2c_stop(solo_dev); in solo_i2c_handle_write()
153 if (!(solo_dev->i2c_msg->flags & I2C_M_NOSTART)) { in solo_i2c_handle_write()
154 solo_i2c_start(solo_dev); in solo_i2c_handle_write()
156 if (solo_dev->i2c_msg->flags & I2C_M_RD) in solo_i2c_handle_write()
157 solo_i2c_stop(solo_dev); in solo_i2c_handle_write()
165 int solo_i2c_isr(struct solo_dev *solo_dev) in solo_i2c_isr() argument
167 u32 status = solo_reg_read(solo_dev, SOLO_IIC_CTRL); in solo_i2c_isr()
172 || solo_dev->i2c_id < 0) { in solo_i2c_isr()
173 solo_i2c_stop(solo_dev); in solo_i2c_isr()
177 switch (solo_dev->i2c_state) { in solo_i2c_isr()
179 if (solo_dev->i2c_msg->flags & I2C_M_RD) { in solo_i2c_isr()
180 solo_dev->i2c_state = IIC_STATE_READ; in solo_i2c_isr()
181 ret = solo_i2c_handle_read(solo_dev); in solo_i2c_isr()
185 solo_dev->i2c_state = IIC_STATE_WRITE; in solo_i2c_isr()
188 ret = solo_i2c_handle_write(solo_dev); in solo_i2c_isr()
192 solo_dev->i2c_msg->buf[solo_dev->i2c_msg_ptr] = in solo_i2c_isr()
193 solo_reg_read(solo_dev, SOLO_IIC_RXD); in solo_i2c_isr()
194 solo_dev->i2c_msg_ptr++; in solo_i2c_isr()
196 ret = solo_i2c_handle_read(solo_dev); in solo_i2c_isr()
200 solo_i2c_stop(solo_dev); in solo_i2c_isr()
209 struct solo_dev *solo_dev = adap->algo_data; in solo_i2c_master_xfer() local
216 if (&solo_dev->i2c_adap[i] == adap) in solo_i2c_master_xfer()
223 mutex_lock(&solo_dev->i2c_mutex); in solo_i2c_master_xfer()
224 solo_dev->i2c_id = i; in solo_i2c_master_xfer()
225 solo_dev->i2c_msg = msgs; in solo_i2c_master_xfer()
226 solo_dev->i2c_msg_num = num; in solo_i2c_master_xfer()
227 solo_dev->i2c_msg_ptr = 0; in solo_i2c_master_xfer()
229 solo_reg_write(solo_dev, SOLO_IIC_CTRL, 0); in solo_i2c_master_xfer()
230 solo_irq_on(solo_dev, SOLO_IRQ_IIC); in solo_i2c_master_xfer()
231 solo_i2c_start(solo_dev); in solo_i2c_master_xfer()
236 prepare_to_wait(&solo_dev->i2c_wait, &wait, in solo_i2c_master_xfer()
239 if (solo_dev->i2c_state == IIC_STATE_STOP) in solo_i2c_master_xfer()
250 finish_wait(&solo_dev->i2c_wait, &wait); in solo_i2c_master_xfer()
251 ret = num - solo_dev->i2c_msg_num; in solo_i2c_master_xfer()
252 solo_dev->i2c_state = IIC_STATE_IDLE; in solo_i2c_master_xfer()
253 solo_dev->i2c_id = -1; in solo_i2c_master_xfer()
255 mutex_unlock(&solo_dev->i2c_mutex); in solo_i2c_master_xfer()
270 int solo_i2c_init(struct solo_dev *solo_dev) in solo_i2c_init() argument
275 solo_reg_write(solo_dev, SOLO_IIC_CFG, in solo_i2c_init()
278 solo_dev->i2c_id = -1; in solo_i2c_init()
279 solo_dev->i2c_state = IIC_STATE_IDLE; in solo_i2c_init()
280 init_waitqueue_head(&solo_dev->i2c_wait); in solo_i2c_init()
281 mutex_init(&solo_dev->i2c_mutex); in solo_i2c_init()
284 struct i2c_adapter *adap = &solo_dev->i2c_adap[i]; in solo_i2c_init()
289 adap->algo_data = solo_dev; in solo_i2c_init()
291 adap->dev.parent = &solo_dev->pdev->dev; in solo_i2c_init()
302 if (!solo_dev->i2c_adap[i].algo_data) in solo_i2c_init()
304 i2c_del_adapter(&solo_dev->i2c_adap[i]); in solo_i2c_init()
305 solo_dev->i2c_adap[i].algo_data = NULL; in solo_i2c_init()
313 void solo_i2c_exit(struct solo_dev *solo_dev) in solo_i2c_exit() argument
318 if (!solo_dev->i2c_adap[i].algo_data) in solo_i2c_exit()
320 i2c_del_adapter(&solo_dev->i2c_adap[i]); in solo_i2c_exit()
321 solo_dev->i2c_adap[i].algo_data = NULL; in solo_i2c_exit()