Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35ef193b authored by Antti Palosaari's avatar Antti Palosaari Committed by Mauro Carvalho Chehab
Browse files

[media] af9035: register it9133 tuner using platform binding



it913x tuner driver is changed to platform model so we need bind it
using platform_device_register_data().

Also remove hacks from I2C adapter where fake tuner driver address
(addr >> 1) were used as those are no longer needed.

Signed-off-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 675ee801
Loading
Loading
Loading
Loading
+60 −64
Original line number Diff line number Diff line
@@ -335,14 +335,12 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
			/* TODO: correct limits > 40 */
			ret = -EOPNOTSUPP;
		} else if ((msg[0].addr == state->af9033_i2c_addr[0]) ||
			   (msg[0].addr == state->af9033_i2c_addr[1]) ||
			   (state->chip_type == 0x9135)) {
			   (msg[0].addr == state->af9033_i2c_addr[1])) {
			/* demod access via firmware interface */
			u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 |
					msg[0].buf[2];

			if (msg[0].addr == state->af9033_i2c_addr[1] ||
			    msg[0].addr == (state->af9033_i2c_addr[1] >> 1))
			if (msg[0].addr == state->af9033_i2c_addr[1])
				reg |= 0x100000;

			ret = af9035_rd_regs(d, reg, &msg[1].buf[0],
@@ -396,14 +394,12 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
			/* TODO: correct limits > 40 */
			ret = -EOPNOTSUPP;
		} else if ((msg[0].addr == state->af9033_i2c_addr[0]) ||
			   (msg[0].addr == state->af9033_i2c_addr[1]) ||
			   (state->chip_type == 0x9135)) {
			   (msg[0].addr == state->af9033_i2c_addr[1])) {
			/* demod access via firmware interface */
			u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 |
					msg[0].buf[2];

			if (msg[0].addr == state->af9033_i2c_addr[1] ||
			    msg[0].addr == (state->af9033_i2c_addr[1] >> 1))
			if (msg[0].addr == state->af9033_i2c_addr[1])
				reg |= 0x100000;

			ret = af9035_wr_regs(d, reg, &msg[0].buf[3],
@@ -1250,30 +1246,11 @@ static int af9035_frontend_detach(struct dvb_usb_adapter *adap)
	struct state *state = adap_to_priv(adap);
	struct dvb_usb_device *d = adap_to_d(adap);
	struct usb_interface *intf = d->intf;
	int demod2;

	dev_dbg(&intf->dev, "adap->id=%d\n", adap->id);

	/*
	 * For dual tuner devices we have to resolve 2nd demod client, as there
	 * is two different kind of tuner drivers; one is using I2C binding
	 * and the other is using DVB attach/detach binding.
	 */
	switch (state->af9033_config[adap->id].tuner) {
	case AF9033_TUNER_IT9135_38:
	case AF9033_TUNER_IT9135_51:
	case AF9033_TUNER_IT9135_52:
	case AF9033_TUNER_IT9135_60:
	case AF9033_TUNER_IT9135_61:
	case AF9033_TUNER_IT9135_62:
		demod2 = 2;
		break;
	default:
		demod2 = 1;
	}

	if (adap->id == 1) {
		if (state->i2c_client[demod2])
		if (state->i2c_client[1])
			af9035_del_i2c_dev(d);
	} else if (adap->id == 0) {
		if (state->i2c_client[0])
@@ -1513,50 +1490,58 @@ static int af9035_tuner_attach(struct dvb_usb_adapter *adap)
	case AF9033_TUNER_IT9135_38:
	case AF9033_TUNER_IT9135_51:
	case AF9033_TUNER_IT9135_52:
	case AF9033_TUNER_IT9135_60:
	case AF9033_TUNER_IT9135_61:
	case AF9033_TUNER_IT9135_62:
	{
		struct it913x_config it913x_config = {
		struct platform_device *pdev;
		struct it913x_platform_data it913x_pdata = {
			.regmap = state->af9033_config[adap->id].regmap,
			.fe = adap->fe[0],
			.chip_ver = 1,
		};

		if (state->dual_mode) {
			if (adap->id == 0)
				it913x_config.role = IT913X_ROLE_DUAL_MASTER;
			else
				it913x_config.role = IT913X_ROLE_DUAL_SLAVE;
		}

		ret = af9035_add_i2c_dev(d, "it913x",
				state->af9033_i2c_addr[adap->id] >> 1,
				&it913x_config, &d->i2c_adap);
		if (ret)
			goto err;

		fe = adap->fe[0];
		switch (state->af9033_config[adap->id].tuner) {
		case AF9033_TUNER_IT9135_38:
		case AF9033_TUNER_IT9135_51:
		case AF9033_TUNER_IT9135_52:
			it913x_pdata.chip_ver = 1;
			break;
	}
		case AF9033_TUNER_IT9135_60:
		case AF9033_TUNER_IT9135_61:
		case AF9033_TUNER_IT9135_62:
	{
		struct it913x_config it913x_config = {
			.fe = adap->fe[0],
			.chip_ver = 2,
		};
			it913x_pdata.chip_ver = 2;
			break;
		default:
			ret = -ENODEV;
			goto err;
		}

		if (state->dual_mode) {
			if (adap->id == 0)
				it913x_config.role = IT913X_ROLE_DUAL_MASTER;
				it913x_pdata.role = IT913X_ROLE_DUAL_MASTER;
			else
				it913x_config.role = IT913X_ROLE_DUAL_SLAVE;
				it913x_pdata.role = IT913X_ROLE_DUAL_SLAVE;
		} else {
			it913x_pdata.role = IT913X_ROLE_SINGLE;
		}

		ret = af9035_add_i2c_dev(d, "it913x",
				state->af9033_i2c_addr[adap->id] >> 1,
				&it913x_config, &d->i2c_adap);
		if (ret)
		request_module("%s", "it913x");
		pdev = platform_device_register_data(&d->intf->dev,
						     "it913x",
						     PLATFORM_DEVID_AUTO,
						     &it913x_pdata,
						     sizeof(it913x_pdata));
		if (IS_ERR(pdev) || !pdev->dev.driver) {
			ret = -ENODEV;
			goto err;
		}
		if (!try_module_get(pdev->dev.driver->owner)) {
			platform_device_unregister(pdev);
			ret = -ENODEV;
			goto err;
		}

		state->platform_device_tuner[adap->id] = pdev;
		fe = adap->fe[0];
		break;
	}
@@ -1678,12 +1663,6 @@ static int af9035_tuner_detach(struct dvb_usb_adapter *adap)
	switch (state->af9033_config[adap->id].tuner) {
	case AF9033_TUNER_TUA9001:
	case AF9033_TUNER_FC2580:
	case AF9033_TUNER_IT9135_38:
	case AF9033_TUNER_IT9135_51:
	case AF9033_TUNER_IT9135_52:
	case AF9033_TUNER_IT9135_60:
	case AF9033_TUNER_IT9135_61:
	case AF9033_TUNER_IT9135_62:
		if (adap->id == 1) {
			if (state->i2c_client[3])
				af9035_del_i2c_dev(d);
@@ -1691,6 +1670,23 @@ static int af9035_tuner_detach(struct dvb_usb_adapter *adap)
			if (state->i2c_client[1])
				af9035_del_i2c_dev(d);
		}
		break;
	case AF9033_TUNER_IT9135_38:
	case AF9033_TUNER_IT9135_51:
	case AF9033_TUNER_IT9135_52:
	case AF9033_TUNER_IT9135_60:
	case AF9033_TUNER_IT9135_61:
	case AF9033_TUNER_IT9135_62:
	{
		struct platform_device *pdev;

		pdev = state->platform_device_tuner[adap->id];
		if (pdev) {
			module_put(pdev->dev.driver->owner);
			platform_device_unregister(pdev);
		}
		break;
	}
	}

	return 0;
+2 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#ifndef AF9035_H
#define AF9035_H

#include <linux/platform_device.h>
#include "dvb_usb.h"
#include "af9033.h"
#include "tua9001.h"
@@ -73,6 +74,7 @@ struct state {
	#define AF9035_I2C_CLIENT_MAX 4
	struct i2c_client *i2c_client[AF9035_I2C_CLIENT_MAX];
	struct i2c_adapter *i2c_adapter_demod;
	struct platform_device *platform_device_tuner[2];
};

static const u32 clock_lut_af9035[] = {