Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 179534
b: refs/heads/master
c: 3e978a8
h: refs/heads/master
v: v3
  • Loading branch information
Manu Abraham authored and Mauro Carvalho Chehab committed Jan 17, 2010
1 parent 415765d commit b822230
Show file tree
Hide file tree
Showing 13 changed files with 480 additions and 118 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ad0ac434cb3b34640a4e81d7e80a1512c6e40253
refs/heads/master: 3e978a8284080d801d20cda377d9cf7c12fe68b9
11 changes: 11 additions & 0 deletions trunk/drivers/media/dvb/frontends/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,17 @@ config DVB_ATBM8830
help
A DMB-TH tuner module. Say Y when you want to support this frontend.

config DVB_TDA665x
tristate "TDA665x tuner"
depends on DVB_CORE && I2C
default m if DVB_FE_CUSTOMISE
help
Support for tuner modules based on Philips TDA6650/TDA6651 chips.
Say Y when you want to support this chip.

Currently supported tuners:
* Panasonic ENV57H12D5 (ET-50DT)

comment "Tools to develop new frontends"

config DVB_DUMMY_FE
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/media/dvb/frontends/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ obj-$(CONFIG_DVB_TDA10048) += tda10048.o
obj-$(CONFIG_DVB_TUNER_CX24113) += cx24113.o
obj-$(CONFIG_DVB_S5H1411) += s5h1411.o
obj-$(CONFIG_DVB_LGS8GL5) += lgs8gl5.o
obj-$(CONFIG_DVB_TDA665x) += tda665x.o
obj-$(CONFIG_DVB_LGS8GXX) += lgs8gxx.o
obj-$(CONFIG_DVB_ATBM8830) += atbm8830.o
obj-$(CONFIG_DVB_DUMMY_FE) += dvb_dummy_fe.o
Expand Down
257 changes: 257 additions & 0 deletions trunk/drivers/media/dvb/frontends/tda665x.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,257 @@
/*
TDA665x tuner driver
Copyright (C) Manu Abraham (abraham.manu@gmail.com)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
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/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

#include "dvb_frontend.h"
#include "tda665x.h"

struct tda665x_state {
struct dvb_frontend *fe;
struct i2c_adapter *i2c;
const struct tda665x_config *config;

u32 frequency;
u32 bandwidth;
};

static int tda665x_read(struct tda665x_state *state, u8 *buf)
{
const struct tda665x_config *config = state->config;
int err = 0;
struct i2c_msg msg = { .addr = config->addr, .flags = I2C_M_RD, .buf = buf, .len = 2 };

err = i2c_transfer(state->i2c, &msg, 1);
if (err != 1)
goto exit;

return err;
exit:
printk("%s: I/O Error err=<%d>\n", __func__, err);
return err;
}

static int tda665x_write(struct tda665x_state *state, u8 *buf, u8 length)
{
const struct tda665x_config *config = state->config;
int err = 0;
struct i2c_msg msg = { .addr = config->addr, .flags = 0, .buf = buf, .len = length };

err = i2c_transfer(state->i2c, &msg, 1);
if (err != 1)
goto exit;

return err;
exit:
printk("%s: I/O Error err=<%d>\n", __func__, err);
return err;
}

static int tda665x_get_state(struct dvb_frontend *fe,
enum tuner_param param,
struct tuner_state *tstate)
{
struct tda665x_state *state = fe->tuner_priv;
int err = 0;

switch (param) {
case DVBFE_TUNER_FREQUENCY:
tstate->frequency = state->frequency;
break;
case DVBFE_TUNER_BANDWIDTH:
break;
default:
printk("%s: Unknown parameter (param=%d)\n", __func__, param);
err = -EINVAL;
break;
}

return err;
}

static int tda665x_get_status(struct dvb_frontend *fe, u32 *status)
{
struct tda665x_state *state = fe->tuner_priv;
u8 result = 0;
int err = 0;

*status = 0;

err = tda665x_read(state, &result);
if (err < 0)
goto exit;

if ((result >> 6) & 0x01) {
printk("%s: Tuner Phase Locked\n", __func__);
*status = 1;
}

return err;
exit:
printk("%s: I/O Error\n", __func__);
return err;
}

static int tda665x_set_state(struct dvb_frontend *fe,
enum tuner_param param,
struct tuner_state *tstate)
{
struct tda665x_state *state = fe->tuner_priv;
const struct tda665x_config *config = state->config;
u32 frequency, status = 0;
u8 buf[4];
int err = 0;

if (param & DVBFE_TUNER_FREQUENCY) {

frequency = tstate->frequency;
if ((frequency < config->frequency_max) || (frequency > config->frequency_min)) {
printk("%s: Frequency beyond limits, frequency=%d\n", __func__, frequency);
return -EINVAL;
}

frequency += config->frequency_offst;
frequency *= config->ref_multiplier;
frequency += config->ref_divider >> 1;
frequency /= config->ref_divider;

buf[0] = (u8 ) (frequency & 0x7f00) >> 8;
buf[1] = (u8 ) (frequency & 0x00ff) >> 0;
buf[2] = 0x80 | 0x40 | 0x02;
buf[3] = 0x00;

/* restore frequency */
frequency = tstate->frequency;

