From patchwork Fri Mar 4 22:44:11 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew de Quincey X-Patchwork-Id: 610381 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p24MiLq3013061 for ; Fri, 4 Mar 2011 22:44:21 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932641Ab1CDWoO (ORCPT ); Fri, 4 Mar 2011 17:44:14 -0500 Received: from mail-ww0-f44.google.com ([74.125.82.44]:46314 "EHLO mail-ww0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932569Ab1CDWoM (ORCPT ); Fri, 4 Mar 2011 17:44:12 -0500 Received: by wwb22 with SMTP id 22so3286726wwb.1 for ; Fri, 04 Mar 2011 14:44:11 -0800 (PST) MIME-Version: 1.0 Received: by 10.216.141.225 with SMTP id g75mr1026895wej.10.1299278651201; Fri, 04 Mar 2011 14:44:11 -0800 (PST) Received: by 10.216.3.13 with HTTP; Fri, 4 Mar 2011 14:44:11 -0800 (PST) X-Originating-IP: [82.71.49.12] In-Reply-To: <4D7163FD.9030604@iki.fi> References: <4D7163FD.9030604@iki.fi> Date: Fri, 4 Mar 2011 22:44:11 +0000 X-Google-Sender-Auth: 5GVm8ievW8lbw8rq6xSaiqXsdUs Message-ID: Subject: Re: [patch] Fix AF9015 Dual tuner i2c write failures From: Andrew de Quincey To: Antti Palosaari Cc: linux-media@vger.kernel.org Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Fri, 04 Mar 2011 22:44:39 +0000 (UTC) diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index 31c0a0e..52ac6ef 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c @@ -1083,6 +1083,34 @@ static int af9015_i2c_init(struct dvb_usb_device *d) return ret; } +static int af9015_lock_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +{ + int result; + struct dvb_usb_adapter *adap = fe->dvb->priv; + struct af9015_state *state = adap->dev->priv; + + if (mutex_lock_interruptible(&adap->dev->usb_mutex)) + return -EAGAIN; + + result = state->fe_ops[adap->id].set_frontend(fe, params); + mutex_unlock(&adap->dev->usb_mutex); + return result; +} + +static int af9015_lock_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) +{ + int result; + struct dvb_usb_adapter *adap = fe->dvb->priv; + struct af9015_state *state = adap->dev->priv; + + if (mutex_lock_interruptible(&adap->dev->usb_mutex)) + return -EAGAIN; + + result = state->fe_ops[adap->id].get_frontend(fe, params); + mutex_unlock(&adap->dev->usb_mutex); + return result; +} + static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap) { int ret; @@ -1116,6 +1144,12 @@ static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap) /* attach demodulator */ adap->fe = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id], i2c_adap); + + memcpy(&state->fe_ops[adap->id], &adap->fe->ops, sizeof(struct dvb_frontend_ops)); + if (adap->fe->ops.set_frontend) + adap->fe->ops.set_frontend = af9015_lock_set_frontend; + if (adap->fe->ops.get_frontend) + adap->fe->ops.get_frontend = af9015_lock_get_frontend; return adap->fe == NULL ? -ENODEV : 0; } diff --git a/drivers/media/dvb/dvb-usb/af9015.h b/drivers/media/dvb/dvb-usb/af9015.h index f20cfa6..759bb3f 100644 --- a/drivers/media/dvb/dvb-usb/af9015.h +++ b/drivers/media/dvb/dvb-usb/af9015.h @@ -102,6 +102,7 @@ struct af9015_state { struct i2c_adapter i2c_adap; /* I2C adapter for 2nd FE */ u8 rc_repeat; u32 rc_keycode; + struct dvb_frontend_ops fe_ops[2]; }; struct af9015_config {