aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Rosin <peda@axentia.se>2016-04-20 02:41:13 -0400
committerWolfram Sang <wsa@the-dreams.de>2016-04-22 09:00:14 -0400
commita0119159e66e2e67154384d7e20a0ebf46cfa32b (patch)
tree604599a3aae09641616d9ef4549f37d7220b04aa
parente00fed40f48e43bdb5e018156d077c65b61f93bf (diff)
[media] rtl2830: convert to use an explicit i2c mux core
Allocate an explicit i2c mux core to handle parent and child adapters etc. Update the select op to be in terms of the i2c mux core instead of the child adapter. Tested-by: Antti Palosaari <crope@iki.fi> Reviewed-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Peter Rosin <peda@axentia.se> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
-rw-r--r--drivers/media/dvb-frontends/rtl2830.c20
-rw-r--r--drivers/media/dvb-frontends/rtl2830_priv.h2
2 files changed, 13 insertions, 9 deletions
diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index 3f96429af0e5..d25d1e0cd4ca 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -677,9 +677,9 @@ err:
677 * adapter lock is already taken by tuner driver. 677 * adapter lock is already taken by tuner driver.
678 * Gate is closed automatically after single I2C transfer. 678 * Gate is closed automatically after single I2C transfer.
679 */ 679 */
680static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id) 680static int rtl2830_select(struct i2c_mux_core *muxc, u32 chan_id)
681{ 681{
682 struct i2c_client *client = mux_priv; 682 struct i2c_client *client = i2c_mux_priv(muxc);
683 struct rtl2830_dev *dev = i2c_get_clientdata(client); 683 struct rtl2830_dev *dev = i2c_get_clientdata(client);
684 int ret; 684 int ret;
685 685
@@ -712,7 +712,7 @@ static struct i2c_adapter *rtl2830_get_i2c_adapter(struct i2c_client *client)
712 712
713 dev_dbg(&client->dev, "\n"); 713 dev_dbg(&client->dev, "\n");
714 714
715 return dev->adapter; 715 return dev->muxc->adapter[0];
716} 716}
717 717
718/* 718/*
@@ -865,12 +865,16 @@ static int rtl2830_probe(struct i2c_client *client,
865 goto err_regmap_exit; 865 goto err_regmap_exit;
866 866
867 /* create muxed i2c adapter for tuner */ 867 /* create muxed i2c adapter for tuner */
868 dev->adapter = i2c_add_mux_adapter(client->adapter, &client->dev, 868 dev->muxc = i2c_mux_alloc(client->adapter, &client->dev, 1, 0, 0,
869 client, 0, 0, 0, rtl2830_select, NULL); 869 rtl2830_select, NULL);
870 if (dev->adapter == NULL) { 870 if (!dev->muxc) {
871 ret = -ENODEV; 871 ret = -ENOMEM;
872 goto err_regmap_exit; 872 goto err_regmap_exit;
873 } 873 }
874 dev->muxc->priv = client;
875 ret = i2c_mux_add_adapter(dev->muxc, 0, 0, 0);
876 if (ret)
877 goto err_regmap_exit;
874 878
875 /* create dvb frontend */ 879 /* create dvb frontend */
876 memcpy(&dev->fe.ops, &rtl2830_ops, sizeof(dev->fe.ops)); 880 memcpy(&dev->fe.ops, &rtl2830_ops, sizeof(dev->fe.ops));
@@ -903,7 +907,7 @@ static int rtl2830_remove(struct i2c_client *client)
903 /* stop statistics polling */ 907 /* stop statistics polling */
904 cancel_delayed_work_sync(&dev->stat_work); 908 cancel_delayed_work_sync(&dev->stat_work);
905 909
906 i2c_del_mux_adapter(dev->adapter); 910 i2c_mux_del_adapters(dev->muxc);
907 regmap_exit(dev->regmap); 911 regmap_exit(dev->regmap);
908 kfree(dev); 912 kfree(dev);
909 913
diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
index cf793f39a09b..da4909543da2 100644
--- a/drivers/media/dvb-frontends/rtl2830_priv.h
+++ b/drivers/media/dvb-frontends/rtl2830_priv.h
@@ -29,7 +29,7 @@ struct rtl2830_dev {
29 struct rtl2830_platform_data *pdata; 29 struct rtl2830_platform_data *pdata;
30 struct i2c_client *client; 30 struct i2c_client *client;
31 struct regmap *regmap; 31 struct regmap *regmap;
32 struct i2c_adapter *adapter; 32 struct i2c_mux_core *muxc;
33 struct dvb_frontend fe; 33 struct dvb_frontend fe;
34 bool sleeping; 34 bool sleeping;
35 unsigned long filters; 35 unsigned long filters;