if (frequency < 153000000) {
/* VHF-L */
buf[3] |= 0x01; /* fc, Low Band, 47 - 153 MHz */
if (frequency < 68000000)
buf[3] |= 0x40; /* 83uA */
if (frequency < 1040000000)
buf[3] |= 0x60; /* 122uA */
if (frequency < 1250000000)
buf[3] |= 0x80; /* 163uA */
else
buf[3] |= 0xa0; /* 254uA */
} else if (frequency < 438000000) {
/* VHF-H */
buf[3] |= 0x02; /* fc, Mid Band, 153 - 438 MHz */
if (frequency < 230000000)
buf[3] |= 0x40;
if (frequency < 300000000)
buf[3] |= 0x60;
else
buf[3] |= 0x80;
} else {
/* UHF */
buf[3] |= 0x04; /* fc, High Band, 438 - 862 MHz */
if (frequency < 470000000)
buf[3] |= 0x60;
if (frequency < 526000000)
buf[3] |= 0x80;
else
buf[3] |= 0xa0;
}

/* Set params */
err = tda665x_write(state, buf, 5);
if (err < 0)
goto exit;

/* sleep for some time */
printk("%s: Waiting to Phase LOCK\n", __func__);
msleep(20);
/* check status */
err = tda665x_get_status(fe, &status);
if (err < 0)
goto exit;

if (status == 1) {
printk("%s: Tuner Phase locked: status=%d\n", __func__, status);
state->frequency = frequency; /* cache successful state */
} else {
printk("%s: No Phase lock: status=%d\n", __func__, status);
}
} else {
printk("%s: Unknown parameter (param=%d)\n", __func__, param);
return -EINVAL;
}

return 0;
exit:
printk("%s: I/O Error\n", __func__);
return err;
}

static int tda665x_release(struct dvb_frontend *fe)
{
struct tda665x_state *state = fe->tuner_priv;

fe->tuner_priv = NULL;
kfree(state);
return 0;
}

static struct dvb_tuner_ops tda665x_ops = {

.set_state = tda665x_set_state,
.get_state = tda665x_get_state,
.get_status = tda665x_get_status,
.release = tda665x_release
};

struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
const struct tda665x_config *config,
struct i2c_adapter *i2c)
{
struct tda665x_state *state = NULL;
struct dvb_tuner_info *info;

state = kzalloc(sizeof (struct tda665x_state), GFP_KERNEL);
if (state == NULL)
goto exit;

state->config = config;
state->i2c = i2c;
state->fe = fe;
fe->tuner_priv = state;
fe->ops.tuner_ops = tda665x_ops;
info = &fe->ops.tuner_ops.info;

memcpy(info->name, config->name, sizeof (config->name));
info->frequency_min = config->frequency_min;
info->frequency_max = config->frequency_max;
info->frequency_step = config->frequency_offst;

printk("%s: Attaching TDA665x (%s) tuner\n", __func__, info->name);

return fe;

exit:
kfree(state);
return NULL;
}
EXPORT_SYMBOL(tda665x_attach);

