From patchwork Mon Mar 16 22:12:41 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Larsson X-Patchwork-Id: 6026171 Return-Path: X-Original-To: patchwork-linux-media@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id E01F19F314 for ; Mon, 16 Mar 2015 22:12:51 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 173BB20220 for ; Mon, 16 Mar 2015 22:12:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E93C7201F2 for ; Mon, 16 Mar 2015 22:12:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934196AbbCPWMp (ORCPT ); Mon, 16 Mar 2015 18:12:45 -0400 Received: from smtp.bredband2.com ([83.219.192.166]:58702 "EHLO smtp.bredband2.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932556AbbCPWMo (ORCPT ); Mon, 16 Mar 2015 18:12:44 -0400 Received: from [192.168.1.8] (92-244-23-216.customers.ownit.se [92.244.23.216]) (Authenticated sender: ed8153) by smtp.bredband2.com (Postfix) with ESMTPA id E58CC4A501; Mon, 16 Mar 2015 23:12:41 +0100 (CET) Message-ID: <55075559.50100@southpole.se> Date: Mon, 16 Mar 2015 23:12:41 +0100 From: Benjamin Larsson User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Linux Media Mailing List , Antti Palosaari Subject: [RFC][PATCH] rtl2832: PID filter support for slave demod Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, T_TVD_MIME_EPI, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Is this structure ok for the slave pid implementation? Or should there be only one filters parameter? Will the overlaying pid filter framework properly "flush" the set pid filters ? Note that this code currently is only compile tested. MvH Benjamin Larsson From 8efb26c18b4f9416bd516195c6a82853c9cccc24 Mon Sep 17 00:00:00 2001 From: Benjamin Larsson Date: Mon, 16 Mar 2015 22:59:50 +0100 Subject: [PATCH] rtl2832: PID filter support for slave demod Cc: Linux Media Mailing List RTL2832p supports a slave configuration with a demodulator connected to a ts input on the chip. This makes it possible to receive DVB-T2 muxes that are of larger size then what the rtl2832p usb-bridge is capable of transfering. Signed-off-by: Benjamin Larsson --- drivers/media/dvb-frontends/rtl2832.c | 40 ++++++++++++++++++++++-------- drivers/media/dvb-frontends/rtl2832_priv.h | 2 ++ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/drivers/media/dvb-frontends/rtl2832.c b/drivers/media/dvb-frontends/rtl2832.c index 5d2d8f4..3725211 100644 --- a/drivers/media/dvb-frontends/rtl2832.c +++ b/drivers/media/dvb-frontends/rtl2832.c @@ -488,6 +488,8 @@ static int rtl2832_set_frontend(struct dvb_frontend *fe) if (ret) goto err; + dev->slave_demod_active = 0; + /* If the frontend has get_if_frequency(), use it */ if (fe->ops.tuner_ops.get_if_frequency) { u32 if_freq; @@ -1114,6 +1116,8 @@ static int rtl2832_enable_slave_ts(struct i2c_client *client) if (ret) goto err; + dev->slave_demod_active = 1; + return 0; err: dev_dbg(&client->dev, "failed=%d\n", ret); @@ -1135,7 +1139,10 @@ static int rtl2832_pid_filter_ctrl(struct dvb_frontend *fe, int onoff) else u8tmp = 0x00; - ret = rtl2832_update_bits(client, 0x061, 0xc0, u8tmp); + if (dev->slave_demod_active) + ret = rtl2832_update_bits(client, 0x021, 0xc0, u8tmp); + else + ret = rtl2832_update_bits(client, 0x061, 0xc0, u8tmp); if (ret) goto err; @@ -1152,6 +1159,7 @@ static int rtl2832_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid, struct i2c_client *client = dev->client; int ret; u8 buf[4]; + unsigned long* filters; dev_dbg(&client->dev, "index=%d pid=%04x onoff=%d\n", index, pid, onoff); @@ -1160,24 +1168,36 @@ static int rtl2832_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid, if (pid > 0x1fff || index > 32) return 0; - if (onoff) - set_bit(index, &dev->filters); + if (dev->slave_demod_active) + filters = &dev->filters_slave; else - clear_bit(index, &dev->filters); + filters = &dev->filters; + + if (onoff) { + set_bit(index, filters); + } else { + clear_bit(index, filters); + } /* enable / disable PIDs */ - buf[0] = (dev->filters >> 0) & 0xff; - buf[1] = (dev->filters >> 8) & 0xff; - buf[2] = (dev->filters >> 16) & 0xff; - buf[3] = (dev->filters >> 24) & 0xff; - ret = rtl2832_bulk_write(client, 0x062, buf, 4); + buf[0] = (*filters >> 0) & 0xff; + buf[1] = (*filters >> 8) & 0xff; + buf[2] = (*filters >> 16) & 0xff; + buf[3] = (*filters >> 24) & 0xff; + if (dev->slave_demod_active) + ret = rtl2832_bulk_write(client, 0x022, buf, 4); + else + ret = rtl2832_bulk_write(client, 0x062, buf, 4); if (ret) goto err; /* add PID */ buf[0] = (pid >> 8) & 0xff; buf[1] = (pid >> 0) & 0xff; - ret = rtl2832_bulk_write(client, 0x066 + 2 * index, buf, 2); + if (dev->slave_demod_active) + ret = rtl2832_bulk_write(client, 0x026 + 2 * index, buf, 2); + else + ret = rtl2832_bulk_write(client, 0x066 + 2 * index, buf, 2); if (ret) goto err; diff --git a/drivers/media/dvb-frontends/rtl2832_priv.h b/drivers/media/dvb-frontends/rtl2832_priv.h index c3a922c..b95a7b7 100644 --- a/drivers/media/dvb-frontends/rtl2832_priv.h +++ b/drivers/media/dvb-frontends/rtl2832_priv.h @@ -46,6 +46,8 @@ struct rtl2832_dev { bool sleeping; struct delayed_work i2c_gate_work; unsigned long filters; /* PID filter */ + unsigned long filters_slave; /* PID filter */ + int slave_demod_active; }; struct rtl2832_reg_entry { -- 2.1.0