All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] media_build: Backport fixes and patches
@ 2018-04-18 16:12 Brad Love
  2018-04-18 16:12 ` [PATCH 1/5] Enable two drivers with backports Brad Love
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Brad Love @ 2018-04-18 16:12 UTC (permalink / raw)
  To: linux-media; +Cc: Brad Love

This patch set provides lgdt3306a backports for
v3.4, v3.6, and v4.6. The v4l/versions.txt file
is also fixed up for a couple drivers with
included backports.


Brad Love (5):
  Enable two drivers with backports
  lgdt3306a v3.4 i2c mux backport
  lgdt3306a v3.6 i2c mux backport
  lgdt3306a v4.6 i2c mux backport
  Remove lgdt3306a v4.7 limitation

 backports/v3.4_i2c_add_mux_adapter.patch |  14 ++
 backports/v3.6_i2c_add_mux_adapter.patch |  12 ++
 backports/v4.6_i2c_mux.patch             | 213 +++++++++++++++++++++++++++++++
 v4l/versions.txt                         |   3 -
 4 files changed, 239 insertions(+), 3 deletions(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/5] Enable two drivers with backports
  2018-04-18 16:12 [PATCH 0/5] media_build: Backport fixes and patches Brad Love
@ 2018-04-18 16:12 ` Brad Love
  2018-04-18 16:12 ` [PATCH 2/5] lgdt3306a v3.4 i2c mux backport Brad Love
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Brad Love @ 2018-04-18 16:12 UTC (permalink / raw)
  To: linux-media; +Cc: Brad Love

si2168 has i2c mux related backports to v3.4
cx231xx has i2c mux related backports to v3.4

Both drivers are tested working in kernel v3.2

Signed-off-by: Brad Love <brad@nextdimension.cc>
---
 v4l/versions.txt | 2 --
 1 file changed, 2 deletions(-)

diff --git a/v4l/versions.txt b/v4l/versions.txt
index 4912fc2..6149f7a 100644
--- a/v4l/versions.txt
+++ b/v4l/versions.txt
@@ -15,9 +15,7 @@ VIDEO_OV5670
 
 [4.7.0]
 # needs i2c_mux_alloc
-VIDEO_CX231XX
 DVB_LGDT3306A
-DVB_SI2168
 DVB_RTL2830
 DVB_RTL2832
 DVB_M88DS3103
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/5] lgdt3306a v3.4 i2c mux backport
  2018-04-18 16:12 [PATCH 0/5] media_build: Backport fixes and patches Brad Love
  2018-04-18 16:12 ` [PATCH 1/5] Enable two drivers with backports Brad Love
@ 2018-04-18 16:12 ` Brad Love
  2018-04-18 16:12 ` [PATCH 3/5] lgdt3306a v3.6 " Brad Love
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Brad Love @ 2018-04-18 16:12 UTC (permalink / raw)
  To: linux-media; +Cc: Brad Love

Trivial patch

Signed-off-by: Brad Love <brad@nextdimension.cc>
---
 backports/v3.4_i2c_add_mux_adapter.patch | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/backports/v3.4_i2c_add_mux_adapter.patch b/backports/v3.4_i2c_add_mux_adapter.patch
index 5f93275..fc1b697 100644
--- a/backports/v3.4_i2c_add_mux_adapter.patch
+++ b/backports/v3.4_i2c_add_mux_adapter.patch
@@ -66,3 +66,17 @@ index 725c13a..35e3ac1 100644
  				dev /* mux_priv */,
  				0,
  				mux_no /* chan_id */,