MODULE_DESCRIPTION("TDA665x driver");
MODULE_AUTHOR("Manu Abraham");
MODULE_LICENSE("GPL");
52 changes: 52 additions & 0 deletions trunk/drivers/media/dvb/frontends/tda665x.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
TDA665x tuner driver
Copyright (C) Manu Abraham (abraham.manu@gmail.com)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
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 __TDA665x_H
#define __TDA665x_H

struct tda665x_config {
char name[128];

u8 addr;
u32 frequency_min;
u32 frequency_max;
u32 frequency_offst;
u32 ref_multiplier;
u32 ref_divider;
};

#if defined(CONFIG_DVB_TDA665x) || (defined(CONFIG_DVB_TDA665x_MODULE) && defined(MODULE))

extern struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
const struct tda665x_config *config,
struct i2c_adapter *i2c);

#else

static inline struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
const struct tda665x_config *config,
struct i2c_adapter *i2c)
{
printk(KERN_WARNING "%s: Driver disabled by Kconfig\n", __func__);
return NULL;
}

#endif /* CONFIG_DVB_TDA665x */

#endif /* __TDA665x_H */
1 change: 0 additions & 1 deletion trunk/drivers/media/dvb/mantis/hopper_cards.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,6 @@ static void __devexit hopper_pci_remove(struct pci_dev *pdev)
struct mantis_pci *mantis = pci_get_drvdata(pdev);

if (mantis) {
// mantis_uart_exit(mantis);
mantis_dvb_exit(mantis);
mantis_dma_exit(mantis);
mantis_i2c_exit(mantis);
Expand Down
11 changes: 8 additions & 3 deletions trunk/drivers/media/dvb/mantis/mantis_cards.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ static char *label[10] = {
"RACK"
};


static irqreturn_t mantis_irq_handler(int irq, void *dev_id)
{
u32 stat = 0, mask = 0, lstat = 0, mstat = 0;
Expand Down Expand Up @@ -199,6 +198,14 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev, const struct pci_dev

return err;

fail7:
dprintk(MANTIS_ERROR, 1, "ERROR: Mantis UART exit! <%d>", err);
mantis_uart_exit(mantis);

fail6:
dprintk(MANTIS_ERROR, 1, "ERROR: Mantis CA exit! <%d>", err);
mantis_ca_exit(mantis);

fail5:
dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DVB exit! <%d>", err);
mantis_dvb_exit(mantis);
Expand Down Expand Up @@ -228,8 +235,6 @@ static void __devexit mantis_pci_remove(struct pci_dev *pdev)
struct mantis_pci *mantis = pci_get_drvdata(pdev);

if (mantis) {
mantis_uart_exit(mantis);
// mantis_ca_exit(mantis);
mantis_dvb_exit(mantis);
mantis_dma_exit(mantis);
mantis_i2c_exit(mantis);
Expand Down
3 changes: 1 addition & 2 deletions trunk/drivers/media/dvb/mantis/mantis_dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,7 @@ int mantis_dma_init(struct mantis_pci *mantis)
if (mantis_alloc_buffers(mantis) < 0) {
dprintk(MANTIS_ERROR, 1, "Error allocating DMA buffer");

// Stop RISC Engine
// mmwrite(mmread(MANTIS_DMA_CTL) & ~MANTIS_RISC_EN, MANTIS_DMA_CTL);
/* Stop RISC Engine */
mmwrite(0, MANTIS_DMA_CTL);

goto err;
Expand Down
Loading

0 comments on commit b822230

Please sign in to comment.