diff options
Diffstat (limited to 'drivers/media/tuners')
35 files changed, 206 insertions, 213 deletions
diff --git a/drivers/media/tuners/fc0011.c b/drivers/media/tuners/fc0011.c index 00489a9df4e4..192b1c7740df 100644 --- a/drivers/media/tuners/fc0011.c +++ b/drivers/media/tuners/fc0011.c @@ -15,10 +15,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "fc0011.h" diff --git a/drivers/media/tuners/fc0012-priv.h b/drivers/media/tuners/fc0012-priv.h index 1a86ce1d3fcf..0fbf0114bdcd 100644 --- a/drivers/media/tuners/fc0012-priv.h +++ b/drivers/media/tuners/fc0012-priv.h @@ -12,10 +12,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _FC0012_PRIV_H_ diff --git a/drivers/media/tuners/fc0012.c b/drivers/media/tuners/fc0012.c index 30508f44e5f9..dcc323ffbde7 100644 --- a/drivers/media/tuners/fc0012.c +++ b/drivers/media/tuners/fc0012.c @@ -12,10 +12,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "fc0012.h" diff --git a/drivers/media/tuners/fc0012.h b/drivers/media/tuners/fc0012.h index 4a23e418daf0..64d07a2adb2e 100644 --- a/drivers/media/tuners/fc0012.h +++ b/drivers/media/tuners/fc0012.h @@ -12,10 +12,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _FC0012_H_ diff --git a/drivers/media/tuners/fc0013-priv.h b/drivers/media/tuners/fc0013-priv.h index bfd49dedea22..2eeaca8abae5 100644 --- a/drivers/media/tuners/fc0013-priv.h +++ b/drivers/media/tuners/fc0013-priv.h @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * */ #ifndef _FC0013_PRIV_H_ diff --git a/drivers/media/tuners/fc0013.c b/drivers/media/tuners/fc0013.c index f7cf0e9e7c99..91dfa770a5cc 100644 --- a/drivers/media/tuners/fc0013.c +++ b/drivers/media/tuners/fc0013.c @@ -15,10 +15,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * */ #include "fc0013.h" diff --git a/drivers/media/tuners/fc0013.h b/drivers/media/tuners/fc0013.h index 8c34105c9383..4431e7ceb43d 100644 --- a/drivers/media/tuners/fc0013.h +++ b/drivers/media/tuners/fc0013.h @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * */ #ifndef _FC0013_H_ diff --git a/drivers/media/tuners/fc001x-common.h b/drivers/media/tuners/fc001x-common.h index 718818156934..3a96ff76c195 100644 --- a/drivers/media/tuners/fc001x-common.h +++ b/drivers/media/tuners/fc001x-common.h @@ -12,10 +12,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _FC001X_COMMON_H_ diff --git a/drivers/media/tuners/it913x.c b/drivers/media/tuners/it913x.c index 6c3ef2181fcd..27e5bc1c3cb5 100644 --- a/drivers/media/tuners/it913x.c +++ b/drivers/media/tuners/it913x.c @@ -14,17 +14,14 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.= */ #include "it913x.h" +#include <linux/platform_device.h> #include <linux/regmap.h> struct it913x_dev { - struct i2c_client *client; + struct platform_device *pdev; struct regmap *regmap; struct dvb_frontend *fe; u8 chip_ver:2; @@ -39,13 +36,14 @@ struct it913x_dev { static int it913x_init(struct dvb_frontend *fe) { struct it913x_dev *dev = fe->tuner_priv; + struct platform_device *pdev = dev->pdev; int ret; unsigned int utmp; u8 iqik_m_cal, nv_val, buf[2]; static const u8 nv[] = {48, 32, 24, 16, 12, 8, 6, 4, 2}; unsigned long timeout; - dev_dbg(&dev->client->dev, "role %u\n", dev->role); + dev_dbg(&pdev->dev, "role %u\n", dev->role); ret = regmap_write(dev->regmap, 0x80ec4c, 0x68); if (ret) @@ -73,7 +71,7 @@ static int it913x_init(struct dvb_frontend *fe) iqik_m_cal = 6; break; default: - dev_err(&dev->client->dev, "unknown clock identifier %d\n", utmp); + dev_err(&pdev->dev, "unknown clock identifier %d\n", utmp); goto err; } @@ -98,14 +96,14 @@ static int it913x_init(struct dvb_frontend *fe) break; } - dev_dbg(&dev->client->dev, "r_fbc_m_bdry took %u ms, val %u\n", + dev_dbg(&pdev->dev, "r_fbc_m_bdry took %u ms, val %u\n", jiffies_to_msecs(jiffies) - (jiffies_to_msecs(timeout) - TIMEOUT), utmp); dev->fn_min = dev->xtal * utmp; dev->fn_min /= (dev->fdiv * nv_val); dev->fn_min *= 1000; - dev_dbg(&dev->client->dev, "fn_min %u\n", dev->fn_min); + dev_dbg(&pdev->dev, "fn_min %u\n", dev->fn_min); /* * Chip version BX never sets that flag so we just wait 50ms in that @@ -125,7 +123,7 @@ static int it913x_init(struct dvb_frontend *fe) break; } - dev_dbg(&dev->client->dev, "p_tsm_init_mode took %u ms, val %u\n", + dev_dbg(&pdev->dev, "p_tsm_init_mode took %u ms, val %u\n", jiffies_to_msecs(jiffies) - (jiffies_to_msecs(timeout) - TIMEOUT), utmp); } else { @@ -152,16 +150,17 @@ static int it913x_init(struct dvb_frontend *fe) return 0; err: - dev_dbg(&dev->client->dev, "failed %d\n", ret); + dev_dbg(&pdev->dev, "failed %d\n", ret); return ret; } static int it913x_sleep(struct dvb_frontend *fe) { struct it913x_dev *dev = fe->tuner_priv; + struct platform_device *pdev = dev->pdev; int ret, len; - dev_dbg(&dev->client->dev, "role %u\n", dev->role); + dev_dbg(&pdev->dev, "role %u\n", dev->role); dev->active = false; @@ -178,7 +177,7 @@ static int it913x_sleep(struct dvb_frontend *fe) else len = 15; - dev_dbg(&dev->client->dev, "role %u, len %d\n", dev->role, len); + dev_dbg(&pdev->dev, "role %u, len %d\n", dev->role, len); ret = regmap_bulk_write(dev->regmap, 0x80ec02, "\x3f\x1f\x3f\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", @@ -210,13 +209,14 @@ static int it913x_sleep(struct dvb_frontend *fe) return 0; err: - dev_dbg(&dev->client->dev, "failed %d\n", ret); + dev_dbg(&pdev->dev, "failed %d\n", ret); return ret; } static int it913x_set_params(struct dvb_frontend *fe) { struct it913x_dev *dev = fe->tuner_priv; + struct platform_device *pdev = dev->pdev; struct dtv_frontend_properties *c = &fe->dtv_property_cache; int ret; unsigned int utmp; @@ -224,7 +224,7 @@ static int it913x_set_params(struct dvb_frontend *fe) u16 iqik_m_cal, n_div; u8 u8tmp, n, l_band, lna_band; - dev_dbg(&dev->client->dev, "role=%u, frequency %u, bandwidth_hz %u\n", + dev_dbg(&pdev->dev, "role=%u, frequency %u, bandwidth_hz %u\n", dev->role, c->frequency, c->bandwidth_hz); if (!dev->active) { @@ -290,7 +290,7 @@ static int it913x_set_params(struct dvb_frontend *fe) pre_lo_freq += (u32) n << 13; /* Frequency OMEGA_IQIK_M_CAL_MID*/ t_cal_freq = pre_lo_freq + (u32)iqik_m_cal; - dev_dbg(&dev->client->dev, "t_cal_freq %u, pre_lo_freq %u\n", + dev_dbg(&pdev->dev, "t_cal_freq %u, pre_lo_freq %u\n", t_cal_freq, pre_lo_freq); if (c->frequency <= 440000000) { @@ -369,7 +369,7 @@ static int it913x_set_params(struct dvb_frontend *fe) return 0; err: - dev_dbg(&dev->client->dev, "failed %d\n", ret); + dev_dbg(&pdev->dev, "failed %d\n", ret); return ret; } @@ -385,40 +385,32 @@ static const struct dvb_tuner_ops it913x_tuner_ops = { .set_params = it913x_set_params, }; -static int it913x_probe(struct i2c_client *client, - const struct i2c_device_id *id) +static int it913x_probe(struct platform_device *pdev) { - struct it913x_config *cfg = client->dev.platform_data; - struct dvb_frontend *fe = cfg->fe; + struct it913x_platform_data *pdata = pdev->dev.platform_data; + struct dvb_frontend *fe = pdata->fe; struct it913x_dev *dev; + const struct platform_device_id *id = platform_get_device_id(pdev); int ret; char *chip_ver_str; - static const struct regmap_config regmap_config = { - .reg_bits = 24, - .val_bits = 8, - }; dev = kzalloc(sizeof(struct it913x_dev), GFP_KERNEL); if (dev == NULL) { ret = -ENOMEM; - dev_err(&client->dev, "kzalloc() failed\n"); + dev_err(&pdev->dev, "kzalloc() failed\n"); goto err; } - dev->client = client; - dev->fe = cfg->fe; - dev->chip_ver = cfg->chip_ver; - dev->role = cfg->role; - dev->regmap = regmap_init_i2c(client, ®map_config); - if (IS_ERR(dev->regmap)) { - ret = PTR_ERR(dev->regmap); - goto err_kfree; - } + dev->pdev = pdev; + dev->regmap = pdata->regmap; + dev->fe = pdata->fe; + dev->chip_ver = id->driver_data; + dev->role = pdata->role; fe->tuner_priv = dev; memcpy(&fe->ops.tuner_ops, &it913x_tuner_ops, sizeof(struct dvb_tuner_ops)); - i2c_set_clientdata(client, dev); + platform_set_drvdata(pdev, dev); if (dev->chip_ver == 1) chip_ver_str = "AX"; @@ -427,41 +419,37 @@ static int it913x_probe(struct i2c_client *client, else chip_ver_str = "??"; - dev_info(&dev->client->dev, "ITE IT913X %s successfully attached\n", - chip_ver_str); - dev_dbg(&dev->client->dev, "chip_ver %u, role %u\n", - dev->chip_ver, dev->role); + dev_info(&pdev->dev, "ITE IT913X %s successfully attached\n", + chip_ver_str); + dev_dbg(&pdev->dev, "chip_ver %u, role %u\n", dev->chip_ver, dev->role); return 0; - -err_kfree: - kfree(dev); err: - dev_dbg(&client->dev, "failed %d\n", ret); + dev_dbg(&pdev->dev, "failed %d\n", ret); return ret; } -static int it913x_remove(struct i2c_client *client) +static int it913x_remove(struct platform_device *pdev) { - struct it913x_dev *dev = i2c_get_clientdata(client); + struct it913x_dev *dev = platform_get_drvdata(pdev); struct dvb_frontend *fe = dev->fe; - dev_dbg(&client->dev, "\n"); + dev_dbg(&pdev->dev, "\n"); memset(&fe->ops.tuner_ops, 0, sizeof(struct dvb_tuner_ops)); fe->tuner_priv = NULL; - regmap_exit(dev->regmap); kfree(dev); return 0; } -static const struct i2c_device_id it913x_id_table[] = { - {"it913x", 0}, - {} +static const struct platform_device_id it913x_id_table[] = { + {"it9133ax-tuner", 1}, + {"it9133bx-tuner", 2}, + {}, }; -MODULE_DEVICE_TABLE(i2c, it913x_id_table); +MODULE_DEVICE_TABLE(platform, it913x_id_table); -static struct i2c_driver it913x_driver = { +static struct platform_driver it913x_driver = { .driver = { .name = "it913x", .suppress_bind_attrs = true, @@ -471,7 +459,7 @@ static struct i2c_driver it913x_driver = { .id_table = it913x_id_table, }; -module_i2c_driver(it913x_driver); +module_platform_driver(it913x_driver); MODULE_DESCRIPTION("ITE IT913X silicon tuner driver"); MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); diff --git a/drivers/media/tuners/it913x.h b/drivers/media/tuners/it913x.h index 33de53d4a566..226f657228fb 100644 --- a/drivers/media/tuners/it913x.h +++ b/drivers/media/tuners/it913x.h @@ -14,10 +14,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.= */ #ifndef IT913X_H @@ -25,26 +21,16 @@ #include "dvb_frontend.h" -/* - * I2C address - * 0x38, 0x3a, 0x3c, 0x3e +/** + * struct it913x_platform_data - Platform data for the it913x driver + * @regmap: af9033 demod driver regmap. + * @dvb_frontend: af9033 demod driver DVB frontend. + * @role: Chip role, single or dual configuration. */ -struct it913x_config { - /* - * pointer to DVB frontend - */ - struct dvb_frontend *fe; - /* - * chip version - * 1 = IT9135 AX - * 2 = IT9135 BX - */ - unsigned int chip_ver:2; - - /* - * tuner role - */ +struct it913x_platform_data { + struct regmap *regmap; + struct dvb_frontend *fe; #define IT913X_ROLE_SINGLE 0 #define IT913X_ROLE_DUAL_MASTER 1 #define IT913X_ROLE_DUAL_SLAVE 2 diff --git a/drivers/media/tuners/max2165.c b/drivers/media/tuners/max2165.c index c3f10925b0d4..a86c08114915 100644 --- a/drivers/media/tuners/max2165.c +++ b/drivers/media/tuners/max2165.c @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <linux/module.h> diff --git a/drivers/media/tuners/max2165.h b/drivers/media/tuners/max2165.h index aadd9fea59e4..3120c54ec154 100644 --- a/drivers/media/tuners/max2165.h +++ b/drivers/media/tuners/max2165.h @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __MAX2165_H__ diff --git a/drivers/media/tuners/max2165_priv.h b/drivers/media/tuners/max2165_priv.h index 91bbe021a08d..20d7751881a3 100644 --- a/drivers/media/tuners/max2165_priv.h +++ b/drivers/media/tuners/max2165_priv.h @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __MAX2165_PRIV_H__ diff --git a/drivers/media/tuners/mc44s803.c b/drivers/media/tuners/mc44s803.c index aba580b4ac2c..12f545ef1243 100644 --- a/drivers/media/tuners/mc44s803.c +++ b/drivers/media/tuners/mc44s803.c @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.= */ #include <linux/module.h> diff --git a/drivers/media/tuners/mc44s803.h b/drivers/media/tuners/mc44s803.h index 6b40df339284..f68133fb9760 100644 --- a/drivers/media/tuners/mc44s803.h +++ b/drivers/media/tuners/mc44s803.h @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.= */ #ifndef MC44S803_H diff --git a/drivers/media/tuners/mc44s803_priv.h b/drivers/media/tuners/mc44s803_priv.h index 14a92780906d..52325395dfe7 100644 --- a/drivers/media/tuners/mc44s803_priv.h +++ b/drivers/media/tuners/mc44s803_priv.h @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.= */ #ifndef MC44S803_PRIV_H diff --git a/drivers/media/tuners/mt2060.c b/drivers/media/tuners/mt2060.c index 94077ea78dde..2e487f9a2cc3 100644 --- a/drivers/media/tuners/mt2060.c +++ b/drivers/media/tuners/mt2060.c @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.= */ /* In that file, frequencies are expressed in kiloHertz to avoid 32 bits overflows */ @@ -71,13 +67,24 @@ static int mt2060_writereg(struct mt2060_priv *priv, u8 reg, u8 val) // Writes a set of consecutive registers static int mt2060_writeregs(struct mt2060_priv *priv,u8 *buf, u8 len) { + int rem, val_len; + u8 xfer_buf[16]; struct i2c_msg msg = { - .addr = priv->cfg->i2c_address, .flags = 0, .buf = buf, .len = len + .addr = priv->cfg->i2c_address, .flags = 0, .buf = xfer_buf }; - if (i2c_transfer(priv->i2c, &msg, 1) != 1) { - printk(KERN_WARNING "mt2060 I2C write failed (len=%i)\n",(int)len); - return -EREMOTEIO; + + for (rem = len - 1; rem > 0; rem -= priv->i2c_max_regs) { + val_len = min_t(int, rem, priv->i2c_max_regs); + msg.len = 1 + val_len; + xfer_buf[0] = buf[0] + len - 1 - rem; + memcpy(&xfer_buf[1], &buf[1 + len - 1 - rem], val_len); + + if (i2c_transfer(priv->i2c, &msg, 1) != 1) { + printk(KERN_WARNING "mt2060 I2C write failed (len=%i)\n", val_len); + return -EREMOTEIO; + } } + return 0; } @@ -306,9 +313,16 @@ static int mt2060_init(struct dvb_frontend *fe) if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */ + if (priv->sleep) { + ret = mt2060_writereg(priv, REG_MISC_CTRL, 0x20); + if (ret) + goto err_i2c_gate_ctrl; + } + ret = mt2060_writereg(priv, REG_VGAG, (priv->cfg->clock_out << 6) | 0x33); +err_i2c_gate_ctrl: if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); /* close i2c_gate */ @@ -325,7 +339,13 @@ static int mt2060_sleep(struct dvb_frontend *fe) ret = mt2060_writereg(priv, REG_VGAG, (priv->cfg->clock_out << 6) | 0x30); + if (ret) + goto err_i2c_gate_ctrl; + + if (priv->sleep) + ret = mt2060_writereg(priv, REG_MISC_CTRL, 0xe8); +err_i2c_gate_ctrl: if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); /* close i2c_gate */ @@ -369,6 +389,7 @@ struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter priv->cfg = cfg; priv->i2c = i2c; priv->if1_freq = if1; + priv->i2c_max_regs = ~0; if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */ @@ -396,6 +417,98 @@ struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter } EXPORT_SYMBOL(mt2060_attach); +static int mt2060_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct mt2060_platform_data *pdata = client->dev.platform_data; + struct dvb_frontend *fe; + struct mt2060_priv *dev; + int ret; + u8 chip_id; + + dev_dbg(&client->dev, "\n"); + + if (!pdata) { + dev_err(&client->dev, "Cannot proceed without platform data\n"); + ret = -EINVAL; + goto err; + } + + dev = devm_kzalloc(&client->dev, sizeof(*dev), GFP_KERNEL); + if (!dev) { + ret = -ENOMEM; + goto err; + } + + fe = pdata->dvb_frontend; + dev->config.i2c_address = client->addr; + dev->config.clock_out = pdata->clock_out; + dev->cfg = &dev->config; + dev->i2c = client->adapter; + dev->if1_freq = pdata->if1 ? pdata->if1 : 1220; + dev->client = client; + dev->i2c_max_regs = pdata->i2c_write_max ? pdata->i2c_write_max - 1 : ~0; + dev->sleep = true; + + ret = mt2060_readreg(dev, REG_PART_REV, &chip_id); + if (ret) { + ret = -ENODEV; + goto err; + } + + dev_dbg(&client->dev, "chip id=%02x\n", chip_id); + + if (chip_id != PART_REV) { + ret = -ENODEV; + goto err; + } + + /* Power on, calibrate, sleep */ + ret = mt2060_writereg(dev, REG_MISC_CTRL, 0x20); + if (ret) + goto err; + mt2060_calibrate(dev); + ret = mt2060_writereg(dev, REG_MISC_CTRL, 0xe8); + if (ret) + goto err; + + dev_info(&client->dev, "Microtune MT2060 successfully identified\n"); + memcpy(&fe->ops.tuner_ops, &mt2060_tuner_ops, sizeof(fe->ops.tuner_ops)); + fe->ops.tuner_ops.release = NULL; + fe->tuner_priv = dev; + i2c_set_clientdata(client, dev); + + return 0; +err: + dev_dbg(&client->dev, "failed=%d\n", ret); + return ret; +} + +static int mt2060_remove(struct i2c_client *client) +{ + dev_dbg(&client->dev, "\n"); + + return 0; +} + +static const struct i2c_device_id mt2060_id_table[] = { + {"mt2060", 0}, + {} +}; +MODULE_DEVICE_TABLE(i2c, mt2060_id_table); + +static struct i2c_driver mt2060_driver = { + .driver = { + .name = "mt2060", + .suppress_bind_attrs = true, + }, + .probe = mt2060_probe, + .remove = mt2060_remove, + .id_table = mt2060_id_table, +}; + +module_i2c_driver(mt2060_driver); + MODULE_AUTHOR("Olivier DANET"); MODULE_DESCRIPTION("Microtune MT2060 silicon tuner driver"); MODULE_LICENSE("GPL"); diff --git a/drivers/media/tuners/mt2060.h b/drivers/media/tuners/mt2060.h index 6efed359a24f..cc534eb41378 100644 --- a/drivers/media/tuners/mt2060.h +++ b/drivers/media/tuners/mt2060.h @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.= */ #ifndef MT2060_H @@ -25,6 +21,29 @@ struct dvb_frontend; struct i2c_adapter; +/* + * I2C address + * 0x60, ... + */ + +/** + * struct mt2060_platform_data - Platform data for the mt2060 driver + * @clock_out: Clock output setting. 0 = off, 1 = CLK/4, 2 = CLK/2, 3 = CLK/1. + * @if1: First IF used [MHz]. 0 defaults to 1220. + * @i2c_write_max: Maximum number of bytes I2C adapter can write at once. + * 0 defaults to maximum. + * @dvb_frontend: DVB frontend. + */ + +struct mt2060_platform_data { + u8 clock_out; + u16 if1; + unsigned int i2c_write_max:5; + struct dvb_frontend *dvb_frontend; +}; + + +/* configuration struct for mt2060_attach() */ struct mt2060_config { u8 i2c_address; u8 clock_out; /* 0 = off, 1 = CLK/4, 2 = CLK/2, 3 = CLK/1 */ diff --git a/drivers/media/tuners/mt2060_priv.h b/drivers/media/tuners/mt2060_priv.h index 2b60de6c707d..a6c931c1a5a7 100644 --- a/drivers/media/tuners/mt2060_priv.h +++ b/drivers/media/tuners/mt2060_priv.h @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.= */ #ifndef MT2060_PRIV_H @@ -95,10 +91,21 @@ struct mt2060_priv { struct mt2060_config *cfg; struct i2c_adapter *i2c; + struct i2c_client *client; + struct mt2060_config config; + u8 i2c_max_regs; u32 frequency; u16 if1_freq; u8 fmfreq; + + /* + * Use REG_MISC_CTRL register for sleep. That drops sleep power usage + * about 0.9W (huge!). Register bit meanings are unknown, so let it be + * disabled by default to avoid possible regression. Convert driver to + * i2c model in order to enable it. + */ + bool sleep; }; #endif diff --git a/drivers/media/tuners/mt2131.c b/drivers/media/tuners/mt2131.c index e7790e4afcfe..dd85d58fa8d0 100644 --- a/drivers/media/tuners/mt2131.c +++ b/drivers/media/tuners/mt2131.c @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <linux/module.h> diff --git a/drivers/media/tuners/mt2131.h b/drivers/media/tuners/mt2131.h index 8267a6ae5d84..050da5540b15 100644 --- a/drivers/media/tuners/mt2131.h +++ b/drivers/media/tuners/mt2131.h @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __MT2131_H__ diff --git a/drivers/media/tuners/mt2131_priv.h b/drivers/media/tuners/mt2131_priv.h index 91283b599cb3..d2b6f29182cc 100644 --- a/drivers/media/tuners/mt2131_priv.h +++ b/drivers/media/tuners/mt2131_priv.h @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __MT2131_PRIV_H__ diff --git a/drivers/media/tuners/mxl5007t.c b/drivers/media/tuners/mxl5007t.c index b16dfa5e85fb..4081fd97c3b2 100644 --- a/drivers/media/tuners/mxl5007t.c +++ b/drivers/media/tuners/mxl5007t.c @@ -12,10 +12,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <linux/i2c.h> diff --git a/drivers/media/tuners/mxl5007t.h b/drivers/media/tuners/mxl5007t.h index e786d1f23ff1..273f61aeb8be 100644 --- a/drivers/media/tuners/mxl5007t.h +++ b/drivers/media/tuners/mxl5007t.h @@ -12,10 +12,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __MXL5007T_H__ diff --git a/drivers/media/tuners/qt1010.c b/drivers/media/tuners/qt1010.c index a2c6cd1c3923..ee33b7cc7682 100644 --- a/drivers/media/tuners/qt1010.c +++ b/drivers/media/tuners/qt1010.c @@ -13,10 +13,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "qt1010.h" #include "qt1010_priv.h" diff --git a/drivers/media/tuners/qt1010.h b/drivers/media/tuners/qt1010.h index e3198f23437c..276e59e85032 100644 --- a/drivers/media/tuners/qt1010.h +++ b/drivers/media/tuners/qt1010.h @@ -13,10 +13,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef QT1010_H diff --git a/drivers/media/tuners/qt1010_priv.h b/drivers/media/tuners/qt1010_priv.h index 2c42d3f01636..4cb78ecc8985 100644 --- a/drivers/media/tuners/qt1010_priv.h +++ b/drivers/media/tuners/qt1010_priv.h @@ -13,10 +13,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef QT1010_PRIV_H diff --git a/drivers/media/tuners/tda18218.c b/drivers/media/tuners/tda18218.c index 8357a3c08a70..c56fcf5d48e3 100644 --- a/drivers/media/tuners/tda18218.c +++ b/drivers/media/tuners/tda18218.c @@ -12,10 +12,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "tda18218_priv.h" diff --git a/drivers/media/tuners/tda18218.h b/drivers/media/tuners/tda18218.h index 076b5f2e888d..9c0e3fd7ed7f 100644 --- a/drivers/media/tuners/tda18218.h +++ b/drivers/media/tuners/tda18218.h @@ -12,10 +12,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef TDA18218_H diff --git a/drivers/media/tuners/tda18218_priv.h b/drivers/media/tuners/tda18218_priv.h index 285b77366c8d..9d04781966e7 100644 --- a/drivers/media/tuners/tda18218_priv.h +++ b/drivers/media/tuners/tda18218_priv.h @@ -12,10 +12,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef TDA18218_PRIV_H diff --git a/drivers/media/tuners/tda827x.c b/drivers/media/tuners/tda827x.c index 2137eadf30f1..8400808f8f7f 100644 --- a/drivers/media/tuners/tda827x.c +++ b/drivers/media/tuners/tda827x.c @@ -12,10 +12,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <linux/module.h> diff --git a/drivers/media/tuners/xc4000.c b/drivers/media/tuners/xc4000.c index 03eef9b87a24..e30948e4ff87 100644 --- a/drivers/media/tuners/xc4000.c +++ b/drivers/media/tuners/xc4000.c @@ -16,10 +16,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <linux/module.h> diff --git a/drivers/media/tuners/xc4000.h b/drivers/media/tuners/xc4000.h index 40517860cf67..8af93b63ff9e 100644 --- a/drivers/media/tuners/xc4000.h +++ b/drivers/media/tuners/xc4000.h @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __XC4000_H__ diff --git a/drivers/media/tuners/xc5000.c b/drivers/media/tuners/xc5000.c index 796e7638b3b2..91947cf1950e 100644 --- a/drivers/media/tuners/xc5000.c +++ b/drivers/media/tuners/xc5000.c @@ -15,10 +15,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <linux/module.h> @@ -1148,7 +1144,7 @@ static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe, int force) pr_err("xc5000: Upload failed. rc %d\n", ret); return ret; } - dprintk(1, "firmware read %Zu bytes.\n", fw->size); + dprintk(1, "firmware read %zu bytes.\n", fw->size); if (fw->size != desired_fw->size) { pr_err("xc5000: Firmware file with incorrect size\n"); diff --git a/drivers/media/tuners/xc5000.h b/drivers/media/tuners/xc5000.h index 336bd49eb09b..42bbec2409fd 100644 --- a/drivers/media/tuners/xc5000.h +++ b/drivers/media/tuners/xc5000.h @@ -13,10 +13,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __XC5000_H__ |