static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff) { struct dvb_usb_device *d = adap_to_d(adap); int ret; u8 idx; dev_dbg(&d->udev->dev, "%s: index=%d pid=%04x onoff=%d\n", __func__, index, pid, onoff); ret = af9015_write_reg(d, 0xd505, (pid & 0xff)); if (ret) goto error; ret = af9015_write_reg(d, 0xd506, (pid >> 8)); if (ret) goto error; idx = ((index & 0x1f) | (1 << 5)); ret = af9015_write_reg(d, 0xd504, idx); error: return ret; }
static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff) { int ret; u8 idx; deb_info("%s: set pid filter, index %d, pid %x, onoff %d\n", __func__, index, pid, onoff); ret = af9015_write_reg(adap->dev, 0xd505, (pid & 0xff)); if (ret) goto error; ret = af9015_write_reg(adap->dev, 0xd506, (pid >> 8)); if (ret) goto error; idx = ((index & 0x1f) | (1 << 5)); ret = af9015_write_reg(adap->dev, 0xd504, idx); error: return ret; }
static int af9015_init(struct dvb_usb_device *d) { int ret; deb_info("%s:\n", __func__); /* init RC canary */ ret = af9015_write_reg(d, 0x98e9, 0xff); if (ret) goto error; ret = af9015_init_endpoint(d); if (ret) goto error; error: return ret; }
static int af9015_init(struct dvb_usb_device *d) { struct af9015_state *state = d_to_priv(d); int ret; dev_dbg(&d->udev->dev, "%s:\n", __func__); mutex_init(&state->fe_mutex); /* init RC canary */ ret = af9015_write_reg(d, 0x98e9, 0xff); if (ret) goto error; ret = af9015_init_endpoint(d); if (ret) goto error; error: return ret; }
static int af9015_do_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit, u8 op) { int ret; u8 val, mask = 0x01; ret = af9015_read_reg(d, addr, &val); if (ret) return ret; mask <<= bit; if (op) { /* set bit */ val |= mask; } else { /* clear bit */ mask ^= 0xff; val &= mask; } return af9015_write_reg(d, addr, val); }
static int af9015_copy_firmware(struct dvb_usb_device *d) { int ret; u8 fw_params[4]; u8 val, i; struct req_t req = {COPY_FIRMWARE, 0, 0x5100, 0, 0, sizeof(fw_params), fw_params }; deb_info("%s:\n", __func__); fw_params[0] = af9015_config.firmware_size >> 8; fw_params[1] = af9015_config.firmware_size & 0xff; fw_params[2] = af9015_config.firmware_checksum >> 8; fw_params[3] = af9015_config.firmware_checksum & 0xff; /* wait 2nd demodulator ready */ msleep(100); ret = af9015_read_reg_i2c(d, af9015_af9013_config[1].demod_address, 0x98be, &val); if (ret) goto error; else deb_info("%s: firmware status:%02x\n", __func__, val); if (val == 0x0c) /* fw is running, no need for download */ goto exit; /* set I2C master clock to fast (to speed up firmware copy) */ ret = af9015_write_reg(d, 0xd416, 0x04); /* 0x04 * 400ns */ if (ret) goto error; msleep(50); /* copy firmware */ ret = af9015_ctrl_msg(d, &req); if (ret) err("firmware copy cmd failed:%d", ret); deb_info("%s: firmware copy done\n", __func__); /* set I2C master clock back to normal */ ret = af9015_write_reg(d, 0xd416, 0x14); /* 0x14 * 400ns */ if (ret) goto error; /* request boot firmware */ ret = af9015_write_reg_i2c(d, af9015_af9013_config[1].demod_address, 0xe205, 1); deb_info("%s: firmware boot cmd status:%d\n", __func__, ret); if (ret) goto error; for (i = 0; i < 15; i++) { msleep(100); /* check firmware status */ ret = af9015_read_reg_i2c(d, af9015_af9013_config[1].demod_address, 0x98be, &val); deb_info("%s: firmware status cmd status:%d fw status:%02x\n", __func__, ret, val); if (ret) goto error; if (val == 0x0c || val == 0x04) /* success or fail */ break; } if (val == 0x04) { err("firmware did not run"); ret = -1; } else if (val != 0x0c) { err("firmware boot timeout"); ret = -1; } error: exit: return ret; }
static int af9015_init_endpoint(struct dvb_usb_device *d) { int ret; u16 frame_size; u8 packet_size; deb_info("%s: USB speed:%d\n", __func__, d->udev->speed); /* Windows driver uses packet count 21 for USB1.1 and 348 for USB2.0. We use smaller - about 1/4 from the original, 5 and 87. */ #define TS_PACKET_SIZE 188 #define TS_USB20_PACKET_COUNT 87 #define TS_USB20_FRAME_SIZE (TS_PACKET_SIZE*TS_USB20_PACKET_COUNT) #define TS_USB11_PACKET_COUNT 5 #define TS_USB11_FRAME_SIZE (TS_PACKET_SIZE*TS_USB11_PACKET_COUNT) #define TS_USB20_MAX_PACKET_SIZE 512 #define TS_USB11_MAX_PACKET_SIZE 64 if (d->udev->speed == USB_SPEED_FULL) { frame_size = TS_USB11_FRAME_SIZE/4; packet_size = TS_USB11_MAX_PACKET_SIZE/4; } else { frame_size = TS_USB20_FRAME_SIZE/4; packet_size = TS_USB20_MAX_PACKET_SIZE/4; } ret = af9015_set_reg_bit(d, 0xd507, 2); /* assert EP4 reset */ if (ret) goto error; ret = af9015_set_reg_bit(d, 0xd50b, 1); /* assert EP5 reset */ if (ret) goto error; ret = af9015_clear_reg_bit(d, 0xdd11, 5); /* disable EP4 */ if (ret) goto error; ret = af9015_clear_reg_bit(d, 0xdd11, 6); /* disable EP5 */ if (ret) goto error; ret = af9015_set_reg_bit(d, 0xdd11, 5); /* enable EP4 */ if (ret) goto error; if (af9015_config.dual_mode) { ret = af9015_set_reg_bit(d, 0xdd11, 6); /* enable EP5 */ if (ret) goto error; } ret = af9015_clear_reg_bit(d, 0xdd13, 5); /* disable EP4 NAK */ if (ret) goto error; if (af9015_config.dual_mode) { ret = af9015_clear_reg_bit(d, 0xdd13, 6); /* disable EP5 NAK */ if (ret) goto error; } /* EP4 xfer length */ ret = af9015_write_reg(d, 0xdd88, frame_size & 0xff); if (ret) goto error; ret = af9015_write_reg(d, 0xdd89, frame_size >> 8); if (ret) goto error; /* EP5 xfer length */ ret = af9015_write_reg(d, 0xdd8a, frame_size & 0xff); if (ret) goto error; ret = af9015_write_reg(d, 0xdd8b, frame_size >> 8); if (ret) goto error; ret = af9015_write_reg(d, 0xdd0c, packet_size); /* EP4 packet size */ if (ret) goto error; ret = af9015_write_reg(d, 0xdd0d, packet_size); /* EP5 packet size */ if (ret) goto error; ret = af9015_clear_reg_bit(d, 0xd507, 2); /* negate EP4 reset */ if (ret) goto error; if (af9015_config.dual_mode) { ret = af9015_clear_reg_bit(d, 0xd50b, 1); /* negate EP5 reset */ if (ret) goto error; } /* enable / disable mp2if2 */ if (af9015_config.dual_mode) ret = af9015_set_reg_bit(d, 0xd50b, 0); else ret = af9015_clear_reg_bit(d, 0xd50b, 0); error: if (ret) err("endpoint init failed:%d", ret); return ret; }
static int af9015_rc_query(struct dvb_usb_device *d) { struct af9015_state *priv = d->priv; int ret; u8 buf[17]; /* read registers needed to detect remote controller code */ ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf)); if (ret) goto error; /* If any of these are non-zero, assume invalid data */ if (buf[1] || buf[2] || buf[3]) return ret; /* Check for repeat of previous code */ if ((priv->rc_repeat != buf[6] || buf[0]) && !memcmp(&buf[12], priv->rc_last, 4)) { deb_rc("%s: key repeated\n", __func__); rc_keydown(d->rc_dev, priv->rc_keycode, 0); priv->rc_repeat = buf[6]; return ret; } /* Only process key if canary killed */ if (buf[16] != 0xff && buf[0] != 0x01) { deb_rc("%s: key pressed %02x %02x %02x %02x\n", __func__, buf[12], buf[13], buf[14], buf[15]); /* Reset the canary */ ret = af9015_write_reg(d, 0x98e9, 0xff); if (ret) goto error; /* Remember this key */ memcpy(priv->rc_last, &buf[12], 4); if (buf[14] == (u8) ~buf[15]) { if (buf[12] == (u8) ~buf[13]) { /* NEC */ priv->rc_keycode = buf[12] << 8 | buf[14]; } else { /* NEC extended*/ priv->rc_keycode = buf[12] << 16 | buf[13] << 8 | buf[14]; } } else { /* 32 bit NEC */ priv->rc_keycode = buf[12] << 24 | buf[13] << 16 | buf[14] << 8 | buf[15]; } rc_keydown(d->rc_dev, priv->rc_keycode, 0); } else { deb_rc("%s: no key press\n", __func__); /* Invalidate last keypress */ /* Not really needed, but helps with debug */ priv->rc_last[2] = priv->rc_last[3]; } priv->rc_repeat = buf[6]; error: if (ret) err("%s: failed:%d", __func__, ret); return ret; }
static int af9015_copy_firmware(struct dvb_usb_device *d) { struct af9015_state *state = d_to_priv(d); int ret; u8 fw_params[4]; u8 val, i; struct req_t req = {COPY_FIRMWARE, 0, 0x5100, 0, 0, sizeof(fw_params), fw_params }; dev_dbg(&d->udev->dev, "%s:\n", __func__); fw_params[0] = state->firmware_size >> 8; fw_params[1] = state->firmware_size & 0xff; fw_params[2] = state->firmware_checksum >> 8; fw_params[3] = state->firmware_checksum & 0xff; /* wait 2nd demodulator ready */ msleep(100); ret = af9015_read_reg_i2c(d, state->af9013_config[1].i2c_addr, 0x98be, &val); if (ret) goto error; else dev_dbg(&d->udev->dev, "%s: firmware status=%02x\n", __func__, val); if (val == 0x0c) /* fw is running, no need for download */ goto exit; /* set I2C master clock to fast (to speed up firmware copy) */ ret = af9015_write_reg(d, 0xd416, 0x04); /* 0x04 * 400ns */ if (ret) goto error; msleep(50); /* copy firmware */ ret = af9015_ctrl_msg(d, &req); if (ret) dev_err(&d->udev->dev, "%s: firmware copy cmd failed=%d\n", KBUILD_MODNAME, ret); dev_dbg(&d->udev->dev, "%s: firmware copy done\n", __func__); /* set I2C master clock back to normal */ ret = af9015_write_reg(d, 0xd416, 0x14); /* 0x14 * 400ns */ if (ret) goto error; /* request boot firmware */ ret = af9015_write_reg_i2c(d, state->af9013_config[1].i2c_addr, 0xe205, 1); dev_dbg(&d->udev->dev, "%s: firmware boot cmd status=%d\n", __func__, ret); if (ret) goto error; for (i = 0; i < 15; i++) { msleep(100); /* check firmware status */ ret = af9015_read_reg_i2c(d, state->af9013_config[1].i2c_addr, 0x98be, &val); dev_dbg(&d->udev->dev, "%s: firmware status cmd status=%d " \ "firmware status=%02x\n", __func__, ret, val); if (ret) goto error; if (val == 0x0c || val == 0x04) /* success or fail */ break; } if (val == 0x04) { dev_err(&d->udev->dev, "%s: firmware did not run\n", KBUILD_MODNAME); ret = -ETIMEDOUT; } else if (val != 0x0c) { dev_err(&d->udev->dev, "%s: firmware boot timeout\n", KBUILD_MODNAME); ret = -ETIMEDOUT; } error: exit: return ret; }
static int af9015_rc_query(struct dvb_usb_device *d) { struct af9015_state *state = d_to_priv(d); int ret; u8 buf[17]; /* read registers needed to detect remote controller code */ ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf)); if (ret) goto error; /* If any of these are non-zero, assume invalid data */ if (buf[1] || buf[2] || buf[3]) { dev_dbg(&d->udev->dev, "%s: invalid data\n", __func__); return ret; } /* Check for repeat of previous code */ if ((state->rc_repeat != buf[6] || buf[0]) && !memcmp(&buf[12], state->rc_last, 4)) { dev_dbg(&d->udev->dev, "%s: key repeated\n", __func__); rc_repeat(d->rc_dev); state->rc_repeat = buf[6]; return ret; } /* Only process key if canary killed */ if (buf[16] != 0xff && buf[0] != 0x01) { dev_dbg(&d->udev->dev, "%s: key pressed %*ph\n", __func__, 4, buf + 12); /* Reset the canary */ ret = af9015_write_reg(d, 0x98e9, 0xff); if (ret) goto error; /* Remember this key */ memcpy(state->rc_last, &buf[12], 4); if (buf[14] == (u8) ~buf[15]) { if (buf[12] == (u8) ~buf[13]) { /* NEC */ state->rc_keycode = RC_SCANCODE_NEC(buf[12], buf[14]); } else { /* NEC extended*/ state->rc_keycode = RC_SCANCODE_NECX(buf[12] << 8 | buf[13], buf[14]); } } else { /* 32 bit NEC */ state->rc_keycode = RC_SCANCODE_NEC32(buf[12] << 24 | buf[13] << 16 | buf[14] << 8 | buf[15]); } rc_keydown(d->rc_dev, RC_TYPE_NEC, state->rc_keycode, 0); } else { dev_dbg(&d->udev->dev, "%s: no key press\n", __func__); /* Invalidate last keypress */ /* Not really needed, but helps with debug */ state->rc_last[2] = state->rc_last[3]; } state->rc_repeat = buf[6]; state->rc_failed = false; error: if (ret) { dev_warn(&d->udev->dev, "%s: rc query failed=%d\n", KBUILD_MODNAME, ret); /* allow random errors as dvb-usb will stop polling on error */ if (!state->rc_failed) ret = 0; state->rc_failed = true; } return ret; }
static int af9015_init_endpoint(struct dvb_usb_device *d) { struct af9015_state *state = d_to_priv(d); int ret; u16 frame_size; u8 packet_size; dev_dbg(&d->udev->dev, "%s: USB speed=%d\n", __func__, d->udev->speed); if (d->udev->speed == USB_SPEED_FULL) { frame_size = TS_USB11_FRAME_SIZE/4; packet_size = TS_USB11_MAX_PACKET_SIZE/4; } else { frame_size = TS_USB20_FRAME_SIZE/4; packet_size = TS_USB20_MAX_PACKET_SIZE/4; } ret = af9015_set_reg_bit(d, 0xd507, 2); /* assert EP4 reset */ if (ret) goto error; ret = af9015_set_reg_bit(d, 0xd50b, 1); /* assert EP5 reset */ if (ret) goto error; ret = af9015_clear_reg_bit(d, 0xdd11, 5); /* disable EP4 */ if (ret) goto error; ret = af9015_clear_reg_bit(d, 0xdd11, 6); /* disable EP5 */ if (ret) goto error; ret = af9015_set_reg_bit(d, 0xdd11, 5); /* enable EP4 */ if (ret) goto error; if (state->dual_mode) { ret = af9015_set_reg_bit(d, 0xdd11, 6); /* enable EP5 */ if (ret) goto error; } ret = af9015_clear_reg_bit(d, 0xdd13, 5); /* disable EP4 NAK */ if (ret) goto error; if (state->dual_mode) { ret = af9015_clear_reg_bit(d, 0xdd13, 6); /* disable EP5 NAK */ if (ret) goto error; } /* EP4 xfer length */ ret = af9015_write_reg(d, 0xdd88, frame_size & 0xff); if (ret) goto error; ret = af9015_write_reg(d, 0xdd89, frame_size >> 8); if (ret) goto error; /* EP5 xfer length */ ret = af9015_write_reg(d, 0xdd8a, frame_size & 0xff); if (ret) goto error; ret = af9015_write_reg(d, 0xdd8b, frame_size >> 8); if (ret) goto error; ret = af9015_write_reg(d, 0xdd0c, packet_size); /* EP4 packet size */ if (ret) goto error; ret = af9015_write_reg(d, 0xdd0d, packet_size); /* EP5 packet size */ if (ret) goto error; ret = af9015_clear_reg_bit(d, 0xd507, 2); /* negate EP4 reset */ if (ret) goto error; if (state->dual_mode) { ret = af9015_clear_reg_bit(d, 0xd50b, 1); /* negate EP5 reset */ if (ret) goto error; } /* enable / disable mp2if2 */ if (state->dual_mode) ret = af9015_set_reg_bit(d, 0xd50b, 0); else ret = af9015_clear_reg_bit(d, 0xd50b, 0); error: if (ret) dev_err(&d->udev->dev, "%s: endpoint init failed=%d\n", KBUILD_MODNAME, ret); return ret; }