media: c8sectpfe: remove support of STi c8sectpfe driver

STi c8sectpfe device is only used on B2120 boards, which support has
been withdrawn in commit dee546e1ad ("ARM: sti: drop B2120 board
support").

Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com>
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
This commit is contained in:
Raphael Gallais-Pou
2025-09-12 13:36:08 +02:00
committed by Hans Verkuil
parent 2a0935ac4b
commit 2282f76107
14 changed files with 0 additions and 2329 deletions

View File

@@ -3437,7 +3437,6 @@ F: drivers/clocksource/clksrc_st_lpc.c
F: drivers/cpufreq/sti-cpufreq.c
F: drivers/dma/st_fdma*
F: drivers/i2c/busses/i2c-st.c
F: drivers/media/platform/st/sti/c8sectpfe/
F: drivers/media/rc/st_rc.c
F: drivers/mmc/host/sdhci-st.c
F: drivers/phy/st/phy-miphy28lp.c

View File

@@ -1,7 +1,6 @@
# SPDX-License-Identifier: GPL-2.0-only
obj-y += sti/bdisp/
obj-y += sti/c8sectpfe/
obj-y += sti/delta/
obj-y += sti/hva/
obj-y += stm32/

View File

@@ -1,5 +1,4 @@
# SPDX-License-Identifier: GPL-2.0-only
source "drivers/media/platform/st/sti/bdisp/Kconfig"
source "drivers/media/platform/st/sti/c8sectpfe/Kconfig"
source "drivers/media/platform/st/sti/delta/Kconfig"
source "drivers/media/platform/st/sti/hva/Kconfig"

View File

@@ -1,6 +1,5 @@
# SPDX-License-Identifier: GPL-2.0-only
obj-y += bdisp/
obj-y += c8sectpfe/
obj-y += delta/
obj-y += hva/
obj-y += stm32/

View File

@@ -1,28 +0,0 @@
# SPDX-License-Identifier: GPL-2.0-only
config DVB_C8SECTPFE
tristate "STMicroelectronics C8SECTPFE DVB support"
depends on DVB_PLATFORM_DRIVERS
depends on PINCTRL && DVB_CORE && I2C
depends on ARCH_STI || ARCH_MULTIPLATFORM || COMPILE_TEST
select FW_LOADER
select DVB_LNBP21 if MEDIA_SUBDRV_AUTOSELECT
select DVB_STV090x if MEDIA_SUBDRV_AUTOSELECT
select DVB_STB6100 if MEDIA_SUBDRV_AUTOSELECT
select DVB_STV6110 if MEDIA_SUBDRV_AUTOSELECT
select DVB_STV0900 if MEDIA_SUBDRV_AUTOSELECT
select DVB_STV0367 if MEDIA_SUBDRV_AUTOSELECT
select MEDIA_TUNER_TDA18212 if MEDIA_SUBDRV_AUTOSELECT
help
This adds support for DVB front-end cards connected
to TS inputs of STiH407/410 SoC.
The driver currently supports C8SECTPFE's TS input block,
memdma engine, and HW PID filtering.
Supported DVB front-end cards are:
- STMicroelectronics DVB-T B2100A (STV0367 + TDA18212)
- STMicroelectronics DVB-S/S2 STV0903 + STV6110 + LNBP24 board
To compile this driver as a module, choose M here: the
module will be called c8sectpfe.

View File

@@ -1,11 +0,0 @@
# SPDX-License-Identifier: GPL-2.0
c8sectpfe-y += c8sectpfe-core.o c8sectpfe-common.o c8sectpfe-dvb.o
ifneq ($(CONFIG_DEBUG_FS),)
c8sectpfe-y += c8sectpfe-debugfs.o
endif
obj-$(CONFIG_DVB_C8SECTPFE) += c8sectpfe.o
ccflags-y += -I $(srctree)/drivers/media/dvb-frontends/
ccflags-y += -I $(srctree)/drivers/media/tuners/

View File

@@ -1,262 +0,0 @@
// SPDX-License-Identifier: GPL-2.0
/*
* c8sectpfe-common.c - C8SECTPFE STi DVB driver
*
* Copyright (c) STMicroelectronics 2015
*
* Author: Peter Griffin <peter.griffin@linaro.org>
*
*/
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/dvb/dmx.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/ioport.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/time.h>
#include <linux/wait.h>
#include <media/dmxdev.h>
#include <media/dvbdev.h>
#include <media/dvb_demux.h>
#include <media/dvb_frontend.h>
#include <media/dvb_net.h>
#include "c8sectpfe-common.h"
#include "c8sectpfe-core.h"
#include "c8sectpfe-dvb.h"
static int register_dvb(struct stdemux *demux, struct dvb_adapter *adap,
void *start_feed, void *stop_feed,
struct c8sectpfei *fei)
{
int result;
demux->dvb_demux.dmx.capabilities = DMX_TS_FILTERING |
DMX_SECTION_FILTERING |
DMX_MEMORY_BASED_FILTERING;
demux->dvb_demux.priv = demux;
demux->dvb_demux.filternum = C8SECTPFE_MAXCHANNEL;
demux->dvb_demux.feednum = C8SECTPFE_MAXCHANNEL;
demux->dvb_demux.start_feed = start_feed;
demux->dvb_demux.stop_feed = stop_feed;
demux->dvb_demux.write_to_decoder = NULL;
result = dvb_dmx_init(&demux->dvb_demux);
if (result < 0) {
dev_err(fei->dev, "dvb_dmx_init failed (errno = %d)\n",
result);
goto err_dmx;
}
demux->dmxdev.filternum = demux->dvb_demux.filternum;
demux->dmxdev.demux = &demux->dvb_demux.dmx;
demux->dmxdev.capabilities = 0;
result = dvb_dmxdev_init(&demux->dmxdev, adap);
if (result < 0) {
dev_err(fei->dev, "dvb_dmxdev_init failed (errno = %d)\n",
result);
goto err_dmxdev;
}
demux->hw_frontend.source = DMX_FRONTEND_0 + demux->tsin_index;
result = demux->dvb_demux.dmx.add_frontend(&demux->dvb_demux.dmx,
&demux->hw_frontend);
if (result < 0) {
dev_err(fei->dev, "add_frontend failed (errno = %d)\n", result);
goto err_fe_hw;
}
demux->mem_frontend.source = DMX_MEMORY_FE;
result = demux->dvb_demux.dmx.add_frontend(&demux->dvb_demux.dmx,
&demux->mem_frontend);
if (result < 0) {
dev_err(fei->dev, "add_frontend failed (%d)\n", result);
goto err_fe_mem;
}
result = demux->dvb_demux.dmx.connect_frontend(&demux->dvb_demux.dmx,
&demux->hw_frontend);
if (result < 0) {
dev_err(fei->dev, "connect_frontend (%d)\n", result);
goto err_fe_con;
}
return 0;
err_fe_con:
demux->dvb_demux.dmx.remove_frontend(&demux->dvb_demux.dmx,
&demux->mem_frontend);
err_fe_mem:
demux->dvb_demux.dmx.remove_frontend(&demux->dvb_demux.dmx,
&demux->hw_frontend);
err_fe_hw:
dvb_dmxdev_release(&demux->dmxdev);
err_dmxdev:
dvb_dmx_release(&demux->dvb_demux);
err_dmx:
return result;
}
static void unregister_dvb(struct stdemux *demux)
{
demux->dvb_demux.dmx.remove_frontend(&demux->dvb_demux.dmx,
&demux->mem_frontend);
demux->dvb_demux.dmx.remove_frontend(&demux->dvb_demux.dmx,
&demux->hw_frontend);
dvb_dmxdev_release(&demux->dmxdev);
dvb_dmx_release(&demux->dvb_demux);
}
static struct c8sectpfe *c8sectpfe_create(struct c8sectpfei *fei,
void *start_feed,
void *stop_feed)
{
struct c8sectpfe *c8sectpfe;
int result;
int i, j;
short int ids[] = { -1 };
c8sectpfe = kzalloc(sizeof(struct c8sectpfe), GFP_KERNEL);
if (!c8sectpfe)
goto err1;
mutex_init(&c8sectpfe->lock);
c8sectpfe->device = fei->dev;
result = dvb_register_adapter(&c8sectpfe->adapter, "STi c8sectpfe",
THIS_MODULE, fei->dev, ids);
if (result < 0) {
dev_err(fei->dev, "dvb_register_adapter failed (errno = %d)\n",
result);
goto err2;
}
c8sectpfe->adapter.priv = fei;
for (i = 0; i < fei->tsin_count; i++) {
c8sectpfe->demux[i].tsin_index = i;
c8sectpfe->demux[i].c8sectpfei = fei;
result = register_dvb(&c8sectpfe->demux[i], &c8sectpfe->adapter,
start_feed, stop_feed, fei);
if (result < 0) {
dev_err(fei->dev,
"register_dvb feed=%d failed (errno = %d)\n",
result, i);
/* we take a all or nothing approach */
for (j = 0; j < i; j++)
unregister_dvb(&c8sectpfe->demux[j]);
goto err3;
}
}
c8sectpfe->num_feeds = fei->tsin_count;
return c8sectpfe;
err3:
dvb_unregister_adapter(&c8sectpfe->adapter);
err2:
kfree(c8sectpfe);
err1:
return NULL;
};
static void c8sectpfe_delete(struct c8sectpfe *c8sectpfe)
{
int i;
if (!c8sectpfe)
return;
for (i = 0; i < c8sectpfe->num_feeds; i++)
unregister_dvb(&c8sectpfe->demux[i]);
dvb_unregister_adapter(&c8sectpfe->adapter);
kfree(c8sectpfe);
};
void c8sectpfe_tuner_unregister_frontend(struct c8sectpfe *c8sectpfe,
struct c8sectpfei *fei)
{
int n;
struct channel_info *tsin;
for (n = 0; n < fei->tsin_count; n++) {
tsin = fei->channel_data[n];
if (tsin) {
if (tsin->frontend) {
dvb_unregister_frontend(tsin->frontend);
dvb_frontend_detach(tsin->frontend);
}
i2c_put_adapter(tsin->i2c_adapter);
if (tsin->i2c_client) {
module_put(tsin->i2c_client->dev.driver->owner);
i2c_unregister_device(tsin->i2c_client);
}
}
}
c8sectpfe_delete(c8sectpfe);
};
int c8sectpfe_tuner_register_frontend(struct c8sectpfe **c8sectpfe,
struct c8sectpfei *fei,
void *start_feed,
void *stop_feed)
{
struct channel_info *tsin;
struct dvb_frontend *frontend;
int n, res;
*c8sectpfe = c8sectpfe_create(fei, start_feed, stop_feed);
if (!*c8sectpfe)
return -ENOMEM;
for (n = 0; n < fei->tsin_count; n++) {
tsin = fei->channel_data[n];
res = c8sectpfe_frontend_attach(&frontend, *c8sectpfe, tsin, n);
if (res)
goto err;
res = dvb_register_frontend(&c8sectpfe[0]->adapter, frontend);
if (res < 0) {
dev_err(fei->dev, "dvb_register_frontend failed (%d)\n",
res);
goto err;
}
tsin->frontend = frontend;
}
return 0;
err:
c8sectpfe_tuner_unregister_frontend(*c8sectpfe, fei);
return res;
}

View File

@@ -1,60 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* c8sectpfe-common.h - C8SECTPFE STi DVB driver
*
* Copyright (c) STMicroelectronics 2015
*
* Author: Peter Griffin <peter.griffin@linaro.org>
*
*/
#ifndef _C8SECTPFE_COMMON_H_
#define _C8SECTPFE_COMMON_H_
#include <linux/dvb/dmx.h>
#include <linux/dvb/frontend.h>
#include <linux/gpio.h>
#include <media/dmxdev.h>
#include <media/dvb_demux.h>
#include <media/dvb_frontend.h>
#include <media/dvb_net.h>
/* Maximum number of channels */
#define C8SECTPFE_MAXADAPTER (4)
#define C8SECTPFE_MAXCHANNEL 64
#define STPTI_MAXCHANNEL 64
#define MAX_INPUTBLOCKS 7
struct c8sectpfe;
struct stdemux;
struct stdemux {
struct dvb_demux dvb_demux;
struct dmxdev dmxdev;
struct dmx_frontend hw_frontend;
struct dmx_frontend mem_frontend;
int tsin_index;
int running_feed_count;
struct c8sectpfei *c8sectpfei;
};
struct c8sectpfe {
struct stdemux demux[MAX_INPUTBLOCKS];
struct mutex lock;
struct dvb_adapter adapter;
struct device *device;
int mapping;
int num_feeds;
};
/* Channel registration */
int c8sectpfe_tuner_register_frontend(struct c8sectpfe **c8sectpfe,
struct c8sectpfei *fei,
void *start_feed,
void *stop_feed);
void c8sectpfe_tuner_unregister_frontend(struct c8sectpfe *c8sectpfe,
struct c8sectpfei *fei);
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,287 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* c8sectpfe-core.h - C8SECTPFE STi DVB driver
*
* Copyright (c) STMicroelectronics 2015
*
* Author:Peter Bennett <peter.bennett@st.com>
* Peter Griffin <peter.griffin@linaro.org>
*
*/
#ifndef _C8SECTPFE_CORE_H_
#define _C8SECTPFE_CORE_H_
#define C8SECTPFEI_MAXCHANNEL 16
#define C8SECTPFEI_MAXADAPTER 3
#define C8SECTPFE_MAX_TSIN_CHAN 8
struct gpio_desc;
struct channel_info {
int tsin_id;
bool invert_ts_clk;
bool serial_not_parallel;
bool async_not_sync;
int i2c;
int dvb_card;
struct gpio_desc *rst_gpio;
struct i2c_adapter *i2c_adapter;
struct i2c_adapter *tuner_i2c;
struct i2c_adapter *lnb_i2c;
struct i2c_client *i2c_client;
struct dvb_frontend *frontend;
struct pinctrl_state *pstate;
int demux_mapping;
int active;
void *back_buffer_start;
void *back_buffer_aligned;
dma_addr_t back_buffer_busaddr;
void *pid_buffer_start;
void *pid_buffer_aligned;
dma_addr_t pid_buffer_busaddr;
unsigned long fifo;
struct completion idle_completion;
struct work_struct bh_work;
struct c8sectpfei *fei;
void __iomem *irec;
};
struct c8sectpfe_hw {
int num_ib;
int num_mib;
int num_swts;
int num_tsout;
int num_ccsc;
int num_ram;
int num_tp;
};
struct c8sectpfei {
struct device *dev;
struct pinctrl *pinctrl;
struct dentry *root;
struct debugfs_regset32 *regset;
struct completion fw_ack;
atomic_t fw_loaded;
int tsin_count;
struct c8sectpfe_hw hw_stats;
struct c8sectpfe *c8sectpfe[C8SECTPFEI_MAXADAPTER];
int mapping[C8SECTPFEI_MAXCHANNEL];
struct mutex lock;
struct timer_list timer; /* timer interrupts for outputs */
void __iomem *io;
void __iomem *sram;
unsigned long sram_size;
struct channel_info *channel_data[C8SECTPFE_MAX_TSIN_CHAN];
struct clk *c8sectpfeclk;
int nima_rst_gpio;
int nimb_rst_gpio;
int idle_irq;
int error_irq;
int global_feed_count;
};
/* C8SECTPFE SYS Regs list */
#define SYS_INPUT_ERR_STATUS 0x0
#define SYS_OTHER_ERR_STATUS 0x8
#define SYS_INPUT_ERR_MASK 0x10
#define SYS_OTHER_ERR_MASK 0x18
#define SYS_DMA_ROUTE 0x20
#define SYS_INPUT_CLKEN 0x30
#define IBENABLE_MASK 0x7F
#define SYS_OTHER_CLKEN 0x38
#define TSDMAENABLE BIT(1)
#define MEMDMAENABLE BIT(0)
#define SYS_CFG_NUM_IB 0x200
#define SYS_CFG_NUM_MIB 0x204
#define SYS_CFG_NUM_SWTS 0x208
#define SYS_CFG_NUM_TSOUT 0x20C
#define SYS_CFG_NUM_CCSC 0x210
#define SYS_CFG_NUM_RAM 0x214
#define SYS_CFG_NUM_TP 0x218
/* Input Block Regs */
#define C8SECTPFE_INPUTBLK_OFFSET 0x1000
#define C8SECTPFE_CHANNEL_OFFSET(x) ((x*0x40) + C8SECTPFE_INPUTBLK_OFFSET)
#define C8SECTPFE_IB_IP_FMT_CFG(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x00)
#define C8SECTPFE_IGNORE_ERR_AT_SOP BIT(7)
#define C8SECTPFE_IGNORE_ERR_IN_PKT BIT(6)
#define C8SECTPFE_IGNORE_ERR_IN_BYTE BIT(5)
#define C8SECTPFE_INVERT_TSCLK BIT(4)
#define C8SECTPFE_ALIGN_BYTE_SOP BIT(3)
#define C8SECTPFE_ASYNC_NOT_SYNC BIT(2)
#define C8SECTPFE_BYTE_ENDIANNESS_MSB BIT(1)
#define C8SECTPFE_SERIAL_NOT_PARALLEL BIT(0)
#define C8SECTPFE_IB_SYNCLCKDRP_CFG(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x04)
#define C8SECTPFE_SYNC(x) (x & 0xf)
#define C8SECTPFE_DROP(x) ((x<<4) & 0xf)
#define C8SECTPFE_TOKEN(x) ((x<<8) & 0xff00)
#define C8SECTPFE_SLDENDIANNESS BIT(16)
#define C8SECTPFE_IB_TAGBYTES_CFG(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x08)
#define C8SECTPFE_TAG_HEADER(x) (x << 16)
#define C8SECTPFE_TAG_COUNTER(x) ((x<<1) & 0x7fff)
#define C8SECTPFE_TAG_ENABLE BIT(0)
#define C8SECTPFE_IB_PID_SET(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x0C)
#define C8SECTPFE_PID_OFFSET(x) (x & 0x3f)
#define C8SECTPFE_PID_NUMBITS(x) ((x << 6) & 0xfff)
#define C8SECTPFE_PID_ENABLE BIT(31)
#define C8SECTPFE_IB_PKT_LEN(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x10)
#define C8SECTPFE_IB_BUFF_STRT(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x14)
#define C8SECTPFE_IB_BUFF_END(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x18)
#define C8SECTPFE_IB_READ_PNT(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x1C)
#define C8SECTPFE_IB_WRT_PNT(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x20)
#define C8SECTPFE_IB_PRI_THRLD(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x24)
#define C8SECTPFE_PRI_VALUE(x) (x & 0x7fffff)
#define C8SECTPFE_PRI_LOWPRI(x) ((x & 0xf) << 24)
#define C8SECTPFE_PRI_HIGHPRI(x) ((x & 0xf) << 28)
#define C8SECTPFE_IB_STAT(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x28)
#define C8SECTPFE_STAT_FIFO_OVERFLOW(x) (x & 0x1)
#define C8SECTPFE_STAT_BUFFER_OVERFLOW(x) (x & 0x2)
#define C8SECTPFE_STAT_OUTOFORDERRP(x) (x & 0x4)
#define C8SECTPFE_STAT_PID_OVERFLOW(x) (x & 0x8)
#define C8SECTPFE_STAT_PKT_OVERFLOW(x) (x & 0x10)
#define C8SECTPFE_STAT_ERROR_PACKETS(x) ((x >> 8) & 0xf)
#define C8SECTPFE_STAT_SHORT_PACKETS(x) ((x >> 12) & 0xf)
#define C8SECTPFE_IB_MASK(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x2C)
#define C8SECTPFE_MASK_FIFO_OVERFLOW BIT(0)
#define C8SECTPFE_MASK_BUFFER_OVERFLOW BIT(1)
#define C8SECTPFE_MASK_OUTOFORDERRP(x) BIT(2)
#define C8SECTPFE_MASK_PID_OVERFLOW(x) BIT(3)
#define C8SECTPFE_MASK_PKT_OVERFLOW(x) BIT(4)
#define C8SECTPFE_MASK_ERROR_PACKETS(x) ((x & 0xf) << 8)
#define C8SECTPFE_MASK_SHORT_PACKETS(x) ((x & 0xf) >> 12)
#define C8SECTPFE_IB_SYS(x) (C8SECTPFE_CHANNEL_OFFSET(x) + 0x30)
#define C8SECTPFE_SYS_RESET BIT(1)
#define C8SECTPFE_SYS_ENABLE BIT(0)
/*
* Pointer record data structure required for each input block
* see Table 82 on page 167 of functional specification.
*/
#define DMA_PRDS_MEMBASE 0x0 /* Internal sram base address */
#define DMA_PRDS_MEMTOP 0x4 /* Internal sram top address */
/*
* TS packet size, including tag bytes added by input block,
* rounded up to the next multiple of 8 bytes. The packet size,
* including any tagging bytes and rounded up to the nearest
* multiple of 8 bytes must be less than 255 bytes.
*/
#define DMA_PRDS_PKTSIZE 0x8
#define DMA_PRDS_TPENABLE 0xc
#define TP0_OFFSET 0x10
#define DMA_PRDS_BUSBASE_TP(x) ((0x10*x) + TP0_OFFSET)
#define DMA_PRDS_BUSTOP_TP(x) ((0x10*x) + TP0_OFFSET + 0x4)
#define DMA_PRDS_BUSWP_TP(x) ((0x10*x) + TP0_OFFSET + 0x8)
#define DMA_PRDS_BUSRP_TP(x) ((0x10*x) + TP0_OFFSET + 0xc)
#define DMA_PRDS_SIZE (0x20)
#define DMA_MEMDMA_OFFSET 0x4000
#define DMA_IMEM_OFFSET 0x0
#define DMA_DMEM_OFFSET 0x4000
#define DMA_CPU 0x8000
#define DMA_PER_OFFSET 0xb000
#define DMA_MEMDMA_DMEM (DMA_MEMDMA_OFFSET + DMA_DMEM_OFFSET)
#define DMA_MEMDMA_IMEM (DMA_MEMDMA_OFFSET + DMA_IMEM_OFFSET)
/* XP70 Slim core regs */
#define DMA_CPU_ID (DMA_MEMDMA_OFFSET + DMA_CPU + 0x0)
#define DMA_CPU_VCR (DMA_MEMDMA_OFFSET + DMA_CPU + 0x4)
#define DMA_CPU_RUN (DMA_MEMDMA_OFFSET + DMA_CPU + 0x8)
#define DMA_CPU_CLOCKGATE (DMA_MEMDMA_OFFSET + DMA_CPU + 0xc)
#define DMA_CPU_PC (DMA_MEMDMA_OFFSET + DMA_CPU + 0x20)
/* Enable Interrupt for a IB */
#define DMA_PER_TPn_DREQ_MASK (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xd00)
/* Ack interrupt by setting corresponding bit */
#define DMA_PER_TPn_DACK_SET (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xd80)
#define DMA_PER_TPn_DREQ (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xe00)
#define DMA_PER_TPn_DACK (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xe80)
#define DMA_PER_DREQ_MODE (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xf80)
#define DMA_PER_STBUS_SYNC (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xf88)
#define DMA_PER_STBUS_ACCESS (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xf8c)
#define DMA_PER_STBUS_ADDRESS (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xf90)
#define DMA_PER_IDLE_INT (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfa8)
#define DMA_PER_PRIORITY (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfac)
#define DMA_PER_MAX_OPCODE (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfb0)
#define DMA_PER_MAX_CHUNK (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfb4)
#define DMA_PER_PAGE_SIZE (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfbc)
#define DMA_PER_MBOX_STATUS (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfc0)
#define DMA_PER_MBOX_SET (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfc8)
#define DMA_PER_MBOX_CLEAR (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfd0)
#define DMA_PER_MBOX_MASK (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfd8)
#define DMA_PER_INJECT_PKT_SRC (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfe0)
#define DMA_PER_INJECT_PKT_DEST (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfe4)
#define DMA_PER_INJECT_PKT_ADDR (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfe8)
#define DMA_PER_INJECT_PKT (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xfec)
#define DMA_PER_PAT_PTR_INIT (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xff0)
#define DMA_PER_PAT_PTR (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xff4)
#define DMA_PER_SLEEP_MASK (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xff8)
#define DMA_PER_SLEEP_COUNTER (DMA_MEMDMA_OFFSET + DMA_PER_OFFSET + 0xffc)
/* #define DMA_RF_CPUREGn DMA_RFBASEADDR n=0 to 15) slim regsa */
/* The following are from DMA_DMEM_BaseAddress */
#define DMA_FIRMWARE_VERSION (DMA_MEMDMA_OFFSET + DMA_DMEM_OFFSET + 0x0)
#define DMA_PTRREC_BASE (DMA_MEMDMA_OFFSET + DMA_DMEM_OFFSET + 0x4)
#define DMA_PTRREC_INPUT_OFFSET (DMA_MEMDMA_OFFSET + DMA_DMEM_OFFSET + 0x8)
#define DMA_ERRREC_BASE (DMA_MEMDMA_OFFSET + DMA_DMEM_OFFSET + 0xc)
#define DMA_ERROR_RECORD(n) ((n*4) + DMA_ERRREC_BASE + 0x4)
#define DMA_IDLE_REQ (DMA_MEMDMA_OFFSET + DMA_DMEM_OFFSET + 0x10)
#define IDLEREQ BIT(31)
#define DMA_FIRMWARE_CONFIG (DMA_MEMDMA_OFFSET + DMA_DMEM_OFFSET + 0x14)
/* Regs for PID Filter */
#define PIDF_OFFSET 0x2800
#define PIDF_BASE(n) ((n*4) + PIDF_OFFSET)
#define PIDF_LEAK_ENABLE (PIDF_OFFSET + 0x100)
#define PIDF_LEAK_STATUS (PIDF_OFFSET + 0x108)
#define PIDF_LEAK_COUNT_RESET (PIDF_OFFSET + 0x110)
#define PIDF_LEAK_COUNTER (PIDF_OFFSET + 0x114)
#endif /* _C8SECTPFE_CORE_H_ */

View File

@@ -1,244 +0,0 @@
// SPDX-License-Identifier: GPL-2.0
/*
* c8sectpfe-debugfs.c - C8SECTPFE STi DVB driver
*
* Copyright (c) STMicroelectronics 2015
*
* Author: Peter Griffin <peter.griffin@linaro.org>
*
*/
#include <linux/debugfs.h>
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/kernel.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/types.h>
#include "c8sectpfe-debugfs.h"
#define dump_register(nm ...) \
{ \
.name = #nm, \
.offset = nm, \
}
static const struct debugfs_reg32 fei_sys_regs[] = {
dump_register(SYS_INPUT_ERR_STATUS),
dump_register(SYS_OTHER_ERR_STATUS),
dump_register(SYS_INPUT_ERR_MASK),
dump_register(SYS_DMA_ROUTE),
dump_register(SYS_INPUT_CLKEN),
dump_register(IBENABLE_MASK),
dump_register(SYS_OTHER_CLKEN),
dump_register(SYS_CFG_NUM_IB),
dump_register(SYS_CFG_NUM_MIB),
dump_register(SYS_CFG_NUM_SWTS),
dump_register(SYS_CFG_NUM_TSOUT),
dump_register(SYS_CFG_NUM_CCSC),
dump_register(SYS_CFG_NUM_RAM),
dump_register(SYS_CFG_NUM_TP),
dump_register(C8SECTPFE_IB_IP_FMT_CFG(0)),
dump_register(C8SECTPFE_IB_TAGBYTES_CFG(0)),
dump_register(C8SECTPFE_IB_PID_SET(0)),
dump_register(C8SECTPFE_IB_PKT_LEN(0)),
dump_register(C8SECTPFE_IB_BUFF_STRT(0)),
dump_register(C8SECTPFE_IB_BUFF_END(0)),
dump_register(C8SECTPFE_IB_READ_PNT(0)),
dump_register(C8SECTPFE_IB_WRT_PNT(0)),
dump_register(C8SECTPFE_IB_PRI_THRLD(0)),
dump_register(C8SECTPFE_IB_STAT(0)),
dump_register(C8SECTPFE_IB_MASK(0)),
dump_register(C8SECTPFE_IB_SYS(0)),
dump_register(C8SECTPFE_IB_IP_FMT_CFG(1)),
dump_register(C8SECTPFE_IB_TAGBYTES_CFG(1)),
dump_register(C8SECTPFE_IB_PID_SET(1)),
dump_register(C8SECTPFE_IB_PKT_LEN(1)),
dump_register(C8SECTPFE_IB_BUFF_STRT(1)),
dump_register(C8SECTPFE_IB_BUFF_END(1)),
dump_register(C8SECTPFE_IB_READ_PNT(1)),
dump_register(C8SECTPFE_IB_WRT_PNT(1)),
dump_register(C8SECTPFE_IB_PRI_THRLD(1)),
dump_register(C8SECTPFE_IB_STAT(1)),
dump_register(C8SECTPFE_IB_MASK(1)),
dump_register(C8SECTPFE_IB_SYS(1)),
dump_register(C8SECTPFE_IB_IP_FMT_CFG(2)),
dump_register(C8SECTPFE_IB_TAGBYTES_CFG(2)),
dump_register(C8SECTPFE_IB_PID_SET(2)),
dump_register(C8SECTPFE_IB_PKT_LEN(2)),
dump_register(C8SECTPFE_IB_BUFF_STRT(2)),
dump_register(C8SECTPFE_IB_BUFF_END(2)),
dump_register(C8SECTPFE_IB_READ_PNT(2)),
dump_register(C8SECTPFE_IB_WRT_PNT(2)),
dump_register(C8SECTPFE_IB_PRI_THRLD(2)),
dump_register(C8SECTPFE_IB_STAT(2)),
dump_register(C8SECTPFE_IB_MASK(2)),
dump_register(C8SECTPFE_IB_SYS(2)),
dump_register(C8SECTPFE_IB_IP_FMT_CFG(3)),
dump_register(C8SECTPFE_IB_TAGBYTES_CFG(3)),
dump_register(C8SECTPFE_IB_PID_SET(3)),
dump_register(C8SECTPFE_IB_PKT_LEN(3)),
dump_register(C8SECTPFE_IB_BUFF_STRT(3)),
dump_register(C8SECTPFE_IB_BUFF_END(3)),
dump_register(C8SECTPFE_IB_READ_PNT(3)),
dump_register(C8SECTPFE_IB_WRT_PNT(3)),
dump_register(C8SECTPFE_IB_PRI_THRLD(3)),
dump_register(C8SECTPFE_IB_STAT(3)),
dump_register(C8SECTPFE_IB_MASK(3)),
dump_register(C8SECTPFE_IB_SYS(3)),
dump_register(C8SECTPFE_IB_IP_FMT_CFG(4)),
dump_register(C8SECTPFE_IB_TAGBYTES_CFG(4)),
dump_register(C8SECTPFE_IB_PID_SET(4)),
dump_register(C8SECTPFE_IB_PKT_LEN(4)),
dump_register(C8SECTPFE_IB_BUFF_STRT(4)),
dump_register(C8SECTPFE_IB_BUFF_END(4)),
dump_register(C8SECTPFE_IB_READ_PNT(4)),
dump_register(C8SECTPFE_IB_WRT_PNT(4)),
dump_register(C8SECTPFE_IB_PRI_THRLD(4)),
dump_register(C8SECTPFE_IB_STAT(4)),
dump_register(C8SECTPFE_IB_MASK(4)),
dump_register(C8SECTPFE_IB_SYS(4)),
dump_register(C8SECTPFE_IB_IP_FMT_CFG(5)),
dump_register(C8SECTPFE_IB_TAGBYTES_CFG(5)),
dump_register(C8SECTPFE_IB_PID_SET(5)),
dump_register(C8SECTPFE_IB_PKT_LEN(5)),
dump_register(C8SECTPFE_IB_BUFF_STRT(5)),
dump_register(C8SECTPFE_IB_BUFF_END(5)),
dump_register(C8SECTPFE_IB_READ_PNT(5)),
dump_register(C8SECTPFE_IB_WRT_PNT(5)),
dump_register(C8SECTPFE_IB_PRI_THRLD(5)),
dump_register(C8SECTPFE_IB_STAT(5)),
dump_register(C8SECTPFE_IB_MASK(5)),
dump_register(C8SECTPFE_IB_SYS(5)),
dump_register(C8SECTPFE_IB_IP_FMT_CFG(6)),
dump_register(C8SECTPFE_IB_TAGBYTES_CFG(6)),
dump_register(C8SECTPFE_IB_PID_SET(6)),
dump_register(C8SECTPFE_IB_PKT_LEN(6)),
dump_register(C8SECTPFE_IB_BUFF_STRT(6)),
dump_register(C8SECTPFE_IB_BUFF_END(6)),
dump_register(C8SECTPFE_IB_READ_PNT(6)),
dump_register(C8SECTPFE_IB_WRT_PNT(6)),
dump_register(C8SECTPFE_IB_PRI_THRLD(6)),
dump_register(C8SECTPFE_IB_STAT(6)),
dump_register(C8SECTPFE_IB_MASK(6)),
dump_register(C8SECTPFE_IB_SYS(6)),
dump_register(DMA_CPU_ID),
dump_register(DMA_CPU_VCR),
dump_register(DMA_CPU_RUN),
dump_register(DMA_CPU_PC),
dump_register(DMA_PER_TPn_DREQ_MASK),
dump_register(DMA_PER_TPn_DACK_SET),
dump_register(DMA_PER_TPn_DREQ),
dump_register(DMA_PER_TPn_DACK),
dump_register(DMA_PER_DREQ_MODE),
dump_register(DMA_PER_STBUS_SYNC),
dump_register(DMA_PER_STBUS_ACCESS),
dump_register(DMA_PER_STBUS_ADDRESS),
dump_register(DMA_PER_IDLE_INT),
dump_register(DMA_PER_PRIORITY),
dump_register(DMA_PER_MAX_OPCODE),
dump_register(DMA_PER_MAX_CHUNK),
dump_register(DMA_PER_PAGE_SIZE),
dump_register(DMA_PER_MBOX_STATUS),
dump_register(DMA_PER_MBOX_SET),
dump_register(DMA_PER_MBOX_CLEAR),
dump_register(DMA_PER_MBOX_MASK),
dump_register(DMA_PER_INJECT_PKT_SRC),
dump_register(DMA_PER_INJECT_PKT_DEST),
dump_register(DMA_PER_INJECT_PKT_ADDR),
dump_register(DMA_PER_INJECT_PKT),
dump_register(DMA_PER_PAT_PTR_INIT),
dump_register(DMA_PER_PAT_PTR),
dump_register(DMA_PER_SLEEP_MASK),
dump_register(DMA_PER_SLEEP_COUNTER),
dump_register(DMA_FIRMWARE_VERSION),
dump_register(DMA_PTRREC_BASE),
dump_register(DMA_PTRREC_INPUT_OFFSET),
dump_register(DMA_ERRREC_BASE),
dump_register(DMA_ERROR_RECORD(0)),
dump_register(DMA_ERROR_RECORD(1)),
dump_register(DMA_ERROR_RECORD(2)),
dump_register(DMA_ERROR_RECORD(3)),
dump_register(DMA_ERROR_RECORD(4)),
dump_register(DMA_ERROR_RECORD(5)),
dump_register(DMA_ERROR_RECORD(6)),
dump_register(DMA_ERROR_RECORD(7)),
dump_register(DMA_ERROR_RECORD(8)),
dump_register(DMA_ERROR_RECORD(9)),
dump_register(DMA_ERROR_RECORD(10)),
dump_register(DMA_ERROR_RECORD(11)),
dump_register(DMA_ERROR_RECORD(12)),
dump_register(DMA_ERROR_RECORD(13)),
dump_register(DMA_ERROR_RECORD(14)),
dump_register(DMA_ERROR_RECORD(15)),
dump_register(DMA_ERROR_RECORD(16)),
dump_register(DMA_ERROR_RECORD(17)),
dump_register(DMA_ERROR_RECORD(18)),
dump_register(DMA_ERROR_RECORD(19)),
dump_register(DMA_ERROR_RECORD(20)),
dump_register(DMA_ERROR_RECORD(21)),
dump_register(DMA_ERROR_RECORD(22)),
dump_register(DMA_IDLE_REQ),
dump_register(DMA_FIRMWARE_CONFIG),
dump_register(PIDF_BASE(0)),
dump_register(PIDF_BASE(1)),
dump_register(PIDF_BASE(2)),
dump_register(PIDF_BASE(3)),
dump_register(PIDF_BASE(4)),
dump_register(PIDF_BASE(5)),
dump_register(PIDF_BASE(6)),
dump_register(PIDF_BASE(7)),
dump_register(PIDF_BASE(8)),
dump_register(PIDF_BASE(9)),
dump_register(PIDF_BASE(10)),
dump_register(PIDF_BASE(11)),
dump_register(PIDF_BASE(12)),
dump_register(PIDF_BASE(13)),
dump_register(PIDF_BASE(14)),
dump_register(PIDF_BASE(15)),
dump_register(PIDF_BASE(16)),
dump_register(PIDF_BASE(17)),
dump_register(PIDF_BASE(18)),
dump_register(PIDF_BASE(19)),
dump_register(PIDF_BASE(20)),
dump_register(PIDF_BASE(21)),
dump_register(PIDF_BASE(22)),
dump_register(PIDF_LEAK_ENABLE),
dump_register(PIDF_LEAK_STATUS),
dump_register(PIDF_LEAK_COUNT_RESET),
dump_register(PIDF_LEAK_COUNTER),
};
void c8sectpfe_debugfs_init(struct c8sectpfei *fei)
{
fei->regset = devm_kzalloc(fei->dev, sizeof(*fei->regset), GFP_KERNEL);
if (!fei->regset)
return;
fei->regset->regs = fei_sys_regs;
fei->regset->nregs = ARRAY_SIZE(fei_sys_regs);
fei->regset->base = fei->io;
fei->root = debugfs_create_dir("c8sectpfe", NULL);
debugfs_create_regset32("registers", S_IRUGO, fei->root, fei->regset);
}
void c8sectpfe_debugfs_exit(struct c8sectpfei *fei)
{
debugfs_remove_recursive(fei->root);
fei->root = NULL;
}

View File

@@ -1,23 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* c8sectpfe-debugfs.h - C8SECTPFE STi DVB driver debugfs header
*
* Copyright (c) STMicroelectronics 2015
*
* Authors: Peter Griffin <peter.griffin@linaro.org>
*/
#ifndef __C8SECTPFE_DEBUG_H
#define __C8SECTPFE_DEBUG_H
#include "c8sectpfe-core.h"
#if defined(CONFIG_DEBUG_FS)
void c8sectpfe_debugfs_init(struct c8sectpfei *);
void c8sectpfe_debugfs_exit(struct c8sectpfei *);
#else
static inline void c8sectpfe_debugfs_init(struct c8sectpfei *fei) {};
static inline void c8sectpfe_debugfs_exit(struct c8sectpfei *fei) {};
#endif
#endif /* __C8SECTPFE_DEBUG_H */

View File

@@ -1,235 +0,0 @@
// SPDX-License-Identifier: GPL-2.0
/*
* c8sectpfe-dvb.c - C8SECTPFE STi DVB driver
*
* Copyright (c) STMicroelectronics 2015
*
* Author Peter Griffin <peter.griffin@linaro.org>
*
*/
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
#include <dt-bindings/media/c8sectpfe.h>
#include "c8sectpfe-common.h"
#include "c8sectpfe-core.h"
#include "c8sectpfe-dvb.h"
#include "dvb-pll.h"
#include "lnbh24.h"
#include "stv0367.h"
#include "stv0367_priv.h"
#include "stv6110x.h"
#include "stv090x.h"
#include "tda18212.h"
static inline const char *dvb_card_str(unsigned int c)
{
switch (c) {
case STV0367_TDA18212_NIMA_1: return "STV0367_TDA18212_NIMA_1";
case STV0367_TDA18212_NIMA_2: return "STV0367_TDA18212_NIMA_2";
case STV0367_TDA18212_NIMB_1: return "STV0367_TDA18212_NIMB_1";
case STV0367_TDA18212_NIMB_2: return "STV0367_TDA18212_NIMB_2";
case STV0903_6110_LNB24_NIMA: return "STV0903_6110_LNB24_NIMA";
case STV0903_6110_LNB24_NIMB: return "STV0903_6110_LNB24_NIMB";
default: return "unknown dvb frontend card";
}
}
static struct stv090x_config stv090x_config = {
.device = STV0903,
.demod_mode = STV090x_SINGLE,
.clk_mode = STV090x_CLK_EXT,
.xtal = 16000000,
.address = 0x69,
.ts1_mode = STV090x_TSMODE_SERIAL_CONTINUOUS,
.ts2_mode = STV090x_TSMODE_SERIAL_CONTINUOUS,
.repeater_level = STV090x_RPTLEVEL_64,
.tuner_init = NULL,
.tuner_set_mode = NULL,
.tuner_set_frequency = NULL,
.tuner_get_frequency = NULL,
.tuner_set_bandwidth = NULL,
.tuner_get_bandwidth = NULL,
.tuner_set_bbgain = NULL,
.tuner_get_bbgain = NULL,
.tuner_set_refclk = NULL,
.tuner_get_status = NULL,
};
static struct stv6110x_config stv6110x_config = {
.addr = 0x60,
.refclk = 16000000,
};
#define NIMA 0
#define NIMB 1
static struct stv0367_config stv0367_tda18212_config[] = {
{
.demod_address = 0x1c,
.xtal = 16000000,
.if_khz = 4500,
.if_iq_mode = FE_TER_NORMAL_IF_TUNER,
.ts_mode = STV0367_SERIAL_PUNCT_CLOCK,
.clk_pol = STV0367_CLOCKPOLARITY_DEFAULT,
}, {
.demod_address = 0x1d,
.xtal = 16000000,
.if_khz = 4500,
.if_iq_mode = FE_TER_NORMAL_IF_TUNER,
.ts_mode = STV0367_SERIAL_PUNCT_CLOCK,
.clk_pol = STV0367_CLOCKPOLARITY_DEFAULT,
}, {
.demod_address = 0x1e,
.xtal = 16000000,
.if_khz = 4500,
.if_iq_mode = FE_TER_NORMAL_IF_TUNER,
.ts_mode = STV0367_SERIAL_PUNCT_CLOCK,
.clk_pol = STV0367_CLOCKPOLARITY_DEFAULT,
},
};
static struct tda18212_config tda18212_conf = {
.if_dvbt_6 = 4150,
.if_dvbt_7 = 4150,
.if_dvbt_8 = 4500,
.if_dvbc = 5000,
};
int c8sectpfe_frontend_attach(struct dvb_frontend **fe,
struct c8sectpfe *c8sectpfe,
struct channel_info *tsin, int chan_num)
{
struct tda18212_config *tda18212;
const struct stv6110x_devctl *fe2;
struct i2c_client *client;
struct i2c_board_info tda18212_info = {
.type = "tda18212",
.addr = 0x60,
};
if (!tsin)
return -EINVAL;
switch (tsin->dvb_card) {
case STV0367_TDA18212_NIMA_1:
case STV0367_TDA18212_NIMA_2:
case STV0367_TDA18212_NIMB_1:
case STV0367_TDA18212_NIMB_2:
if (tsin->dvb_card == STV0367_TDA18212_NIMA_1)
*fe = dvb_attach(stv0367ter_attach,
&stv0367_tda18212_config[0],
tsin->i2c_adapter);
else if (tsin->dvb_card == STV0367_TDA18212_NIMB_1)
*fe = dvb_attach(stv0367ter_attach,
&stv0367_tda18212_config[1],
tsin->i2c_adapter);
else
*fe = dvb_attach(stv0367ter_attach,
&stv0367_tda18212_config[2],
tsin->i2c_adapter);
if (!*fe) {
dev_err(c8sectpfe->device,
"%s: stv0367ter_attach failed for NIM card %s\n"
, __func__, dvb_card_str(tsin->dvb_card));
return -ENODEV;
}
/*
* init the demod so that i2c gate_ctrl
* to the tuner works correctly
*/
(*fe)->ops.init(*fe);
/* Allocate the tda18212 structure */
tda18212 = devm_kzalloc(c8sectpfe->device,
sizeof(struct tda18212_config),
GFP_KERNEL);
if (!tda18212) {
dev_err(c8sectpfe->device,
"%s: devm_kzalloc failed\n", __func__);
return -ENOMEM;
}
memcpy(tda18212, &tda18212_conf,
sizeof(struct tda18212_config));
tda18212->fe = (*fe);
tda18212_info.platform_data = tda18212;
/* attach tuner */
request_module("tda18212");
client = i2c_new_client_device(tsin->i2c_adapter,
&tda18212_info);
if (!i2c_client_has_driver(client)) {
dvb_frontend_detach(*fe);
return -ENODEV;
}
if (!try_module_get(client->dev.driver->owner)) {
i2c_unregister_device(client);
dvb_frontend_detach(*fe);
return -ENODEV;
}
tsin->i2c_client = client;
break;
case STV0903_6110_LNB24_NIMA:
*fe = dvb_attach(stv090x_attach, &stv090x_config,
tsin->i2c_adapter, STV090x_DEMODULATOR_0);
if (!*fe) {
dev_err(c8sectpfe->device, "%s: stv090x_attach failed\n"
"\tfor NIM card %s\n",
__func__, dvb_card_str(tsin->dvb_card));
return -ENODEV;
}
fe2 = dvb_attach(stv6110x_attach, *fe,
&stv6110x_config, tsin->i2c_adapter);
if (!fe2) {
dev_err(c8sectpfe->device,
"%s: stv6110x_attach failed for NIM card %s\n"
, __func__, dvb_card_str(tsin->dvb_card));
return -ENODEV;
}
stv090x_config.tuner_init = fe2->tuner_init;
stv090x_config.tuner_set_mode = fe2->tuner_set_mode;
stv090x_config.tuner_set_frequency = fe2->tuner_set_frequency;
stv090x_config.tuner_get_frequency = fe2->tuner_get_frequency;
stv090x_config.tuner_set_bandwidth = fe2->tuner_set_bandwidth;
stv090x_config.tuner_get_bandwidth = fe2->tuner_get_bandwidth;
stv090x_config.tuner_set_bbgain = fe2->tuner_set_bbgain;
stv090x_config.tuner_get_bbgain = fe2->tuner_get_bbgain;
stv090x_config.tuner_set_refclk = fe2->tuner_set_refclk;
stv090x_config.tuner_get_status = fe2->tuner_get_status;
dvb_attach(lnbh24_attach, *fe, tsin->i2c_adapter, 0, 0, 0x9);
break;
default:
dev_err(c8sectpfe->device,
"%s: DVB frontend card %s not yet supported\n",
__func__, dvb_card_str(tsin->dvb_card));
return -ENODEV;
}
(*fe)->id = chan_num;
dev_info(c8sectpfe->device,
"DVB frontend card %s successfully attached",
dvb_card_str(tsin->dvb_card));
return 0;
}

View File

@@ -1,17 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* c8sectpfe-common.h - C8SECTPFE STi DVB driver
*
* Copyright (c) STMicroelectronics 2015
*
* Author: Peter Griffin <peter.griffin@linaro.org>
*
*/
#ifndef _C8SECTPFE_DVB_H_
#define _C8SECTPFE_DVB_H_
int c8sectpfe_frontend_attach(struct dvb_frontend **fe,
struct c8sectpfe *c8sectpfe, struct channel_info *tsin,
int chan_num);
#endif