On Tue, 2010-12-28 at 12:45 -0200, Mauro Carvalho Chehab wrote: > Em 28-12-2010 12:14, Andy Walls escreveu: > > On Tue, 2010-12-28 at 01:12 -0200, Mauro Carvalho Chehab wrote: > >> Em 27-12-2010 21:55, Andy Walls escreveu: > >>> I have hardware for lirc_zilog. I can look later this week. > >> > >> That would be great! > > > > It shouldn't be hard to fix up the lirc_zilog.c use of adap->id but it > > may require a change to the hdpvr driver as well. > > > > As I was looking, I noticed this commit is incomplete: > > > > http://git.linuxtv.org/media_tree.git?a=commitdiff;h=07cc65d4f4a21a104269ff7e4e7be42bd26d7acb > > > > The "goto" was missed in the conditional compilation for the HD-PVR: > > > > http://git.linuxtv.org/media_tree.git?a=blob;f=drivers/staging/lirc/lirc_zilog.c;h=f0076eb025f1a0e9d412080caab87f627dda4970#l844 > > > > You might want to revert the trivial commit that removed the "done:" > > label. When I clean up the dependence on adap->id, I may need the > > "done:" label back again. > > > > > Argh! this is not a very nice code at all... > > I think that the proper way is to apply the enclosed patch. After having it > fixed, the dont_wait parameter can be passed to the driver via platform_data. > So, we should add a field at struct IR for it. Well there is one more exception in lirc_zilog for the HD-PVR that also relies on adapter->id. lirc_zilog only handles Hauppauge adapters with that Z8 microcontroller (PVR-150's, HVR-1600's, etc.) and the HD-PVR is the only device that requires these quirky exceptions AFAIK. It's probably better just to let lirc_zilog cleanly know it is dealing with an HD-PVR and let it handle. I'm working on it this evening and will post something soon. Regards, Andy > Cheers, > Mauro > > lirc_zilog: Fix the TX logic for hd-pvr > > The dont_wait parameter should be passed to the driver via platform_data, in order > to allow removing the usage of the legacy i2c_adapter.id field. > > So, we should add a field at struct IR for it. > > Signed-off-by: Mauro Carvalho Chehab <mchehab@xxxxxxxxxx> > > diff --git a/drivers/staging/lirc/lirc_zilog.c b/drivers/staging/lirc/lirc_zilog.c > index 52be6de..8486b66 100644 > --- a/drivers/staging/lirc/lirc_zilog.c > +++ b/drivers/staging/lirc/lirc_zilog.c > @@ -88,6 +88,7 @@ struct IR { > struct i2c_client c_tx; > int need_boot; > int have_tx; > + bool dont_wait; > }; > > /* Minor -> data mapping */ > @@ -841,46 +842,43 @@ static int send_code(struct IR *ir, unsigned int code, unsigned int key) > return ret < 0 ? ret : -EFAULT; > } > > -#ifdef I2C_HW_B_HDPVR > /* > * The sleep bits aren't necessary on the HD PVR, and in fact, the > * last i2c_master_recv always fails with a -5, so for now, we're > * going to skip this whole mess and say we're done on the HD PVR > */ > - if (ir->c_rx.adapter->id == I2C_HW_B_HDPVR) > - goto done; > -#endif > - > - /* > - * This bit NAKs until the device is ready, so we retry it > - * sleeping a bit each time. This seems to be what the windows > - * driver does, approximately. > - * Try for up to 1s. > - */ > - for (i = 0; i < 20; ++i) { > - set_current_state(TASK_UNINTERRUPTIBLE); > - schedule_timeout((50 * HZ + 999) / 1000); > - ret = i2c_master_send(&ir->c_tx, buf, 1); > - if (ret == 1) > - break; > - dprintk("NAK expected: i2c_master_send " > - "failed with %d (try %d)\n", ret, i+1); > - } > - if (ret != 1) { > - zilog_error("IR TX chip never got ready: last i2c_master_send " > - "failed with %d\n", ret); > - return ret < 0 ? ret : -EFAULT; > - } > + if (!ir->dont_wait) { > + /* > + * This bit NAKs until the device is ready, so we retry it > + * sleeping a bit each time. This seems to be what the > + * windows driver does, approximately. > + * Try for up to 1s. > + */ > + for (i = 0; i < 20; ++i) { > + set_current_state(TASK_UNINTERRUPTIBLE); > + schedule_timeout((50 * HZ + 999) / 1000); > + ret = i2c_master_send(&ir->c_tx, buf, 1); > + if (ret == 1) > + break; > + dprintk("NAK expected: i2c_master_send " > + "failed with %d (try %d)\n", ret, i+1); > + } > + if (ret != 1) { > + zilog_error("IR TX chip never got ready: last i2c_master_send " > + "failed with %d\n", ret); > + return ret < 0 ? ret : -EFAULT; > + } > > - /* Seems to be an 'ok' response */ > - i = i2c_master_recv(&ir->c_tx, buf, 1); > - if (i != 1) { > - zilog_error("i2c_master_recv failed with %d\n", ret); > - return -EFAULT; > - } > - if (buf[0] != 0x80) { > - zilog_error("unexpected IR TX response #2: %02x\n", buf[0]); > - return -EFAULT; > + /* Seems to be an 'ok' response */ > + i = i2c_master_recv(&ir->c_tx, buf, 1); > + if (i != 1) { > + zilog_error("i2c_master_recv failed with %d\n", ret); > + return -EFAULT; > + } > + if (buf[0] != 0x80) { > + zilog_error("unexpected IR TX response #2: %02x\n", buf[0]); > + return -EFAULT; > + } > } > > /* Oh good, it worked */ > @@ -1278,6 +1276,11 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) > strlcpy(ir->c_tx.name, ZILOG_HAUPPAUGE_IR_TX_NAME, > I2C_NAME_SIZE); > ir->have_tx = 1; > + > +#ifdef I2C_HW_B_HDPVR > + if (ir->c_rx.adapter->id == I2C_HW_B_HDPVR) > + ir->dont_wait = true; > +#endif > } > > /* set lirc_dev stuff */ > -- > To unsubscribe from this list: send the line "unsubscribe linux-media" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html