Lines Matching refs:mst

19 static int dibx000_write_word(struct dibx000_i2c_master *mst, u16 reg, u16 val)  in dibx000_write_word()  argument
23 if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { in dibx000_write_word()
28 mst->i2c_write_buffer[0] = (reg >> 8) & 0xff; in dibx000_write_word()
29 mst->i2c_write_buffer[1] = reg & 0xff; in dibx000_write_word()
30 mst->i2c_write_buffer[2] = (val >> 8) & 0xff; in dibx000_write_word()
31 mst->i2c_write_buffer[3] = val & 0xff; in dibx000_write_word()
33 memset(mst->msg, 0, sizeof(struct i2c_msg)); in dibx000_write_word()
34 mst->msg[0].addr = mst->i2c_addr; in dibx000_write_word()
35 mst->msg[0].flags = 0; in dibx000_write_word()
36 mst->msg[0].buf = mst->i2c_write_buffer; in dibx000_write_word()
37 mst->msg[0].len = 4; in dibx000_write_word()
39 ret = i2c_transfer(mst->i2c_adap, mst->msg, 1) != 1 ? -EREMOTEIO : 0; in dibx000_write_word()
40 mutex_unlock(&mst->i2c_buffer_lock); in dibx000_write_word()
45 static u16 dibx000_read_word(struct dibx000_i2c_master *mst, u16 reg) in dibx000_read_word() argument
49 if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { in dibx000_read_word()
54 mst->i2c_write_buffer[0] = reg >> 8; in dibx000_read_word()
55 mst->i2c_write_buffer[1] = reg & 0xff; in dibx000_read_word()
57 memset(mst->msg, 0, 2 * sizeof(struct i2c_msg)); in dibx000_read_word()
58 mst->msg[0].addr = mst->i2c_addr; in dibx000_read_word()
59 mst->msg[0].flags = 0; in dibx000_read_word()
60 mst->msg[0].buf = mst->i2c_write_buffer; in dibx000_read_word()
61 mst->msg[0].len = 2; in dibx000_read_word()
62 mst->msg[1].addr = mst->i2c_addr; in dibx000_read_word()
63 mst->msg[1].flags = I2C_M_RD; in dibx000_read_word()
64 mst->msg[1].buf = mst->i2c_read_buffer; in dibx000_read_word()
65 mst->msg[1].len = 2; in dibx000_read_word()
67 if (i2c_transfer(mst->i2c_adap, mst->msg, 2) != 2) in dibx000_read_word()
70 ret = (mst->i2c_read_buffer[0] << 8) | mst->i2c_read_buffer[1]; in dibx000_read_word()
71 mutex_unlock(&mst->i2c_buffer_lock); in dibx000_read_word()
76 static int dibx000_is_i2c_done(struct dibx000_i2c_master *mst) in dibx000_is_i2c_done() argument
81 while (((status = dibx000_read_word(mst, mst->base_reg + 2)) & 0x0100) == 0 && --i > 0) in dibx000_is_i2c_done()
95 static int dibx000_master_i2c_write(struct dibx000_i2c_master *mst, struct i2c_msg *msg, u8 stop) in dibx000_master_i2c_write() argument
104 dibx000_read_word(mst, mst->base_reg + 2); in dibx000_master_i2c_write()
111 dibx000_write_word(mst, mst->base_reg, data); in dibx000_master_i2c_write()
128 dibx000_write_word(mst, mst->base_reg+1, da); in dibx000_master_i2c_write()
130 if (dibx000_is_i2c_done(mst) != 0) in dibx000_master_i2c_write()
138 static int dibx000_master_i2c_read(struct dibx000_i2c_master *mst, struct i2c_msg *msg) in dibx000_master_i2c_read() argument
160 dibx000_write_word(mst, mst->base_reg+1, da); in dibx000_master_i2c_read()
162 if (dibx000_is_i2c_done(mst) != 0) in dibx000_master_i2c_read()
168 da = dibx000_read_word(mst, mst->base_reg); in dibx000_master_i2c_read()
183 struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap); in dibx000_i2c_set_speed() local
185 if (mst->device_rev < DIB7000MC && speed < 235) in dibx000_i2c_set_speed()
187 return dibx000_write_word(mst, mst->base_reg + 3, (u16)(60000 / speed)); in dibx000_i2c_set_speed()
197 static int dibx000_i2c_select_interface(struct dibx000_i2c_master *mst, in dibx000_i2c_select_interface() argument
200 if (mst->device_rev > DIB3000MC && mst->selected_interface != intf) { in dibx000_i2c_select_interface()
202 mst->selected_interface = intf; in dibx000_i2c_select_interface()
203 return dibx000_write_word(mst, mst->base_reg + 4, intf); in dibx000_i2c_select_interface()
210 struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap); in dibx000_i2c_master_xfer_gpio12() local
214 dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_GPIO_1_2); in dibx000_i2c_master_xfer_gpio12()
217 ret = dibx000_master_i2c_read(mst, &msg[msg_index]); in dibx000_i2c_master_xfer_gpio12()
221 ret = dibx000_master_i2c_write(mst, &msg[msg_index], 1); in dibx000_i2c_master_xfer_gpio12()
232 struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap); in dibx000_i2c_master_xfer_gpio34() local
236 dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_GPIO_3_4); in dibx000_i2c_master_xfer_gpio34()
239 ret = dibx000_master_i2c_read(mst, &msg[msg_index]); in dibx000_i2c_master_xfer_gpio34()
243 ret = dibx000_master_i2c_write(mst, &msg[msg_index], 1); in dibx000_i2c_master_xfer_gpio34()
262 static int dibx000_i2c_gate_ctrl(struct dibx000_i2c_master *mst, u8 tx[4], in dibx000_i2c_gate_ctrl() argument
273 if (mst->device_rev > DIB7000) in dibx000_i2c_gate_ctrl()
276 tx[0] = (((mst->base_reg + 1) >> 8) & 0xff); in dibx000_i2c_gate_ctrl()
277 tx[1] = ((mst->base_reg + 1) & 0xff); in dibx000_i2c_gate_ctrl()
287 struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap); in dibx000_i2c_gated_gpio67_xfer() local
296 dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_GPIO_6_7); in dibx000_i2c_gated_gpio67_xfer()
298 if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { in dibx000_i2c_gated_gpio67_xfer()
303 memset(mst->msg, 0, sizeof(struct i2c_msg) * (2 + num)); in dibx000_i2c_gated_gpio67_xfer()
306 dibx000_i2c_gate_ctrl(mst, &mst->i2c_write_buffer[0], msg[0].addr, 1); in dibx000_i2c_gated_gpio67_xfer()
307 mst->msg[0].addr = mst->i2c_addr; in dibx000_i2c_gated_gpio67_xfer()
308 mst->msg[0].buf = &mst->i2c_write_buffer[0]; in dibx000_i2c_gated_gpio67_xfer()
309 mst->msg[0].len = 4; in dibx000_i2c_gated_gpio67_xfer()
311 memcpy(&mst->msg[1], msg, sizeof(struct i2c_msg) * num); in dibx000_i2c_gated_gpio67_xfer()
314 dibx000_i2c_gate_ctrl(mst, &mst->i2c_write_buffer[4], 0, 0); in dibx000_i2c_gated_gpio67_xfer()
315 mst->msg[num + 1].addr = mst->i2c_addr; in dibx000_i2c_gated_gpio67_xfer()
316 mst->msg[num + 1].buf = &mst->i2c_write_buffer[4]; in dibx000_i2c_gated_gpio67_xfer()
317 mst->msg[num + 1].len = 4; in dibx000_i2c_gated_gpio67_xfer()
319 ret = (i2c_transfer(mst->i2c_adap, mst->msg, 2 + num) == 2 + num ? in dibx000_i2c_gated_gpio67_xfer()
322 mutex_unlock(&mst->i2c_buffer_lock); in dibx000_i2c_gated_gpio67_xfer()
334 struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap); in dibx000_i2c_gated_tuner_xfer() local
343 dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_TUNER); in dibx000_i2c_gated_tuner_xfer()
345 if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { in dibx000_i2c_gated_tuner_xfer()
349 memset(mst->msg, 0, sizeof(struct i2c_msg) * (2 + num)); in dibx000_i2c_gated_tuner_xfer()
352 dibx000_i2c_gate_ctrl(mst, &mst->i2c_write_buffer[0], msg[0].addr, 1); in dibx000_i2c_gated_tuner_xfer()
353 mst->msg[0].addr = mst->i2c_addr; in dibx000_i2c_gated_tuner_xfer()
354 mst->msg[0].buf = &mst->i2c_write_buffer[0]; in dibx000_i2c_gated_tuner_xfer()
355 mst->msg[0].len = 4; in dibx000_i2c_gated_tuner_xfer()
357 memcpy(&mst->msg[1], msg, sizeof(struct i2c_msg) * num); in dibx000_i2c_gated_tuner_xfer()
360 dibx000_i2c_gate_ctrl(mst, &mst->i2c_write_buffer[4], 0, 0); in dibx000_i2c_gated_tuner_xfer()
361 mst->msg[num + 1].addr = mst->i2c_addr; in dibx000_i2c_gated_tuner_xfer()
362 mst->msg[num + 1].buf = &mst->i2c_write_buffer[4]; in dibx000_i2c_gated_tuner_xfer()
363 mst->msg[num + 1].len = 4; in dibx000_i2c_gated_tuner_xfer()
365 ret = (i2c_transfer(mst->i2c_adap, mst->msg, 2 + num) == 2 + num ? in dibx000_i2c_gated_tuner_xfer()
367 mutex_unlock(&mst->i2c_buffer_lock); in dibx000_i2c_gated_tuner_xfer()
376 struct i2c_adapter *dibx000_get_i2c_adapter(struct dibx000_i2c_master *mst, in dibx000_get_i2c_adapter() argument
385 i2c = &mst->gated_tuner_i2c_adap; in dibx000_get_i2c_adapter()
389 i2c = &mst->master_i2c_adap_gpio12; in dibx000_get_i2c_adapter()
393 i2c = &mst->master_i2c_adap_gpio34; in dibx000_get_i2c_adapter()
397 i2c = &mst->master_i2c_adap_gpio67; in dibx000_get_i2c_adapter()
409 void dibx000_reset_i2c_master(struct dibx000_i2c_master *mst) in dibx000_reset_i2c_master() argument
413 struct i2c_msg m = {.addr = mst->i2c_addr,.buf = tx,.len = 4 }; in dibx000_reset_i2c_master()
415 dibx000_i2c_gate_ctrl(mst, tx, 0, 0); in dibx000_reset_i2c_master()
416 i2c_transfer(mst->i2c_adap, &m, 1); in dibx000_reset_i2c_master()
417 mst->selected_interface = 0xff; // the first time force a select of the I2C in dibx000_reset_i2c_master()
418 dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_TUNER); in dibx000_reset_i2c_master()
425 struct dibx000_i2c_master *mst) in i2c_adapter_init() argument
430 i2c_set_adapdata(i2c_adap, mst); in i2c_adapter_init()
436 int dibx000_init_i2c_master(struct dibx000_i2c_master *mst, u16 device_rev, in dibx000_init_i2c_master() argument
441 mutex_init(&mst->i2c_buffer_lock); in dibx000_init_i2c_master()
442 if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { in dibx000_init_i2c_master()
446 memset(mst->msg, 0, sizeof(struct i2c_msg)); in dibx000_init_i2c_master()
447 mst->msg[0].addr = i2c_addr >> 1; in dibx000_init_i2c_master()
448 mst->msg[0].flags = 0; in dibx000_init_i2c_master()
449 mst->msg[0].buf = mst->i2c_write_buffer; in dibx000_init_i2c_master()
450 mst->msg[0].len = 4; in dibx000_init_i2c_master()
452 mst->device_rev = device_rev; in dibx000_init_i2c_master()
453 mst->i2c_adap = i2c_adap; in dibx000_init_i2c_master()
454 mst->i2c_addr = i2c_addr >> 1; in dibx000_init_i2c_master()
457 mst->base_reg = 1024; in dibx000_init_i2c_master()
459 mst->base_reg = 768; in dibx000_init_i2c_master()
461 mst->gated_tuner_i2c_adap.dev.parent = mst->i2c_adap->dev.parent; in dibx000_init_i2c_master()
463 (&mst->gated_tuner_i2c_adap, &dibx000_i2c_gated_tuner_algo, in dibx000_init_i2c_master()
464 "DiBX000 tuner I2C bus", mst) != 0) in dibx000_init_i2c_master()
467 mst->master_i2c_adap_gpio12.dev.parent = mst->i2c_adap->dev.parent; in dibx000_init_i2c_master()
469 (&mst->master_i2c_adap_gpio12, &dibx000_i2c_master_gpio12_xfer_algo, in dibx000_init_i2c_master()
470 "DiBX000 master GPIO12 I2C bus", mst) != 0) in dibx000_init_i2c_master()
473 mst->master_i2c_adap_gpio34.dev.parent = mst->i2c_adap->dev.parent; in dibx000_init_i2c_master()
475 (&mst->master_i2c_adap_gpio34, &dibx000_i2c_master_gpio34_xfer_algo, in dibx000_init_i2c_master()
476 "DiBX000 master GPIO34 I2C bus", mst) != 0) in dibx000_init_i2c_master()
479 mst->master_i2c_adap_gpio67.dev.parent = mst->i2c_adap->dev.parent; in dibx000_init_i2c_master()
481 (&mst->master_i2c_adap_gpio67, &dibx000_i2c_gated_gpio67_algo, in dibx000_init_i2c_master()
482 "DiBX000 master GPIO67 I2C bus", mst) != 0) in dibx000_init_i2c_master()
486 dibx000_i2c_gate_ctrl(mst, mst->i2c_write_buffer, 0, 0); in dibx000_init_i2c_master()
488 ret = (i2c_transfer(i2c_adap, mst->msg, 1) == 1); in dibx000_init_i2c_master()
489 mutex_unlock(&mst->i2c_buffer_lock); in dibx000_init_i2c_master()
496 void dibx000_exit_i2c_master(struct dibx000_i2c_master *mst) in dibx000_exit_i2c_master() argument
498 i2c_del_adapter(&mst->gated_tuner_i2c_adap); in dibx000_exit_i2c_master()
499 i2c_del_adapter(&mst->master_i2c_adap_gpio12); in dibx000_exit_i2c_master()
500 i2c_del_adapter(&mst->master_i2c_adap_gpio34); in dibx000_exit_i2c_master()
501 i2c_del_adapter(&mst->master_i2c_adap_gpio67); in dibx000_exit_i2c_master()