Lines Matching refs:mst
13 static int dibx000_write_word(struct dibx000_i2c_master *mst, u16 reg, u16 val) in dibx000_write_word() argument
17 if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { in dibx000_write_word()
22 mst->i2c_write_buffer[0] = (reg >> 8) & 0xff; in dibx000_write_word()
23 mst->i2c_write_buffer[1] = reg & 0xff; in dibx000_write_word()
24 mst->i2c_write_buffer[2] = (val >> 8) & 0xff; in dibx000_write_word()
25 mst->i2c_write_buffer[3] = val & 0xff; in dibx000_write_word()
27 memset(mst->msg, 0, sizeof(struct i2c_msg)); in dibx000_write_word()
28 mst->msg[0].addr = mst->i2c_addr; in dibx000_write_word()
29 mst->msg[0].flags = 0; in dibx000_write_word()
30 mst->msg[0].buf = mst->i2c_write_buffer; in dibx000_write_word()
31 mst->msg[0].len = 4; in dibx000_write_word()
33 ret = i2c_transfer(mst->i2c_adap, mst->msg, 1) != 1 ? -EREMOTEIO : 0; in dibx000_write_word()
34 mutex_unlock(&mst->i2c_buffer_lock); in dibx000_write_word()
39 static u16 dibx000_read_word(struct dibx000_i2c_master *mst, u16 reg) in dibx000_read_word() argument
43 if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { in dibx000_read_word()
48 mst->i2c_write_buffer[0] = reg >> 8; in dibx000_read_word()
49 mst->i2c_write_buffer[1] = reg & 0xff; in dibx000_read_word()
51 memset(mst->msg, 0, 2 * sizeof(struct i2c_msg)); in dibx000_read_word()
52 mst->msg[0].addr = mst->i2c_addr; in dibx000_read_word()
53 mst->msg[0].flags = 0; in dibx000_read_word()
54 mst->msg[0].buf = mst->i2c_write_buffer; in dibx000_read_word()
55 mst->msg[0].len = 2; in dibx000_read_word()
56 mst->msg[1].addr = mst->i2c_addr; in dibx000_read_word()
57 mst->msg[1].flags = I2C_M_RD; in dibx000_read_word()
58 mst->msg[1].buf = mst->i2c_read_buffer; in dibx000_read_word()
59 mst->msg[1].len = 2; in dibx000_read_word()
61 if (i2c_transfer(mst->i2c_adap, mst->msg, 2) != 2) in dibx000_read_word()
64 ret = (mst->i2c_read_buffer[0] << 8) | mst->i2c_read_buffer[1]; in dibx000_read_word()
65 mutex_unlock(&mst->i2c_buffer_lock); in dibx000_read_word()
70 static int dibx000_is_i2c_done(struct dibx000_i2c_master *mst) in dibx000_is_i2c_done() argument
75 while (((status = dibx000_read_word(mst, mst->base_reg + 2)) & 0x0100) == 0 && --i > 0) in dibx000_is_i2c_done()
89 static int dibx000_master_i2c_write(struct dibx000_i2c_master *mst, struct i2c_msg *msg, u8 stop) in dibx000_master_i2c_write() argument
98 dibx000_read_word(mst, mst->base_reg + 2); in dibx000_master_i2c_write()
105 dibx000_write_word(mst, mst->base_reg, data); in dibx000_master_i2c_write()
122 dibx000_write_word(mst, mst->base_reg+1, da); in dibx000_master_i2c_write()
124 if (dibx000_is_i2c_done(mst) != 0) in dibx000_master_i2c_write()
132 static int dibx000_master_i2c_read(struct dibx000_i2c_master *mst, struct i2c_msg *msg) in dibx000_master_i2c_read() argument
154 dibx000_write_word(mst, mst->base_reg+1, da); in dibx000_master_i2c_read()
156 if (dibx000_is_i2c_done(mst) != 0) in dibx000_master_i2c_read()
162 da = dibx000_read_word(mst, mst->base_reg); in dibx000_master_i2c_read()
177 struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap); in dibx000_i2c_set_speed() local
179 if (mst->device_rev < DIB7000MC && speed < 235) in dibx000_i2c_set_speed()
181 return dibx000_write_word(mst, mst->base_reg + 3, (u16)(60000 / speed)); in dibx000_i2c_set_speed()
191 static int dibx000_i2c_select_interface(struct dibx000_i2c_master *mst, in dibx000_i2c_select_interface() argument
194 if (mst->device_rev > DIB3000MC && mst->selected_interface != intf) { in dibx000_i2c_select_interface()
196 mst->selected_interface = intf; in dibx000_i2c_select_interface()
197 return dibx000_write_word(mst, mst->base_reg + 4, intf); in dibx000_i2c_select_interface()
204 struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap); in dibx000_i2c_master_xfer_gpio12() local
208 dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_GPIO_1_2); in dibx000_i2c_master_xfer_gpio12()
211 ret = dibx000_master_i2c_read(mst, &msg[msg_index]); in dibx000_i2c_master_xfer_gpio12()
215 ret = dibx000_master_i2c_write(mst, &msg[msg_index], 1); in dibx000_i2c_master_xfer_gpio12()
226 struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap); in dibx000_i2c_master_xfer_gpio34() local
230 dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_GPIO_3_4); in dibx000_i2c_master_xfer_gpio34()
233 ret = dibx000_master_i2c_read(mst, &msg[msg_index]); in dibx000_i2c_master_xfer_gpio34()
237 ret = dibx000_master_i2c_write(mst, &msg[msg_index], 1); in dibx000_i2c_master_xfer_gpio34()
256 static int dibx000_i2c_gate_ctrl(struct dibx000_i2c_master *mst, u8 tx[4], in dibx000_i2c_gate_ctrl() argument
267 if (mst->device_rev > DIB7000) in dibx000_i2c_gate_ctrl()
270 tx[0] = (((mst->base_reg + 1) >> 8) & 0xff); in dibx000_i2c_gate_ctrl()
271 tx[1] = ((mst->base_reg + 1) & 0xff); in dibx000_i2c_gate_ctrl()
281 struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap); in dibx000_i2c_gated_gpio67_xfer() local
290 dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_GPIO_6_7); in dibx000_i2c_gated_gpio67_xfer()
292 if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { in dibx000_i2c_gated_gpio67_xfer()
297 memset(mst->msg, 0, sizeof(struct i2c_msg) * (2 + num)); in dibx000_i2c_gated_gpio67_xfer()
300 dibx000_i2c_gate_ctrl(mst, &mst->i2c_write_buffer[0], msg[0].addr, 1); in dibx000_i2c_gated_gpio67_xfer()
301 mst->msg[0].addr = mst->i2c_addr; in dibx000_i2c_gated_gpio67_xfer()
302 mst->msg[0].buf = &mst->i2c_write_buffer[0]; in dibx000_i2c_gated_gpio67_xfer()
303 mst->msg[0].len = 4; in dibx000_i2c_gated_gpio67_xfer()
305 memcpy(&mst->msg[1], msg, sizeof(struct i2c_msg) * num); in dibx000_i2c_gated_gpio67_xfer()
308 dibx000_i2c_gate_ctrl(mst, &mst->i2c_write_buffer[4], 0, 0); in dibx000_i2c_gated_gpio67_xfer()
309 mst->msg[num + 1].addr = mst->i2c_addr; in dibx000_i2c_gated_gpio67_xfer()
310 mst->msg[num + 1].buf = &mst->i2c_write_buffer[4]; in dibx000_i2c_gated_gpio67_xfer()
311 mst->msg[num + 1].len = 4; in dibx000_i2c_gated_gpio67_xfer()
313 ret = (i2c_transfer(mst->i2c_adap, mst->msg, 2 + num) == 2 + num ? in dibx000_i2c_gated_gpio67_xfer()
316 mutex_unlock(&mst->i2c_buffer_lock); in dibx000_i2c_gated_gpio67_xfer()
328 struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap); in dibx000_i2c_gated_tuner_xfer() local
337 dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_TUNER); in dibx000_i2c_gated_tuner_xfer()
339 if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { in dibx000_i2c_gated_tuner_xfer()
343 memset(mst->msg, 0, sizeof(struct i2c_msg) * (2 + num)); in dibx000_i2c_gated_tuner_xfer()
346 dibx000_i2c_gate_ctrl(mst, &mst->i2c_write_buffer[0], msg[0].addr, 1); in dibx000_i2c_gated_tuner_xfer()
347 mst->msg[0].addr = mst->i2c_addr; in dibx000_i2c_gated_tuner_xfer()
348 mst->msg[0].buf = &mst->i2c_write_buffer[0]; in dibx000_i2c_gated_tuner_xfer()
349 mst->msg[0].len = 4; in dibx000_i2c_gated_tuner_xfer()
351 memcpy(&mst->msg[1], msg, sizeof(struct i2c_msg) * num); in dibx000_i2c_gated_tuner_xfer()
354 dibx000_i2c_gate_ctrl(mst, &mst->i2c_write_buffer[4], 0, 0); in dibx000_i2c_gated_tuner_xfer()
355 mst->msg[num + 1].addr = mst->i2c_addr; in dibx000_i2c_gated_tuner_xfer()
356 mst->msg[num + 1].buf = &mst->i2c_write_buffer[4]; in dibx000_i2c_gated_tuner_xfer()
357 mst->msg[num + 1].len = 4; in dibx000_i2c_gated_tuner_xfer()
359 ret = (i2c_transfer(mst->i2c_adap, mst->msg, 2 + num) == 2 + num ? in dibx000_i2c_gated_tuner_xfer()
361 mutex_unlock(&mst->i2c_buffer_lock); in dibx000_i2c_gated_tuner_xfer()
370 struct i2c_adapter *dibx000_get_i2c_adapter(struct dibx000_i2c_master *mst, in dibx000_get_i2c_adapter() argument
379 i2c = &mst->gated_tuner_i2c_adap; in dibx000_get_i2c_adapter()
383 i2c = &mst->master_i2c_adap_gpio12; in dibx000_get_i2c_adapter()
387 i2c = &mst->master_i2c_adap_gpio34; in dibx000_get_i2c_adapter()
391 i2c = &mst->master_i2c_adap_gpio67; in dibx000_get_i2c_adapter()
403 void dibx000_reset_i2c_master(struct dibx000_i2c_master *mst) in dibx000_reset_i2c_master() argument
407 struct i2c_msg m = {.addr = mst->i2c_addr,.buf = tx,.len = 4 }; in dibx000_reset_i2c_master()
409 dibx000_i2c_gate_ctrl(mst, tx, 0, 0); in dibx000_reset_i2c_master()
410 i2c_transfer(mst->i2c_adap, &m, 1); in dibx000_reset_i2c_master()
411 mst->selected_interface = 0xff; // the first time force a select of the I2C in dibx000_reset_i2c_master()
412 dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_TUNER); in dibx000_reset_i2c_master()
419 struct dibx000_i2c_master *mst) in i2c_adapter_init() argument
424 i2c_set_adapdata(i2c_adap, mst); in i2c_adapter_init()
430 int dibx000_init_i2c_master(struct dibx000_i2c_master *mst, u16 device_rev, in dibx000_init_i2c_master() argument
435 mutex_init(&mst->i2c_buffer_lock); in dibx000_init_i2c_master()
436 if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { in dibx000_init_i2c_master()
440 memset(mst->msg, 0, sizeof(struct i2c_msg)); in dibx000_init_i2c_master()
441 mst->msg[0].addr = i2c_addr >> 1; in dibx000_init_i2c_master()
442 mst->msg[0].flags = 0; in dibx000_init_i2c_master()
443 mst->msg[0].buf = mst->i2c_write_buffer; in dibx000_init_i2c_master()
444 mst->msg[0].len = 4; in dibx000_init_i2c_master()
446 mst->device_rev = device_rev; in dibx000_init_i2c_master()
447 mst->i2c_adap = i2c_adap; in dibx000_init_i2c_master()
448 mst->i2c_addr = i2c_addr >> 1; in dibx000_init_i2c_master()
451 mst->base_reg = 1024; in dibx000_init_i2c_master()
453 mst->base_reg = 768; in dibx000_init_i2c_master()
455 mst->gated_tuner_i2c_adap.dev.parent = mst->i2c_adap->dev.parent; in dibx000_init_i2c_master()
457 (&mst->gated_tuner_i2c_adap, &dibx000_i2c_gated_tuner_algo, in dibx000_init_i2c_master()
458 "DiBX000 tuner I2C bus", mst) != 0) in dibx000_init_i2c_master()
462 mst->master_i2c_adap_gpio12.dev.parent = mst->i2c_adap->dev.parent; in dibx000_init_i2c_master()
464 (&mst->master_i2c_adap_gpio12, &dibx000_i2c_master_gpio12_xfer_algo, in dibx000_init_i2c_master()
465 "DiBX000 master GPIO12 I2C bus", mst) != 0) in dibx000_init_i2c_master()
469 mst->master_i2c_adap_gpio34.dev.parent = mst->i2c_adap->dev.parent; in dibx000_init_i2c_master()
471 (&mst->master_i2c_adap_gpio34, &dibx000_i2c_master_gpio34_xfer_algo, in dibx000_init_i2c_master()
472 "DiBX000 master GPIO34 I2C bus", mst) != 0) in dibx000_init_i2c_master()
476 mst->master_i2c_adap_gpio67.dev.parent = mst->i2c_adap->dev.parent; in dibx000_init_i2c_master()
478 (&mst->master_i2c_adap_gpio67, &dibx000_i2c_gated_gpio67_algo, in dibx000_init_i2c_master()
479 "DiBX000 master GPIO67 I2C bus", mst) != 0) in dibx000_init_i2c_master()
484 dibx000_i2c_gate_ctrl(mst, mst->i2c_write_buffer, 0, 0); in dibx000_init_i2c_master()
486 ret = (i2c_transfer(i2c_adap, mst->msg, 1) == 1); in dibx000_init_i2c_master()
487 mutex_unlock(&mst->i2c_buffer_lock); in dibx000_init_i2c_master()
494 void dibx000_exit_i2c_master(struct dibx000_i2c_master *mst) in dibx000_exit_i2c_master() argument
496 i2c_del_adapter(&mst->gated_tuner_i2c_adap); in dibx000_exit_i2c_master()
497 i2c_del_adapter(&mst->master_i2c_adap_gpio12); in dibx000_exit_i2c_master()
498 i2c_del_adapter(&mst->master_i2c_adap_gpio34); in dibx000_exit_i2c_master()
499 i2c_del_adapter(&mst->master_i2c_adap_gpio67); in dibx000_exit_i2c_master()