Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp4226183yba; Sun, 12 May 2019 07:54:58 -0700 (PDT) X-Google-Smtp-Source: APXvYqxVRbiL5k0VyoYOQDgn7HhN/BdEw3qNIHLBOpNJHbLjwFAxDzsB6S8/PvuvfAy3dGuFWqoq X-Received: by 2002:a17:902:4283:: with SMTP id h3mr2230816pld.214.1557672898051; Sun, 12 May 2019 07:54:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1557672898; cv=none; d=google.com; s=arc-20160816; b=JculK+gybEMAbz3F56XoqrrJLl0FarULH+kCLxM/yASSywQBUbJ/YXdJB8EeSvAMFC bjyYxtKQyrRHr7wfOb8G/zFIlAtfDch9j+aGtn4mDGUUdL9BEj+yS+pE4U7AZzCwXs7N RGymX66iFeBsgwvnW3xwQ9bHKlGrOQBqB7ci/RBWmhnUSzxKqcL1WsHTtPfrimz2reTk Vkqz4T/B7CfG4/gODkqwl3BBp/v3j54Mwhvmg6TXlMgvzXvcS4lT5gtV7U2dwMqSI8Fw tOQoMaKq9arKdOYGsc+qMirTZn9UMqMd4i6KGFiNTnrkQE3VXHc4GhXGLQH6ggJvFBPU J9gg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :message-id:from:references:to:subject; bh=S/4jljJbW8gUOTLu4c7PLwlo2IzNGX+kK2Rv3sdbuxE=; b=pbKko6v75194W1NOpViAAmBENtea7pOTyOeCsGlAYiNiUwakc9HGld93TZgvtts14t lzPgreBrx9o8g3PJlqUptnLYWlIbnnbhdgwGy7SHXRI5K9ivKHUsDEnBhaaiQVBT0KgW /SxhQAR3gezmfbQ24+CIwcrRHBj2w4HTtzx9I6B9TL+uJcC1BlyWKDZTbZfPHib3l5H0 npxNo0kx/WnUJV0ws9K5sMXOfVaF4drBW7R8LiX3Ea0kKWx7JuD7k4ijdM/E5cFeoE/A SyCuavvko4I5ywngIRvXMIS2t9R4WQNn4C1pnV/U/wWFRDsc3Q8bt+PM7Dyu39wjWtPw fGmw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t16si15175137plm.65.2019.05.12.07.54.29; Sun, 12 May 2019 07:54:58 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726664AbfELOxL (ORCPT + 99 others); Sun, 12 May 2019 10:53:11 -0400 Received: from mout2.fh-giessen.de ([212.201.18.46]:48710 "EHLO mout2.fh-giessen.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726446AbfELOxK (ORCPT ); Sun, 12 May 2019 10:53:10 -0400 Received: from mx2.fh-giessen.de ([212.201.18.41]) by mout2.fh-giessen.de with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1hPpqd-0003d0-Gc; Sun, 12 May 2019 16:53:07 +0200 Received: from mailgate-1.its.fh-giessen.de ([212.201.18.15]) by mx2.fh-giessen.de with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1hPpqd-00E2sQ-Cl; Sun, 12 May 2019 16:53:07 +0200 Received: from p2e56130f.dip0.t-ipconnect.de ([46.86.19.15] helo=[192.168.1.24]) by mailgate-1.its.fh-giessen.de with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1hPpqd-000Do4-3h; Sun, 12 May 2019 16:53:07 +0200 Subject: Re: [PATCH] drivers/media/dvb-frontends: Implement probe/remove for stv6110x To: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, mchehab@kernel.org References: <20190509195118.23027-1-tobias.johannes.klausmann@mni.thm.de> From: Tobias Klausmann Message-ID: Date: Sun, 12 May 2019 16:53:06 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.0a1 MIME-Version: 1.0 In-Reply-To: <20190509195118.23027-1-tobias.johannes.klausmann@mni.thm.de> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Ping, comments for this patch are appreciated! Thanks, Tobias On 09.05.19 21:51, Tobias Klausmann wrote: > Refactor out the common parts of stv6110x_probe() and stv6110x_attach() into > separate functions. > > This provides the needed functionality to use dvb_module_probe() instead of > dvb_attach()! > > Signed-off-by: Tobias Klausmann > --- > drivers/media/dvb-frontends/stv6110x.c | 125 ++++++++++++++++---- > drivers/media/dvb-frontends/stv6110x.h | 3 + > drivers/media/dvb-frontends/stv6110x_priv.h | 3 +- > 3 files changed, 109 insertions(+), 22 deletions(-) > > diff --git a/drivers/media/dvb-frontends/stv6110x.c b/drivers/media/dvb-frontends/stv6110x.c > index 82c002d3833a..17bc7adf3771 100644 > --- a/drivers/media/dvb-frontends/stv6110x.c > +++ b/drivers/media/dvb-frontends/stv6110x.c > @@ -345,6 +345,33 @@ static void stv6110x_release(struct dvb_frontend *fe) > kfree(stv6110x); > } > > +void st6110x_init_regs(struct stv6110x_state *stv6110x) > +{ > + u8 default_regs[] = {0x07, 0x11, 0xdc, 0x85, 0x17, 0x01, 0xe6, 0x1e}; > + > + memcpy(stv6110x->regs, default_regs, 8); > +} > + > +void stv6110x_setup_divider(struct stv6110x_state *stv6110x) > +{ > + switch (stv6110x->config->clk_div) { > + default: > + case 1: > + STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 0); > + break; > + case 2: > + STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 1); > + break; > + case 4: > + STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 2); > + break; > + case 8: > + case 0: > + STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 3); > + break; > + } > +} > + > static const struct dvb_tuner_ops stv6110x_ops = { > .info = { > .name = "STV6110(A) Silicon Tuner", > @@ -354,7 +381,7 @@ static const struct dvb_tuner_ops stv6110x_ops = { > .release = stv6110x_release > }; > > -static const struct stv6110x_devctl stv6110x_ctl = { > +static struct stv6110x_devctl stv6110x_ctl = { > .tuner_init = stv6110x_init, > .tuner_sleep = stv6110x_sleep, > .tuner_set_mode = stv6110x_set_mode, > @@ -368,39 +395,77 @@ static const struct stv6110x_devctl stv6110x_ctl = { > .tuner_get_status = stv6110x_get_status, > }; > > +void stv6110x_set_frontend_opts(struct stv6110x_state *stv6110x) > +{ > + stv6110x->frontend->tuner_priv = stv6110x; > + stv6110x->frontend->ops.tuner_ops = stv6110x_ops; > +} > + > +static struct stv6110x_devctl *stv6110x_get_devctl(struct i2c_client *client) > +{ > + struct stv6110x_state *stv6110x = i2c_get_clientdata(client); > + > + dev_dbg(&client->dev, "\n"); > + > + return stv6110x->devctl; > +} > + > +static int stv6110x_probe(struct i2c_client *client, > + const struct i2c_device_id *id) > +{ > + struct stv6110x_config *config = client->dev.platform_data; > + > + struct stv6110x_state *stv6110x; > + > + stv6110x = kzalloc(sizeof(struct stv6110x_state), GFP_KERNEL); > + if (!stv6110x) > + return -ENOMEM; > + > + stv6110x->frontend = config->frontend; > + stv6110x->i2c = client->adapter; > + stv6110x->config = config; > + stv6110x->devctl = &stv6110x_ctl; > + > + st6110x_init_regs(stv6110x); > + stv6110x_setup_divider(stv6110x); > + stv6110x_set_frontend_opts(stv6110x); > + > + printk(KERN_INFO "%s: Probed STV6110x\n", __func__); > + > + i2c_set_clientdata(client, stv6110x); > + > + /* setup callbacks */ > + config->get_devctl = stv6110x_get_devctl; > + > + return 0; > +} > + > +static int stv6110x_remove(struct i2c_client *client) > +{ > + struct stv6110x_state *stv6110x = i2c_get_clientdata(client); > + > + stv6110x_release(stv6110x->frontend); > + return 0; > +} > + > const struct stv6110x_devctl *stv6110x_attach(struct dvb_frontend *fe, > const struct stv6110x_config *config, > struct i2c_adapter *i2c) > { > struct stv6110x_state *stv6110x; > - u8 default_regs[] = {0x07, 0x11, 0xdc, 0x85, 0x17, 0x01, 0xe6, 0x1e}; > > - stv6110x = kzalloc(sizeof (struct stv6110x_state), GFP_KERNEL); > + stv6110x = kzalloc(sizeof(struct stv6110x_state), GFP_KERNEL); > if (!stv6110x) > return NULL; > > + stv6110x->frontend = fe; > stv6110x->i2c = i2c; > stv6110x->config = config; > stv6110x->devctl = &stv6110x_ctl; > - memcpy(stv6110x->regs, default_regs, 8); > > - /* setup divider */ > - switch (stv6110x->config->clk_div) { > - default: > - case 1: > - STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 0); > - break; > - case 2: > - STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 1); > - break; > - case 4: > - STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 2); > - break; > - case 8: > - case 0: > - STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 3); > - break; > - } > + st6110x_init_regs(stv6110x); > + stv6110x_setup_divider(stv6110x); > + stv6110x_set_frontend_opts(stv6110x); > > fe->tuner_priv = stv6110x; > fe->ops.tuner_ops = stv6110x_ops; > @@ -410,6 +475,24 @@ const struct stv6110x_devctl *stv6110x_attach(struct dvb_frontend *fe, > } > EXPORT_SYMBOL(stv6110x_attach); > > +static const struct i2c_device_id stv6110x_id_table[] = { > + {"stv6110x", 0}, > + {} > +}; > +MODULE_DEVICE_TABLE(i2c, stv6110x_id_table); > + > +static struct i2c_driver stv6110x_driver = { > + .driver = { > + .name = "stv6110x", > + .suppress_bind_attrs = true, > + }, > + .probe = stv6110x_probe, > + .remove = stv6110x_remove, > + .id_table = stv6110x_id_table, > +}; > + > +module_i2c_driver(stv6110x_driver); > + > MODULE_AUTHOR("Manu Abraham"); > MODULE_DESCRIPTION("STV6110x Silicon tuner"); > MODULE_LICENSE("GPL"); > diff --git a/drivers/media/dvb-frontends/stv6110x.h b/drivers/media/dvb-frontends/stv6110x.h > index 696b6e5b9e7b..7714adea5242 100644 > --- a/drivers/media/dvb-frontends/stv6110x.h > +++ b/drivers/media/dvb-frontends/stv6110x.h > @@ -27,6 +27,9 @@ struct stv6110x_config { > u8 addr; > u32 refclk; > u8 clk_div; /* divisor value for the output clock */ > + struct dvb_frontend *frontend; > + > + struct stv6110x_devctl* (*get_devctl)(struct i2c_client *); > }; > > enum tuner_mode { > diff --git a/drivers/media/dvb-frontends/stv6110x_priv.h b/drivers/media/dvb-frontends/stv6110x_priv.h > index 109dfaf4ba42..383549d25268 100644 > --- a/drivers/media/dvb-frontends/stv6110x_priv.h > +++ b/drivers/media/dvb-frontends/stv6110x_priv.h > @@ -66,11 +66,12 @@ > #define REFCLOCK_MHz (stv6110x->config->refclk / 1000000) > > struct stv6110x_state { > + struct dvb_frontend *frontend; > struct i2c_adapter *i2c; > const struct stv6110x_config *config; > u8 regs[8]; > > - const struct stv6110x_devctl *devctl; > + struct stv6110x_devctl *devctl; > }; > > #endif /* __STV6110x_PRIV_H */