+diff --git a/drivers/media/dvb-frontends/lgdt3306a.c b/drivers/media/dvb-frontends/lgdt3306a.c
+--- a/drivers/media/dvb-frontends/lgdt3306a.c	2018-01-23 22:15:12.146359404 +0000
++++ b/drivers/media/dvb-frontends/lgdt3306a.c	2018-01-23 22:16:01.055381481 +0000
+@@ -2300,8 +2300,8 @@ static int lgdt3306a_probe(struct i2c_cl
+ 	state = fe->demodulator_priv;
+ 
+ 	/* create mux i2c adapter for tuner */
+-	state->i2c_adap = i2c_add_mux_adapter(client->adapter, &client->dev,
+-			client, 0, 0, lgdt3306a_select, lgdt3306a_deselect);
++	state->i2c_adap = i2c_add_mux_adapter(client->adapter, client,
++				0, 0, lgdt3306a_select, lgdt3306a_deselect);
+ 	if (state->i2c_adap == NULL) {
+ 		ret = -ENODEV;
+ 		goto err_kfree;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/5] lgdt3306a v3.6 i2c mux backport
  2018-04-18 16:12 [PATCH 0/5] media_build: Backport fixes and patches Brad Love
  2018-04-18 16:12 ` [PATCH 1/5] Enable two drivers with backports Brad Love
  2018-04-18 16:12 ` [PATCH 2/5] lgdt3306a v3.4 i2c mux backport Brad Love
@ 2018-04-18 16:12 ` Brad Love
  2018-04-18 16:12 ` [PATCH 4/5] lgdt3306a v4.6 " Brad Love
  2018-04-18 16:12 ` [PATCH 5/5] Remove lgdt3306a v4.7 limitation Brad Love
  4 siblings, 0 replies; 6+ messages in thread
From: Brad Love @ 2018-04-18 16:12 UTC (permalink / raw)
  To: linux-media; +Cc: Brad Love

Another trivial patch

Signed-off-by: Brad Love <brad@nextdimension.cc>
---
 backports/v3.6_i2c_add_mux_adapter.patch | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/backports/v3.6_i2c_add_mux_adapter.patch b/backports/v3.6_i2c_add_mux_adapter.patch
index 8172316..d26b82b 100644
--- a/backports/v3.6_i2c_add_mux_adapter.patch
+++ b/backports/v3.6_i2c_add_mux_adapter.patch
@@ -62,3 +62,15 @@ index a29c345..725c13a 100644
  				&cx231xx_i2c_mux_select,
  				NULL);
  
+diff --git a/drivers/media/dvb-frontends/lgdt3306a.c b/drivers/media/dvb-frontends/lgdt3306a.c
+--- a/drivers/media/dvb-frontends/lgdt3306a.c	2018-01-23 22:13:14.095893561 +0000
++++ b/drivers/media/dvb-frontends/lgdt3306a.c	2018-01-23 22:13:52.796701755 +0000
+@@ -2301,7 +2301,7 @@ static int lgdt3306a_probe(struct i2c_cl
+ 
+ 	/* create mux i2c adapter for tuner */
+ 	state->i2c_adap = i2c_add_mux_adapter(client->adapter, &client->dev,
+-			client, 0, 0, 0, lgdt3306a_select, lgdt3306a_deselect);
++			client, 0, 0, lgdt3306a_select, lgdt3306a_deselect);
+ 	if (state->i2c_adap == NULL) {
+ 		ret = -ENODEV;
+ 		goto err_kfree;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 4/5] lgdt3306a v4.6 i2c mux backport
  2018-04-18 16:12 [PATCH 0/5] media_build: Backport fixes and patches Brad Love
                   ` (2 preceding siblings ...)
  2018-04-18 16:12 ` [PATCH 3/5] lgdt3306a v3.6 " Brad Love
@ 2018-04-18 16:12 ` Brad Love
  2018-04-18 16:12 ` [PATCH 5/5] Remove lgdt3306a v4.7 limitation Brad Love
  4 siblings, 0 replies; 6+ messages in thread
From: Brad Love @ 2018-04-18 16:12 UTC (permalink / raw)
  To: linux-media; +Cc: Brad Love

Based on other included backports.

Includes unlocked i2c gate control callbacks.

Signed-off-by: Brad Love <brad@nextdimension.cc>
---
 backports/v4.6_i2c_mux.patch | 213 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 213 insertions(+)

diff --git a/backports/v4.6_i2c_mux.patch b/backports/v4.6_i2c_mux.patch
index 8f1ab88..ce89faa 100644
--- a/backports/v4.6_i2c_mux.patch
+++ b/backports/v4.6_i2c_mux.patch
@@ -1455,3 +1455,216 @@ index c76e78f..5c805f8 100644
  		pdata.dvb_frontend = adap->fe[0];
  		pdata.dvb_usb_device = d;
  		pdata.v4l2_subdev = subdev;
+diff --git a/drivers/media/dvb-frontends/lgdt3306a.c b/drivers/media/dvb-frontends/lgdt3306a.c
+index ab16d3a..2988262 100644
+--- a/drivers/media/dvb-frontends/lgdt3306a.c
++++ b/drivers/media/dvb-frontends/lgdt3306a.c
+@@ -79,8 +79,6 @@ struct lgdt3306a_state {
+ 	enum fe_modulation current_modulation;
+ 	u32 current_frequency;
+ 	u32 snr;
+-
+-	struct i2c_mux_core *muxc;
+ };
+ 
+ /*
+@@ -2182,20 +2180,142 @@ static const struct dvb_frontend_ops lgdt3306a_ops = {
+ 	.search               = lgdt3306a_search,
+ };
+ 
+-static int lgdt3306a_select(struct i2c_mux_core *muxc, u32 chan)
++/*
++ * I2C gate logic
++ * We must use unlocked I2C I/O because I2C adapter lock is already taken
++ * by the caller (usually tuner driver).
++ * select/unselect are unlocked versions of lgdt3306a_i2c_gate_ctrl
++ */
++static int lgdt3306a_select(struct i2c_adapter *adap, void *mux_priv, u32 chan)
+ {
+-	struct i2c_client *client = i2c_mux_priv(muxc);
+-	struct lgdt3306a_state *state = i2c_get_clientdata(client);
++	struct i2c_client *client = mux_priv;
++	int ret;
++	u8 val;
++	u8 buf[3];
++
++	struct i2c_msg read_msg_1 = {
++		.addr = client->addr,
++		.flags = 0,
++		.buf = "\x00\x02",
++		.len = 2,
++	};
++	struct i2c_msg read_msg_2 = {
++		.addr = client->addr,
++		.flags = I2C_M_RD,
++		.buf = &val,
++		.len = 1,
++	};
++
++	struct i2c_msg write_msg = {
++		.addr = client->addr,
++		.flags = 0,
++		.len = 3,
++		.buf = buf,
++	};
++
++	ret = __i2c_transfer(client->adapter, &read_msg_1, 1);
++	if (ret != 1)
++	{
++		pr_err("error (addr %02x reg 0x002 error (ret == %i)\n",
++		       client->addr, ret);
++		if (ret < 0)
++			return ret;
++		else
++			return -EREMOTEIO;
++	}
+ 
+-	return lgdt3306a_i2c_gate_ctrl(&state->frontend, 1);
++	ret = __i2c_transfer(client->adapter, &read_msg_2, 1);
++	if (ret != 1)
++	{
++		pr_err("error (addr %02x reg 0x002 error (ret == %i)\n",
++		       client->addr, ret);
++		if (ret < 0)
++			return ret;
++		else
++			return -EREMOTEIO;
++	}
++
++	buf[0] = 0x00;
++	buf[1] = 0x02;
++	val &= 0x7F;
++	val |= LG3306_TUNERI2C_ON;
++	buf[2] = val;
++	ret = __i2c_transfer(client->adapter, &write_msg, 1);
++	if (ret != 1) {
++		pr_err("error (addr %02x %02x <- %02x, err = %i)\n",
++		       write_msg.buf[0], write_msg.buf[1], write_msg.buf[2], ret);
++		if (ret < 0)
++			return ret;
++		else
++			return -EREMOTEIO;
++	}
++	return 0;
+ }
+ 
+-static int lgdt3306a_deselect(struct i2c_mux_core *muxc, u32 chan)
++static int lgdt3306a_deselect(struct i2c_adapter *adap, void *mux_priv, u32 chan)
+ {
+-	struct i2c_client *client = i2c_mux_priv(muxc);
+-	struct lgdt3306a_state *state = i2c_get_clientdata(client);
++	struct i2c_client *client = mux_priv;
++	int ret;
++	u8 val;
++	u8 buf[3];
++
++	struct i2c_msg read_msg_1 = {
++		.addr = client->addr,
++		.flags = 0,
++		.buf = "\x00\x02",
++		.len = 2,
++	};
++	struct i2c_msg read_msg_2 = {
++		.addr = client->addr,
++		.flags = I2C_M_RD,
++		.buf = &val,
++		.len = 1,
++	};
+ 
+-	return lgdt3306a_i2c_gate_ctrl(&state->frontend, 0);
++	struct i2c_msg write_msg = {
++		.addr = client->addr,
++		.flags = 0,
++		.len = 3,
++		.buf = buf,
++	};
++
++	ret = __i2c_transfer(client->adapter, &read_msg_1, 1);
++	if (ret != 1)
++	{
++		pr_err("error (addr %02x reg 0x002 error (ret == %i)\n",
++		       client->addr, ret);
++		if (ret < 0)
++			return ret;
++		else
++			return -EREMOTEIO;
++	}
++
++	ret = __i2c_transfer(client->adapter, &read_msg_2, 1);
++	if (ret != 1)
++	{
++		pr_err("error (addr %02x reg 0x002 error (ret == %i)\n",
++		       client->addr, ret);
++		if (ret < 0)
++			return ret;
++		else
++			return -EREMOTEIO;
++	}
++
++	buf[0] = 0x00;
++	buf[1] = 0x02;
++	val &= 0x7F;
++	val |= LG3306_TUNERI2C_OFF;
++	buf[2] = val;
++	ret = __i2c_transfer(client->adapter, &write_msg, 1);
++	if (ret != 1) {
++		pr_err("error (addr %02x %02x <- %02x, err = %i)\n",
++		       write_msg.buf[0], write_msg.buf[1], write_msg.buf[2], ret);
++		if (ret < 0)
++			return ret;
++		else
++			return -EREMOTEIO;
++	}
++	return 0;
+ }
+ 
+ static int lgdt3306a_probe(struct i2c_client *client,
+@@ -2227,21 +2347,16 @@ static int lgdt3306a_probe(struct i2c_client *client,
+ 	state->frontend.ops.release = NULL;
+ 
+ 	/* create mux i2c adapter for tuner */
+-	state->muxc = i2c_mux_alloc(client->adapter, &client->dev,
+-				  1, 0, I2C_MUX_LOCKED,
+-				  lgdt3306a_select, lgdt3306a_deselect);
+-	if (!state->muxc) {
+-		ret = -ENOMEM;
++	state->i2c_adap = i2c_add_mux_adapter(client->adapter, &client->dev,
++			client, 0, 0, 0, lgdt3306a_select, lgdt3306a_deselect);
++	if (state->i2c_adap == NULL) {
++		ret = -ENODEV;
+ 		goto err_kfree;
+ 	}
+-	state->muxc->priv = client;
+-	ret = i2c_mux_add_adapter(state->muxc, 0, 0, 0);
+-	if (ret)
+-		goto err_kfree;
+ 
+ 	/* create dvb_frontend */
+ 	fe->ops.i2c_gate_ctrl = NULL;
+-	*config->i2c_adapter = state->muxc->adapter[0];
++	*config->i2c_adapter = state->i2c_adap;
+ 	*config->fe = fe;
+ 
+ 	dev_info(&client->dev, "LG Electronics LGDT3306A successfully identified\n");
+@@ -2261,7 +2376,7 @@ static int lgdt3306a_remove(struct i2c_client *client)
+ {
+ 	struct lgdt3306a_state *state = i2c_get_clientdata(client);
+ 
+-	i2c_mux_del_adapters(state->muxc);
++	i2c_del_mux_adapter(state->i2c_adap);
+ 
+ 	state->frontend.ops.release = NULL;
+ 	state->frontend.demodulator_priv = NULL;
+diff --git a/drivers/media/dvb-frontends/lgdt3306a.h b/drivers/media/dvb-frontends/lgdt3306a.h
+index 8b53044..99b28be 100644
+--- a/drivers/media/dvb-frontends/lgdt3306a.h
++++ b/drivers/media/dvb-frontends/lgdt3306a.h
+@@ -21,6 +21,8 @@
+ #include <linux/i2c.h>
+ #include <media/dvb_frontend.h>
+ 
++#define LG3306_TUNERI2C_ON  0x00
++#define LG3306_TUNERI2C_OFF 0x80
+ 
+ enum lgdt3306a_mpeg_mode {
+ 	LGDT3306A_MPEG_PARALLEL = 0,
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 5/5] Remove lgdt3306a v4.7 limitation
  2018-04-18 16:12 [PATCH 0/5] media_build: Backport fixes and patches Brad Love
                   ` (3 preceding siblings ...)
  2018-04-18 16:12 ` [PATCH 4/5] lgdt3306a v4.6 " Brad Love
@ 2018-04-18 16:12 ` Brad Love
  4 siblings, 0 replies; 6+ messages in thread
From: Brad Love @ 2018-04-18 16:12 UTC (permalink / raw)
  To: linux-media; +Cc: Brad Love

Backports are now included for lgdt3306a back
to v3.4 and the driver has been well tested
back to kernel v3.2

Signed-off-by: Brad Love <brad@nextdimension.cc>
---
 v4l/versions.txt | 1 -
 1 file changed, 1 deletion(-)

diff --git a/v4l/versions.txt b/v4l/versions.txt
index 6149f7a..6220485 100644
--- a/v4l/versions.txt
+++ b/v4l/versions.txt
@@ -15,7 +15,6 @@ VIDEO_OV5670
 
 [4.7.0]
 # needs i2c_mux_alloc
-DVB_LGDT3306A
 DVB_RTL2830
 DVB_RTL2832
 DVB_M88DS3103
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2018-04-18 16:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-18 16:12 [PATCH 0/5] media_build: Backport fixes and patches Brad Love
2018-04-18 16:12 ` [PATCH 1/5] Enable two drivers with backports Brad Love
2018-04-18 16:12 ` [PATCH 2/5] lgdt3306a v3.4 i2c mux backport Brad Love
2018-04-18 16:12 ` [PATCH 3/5] lgdt3306a v3.6 " Brad Love
2018-04-18 16:12 ` [PATCH 4/5] lgdt3306a v4.6 " Brad Love
2018-04-18 16:12 ` [PATCH 5/5] Remove lgdt3306a v4.7 limitation Brad Love

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.