From patchwork Tue Mar 6 16:39:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Scheller X-Patchwork-Id: 10262225 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id A000E6016D for ; Tue, 6 Mar 2018 16:39:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8E6872904C for ; Tue, 6 Mar 2018 16:39:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 81A8A2904F; Tue, 6 Mar 2018 16:39:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 95C632904C for ; Tue, 6 Mar 2018 16:39:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753507AbeCFQjU (ORCPT ); Tue, 6 Mar 2018 11:39:20 -0500 Received: from mail-wm0-f65.google.com ([74.125.82.65]:38611 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750838AbeCFQjT (ORCPT ); Tue, 6 Mar 2018 11:39:19 -0500 Received: by mail-wm0-f65.google.com with SMTP id z9so23355242wmb.3 for ; Tue, 06 Mar 2018 08:39:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=W+6MeznJe7R1Ll+c7Tjm+vH1P/tyYgzM5R1Vffe8LVc=; b=lCMD6AVusXNZcpfmgq3vZaH3qvLXwRLGgWnSikSu817la4ne9gsg+OzPhkI7ibByF3 nKdHm0Ht4hQ5UemGOdvPqrMj/OZkWf2eVMxjko0DEzi0b6fJPBP1l/VjwD85SmHFgA6l iwecyggHKzsmdxwMk00Smo198R0N2tbPgrHlId55ZYMBm8CpxhGOrvaZgD9+BX0GkkN0 EIOOI0Z6LWYYwY1D0fYsNDv9uNpu2V2fqYZFv3KA6a5I+mTvyyqB6Rzp61AiFWGyWL// mMirJrqZg8tbYY0Lc4NeHOS9V7avMQaNchCOCGYfAfdWFuAhoXR/bjam+vqCtPT3aic0 +fZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=W+6MeznJe7R1Ll+c7Tjm+vH1P/tyYgzM5R1Vffe8LVc=; b=CqpHmlvbsKPI6qEW8J8Gjj9/OowKq7ma5sh28d8BjmFLF32rvrXepCet9yF64gfU1f ST4Orvq0TR4hGfCw5tyXLW6/brHohiZ1xPayuDDLO/UMf8VpKisi1HYXjAQblt4rxrrl 4qqdzShJJuUQzqSx5xHp1tKf8G+RbznmB8+gUFJ2zCDie0vKlSsIzKTPDakl+FUM3aih YkCrEBHONLI9yM0adYScyPVVrB1/J/b+XDmHZTgCnVlVKaa6YJRNBwJ4X8fglNyjJOmD Kfx4nP/WEnRghykp1/C8FNBZU4YkdetuKX47kAt86iEiSqLm97t9LMk4uyIJyMVIXYAP bCzw== X-Gm-Message-State: AElRT7HgJ8aHAyBCYRITGgriyQGozYYUkOdcYos4O6e96H+IHunzGBT3 VtroKySefeHf2OSgRubMPyuMKA== X-Google-Smtp-Source: AG47ELvTntCYJRBqhFaDWMcI79scmAqT3sx7CKtWUV66oz+3FyzHcOoeGAb12xUpcXC62M9upBQHaw== X-Received: by 10.28.52.9 with SMTP id b9mr12758958wma.134.1520354357539; Tue, 06 Mar 2018 08:39:17 -0800 (PST) Received: from dvbdev.wuest.de (ip-84-118-193-200.unity-media.net. [84.118.193.200]) by smtp.gmail.com with ESMTPSA id 69sm9978573wmp.36.2018.03.06.08.39.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 06 Mar 2018 08:39:16 -0800 (PST) From: Daniel Scheller To: linux-media@vger.kernel.org, mchehab@kernel.org, mchehab@s-opensource.com Cc: jasmin@anw.at Subject: [PATCH 1/4] [media] ddbridge: adapt cxd2099 attach to new i2c_client way Date: Tue, 6 Mar 2018 17:39:10 +0100 Message-Id: <20180306163913.1519-2-d.scheller.oss@gmail.com> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180306163913.1519-1-d.scheller.oss@gmail.com> References: <20180306163913.1519-1-d.scheller.oss@gmail.com> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Daniel Scheller Change the way the cxd2099 hardware is being attached to the new I2C client interface way. Signed-off-by: Daniel Scheller Signed-off-by: Jasmin Jessich --- drivers/media/pci/ddbridge/ddbridge-ci.c | 62 +++++++++++++++++++++++++++++--- drivers/media/pci/ddbridge/ddbridge.h | 1 + 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/drivers/media/pci/ddbridge/ddbridge-ci.c b/drivers/media/pci/ddbridge/ddbridge-ci.c index ed19890710d6..6585ef54ac22 100644 --- a/drivers/media/pci/ddbridge/ddbridge-ci.c +++ b/drivers/media/pci/ddbridge/ddbridge-ci.c @@ -172,6 +172,7 @@ static void ci_attach(struct ddb_port *port) memcpy(&ci->en, &en_templ, sizeof(en_templ)); ci->en.data = ci; port->en = &ci->en; + port->en_freedata = 1; ci->port = port; ci->nr = port->nr - 2; } @@ -304,6 +305,7 @@ static void ci_xo2_attach(struct ddb_port *port) memcpy(&ci->en, &en_xo2_templ, sizeof(en_xo2_templ)); ci->en.data = ci; port->en = &ci->en; + port->en_freedata = 1; ci->port = port; ci->nr = port->nr - 2; ci->port->creg = 0; @@ -311,20 +313,58 @@ static void ci_xo2_attach(struct ddb_port *port) write_creg(ci, 0x08, 0x08); } -static struct cxd2099_cfg cxd_cfg = { +static const struct cxd2099_cfg cxd_cfgtmpl = { .bitrate = 72000, - .adr = 0x40, .polarity = 1, .clock_mode = 1, .max_i2c = 512, }; +static int ci_cxd2099_attach(struct ddb_port *port, u32 bitrate) +{ + struct cxd2099_cfg cxd_cfg = cxd_cfgtmpl; + struct i2c_client *client; + struct i2c_board_info board_info = { + .type = "cxd2099", + .addr = 0x40, + .platform_data = &cxd_cfg, + }; + + cxd_cfg.bitrate = bitrate; + cxd_cfg.en = &port->en; + + request_module(board_info.type); + + client = i2c_new_device(&port->i2c->adap, &board_info); + if (!client || !client->dev.driver) + goto err_ret; + + if (!try_module_get(client->dev.driver->owner)) + goto err_i2c; + + if (!port->en) + goto err_i2c; + + port->dvb[0].i2c_client[0] = client; + port->en_freedata = 0; + return 0; + +err_i2c: + i2c_unregister_device(client); +err_ret: + dev_err(port->dev->dev, "CXD2099AR attach failed\n"); + return -ENODEV; +} + int ddb_ci_attach(struct ddb_port *port, u32 bitrate) { + int ret; + switch (port->type) { case DDB_CI_EXTERNAL_SONY: - cxd_cfg.bitrate = bitrate; - port->en = cxd2099_attach(&cxd_cfg, port, &port->i2c->adap); + ret = ci_cxd2099_attach(port, bitrate); + if (ret) + return -ENODEV; break; case DDB_CI_EXTERNAL_XO2: case DDB_CI_EXTERNAL_XO2_B: @@ -345,11 +385,23 @@ int ddb_ci_attach(struct ddb_port *port, u32 bitrate) void ddb_ci_detach(struct ddb_port *port) { + struct i2c_client *client; + if (port->dvb[0].dev) dvb_unregister_device(port->dvb[0].dev); if (port->en) { dvb_ca_en50221_release(port->en); - kfree(port->en->data); + + client = port->dvb[0].i2c_client[0]; + if (client) { + module_put(client->dev.driver->owner); + i2c_unregister_device(client); + } + + /* free alloc'ed memory if needed */ + if (port->en_freedata) + kfree(port->en->data); + port->en = NULL; } } diff --git a/drivers/media/pci/ddbridge/ddbridge.h b/drivers/media/pci/ddbridge/ddbridge.h index 095457737bc1..f223dc6c9963 100644 --- a/drivers/media/pci/ddbridge/ddbridge.h +++ b/drivers/media/pci/ddbridge/ddbridge.h @@ -276,6 +276,7 @@ struct ddb_port { struct ddb_input *input[2]; struct ddb_output *output; struct dvb_ca_en50221 *en; + u8 en_freedata; struct ddb_dvb dvb[2]; u32 gap; u32 obr;