Lines Matching +full:num +full:- +full:addresses
1 // SPDX-License-Identifier: GPL-2.0-only
9 #include <media/i2c/ir-kbd-i2c.h>
10 #include "pvrusb2-i2c-core.h"
11 #include "pvrusb2-hdw-internal.h"
12 #include "pvrusb2-debug.h"
13 #include "pvrusb2-fx2-cmd.h"
29 static int ir_mode[PVR_NUM] = { [0 ... PVR_NUM-1] = 1 };
44 /* Return value - default 0 means success */ in pvr2_i2c_write()
49 if (length > (sizeof(hdw->cmd_buffer) - 3)) { in pvr2_i2c_write()
53 length,(unsigned int)(sizeof(hdw->cmd_buffer) - 3)); in pvr2_i2c_write()
54 return -ENOTSUPP; in pvr2_i2c_write()
57 LOCK_TAKE(hdw->ctl_lock); in pvr2_i2c_write()
60 memset(hdw->cmd_buffer, 0, sizeof(hdw->cmd_buffer)); in pvr2_i2c_write()
63 hdw->cmd_buffer[0] = FX2CMD_I2C_WRITE; /* write prefix */ in pvr2_i2c_write()
64 hdw->cmd_buffer[1] = i2c_addr; /* i2c addr of chip */ in pvr2_i2c_write()
65 hdw->cmd_buffer[2] = length; /* length of what follows */ in pvr2_i2c_write()
66 if (length) memcpy(hdw->cmd_buffer + 3, data, length); in pvr2_i2c_write()
70 hdw->cmd_buffer, in pvr2_i2c_write()
72 hdw->cmd_buffer, in pvr2_i2c_write()
75 if (hdw->cmd_buffer[0] != 8) { in pvr2_i2c_write()
76 ret = -EIO; in pvr2_i2c_write()
77 if (hdw->cmd_buffer[0] != 7) { in pvr2_i2c_write()
79 i2c_addr,hdw->cmd_buffer[0]); in pvr2_i2c_write()
84 LOCK_GIVE(hdw->ctl_lock); in pvr2_i2c_write()
96 /* Return value - default 0 means success */ in pvr2_i2c_read()
101 if (dlen > (sizeof(hdw->cmd_buffer) - 4)) { in pvr2_i2c_read()
105 dlen,(unsigned int)(sizeof(hdw->cmd_buffer) - 4)); in pvr2_i2c_read()
106 return -ENOTSUPP; in pvr2_i2c_read()
108 if (res && (rlen > (sizeof(hdw->cmd_buffer) - 1))) { in pvr2_i2c_read()
112 rlen,(unsigned int)(sizeof(hdw->cmd_buffer) - 1)); in pvr2_i2c_read()
113 return -ENOTSUPP; in pvr2_i2c_read()
116 LOCK_TAKE(hdw->ctl_lock); in pvr2_i2c_read()
119 memset(hdw->cmd_buffer, 0, sizeof(hdw->cmd_buffer)); in pvr2_i2c_read()
122 hdw->cmd_buffer[0] = FX2CMD_I2C_READ; /* read prefix */ in pvr2_i2c_read()
123 hdw->cmd_buffer[1] = dlen; /* arg length */ in pvr2_i2c_read()
124 hdw->cmd_buffer[2] = rlen; /* answer length. Device will send one in pvr2_i2c_read()
126 hdw->cmd_buffer[3] = i2c_addr; /* i2c addr of chip */ in pvr2_i2c_read()
127 if (dlen) memcpy(hdw->cmd_buffer + 4, data, dlen); in pvr2_i2c_read()
131 hdw->cmd_buffer, in pvr2_i2c_read()
133 hdw->cmd_buffer, in pvr2_i2c_read()
136 if (hdw->cmd_buffer[0] != 8) { in pvr2_i2c_read()
137 ret = -EIO; in pvr2_i2c_read()
138 if (hdw->cmd_buffer[0] != 7) { in pvr2_i2c_read()
140 i2c_addr,hdw->cmd_buffer[0]); in pvr2_i2c_read()
151 memcpy(res, hdw->cmd_buffer + 1, rlen); in pvr2_i2c_read()
155 LOCK_GIVE(hdw->ctl_lock); in pvr2_i2c_read()
197 if ((wlen != 0) || (rlen == 0)) return -EIO; in i2c_24xxx_ir()
204 (version 0.8.0-7 sources from Debian, when run under in i2c_24xxx_ir()
205 vanilla 2.6.17.6 kernel) - and I don't have the patience in i2c_24xxx_ir()
213 LOCK_TAKE(hdw->ctl_lock); do { in i2c_24xxx_ir()
214 hdw->cmd_buffer[0] = FX2CMD_GET_IR_CODE; in i2c_24xxx_ir()
216 hdw->cmd_buffer,1, in i2c_24xxx_ir()
217 hdw->cmd_buffer,4); in i2c_24xxx_ir()
218 dat[0] = hdw->cmd_buffer[0]; in i2c_24xxx_ir()
219 dat[1] = hdw->cmd_buffer[1]; in i2c_24xxx_ir()
220 dat[2] = hdw->cmd_buffer[2]; in i2c_24xxx_ir()
221 dat[3] = hdw->cmd_buffer[3]; in i2c_24xxx_ir()
222 } while (0); LOCK_GIVE(hdw->ctl_lock); in i2c_24xxx_ir()
236 /* Mash the FX2 firmware-provided IR code into something in i2c_24xxx_ir()
237 that the normal i2c chip-level driver expects. */ in i2c_24xxx_ir()
266 transfer. We use this to cause certain I2C addresses to not be
271 return -EIO; in i2c_black_hole()
287 int state = hdw->i2c_cx25840_hack_state; in i2c_hack_cx25840()
290 // Probe attempt - always just succeed and don't bother the in i2c_hack_cx25840()
340 "***WARNING*** Disabling further access to the device to prevent other foul-ups."); in i2c_hack_cx25840()
342 hdw->i2c_func[0x44] = NULL; in i2c_hack_cx25840()
352 hdw->i2c_cx25840_hack_state = state; in i2c_hack_cx25840()
356 hdw->i2c_cx25840_hack_state = state; in i2c_hack_cx25840()
357 return -EIO; in i2c_hack_cx25840()
364 int num) in pvr2_i2c_xfer() argument
366 int ret = -ENOTSUPP; in pvr2_i2c_xfer()
368 struct pvr2_hdw *hdw = (struct pvr2_hdw *)(i2c_adap->algo_data); in pvr2_i2c_xfer()
370 if (!num) { in pvr2_i2c_xfer()
371 ret = -EINVAL; in pvr2_i2c_xfer()
375 funcp = hdw->i2c_func[msgs[0].addr]; in pvr2_i2c_xfer()
378 ret = -EIO; in pvr2_i2c_xfer()
382 if (num == 1) { in pvr2_i2c_xfer()
389 ret = -EIO; in pvr2_i2c_xfer()
402 if (bcnt > sizeof(hdw->cmd_buffer)-1) { in pvr2_i2c_xfer()
403 bcnt = sizeof(hdw->cmd_buffer)-1; in pvr2_i2c_xfer()
407 ret = -EIO; in pvr2_i2c_xfer()
411 tcnt -= bcnt; in pvr2_i2c_xfer()
420 ret = -EIO; in pvr2_i2c_xfer()
424 } else if (num == 2) { in pvr2_i2c_xfer()
426 trace_i2c("i2c refusing 2 phase transfer with conflicting target addresses"); in pvr2_i2c_xfer()
427 ret = -ENOTSUPP; in pvr2_i2c_xfer()
442 if (bcnt > sizeof(hdw->cmd_buffer)-1) { in pvr2_i2c_xfer()
443 bcnt = sizeof(hdw->cmd_buffer)-1; in pvr2_i2c_xfer()
448 ret = -EIO; in pvr2_i2c_xfer()
452 tcnt -= bcnt; in pvr2_i2c_xfer()
463 trace_i2c("i2c refusing %d phase transfer",num); in pvr2_i2c_xfer()
469 for (idx = 0; idx < num; idx++) { in pvr2_i2c_xfer()
472 idx+1,num, in pvr2_i2c_xfer()
487 if (idx+1 == num) { in pvr2_i2c_xfer()
492 if (!num) { in pvr2_i2c_xfer()
526 rc = i2c_transfer(&hdw->i2c_adap, msg, ARRAY_SIZE(msg)); in do_i2c_probe()
533 pr_info("%s: i2c scan beginning\n", hdw->name); in do_i2c_scan()
537 hdw->name, i); in do_i2c_scan()
540 pr_info("%s: i2c scan done.\n", hdw->name); in do_i2c_scan()
546 struct IR_i2c_init_data *init_data = &hdw->ir_init_data; in pvr2_i2c_register_ir()
553 switch (hdw->ir_scheme_active) { in pvr2_i2c_register_ir()
554 case PVR2_IR_SCHEME_24XXX: /* FX2-controlled IR */ in pvr2_i2c_register_ir()
556 init_data->ir_codes = RC_MAP_HAUPPAUGE; in pvr2_i2c_register_ir()
557 init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP; in pvr2_i2c_register_ir()
558 init_data->type = RC_PROTO_BIT_RC5; in pvr2_i2c_register_ir()
559 init_data->name = hdw->hdw_desc->description; in pvr2_i2c_register_ir()
560 init_data->polling_interval = 100; /* ms From ir-kbd-i2c */ in pvr2_i2c_register_ir()
567 i2c_new_client_device(&hdw->i2c_adap, &info); in pvr2_i2c_register_ir()
569 case PVR2_IR_SCHEME_ZILOG: /* HVR-1950 style */ in pvr2_i2c_register_ir()
571 init_data->ir_codes = RC_MAP_HAUPPAUGE; in pvr2_i2c_register_ir()
572 init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; in pvr2_i2c_register_ir()
573 init_data->type = RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC6_MCE | in pvr2_i2c_register_ir()
575 init_data->name = hdw->hdw_desc->description; in pvr2_i2c_register_ir()
582 i2c_new_client_device(&hdw->i2c_adap, &info); in pvr2_i2c_register_ir()
585 /* The device either doesn't support I2C-based IR or we in pvr2_i2c_register_ir()
595 /* The default action for all possible I2C addresses is just to do in pvr2_i2c_core_init()
598 hdw->i2c_func[idx] = pvr2_i2c_basic_op; in pvr2_i2c_core_init()
602 if (ir_mode[hdw->unit_number] == 0) { in pvr2_i2c_core_init()
603 pr_info("%s: IR disabled\n", hdw->name); in pvr2_i2c_core_init()
604 hdw->i2c_func[0x18] = i2c_black_hole; in pvr2_i2c_core_init()
605 } else if (ir_mode[hdw->unit_number] == 1) { in pvr2_i2c_core_init()
606 if (hdw->ir_scheme_active == PVR2_IR_SCHEME_24XXX) { in pvr2_i2c_core_init()
609 hdw->i2c_func[0x18] = i2c_24xxx_ir; in pvr2_i2c_core_init()
612 if (hdw->hdw_desc->flag_has_cx25840) { in pvr2_i2c_core_init()
613 hdw->i2c_func[0x44] = i2c_hack_cx25840; in pvr2_i2c_core_init()
615 if (hdw->hdw_desc->flag_has_wm8775) { in pvr2_i2c_core_init()
616 hdw->i2c_func[0x1b] = i2c_hack_wm8775; in pvr2_i2c_core_init()
620 hdw->i2c_adap = pvr2_i2c_adap_template; in pvr2_i2c_core_init()
621 hdw->i2c_algo = pvr2_i2c_algo_template; in pvr2_i2c_core_init()
622 strscpy(hdw->i2c_adap.name, hdw->name, sizeof(hdw->i2c_adap.name)); in pvr2_i2c_core_init()
623 hdw->i2c_adap.dev.parent = &hdw->usb_dev->dev; in pvr2_i2c_core_init()
624 hdw->i2c_adap.algo = &hdw->i2c_algo; in pvr2_i2c_core_init()
625 hdw->i2c_adap.algo_data = hdw; in pvr2_i2c_core_init()
626 hdw->i2c_linked = !0; in pvr2_i2c_core_init()
627 i2c_set_adapdata(&hdw->i2c_adap, &hdw->v4l2_dev); in pvr2_i2c_core_init()
628 i2c_add_adapter(&hdw->i2c_adap); in pvr2_i2c_core_init()
629 if (hdw->i2c_func[0x18] == i2c_24xxx_ir) { in pvr2_i2c_core_init()
639 hdw->i2c_func[0x18] = NULL; in pvr2_i2c_core_init()
641 hdw->ir_scheme_active = PVR2_IR_SCHEME_24XXX_MCE; in pvr2_i2c_core_init()
651 if (hdw->i2c_linked) { in pvr2_i2c_core_done()
652 i2c_del_adapter(&hdw->i2c_adap); in pvr2_i2c_core_done()
653 hdw->i2c_linked = 0; in pvr2_i2c_core_done()